FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: cocojambo am 10 Februar 2025, 09:02:51

Titel: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: cocojambo am 10 Februar 2025, 09:02:51
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
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Wzut am 10 Februar 2025, 09:22:08
IF ist nicht if :)
IF ist ein FHEM Commando , du willst aber if (Perl)
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Otto123 am 10 Februar 2025, 09:23:27
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
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: cocojambo am 10 Februar 2025, 11:25:30
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
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Otto123 am 10 Februar 2025, 13:45:25
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!
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: cocojambo am 11 Februar 2025, 09:47:07
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
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: betateilchen am 11 Februar 2025, 10:20:27
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.
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Otto123 am 11 Februar 2025, 11:43:59
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")}}
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: betateilchen am 11 Februar 2025, 11:51:17
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
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Otto123 am 11 Februar 2025, 12:15:21
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?
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: betateilchen am 11 Februar 2025, 12:27:46
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)
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: cocojambo am 11 Februar 2025, 13:36:46
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
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Otto123 am 11 Februar 2025, 13:53:28
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.  ;)
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: betateilchen am 11 Februar 2025, 13:58:26
Das mit "last" wäre nicht zielführend.

Formuliere Deine Anforderung doch mal möglichst einfach:


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?
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: betateilchen am 11 Februar 2025, 13:58:56
Otto war schneller, während ich an einer ausführlichen Antwort saß  8)
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Otto123 am 11 Februar 2025, 14:21:17
naja Du bist aber viel ausführlicher, Du hast gleich noch das mapping gelöst  ;D
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: cocojambo am 11 Februar 2025, 17:13:38
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.
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: Otto123 am 11 Februar 2025, 17:20:59
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
Titel: Aw: Mein notify mit oder, if und else funktioniert nicht
Beitrag von: cocojambo am 11 Februar 2025, 19:45:39
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