Dieser Artikel beschreibt, wie eine Luxtronik der Hardwareversion 1 in openHAB eingebunden werden kann. Die benötigten Skripte werden als tar-File im Anhang bereitgestellt und stehen zum Download zur Verfügung. Konfigurationinformationen können per Copy & Paste übernommen werden. Die Benutzung erfolgt auf eigene Verantwortung. Für entstehende Schäden wird keine Haftung übernommen. Bei Rückfragen bitte ich darum, diese im openHAB-Unterforum des KNX-User-Forums zu stellen.

 

Voraussetzung Wärmepumpe:

  • Hardwarevoraussetzung: Luxtronik 1 Hardware 
  • Softwarevoraussetzung: Luxtronik V2.40 (getestet) - funktioniert vermutlich bereits ab 2.32

Voraussetzung openHAB-Serversystem:

  • PC-Hardware mit serieller Schnittstellenverbindung zur Luxtronik.
  • Betriebssystem Linux
  • Perl5 mit den Perlmodulen "Device::SerialPort" und "REST::Client"
  • openHAB mit installiertem exec-Binding

Benötigte Software (s. Anhang):

  • Luxtronik.pm - Perlmodul, das eine objektorientierte API zur Luxtronik zur Verfügung stellt
  • luxtronik.pl - Testskript zum Prüfen, ob Kommunikation mit der Luxtronik-Hardware funktioniert
  • luxtronik2openhab.pl - Perlskript, das die Daten aus der Luxtronik ausliest und per REST-API an die zugehörigen openHAB-Items übergibt
  • lux4openhab.pl - Perlskript zum Setzen von Betriebszuständen von Heizung und Brauchwasserbereitung sowie der Parallelverschiebung der Heizkurve

Benötigte openHAB-Konfigurationselemente:

  • waermepumpe.items - enthält alle openHAB-Items, die die entsprechenden Luxtronikparameter repräsentieren
  • sitemap-snippet - enthält eine Beispielsyntax der Sitemap zur Darstellung im Frontend
  • waermepumpe.rules  - enthält Cron-Rules, die regelmäßig luxtronik2openhab.pl aufrufen und somit die Luxtronik-Items in openHAB aktualisieren
  • Zusätzliche Icons - siehe Anhang

 

Funktionsweise

Per OpenHAB-Rule wird minütlich das Perlskript luxtronik2openhab.pl aufgerufen. Dieses Skript liest die aktuellen Messdaten und Statusinformationen von der Luxtronik aus und übergibt sie per REST-API an die zugehörigen openHAB-Items. Die Werte werden im Frontend (Classic-UI, Habdroid) dargestellt.

Außerdem können aus dem Frontend heraus die wichtigsten Funktionen wie Betriebszustand von Heizung und Warmwasser und die Parallelverschiebung der Heizkurve abgeändert werden. openHAB ruft hierzu das Skript lux4openhab.pl auf, welches die gewünschten Änderungen an die Luxtronik übermittelt.

 

Installation

Bitte beachten: Alles Skripte müssen von dem openHAB-User ausführbar sein. Ggf. Ownership abändern.

Es wird empfohlen, dieselben Pfade wie in diesem Beispiel zu verwenden. Werden andere Pfade verwendet, muss auf jedem Fall die Variable $basepath in den jeweiligen Skripten an die Gegebenheiten angepasset werden.

my $basepath = "/usr/local/luxtronik";

Per default verwenden alle Skripte das serielle Device "/dev/ttyS0". In Abhängigkeit von der physikalischen Hardware muss das gegebenenfalls angepasst werden. Hierzu folgende Zeile abändern:

$luxtronik = Luxtronik->new();

auf

Luxtronik->new(serialport => '/dev/ttyUSB0');

in luxtronik.pl und luxtronik2openhab.pl bzw. auf

$luxtronik = Luxtronik->new(request_retries => 20, serialport => '/dev/ttyUSB0');

in lux4openhab.pl

 

Pfad für die Skripte anlegen und die Perl-Dateien dort ablegen:

