Mein notify mit oder, if und else funktioniert nicht

Begonnen von cocojambo, 10 Februar 2025, 09:02:51

Vorheriges Thema - Nächstes Thema

cocojambo

Ich habe ein notify Konstrukt mit "oder", "if" und "else" verfasst. Meiner Meinung nach ist da alles richtig, auch mit den div. Klammern.
Wird auch aktiviert ohne Fehlermeldung, funktioniert aber nicht. Ich habe auch einige Threads hier im Forum gefunden, aber keine richtige Lösung.
So sieht das aus:

define Laptop_Presence_notify notify Laptop_Presence (IF (ReadingsVal("Laptop_LAN_Presence","state","") eq "present" || ReadingsVal("Laptop_WLAN_Presence","state","") eq "present")) {fhem ("set Laptop_Sw_02 Ein"),(IF (ReadingsVal("Laptop_LAN_Presence","state","") eq "absent" || ReadingsVal("Laptop_WLAN_Presence","state","") eq "absent")) {fhem ("set Laptop_Sw_02 Aus")}}
Könnte mir jemand sagen wo mein Denkfehler für dieses notify liegt. Ich habe vieles probiert, aber keine Lösung gefunden.

Gruß aus Köln
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

Wzut

IF ist nicht if :)
IF ist ein FHEM Commando , du willst aber if (Perl)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Otto123

#2
Hallo Norbert,

was sofort auffällt: wozu die ungleiche Klammer ( } um alles?
Dein IF (groß) ist ein FHEM Befehl! Dazu passen dann wieder nicht die Perl Funktionen in runden Klammern.

Das ganze ist ein Mix, das muss doch eindeutige Fehler schon beim define und mindestens im Log werfen?
Der Ausführungsteil ist ziemlich komplett "Grütze", ob das notify triggert kann ich nicht einschätzen (siehe dazu im Wiki den notify Artikel)
Tip: Teste den Ausführungsteil in der FHEM Kommandozeile separat auf Funktion!

So eine Variante ohne Perl (nicht getestet)
IF ([Laptop_LAN_Presence] eq "present" || [Laptop_WLAN_Presence] eq "present") (set Laptop_Sw_02 Ein) ; IF ([Laptop_LAN_Presence] eq "absent" || [Laptop_WLAN_Presence] eq "absent") (set Laptop_Sw_02 Aus)Eine Variante mit Perl (zum selbst ergänzen)  ;)
{ if (Bedingung) {fhem ("Befehl")} ; if (Bedingung) {fhem ("Befehl")} }
Beachte bitte, dass beim define des notify die Semikolon im Ausführungsteil verdoppelt werden müssen! Wenn Du die DEF editierst muss das nicht gemacht werden!

Edit: Dein notify würde auf alle Events im Gerät Laptop_Presence triggern. Ich vermute, das ist das falsche Suchmuster! Und ich vermute, Du hast was gepostet, was Du nie getestet hast. Zumindest die else, wie angesagt, sehe ich in dem Code nicht und das da keine Fehler kommen, glaube ich nicht.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

cocojambo

Hallo Otto,

du kannst mir glauben, das es keine Fehlermeldung gab. Ich habe alles eingegeben, dann mit modify gespeichert und als Rückmeldung stand im state in rot "aktive"(ich habe probiert einen Screenshot davon hier anzufügen).

Die "ELSE" Variante hatte ich vorher ausprobiert und ELSE anstatt des Kommas eingesetzt und hat auch nicht funktioniert. (aber ebenfalls ohne Fehlermeldung).

.....Laptop_Sw_02 Ein")ELSE(IF (ReadingsVal("Laptop_LAN_Presence.....
Deine vorgeschlagenen Varianten werde ich auf jeden Fall ergänzen und probieren ob es damit funktioniert und mich melden.

Gruß
Norbert

Du darfst diesen Dateianhang nicht ansehen.
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

Otto123

Ok wenn das Device Laptop_Presence existiert (sieht so aus) solltest Du das Suchmuster verbessern. Wie das mit Unterstützung (Eventmonitor) geht steht ebenfalls im Wiki!
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

cocojambo

Hallo Otto,

du hast recht das Suchmuster ist nicht richtig formuliert. Dein Perl Vorschlag habe ich als Grundlage für eine neue DEF genommen. Das Device Laptop_Presence habe ich gelöscht und die anderen Beiden für LAN + WLAN umbenannt. Die Lösung für die Abfrage Beider habe ich abgewandelt im WIKI gefunden. So sieht das fertige Teil aus und es funktioniert so (alle Zustände probiert):

define Laptop_Presence_notify notify Laptop_Presence_(LAN|WLAN) \
{ if ( ReadingsVal("Laptop_Presence_LAN","state","") eq "present"  || ReadingsVal("Laptop_Presence_WLAN","state","") eq "present" ){ fhem ("set Laptop_Sw_02 Ein")} \
if ( ReadingsVal("Laptop_Presence_LAN","state","") eq "absent"  && ReadingsVal("Laptop_Presence_WLAN","state","") eq "absent" ){ fhem ("set Laptop_Sw_02 Aus") }}

