Hauptmenü

Aktuellen Zeitpunkt in DOIF

Begonnen von Superposchi, 13 September 2021, 09:07:52

Vorheriges Thema - Nächstes Thema

Superposchi

Ich würde gerne vom einem aktuellen Zeitpunkt aus gesehen in einer relativen Zeit (aus einem Reading) ein Device schalten.

In der commandRef habe ich gelesen wie man Zeiten addiert und auch aus Readings Zeitangaben dafür nutzt.
Es wird auch ein Beispiel mit Sunset aufgeführt. Doch ich habe nirgendwo etwas dazu gefunden wie man die Zeit auf den aktuellen Zeitpunkt addiert, also sowas wie:
([({now()}+ ([Reading]

Gibt es sowas wie now() und falls ja, wie lautet der genaue Ausdruck für den aktuellen Zeitpunkt?

Sany

Moin,

es gibt schon Möglichkeiten, die aktuelle Zeit auszugeben, und auch damit zu rechnen. Allerdings denke ich mal, dass das in einem DOIF scheitert: Es werden mit irgendwie definierten Zeiten ja timer definiert, zu denen dann etwas ausgeführt wird. Das Problem ist das "Jetzt". Wie soll DOIF einen Timer definieren, selbst wenn Du noch was draufrechnest. "Jetzt" ist halt "immer", aber immer nur für den Moment. Du kannst es definieren, bekommst aber nur den Definitionszeitpunkt als "jetzt" + irgendwas gerechnetes. Macht aber irgendwie keinen Sinn (für eine Automation). Für Tests mag das ja passen.

beispiel:
defmod di_timeTest DOIF ([({strftime("%H:%M:%S",localtime)})])\
  ()\
DOELSEIF\
([({strftime("%H:%M:%S",localtime)}) + 3600])\
  ()

(als RAW einfügen)((und vermutlich gibts noch zig andere Möglichkeiten, wie immer in PERL))

Schildere doch mal, was Du damit vorhast.

Gruß
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Superposchi

Das "Jetzt" sollte sich auf den Auslösezeitpunkt beziehen, also hätte man doch einen definierten Zeitpunkt. Nämlich Auslösezeitpunkt plus X. Wenn es dafür eine andere Lösung gibt bin ich offen für Vorschläge.

Hintergrund ist, dass ich mir einen variablen Timer für einen Ventilator (kann aber auch jedes andere Gerät sein) basteln will.
Die Verzögerung X soll dabei variabel sein, daher aus einem Reading (welches aus FTUI befüllt werden könnte) ausgelesen werden.
Das Problem ist halt, dass es keinen festen Auslösezeitpunkt gibt, sondern das Gerät jederzeit eingeschaltet werden kann.

Spontan wäre vielleicht das Datum des state-Readings noch geeignet um das "Jetzt" zu umgehen.

Elektrolurch

Anscheinend geht es doch trivial darum, zu einem Auslösezeitpunkt etwas definiert verzögert zu tun.
DOIF hat da das Attribut wait.
Elektrolurch
configDB und Windows befreite Zone!

MadMax-FHEM

Ein notify auf die Auslöseverzögerung (also auf das Setzen des Auslöseverzögerungswertes im FTUI) und dann entweder ein "relatives" at mit eben dem Wert aus dem Reading/Event anlegen...
...oder kurz und schmerzlos: sleep ZeitAusReading/Event set Device Wert

Wenn mit at oder benamsten sleep, kannst du sogar zu Beginn abbrechen und dann erst neu setzen oder bei at mit defmod arbeiten, dann wird jede Änderung am Verzögerungswert in ein neu passendes at "umdefiniert"...

EDIT: oder mal MSwitch anschauen (ist halt [noch] nicht mehr? im offiziellen fhem Repository / muss also "manuell" installiert werden / wird aber im Forum supported)

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)

betateilchen

Zitat von: Superposchi am 13 September 2021, 09:07:52
Ich würde gerne vom einem aktuellen Zeitpunkt aus gesehen in einer relativen Zeit (aus einem Reading) ein Device schalten.

Mit "on-for-timer" kannst Du verzögertes Ausschalten realisieren,
mit "off-for-timer" kannst Du verzögertes Einschalten realisieren, vorausgesetzt, das device ist gerade ausgeschaltet.

Beide Varianten gehen immer vom aktuellen Zeitpunkt aus.

Schwierig wird das allenfalls bei Homematic Geräten, die - wenn ich mich recht erinnere - kein off-for-timer kennen. Aber auch dafür gibt es Lösungen.


--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Superposchi

@Elektrolurch
Das wait kann aber nicht aus FTUI verändert werden soweit ich weiß.

@MadMax-FHEM
Mit einem at könnte ich auf eine veränderbare Verzögerung reagieren. Geht das mit sleep auch?
In beiden Fällen müsste aber zwei Steuerdevice existieren soweit ich das verstehe und das würde ich gerne vermeiden wenn machbar. Aber auf Anhieb fällt mir auch nichts anderes ein.

Das Mswitch muss ich mir in Ruhe ansehen.

@betateilchen
Es handelt sich bei dem zu schaltenden Device um ein Tuya-Gerät das per Fhempy angesteuert ist, da gibt es on/off-for-timer leider nicht. Jedenfalls kann ich es nicht per Set-Befehl finden.

Was ist denn mit der Idee den Timestamp des state plus der Verzögerung zu nutzen. Würde das gehen?
Wenn nicht bleibt wirklich nur diese doppel-device-lösung mit dem at

MadMax-FHEM

Doppel-Device ist es ja nur kurzzeitig...

Das notify was auf eine Änderung deiner Verzögerung von FTUI reagiert bleibt nat. Dauerhaft.

Das at existiert ja nur von: Erstellung bis verzögerte Auslösung (danach ist es ja "weg")...

Ein at hat halt den Vorteil, dass du einfach defmod mit dem Namen des temporären-at nutzen kannst und somit alles in einem Befehl abarbeiten kannst.
Bei einem "named sleep" müsstest (solltest) du ja erst mal ein cancel auf das (evtl.) bestehende sleep machen, bevor du ein gleichnamiges neues sleep anlegst...

Also:

du stellst eine Verzögerung ein -> at wird angelegt (oder modifiziert) / du änderst deine Mainung VOR Ablauf -> defmod auf at -> neue Verzögerung (modifiziertes at) wird angelegt, "altes" at "abgebrochen"

du stellst eine Verzögerung ein -> named sleep / du änderst deine Meinung VOR Ablauf -> cancel des named sleep und anlegen eines neuen named sleep (also 2 Schritte)

Zumindest sehe ich das (aktuell) so...

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)

Sany

ZitatDas Problem ist halt, dass es keinen festen Auslösezeitpunkt gibt, sondern das Gerät jederzeit eingeschaltet werden kann.

Spontan wäre vielleicht das Datum des state-Readings noch geeignet um das "Jetzt" zu umgehen.

Ich versteh's immer nocht nicht ganz, was Du willst.
Zitatdas Gerät jederzeit eingeschaltet werden kann
bedeutet das, ein Gerät wird irgendwie irgendwann eingeschaltet (also von Hand, ohne fhem?)
und jetzt willst Du es nach einer einstellbaren Zeit ausschalten?

Also: wer schaltet wann was und was soll dann variabel zeitverzögert geschehen.

fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Superposchi

@MadMax-FHEM
Das ist mir irgendwie zu kompliziert.
Ich will nichts canceln, warum sollte man einen selbsterstellten Timer canceln?

Es soll einfach nur auf ein Event (Das Einschalten des Ventilators) reagiert werden und dieser in x Stunden wieder ausgeschaltet werden. Mit festen Zeiten wäre das gar kein Problem. Es wird erst durch die wechselbare Verzögerungszeit und den variablen Auslösezeitpunkt komplex.

Außerdem verstehe ich nicht warum ich das at beim auslösen des notify erst erstellen soll - weiß gar nicht wie das funktionieren soll.

@Sany
Du hast es doch exakt geschrieben. Der Ventilator wird von Hand oder durch die SmartLife-App oder sogar durch Fhem eingeschaltet was ein Event auslöst (state wechselt auf on). Ausgehend von diesem Event soll Zeitverzögert das Gerät wieder ausgeschaltet werden. Dabei soll die Verzögerung einstellbar sein und darum einem Reading entnommen werden.

antonwinden

wait kann sehr wohl verändert werden mit einem dummy.
attr:
     wait:
       0:
         0
         [BeregnungDauer:dauer]
         0
         [BeregnungDauer:dauer]

gruß anton
KNX, Raspberry, Denon 3313, Philips TV, Xtrend9X00 und viel Optimismus...

Superposchi

@antonwinden
Du meinst "attr. <Device> wait <Wert>" oder was?
Das wird doch dann nicht in die Konfiguration gespeichert.

Ansonsten weiß ich nicht was du mit dieser Schreibweise meinst

MadMax-FHEM

Zitat von: Superposchi am 13 September 2021, 13:38:18
@MadMax-FHEM
Das ist mir irgendwie zu kompliziert.
Ich will nichts canceln, warum sollte man einen selbsterstellten Timer canceln?

Cancel ist ja NUR beim sleep notwendig/ratsam und ich habe das auch nur ausführlich geschrieben, weil ich dachte du wolltest es wissen...
...werde ich einfach zukünftig lassen...

Beim at macht das ja das defmod...

Zitat von: Superposchi am 13 September 2021, 13:38:18
@MadMax-FHEM
Es soll einfach nur auf ein Event (Das Einschalten des Ventilators) reagiert werden und dieser in x Stunden wieder ausgeschaltet werden. Mit festen Zeiten wäre das gar kein Problem. Es wird erst durch die wechselbare Verzögerungszeit und den variablen Auslösezeitpunkt komplex.

Außerdem verstehe ich nicht warum ich das at beim auslösen des notify erst erstellen soll - weiß gar nicht wie das funktionieren soll.0

Jetzt bin ich verwirrt: ich dachte du wolltest irgendwo die Verzögerung ändern und auf die Anpassung der Verzögerung (darauf dann eben das notify) etwas einschalten und verzögert ausschalten (oder andersrum)?

Dann eben ein notify auf das Ein-/Ausschalten und da dann eben

define nOnOff notify Device:on defmod atName at +VerzögerungAusReading set Device off/on

also mal als "Pseudocode"...

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)

MadMax-FHEM

Zitat von: Superposchi am 13 September 2021, 13:46:19
@antonwinden
Du meinst "attr. <Device> wait <Wert>" oder was?
Das wird doch dann nicht in die Konfiguration gespeichert.

Ansonsten weiß ich nicht was du mit dieser Schreibweise meinst

Ich schätze mal bei einem DOIF das eben schalten/reagieren soll...

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)

