Hauptmenü

DOIF: neue Zeit-Features

Begonnen von Damian, 29 März 2015, 22:16:05

Vorheriges Thema - Nächstes Thema

Damian

Ich habe heute das schlechte Wetter genutzt und neue Zeit-Features ins Modul eingebaut.

1. Zeitraster wie hier beschrieben

Beispiele:

[+:MM] MM sind Minutenangaben zwischen 1 und 59

Beispiele:

[+:30] zur vollen und zur halben Stunde
[+:10] um XX:00 XX:10 XX:20 XX:30 XX:40 XX:50
[+:15] um XX:00 XX:15 XX:30 XX:45
usw.

[:MM] MM sind Minutenangaben und können zwischen 00 und 59 sein.

Beispiele:

[:00] zur vollen Stunde
[:05] immer fünf nach
[:15] immer viertel nach
[:30] immer um halb
usw.

[+[h]:MM] mit: h sinnvollerweise zwischen 2 und 23 und MM zwischen 00 und 59

Beispiel:

[+[2]:10] um 00:10 02:10 04:10 06:10 08:10 usw.


2. Rechnen mit Zeit: Beliebige Perlausdrücke in Kombination mit Zeitangaben im üblichen Format: HH:MM, Readings oder Stati sowie Perlfunktionen.

Beispiele:

relative Zeitangaben in Sekunden: Trigger alle 100 Sekunden

DOIF ([+100]) (set bla on)


absolute Angaben in Sekunden: 7200 Sekunden nach Mitternacht:

DOIF ([7200]) (set bla on)

Sekundenangaben über Stati oder Readings:

define Zeit dummy
set Zeit 300

Hier 300 Sekunden nach Mitternacht:

DOIF ([[Zeit]]) (set bla on)


Hier in 300 Sekunden:

DOIF ([+[Zeit]]) (set bla on)

Dast Setzen des Dummys Zeit wird sofort im Modul berücksichtigt, z. B.

[set Zeit 00:10

Zeitberechnungen:

Berechnungen werden in runde Klammern gesetzt. Es können beliebige Ausdrücke der Form HH:MM mit Sekundenangaben in Rechenoperationen (was Perl so hergibt) kombiniert werden.  Sie können direkt angegeben werden oder aus Funktionen, Stati oder Readings kommen.

Zeitangaben mit Perlfunktionen: Sunnenuntergang um bis zu 10 Minuten zufällig verzögern:

DOIF ([({sunset()}+int(rand(600)))]) (set bla on)

Kombination aus Zeitangaben und Sekundenangaben: Zufällige Verzögerung bis zu 10 Minuten nach 10:00 Uhr

DOIF ([([10:00]+int(rand(600)))]) (set bla on)

Kombination aus Stati oder Readings mit Sekundenangaben:



define Zeit dummy
set Zeit 10:00

DOIF ([([Zeit]+int(rand(600)))]) (set bla on)


oder relative Angaben: hier wird alle 5 Minuten getriggert

set Zeit 00:01

DOIF ([+([Zeit]+[00:04])]) (set bla on)


Hier eine Kombination mit Zeitintervallen: Hier von 09:55 bis 10:05 am Freitag

set Zeit 10:00

DOIF ([([Zeit]-[00:05]) - ([Zeit]+[00:05])]|5]) (set bla on)


Hier noch mal mit Zufall beeinflusst:

DOIF ([([Zeit]-[00:05]- int(rand(300))) - ([Zeit]+[00:05]+int(rand(300)))]|5]) (set bla on)

Man kann beliebig Zeitangaben mit Perlfunktionen und Readings bzw. Stati kombinierten. Da auch hier der Perlinterpreter zum Zuge kommt, sind die Möglichkeiten Zeit zu berechnen unbegrenzt.

Alles ist natürlich abwärtskompatibel zum bisherigen Modul.

Edit: Diese Version wurde bereits eingecheckt.

Gruß

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

kvo1

Hallo damian

danke für dein super Modul und die.  Erweiterung
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

KernSani

Cool. Aktuell sehe ich persönlich zwar nichts, wo ich es brauchen würde, aber ich bleibe mal dran und werde ggf. ein bisschen testen...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

cwagner

Yippih! Dann könnte ich ein weiteres AT ersetzen (alle 15 wird ein Routine aufgerufen, der den Vorlauf meiner Heizung auf den Bedarf anpasst).

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

frank

ich habe so das gefühl, dass FHEM bald DOIF heisst.  ;)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Damian

#5
Zitat von: frank am 30 März 2015, 17:35:53
ich habe so das gefühl, dass FHEM bald DOIF heisst.  ;)


Wollen wir nicht hoffen ;)

So, ich habe meine Testphase abgeschlossen. Testversion ist im ersten Post angehängt. Doku fehlt noch, dafür habe ich alle wichtigen  Neuerungen anhand von Beispielen im ersten Post dargestellt.

Gruß

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

flurin

Danke für die Erweiterungen.
Eine Frage: gibt es eine Möglichkeit, einen Befehlt z.B. 30 Sekunden nach dem FHEM-Start auszuführen?

Gruss
flurin

Damian

Zitat von: flurin am 30 März 2015, 21:31:00
Danke für die Erweiterungen.
Eine Frage: gibt es eine Möglichkeit, einen Befehlt z.B. 30 Sekunden nach dem FHEM-Start auszuführen?

Gruss
flurin

Hatten wir das nicht schon mal:

define di_init DOIF ([global:?INITIALIZED]) (set bla on)
attr di_init wait 30
attr di_init initialize init



Gruß

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

flurin

Zitat von: Damian am 30 März 2015, 21:41:57
Hatten wir das nicht schon mal:

define di_init DOIF ([global:?INITIALIZED]) (set bla on)
attr di_init wait 30
attr di_init initialize init



Gruß

Damian

OK, ich muss es übersehen haben.

flurin

#9
@Damian

Nach einem ersten Versuch scheint es bei mir (mit der Version 2015-03-08) nicht zu funktionieren.

Gruss
flurin

cwagner

Moin, Damian,

die Testversion läuft bei mir im Einsatzfall "alle 15 Minuten" ausführen sehr gut. Allerdings meldet Sie mir immer einen Error, was in Wirklichkeit der Rückgabewert einer eigenen Prozedur ist, die DOIF aufruft. Hier das Listings:

Internals:
   DEF        ([+900]) ({prg_MAX_Actuator()})
   NAME       DI_Heizanforder
   STATE      31.03.2015 08:51:54
   TYPE       DOIF
   Readings:
     2015-03-31 08:36:54   Max_Ventil      65
     2015-03-31 08:36:54   cmd_event       timer_1
     2015-03-31 08:36:54   cmd_nr          1
     2015-03-31 08:36:54   error           {prg_MAX_Actuator()}: 53
     2015-03-31 08:36:54   state           cmd_1
     2015-03-31 08:36:54   timer_1_c1      31.03.2015 08:51:54
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"")
   Days:
   Devices:
   Do:
     0          {prg_MAX_Actuator()}
   Helper:
     last_timer 1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
   Realtime:
     0          08:51:54
   State:
   Time:
     0          +900
   Timecond:
     0          0
   Timer:
     0          0
   Timerfunc:
   Timers:
     0           0
Attributes:
   disable    0
   do         always
   group      Heizung
   initialize initialized
   room       Heizung
   stateFormat timer_1_c1


Für mich ist auch unverständlich, worauf die Condition beruht...

Das wichtigste zum Schluss: Es funktioniert bei mir als Ersatz des allereinfachsten aller AT, dem Wiederholungstimer...

Herzliche Grüße
Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 31 März 2015, 08:53:54
Moin, Damian,

die Testversion läuft bei mir im Einsatzfall "alle 15 Minuten" ausführen sehr gut. Allerdings meldet Sie mir immer einen Error, was in Wirklichkeit der Rückgabewert einer eigenen Prozedur ist, die DOIF aufruft. Hier das Listings:

