Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Skript: eta Modbus zu tsv für Modbusadapter konvertieren

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    Skript: eta Modbus zu tsv für Modbusadapter konvertieren

    This topic has been deleted. Only users with topic management privileges can see it.
    • Ma Sch
      Ma Sch last edited by Ma Sch

      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)
      
      1 Reply Last reply Reply Quote 0
      • First post
        Last post

      Support us

      ioBroker
      Community Adapters
      Donate
      FAQ Cloud / IOT
      HowTo: Node.js-Update
      HowTo: Backup/Restore
      Downloads
      BLOG

      776
      Online

      31.6k
      Users

      79.5k
      Topics

      1.3m
      Posts

      1
      1
      56
      Loading More Posts
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes
      Reply
      • Reply as topic
      Log in to reply
      Community
      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
      The ioBroker Community 2014-2023
      logo