Thyraz

Er beschreibt ein wait Attribut für ein Doig, welches keine feste Wartezeit hat sondern dies aus einem Reading entnimmt.
Also an sich genau das was du beschrieben hast.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

MadMax-FHEM

Zitat von: Thyraz am 13 September 2021, 13:54:21
Er beschreibt ein wait Attribut für ein Doig, welches keine feste Wartezeit hat sondern dies aus einem Reading entnimmt.
Also an sich genau das was du beschrieben hast.

Bis auf doIG ;) stimme ich zu...
...zumindest was ich denke verstanden zu haben was denn gewünscht/gewollt ist... ;)

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)

Thyraz

Kennst du das noch nicht?  ;D

ZitatDOIG (ausgeprochen: du ig, übersetzt: tue ig) ist ein universelles Modul mit Web-Interface, welches ereignis- und zeitgesteuert in Abhängigkeit definierter Bedingungen Anweisungen ausführt.

...

https://fhem.de/commandref_DE.html#DOIG

Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

antonwinden

ist ein dummy das so definiert ist:
define BeregnungDauer dummy
attr BeregnungDauer userReadings dauer {my $t1 = ReadingsVal("BeregnungDauer","state",0);$t1*60}
und dann im DOIF regner1 (startet bei mir zu einem Zeitpunkt)
attr regner1 wait 0,[BeregnungDauer:dauer],0,[BeregnungDauer:dauer]
damit kann ich mit dem dummy die Wartezeit einstellen in Minuten
gruß Anton
KNX, Raspberry, Denon 3313, Philips TV, Xtrend9X00 und viel Optimismus...