Internals:
   DEF        ([+900]) ({prg_MAX_Actuator()})
   NAME       DI_Heizanforder
   STATE      31.03.2015 08:51:54
   TYPE       DOIF
   Readings:
     2015-03-31 08:36:54   Max_Ventil      65
     2015-03-31 08:36:54   cmd_event       timer_1
     2015-03-31 08:36:54   cmd_nr          1
     2015-03-31 08:36:54   error           {prg_MAX_Actuator()}: 53
     2015-03-31 08:36:54   state           cmd_1
     2015-03-31 08:36:54   timer_1_c1      31.03.2015 08:51:54
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"")
   Days:
   Devices:
   Do:
     0          {prg_MAX_Actuator()}
   Helper:
     last_timer 1
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
   Realtime:
     0          08:51:54
   State:
   Time:
     0          +900
   Timecond:
     0          0
   Timer:
     0          0
   Timerfunc:
   Timers:
     0           0
Attributes:
   disable    0
   do         always
   group      Heizung
   initialize initialized
   room       Heizung
   stateFormat timer_1_c1


Für mich ist auch unverständlich, worauf die Condition beruht...

Das wichtigste zum Schluss: Es funktioniert bei mir als Ersatz des allereinfachsten aller AT, dem Wiederholungstimer...

Herzliche Grüße
Christian

Du musst am Ende deiner Perl-Funktion: return 0 oder return "" einbauen, dann kommt keine Fehlermeldung mehr.

In der Kondition werden alle eckigen Klammern untersucht und gegen Perl-Funktionen ersetzt. Außerdem erkennt mein Parser, ob es eine Zeitangabe ist oder ein Status, Reading, Internel. Bei Zeitangaben werden entsprechende Timer gesetzt.

Der Ausdruck [+900] ist eigentlich die kleinste Änderung und ging bisher auch schon über [+00:15]. Neu ist z. B. auch [+:15] hier wird zwar auch alle 15 Minuten getriggert allerdings ausgerichtet auf 15 Minutengrenzen, das wäre interessant für einen Gong.
Die neuen Zeitangaben in eckigen Klammern sind natürlich, wie bisher, mit anderen Ausrücken beliebig kombinierbar, z. B.

DOIF ([+900] and [Lampe] eq "on"...

Das sollte aber klar sein.

Gruß

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

Damian

Zitat von: flurin am 30 März 2015, 22:43:36
@Damian

Nach einem ersten Versuch scheint es bei mir (mit der Version 2015-03-08) nicht zu funktionieren.

Gruss
flurin

Habe es in der Testversion im ersten Post gefixt. Nimm solange diese, bis ich sie einchecke.

Gruß

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

flurin

#13
Zitat von: Damian am 31 März 2015, 16:37:26
Habe es in der Testversion im ersten Post gefixt. Nimm solange diese, bis ich sie einchecke.

Gruß

Damian

Testversion kopiert und FHEM-Restart ausgeführt. Leider geht es immer noch nicht.
Um "Verständnisprobleme" zu vermeiden, habe ich genau deine Definition mit einer kleinen Änderung übernommen:


define di_init DOIF ([global:?INITIALIZED]) ({Log(3,"DOIF:init")})
attr di_init wait 30
attr di_init initialize init



Gruss
flurin

Damian

Zitat von: flurin am 31 März 2015, 17:10:23
Testversion kopiert und FHEM-Restart ausgeführt. Leider geht es immer noch nicht.
Um "Verständnisprobleme" zu vermeiden, habe ich genau deine Definition mit einer kleinen Änderung übernommen:


define di_init DOIF ([global:?INITIALIZED]) ({Log(3,"DOIF:init")})
attr di_init wait 30
attr di_init initialize init


Gruss
flurin


ja das liegt an der Waitangabe. Ich habe es bei mir ohne wait getestet.

Da nach dem INITIALIZED noch andere global-Events kommen schlägt der imaginäre cmd_2 Zustand zu und dein cmd_1 Kommando wird nicht ausgeführt.

Dann musst du es mit sleep ohne wait machen.

define di_init DOIF ([global:?INITIALIZED]) ((sleep 30;{Log(3,"DOIF:init")}))


Gruß

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