OEG zonneboiler monitoren met Domoticz
Setup
Mijn huidige zonneboiler systeem heeft 4 zonnecollectoren, een set van 2 gekoppelde collectoren op het westen en een set van 2 gekoppelde collectoren op het oosten.
Een door relais R3 op de OEG-KS2W solar controller aangestuurde 3-weg klep schakelt het solarvloeistofcircuit tussen het solarpompstation en de oost- en west collectorsets, al naar gelang welke op dat moment het heetst is.
In beide sets collectoren bevindt zich een temperatuursensor, gekoppeld aan resp. aansluiting T1 en T3 van de solar controller.
Een 3e temperatuursensor bevindt zich onderin het boilervat en is gekoppeld aan aansluiting T2 van de solar controller.
De solarpomp die de solarvloistof van de geselecteerde collector naar de warmtewisselaatr in het boilervat stuurt wordt aangestuurd door relais R3 van de solar controller.
Doel
Voornaamste doel is om de temperaturen van de collectoren én het boilervat te meten, te registreren en te loggen in mijn Domoticz monitoring / home automation systeem
Verder leek het me leuk om ook de pompsnelheid en de actieve collector set te kunnen zien.
OEG verkoopt zelf ook software om de KS2W en KMSD controllers mee uit te lezen (en te programmeren). maar dit draait op Windows. Ik heb geen zin om voor het monitoren dag en nacht een Windows computer te laten draaien.
Aangezien ik nog wel een energiezuinige Raspberry Pi over had, heb ik gezocht naar een oplossing dat daarop werkt.
Geraadpleegde bronnen
- Python script voor het uitlezen van de OEG controller en info over de daarop gebruikte registers op https://github.com/ced2git/oeg_kmsd.
Dit script zet de waarden echter in MQTT en dan zou ik weer moeilijk moeten doen om de waarden uit MTT in Domoticz te krijgen.
Ik heb het script daarom aangepast om dat rechtstreeks via JSON te doen. - Python script van https://www.domoticz.com/wiki/Python_-_Monitor_Domoticz_IP_address voor een voorbeeld hoe virtuele sensors (uit te lezen en) te updaten
- Details m.b.t. parameters voor het updaten van de temperatuur sensors in https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Temperature
- Details m.b.t. parameters voor het updaten van de temperatuur sensors in https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Percentage
- Details m.b.t. parameters voor het updaten van de switch sensor in https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Selector_Switch
Benodigdheden
- Een zonneboilerset met een OEG-KMSD compatible zonneboiler controller.
- Een werkend Domoticz monitoring / home automation systeem, onder Linux, bijvoorbeeld op een Raspberry Pi (RPI).
- 3 virtuele sensors in Domoticz t.b.v. de weergave van de temperatuur collectoren en boiler, type Temp, subtype LaCrosse TX3
- 1 virtuele sensor in Domoticz t.b.v. de weergave van de pompsnelheid, type General, subtype LaCrosse TX3
- 1 virtuele sensor in Domoticz t.b.v. de weergave van de actieve collectorset, Type Light/Switch, subtype Switch (niet van toepassing als je geen switchover hebt)
- Een 2e RPI om de controller mee te “scannen”. Dit kan ook dezelfde RPI zijn als die waar Domoticz op draait, wanneer deze in de buurt van de OEG controller is te plaatsen.
- Een “gewone” USB kabel USB A naar mini-USB, tussen de OEG controller en de (scanning) RPI.
- LAN of Wifi verbindingen met je thuis netwerk op de monitoring RPI en op de RPI met Domoticz (als dit niet dezelfde RPI is)
- Python3-pip en de modules pyserial en minimalmodbus plus alle dependencies op de scanning RPI
in mijn geval stond er aanvankelijk zelfs nog helemaal geen Python3 op, maar die werd dus automatisch meegeïnstaleerd bij het installeren van pip - een python script dat de OEG controler gaat uitlezen en de waardes in Domoticz zet.
installatie procedure
installatie pip, pyserial, minimalmodbus (en dependencies):
pi@pgit-rpi02:~ $ sudo apt install python3-pip Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: javascript-common libexpat1-dev libjs-jquery libjs-sphinxdoc libjs-underscore libpython3-dev libpython3.9-dev python-pip-whl python3-dev python3-distutils python3-lib2to3 python3-setuptools python3-wheel python3.9-dev Suggested packages: apache2 | lighttpd | httpd python-setuptools-doc The following NEW packages will be installed: javascript-common libexpat1-dev libjs-jquery libjs-sphinxdoc libjs-underscore libpython3-dev libpython3.9-dev python-pip-whl python3-dev python3-distutils python3-lib2to3 python3-pip python3-setuptools python3-wheel python3.9-dev 0 upgraded, 15 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/7,224 kB of archives. After this operation, 23.0 MB of additional disk space will be used. Do you want to continue? [Y/n] Y
pi@pgit-rpi02:~ $ sudo pip3 install pyserial Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting pyserial Downloading https://www.piwheels.org/simple/pyserial/pyserial-3.5-py2.py3-none-any.whl (90 kB) |████████████████████████████████| 90 kB 12 kB/s Installing collected packages: pyserial Successfully installed pyserial-3.5 root@pgit-rpi02:/home/pi/scripts# sudo pip3 install minimalmodbus Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting minimalmodbus Downloading https://www.piwheels.org/simple/minimalmodbus/minimalmodbus-2.1.1-py3-none-any.whl (32 kB) Requirement already satisfied: pyserial>=3.0 in /usr/local/lib/python3.9/dist-packages (from minimalmodbus) (3.5) Installing collected packages: minimalmodbus Successfully installed minimalmodbus-2.1.1
Het script
Ik heb onderstaand Python script aangemaakt / bewerkt met de nano editor en het OEG_scan.py genoemd.
Tip: Nano verlaten en de wijzigingen daarbij (al dan niet) opslaan doe je met Control+X (^X
Een aantal regels, met name die de opdracht print bevatten, waren alleen bedoeld om mee te testen en zijn hier (met #) gecommentarieerd en daarmee uitgeschakeld.
pi@pgit-rpi02:~ $ nano /home/pi/scripts/oeg_scan.py
#!/usr/bin/python3 # #https://github.com/ced2git/oeg_kmsd #Register 35 R1 R2 R3 #0 OFF OFF OFF #1 ON OFF OFF #2 OFF ON OFF #3 ON ON OFF #4 OFF OFF ON #5 ON OFF ON #6 OFF ON ON #7 ON ON ON oeg_dict = { 35:"", #R1/R2/R3 status On/Off 38:"", #T1 temperatuur collector oost 39:"", #T2 temperatuur boiler onderin 40:"", #T3 temperatuur collector west 58:"", #R2 pomp modulatie 0-100% } import serial import minimalmodbus import os import time import datetime import urllib.request, urllib.error, urllib.parse import json instrument = minimalmodbus.Instrument('/dev/ttyACM0', 128, minimalmodbus.MODE_ASCII) # port name, slave address (in decimal) #Change the COM port above to the OEG Usb comport or USB address on Linux. instrument.serial.baudrate = 9600 # Baud instrument.serial.parity = serial.PARITY_EVEN instrument.serial.bytesize = 7 instrument.serial.stopbits = 1 instrument.serial.timeout = 0.05 # seconds delay = 5
T1 = str(instrument.read_register(38,1,3,signed=True)) #print(T1) T2 = str(instrument.read_register(39,1,3,signed=True)) #print(T2) T3 = str(instrument.read_register(40,1,3,signed=True)) #print(T3) R2 = str(10*(instrument.read_register(58,1,3,signed=True))) #print(R2) if (10*(instrument.read_register(35,1,3,signed=True))) >= 4: R3 = '0' else: R3 = '10' #print(R3) #time.sleep(delay) idxT1 = '119' idxT2 = '120' idxT3 = '121' idxR2 = '122' idxR3 = '198' domoticzPort ="8080" domoticzIP = "192.168.178.30" linkName = 'wlan0' domoticz = domoticzIP + ":" + domoticzPort #print(domoticz) def log(message): print (message) def domoticzrequest (url): request = urllib.request.Request(url) response = urllib.request.urlopen(request) domoticzSetT1 = "http://" + domoticz + "/json.htm?type=command¶m=udevice&idx=" + idxT1 + "&nvalue=0&svalue=" + T1 #print(domoticzSetT1) domoticzrequest(domoticzSetT1) domoticzSetT2 = "http://" + domoticz + "/json.htm?type=command¶m=udevice&idx=" + idxT2 + "&nvalue=0&svalue=" + T2 #print(domoticzSetT2) domoticzrequest(domoticzSetT2) domoticzSetT3 = "http://" + domoticz + "/json.htm?type=command¶m=udevice&idx=" + idxT3 + "&nvalue=0&svalue=" + T3 #print(domoticzSetT3) domoticzrequest(domoticzSetT3) domoticzSetR2 = "http://" + domoticz + "/json.htm?type=command¶m=udevice&idx=" + idxR2 + "&nvalue=0&svalue=" + R2 #print(domoticzSetR2) domoticzrequest(domoticzSetR2) domoticzSetR3 = "http://" + domoticz + "/json.htm?type=command¶m=switchlight&idx=" + idxR3 + "&switchcmd=Set%20Level&level=" +R3 #print(domoticzSetR3) domoticzrequest(domoticzSetR3) #time.sleep(delay)
Het script schedulen in cron
Ik laat het script elke 10 minuten draaien, zodat de waardes elke 10 minuten in Domoticz worden bijgewerkt.
N.B. De eerste keer dat je crontab -e (van edit) start krijg je een vraag welke editor je daar (voortaan) voor wil gebruiken. Ik heb voor nano gekozen, omdat ik die het makkelijkst vind.
pi@pgit-rpi02:~ $ crontab -e GNU nano 5.4 /tmp/crontab.MM2qzu/crontab # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any'). # # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command */10 * * * * python /home/pi/scripts/oeg_scan.py >dev0