mkdir -p /usr/local/luxtronik
cd /usr/local/luxtronik
tar xzvf openhab_luxtronik.tar.gz

Testen ob Kommunikation mit der Luxtronik funktioniert:

su - <openhabuser>
cd /usr/local/luxtronik
./luxtronik.pl

Werden hier keine sinnvollen Werte ausgegeben, bitte nicht mit der Installation fortfahren, sondern erst vorhandene Probleme beheben.

 

Konfiguration von OpenHAB

Die wichtigste Datei waermepumpe.items (Achtung: kein Umlaut) im Verzeichnis $OPENHAB_PATH/configurations/items anlegen ($OPENHAB_PATH steht für den Pfad zur OpenHAB-Installation). Wer die Gruppendefinitionnen im Kopf der Datei lieber in einer separaten Datei (z.B. group.items) hätte, kann diese natürlich gerne auslagern.

waermepumpe.items:

Group Waermepumpe       (All)
Group WPTemperaturen    "Temperaturen"          <temperature>   (Waermepumpe)
Group WPEingaenge       "Eingänge"              <sani_earth_source_heat_pump>   (Waermepumpe)
Group WPAusgaenge       "Ausgänge"              <sani_earth_source_heat_pump>   (Waermepumpe)
Group WPAblaufzeiten    "Ablaufzeiten"          <clock> (Waermepumpe)
Group WPBetriebsstunden "Betriebsstunden"       <clock> (Waermepumpe)
Group WPAnlagenstatus   "Anlagenstatus"         <sani_earth_source_heat_pump>   (Waermepumpe)
Group WPFehlerspeicher  "Fehlerspeicher"        <pie>   (Waermepumpe)
Group WPAbschaltungen   "Abschaltungen"         <pie>   (Waermepumpe)

String Waermepumpenstatus       "Wärmepumpe [%s]"       <smiley_transp>        (Waermepumpe)

String WPBetriebsartHeizung          "WP Heizungsmodus"      <sani_heating>  (Waermepumpe)           { exec=">[automatik:/usr/local/luxtronik/lux4openhab.pl heizung automatik] >[zwe:/usr/local/luxtronik/lux4openhab.pl heizung zwe] >[party:/usr/local/luxtronik/lux4openhab.pl heizung party] >[aus:/usr/local/luxtronik/lux4openhab.pl heizung aus]" }

String WPBetriebsartWarmwasser        "WP Warmwassermodus"    <sani_water_hot>        (Waermepumpe)           { exec=">[automatik:/usr/local/luxtronik/lux4openhab.pl warmwasser automatik] >[zwe:/usr/local/luxtronik/lux4openhab.pl warmwasser zwe] >[party:/usr/local/luxtronik/lux4openhab.pl warmwasser party] >[aus:/usr/local/luxtronik/lux4openhab.pl warmwasser aus]" }

String WPHeizkurvenabweichung   "WP Heizkurvenabweichung"       <heizkurvenversch>      (Waermepumpe)   { exec=">[50:/usr/local/luxtronik/lux4openhab.pl heizkurve 50] >[45:/usr/local/luxtronik/lux4openhab.pl heizkurve 45] >[40:/usr/local/luxtronik/lux4openhab.pl heizkurve 40] >[35:/usr/local/luxtronik/lux4openhab.pl heizkurve 35] >[30:/usr/local/luxtronik/lux4openhab.pl heizkurve 30] >[25:/usr/local/luxtronik/lux4openhab.pl heizkurve 25] >[20:/usr/local/luxtronik/lux4openhab.pl heizkurve 20] >[15:/usr/local/luxtronik/lux4openhab.pl heizkurve 15] >[10:/usr/local/luxtronik/lux4openhab.pl heizkurve 10] >[5:/usr/local/luxtronik/lux4openhab.pl heizkurve 5] >[0:/usr/local/luxtronik/lux4openhab.pl heizkurve 0]  >[minus5:/usr/local/luxtronik/lux4openhab.pl heizkurve -5] >[minus10:/usr/local/luxtronik/lux4openhab.pl heizkurve -10] >[minus15:/usr/local/luxtronik/lux4openhab.pl heizkurve -15] >[minus20:/usr/local/luxtronik/lux4openhab.pl heizkurve -20] >[minus25:/usr/local/luxtronik/lux4openhab.pl heizkurve -25] >[minus30:/usr/local/luxtronik/lux4openhab.pl heizkurve -30] >[minus35:/usr/local/luxtronik/lux4openhab.pl heizkurve -35] >[minus40:/usr/local/luxtronik/lux4openhab.pl heizkurve -40] >[minus45:/usr/local/luxtronik/lux4openhab.pl heizkurve -45] >[minus50:/usr/local/luxtronik/lux4openhab.pl heizkurve -50] <[/usr/local/luxtronik/lux4openhab.pl heizkurve:300000:REGEX((.*?))]" }

