Let op: Tweakers stopt per 2023 met Tweakblogs. In dit artikel leggen we uit waarom we hiervoor hebben gekozen.

Solis-omvormer uitlezen met een Raspberry Pi

Door Alphyraz op donderdag 12 september 2019 11:20 - Reacties (12)
Categorie: -, Views: 6.665

Hoi en welkom op mijn eerste tweakblog.

Allereerst wil ik voor deze tweakblog even de moeite nemen om degene te bedanken die het topic heeft geschreven waarop deze tweablog is gebaseerd en/of van is gejat. Grote dank de schrijver van dit topic (hierna "het topic") voor het uitvogelen van hoe het een en ander werkt. Met mijn beperkte hardware- en seriële kennis was me dit niet gelukt. :)

Deze tweakblog is een beetje een mix tussen mijn ervaring en een how-to. In principe zou je de stappen die ik gedaan heb ook moeten kunnen volgen.

Even wat achtergrondinformatie. Onlangs hebben wij op het dak zonnepanelen laten plaatsen en de omvormer die we hebben is van het merk Solis. De Solis mini 4G om precies te zijn. Het leek mij prettig om de opbrengst van de zonnepanelen bij te houden en op te slaan in mijn bestaande Domoticz-installatie. Waarom?
  • Inzicht in de opbrengst van de zonnepanelen, zonder dat ik zelf naar de omvormer hoef te lopen om te kijken
  • Weer inzicht in het totale stroomverbruik, aangezien onze slimme meter niet aangeeft hoeveel stroom er in totaal verbruikt is, maar slechts hoeveel er van het net gehaald is en is teruggeleverd
  • Ik heb liever data lokaal staan dan in de cloud
  • Omdat het kan
De organisatie waar ik mijn zonnepanelen bij heb aangeschaft en die ze hebben geïnstalleerd, heeft mij een zogeheten data logging stick gegeven. Dat is simpel gezegd een stick die je aan de onderzijde van je omvormer erin plugt. Vervolgens leest deze data logging stick informatie uit van de omvormer en stuurt deze door naar derde partij. Dit apparaat zet een access point op waarmee je moet verbinden, waar je vervolgens via een interne portal het apparaat met je eigen WiFi-netwerk kunt verbinden zodat 'ie de data kan doorsturen naar een derde partij in de cloud.

Ik ben niet zo'n fan van clouds. De redenen hiervoor laat ik even in het midden, maar ik wil de data dus lokaal (thuis) opslaan en niet in de cloud.

Ik heb overwogen om de data logging stick via een lokale DNS-server te laten verwijzen naar een lokale webserver of iets dergelijks om de data die 'ie verstuurt op te pakken en in Domoticz te plaatsen in plaats van dat de data naar een onzichtbaar wolkje gaat. Man-in-the-middle dus.

Een andere optie was om zelf iets te knutselen waarbij ik zélf de omvormer uitlees en in Domoticz plaats. Waarschijnlijk meer werk, maar persoonlijk vond ik het logischer dan een man-in-the-middle-oplossing (leuk woord voor galgje). Die weg ben ik dus ingeslagen.

Vervolgens dus aan de slag gegaan en onderzoek gedaan hoe ik dit zelf kon doen. De omvormer in kwestie schijnt uit te lezen te zijn middels de COM-poort die aan onderzijde van de omvormer te vinden in. Het dopje kun je eraf draaien, waarna vier pinnen in een ronde connector je hartelijk begroeten. Het topic leert mij dat dit een RS485-aansluiting is. Na even Googelen kwam ik tot de conclusie dat dit een seriële interface is voor telecommunicatie. Maar aan de onderkant van de omvormer zit slechts een aansluiting waar vier pinnen uitsteken en die in de verste verte niet op een telefoonaansluiting of iets soortgelijks lijkt, dus wat nu? :?

Ik kon op internet weinig specificaties vinden over de omvormer en kon dus ook niet zo 1-2-3 achterhalen wat voor type connector ik moest gebruiken die ik op deze pinnen kon pluggen.

Zoals gezegd heb ik een data logging stick die juist een connector heeft om op die COM-poort aan te sluiten. Je voelt het al aankomen: de maniak in mij kwam naar boven met het idee om de connector hiervan te amputeren en te doneren aan mijn eigen systeem. Altijd handig, die donorhardware. Ik heb de data logging stick voorzichtig opengemaakt en de connector losgemaakt van de printplaat. Dat kun je hieronder goed zien.

Maar dat ziet er heel goed uit! Uit de connector steken vier draden die hoogstwaarschijnlijk overeenkomen met de gaten waar de pinnen uit de COM-poort van de omvormer in passen.

Nu heb ik de luxe dat ik een data logging stick had met deze connector, maar andere mensen hebben deze mogelijk niet. Helaas weet ik nog steeds niet wat voor soort connector het is. Ik heb er een en weet ongeveer hoe hij werkt, maar ik heb geen idee hoe hij heet. Mocht iemand dit wel weten, laat dit dan alsjeblieft weten. :)

Mijn volgende stap was het aansluiten van deze connector op mijn Raspberry Pi. Het topic gebruikt hiervoor een apart bordje dat je op een Raspberry Pi kunt aansluiten. Echter zit er op mijn Pi Zero geen GPIO-header, dus ik heb naar iets anders gezocht. Ik kwam toen op het volgende product uit: MAX485 module voor RS485 seriële communicatie USB. Deze zag er simpel uit en was niet duur. Besteld en een paar dagen later lag 'ie op de deurmat.

