Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

Ginlong Solis omvormer uitlezen voor Domoticz

Pagina: 1
Acties:

  • SuperJoker
  • Registratie: januari 2019
  • Laatst online: 11-01 11:15
Geen vraag, maar meer een howto. Via onze huurbaas (amvest) kregen wij zonnepanelen. Er zijn veel mensen die op deze manier zonnepanelen hebben gekregen.

Hiervoor gebruiken ze de ginlong solis 4G omvormers. Helaas heeft Amvest ervoor gekozen niet gebruik te maken van de standaard wifi monitoring optie op deze apparaten, maar een veel duurdere oplossing, namelijk een externe extra slimme meter en een webportaal. Dit portaal werkt nog niet, is nu in testfase, en de uitrol ervan laat op zich wachten, terwijl er al mensen langer dan een half jaar met panelen zitten.

Echter, deze omvormers hebben een RS485 aansluiting. Deze zit op de onderkant, het is een ronde stekker gemarkeerd 'COM' en er zit een afschroefbaar dopje op. Deze kun je zelf uitlezen.




Benodigdheden

Om deze uit te lezen zoals ik dat doe, heb je nodig:

1x Raspberry Pi Zero W (mag natuurlijk elke pi zijn, ik gebruik deze)
1x RS485 aansluiting tbv. Pi. Ik gebruik deze https://www.abelectronics.co.uk/p/77/rs485-pi

Totaal kosten, als je het bv. bij kiwi bestelt, op dit moment, EUR 24,65.

Als je het netjes wil aansluiten, heb je ook een ronde 4 polige female schroefconnector nodig, deze is bij Conrad te bestellen. Ik heb zelf echter de draadjes gewoon aan de pennetjes gesoldeerd.



Aansluiten

Je kunt deze RS485 hat gewoon bovenop je pi duwen. Een USB RS485 aansluiting zou ook werken. Je hebt als het goed is dan een A(+) en een B(-) aansluiting.

Onderop de omvormer zit dus die ronde stekker. Als je goed kijkt, zul je zien dat de pinnetjes genummerd zijn. Je hebt pin 3 en pin 4 nodig. Pin 3 is A+, pin 4 is B-. Er is geen terminator weerstand nodig, aan geen van beide kanten. Het gaat dus van A op de RS485 aansluiting van de pi, naar de A op de omvormer, en van B naar B.

Instellen

Raspbian
Ik gebruik raspbian strecth lite, het laatste image. Deze kun je downloaden en met etcher op een SD kaart zetten. Hierna maak je in de boot schijf een leeg tekstbestandje aan wat je 'ssh' noemt (hiermee zet je SSH aan) en vervolgens een bestand wat je wpa_supplicant.conf noemt. Hierin zet je:


code:
1
2
3
4
5
6
7
8
9
10
country=NL
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="Het SSI van je wifi"
    scan_ssid=1
    psk="Het password van je wifi"
    key_mgmt=WPA-PSK
}



Hierna kun je deze in je pi steken, en zal je pi opstarten, verbinden met je wifi en kun je er remote op inloggen, bijvoorbeeld met putty. Uit je router kun je halen welk IP adres de pi gekregen heeft. Inloggen kan met username 'pi' wachtwoord 'raspberry'.

Ikzelf haal altijd de user pi weg en maak een eigen user aan met sudorechten, dit is echter niet nodig, en is elders op internet wel te vinden hoe. Kort is het je pi via raspi-config zo zetten dat ie cli inlogged, dan adduser <username>, dan die user toevoegen aan /etc/sudoers, vervolgens opnieuw opstarten, inloggen als die user en dan deluser pi.

Vervolgens apt-get update; apt-get upgrade om alles naar de laatste versie te krijgen.

Dan sudoen naar root (sudo bash). Ik persoonlijk vind dat makkelijker dan continu overal 'sudo' voor te moeten typen.

Als root:


code:
1
2
3
4
apt-get install python python-pip 
python -m pip install pyserial
pip install minimalmodbus
pip install paho-mqtt



Vervolgens; de seriële poorten zijn ze een beetje mee aan het hannesen geweest voor het Bluetooth wat op een zero-W en een pi3+ aanwezig is. Je wil weten op welke seriele poort je RS485 terecht gekomen is. Als je een USB oplossing gebruikt, is dat mogelijk /dev/ttyUSB0. In ons geval (met de RS485 hat) worden de eigen raspberry seriele poorten gebruikt, die op pin 14 en 15 van de GPIO's zit.

