Notify wenn Zeitstempel Device.ReadingA nicht gleich Device.ReadingB

Begonnen von Stevie, 25 Oktober 2024, 18:37:52

Vorheriges Thema - Nächstes Thema

Stevie

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?
FHEM aktuell|DS716II mit Debian Bullseye|CUL433 IT|CUL868 MAX!|Jeelink PCA301+LaCrosse|HM-LAN|VCCU|Fritzbox6590|Withings|APC|Echo, Dot, Show|Alexa|Harmony|Ring|Tasmota|fhempy

Gisbert

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
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Stevie

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
FHEM aktuell|DS716II mit Debian Bullseye|CUL433 IT|CUL868 MAX!|Jeelink PCA301+LaCrosse|HM-LAN|VCCU|Fritzbox6590|Withings|APC|Echo, Dot, Show|Alexa|Harmony|Ring|Tasmota|fhempy

Stevie

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
FHEM aktuell|DS716II mit Debian Bullseye|CUL433 IT|CUL868 MAX!|Jeelink PCA301+LaCrosse|HM-LAN|VCCU|Fritzbox6590|Withings|APC|Echo, Dot, Show|Alexa|Harmony|Ring|Tasmota|fhempy

Gisbert

Hallo Stevie,

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

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

MadMax-FHEM

#5
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Jamo

... und anstatt "elseif" muss es "elsif" heissen . . .
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

Stevie

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 "}}"
FHEM aktuell|DS716II mit Debian Bullseye|CUL433 IT|CUL868 MAX!|Jeelink PCA301+LaCrosse|HM-LAN|VCCU|Fritzbox6590|Withings|APC|Echo, Dot, Show|Alexa|Harmony|Ring|Tasmota|fhempy

MadMax-FHEM

#8
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Stevie

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
FHEM aktuell|DS716II mit Debian Bullseye|CUL433 IT|CUL868 MAX!|Jeelink PCA301+LaCrosse|HM-LAN|VCCU|Fritzbox6590|Withings|APC|Echo, Dot, Show|Alexa|Harmony|Ring|Tasmota|fhempy