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.



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