Om die te kunnen gebruiken, zet je eerst serieel aan in raspi-config. raspi-config uitvoeren, dan optie 5 kiezen (interfacing), dan optie 6 (serial), "would you like login shell" -> no, "enable serial hardware" -> yes. Bij verlaten van raspi-config zal ie vragen of je opnieuw wil opstarten, dit is nu nog niet nodig.

Hierna open je /boot/config.txt in je favoriete editor. Helemaal onderaan dit bestand voeg je toe:


code:
1
2
enable_uart=1
dtoverlay=pi3-miniuart-bt



Dit zorgt ervoor dat de goede seriële poort op de pi aan pin 14 en 15 zit, en niet aan de bluetooth module.

Open vervolgens /boot/cmdline.txt en controleer dat er geen terminal gestart wordt op je poort. Hier zou zoiets in moeten staan:


code:
1
dwc_otg.lpm_enable=0 console=tty1 root=PARTUUID=196d3d14-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait



Uiteraard is dat partitie-ID bij iedereen anders.

Nadat dit gedaan is, kun je de pi rebooten. Je RS485 zit dan op /dev/serial0.

Dan is er een script nodig voor het uitlezen. Voor ik dat post, een kleine disclaimer; dit script is zeker niet perfect of klaar. Het werkt, en dat is alles. Het verfraaien, moet je zelf doen.

Open een .py bestand naar keuze. Ik heb het mijne 'solipi.py' genoemd.

// edit: voor de volledigheid; onderstaand is door mij aangepast maar niet bedacht. Het is gebaseerd op:
https://github.com/rogersia/Solis-4G


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
import minimalmodbus
import socket
import serial
import paho.mqtt.client as paho
import time

instrument = minimalmodbus.Instrument('/dev/serial0', 1)
instrument.serial.baudrate = 9600
instrument.serial.bytesize = 8
instrument.serial.parity   = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout  = 0.2

broker="192.168.1.2"

# callback for mqtt
def on_message(client, userdata, message):
    time.sleep(1)
    print("received message =",str(message.payload.decode("utf-8")))

