DOIF neue Features (Sleep-Alternative)

Begonnen von Damian, 12 Juli 2015, 21:17:52

Vorheriges Thema - Nächstes Thema

Damian

Liebe DOIF-Nutzer,

der Jahrestag des Moduls kommt immer näher (die erste eingecheckte Version war vom 19.08.2014). Das Modul wird die 10.000er-Grenze der genutzen DOIF-Module zum Jahrestag wahrscheinlich knapp verfehlen. Da wird es an der Zeit das Modul etwas zu tunen ;)

Ich habe heute etwas am Modul gebastelt. Herausgekommen ist, wie schon angekündigt, eine Version, die Befehlssequenzen mit Pausen unterstützt. Diese Version ist wie immer voll abwärtskompatibel zur aktuellen.

Zum Aufspielen: System herunterfahren, Modul aufspielen und System wieder hochfahren (reload funktioniert nicht, da sich Interna geändert haben, evtl. zur Sicherheit ein Backup der config-Datei machen).

Die erweiterte Syntax lautet:

DOIF (Bedingung1) (Kommandos1) (Kommandos2)... DOELSEIF (Bedingung2) (Kommandos3) (Kommandos4)... DOELESE (Kommandos5) (Kommandos6)...

Zwischen den jeweiligen Kommandos lassen sich wait-timer definieren, damit gibt es in DOIF eine Alternative zu sleep.

Beispiel für das Wait-Attribut:

wait 2,3:0,4:0.5,10


Damit würden die Kommandos1 um 2 Sekunden verzögert, Kommandos2 um 3 Sekunden, Kommandos3 haben keine Verzögerung, Kommandos4 4 Sekunden, Kommandos5 0,5 Sekunden Kommanods6 10 Sekunden.

Nun ein Beispiel für einen simulierten on_for_timer:

define di_on_for_timer ([Button:?])
  (set lamp on)
  (set lamp off)
attr di_on_for_timer do resetwait
attr di_on_for_timer wait 0,30


Das wiederholte Betätigen des Tasters setzt die Wartezeit für den zweiten Befehl immer wieder auf 30 Sekunden. Der erste on-Befehl wird dabei nicht wiederholt.

Bei do always würde der Waittimer nicht verlängert.

Bei mehreren DOELSEIF-Fällen wird, wie bisher, der aktuelle Waittimer unterbrochen, wenn ein anderer Fall zuschlägt.

Es handelt sich hierbei um eine Testversion. Die Dokumentation wird noch erweitert. Wer möchte kann die angehängte Version vorab testen.

Weitere Features werden noch zum Jahrestag folgen :)

Gruß

Damian

Edit: letzte Version wurde eingecheckt
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

All-Ex

Hi,

Super, dass die Entwicklung weiter, geht :-)

Für die neue Funktion habe ich auch schon eine Verwendung, momentan nehme ich mehrere sleeps.

Bin schon gespannt, was Du zum Geburtstag zauberst ;-)

Alex

Ralli

Hallo Damian,

vielen Dank für Deine Weiterentwicklung und Deinen tollen Support!

Hast Du nicht Lust, mal eine Roadmap / ToDo-Liste zu posten ;) ?
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Damian

Zitat von: Ralli am 15 Juli 2015, 07:03:02
Hallo Damian,

vielen Dank für Deine Weiterentwicklung und Deinen tollen Support!

Hast Du nicht Lust, mal eine Roadmap / ToDo-Liste zu posten ;) ?

Tja, das Schöne an Hobby-Projekten ist, dass man die Ziele und die Realisierungszeitpunkt  selbst bestimmen kann. Und wenn etwas zu komplex wird, dann verschiebt man es einfach auf später, ohne dass einem der Kopf abgerissen wird (das ist bekanntlich auf der Arbeit anders ;)). Da ich selbst im Urlaub noch einige andere Hobby-Projekte habe, will ich nichts versprechen, meine aktuelle todo-Liste, die sich immer wieder ändert, kann ich aber hier posten.

0) Wait innerhalb von Befehlssequenzen (erledigt)
1) Nur ein Trigger für gleiche Zeitangaben, um Abarbeitungsreihenfolge sicherzustellen (aufwändig)
2) Kommentare innerhalb von DOIF-Definitionen eingeleitet mit # bis zum Ende der Zeile
3) Datumsangaben (aufwändig)

