NEWS
Skript: eta Modbus zu tsv für Modbusadapter konvertieren
-
Hallo,
bei den Heizkesseln von eta muss man man für die einzelnen Parameter selbst festlegen, in welche modbus-Register sie geschrieben werden. Das Vorgehen wird hier beschrieben: https://www.eta.co.at/typo3conf/ext/lg_tecdoc/pi1/download.php?url=/TechDoku/Files/P-0000003693-DE-003.pdf&gid=4b5b50e37f409538fc4d23ac8cdbd618
Somit ist bei jedem die Zuordnung Wert <-> Register eine andere, und eine universelle Datei wie z.B. bei so manchem Wechselrichter steht nicht zur Verfügung.
Man kann die Zuordnung aber in eine xml-Datei exportieren. Das unten stehende python-Skript erzeugt aus der xml-Datei eine fertig formatierte tsv-Datei, deren Inhalt man direkt über den Reiter Holdingregister der modbus-Instanz einfügen kann.Vorgehen
- Zunächst muss man die xml-Datei am Kessel auf einen usb-Stick kopieren. Das ist in der Anleitung oben beschrieben. Die Datei heißt standardmäßig modbusTcpService.xml
- Diese Datei kopiert man auf einen Rechner mit installierten python3 (z.B. den rpi auf dem ioBroker läuft).
- Auf diesem Rechner muss auch das Skript etaXML2ioBrokerModbus.py liegen. Nun ruft man das Skript mit dem Dateinamen und dem Namen der Ausgabedatei auf
python3 etaXML2ioBrokerModbus.py -o eta.tsv
- Danach liegt die fertige tsv-Datei im selben Ordner.
- Hinweis: Alle Registereinträge sind Integer. In der xml-Datei stehen die Entsprechungen (z. B. 1000 für 'Aus', 1001 für 'An'). Das Skript erzeugt eine Formel, so dass die Entsprechungen in den Objekten bei ioBroker stehen und nicht die Rohwerte.
- Hinweis: lässt man den Parameter -o und den Ausgabedateinamen weg, wird alles in die Konsole ausgegeben. Braucht man manchmal zum probieren.
- Hinweis: Heißt die xml-Datei nicht modbusTcpService.xml, ruft man das Skript mit dem Namen der Datei auf
python3 etaXML2ioBrokerModbus.py andererName.xml
- Hinweis:
python3 etaXML2ioBrokerModbus.py -h
gibt die Hilfe aus
Anmerkungen und Anregungen sind herzlich willkommen
Hier das Skript
# etaXML2ioBrokerModbus.py # M. Schulte, 2024 # Convert eta modbus xml-File to tsv-file for ioBroker modbus adpater. # See https://www.eta.co.at/typo3conf/ext/lg_tecdoc/pi1/download.php?url=/TechDoku/Files/P-0000003693-EN-003.pdf&gid=4b5b50e37f409538fc4d23ac8cdbd618 how to configure and export modbus configuration from etaTouch to xml. import sys import os.path import argparse import xml.etree.ElementTree as ET seperator = "\t" parser = argparse.ArgumentParser(description="Convert eta Modbusfile to ioBroker (tsv)",formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('filename', nargs='?', default="modbusTcpService.xml", help="The xml file generated from eta (Logs -> Export)") # positional argument parser.add_argument('-o', '--outputFile', help="Name of the output file. If not set, the result will be prompt to the console.") args = parser.parse_args() # File exists? if not os.path.isfile(args.filename): print(args.filename + " doesn't exists. Abort.") sys.exit(0) #head of outputfile head=["_address","name","description","unit","type","len","factor","offset","formula","role","room","poll","wp","cw","isScale"] # result as tsv output = seperator.join(head) # Load xml file tree = ET.parse(args.filename) root = tree.getroot() # iterate over tree for register in root: line = [None]*len(head) # adress line[0]=register.attrib['id'] # variable is the only subchid of register variable = register[0] #name line[1]=variable.attrib["fubName"] #description line[2]=variable.attrib["name"] #unit line[3]=variable.attrib["unit"] #type (always int32be) line[4]="int32be" #len (always 2) line[5]="2" #factor line[6]=str(1/int(variable.attrib["scaleFactor"])) #offset line[7]="0" #role line[9]="value" #room line[10]="" #poll line[11]="true" #wp line[12]="false" #cw line[13]="false" #isScale line[14]="false" variableType = variable.find('type') if variableType.text == "TEXT": # find substitutions for values validValues = variable.find('validValues') formular ="" # Build formular for validValue in validValues: #x = 1001 ? 'An' :x=1002 ? 'Aus':'' formular = formular+"(x=="+validValue.text+")?'"+validValue.attrib["strValue"]+"':" formular=formular+"''+x"# Print value if no substitution line[8]=formular else: # No formular required #formula line[8]="" #append to output output = output+"\n"+seperator.join(line) if args.outputFile is not None: # Write to file if output filename is given print("Write result to file "+args.outputFile+".") f = open(args.outputFile, "w") f.write(output) f.close() else: print(output)