try:

        # get data from solis
        Realtime_ACW = instrument.read_long(3004, functioncode=4, signed=False) #Read AC Watts as Unsigned 32-Bit
        print("AC_Watts: " + str(Realtime_ACW) + "W")
        Realtime_DCV = instrument.read_register(3021, numberOfDecimals=0, functioncode=4, signed=False) #Read DC Volts as Unsigned 16-Bit
        print("DC Volt: " + str(Realtime_DCV/100) + "V")
        Realtime_DCI = instrument.read_register(3022, numberOfDecimals=0, functioncode=4, signed=False) #Read DC Current as Unsigned 16-Bit
        print("DC Current : " + str(Realtime_DCI) + "A")
        Realtime_ACV = instrument.read_register(3035, numberOfDecimals=0, functioncode=4, signed=False) #Read AC Volts as Unsigned 16-Bit
        print("AC volt : " + str(Realtime_ACV/10) + "V")
        Realtime_ACI = instrument.read_register(3038, numberOfDecimals=0, functioncode=4, signed=False) #Read AC Current as Unsigned 16-Bit
        print("AC Current :" + str(Realtime_ACI) + "A")
        Realtime_ACF = instrument.read_register(3042, numberOfDecimals=0, functioncode=4, signed=False) #Read AC Frequency as Unsigned 16-Bit
        print("AC Frequency :"+ str(Realtime_ACF/100) + "Hz")
        Inverter_C = instrument.read_register(3041, numberOfDecimals=0, functioncode=4, signed=True) #Read Inverter Temperature as Signed 16-Bit
        print("Inverter Temperature :" + str(Inverter_C/10) + "C")
        AlltimeEnergy_KW = instrument.read_long(3008, functioncode=4, signed=False) # Read All Time Energy (KWH Total) as Unsigned 32-Bit
        print("Generated (All time):" +str(AlltimeEnergy_KW) + "kW")
        Today_KW = instrument.read_register(3014, numberOfDecimals=0, functioncode=4, signed=False) # Read Today Energy (KWH Total) as 16-Bit
        print("Generated (Today) :" + str(Today_KW) + "kW")


        client= paho.Client("solipi")
        client.on_message=on_message
        client.connect(broker)
        client.loop_start()
        client.subscribe("domoticz/in")
        time.sleep(2)
        client.publish("domoticz/in",'{"command":"udevice","idx":125,"nvalue":0,"svalue":"' + str(Realtime_ACW) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":137,"nvalue":' + str(Realtime_DCV/100) + ',"svalue":"' + str(Realtime_DCV/100) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":138,"nvalue":' + str(Today_KW) + ',"svalue":"' + str(Today_KW) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":139,"nvalue":' + str(AlltimeEnergy_KW) + ',"svalue":"' + str(AlltimeEnergy_KW) + '"}')
        client.publish("domoticz/in",'{"command":"udevice","idx":140,"nvalue":' + str(Realtime_DCI) + ',"svalue":"' +  str(Realtime_DCI) + '"}')
        client.disconnect()
        client.loop_stop()

except Exception, e:

        print(str(e));



Uiteraard dien je bovenaan het script je broker (in mijn geval mosquitto) in te vullen, en zijn de ID's die je bij het publishen ziet, specifiek voor mij, hier zul je je eigen ID's moeten invullen. Hier komen we later op terug.

Hierna kun je een simpele cronjob toevoegen die dit script elke minuut uitvoert. Crontab -e, en dan:


code:
1
* * * * * /usr/bin/python /locatie/naar/je/script.py



Hierna ben je klaar op deze pi. Later dienen nog de juiste ID's ingevoerd worden.

Domoticz

Ik ga er vanuit dat Domoticz al gekoppeld is aan mosquitto. Bij hardware kun je mosquitto toevoegen, je selecteert hiervoor 'MQTT Client Gateway with LAN interface'. Dit zorgt ervoor dat Domoticz abonneert op 'domoticz/in'.

Hierna maak je bij hardware een dummy switch aan, ik heb deze 'solis' genoemd.


Daarna kun je onder 'apparaten' virtuele sensors aanmaken. Klik hiervoor op 'maak virtuele sensoren'. Geef de sensor een passende naam naar wens. Deze sensoren vind je vervolgens terug onder 'apparaten'



Hier staat een ID. Dat zijn de ID's die je dient in te vullen op je RS485 pi in het 'solipi.py' script.

gebruik

Hierna zou e.e.a. moeten functioneren, en krijg je dit:


Vanaf dit punt kun je zelf verder fine-tunen naar wens.

De waardes staan op rood, omdat het nu donker is, en de omvormer in het donker uit staat. Dus krijgt domoticz nu geen waardes. Morgen weer.

Het best te consumeren met 1kg JOZO.


  • Erik2B
  • Registratie: februari 2002
  • Laatst online: 09:15
Ziet er goed uit!.

Wij hebben dezelfde setup gekregen. Echter heb ik een datalog stick aangeschaft om het bij te houden.
Dit gaat nu via de monitor site van Ginlong en ik wil deze nu eigenlijk lokaal gaan afvangen via een raspberry.

is jouw script daarvoor te gebruiken?

gr Erik

  • Toulon7559
  • Registratie: oktober 2016
  • Laatst online: 16-03 19:45
@Erik2B

Voor uitlezen met o.a. een Raspberry van de Ginlong Monitoring website en van de DLS_Lan en DLS_WiFi wordt al werk verricht in andere threads: kijk bijv. eens in deze thread.
De basis-versie van het script (geleend uit een ander Forum) met uitlezing van Ginlong-portal1.0 levert Actual Power, EToday en ETotal, met output naar Domoticz en naar PVOutput.
Via Ginlong-portal 2.0 (gisteren ontdekt) zou je meer info moeten kunnen pakken, maar dat wordt nog uitgezocht.

Toulon7559 wijzigde deze reactie 30-01-2019 19:03 (59%)
Reden: tekst aangepast


  • Erik2B
  • Registratie: februari 2002
  • Laatst online: 09:15
@Toulon7559
Bedankt voor je reactie! Zag inderdaad dat er nu meer met solis gedaan werd tov een maand of 3 geleden 😏

Ben me zeker aan het inlezen daarin, maar mijn scripting talent is nog minimaal.

Ginlong portal 2.0? Hmmmm gebruik nu tijdelijk de app via de monitoring site. Maar heb het idee dat die maar om de x tijd update..

Blijf je met spanning volgen.

Thanks!

  • wessel145
  • Registratie: juli 2010
  • Laatst online: 20-03 19:25
Toulon7559 schreef op woensdag 30 januari 2019 @ 18:07:
@Erik2B


Via Ginlong-portal 2.0 (gisteren ontdekt) zou je meer info moeten kunnen pakken, maar dat wordt nog uitgezocht.
Klopt. ik ben op het moment bezig met dat script en op dit moment krijg ik netjes alle data binnen, verdere updates zal ik in het andere draadje posten!

  • Toulon7559
  • Registratie: oktober 2016
  • Laatst online: 16-03 19:45
@wessel145

Bij mij lukt het overgangs-inloggen op het Ginlong-Portal2.0 op geen enkele manier:
melding is steeds 'server too busy'
Bij inloggen op het nieuwe Ginlog-portal m.b.v. mijnPortal1.0-UN+PW en bij nieuw registreren krijg ik de reactie 'invalid account':
:'( dat schiet dus niet op ......

Toulon7559 wijzigde deze reactie 31-01-2019 10:14 (10%)


Acties:
  • 0Henk 'm!

  • Toulon7559
  • Registratie: oktober 2016
  • Laatst online: 16-03 19:45
Het heeft even geduurd ( en misschien toeval dat het gebeurde nadat ik een email kon sturen naar een Ginlong-contactadres), maar heb nu toch toegang gekregen tot Ginlong Portal2.0, zelfs met dezelfde inlog-info als voor Portal1.0.

Wessels code van Github gebruikt, en kom zover dat GinMon.py tot proef-executie komt.
Moest wel even een aantal eenvoudige maatregelen nemen om (i.p.v. Python3) met Python2.7 verder te komen, waarbij module-installatie het eenvoudigst gaat vanuit de root m.b.v. sudo pip install ..... :
  • configparser moet ConfigParser zijn [volgens https://docs.python.org/2/library/configparser.html ]
  • en dat betreft een import-regel en script-regel 156
  • requests moet worden geïnstalleerd, voordat je die module kunt importeren
  • pymysql moet eveneens worden geïnstalleerd zodat het script goed loopt
Loop daarna even vast op een melding die wat meer studie vraagt:
Welcome to Ginlong monitoring tool v2 by wessel145
Loading Config
Config Loaded, logging in
Traceback (most recent call last):
File "GinMon.py", line 177, in <module>
InverterID = CheckLogin()
File "GinMon.py", line 56, in CheckLogin
if rson['result'].get('isAccept') == 1:
KeyError: 'result'
Kleinigheidje gevonden dat InverterID in de respons van Ginlong onder deviceId zit.
Gezien de foutmelding even daarmee zitten experimenteren in het script, maar dat geeft (nog) geen oplossing.

Ziet iemand welke script-aanpassing nodig is om verder te komen met toepassing van Python2.7?

Toepassing van een Python-versie 3.X is misschien de eenvoudiger oplossing, maar diverse programma's op mijn computers moeten Python2.7 hebben (of ik moet ze ombouwen), dus dan maar naast elkaar en gescheiden aanroepen waar nodig.
Python3.4 is eenvoudig genoeg te installeren via
sudo apt-get update
sudo apt-get install python3
Dan daarna nog een aantal benodigde modules ook in de Python3.4 folder zien te krijgen, want Python3.4 gebruikt geen modules uit de folders van Python2.7 en omgekeerd..
Als ik vanuit de root-foolder de benodigde modules installeer, dan komen ze nu niet bij Python3.4 terecht, hoewel ik meen ze in de goede richting te sturen met bijv. een van de volgende 2 CLI-aanroepen
sudo apt-get install python3-<modulenaam>
sudo pip3 install <modulenaam>
Wat is de eenvoudigste methode om benodigde Python-modules netjes zichtbaar gelinkt met de Python3.4-folder te krijgen?
.

Toulon7559 wijzigde deze reactie 05-03-2019 10:45 (100%)
Reden: tekst uitgebreid

Pagina: 1


Apple iPhone XS Red Dead Redemption 2 LG W7 Google Pixel 3 XL OnePlus 6T (6GB ram) FIFA 19 Samsung Galaxy S10 Google Pixel 3

Tweakers vormt samen met Tweakers Elect, Hardware.Info, Autotrack, Nationale Vacaturebank, Intermediair en Independer de Persgroep Online Services B.V.
Alle rechten voorbehouden © 1998 - 2019 Hosting door True