Hallo Zusammen,
ich werde bald verrückt. Habe eine menge (ca. 30) NOTIFYs, die alle ohne Probleme laufen, aber ein bestimmter (bzw. eigentlich 2) wollen einfach nicht.
Was will ich: wenn der Türstatus auf "zu" geht und noch ein Fenster offen ist, soll eine Pushover Nachricht verschickt werden.
Was habe ich dazu: Tür/Fensterkontakt an der Tür und an den Fenstern, das Pushover Modul (funktioniert auch).
Folgender Notify funktioniert ohne Probleme:
define TürZuPush notify Haustuer:zu set Pushover msg 'FHEM 'Türe zu'
Folgender Notify liefert kein Ergebnis:
define TürZu_FensterAuf_Push notify Haustuer:zu {
if(ReadingsVal("FHT_.*", "window", "") eq "open") {
fhem ("set Pushover msg 'FHEM-WARNUNG' 'Es ist noch ein Fenster offen\n@ %'");
}
}
Folgender Notify liefert nur das Ergebnis Tür zu:
define TürZu_FensterAuf_Push notify Haustuer:zu {
fhem ("set Pushover msg 'FHEM 'Türe zu'");{
if(ReadingsVal("FHT_.*", "window", "") eq "open") {
fhem ("set Pushover msg 'FHEM-WARNUNG' 'Es ist noch ein Fenster offen\n@ %'");
}
}
}
Ein Notify nur auf die Fenster liefert kein Ergebnis beim Öffnen:
define FensterCheck notify FHT_.*:window:open set Pushover msg 'FHEM-WARNUNG' 'Es ist noch ein Fenster offen\n@ %'
Ich habe das ganze dann noch mit den Fensterkontakten (über einen CUNO) direkt probiert:
CUL_FHTK_.*:window:open
auch ohne Erfolg.
Hat jemand eine Idee, wo mein Denkfehler ist?
Ich bin mir zwar nicht 100% sicher aber ich denke mal dass das if(ReadingsVal("FHT_.*",
schon nicht geht, da es kein Device gibt, dass "FHT_.*" heisst. Du musst hier entweder alle Fenster "anschauen" oder du machst dir ein virtuelles "worst case" Fenster_Alle (so habe ich es, bedeutet wenn mindestens ein Fenster offen ist, ist Fenster_Alle offen ...).
Gruß Deudi
das "FHT_.*" sollte schon gehen, weil alle FHT beim mir nach der Logik FHT_Zimmername benannt sind.
Habe aber zum Test gerade folgendes definiert:
define TestFenster readingsGroup FHT_.*:window
liefert eine schöne Liste aller Fenster mit Status. Geht also.
Ein Regex in einer ReadingsGroup ist etwas anderes als den Regex in der Funktion ReadingsVal zu verwenden. ReadingsVal erwartet EIN bestimmtes Device.
Vorschlag: Schau dir mal structure an, packe alle relevanten Fenster in eine structure und prüfe auf
ReadingsVal("STRUCTURENAME","window",0) ne "closed"
Ah, danke, das wusste ich nicht.
Habe jetzt mal eine structur angelegt.
Sobald ich Zuhause bin, werde ich testen und Rückmeldung geben.
Vielen Dank für den Hinweis.
Ich mache soetwas ähnliches und hatte das auch erst mit einer structure gemacht. Die hat mir allerdings zu viele eigene Events produziert, die dann auch geloggt wurden. Ich hab mir dann folgendes gebastelt:
define tuernoti notify flur.haustuer.*offen.* {
my @@monitored=devspec2array("((.*\\.tuer)|.*fenster):FILTER=STATE=offen");
my $cnt_devs=@@monitored;
my $i = 0;
my $msgtext = "";
foreach(@@monitored) {
$msgtext .= AttrVal($_,"alias",$_);
if ($i < $cnt_devs - 2) {
$msgtext .= ", ";
}
if ($i == $cnt_devs - 2) {
$msgtext .= " und ";
}
$i++;
}
if ($cnt_devs > 0) {
prowl("Achtung, ".$msgtext." offen!","Wohnung verlassen","1");
} else {
prowl("Alles zu, auf Wiedersehen :-)","Wohnung verlassen","0");
}
}
Meldet mir offene Türen und Fenster schon wenn die Haustür AUF geht - und eine grammatikalisch korrekte Auflistung, welche ;-)
Die Türen und Fenster heißen, damit das klappt, alle am Ende ".tuer" bzw. ".fenster" - also z.B. bad.oben.tuer oder kueche.fenster. Die herausgenommene Haustür muss flur.haustuer heißen. In der Push-Nachricht werden die Alias-Namen verwendet, eine Meldung sieht dann z.B. so aus:
"Achtung, Küchentür, Stubentür und Badfenster oben offen!"
structur hat grundsätzlich funktioniert, aber zu wissen, welches Fenster offen steht ist schon sehr hilfreich.
Habe jetzt mal Deinen Code etwas "manipuliert", aber noch nicht getestet:
define FensterCheckTest notify Haustuer:zu {
my @@monitored=devspec2array("(CUL_FHTTK_.*):FILTER=STATE=open");
my $cnt_devs=@@monitored;
my $i = 0;
my $msgtext = "";
foreach(@@monitored) {
$msgtext .= AttrVal($_,"alias",$_);
if ($i < $cnt_devs - 2) {
$msgtext .= ", ";
}
if ($i == $cnt_devs - 2) {
$msgtext .= " und ";
}
$i++;
}
if ($cnt_devs > 0) {
fhem ("set Pushover msg 'FHEM-WARNUNG' '.$msgtext.'");
} else {
fhem ("set Pushover msg 'FHEM' 'Alle Fenster zu'");
}
}
Jo sieht gut aus und müsste gehen :-)
geht leider nicht, kommt immer "Alle Fenster zu" :-\
Kannst Du mir bitte genau erklären, was das macht:
my @@monitored=devspec2array("(CUL_FHTTK_.*):FILTER=STATE=open")
Wenn ich das richtig verstehe, dann wird ein Array angelegt, welches den STATE der Fensterkontakte (CUL_FHTTK_.*) beinhaltet, richtig?
Irgendwo da liegt wohl das Problem.
Du kannst zum überprüfen auch:
list CUL_FHTTK_.*:FILTER=STATE=open
in die cmd line eingeben.
Dann solltest Du eine Liste der devices erhalten. Sofern der Filter zutrifft.
Der Befehlt bewirkt bei mir rein gar nichts?? :o
Lass mal das CUL_ im Regex weg. In deinen früheren Beispielen hatten deine Kontakte ja auch einen Namen ohne CUL_ am Anfang . Das Statement gibt eine Liste mit Devices zurück, die gem. dem Regex heißen (Name, nicht Typ) und dann nach dem entsprechenden State gefiltert werden. In dem Array sind dann die Devicenamen als String (nicht der State) drin.
Edit: Alternativ poste mal ein list von einem einzelnen (offenen) Fensterkontakt.
Hab jetzt mal ein bisschen mit list gespielt. Ist etwas merkwürdig, welchen STATE fhem da so annimmt bzw. rauslist.
Auf jeden Fall habe ich es jetzt so gelöst:
{
my @@monitored=devspec2array("window=open");
my $cnt_devs=@@monitored;
my $i = 0;
my $msgtext = "";
foreach(@@monitored) {
$msgtext .= AttrVal($_,"alias",$_);
if ($i < $cnt_devs - 2) {
$msgtext .= ", ";
}
if ($i == $cnt_devs - 2) {
$msgtext .= " und ";
}
$i++;
}
if ($cnt_devs > 0) {
fhem ("set Pushover msg 'FHEM-WARNUNG' '$msgtext. noch offen'");
} else {
fhem ("set Pushover msg 'FHEM' 'Alle Fenster zu'");
}
}
Tausend Dank für eure Hilfe!!