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