Toon posts:

Solis Omvormer met LAN aansluiting uitlezen met Domoticz

Pagina: 1
Acties:

Acties:
  • +1Henk 'm!

  • jotheman
  • Registratie: September 2000
  • Laatst online: 30-11 13:20

jotheman

Was like that when I got here!

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. 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. Bewuste crosspost dus!

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:

- 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&param=udevice&idx=" + domoticz_device_idx+ "&nvalue=0&svalue=" + str(ActualPowerNoSep))
urlonoff = ("http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url+ "?type=command&param=udevice&idx=" + domoticz_device_onoff_idx+ "&nvalue=" + str(OnOrOff))
urllib.urlopen(url)
urllib.urlopen(urlonoff)

- Maak het script executable met commando
code:
1
sudo chmod +x ginlong.py
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.
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...



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee