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
IF ist nicht if :)
IF ist ein FHEM Commando , du willst aber if (Perl)
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 (https://wiki.fhem.de/wiki/Notify))
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
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
Screenshot 2025-02-10 110305.png
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!
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
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.
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")}}
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
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?
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)
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
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. ;)
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?
Otto war schneller, während ich an einer ausführlichen Antwort saß 8)
naja Du bist aber viel ausführlicher, Du hast gleich noch das mapping gelöst ;D
Ich habe die structure mal auf meine Installation übertragen:
define Laptop_structure structure Laptop_Presence_LAN Laptop_Presence_WLAN
attr Laptop_structure clientstate_behavior relative
attr Laptop_structure clientstate_priority Ein|present|present Ein|present|absent Ein|absent|present Aus|absent|absent
attr Laptop_structure room Test
Ich kann die LAN und WLAN Adressen von present und absent hin und herschalten, was auch im Event Monitor zu sehen ist, aber im state von Laptop_structure ändert sich nix. Es steht immer aktive drin.
siehst Du den Unterschied?
Zitatdefmod st_test structure st_test d_lan d_wlan
Kennst Du den help Befehl? in der FHEM Kommandozeile ;)
help structure
JA ICH SEHE DEN UNTERSCHIED.
und schon geändert.
Und so sieht es jetzt aus:
defmod Laptop_structure structure Laptop_structure Laptop_Presence_LAN Laptop_Presence_WLAN
attr Laptop_structure clientstate_behavior relative
attr Laptop_structure clientstate_priority Ein|present|present Ein|present|absent Ein|absent|present Aus|absent|absent
attr Laptop_structure room Test
defmod Laptop_structure_notify notify Laptop_structure set Laptop_Sw_02 $EVENT
attr Laptop_structure_notify room Test
und es scheint sogar zu funktionieren, zumindest haben die ersten Versuche geklappt.
eine tolle Lösung.
Gruß
Nobbi