Ich habs
Vorwort: Habe eine Alpha Innotec KHZ LW 80 mit der Luxtronik 2 Version 1.6.1, bei mir sinds 183 Werte die ankommen.
Habe heute ein Python Skript von opendta angepasst, das einige Stati der WP abholt und per TCP Request an den Gira HomeServer 3 schickt. Es ist nicht gerade elegant, aber es funktioniert.
Das Skript liegt auf meinem HomeServer3, der ja sowieso 24/7 läuft und wird per Cronjob minütlich gestartet. Ihr braucht dafür nur:
*optional
Schritt 1
Im Experten gibt es dazu die Maske Kommunikation -> IP/EIB Telegramme (Empfang) Dort musst Du für jeden Wert, den Du empfangen willst, ein "einfaches Telegramm" anlegen:
TCP
Port beginnend ab 1337 (für das zweite Telegramm/Wert 1338 usw.)
Absender: 127.0.0.1 (localhost in meinem Fall, ggf anpassen)
Subnetz: 255.255.255.0 (ggf. anpassen)
Tab Empfangen:
Neuen Datenblock anlegen: Wert als Klartext
Gruppenadresse auf die gesendet werden soll auswählen, fertig
(Schritt für folgende Tabelle wiederholen)
Liste der Werte/einfachen Telegramme:
1337 WP Aussentemperatur
1338 WP Vorlauftemperatur
1339 WP Rücklautemperatur
1340 WP Rücklauf Soll
1341 WP WQ Eingangstemp
1342 WP WA Ausgangstemp
1343 WP Betriebszeit Verdichter 1 durchschnittlich
1344 WP Impulse VD1
1345 WP Betriebsstunden WP
1346 WP Betriebsstunden Heizung
1347 WP WMZ Heizung in kWh
1348 WP WMZ Warmwasser in kWh
1349 WP Betriebsstunden ZWE (Heizstab)
1350 WP Betriebsstunden WW Erzeugung
1351 WP Status Zeile 1 (code)
1352 WP Status Zeile 2 (code)
1353 WP Status Zeile 3 (code) [hier steht der text aus dem display der WP]
1354 WP Status seit
1355 WP WMZ Durchfluss l/h
1356 WP JAZ (dummywert ist immer 999 aktuell, hatte keine Lust das zu berechnen ^^)
1357 Status Heizbetrieb 0/1 [habe hier "Status Zeile3" ausgewertet]
1358 Status WW Bereitung 0/1 [habe hier "Status Zeile3" ausgewertet]
Schritt 2
Skript auf einen Server packen, wo Python installiert ist.
fett = müsst ihr anpassen
fettkursiv = Das ist das array, in das ihr die werte packt, die ihr auf den bus senden wollt. Erster Wert wird auf Port 1337 des HS geschickt. Zweiter Wert auf Port 1338, usw. An dieser Stelle könnt ihr werte hinzufügen. Nicht vergessen die variable endPortHS ganz oben anzupassen wenn ihr werte hinzufügt!
Schritt 3
Skript ausführen
(evtl. Pfad zur Datei anpassen)
Es müsste sowas wie hier ausgegeben werden:
Dort seht ihr, was gesendet wurde. Bevor ihr das Skript ausführt, muss Schritt 1 abgeschlossen sein und das Projekt auf den HS übertragen sein, denn sonst lauscht der gute HS nicht auf den Ports, die ihr festgelegt habt.
Schritt 4
Nun können wir das Ganze minütlich vom Server ausführen lassen
Ich bevorzuge nano aber ihr könnt natürlich auch vi verwenden.
Mein crontab sieht so aus:
Die fett gedruckte Zeile ganz unten hinzufügen. Pfad ggf. ändern.
Viel Spaß, ich hoffe ihr könnt euch damit ein paar Stunden Arbeit sparen
Vorwort: Habe eine Alpha Innotec KHZ LW 80 mit der Luxtronik 2 Version 1.6.1, bei mir sinds 183 Werte die ankommen.
Habe heute ein Python Skript von opendta angepasst, das einige Stati der WP abholt und per TCP Request an den Gira HomeServer 3 schickt. Es ist nicht gerade elegant, aber es funktioniert.