Het is even goed kijken hoe je de connector moet aansluiten op de COM-poort op de omvormer en hoe je de draden uit de connector moet aansluiten op de RS485 USB-stick. Het topic leert mij dat er bij iedere pin op de omvormer een nummer staat. Dat klopt inderdaad. En nog mooier: op de connector die ik had stonden óók nummers. Het moet niet gekker worden. Zie hieronder hoe dat eruit ziet.

Het mooie is overigens dat er door een geultje in de connector en pin in de COM-poort de connector er maar op één manier in past.

Ik heb in de tussentijd wat zitten rotzooien met de connector die in de omvormer past en uiteindelijk heb ik alle draden zo kort mogelijk afgeknipt (eigenlijk gewoon zodat er niets meer uitsteekt) en vervolgens aan de uiteinden van pin 3 en 4 nieuwe draden gesoldeerd. Ik ben me bewust van het feit dat het geen perfect soldeerwerk is. Dit was voor mij de eerste keer solderen en ik ben vrij trots op het resultaat voor een eerste keer. :)

De RS485 USB-stick heeft aan de achterkant ruimte om twee draden in te steken en vast te draaien, net zoals bij een kroonsteen. Deze gaten hebben beide een naam: A en B. Volgens het topic sluit je de draad uit pin 3 aan op A en de draad uit pin 4 aan op B. Zo gezegd, zo gedaan, zoals je op bovenstaande afbeelding kunt zien.

Vervolgens heb ik met een USB naar micro USB converter de RS485 USB-stick aangesloten op de Pi Zero en de Pi opgestart.

Toen 'ie eenmaal opgestart was ben ik ingelogd via SSH. Daar vervolgens de volgende commando's uitgevoerd om de benodigde seriële libraries te kunnen gebruiken in Python:
code:
1
2
3
sudo apt-get install python python-pip 
sudo python -m pip install pyserial
sudo pip install minimalmodbus

En vervolgens het daadwerkelijke Python-script om de seriële poort uit te lezen:
Python:
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
import minimalmodbus
import serial
import time

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

try:
        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_KWH = instrument.read_long(3008, functioncode=4, signed=False) #Read all time energy (kWh total) as Unsigned 32-Bit
        print("Generated all time: " + str(AlltimeEnergy_KWH) + " kWh")
        Today_KWH = instrument.read_register(3014, numberOfDecimals=1, functioncode=4, signed=False) #Read todays energy (kWh total) as 16-Bit
        print("Generated today: " + str(Today_KWH) + " kWh")

except Exception, e:
        print(str(e));

Je kunt dit script aanmaken en opslaan met bijvoorbeeld nano. Ik prefereer nano omdat ik nog regelmatig badend in het zweet wakker word van de talloze keren dat ik niet meer kon ontsnappen uit Vim.
code:
1
nano inverter.py

Plak vervolgens de code in nano en sla op met CTRL + O, CTRL + W (ja, ik zet het er maar even bij want voor de niet-Linux-gurus is het ook soms nog een hele strijd om uit nano te komen).
Dit script is ook gebaseerd op het topic maar ik heb alles wat ik niet nodig had eruit gehaald en enigszins aangepast. Ik adviseer sterk je om met dit minimale script éérst te kijken of je data kunt uitlezen van de omvormer alvorens je deze data gaat verwerken. Ik had namelijk eerst het volledige script uit het topic gepakt en geprobeerd te gebruiken. Dit resulteerde vervolgens in de volgende foutmelding bij mij:
No communication with the instrument (no answer)
Hoewel dit impliceert dat er niets over de seriële interface ging, leek het daar niet aan te liggen. Toen ik alle niet-essentiële stukken uit dat script had verwijderd werkte het namelijk wél. Voordat ik dit geprobeerd had, had ik namelijk al de draden doorgeknipt waardoor ik vervolgens mocht gaan solderen, terwijl het waarschijnlijk ook al met de draden was gelukt die al aan de connector zaten. Dus, doe jezelf een lol en test eerst het minimale alvorens je verdergaat. ;)

Vervolgens het Python-script uitvoeren:
code:
1
python inverter.py

Wanneer ik het aangepaste script draaide, kwam er wonder boven wonder échte data uit de omvormer! :D


Krijg je bovenstaande melding met een minimaal script? Blijf kalm. Probeer het script nog een paar keer uit te voeren. Af en toe krijg ik namelijk deze melding nog en vervolgens niet meer. Blijft je script falen? Blijf dan nog steeds kalm. Controleer of alles goed is aangesloten. Blijft het script nog stééds falen? Dan is het nu tijd om in paniek te raken. Pak je gereedschap erbij en loop alles nog eens na.

De volgende stap is natuurlijk het opslaan van deze data. Momenteel ben ik daar nog mee bezig en dat lijkt me ook wel een eigen blog waard.

De highlights van dit kleine maar toch veelomvattende project:
  • Voor de eerste keer hardwareorgaandonatie ingezet
  • Voor de eerste keer iets met seriële communicatie gedaan
  • Mijn eerste échte regel Python-code getikt
  • Voor de eerste keer van mijn leven zelf gesoldeerd
  • Eerst goed controleren of het écht niet aan je software ligt alvorens je kabels doorknipt
  • Voor de eerste keer een tweakblog geschreven
Voor nu hoop ik dat jullie iets aan deze blog hebben gehad. Als je vragen en/of opmerkingen hebt, stel ze dan gerust.