Ankündigung

Einklappen
Keine Ankündigung bisher.

ETS-Gruppenadressen in linknx-XML konvertieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    ETS-Gruppenadressen in linknx-XML konvertieren

    Folgendes python-script erzeugt den <objects>-Teil der linknx-Konfigurations-XML automatisch aus der Gruppenadressen-Liste von ETS3.
    Hier einfach Datei -> Datenaustausch (z.B. OPC)... -> Export zum OPC-Server (Export...) wählen und als .esf-Datei abspeichern.
    Dann python eib-ga.py eureliste.esf aufrufen und im gleich Verzeichnis wird eine objects.xml erzeugt.

    eib-ga.py:
    Code:
    #!/usr/bin/python
    import MySQLdb
    import codecs
    import sys
    
    if len(sys.argv) != 2:
        print "Usage:", sys.argv[0], "LIST.ESF"
        sys.exit(1)
    
    f = open(sys.argv[1], 'r')
    print "Parsing", f.readline()
    
    try:
        conn = MySQLdb.connect (host = "kelvin", user = "", passwd = "", db = "klapauzius")
        cursor = conn.cursor ()
        conn.set_character_set('utf8')
        cursor.execute('SET NAMES utf8;')
        cursor.execute('SET CHARACTER SET utf8;')
        cursor.execute('SET character_set_connection=utf8;')
        cursor.execute('TRUNCATE `Hauptgruppen`;')
        cursor.execute('TRUNCATE `Mittelgruppen`;')
        cursor.execute('TRUNCATE `Untergruppen`;')
    
    except:
            conn = None
    
    hauptgruppen = {}
    mittelgruppen = {}
    
    datentypen = {
    "EIS 1 'Switching' (1 Bit)": (1, "1.001", "switching (on/off)"),
    "EIS 2 'Dimming - control' (4 Bit)": (2, "3.007", "dimming"),
    #"Uncertain (1 Byte)": (14, "6.xxx", "8bit signed integer"),
    "Uncertain (1 Byte)": (14, "5.001", "8 bit signed / scaling 0 to 100%"),
    #"Uncertain (2 Byte)": (10, "7.xxx", "16bit unsigned integer"),
    "Uncertain (2 Byte)": (10, "9.xxx", "16 bit float"),
    "Uncertain (3 Byte)": (3, "10.001", "time"),
    "EIS 15 'Character String' (14 Byte)": (15, "16.000", "string (max 14 ASCII char)")
    }
    
    objectsfile = codecs.open('objects.xml','w',"utf-8")
    objectsfile.write("<objects>\n")
    for line in f.readlines():
        esfline = line[:-2]
        cols = esfline.decode("iso-8859-15").split('\t')
        (hauptgruppe_name, mittelgruppe_name, adresse) = cols[0].split('.',3)
        adresse = adresse.split('/',3)
        hauptgruppe_nummer = int(adresse[0])
        mittelgruppe_nummer = int(adresse[1])
        untergruppe_nummer = int(adresse[2])
        untergruppe_name = cols[1]
        if datentypen.has_key(cols[2]):
            datentyp_nummer = datentypen[cols[2]][0]
            datentyp_knx = datentypen[cols[2]][1]
        else:
            datentyp_nummer = 0
            datentyp_knx = ""
        if conn:
            if not hauptgruppen.has_key(hauptgruppe_nummer):
                hauptgruppen[hauptgruppe_nummer] = hauptgruppe_name
                query = "INSERT INTO `Hauptgruppen` (Hauptgruppe, Name) VALUES (%i, \"%s\")" % (hauptgruppe_nummer, hauptgruppe_name)
                print query
                cursor.execute(query)
            if not mittelgruppen.has_key(hauptgruppe_nummer):
                mittelgruppen[hauptgruppe_nummer] = {}
            if not mittelgruppen[hauptgruppe_nummer].has_key(mittelgruppe_nummer):
                mittelgruppen[hauptgruppe_nummer][mittelgruppe_nummer] = mittelgruppe_name
                query = "INSERT INTO `Mittelgruppen` (id, Hauptgruppe, Mittelgruppe, Name) VALUES (NULL, %i, %i, \"%s\")" % (hauptgruppe_nummer, mittelgruppe_nummer, mittelgruppe_name)
                print query
                cursor.execute(query)
            query = "INSERT INTO `Untergruppen` (id, Hauptgruppe, Mittelgruppe, Untergruppe, Name, Datentyp) VALUES (NULL, %i, %i, %i, \"%s\", %i)" % (hauptgruppe_nummer, mittelgruppe_nummer, untergruppe_nummer, untergruppe_name, datentyp_nummer)
            print query
            cursor.execute(query)
        if cols[4]:
            listeners = cols[4].split(' ')
        else:
            listeners = []
        listener_tags = ""
        for gad in listeners:
            listener_tags += """<listener gad="%s"/>""" % gad
        id = (hauptgruppe_name + '.' + mittelgruppe_name + '.' + untergruppe_name).lower().replace(' ', '_')
        xmlline = """<object type="%s" id="%s" gad="%i/%i/%i" init="persist" log="true">%s%s</object>""" % (datentyp_knx, id, hauptgruppe_nummer, mittelgruppe_nummer, untergruppe_nummer, untergruppe_name, listener_tags)
        print xmlline
        objectsfile.write('\t'+xmlline+'\n')
    
    if conn:
        conn.commit()
        cursor.close ()
        conn.close ()
    
    objectsfile.write("</objects>")
    objectsfile.close()
    f.close()

    #2
    Hoi Andy

    Danke und ich bin am ausprobieren.
    Grüsse Bodo
    Fragen gehören ins Forum, und nicht in mein Postfach;
    EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

    Kommentar


      #3
      Cool. Da mein Server nach dem letzten Ubuntu Update sowieso gerade wieder neu aufzusetzen ist werde ich dein Skript gleich mal ausprobieren können. Klingt auf jeden Fall sehr gut! Danke fürs bereitstellen!
      Ich find es richtig gut, dass die Gemeinde der linknx Nutzer stetig zu steigen scheint.

      Kommentar


        #4
        Frage: Welcher Lizenz unterliegt das Script? Frage zwecks evtl. Weiterverteilung/verwendung..

        Tipp am Rande: wenn Du das CSV aus dem Export-Tool von mir nimmst, gibts (sofern DPT in der ETS manuell mind. 1x zugewiesen) auch die richtigen DPT's statt "uncertain (x byte)"


        Makki
        EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
        -> Bitte KEINE PNs!

        Kommentar


          #5
          Äh ich hab zwar keinen GPL-Header dabei, aber denkt ihn euch dazu

          Kommentar


            #6
            Ok, dann füge ich den ein und lege es wenn ich es das nächste mal anfasse mit ins linknx*.deb Ist ja praktisch sowas..

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar

            Lädt...
            X