Okay, ik heb sinds kort ook zonnepanelen en heb ontzettend zitten vechten om ze uit te lezen. Het gaat om een Solis inverter (Ginlong) waarvan de statistieken "automatisch" geüpload worden naar de portal pagina m.ginlong.com. Ik gebruik als mobiele app de "Solis Home" app, dus gebruik je die ook, dikke kans dat je deze aanpak op een gelijksoortige manier kunt uitlezen.
Ik heb ontzettend veel zitten zoeken om de statistieken vanuit de Solis-inverter naar Domoticz te krijgen. Het zal voor HomeAssistant allicht anders zijn, de knappe koppen op dit forum kunnen dat vast omfietsen naar iets bruikbaars als ze willen.
Ik kom veel info en topics tegen van mensen die het allemaal op verschillende manier hebben aangepakt, waarbij het soms wel gelukt is, soms niet. Dit is iig mijn verhaal, hopelijk heeft er iemand iets aan. En ja, ik cross-post dit bewust in meerdere topics zodat mensen met dezelfde uitdaging het allemaal (hopelijk) snel terug kunnen vinden.
De aanpak:
- Zorg dat je op m.ginglong.com kunt aanmelden en dat je het username/wachtwoord beschikbaar hebt,
- Maak in Domoticz Dummy hardware aan met 2 sensors erbij, een voor het verbruik (lees: wat je PV opwekt) en een switch (wat de status is van je PV, aan of uit). Zie hieronder voor hoe dit er bij mij uitziet:
/f/image/HbRW6VijpMxSQbkH1rYRZnAd.png?f=fotoalbum_large)
- Zet onderstaand Python-script (heet bij mij ginlong.py) op je Domoticz-machine neer en zorg dat je Python beschikbaar hebt op het masjientje. Update de parameters onder #config en #domoticz settings:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| #!/usr/bin/python
import requests
import urllib, urllib2
import json
#config
username = 'email@address.com' #your username to log on to m.ginlong.com
password = 'P@ssw0rd!' #your password to log on to m.ginlong.com
domain = 'm.ginlong.com' #webportal to read
plantId = '965529' #plant id (can be found on m.ginlong.com page information)
lan = '2' #language (2 = English)
#domoticz settings
domoticz_host = 'domoticzuser:domoticzpassword@192.168.2.53' #Username/password and IP of Domoticz
domoticz_port = '8080' #Port to connect to Domoticz
domoticz_url = 'json.htm' #URL to post stats to Domoticz, does not require changes normally
domoticz_device_idx = '486' #IDX of Watt meter in Domoticz
domoticz_device_onoff_idx = '485' #IDX of on/off switch (to see whether its on or off for PV)
# Create session for requests
session = requests.session()
#building url
url = 'http://'+domain+'/cpro/login/validateLogin.json'
params = {
"userName": username,
"password": password,
"lan": lan,
"domain": domain,
"userType": "C"
}
#login call
resultData = session.post(url, params=params)
resultJson = resultData.json()
if resultJson['result'].get('isAccept') == 1:
print("Login Succesful!")
else:
print("Login Failed!!")
Exit()
# Get plant details
url = 'http://m.ginlong.com/cpro/epc/plantview/view/doPlantList.json'
cookies = {'language': lan}
resultData = session.get(url, cookies=cookies)
resultJson = resultData.json()
# Uncomment lines below to write the exported json-file to the location noted
#out_file = open("/usr/local/bin/ZPExport.json", "w")
#json.dump(resultJson, out_file, indent = 6)
#out_file.close()
ActualPower = resultJson['result']['pagination']['data'][0].get('curPower')
ActualPowerNoSep = str(ActualPower).split(".")[0]
etoday = resultJson['result']['pagination']['data'][0].get('energyToday')
multiply='1000.0'
etotal1000 = float(etoday) * float(multiply)
etotalstr=str(etotal1000)
etotalstrNoSep = str(etotalstr).split(".")[0]
OnOrOff = resultJson['result']['pagination']['data'][0].get('status')
#logging values
print 'ActualPower: ' + str(ActualPowerNoSep)
print 'etoday: ' + str(etotalstrNoSep)
print 'Status: ' + str(OnOrOff)
#uploading values to domoticz
url = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command¶m=udevice&idx=" + domoticz_device_idx+ "&nvalue=0&svalue=" + str(ActualPowerNoSep))
urlonoff = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command¶m=udevice&idx=" + domoticz_device_onoff_idx+ "&nvalue=" + str(OnOrOff))
urllib.urlopen(url)
urllib.urlopen(urlonoff) |
- Maak het script executable met commando
terwijl je in de directory staat waar je 'm neer hebt gezet. Ik doe (vanwege gebrek aan kennis ook altijd nog [code][sudo chmod 777 ginlong.py/code] zodat alle users er iets mee kunnen. Hoeft allicht niet en is niet goed, maar ignorance is bliss zullen we maar zeggen

