Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Skript: eta Modbus zu tsv für Modbusadapter konvertieren

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

Skript: eta Modbus zu tsv für Modbusadapter konvertieren

Geplant Angeheftet Gesperrt Verschoben ioBroker Allgemein
1 Beiträge 1 Kommentatoren 219 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Ma SchM Offline
    Ma SchM Offline
    Ma Sch
    schrieb am zuletzt editiert von Ma Sch
    #1

    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 Antwort Letzte Antwort
    0
    Antworten
    • In einem neuen Thema antworten
    Anmelden zum Antworten
    • Älteste zuerst
    • Neuste zuerst
    • Meiste Stimmen


    Support us

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

    777

    Online

    32.5k

    Benutzer

    81.7k

    Themen

    1.3m

    Beiträge
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
    ioBroker Community 2014-2025
    logo
    • Anmelden

    • Du hast noch kein Konto? Registrieren

    • Anmelden oder registrieren, um zu suchen
    • Erster Beitrag
      Letzter Beitrag
    0
    • Home
    • Aktuell
    • Tags
    • Ungelesen 0
    • Kategorien
    • Unreplied
    • Beliebt
    • GitHub
    • Docu
    • Hilfe