String WPInfoTime                               "Aktualisierung in Epochensekunden [%s]"        <clock>         (Waermepumpe)
String WPInfoUhrzeit                            "Aktualisierung [%s]"   <clock>         (Waermepumpe)

Number WPTemperaturAussen                       "Außentemperatur [%.1f °C]"             <temperature>   (WPTemperaturen)
Number WPTemperaturVorlauf                      "Vorlauf [%.1f °C]"                     <temperature>   (WPTemperaturen)
Number WPTemperaturRuecklauf                    "Rücklauf [%.1f °C]"                    <temperature>   (WPTemperaturen)
Number WPTemperaturRuecklaufSoll                "Rücklauf Soll [%.1f °C]"               <temperature>   (WPTemperaturen)
Number WPTemperaturBrauchwasserIst              "Brauchwasser Ist [%.1f °C]"            <temperature>   (WPTemperaturen)
Number WPTemperaturBrauchwasserSoll             "Brauchwasser Soll [%.1f °C]"           <temperature>   (WPTemperaturen)
Number WPTemperaturWaermequelleEin              "Wärmequelleneingang [%.1f °C]"         <temperature>   (WPTemperaturen)
Number WPTemperaturHeissgas                     "Heissgas [%.1f °C]"                    <temperature>   (WPTemperaturen)
Number WPTemperaturKaeltekreis                  "Kältekreis [%.1f °C]"                  <temperature>   (WPTemperaturen)
Number WPTemperaturMischkreis1Vorlauf           "Mischkreis 1 Vorlauf [%.1f °C]"        <temperature>   (WPTemperaturen)
Number WPTemperaturMischkreis1VorlaufSoll       "Mischkreis 1 Vorl. Soll [%.1f °C]"     <temperature>   (WPTemperaturen)
Number WPTemperaturRaumstation                  "Raumstation [%.1f °C]"                 <temperature>   (WPTemperaturen)

String WPEingangASD                             "Eingang ASD [%s]"      <sani_earth_source_heat_pump>   (WPEingaenge)
String WPEingangEVU                             "Eingang EVU [%s]"      <sani_earth_source_heat_pump>   (WPEingaenge)
String WPEingangHD                              "Eingang HD [%s]"       <sani_earth_source_heat_pump>   (WPEingaenge)
String WPEingangMOT                             "Eingang MOT [%s]"      <sani_earth_source_heat_pump>   (WPEingaenge)
String WPEingangND                              "Eingang ND [%s]"       <sani_earth_source_heat_pump>   (WPEingaenge)
String WPEingangPEX                             "Eingang PEX [%s]"      <sani_earth_source_heat_pump>   (WPEingaenge)

