Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Die LWWP von Stiebel Eltron bzw. Tecalor können mittels FHEM und einem selbst gebauten Kabel kostengünstig in Loxone eingebunden werden.

Das benötigte Kabel wird hier beschrieben: https://robert.penz.name/heat-pump-lwz/

Eine gute Beschreibung, wie man das ganze mittels FHEM umsetzt ist hier beschrieben: https://wiki.fhem.de/wiki/Tecalor_THZ_W%C3%A4rmepumpe

FHEM kann auf einem Raspberry Pi (am besten gleich ein Pi 3) mittels loxberry (sollte man sowieso haben) als Plugin installieren.

Läuft das ganze dann auf FHEM, können erst einmal ganz einfach alle benötigten Daten von einer XML dabei geparsed werden.

Der Aufruf sieht hier wie folgt aus: 

http://ip_des_loxberry_mit_fhem:8083/fhem?cmd=xmllist%20Mythz&XHR=1

Dort sucht ihr einfach nach den für euch interessanten Parametern und könnte diese z.B. für die Außentemperatur wie folgt auslesen.

Legt einen neuen Virtuellen HTTP Eingang an mit der oben genannten Adresse.

Darunter dann einen Virtuellen HTTP Eingang Befehl. Bei Befehlserkennung dann 

outsideTemp:\v

für die Außentemperatur.

Dies wiederholt ihr für alle eure Parameter.

Um die Daten direkt bei Werteänderungen zu erhalten lassen wir uns die Daten von FHEM per UDP an unseren Miniserver senden.

Dabei schickt FHEM einen langen string mit allen für uns relevanten Werten den wir dann im Miniserver nur noch mittels Befehlserkennung zerpflücken müssen.

Die fhem.cfg um folgende Einträge erweiteren:

#Heizung einbinden
define Mythz THZ /dev/ttyUSB1@115200
attr Mythz devStateIcon opened:10px-kreis-gruen disconnected:10px-kreis-rot
attr Mythz event-min-interval .*:900
attr Mythz event-on-change-reading .*
attr Mythz firmware 5.39
attr Mythz interval_sBoostDHWTotal 3600
attr Mythz interval_sBoostHCTotal 3600
attr Mythz interval_sDHW 120
attr Mythz interval_sDisplay 120
attr Mythz interval_sElectrDHWTotal 3600
attr Mythz interval_sElectrHCTotal 3600
attr Mythz interval_sFlowRate 3600
attr Mythz interval_sGlobal 120
attr Mythz interval_sHC1 120
attr Mythz interval_sHeatDHWTotal 3600
attr Mythz interval_sHeatHCTotal 3600
attr Mythz interval_sHeatRecoveredTotal 28800
attr Mythz interval_sHistory 28800
attr Mythz interval_sLast10errors 3600
attr Mythz room Heizung
attr Mythz userReadings mode_sommer_winter {(split' ',ReadingsVal("Mythz","sHC1",0))[15]}, AussenTemp {(split ' ',ReadingsVal("Mythz","sGlobal",0))[1]}, VorlaufTemp {(split ' ',ReadingsVal("Mythz","sGlobal",0))[3]}, RuecklaufTemp {(split ' ',ReadingsVal("Mythz","sGlobal",0))[5]}, WWTemp {(split ' ',ReadingsVal("Mythz","sDHW",0))[1]}, WWsoll {(split ' ',ReadingsVal("Mythz","sDHW",0))[5]}, AussenTempGef {(split ' ',ReadingsVal("Mythz","sGlobal",0))[65]}, HC1_ist {(split ' ',ReadingsVal("Mythz","sHC1",0))[13]}, HC1_soll {(split ' ',ReadingsVal("Mythz","sHC1",0))[11]}, Integral {(split ' ',ReadingsVal("Mythz","sHC1",0))[7]}, Compressor {(split ' ',ReadingsVal("Mythz","sDisplay",0))[3]}, Luefterdrehzahl {(split ' ',ReadingsVal("Mythz","sGlobal",0))[61]}, Schaltprogramm {(split ' ',ReadingsVal("Mythz","sDisplay",0))[1]}, Heizen {(split ' ',ReadingsVal("Mythz","sDisplay",0))[5]}, HeizenWW {(split ' ',ReadingsVal("Mythz","sDisplay",0))[7]}, Booster {(split ' ',ReadingsVal("Mythz","sDisplay",0))[9]}, filter_beide {(split ' ',ReadingsVal("Mythz","sDisplay",0))[11]}, Lueftung {(split ' ',ReadingsVal("Mythz","sDisplay",0))[13]}, heizkreispumpe {(split ' ',ReadingsVal("Mythz","sDisplay",0))[15]}, defrost {(split ' ',ReadingsVal("Mythz","sDisplay",0))[17]}, filter_oben {(split ' ',ReadingsVal("Mythz","sDisplay",0))[19]}, filter_unten {(split ' ',ReadingsVal("Mythz","sDisplay",0))[21]}, fehleranzahl {(split ' ',ReadingsVal("Mythz","sLast10errors",0))[1]}, heatrecovertotal {(split ' ',ReadingsVal("Mythz","sHeatRecoveredTotal",0))[0]}, flowrate {(split ' ',ReadingsVal("Mythz","sGlobal",0))[87]/10}, evurelease {(split ' ',ReadingsVal("Mythz","sGlobal",0))[47]},