Datumsangaben mit Uhrzeit (mit Triggerung bzw. ohne Triggerung mit Fragezeichen wie bisher) [YYYY-MM-TT HH:MM[:SS]]  oder [MM-TT HH:MM[:SS]] oder [TT HH:MM[:SS]]

Beispiel

[2015-10-30 10:00] oder [10-30 10:00]  oder [30 10:00] oder Zeitintervalle [2015-10-30 10:00 - 2016-10-30 10:00] oder vom 1. September 10 Uhr bis zum ersten April 20:00 Uhr [09-01 10:00 - 04-01 20:00] oder vom ersten 10:00 Uhr bis 15. 20:00 Uhr [-01 10:00 - -15 20:00]

Datumsangaben ohne Zeitangabe: [YYYY-MM-TT] oder [MM-TT] oder [MM-] oder [-TT].

Bespiel: An meinem Geburtstag [02-26], nur im Februar [02-], immer am 15. des Monats [-15]

Beispiel mit Intervallen: Heizung soll laufen von September bis April [09- - 04-] oder vom 15.09 bis zum 30.04 [09-15 - 04-30]

(das "bis-Zeichen" muss dann mit Leerzeichen angegeben werden)

4. disable/enable per set (Zustand soll nach Neustart erhalten bleiben)


set di disable (timer werden  gelöscht, state disable)

set di enable (timer werden neu gesetzen, state initialized)


5. Mehrere DOIF-Fälle innerhalb eines Moduls

DOIF (...) (...)
DOELSEIF (...) (...)
DOELSE (...)
DOIF (...) (...)
DOELSEIF (...) (...)
DOELSE (...)

DOELSEIF und DOELESE beziehen sich immer auf den vorhergehenden DOIF-Fall

6.  Mehrere Bedingungen, die zum gleichen Kommando (gleichen Zustand) führen, können angegeben werden (es wird nur die jeweilige Bedingung, zu der ein Ereignis eintritt, überprüft)

DOIF (<Bedingung1>)|(<Bedingung2)|... (<Kommandos>)

So, mal schauen, was sich davon im kommenden Monat umsetzen lässt.

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ralli

Dankeschön!

Wichtig wäre m.E. noch die Problematik, dass DOIF bereits Kommandos ausführt, obwohl nach einem Restart (relative oder absolute) Zeitangaben noch nicht schlüssig durchinitialisiert sind.

Toll auch die Möglichkeit des Einbaus von Datums, Wochentagen, Tagen usw.
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Damian

Zitat von: Ralli am 15 Juli 2015, 10:23:39
Dankeschön!

Wichtig wäre m.E. noch die Problematik, dass DOIF bereits Kommandos ausführt, obwohl nach einem Restart (relative oder absolute) Zeitangaben noch nicht schlüssig durchinitialisiert sind.

Toll auch die Möglichkeit des Einbaus von Datums, Wochentagen, Tagen usw.

ja, wird bis dahin auch erledigt sein.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ralli

Feature 0 kommt mir gerade sehr gelegen - so kann ich schön kontrolliert hintereinander ein paar Kommandos an diverse Sonos absetzen beim morgendlichen Wecker mit Gruppendefinition.
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

MarkusN

Super Sache. DOIF entwickelt sich immer mehr zum Schweizer Taschenmesser in FHEM. Hat schon unzählige notify und at abgelöst, und jetzt offenbar auch noch ein watchdog wenn ich es richtig verstanden habe.

Danke Damian, mach weiter so!

Damian

Zitat von: MarkusN am 15 Juli 2015, 12:50:03
Super Sache. DOIF entwickelt sich immer mehr zum Schweizer Taschenmesser in FHEM. Hat schon unzählige notify und at abgelöst, und jetzt offenbar auch noch ein watchdog wenn ich es richtig verstanden habe.

Danke Damian, mach weiter so!

wait als watchdog-Ersatz gab es immer schon. Jetzt gibt es wait zwischen den einzelnen Befehlen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ralli

... da fehlt nur das, was dem "echten" watchdog auch fehlt: Device-übergreifende Funktionalität ;).
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Damian