Number WPAusgangAbtauventil                     "Abtauventil [%s]"              <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangBUP                             "Brauchwasserumwälzpumpe [%s]"  <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangFUP1                            "Fußbodenheizungsumwälzp [%s]"  <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangHUP                             "Heizungsumwälzpumpe [%s]"      <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangAusgangMischer1Auf              "Mischer 1 auf [%s]"            <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangAusgangMischer1Zu               "Mischer 1 zu  [%s]"            <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangVentilation                     "Ventilation [%s]"              <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangVentilBOSUP                     "Ventil BOSUP [%s]"             <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangVerdichter1                     "Verdichter 1 [%s]"             <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangVerdichter2                     "Verdichter 2 [%s]"             <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangZUPZIP                          "ZUP-ZIP [%s]"                  <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangZWE1                            "Zweitwärmeerzeuger [%s]"       <sani_earth_source_heat_pump>   (WPAusgaenge)
Number WPAusgangZWE2SST                         "ZWE 2 SST [%s]"                <sani_earth_source_heat_pump>   (WPAusgaenge)

String WPAblaufzeitWPSeit                       "Wärmepumpe seit [%s]"          <clock>   (WPAblaufzeiten)
String WPAblaufzeitZWE1Seit                     "ZWE 1 seit [%s]"               <clock>   (WPAblaufzeiten)
String WPAblaufzeitZWE2Seit                     "ZWE 2 seit [%s]"               <clock>   (WPAblaufzeiten)
String WPAblaufzeitNetzeinschv                  "Netzeinschaltverzögerung [%s]" <clock>   (WPAblaufzeiten)
String WPAblaufzeitSSPZeitStandzeit             "Schaltspielsp. Standzeit [%s]" <clock>   (WPAblaufzeiten)
String WPAblaufzeitSSPZeitEinschverz            "Schaltspielsp. Einschver [%s]" <clock>   (WPAblaufzeiten)
String WPAblaufzeitVDStand                      "VD Stand [%s]"                 <clock>   (WPAblaufzeiten)
String WPAblaufzeitHRMZeit                      "HRM Zeit [%s]"                 <clock>   (WPAblaufzeiten)
String WPAblaufzeitHRWZeit                      "HRW Zeit [%s]"                 <clock>   (WPAblaufzeiten)
String WPAblaufzeitTDIZeit                      "TDI Zeit [%s]"                 <clock>   (WPAblaufzeiten)
String WPAblaufzeitSperreTDI                    "Sperre TDI [%s]"               <clock>   (WPAblaufzeiten)

String WPBetriebsstundenVD1                     "Verdichter 1 [%s]"             <clock> (WPBetriebsstunden)
String WPBetriebsstundenVD1Imp                  "Verdichter 1 Impulse [%s]"     <clock> (WPBetriebsstunden)
String WPBetriebsstundenVD1DEZ                  "Verdichter 1 DEZ [%s]"         <clock> (WPBetriebsstunden)
String WPBetriebsstundenVD2                     "Verdichter 2 [%s]"             <clock> (WPBetriebsstunden)
String WPBetriebsstundenVD2Imp                  "Verdichter  2 Impulse [%s]"    <clock> (WPBetriebsstunden)
String WPBetriebsstundenVD2DEZ                  "Verdichter  2 DEZ [%s]"        <clock> (WPBetriebsstunden)
String WPBetriebsstundenZWE1                    "Zweitwärmeerz. 1 [%s]"         <clock> (WPBetriebsstunden)
String WPBetriebsstundenZWE2                    "Zweitwärmeerz. 2 [%s]"         <clock> (WPBetriebsstunden)
String WPBetriebsstundenWP                      "Wärmepumpe [%s]"               <clock> (WPBetriebsstunden)

String WPBetriebssekundenVD1                    "Verdichter 1 Sek. [%s]"                <clock> (WPBetriebsstunden)
String WPBetriebssekundenVD1DEZ                 "Verdichter 1 DEZ Sek. [%s]"    <clock> (WPBetriebsstunden)
String WPBetriebssekundenVD2                    "Verdichter 2 Sek. [%s]"                <clock> (WPBetriebsstunden)
String WPBetriebssekundenVD2DEZ                 "Verdichter  2 DEZ Sek. [%s]"   <clock> (WPBetriebsstunden)
String WPBetriebssekundenZWE1                   "Zweitwärmeerz. 1 Sek. [%s]"    <clock> (WPBetriebsstunden)
String WPBetriebssekundenZWE2                   "Zweitwärmeerz. 2 Sek.  [%s]"   <clock> (WPBetriebsstunden)
String WPBetriebssekundenWP                     "Wärmepumpe Sek. [%s]"          <clock> (WPBetriebsstunden)

