Hi zusammen,
inzwischen ist es unglaublich, wie hilfreich AI-LLMs auch für FHEM sind. Viele Lösungen habe ich inzwischen umgesetzt, ohne die manuelle Hilfe dieses Forums in Anspruch nehmen zu müssen 8) Hier jedoch scheitere ich bisweilen, wenngleich ich überzeugt bin, dass es lösbar sein muss.
Szenario:
Ein Reading "energy_added" meines Elektroautos gibt mir während des Ladens alle X Sekunden Updates rein, wieviele kWh bereits aufgeladen worden sind. Der Wert aktualisiert sich also permanent. Ich möchte den finalen(!) Wert gern in ein Filelog Device schreiben, nachdem der Ladevorgang abgeschlossen ist.
Weiterhin liefert ein Reading "state" den Status "charging" und nach Beendigung des Ladevorgangs kurzzeitig den Wert "online".
D.h. wenn der Zustand von "charging" zu "online" wechselt, möchte ich den aktuellen Wert in ein Filelog schreiben.
Ich habe etliche Lösungsansätze verfolgt, komme aber einfach auf keinen grünen Zweig. Der Befehltsteil, also das Übernehmen in ein Filelog, ist kein Problem. Ich hänge fest, wie ich die Zustandsänderung ermitteln und daraus ein Event generieren kann, um das ganze Vorgaben z.B. in einem DOIF umzusetzen.
Alternativ hatte ich erfolglos versucht, den Timestamp des Readings "energy_added" mit der aktuellen Uhrzeit zu vergleichen, um zu ermitteln, ob die letzte Wertänderung länger als (zb) 120 Sekunden zurückliegt (was ebenso bedeuten würde, dass der Ladevorgang abgeschlossen ist). Aber auch das Stichwort "Timer" ist für mich ein Problem
Könnt Ihr weiterhelfen?
Wo ist da das Problem, wenn es einen Wechsel von charging auf online gibt?
notify/DOIF auf online und dann deinen Code für's Filelog, den du ja hast...
Wenn du nicht selbst anlegen willst: Eventmonitor, auf das Event online warten und notify/DOIF anlegen lassen...
EDIT: Alternative oder Antwort auf deinen Titel: watchdog
Gruß, Joachim
Edit: Joachim war schneller ;)
Deine Überschrift:
ZitatEvent auslösen, nachdem ein Reading XY Sek. NICHT mehr aktualisiert wurde?
--> watchdog watchdog (https://wiki.fhem.de/wiki/Watchdog)
Aber das ist ja nicht was du willst. Du willst eventuell ein notify:
defmod meinAutoIstFertigNotify notify Ladegeraet:state:online.* { fhem("setreading DevFuerFileLog energy_added ".ReadingsNum("$NAME", "energy_added", 0)); }
hab das nur ins unreine geschrieben. Aber im Prinzip sollte das passen.
Aber state taucht nur auf, wenn stateEvent oder so gesetzt ist.
Ansonsten meine ich kommt beim state Reading der Name state nicht mit...
EDIT: am einfachsten über Eventmonitor...
Gruß, Joachim
Du kannst beim DOIF das Attribut wait in Kombination mit dem Attribut do resetwait nutzen
DOIF(Trigger auf das Reading) (mach etwas)
attr wait 300
attr do resetwait
Bedeutet:
Solange der Trigger innerhalb von 300 Sekunden kommt, wird der Wait-Timer zurückgesetzt. In Umkehr bedeutet es, wenn 300 Sekunden nach dem letzten Trigger nichts mehr kommt, dann wird etwas ausgeführt.
Zitat von: MadMax-FHEM am 18 Dezember 2024, 20:43:26ber state taucht nur auf, wenn stateEvent oder so gesetzt ist.
Das stimmt wohl. Dann eher ... notify Ladegeraet:online.* ... für jedes Event des Ladegeraets / der Wallbox das mit "online" beginnt.
Zitat von: MadMax-FHEM am 18 Dezember 2024, 20:43:26EDIT: am einfachsten über Eventmonitor...
Aber genau für dieses Event muss er doch dann warten bis das Auto voll geladen ist...
Ja, muss er halt einmal...
Dafür stimmt dann das notify auch 100%ig :)
Gruß, Joachim
https://forum.fhem.de/index.php?topic=49408.0
z.B.:
attr ... readingsWatcher 360,,transmission-state erzeugt ein Event, wenn seit 6 Minuten keine Reaktion des Gerätes mehr erfolgt ist
Moin Leute, ich habs heute Nacht ganz einfach so gemacht
defmod doif_BEV_energy_check DOIF (
[MQTT2_BEV:cars_1_geofence] eq "<hier steht der geofence name>" and
[MQTT2_BEV:cars_1_state] eq "online" and
[MQTT2_BEV:cars_1_state_old] eq "charging"
)
(set dummy_BEV_energy_added [MQTT2_BEV:cars_1_charge_energy_added])
(setreading MQTT2_BEV cars_1_state_old online)
DOELSEIF
(
[MQTT2_BEV:cars_1_geofence] eq "<hier steht der geofence name>" and
[MQTT2_BEV:cars_1_state] eq "charging"
)
(setreading MQTT2_BEV cars_1_state_old charging)
Getestet in der Simulation scheint es wie gewünscht zuklappen.
Zitat von: Damian am 18 Dezember 2024, 20:53:53Du kannst beim DOIF das Attribut wait in Kombination mit dem Attribut do resetwait nutzen
DOIF(Trigger auf das Reading) (mach etwas)
attr wait 300
attr do resetwait
Bedeutet:
Solange der Trigger innerhalb von 300 Sekunden kommt, wird der Wait-Timer zurückgesetzt. In Umkehr bedeutet es, wenn 300 Sekunden nach dem letzten Trigger nichts mehr kommt, dann wird etwas ausgeführt.
Das ist allerdings ein sehr guter Hinweis.
Ich habe ständig den Gedanken "jetzt ein Timer nutzen, der runterzählt", wenn ich etwas in FHEM baue. Und immer fehlt mir solch eine Funktion.
Werde ich mir merken.
Zitat von: canis am 18 Dezember 2024, 22:02:44https://forum.fhem.de/index.php?topic=49408.0
z.B.:
attr ... readingsWatcher 360,,transmission-state erzeugt ein Event, wenn seit 6 Minuten keine Reaktion des Gerätes mehr erfolgt ist
Danke, auch cool