#Plots
define FileLog_Mythz FileLog ./log/Mythz-%Y-%m.log Mythz
attr FileLog_Mythz archivedir ./log/archive/
attr FileLog_Mythz nrarchive 2

define Mythz_Plot1_Temp SVG FileLog_Mythz:Mythz_Plot1_Temp:CURRENT
attr Mythz_Plot1_Temp label "Außen $data{currval6}°C, WW $data{currval1}°C, HC1-Soll $data{currval4}°C, HC1-Ist $data{currval5}°C, Vorlauf $data{currval2}°C, Rücklauf $data{currval3}°C"
attr Mythz_Plot1_Temp plotsize 840,420
attr Mythz_Plot1_Temp room Heizung_Plot

define Mythz_Plot2_HC1Offset_Integral SVG FileLog_Mythz:thz2:CURRENT
attr Mythz_Plot2_HC1Offset_Integral label sprintf("HC1Ist-HC1Soll %0.1fK, Integralwert %0.1f", $data{currval1}, $data{currval2})
attr Mythz_Plot2_HC1Offset_Integral plotsize 840,210
attr Mythz_Plot2_HC1Offset_Integral room Heizung_Plot

define Mythz_Plot3_Internals SVG FileLog_Mythz:Mythz_Plot3_Internals:CURRENT
attr Mythz_Plot3_Internals label "TimeStamp: $data{currdate1}"
attr Mythz_Plot3_Internals plotsize 840,210
attr Mythz_Plot3_Internals room Heizung_Plot

define Mythz_Plot4_Fans SVG FileLog_Mythz:thz4:CURRENT
attr Mythz_Plot4_Fans label "Zu-Soll $data{currval1}%, Zu-Ist $data{currval2}Hz, Ab-Soll $data{currval3}%, Ab-Ist $data{currval4}Hz, Fort-Ist $data{currval5}Hz"
attr Mythz_Plot4_Fans plotsize 840,210
attr Mythz_Plot4_Fans room Heizung_Plot


#notify
define HeizungToLoxone notify .*:AussenTemp.* {HeizungToLoxone("$NAME")}
define HeizungToLoxone2 notify .*:WWTemp.* {HeizungToLoxone("$NAME")}
define HeizungToLoxone3 notify .*:HC1_ist.* {HeizungToLoxone("$NAME")}

Der notify wird drei mal getriggert.

Idee dahinter ist, falls sich ein Wert nur selten ändert, wird das notify und somit der UDP Versand der Daten durch einen der beiden anderen Werteänderungen angestoßen.

Die 99_myUtils.pm um folgende Einträge erweitern:

#UDP Befehle senden
sub UDP_Msg($$$)
{
my ($dest,$port,$cmd) = @_;
my $sock = IO::Socket::INET->new(
Proto => 'udp',
PeerPort => $port,
PeerAddr => $dest
) or die "Could not create socket: $!\n";
$sock->send($cmd) or die "Send error: $!\n";
return "send $cmd";
}


#HeizungToLoxone
sub HeizungToLoxone($)
{
my ($device) = @_;
my $AussenTemp =ReadingsVal("$device","AussenTemp","-1");
my $AussenTempGef =ReadingsVal("$device","AussenTempGef","-1");
my $Booster =ReadingsVal("$device","Booster","-1");
my $Compressor =ReadingsVal("$device","Compressor","-1");
my $HC1_ist =ReadingsVal("$device","HC1_ist","-1");
my $HC1_soll =ReadingsVal("$device","HC1_soll","-1");
my $Heizen =ReadingsVal("$device","Heizen","-1");
my $HeizenWW =ReadingsVal("$device","HeizenWW","-1");
my $Integral =ReadingsVal("$device","Integral","-1");
my $Luefterdrehzahl =ReadingsVal("$device","Luefterdrehzahl","-1");
my $Lueftung =ReadingsVal("$device","Lueftung","-1");
my $RuecklaufTemp =ReadingsVal("$device","RuecklaufTemp","-1");
my $Schaltprogramm =ReadingsVal("$device","Schaltprogramm","-1");
my $VorlaufTemp =ReadingsVal("$device","VorlaufTemp","-1");
my $WWTemp =ReadingsVal("$device","WWTemp","-1");
my $WWsoll =ReadingsVal("$device","WWsoll","-1");
my $defrost =ReadingsVal("$device","defrost","-1");
my $fehleranzahl =ReadingsVal("$device","fehleranzahl","-1");
my $filter_beide =ReadingsVal("$device","filter_beide","-1");
my $filter_oben =ReadingsVal("$device","filter_oben","-1");
my $filter_unten =ReadingsVal("$device","filter_unten","-1");
my $heatrecovertotal =ReadingsVal("$device","heatrecovertotal","-1");
my $heizkreispumpe =ReadingsVal("$device","heizkreispumpe","-1");
my $mode_sommer_winter =ReadingsVal("$device","mode_sommer_winter","-1");
if ($mode_sommer_winter eq "summer") {
$mode_sommer_winter = "1";
}
if ($mode_sommer_winter eq "winter") {
$mode_sommer_winter = "0";
}
my $mode =ReadingsVal("$device","pOpMode","-1");
if ($mode eq "automatic") {
$mode = "0";
}
if ($mode eq "DHWmode") {
$mode = "1";
}
my $flowrate =ReadingsVal("$device","flowrate","-1");
my $evurelease =ReadingsVal("$device","evurelease","-1");

UDP_Msg("192.168.178.122" , "7001" , "$device: $AussenTemp $AussenTempGef $Booster $Compressor $HC1_ist $HC1_soll $Heizen $HeizenWW $Integral $Luefterdrehzahl $Lueftung $RuecklaufTemp $Schaltprogramm $VorlaufTemp $WWTemp $WWsoll $defrost $fehleranzahl $filter_beide $filter_oben $filter_unten $heatrecovertotal $heizkreispumpe $mode_sommer_winter $mode $flowrate $evurelease");
}

Jetzt wird bei jeder Werteänderung von AussenTemp, WWTemp oder HC1_ist alle Daten von FHEM an Loxone geschickt.

Auf der Loxoneseite jetzt die Vorlage einbinden und die ganzen Eingänge anlegen.

Die Erkennung für AussenTemp ist im Beispiel mit drin. Die anderen Werte müsst ihr einfach mittels weiterer Virtueller UDP Eingangs Befehle erweiteren und die Befehlserkennung jeweils um ein  \# \v ergänzen. Die letzte Zeile der 99_myUtils.pm zeigt euch an, an welcher Stelle welcher Wert kommt.

Werte schreiben:

Um Werte zu schreiben nutzen wir die Bedienung von FHEM mittels http:

Im Beispiel setzen wir die Raumtemperatur für den Tag.

Dazu wird ein Virtueller Ausgang angelegt und darin ein Virtueller Ausgangsbefehl.

Im Virtuellen Ausgang steht die IP des loxberry mit FHEM und der Port 8083.

Im Virtuellen Ausgangsbefehl kommt dann der komplette Pfad zum Wert den wir ändern wollen.

Hier im Beispiel ist auch gleich zu erkennen wie Werte, welche wir in Loxone eingeben, direkt als Wert an FHEM geschickt werden (hierfür ist das <v.1> zuständig; Wert wird mit einer Nachkommastelle übergeben).

Für alle anderen Werte die man ändern will, geht man nach dem gleichen Schema vor.

Heizung_Tecalor.Loxone



6 Kommentare

  1. Seb sagt:

    Hallo

    also wenn ich den Link eingebe:

    http://ip_des_loxberry_mit_fhem:8083/fhem?cmd=xmllist%20Mythz&XHR=1
    natürlich mit meiner IP, dann bekomme ich nur eine leere weiße Seite angezeigt! Und wann wird die Anleitung noch um den Punkt Werte schreiben noch erweitert?
    gruß sebastian
  2. Problem mit der weißen Seite wurde ergänzt.

    heist deine Tecalor in FHEM auch "Mythz"?

  3. Seb sagt:

    Hallo Andreas,

    ja meine Tecalor heißt in FHEM auch "Mythz" !

    Ist vielleicht mein Fehler das ich die Daten über den USB-Anschluss auslese?!  Nach diesen Prinzip:

    Definition in FHEM

    Mit direkter serieller oder USB Verbindung

    define Mythz THZ /dev/ttyUSB0@115200 # oder (/dev/ttyXXX)attr Mythz interval_sGlobal 300 # Internes Polling Intervall 5minattr Mythz interval_sHistory 28800 # Internes Polling Intervall 8hattr Mythz interval_sLast10errors 120 # Internes Polling Fehlerspeicherdefine FileLog_Mythz FileLog ./log/Mythz-%Y.log Mythz

     

    soweit so gut! Es kommen auch alle Daten in sGlobal an und werden auch aktualisiert! Aber kommt vielleicht meine mangelne Erfahrung um die Daten nun von da auch in Loxone zu bekommen! Habe gehofft, dass es mit deiner Anleitung auch ganz einfach über den USB-Port geht! Aber vieleicht kannst du trotzdem helfen (Zwinkern) (Lächeln)

     

    Gruß Sebastian

     

    PS: ISG - Modul möchte ich nicht einsetzten ist mir zu günstig (Zwinkern)

     

     

  4. Seb sagt:

    Hallo zurück!
    Ich konnte das Problem ( mit der weißen Seite) nun lösen! FHEM neu aufgesetzt . Dann der Vorgang nach der Anleitung oben und siehe da nun geht es !!????????

    Ich habe mir dann einige Daten auch schon raus gesucht ( aus sGlobal) und in loxone eingepflegt. Es kommen die gewünschten Werte auch an. Nun wollte ich aber auch noch andere Werte aus der xml haben. Wie die Verbrauchswerte z.B. . Diese stehen hier nicht chr in sGlobal ! Wenn ich nun diese Werte versuche einzupflegen , dann bekomme ich irgendwie nicht das richtig angezeigt. Liegt es das die Einheit "Kwh" vielleicht direkt da mit drinsteckt? Wie kann ich weitermachen !!

    Vielen Dank schon mal im Voraus an alle die mir helfen ??

  5. Seb sagt:

    Kann keiner weiterhelfen? Vielleicht auch mit dem Thema " Werte schreiben" ? ??

  6. Hallo Andreas,

    wollte mal nachfragen ob es schon neue Ergebnisse gibt bezüglich Werte schreiben usw.

    LG Marcus