Ich habe genau soetwas seit Anfang letzter Saison in Betrieb und es hat uns schon mehrmals vor Frostbeulen bewahrt bzw. sind wir immer die ersten, die dann den Hausmeister rufen ;-)
Erkennung mache ich allerdings über die zwangsverordneten Techem-HKVs, die praktischerweise alle 3 Minuten die HK-Oberflächentemperatur durch die Gegend funken und sich mit einem CUL868 prima auslesen lassen ...
Mit folgendem Notify befülle ich einen Dummy (system.heizmonitor) mit Readings für jeden HK:
.*\.heizung.zaehler:temp2.* {
if($NAME =~ /^(.*)\.zaehler$/) {
my $hk = $1;
my $hkVentilPos = ReadingsVal($hk,"ValvePosition","N/A");
my $hkTemp = ReadingsVal("$NAME","temp2","N/A");
my $AusfallTempThreshold = 35;
my $AusfallVentilThreshold = 25;
my $AusfallWaitTime = 17*60;
my $DaueranTempThreshold = 40;
my $DaueranVentilThreshold = 1;
my $DaueranWaitTime = 60*60;
my $curstate = ReadingsVal("system.heizmonitor",$hk,"N/A");
if ($curstate ne "warten" && $curstate ne "ausfall" && $hkVentilPos > $AusfallVentilThreshold && $hkTemp < $AusfallTempThreshold) {
fhem("setreading system.heizmonitor $hk warten;sleep $AusfallWaitTime sl_".$hk."_ausfall quiet; setreading system.heizmonitor $hk ausfall");
} elsif (($hkVentilPos < $AusfallVentilThreshold || $hkTemp > $AusfallTempThreshold) && $curstate ne "ok") {
fhem("setreading system.heizmonitor $hk ok");
if ($curstate eq "warten") {
fhem("cancel sl_".$hk."_ausfall");
}
}
$curstate = ReadingsVal("system.ventilmonitor",$hk,"N/A");
if ($curstate ne "warten" && $curstate ne "ausfall" && $hkVentilPos < $DaueranVentilThreshold && $hkTemp > $DaueranTempThreshold) {
fhem("setreading system.ventilmonitor $hk warten;sleep $DaueranWaitTime sl_".$hk."_ventil quiet; setreading system.ventilmonitor $hk ausfall");
} elsif ((($hkVentilPos > ($DaueranVentilThreshold - 1)) || ($hkTemp < $DaueranTempThreshold)) && $curstate ne "ok") {
fhem("setreading system.ventilmonitor $hk ok");
if ($curstate eq "warten") {
fhem("cancel sl_".$hk."_ventil");
}
}
}
Das überwacht außerdem auch gleich, ob ein HK heiß ist, obwohl das Ventil „zu“ meldet. Mit einem DOIF Benachrichtige ich dann bei einem Ausfall (inkl. Zahl der zu kalte. HKs und deren Temperatur):
(["system.heizmonitor:ausfall$"]) {
my $deviceAlias = "$EVENT";
my $deviceName;
my $deviceState;
if($deviceAlias =~ /([^:]*):.([^:]*)/) {
$deviceName = $1;
}
if ($deviceName) {
$deviceAlias = AttrVal($deviceName,'alias',$deviceName);
}
my $ventil = ReadingsVal($deviceName,"ValvePosition","N/A");
my $temp = ReadingsVal($deviceName.".zaehler","temp2","N/A");
my $anzahlAusgefallen = ReadingsVal("system.heizmonitor","anzahlAusgefallen","N/A");
fhem("set msgRouter exec route_mt_Heizungen_Ausfall p_msgtitle='$deviceAlias ausgefallen ($anzahlAusgefallen HK insgesamt)' p_msgtext='Oberflächentemperatur $temp°C, Ventil $ventil%'");
} DOELSEIF ([system.heizmonitor:anzahlAusgefallen] eq "0") {
fhem("set msgRouter exec route_mt_Heizungen_OK p_msgtitle='Heizungsanlage OK' p_msgtext='Alle ausgefallenen Heizungen in Betrieb.'");
}
Für dein Szenario ohne Temp.sensoren kannst du das aber eigentlich noch deutlich vereinfachen und eleganter machen: Nimm das Monitoring-Modul mit einem Regex für 100% Ventilposition als ErrorAdd -Kriterium und Ventilposition ungleich 99% als ErrorRemove-Kriterium. Als Waittime nimmst du ne Viertelstunde oder so, je nachdem wie lahm eure Heizung ist. Viel kürzer als meine Version und macht genau was du willst ...
LG!