Zitat von: Ralli am 15 Juli 2015, 13:37:42
... da fehlt nur das, was dem "echten" watchdog auch fehlt: Device-übergreifende Funktionalität ;).

ja, das widerspricht jedoch dem Konzept des DOIF-Moduls, Bedingungen von Perl überprüfen zu lassen - das geht nur mit konkreten Bezeichnern, wie in jeder höheren Programmiersprache.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MarkusN

Zitat von: Damian am 15 Juli 2015, 13:22:54
wait als watchdog-Ersatz gab es immer schon. Jetzt gibt es wait zwischen den einzelnen Befehlen.

Gruß

Damian

Aber jetzt kann ich (wie in deinem simulierten on-for-timer Beispiel) alles mit einem DOIF abbacken, oder nicht? Ich schalte bei einer gemeldeten Bewegung die Lampe ein, und schalte sie aus wenn innerhalb der nächsten zwei Minuten keine weitere Bewegung stattfindet. Habe ich bisher durch ein DOIF und watchdog umgesetzt.

Damian

Zitat von: MarkusN am 15 Juli 2015, 14:21:27
Aber jetzt kann ich (wie in deinem simulierten on-for-timer Beispiel) alles mit einem DOIF abbacken, oder nicht? Ich schalte bei einer gemeldeten Bewegung die Lampe ein, und schalte sie aus wenn innerhalb der nächsten zwei Minuten keine weitere Bewegung stattfindet. Habe ich bisher durch ein DOIF und watchdog umgesetzt.

Das war auch Ziel der Übung. Es war insb. mein Anliegen den on-for-timer mit einem DOIF-Modul abzudecken und nicht so umständlich mit zwei, wie in der bisherigen Commandref zu DOIF. Das zweite wichtige Anliegen war die sleeps zu umgehen oder die abenteuerlichen
at-Konstruktionen, die man umständlich löschen musste, wenn sie nicht zum Zuge kommen sollten.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Wo du oben über Features gesprochen hast. (Offtopic hier)
Ich meine mal von dir gelesen zu haben, dass du an folgendes Thema nicht rangehen willst, aber ich frage doch einmal: :-)

Könntest du in deinem DOIF-Modul nicht eigentlich auch eine Art "Random"-Intervall einbauen?
Man könnte ein Zeitintervall [08:00-18:00] vorgeben, in dem - analog deiner Zeitraster-Idee - nach dem Zufallsprinzip die CMDs ausgeführt werden.


define di_lampe DOIF ([08:00-18:00] and [~:15])
    (set lampe on)
DOELSE
    (set lampe off)


Der obere Code ist natürlich nur ne Idee. Ich habe keine Ahnung, welches Zeichen man als Platzhalter dafür nutzen könnte.

Das nur so am Rande. :-)

Damian

#14
Zitat von: FunkOdyssey am 15 Juli 2015, 15:55:32
Wo du oben über Features gesprochen hast. (Offtopic hier)
Ich meine mal von dir gelesen zu haben, dass du an folgendes Thema nicht rangehen willst, aber ich frage doch einmal: :-)

Könntest du in deinem DOIF-Modul nicht eigentlich auch eine Art "Random"-Intervall einbauen?
Man könnte ein Zeitintervall [08:00-18:00] vorgeben, in dem - analog deiner Zeitraster-Idee - nach dem Zufallsprinzip die CMDs ausgeführt werden.


define di_lampe DOIF ([08:00-18:00] and [~:15])
    (set lampe on)
DOELSE
    (set lampe off)


Der obere Code ist natürlich nur ne Idee. Ich habe keine Ahnung, welches Zeichen man als Platzhalter dafür nutzen könnte.

Das nur so am Rande. :-)

Was soll in deinem Beispiel der Zufall sein? Ungefähr 15 Minuten, plus minus welche Abweichung?

Das kannst du heute schon haben, hier alle 15 Minuten (nach Zeitraster ausgerichtet) plus Zufall von 60 Sekunden.

define di_lampe DOIF ([08:00-18:00] and [([+:15]+rand(60))])
    (set lampe on)
DOELSE
    (set lampe off)


Da man in der Bedingung mit Zeiten rechnen kann, kannst du jeden erdenklichen Zufall einbauen ;)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF