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:
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()
Kommentar