Danke für deine Hilfe, Fall gelöst
Norbert
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

betateilchen

Die beiden PRESENCE devices kannst Du auch zu einer structure zusammenfassen und die Auswertung dann über die structure vornehmen. Damit sparst Du Dir die unzähligen ReadingsVal() Abfragen, weil die structure selbst dann entweder "present" oder "absent" meldet und Du direkt darauf triggern kannst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Da lege ich zum Vorschlag von betateilchen noch einen drauf: dann befindet sich im $EVENT genau der Wert der sonst erst ausgelesen wird. Durch ein schärferes Suchmuster oder andere Maßnahmen hat man im $EVENT nur noch absent oder present stehen und kann einfach so schreiben { if ($EVENT eq "present") {fhem ("set Laptop_Sw_02 Ein")}}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

Zitat von: Otto123 am 11 Februar 2025, 11:43:59Da lege ich zum Vorschlag von betateilchen noch einen drauf: dann befindet sich im $EVENT genau der Wert der sonst erst ausgelesen wird. Durch ein schärferes Suchmuster oder andere Maßnahmen hat man im $EVENT nur noch absent oder present stehen und kann einfach so schreiben { if ($EVENT eq "present") {fhem ("set Laptop_Sw_02 Ein")}}

Wenn die structure selbst schon "present" meldet, brauche ich doch gar keinen perl Teil mehr?

define n_st_presence notify st_presence:present set Laptop_Sw_02 Ein
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Ja stimmt schon, aber er hat ja den zweiten Zweig mit absent und aus.
Also entweder zwei notify oder eines mit Abfrage und else oder zwei Abfragen ... oder?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

Zitat von: Otto123 am 11 Februar 2025, 12:15:21Also entweder ... oder ...

... oder "present" und "absent" in der structure auf "Ein" und "Aus" mappen, dann braucht es gar keine Fallunterscheidung mehr, weil in $EVENT dann schon der Zielwert für den Schalter drinsteht  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

cocojambo

Ich habe mir mal die structure angesehen. In Wiki gib es dazu so gut wie keine Erklärung. Und mit dem was in der commandref aufgeführt ist werde ich nicht schlau, auch nach mehrfachem durchlesen nicht. Es sind dort keine ausführichen Beispiele oder Erklärungen zu den einzeln Attributen und Befehlen beschrieben (so wie zb bei DOIF).
Ich muß mir mal ein paar Forenbeiträge ansehen um zu verstehen wie das im Zusammenhang funktionieren soll. Das mit dem $Event könnte funktionieren wenn darin immer das letzte Event von jedem einzelnen Device enthalten ist. Ein Versuch ist es wert.

Gruß
Nobbi
FHEM6.2 FB7490 FB7430 3xraspi2+3+4 2xHM-LAN-CFG 2xESP CUL868 CUNO868 HUE-Bridge Harmony-Hub 5xHM-LC-Sw-PI-2 3xHM-WDS30-T2-SN 1xHM-LC_Sw4-DR 3xHM-ES-PMSw1-PI 7xFS20SIG2 6xFS20KSE 2xHM-ES-PMSW1-PL 5xS300TH 1xASH2200 1xEM1000

Otto123

#12
ist eigentlich simpel, Beispiel
defmod st_Dev_Otto structure bewohner BT_Pixel7a BT_Pixel7a_B2
attr st_Dev_Otto clientstate_behavior relative
attr st_Dev_Otto clientstate_priority present|1 absent|0
Wenn ein Device present ist ist die structure present, wenn alle absent sind ist die structure absent.

Mach Dir zwei dummys und probiere einfach etwas um das Verhalten zu verstehen.  ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

#13
Das mit "last" wäre nicht zielführend.

Formuliere Deine Anforderung doch mal möglichst einfach:

  • Der Laptop soll ausgeschaltet werden, wenn beide PRESENCE devices "absent" melden.
  • In allen anderen Fällen (eines oder beide PRESENCE devices = present) soll eingeschaltet werden.

defmod st_test structure st_test d_lan d_wlan
attr st_test clientstate_behavior relative
attr st_test clientstate_priority Ein|present|present Ein|present|absent Ein|absent|present Aus|absent|absent

Dazu habe ich mir zwei dummy definiert:

define d_lan dummy
define d_wlan dummy

Nun kann man schön testen, welchen Wert die structure annimmt, wenn man die beiden dummy entsprechend mit "set d_lan present" usw. mit Werten beschickt.
Ergebnisse im Event Monitor:

set d_lan  present liefert 2025-02-11 13:55:26 structure st_test Ein
set d_wlan present liefert 2025-02-11 13:56:12 structure st_test Ein
set d_lan  absent  liefert 2025-02-11 13:57:07 structure st_test Ein
set d_wlan absent  liefert 2025-02-11 13:57:56 structure st_test Aus

Was will man mehr?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Otto war schneller, während ich an einer ausführlichen Antwort saß  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!