String WPAnlagenstatusWPTyp                     "Wärmepumpentyp [%s]"           <sani_earth_source_heat_pump>   (WPAnlagenstatus)
String WPAnlagenstatusSWStand                   "Softwarestand [%s]"            <sani_earth_source_heat_pump>   (WPAnlagenstatus)
String WPAnlagenstatusBivStufe                  "Bivalenzstufe [%s]"            <sani_earth_source_heat_pump>   (WPAnlagenstatus)
Number WPAnlagenstatusBetriebszustand           "Betriebszustand [%s]"          <sani_earth_source_heat_pump>   (WPAnlagenstatus)
String WPAnlagenstatusBetriebszustandText       "Betriebszustand Text [%s]"     <sani_earth_source_heat_pump>   (WPAnlagenstatus)
String WPAnlagenstatusEinschaltzeitpunkt        "Einschaltzeitp. [%s]"          <sani_earth_source_heat_pump>   (WPAnlagenstatus)
String WPAnlagenstatusCompact                   "Compact [%s]"                  <sani_earth_source_heat_pump>   (WPAnlagenstatus)
String WPAnlagenstatusComfort                   "Comfort [%s]"                  <sani_earth_source_heat_pump>   (WPAnlagenstatus)


String WPFehlerspeicher0        "Speicher 0 [%s]"       <pie>   (WPFehlerspeicher)
String WPFehlerspeicher1        "Speicher 1 [%s]"       <pie>   (WPFehlerspeicher)
String WPFehlerspeicher2        "Speicher 2 [%s]"       <pie>   (WPFehlerspeicher)
String WPFehlerspeicher3        "Speicher 3 [%s]"       <pie>   (WPFehlerspeicher)
String WPFehlerspeicher4        "Speicher 4 [%s]"       <pie>   (WPFehlerspeicher)

String WPAbschaltung0           "Abschaltung 0 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltung1           "Abschaltung 1 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltung2           "Abschaltung 2 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltung3           "Abschaltung 3 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltung4           "Abschaltung 4 [%s]"            <pie>   (WPAbschaltungen)

String WPAbschaltungText0       "Abschaltung 0 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltungText1       "Abschaltung 1 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltungText2       "Abschaltung 2 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltungText3       "Abschaltung 3 [%s]"            <pie>   (WPAbschaltungen)
String WPAbschaltungText4       "Abschaltung 4 [%s]"            <pie>   (WPAbschaltungen)

 

Für die Darstellung im Front-End benötigen wir als Nächstes ein paar Definitionen in der Sitemap ($OPENHAB_PATH/configurations/sitemaps/<yourname>.sitemap):

Text label="Wärmepumpe" icon="sani_earth_source_heat_pump" {
        Text item=WPInfoUhrzeit      label="Akt. [%s]"
        Text item=Waermepumpenstatus      label="Status [%s]"
        Selection item=WPBetriebsartHeizung     label="Heizung"    mappings=[automatik=Automatik, zwe=ZWE, party=Party, aus=Aus]
        Selection item=WPBetriebsartWarmwasser  label="Warmwasser" mappings=[automatik=Automatik, zwe=ZWE, party=Party, aus=Aus]
        Selection item=WPHeizkurvenabweichung  label="Heizkurvenabweichung" mappings=[50='5°C', 45='4,5°C', 40='4°C', 35='3,5°C', 30='3°C', 25='2,5°C', 20='2°C', 15='1,5°C', 10='1°C', 5='0,5°C', 0='0°C', minus5='-0,5°C',  minus10='-1°C',  minus15='-1,5°C',  minus20='-2°C',  minus25='-2,5°C',  minus30='-3°C',  minus35='-3,5°C',  minus40='-4°C',  minus45='-4,5°C',  minus50='-5°C' ]
        Group item=WPTemperaturen
        Group item=WPEingaenge
        Group item=WPAusgaenge
        Group item=WPAblaufzeiten
        Group item=WPBetriebsstunden
        Group item=WPAnlagenstatus
        Group item=WPFehlerspeicher
        Group item=WPAbschaltungen
}

 Im Anschluss noch die Icons im entsprechenden images-Ordner bereitstellen:

