Nu het gelukt is om m.b.v. de Raspberry Pi (RPI) de slimme elektra meter uit te lezen, wordt het tijd voor de volgende uitdaging: het uitlezen van de warmte meter (ons huis is aangesloten op stadsverwarming, i.p.v. op het gasnet). De warmte meter (Landis+Gyr Ultraheat 50) heeft echter geen P1-poort en kan standaard ook niet communiceren met de slimme elektra-meter. Wel heeft de warmte meter een optische interface (conform IEC 62056-21; dat is dus geen "simpele" pulse-interface). Om daar gebruik van te maken, heb ik een prototype in elkaar gezet van een IR-lees/schrijfkop, die aangesloten wordt op de serial port van de RPI.
Nota Bene: zie onderstaande 'Achtergrond informtie' en mijn vorige project m.b.t. de slimme elektra meter, voor meer details over het gebruik van de seriele port van de RPI.
Resultaten
Het eerste prototype bleek op zichzelf wel te werken: als ik met een spiegeltje de IR-diode (zender) op de IR-transistor (ontvanger) richtte, dan werkte de communicatie. Maar als ik de IR-lees/schrijfkop (met een ringmagneet) op de warmtemeter plaatste, kreeg ik geen enkele reactie terug. Na wat speurwerk op internet, kwam ik erachter dat de signalen geinverteerd moesten worden. Het prototype daarop aangepast, waarna de interface wel (b)leek te werken, maar deze leverde nog niet meteen zinvolle output op. Na nog wat speurwerk en hulp van enkele andere hobbyisten, is het ook gelukt om de meter met het juiste protocol aan te spreken. Hieronder volgt een overzicht van het gebruikte python-script.
import serial
from time import sleep
ser = serial.Serial("/dev/ttyAMA0", baudrate=300, bytesize=7, parity="E", stopbits=1, timeout=2, xonxoff=0, rtscts=0)
try:
while line[0] != "!":
line = ser.readline()
print line
finally:
ser.close()
Output
De onderstaande afbeelding laat een deel van de output van de warmte meter zien. De eerste regel beginnend met '/' is het "Identification"-bericht, dat de meter geeft in reactie op het "Request"-bericht. Daarin staat een identificatie van de leverancier (LUG = Landis und Gyr), gewenste baudrate (C = 2.400 bps) en een leveranciersspecifieke code (UH50 = Ultra Heat 50). Daarna volgt een "telegram" met allerlei meetgegevens, waarbij de eerste twee rubrieken voor zichzelf spreken.
IEC 62056-21
Het feit dat het niet meteen lukte om de warmtemeter uit te lezen, kon vele oorzaken hebben. De IEC 62056-21 standaard is helaas niet zonder meer beschikbaar, maar uiteindelijk heb ik de volgende feiten kunnen achterhalen:
Receiver zit links, transmitter zit rechts (View into reading head / optical port).
ON-condition = SPACE = Binary 0, OFF-condition = MARK = Binary 1.
Deze informtatie was voor mij de aanleiding om mijn prototype om te bouwen.
The wavelength of the radiated signals in both directions is between 800 nm and 1 000 nm (infrared).
De gebruikte IR-diode en IR-transistor voldoen daaraan.
De communicatie vindt initeel plaats met 300bps, 1 start bit, 7 data bits, 1 parity bit, 1 stop bit.
Na een eerste request kan de meter echter aangeven dat overgeschakel moet worden op een hogere baudrate; bij de UH50 bleek dat 2400 bps te zijn.
Overigens lees ik in andere documentatie over 2 stopbits; in de praktijk blijkt beide te werken.
Ik had ergens gelezen dat er geen sprake zou zijn van een simpel IR-aan/uit-signaal, maar dat het IR-aan-signaal een frequentie zou moeten hebben van 38kHz; dat blijkt (gelukkig) niet het geval te zijn.
Het start-bericht conform IEC 62056-21 bestaat uit 5 characters ("/?!"+CR+LF); optioneel kan daar nog een devicenummer in opgenomen worden; bij de UH50 bleek dat niet nodig te zijn. Wel moest eerst een header met een reeks nullen verzonden worden, om de meter "wakker" te maken. Verder kan in het start-bericht ook "/#!" gebruikt worden; dat resulteert in een "telegram" met nog meer velden.
De UH50 registreert elke 15 minuten nieuwe meetwaarden, maar let op: "Every time data are read out, the battery life of the meter is reduced by 0.3
hours."
Nota Bene: de normale levensduur van de batterij is 11 jaar.
Update 2x
Inmiddels heb ik het prototype van de lees-/schrijfkop omgezet in een gesoldeerde versie, met daaraan een plat snoer en RJ12 stekker. Nu het geheel alleen nog van een nette behuizing voorzien.
Verder heb ik geprobeerd om de seriele poort van de RPI onder windows als COM poort beschikbaar te krijgen ("redirect", zodat ik de UH50 met een windows-programma kan uitlezen). Helaas is dat nog niet gelukt (ook niet met tijdelijk uitgeschakelde firewall), waarschijnlijk omdat de UH50 tussentijds de snelheid aanpast (van 300 naar 2400 bps). De volgende opties heb ik uitgeprobeerd:
Aan RPI-kant:
- sudo apt-get install socat
socat tcp-l:1234,reuseaddr,fork /dev/ttyAMA0,raw,b2400,echo=0,ocrnl=1
- python rfc2217_server.py /dev/ttyAMA0
Aan Windows-kant:
- HW VSP3 - Virtual Serial Port
- Com2tcp (Com0Com)