Das Skript liegt auf meinem HomeServer3, der ja sowieso 24/7 läuft und wird per Cronjob minütlich gestartet. Ihr braucht dafür nur:
- einen Homeserver3 (oder einen Server mit beliebigem Unix drauf, zB NAS)
- einen Server wo Python/ Crontab* installiert ist (alternativ auf dem hs3 laufen lassen)
*optional
Schritt 1
Im Experten gibt es dazu die Maske Kommunikation -> IP/EIB Telegramme (Empfang) Dort musst Du für jeden Wert, den Du empfangen willst, ein "einfaches Telegramm" anlegen:
TCP
Port beginnend ab 1337 (für das zweite Telegramm/Wert 1338 usw.)
Absender: 127.0.0.1 (localhost in meinem Fall, ggf anpassen)
Subnetz: 255.255.255.0 (ggf. anpassen)
Tab Empfangen:
Neuen Datenblock anlegen: Wert als Klartext
Gruppenadresse auf die gesendet werden soll auswählen, fertig
(Schritt für folgende Tabelle wiederholen)
Liste der Werte/einfachen Telegramme:
1337 WP Aussentemperatur
1338 WP Vorlauftemperatur
1339 WP Rücklautemperatur
1340 WP Rücklauf Soll
1341 WP WQ Eingangstemp
1342 WP WA Ausgangstemp
1343 WP Betriebszeit Verdichter 1 durchschnittlich
1344 WP Impulse VD1
1345 WP Betriebsstunden WP
1346 WP Betriebsstunden Heizung
1347 WP WMZ Heizung in kWh
1348 WP WMZ Warmwasser in kWh
1349 WP Betriebsstunden ZWE (Heizstab)
1350 WP Betriebsstunden WW Erzeugung
1351 WP Status Zeile 1 (code)
1352 WP Status Zeile 2 (code)
1353 WP Status Zeile 3 (code) [hier steht der text aus dem display der WP]
1354 WP Status seit
1355 WP WMZ Durchfluss l/h
1356 WP JAZ (dummywert ist immer 999 aktuell, hatte keine Lust das zu berechnen ^^)
1357 Status Heizbetrieb 0/1 [habe hier "Status Zeile3" ausgewertet]
1358 Status WW Bereitung 0/1 [habe hier "Status Zeile3" ausgewertet]
Schritt 2
Skript auf einen Server packen, wo Python installiert ist.
Code:
#!/usr/bin/env python #--------------------------------------------------------------------------- # Copyright (C) 2011 opendta@gmx.de # # Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen # der GNU General Public License, wie von der Free Software Foundation # veroeffentlicht, weitergeben und/oder modifizieren, entweder gemaess # Version 3 der Lizenz oder (nach Ihrer Option) jeder spaeteren Version. # # Die Veroeffentlichung dieses Programms erfolgt in der Hoffnung, dass es # Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die # implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FUER EINEN # BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. # # Sie sollten ein Exemplar der GNU General Public License zusammen mit # diesem Programm erhalten haben. Falls nicht, # siehe <http://www.gnu.org/licenses/>. #---------------------------------------------------------------------------#/ import socket import struct import datetime ##################### # ip der luxtronik hostHeatpump = '[B]192.168.xx.xx[/B]' # port der luxtronik standard 8888 portHeatpump = [B]8888[/B] # ip des gira hs3 hostHS = '[B]127.0.0.1[/B]' # startport ip telegramm empfangen (experte->kommunikation->ip/eib telegramm empfangen) je wert ein port beginnend bei.. startPortHS = 1337 endPortHS = [B]1358[/B] ##################### s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) print 'connect to heatpump...' s.connect( (hostHeatpump, portHeatpump)) ###################################################### s.send( struct.pack( '!i', 3004)) s.send( struct.pack( '!i', 0)) if struct.unpack( '!i', s.recv(4))[0] != 3004: print 'Error: REQ_CALCULATED CMD' exit() stat = struct.unpack( '!i', s.recv(4))[0] len = struct.unpack( '!i', s.recv(4))[0] array_calculated = [] for i in xrange(len): array_calculated.append(struct.unpack( '!i', s.recv(4))[0]) print 'Calculated' print stat print len #print array_calculated #print '\n\n' print 'connect to knx...' # determine states state_heating = 0 state_water = 0 state_heating = (array_calculated[119] == 0 or array_calculated[119] == 6 or array_calculated[119] == 7 or array_calculated[119] == 12 or array_calculated[119] == 13 or array_calculated[119] == 16 or array_calculated[119] == 17) state_water = (array_calculated[119] == 5 or array_calculated[119] == 9 or array_calculated[119] == 14) array_values2send = [] # replace states if array_calculated[119] == 0: array_calculated[119] = 'Heizbetrieb' if array_calculated[119] == 1: array_calculated[119] = 'keine Anforderung' if array_calculated[119] == 2: array_calculated[119] = 'Netz- Einschaltverzoegerung' if array_calculated[119] == 3: array_calculated[119] = 'SSP Zeit' if array_calculated[119] == 4: array_calculated[119] = 'Sperrzeit' if array_calculated[119] == 5: array_calculated[119] = 'Brauchwasser' if array_calculated[119] == 6: array_calculated[119] = 'Estrich Programm' if array_calculated[119] == 7: array_calculated[119] = 'Abtauen' if array_calculated[119] == 8: array_calculated[119] = 'Pumpenvorlauf' if array_calculated[119] == 9: array_calculated[119] = 'Thermische Desinfektion' if array_calculated[119] == 10: array_calculated[119] = 'Kuehlbetrieb' if array_calculated[119] == 11: array_calculated[119] = '???' if array_calculated[119] == 12: array_calculated[119] = 'Schwimmbad' if array_calculated[119] == 13: array_calculated[119] = 'Heizen Ext.' if array_calculated[119] == 14: array_calculated[119] = 'Brauchwasser Ext.' if array_calculated[119] == 15: array_calculated[119] = '???' if array_calculated[119] == 16: array_calculated[119] = 'Durchflussueberwachung' if array_calculated[119] == 17: array_calculated[119] = 'ZWE Betrieb' array_values2send.append(str(float(array_calculated[15])/10)) array_values2send.append(str(float(array_calculated[10])/10)) array_values2send.append(str(float(array_calculated[11])/10)) array_values2send.append(str(float(array_calculated[12])/10)) array_values2send.append(str(float(array_calculated[19])/10)) array_values2send.append(str(float(array_calculated[20])/10)) array_values2send.append(str(datetime.timedelta(seconds=int(array_calculated[56])))) array_values2send.append(str(array_calculated[57])) array_values2send.append(str(datetime.timedelta(seconds=int(array_calculated[63])))) array_values2send.append(str(datetime.timedelta(seconds=int(array_calculated[64])))) array_values2send.append(str(float(array_calculated[151])/10)) array_values2send.append(str(float(array_calculated[152])/10)) array_values2send.append(str(datetime.timedelta(seconds=int(array_calculated[60])))) array_values2send.append(str(datetime.timedelta(seconds=int(array_calculated[65])))) array_values2send.append(str(array_calculated[117])) array_values2send.append(str(array_calculated[118])) array_values2send.append(str(array_calculated[119])) array_values2send.append(str(datetime.timedelta(seconds=int(array_calculated[120])))) array_values2send.append(str(float(array_calculated[155]))) array_values2send.append(str(999)) #jaz noch berechnen array_values2send.append(str(int(state_heating))) array_values2send.append(str(int(state_water))) [I][B]# add more values to send here # array_values2send.append(str(int(123456)))[/B][/I] j=0 while j <= (endPortHS - startPortHS): sKnx = socket.socket( socket.AF_INET, socket.SOCK_STREAM) sKnx.connect( (hostHS, startPortHS+j) ) print 'sent ', j, '=' print array_values2send[j] print '\n' sKnx.close() j=j+1 s.close()
fettkursiv = Das ist das array, in das ihr die werte packt, die ihr auf den bus senden wollt. Erster Wert wird auf Port 1337 des HS geschickt. Zweiter Wert auf Port 1338, usw. An dieser Stelle könnt ihr werte hinzufügen. Nicht vergessen die variable endPortHS ganz oben anzupassen wenn ihr werte hinzufügt!
Schritt 3
Skript ausführen
Code:
/usr/bin/python /[B]root/heatpump.py[/B]
Es müsste sowas wie hier ausgegeben werden:
Code:
[root@localhost ~]# /usr/bin/python /root/heatpump.py connect to heatpump... Calculated 0 183 connect to knx... sent 0 = 5.5 sent 1 = 21.6 sent 2 = 21.5 sent 3 = 23.0 sent 4 = 8.4 sent 5 = 7.6 sent 6 = 61 days, 15:05:42 sent 7 = 265 sent 8 = 61 days, 15:05:42 sent 9 = 59 days, 15:26:14 sent 10 = 11524.6 sent 11 = 351.2 sent 12 = 6 days, 18:23:05 sent 13 = 1 day, 22:12:48 sent 14 = 1 sent 15 = 0 sent 16 = keine Anforderung sent 17 = 3:47:24 sent 18 = 1333.0 sent 19 = 999 sent 20 = 0 sent 21 = 0
Schritt 4
Nun können wir das Ganze minütlich vom Server ausführen lassen
Code:
nano /etc/crontab
Mein crontab sieht so aus:
Code:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly [B]*/1 * * * * root /usr/bin/python /root/heatpump.py[/B]
Viel Spaß, ich hoffe ihr könnt euch damit ein paar Stunden Arbeit sparen

Kommentar