cp icons.tar.gz $OPENHAB_PATH/webapps/images
cd $OPENHAB_PATH/webapps/images
tar xzvf icons.tar.gz

Durch Ausführen von luxtronik2openhab.pl können jetzt die Daten von der Luxtronik nach OpenHAB übernommen und im Frontend angezeigt werden (die Werte werden auch auf der Kommandozeile ausgegeben):

su - <openhabuser>
/usr/local/luxtronik/luxtronik2openhab.pl 

Ausserdem können auch die Betriebsarten für Heizung und Warmwasser sowie die Heizkurvenabweichung (Parallelverschiebung) eingestellt werden.

 

Zuletzt müssen wir nur noch für einen automatischen Update der Items sorgen. Dies erledigen wir mit entsprechenden Cron-Rules in der Datei $OPENHAB_PATH/configurations/rules/waermepumpe.rules.

waermepumpe.rules

rule "Waermepumpenitems aktualisieren"
        when
                Time cron "0 * * * * ?"

        then
                executeCommandLine('/usr/local/luxtronik/luxtronik2openhab.pl')
end

/*
 Der Waermepumpenstatusitem soll erst aktualisiert werden, wenn luxtronik2openhab.pl
gelaufen ist. Wegen Laufzeit von ca. 10 Sek. wurde Ausführung auf Sekunde 30 festgelegt
*/
rule "Waermepumpenstatus aktualisieren"
        when
                Time cron "30 * * * * ?"

        then
                if (WPAnlagenstatusBetriebszustandText.state == 'Heizen' || (WPAnlagenstatusBetriebszustandText.state == 'Warmwasser') {

                        Waermepumpenstatus.postUpdate(WPAnlagenstatusBetriebszustandText.state + ' seit ' + WPAblaufzeitWPSeit.state)

                } else if (WPAnlagenstatusBetriebszustandText.state == 'Bereitschaft' || WPAnlagenstatusBetriebszustandText.state == 'EVU Sperre') {

                        Waermepumpenstatus.postUpdate(WPAnlagenstatusBetriebszustandText.state + ' seit ' + WPAblaufzeitVDStand.state)

                } else {

                        Waermepumpenstatus.postUpdate(WPAnlagenstatusBetriebszustandText.state)

                }
end

Geschafft. Glückwunsch!

Attachments:
Download this file (icons.tar.gz)icons.tar.gz[Icons]8 kB2016-02-21 18:20
Download this file (openhab_luxtronik.tar.gz)openhab_luxtronik.tar.gz[Perl-Skripte]10 kB2016-02-21 18:21

Comments   

0 #1 Matthias 2016-04-07 14:09
Das Tutorial ist echt Spitze und funktioniert super.
Vielen Dank für die Unterstützung und ich würde mich freuen, wenn Du noch die Schnellladung als Betriebszustand einbauen kannst. :-)
Quote
0 #2 Ronny 2016-11-30 19:59
Das Tutorial is sehr gut und wenn man einmal hinter die Logik gestiegen ist, funktioniert auch die Implementierung und Funktion im Openhab einwandfrei. Habe es jetzt mit Openhab2 am Laufen. Allerdings wäre es schön, wenn die Rechte-thematik von Dateien und Ordner der Script für die Luxtronik-Steuerung etwas näher erläutert wäre. Darüber bin ich als Wenig-Linux-User ganz schön gestolpert und musste einiges nachlesen und ein paar Kniffe anwenden. Aber der Support von Thomas ist gut, auch wenn er viel unterwegs ist. Danke nochmal dafür. :-)
Quote

Add comment


Security code
Refresh