Damian

oder als Einzeiler:

DOIF {[lampe:"on"];set_Exec("timer",120,"set lampe off")}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Superposchi

Zitat...werde ich einfach zukünftig lassen...
Bitte nicht immer gleich eingeschnappt sein. Ich habe nur gesagt das es übers Ziel hinaus schießt und zu viel ist. Was im übrigen gerade für den ganzen Thread ehrlich gesagt gilt - ich verstehe jedenfalls praktisch gar nichts mehr.

Also am einfachsten ist noch die Lösung mit dem doppelten notify von MadMax-FHEM

DOIF {[lampe:"on"];set_Exec("timer",120,"set lampe off")}Dazu hätte ich aber die Frage was ist timer und woher kommen die 120?

Thyraz

Ich erlaube mir mal die Commandref für dich zu öffnen. ;)
https://fhem.de/commandref_DE.html#DOIF_set_Exec

Die 120 sind ein Beispiel für eine Verzögerung.
Das musst du durch deine Verzögerung anpassen.

Da du diese aus einem Reading lesen willst,
musst du die 120 dann eben durch den Funktionsaufruf zum Lesen einer Nummer aus einem Reading ersetzen:

Siehe die Funktion ReadingsNum in diesem Kapitel:
https://fhem.de/commandref_DE.html#perl
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Sany

