Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

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: 

Codeblock
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 

Codeblock
outsideTemp:\v

für die Außentemperatur.

Dies wiederholt ihr für alle eure Parameter.

In FHEM ist seit 5.8 der csrf Token zur Sicherheit eingeführt worden.

Daher kann nicht mehr auf die xmllist so ohne weiteres zugegriffen werden (das Ergebnis bei Aufruf der xmllist ist eine weiße Seite).

Um dies zu umgehen müssen folgende Zeilen in der fhem.cfg hinzugefügt werden.

Codeblock
attr WEB csrfToken none
attr WEBphone csrfToken none
attr WEBtablet csrfToken none

 

Werte schreiben wird noch ergänzt

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:

Codeblock
#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:

Codeblock
#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.

View file
nameHeizung_Tecalor.Loxone
height250