Hallo zusammen,
ich hönge hier wieder an einem "Klammer-Probelm" das ich einfach nicht hinbekomme.
Ich möchte ein Notify erstellen das auf ein reading uhrzeitbedingt reagiert.
So hab ich es mir gedacht, aber die Klammern stimmen nicht, habe da jetzt die wildesten Versuche unternommen aus Verzweifelung, alles erfolglos.
define notify_NetzAus notify HT:absent.* {
my $h = (localtime)[2];
if ($h >= 6 && $H < 22) {
if (ReadingsVal("HT","state","") eq "absent") {
fhem("set was auch immer");
}
}
}
Das funktioniert bei mir:
my $h = (localtime(time))[2];
Und dann noch korrigieren: $h != $H
Also:
Zitatif ($h >= 6 && $h < 22)
Bei mir sagt er Klammerfehler, ich schau mir das heute Abend mal an, besten Dank für die Korrektur, da schaut man dann gar nicht mehr hin ::)
No soll nicht so sein hab ich geändert.
läuft bei mir auf den folgenden Fehler...
Unknown command my, try help. IF: no left bracket: { IF: no left bracket: { Unknown command fhem("set, try help. Unknown command }, try help. Unknown command }, try help. Unknown command }, try help.
define notify_NetzAus notify HT:absent.* {
my $h = (localtime(time))[2];
if ($h >= 6 && $h < 22) {
if (ReadingsVal("HT","state","") eq "absent") {
fhem("set was auch immer");
}
}
}
Dein notify funktioniert. Ich vermute, dass das Problem in deinem "set was auch immer" liegt.
Bei mir läuft das so ohne Probleme:
test:on {
my $h = (localtime(time))[2];
if ($h >= 6 && $h < 22) {
if (ReadingsVal("test","state","") eq "on") {
ntfy("test");
}
}
}
Oh warte, versuchst du das über das Befehls-Eingabefeld (https://wiki.fhem.de/wiki/Konfiguration#Befehl-Eingabefeld) bzw. als RAW-Import (https://wiki.fhem.de/wiki/Konfiguration#RAW-Import) einzufügen?
Dann brauchst du eine andere syntax, mit doppeltem Semikolon, etc.
Ich würde mir das sparen; am besten ist es, du erstellst über das Befehls-Eingabefeld immer erst ein leeres notify, also in deinem Fall: define notify_NetzAus notify HT:absent.* {}
und klickst dann im neu erstellten Device auf "DEF". Im DEF-Editor (https://wiki.fhem.de/wiki/Konfiguration#Objektdetails) kannst du dann deinen Code einfügen. So sparst du dir die ganzen Eigenheiten der RAW-Syntax und kannst ganz normales Perl reinschreiben.
Hallo,
Du importierst Raw-Code. Da musst die Semikolon verdoppeln und die neuen Zeilen in dem Perl-Code "angeben" (mit \) oder alles in eine Zeile schreiben und später in der DEF ändern.
FHEM hat ne eigene Variable für die aktuelle Stunde:
defmod notify_NetzAus notify HT:absent.* {\
if ($hour >= 6 && $hour < 22) {\
if (ReadingsVal("HT","state","") eq "absent") {\
fhem("set was auch immer");;\
}\
}\
}
Gruß Thomas
EDIT1: Thomas war schneller ;-)
EDIT2: und passible war noch schneller...
Zitat von: jutil am 20 Mai 2025, 17:31:49No soll nicht so sein hab ich geändert.
läuft bei mir auf den folgenden Fehler...
Unknown command my, try help. IF: no left bracket: { IF: no left bracket: { Unknown command fhem("set, try help. Unknown command }, try help. Unknown command }, try help. Unknown command }, try help.
define notify_NetzAus notify HT:absent.* {
my $h = (localtime(time))[2];
if ($h >= 6 && $h < 22) {
if (ReadingsVal("HT","state","") eq "absent") {
fhem("set was auch immer");
}
}
}
Wo gibst du das denn wie ein? Das liest sich so als würde das eine Raw definition sein. Die funktioniert so aber nicht, weil jede Zeile asl fhem Befehl ausgewertet wird....
Probier gerne mal
defmod notify_NetzAus notify HT:absent.* {\
my $h = (localtime(time))[2];;\
if ($h >= 6 && $h < 22) {\
if (ReadingsVal("HT","state","") eq "absent") {\
fhem("set was auch immer");;\
}\
}\
}
Solche mehrzeiligen Code-Schnipsel gehören in die 99_myUtils.pm - dafür ist sie da. Und dann aufrufen aus einem notify, oder "was auch immer".
LG
pah
Man kann das auch als Einzeiler definieren:
return fhem("set was auch immer") if ($hour >= 6 && $hour < 22) && ReadingsVal("HT","state","") eq "absent";
edit:
Gerade mal getestet was ich da schreib. Die Auswertung in Perl erfolgt von links nach rechts. Die Klammern um $hour >= 6 && $hour < 22 brauchts nicht unbedingt, schaden aber nicht.
Boh mega, tausend Dank für eure Tips. Da werde ich mich morgen gleich mal dran setzen!
Danke euch!
Zitat von: Prof. Dr. Peter Henning am 20 Mai 2025, 20:43:02Zitat von: jutil am 20 Mai 2025, 20:38:50Boh mega
::)
Wäre dir das lieber gewesen?
Zitat,,Meine aufrichtige Hochachtung und ein herzliches Dankeschön für eure überaus erhellenden Hinweise! Ich werde mich morgen sogleich an die Umsetzung machen."
;)
Die Sache lüppt, danke euch!
Es gibt eine einfachere Lösung für die Aufgabe, in einem notify etwas nur innerhalb eines bestimmten Zeitraums auszuführen:
define notify_NetzAus notify HT:absent.* { fhem("set was auch immer") if (ReadingsVal("HT","state","") eq "absent") }
attr notify_NetzAus disabledForIntervals 00-06 22-24
(offtopic: das vorschnelle Schließen von Threads, gerade in den Anfängerfragen, nervt maßlos...)