- Draai het script even een keer op het apparaat en check dat je output krijgt te zien op de commandline
Ik start het script met dit commando:
code:
1
| sudo /usr/bin/python /usr/local/bin/ginlong.py |
Heb je output? Top! Dan heb je hoogstwaarschijlijk iig ook een beginwaarde in je Domoticz metertje, hiep hoi!
- Maak nu in Domoticz nóg een switch aan, gewoon Manual met willekeurige instellingen. Open de switch en maak er een "Push On" knoppie van. Neem in de aan en uit acties het script op, zie de bijgevoegde screenshot.
/f/image/BFrdX3byNxqRHTG4ooE5DIx6.png?f=fotoalbum_large)
Als je deze configuratie gebruikt (dus "script://ginlong.sh") dan ga je er dus vanuit dat het script in de "scripts" map zich onder/in de "domoticz-installatiemap" bevindt. Is dat niet het geval, moet je het pad opnemen (even googlen hoe je het pad moet invullen)
- Druk de update-knop in en check dat de waardes geüpdate worden
- Nu komt de clou: Het script eens per X-tijd laten draaien. Ik ben geen Linux/Raspbian held en kreeg het met een crontab-job met geen mogelijkheid aan de praat. Ook het zetten van een timer op de virtuele switch waarbij ik het script onderwater start werkte niet (wazige foutmelding in de Domoticz-logs). Zal allicht aan mij liggen en heeft mogelijk iets van doen met rechten en onder welke user dingen draaien, maar afijn.
Ik heb het uiteindelijk aan de praat gekregen met een dzVents-script dat er zo uitziet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| return {
on = { timer = {"every 5 minutes"} },
execute = function(domoticz, _)
local myDevice = domoticz.devices("Zonnepanelen Update")
if myDevice.state == "On" then
myDevice.switchOn()
else
myDevice.switchOn()
end
end
} |
Dus: Zet eens per 5 minuten dit apparaat aan. Again: Zal allicht beter kunnen, maar het ignorance ding, en if it ain't broken, don't fix it (en andere wijsheden

)
Disclaimers en verdere info:
- Ik ben geen programmeur, developer of wat dan ook, puur hobbyist. Heb hier een beetje Python en meer JSON voor moeten "leren", maar ik ben gee export. Dus garantie tot aan de deur en ik zal het allicht niet ultiem efficiënt aangepakt hebben...

- Ik lees alleen het huidige verbruik en de status uit. De status heeft meerdere waardes die kunnen (0 = uit, 1 = aan, 2 = ook iets?) maar het switch snapt alleen 0 en 1. Wat de andere statussen betekenen, schiet mij maar lek, enlighten me als je het weet

- In de JSON die wordt opgehaald zitten meer waardes waar je mogelijk iets mee kunt. Lukte mij niet vlot en leek me niet ultiem nuttig, dus dit is waar ik het bij houd. Voel je vrij "door te ontwikkelen"
- Ik heb geen aspiraties om hierop door te ontwikkelen oid, voor mij is het prima zo. Dus leef je uit, maar verwacht niks van mij

-
Credits voor het grootste deel van de scripting gaan naar de mensen die dit vóór mij al hadden gemaakt. Ik heb alleen een beetje copy/paste/aanpas werk gedaan
Hopelijk hebben mensen hier iets aan, ik ben er blij mee (en stiekem ook wel een beetje trots op, gotta be honest

). Het eindresultaat ziet er zo uit:
En nu stop ik met typen, zere vingers.
I see dead pixels...