Hauptmenü

Notify If Problemchen

Begonnen von jutil, 20 Mai 2025, 16:54:36

Vorheriges Thema - Nächstes Thema

jutil

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");
      }
   }
}

Nobbynews

#1
Das funktioniert bei mir:

my $h = (localtime(time))[2];
Und dann noch korrigieren: $h != $H
Also:
Zitatif ($h >= 6 && $h < 22)

jutil

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  ::)

jutil

#3
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");
      }
   }
}

passibe

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");
        }
    }
}

passibe

Oh warte, versuchst du das über das Befehls-Eingabefeld bzw. als 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 kannst du dann deinen Code einfügen. So sparst du dir die ganzen Eigenheiten der RAW-Syntax und kannst ganz normales Perl reinschreiben.

TomLee

#6
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

tobi01001

#7
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");;\
      }\
  }\
}
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

Prof. Dr. Peter Henning

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

TomLee

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

jutil

Boh mega, tausend Dank für eure Tips. Da werde ich mich morgen gleich mal dran setzen!

Danke euch!


tobi01001

Zitat von: Prof. Dr. Peter Henning am 20 Mai 2025, 20:43:02
Zitat 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."

;)
FHEM@UbuntuServer on Lenovo ThinkCentre M900 [i5-6500T / 8GB RAM] MySQL-DbLog, Grafana, FTUI3 / HmIP incl. CCU3 / LGESS / Wärempumpe über TA CMI und CANoE / Shellies u.v.m.

jutil

Die Sache lüppt, danke euch!

betateilchen

#14
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...)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!