ich glaube mal superposchi wollte eine Lösung mittels (klassischem) DOIF.
Mir war anfangs nicht klar, was das DOIF genau können soll, er hat es aber nachgeliefert und die Aufgabenstellung ist schon ganz anders als im ersten Post, aber könnte in klassischem DOIF so aussehen:
defmod di_timeTest DOIF ([timeTest:"on"])\
  (set timeTest off)
attr di_timeTest uiTable {\
package ui_Table;;\
}\
\
widget([$SELF:delay],"selectnumbers,0,1,100,0,lin")\

attr di_timeTest userReadings TriggerTime,delay
attr di_timeTest wait {[$SELF:delay] * 60}

und
defmod timeTest dummy
attr timeTest setList on off


Du kannst die beiden Devices per RAW mal anlegen. Dann den Dummy einmal schalten damit er einen Zustand hat. Danach kannst Du per Dropdown im DOIF eine Zeit in Minuten auswählen, sobald Du dann den Dummy auf "on" schaltest wird im DOIF der Timer gesetzt, und zwar die eingestellen Minuten * 60. Das zeigt, dass man sehr wohl die wait-Zeit anpassen kann, allerdings geht das nur, solange der Timer noch nicht erzeugt ist. Wenn er schon läuft, und man ändert den Timer-Wert, wird der Timer gelöscht.
Ausgelöst wird per Event vom timeTest Dummy, das mußt Du für Deinen Anwendungsfall entsprechend anpassen.
Und wie Du die delay-Zeit änderst bleibt Dir auch vollständig überlassen, hier ist es als Eingabe im DOIF mit ui_Table gelöst. Du musst halt den Inhalt des Readings ändern.

Viel Erfolg!

P.S. Damians Lösung wäre auch meine gewesen, ist halt DOIF-Perl, und ich wollte Dich nicht noch mehr verwirren.
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

MadMax-FHEM

Zitat von: Superposchi am 13 September 2021, 14:38:20
Bitte nicht immer gleich eingeschnappt sein. Ich habe nur gesagt das es übers Ziel hinaus schießt und zu viel ist. Was im übrigen gerade für den ganzen Thread ehrlich gesagt gilt - ich verstehe jedenfalls praktisch gar nichts mehr.

Alles gut.
Werde nur (versuchen) "unnötige Ausführungen" zu lassen...
(allerdings neige ich ja eher dazu versuchsweise weitere Aspekte schon mal "voreilend" zu erwähnen, weil meistens [über kurz oder lang] wird dann eh [genau darüber] "gestolpert" ;)  )

Zitat von: Superposchi am 13 September 2021, 14:38:20
Also am einfachsten ist noch die Lösung mit dem doppelten notify von MadMax-FHEM

Aber nur für mich, weil ich (immer noch) kein DOIF nutze ;)

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)