FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Stevie am 25 Oktober 2024, 18:37:52

Titel: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Stevie am 25 Oktober 2024, 18:37:52
Hallo Zusammen,

ich kämpfe jetzt schon paar Stunden mit einem Notify.
Es soll, wenn sich an dem Reading MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint etwas ändert, das Licht EG_ku_FSA1_LichtHinten ausgeschaltet werden, wenn die Zeitstempel der Readings MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint und MQTT2_z2t_7384:ZbReceived_0x7384_FC11/2001 nicht gleich sind.

Mit meinen vielen Versuchen bin ich bis jetzt gescheitert, dass war mein letzter Entwurf:
MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{if {ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0)} ne
{ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0)}
{fhem ("set EG_ku_FSA1_LichtHinten off")};;
}

Kann mir bitte jemand auf die Sprünge helfen?
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Gisbert am 25 Oktober 2024, 19:15:05
Hallo Stevie,

mal abgesehen, dass ich noch nie ein Konstrukt gesehen hab, dass 2 Timestaps verglichen wurden - du wirst sicher deine Gründe haben -, versuche mal folgendes:

MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{if (ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FSA1_LichtHinten off"}}

Keine Garantie, dass es funktioniert, aber die Syntax sollte so richtig sein.

Viele Grüße Gisbert
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Stevie am 25 Oktober 2024, 19:58:41
Hallo Gisbert,

vielen vielen Dank!! Es funktioniert wie es soll. Perfekt!

Hintergrund:
Ich bin gerade dabei einen Sonoff SNZB-06P Präsenzmelder über eine mit Tasmota geflashte Sonoff Zigbee Pro Bridge in Fhem einzubinden.
Dieser triggert eine 1 wenn jemand anwesend ist in das Reading ZbReceived_0x7384_Occupancy, schaltet diesen Wert aber nach 90 Sekunden zurück zu 0 obwohl man nebendran steht.
Bei diesem Vorgang werden auch noch 2 weitere Readings auf die gleichen Werte wie vorher gesetzt. Somit kann ich nicht auf 0 oder 1 reagieren lassen.
Verlässt man den Raum, wird nach ca. einer Minute das Reading Occupancy nochmal auf 0 gesetzt. Dabei werden auch andere Readings gesetzt, die vorher nicht gesetzt wurden. Leider werden alle Werte mit den gleichen Werten befüllt und somit kann ich das Licht nur ausschalten lassen, wenn sich der Zeitstempel von 2 Readings unterscheidet.

So funktioniert das ganze jetzt:
MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{if (ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
{fhem ("set EG_ku_FSA1_LichtHinten on")}}
elseif
{if (ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FSA1_LichtHinten off"}}

Nochmals vielen Dank und ein schönes Wochenende
Stevie
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Stevie am 26 Oktober 2024, 10:28:15
Guten Morgen,

also das Notify funktioniert so wie ich es mit einschalten erweitert habe aber schreibt mir diesen Fehler ins Log:

2024.10.26 09:35:56 1: PERL WARNING: elseif should be elsif at (eval 254558) line 3.
2024.10.26 09:35:56 3: eval: my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{if (ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
{fhem ("set EG_ku_FS10_LED on")}}
elseif
{if (ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FS10_LED off"}}
2024.10.26 09:35:56 3: CUL_4 IT_set: EG_ku_FS10_LED off
2024.10.26 09:35:57 1: ERROR evaluating my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};my $SELF=   $evalSpecials->{'%SELF'};my $TYPE=   $evalSpecials->{'%TYPE'};{if (ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
{fhem ("set EG_ku_FS10_LED on")}}
elseif
{if (ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FS10_LED off"}}: Can't call method "elseif" on an undefined value at (eval 254558) line 4.

2024.10.26 09:35:57 3: EG_ku_LED_on return value: Can't call method "elseif" on an undefined value at (eval 254558) line 4.

Irgendwie habe ich da wieder einen Fehler eingebaut. Meine Versuche mit elsif oder else haben leider nicht funktioniert.
Bitte um Hilfe!

LG
Stevie
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Gisbert am 26 Oktober 2024, 11:01:44
Hallo Stevie,

dann poste doch mal den log-Eintrag mit elsif - vielleicht wird es dann offenkundiger.

Viele Grüße Gisbert
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: MadMax-FHEM am 26 Oktober 2024, 11:32:27
Zitat von: Stevie am 25 Oktober 2024, 19:58:41So funktioniert das ganze jetzt:
Code Auswählen Erweitern
MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{if (ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
{fhem ("set EG_ku_FSA1_LichtHinten on")}}
elseif
{if (ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FSA1_LichtHinten off"}}

Also folgendes fällt auf:

if(Bedingung){Ausführung}
elsif(Andere Bedingung){Andere Ausführung}

-> dir fallen die Klammern auf? Rund und geschweift?

Statt:

if{...}{...}
elsif{...}{...}


Und:

warum sowas: "wenn das, dann das und wenn was anderes wenn dann" -> if(){}elsif{if(..)...

1. falsche Klammern (siehe eingangs) und
2. bei elsif kannst du GLEICH eine andere Bedingung angeben und musst nicht ein weiteres if "hineinverschachteln" (kann man natürlich, wenn es Sinn macht/gebraucht wird)

Ich denke so ist was du meinst?
MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{if (ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
{fhem ("set EG_ku_FSA1_LichtHinten on")}
elsif(ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FSA1_LichtHinten off"}}
EDIT: (hoffentlich) korrigiert...

Allerdings bin ich nicht sicher, was du damit tust/tun willst / erreichen willst...
Zeitstempelvergelich, hmmm.
Musst du wissen.

Es sieht für mich nach: Licht bei Bewegung/Anwesenheit einschalten aus. U.U. wären andere Einstellungen beim Bewegungs-/Präsenzmelder besser und dann "nur" sowas wie Licht an für bestimmte Zeit, immer, wenn der Präsenzmelder/Bewegungsmelder ein Signal/Anwesenheit schickt...
Dein Notify reagiert auf Endpoint und nicht Ocupancy (finde ich ja schon irgendwie eigenartig)...
Aber ohne lists und weiter Infos ist vieles nur spekulativ...

Aber wenn es für dich jetzt (dann) so (kompliziert) tut...

Gruß, Joachim
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Jamo am 26 Oktober 2024, 11:48:53
... und anstatt "elseif" muss es "elsif" heissen . . .
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Stevie am 26 Oktober 2024, 11:54:46
Vielen Dank für eure schnellen Antworten!

@Gisbert: Mit elsif lässt sich die Änderung nicht speichern:
syntax error at (eval 268997) line 3, near "}
elsif"
syntax error at (eval 268997) line 6, near "}}"

@MadMax: Leider lässt sich der Zustand vom Präsenzmelder nur mit den Timestamps abfragen (siehe oben mein zweiter Beitrag).
Deine Lösung
MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{if (ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
{fhem ("set EG_ku_FSA1_LichtHinten on")}}
elsif(ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FSA1_LichtHinten off"}}
bringt beim speichern
syntax error at (eval 270168) line 3, near "}
elsif"
syntax error at (eval 270168) line 5, near "}}"
Unmatched right curly bracket at (eval 270168) line 5, at end of line
Zeigt die letzte Klammer rot an und wenn ich diese entferne kommt
syntax error at (eval 270356) line 3, near "}
elsif"
syntax error at (eval 270356) line 5, near "}}"
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: MadMax-FHEM am 26 Oktober 2024, 12:01:25
Ja, sorry, da hat sich ein Klammerfehler eingeschlichen :-\

MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{if (ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
{fhem ("set EG_ku_FSA1_LichtHinten on")}
elsif(ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne
ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
{fhem "set EG_ku_FSA1_LichtHinten off"}}

sollte tun.
Allerdings mag ich es nicht so kompakt, da übersieht man schon mal ne Klammer...
Wenn du meine Erläuterungen durch wärst und mal Klammern geprüft, statt nur "einfach wo eine weg" genommen hättest, wärst du verm. selbst drauf gekommen ;)

Etwas übersichtlicher (aber nicht zur Eingabe tauglich? denke ich ;) )
MQTT2_z2t_7384:ZbReceived_0x7384_Endpoint.*
{
  if(ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1")
  {fhem ("set EG_ku_FSA1_LichtHinten on")}
  elsif(ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_Endpoint",0) ne ReadingsTimestamp("MQTT2_z2t_7384","ZbReceived_0x7384_FC11/2001",0))
  {fhem "set EG_ku_FSA1_LichtHinten off"}
}

if(ReadingsVal("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy","") eq "1") ginge bestimmt (besser) auch als if(ReadingsNum("MQTT2_z2t_7384","ZbReceived_0x7384_Occupancy",0) == 1)

Gruß, Joachim
Titel: Aw: Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB
Beitrag von: Stevie am 26 Oktober 2024, 12:19:02
Hi Joachim,

jetzt funktioniert es, vielen Dank!
Natürlich habe ich auch die Klammern geprüft und noch anderes versucht. Leider aber den Fehler nicht gefunden. Ich versteh es iwie nicht. Gibt es da eine gut verstehbare Lektüre? Kannst du mir was empfehlen? Jedesmal für ne kleine 2 Minuten Aufwand Änderung einen Tag mit rumprobieren verbraten ist auch nicht sinnvoll.
Ohne euch hier hätte ich wohl schon lange zu HA wechseln müssen  :)
Vielen Dank euch allen hier und noch ein schönes Wochenende!

LG Stevie