FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Damian am 29 März 2015, 22:16:05

Titel: DOIF: neue Zeit-Features
Beitrag von: Damian am 29 März 2015, 22:16:05
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: kvo1 am 29 März 2015, 22:45:13
Hallo damian

danke für dein super Modul und die.  Erweiterung
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: KernSani am 29 März 2015, 22:50:49
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...
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: cwagner am 30 März 2015, 16:13:16
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: frank am 30 März 2015, 17:35:53
ich habe so das gefühl, dass FHEM bald DOIF heisst.  ;)
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 30 März 2015, 20:44:35
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag 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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 30 März 2015, 21:41:57
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 30 März 2015, 22:15:52
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.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag 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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag 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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 31 März 2015, 10:06:16
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 31 März 2015, 16:37:26
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 31 März 2015, 17:10:23
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 31 März 2015, 17:34:50
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
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 31 März 2015, 19:34:59
Zitat von: Damian am 31 März 2015, 17:34:50

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

OK, es geht auch bei mir. Hier eine praktische Anwendung:


define di_sanctum_infrared_timer DOIF ([sanctum_infrared] eq "on")
( { myLog("Sanctum Infrared timeover") }, set sanctum_infrared off)
attr di_sanctum_infrared_timer do always
attr di_sanctum_infrared_timer group DOIF
attr di_sanctum_infrared_timer wait 3600



define di_init_sanctum_infrared DOIF ([global:?INITIALIZED] and [sanctum_infrared] eq "on")
(sleep 3600;set sanctum_infrared off)
attr di_init_sanctum_infrared group DOIF
attr di_init_sanctum_infrared initialize init


Evtl. lassen sich beide DOIFs verschmelzen.

Edit:

Es gibt dafür eine einfache Notify-Lösung:


define n_sanctum_infrared_timer notify sanctum_infrared:on sleep 3600;;set sanctum_infrared off



Gruss
flurin
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: cwagner am 01 April 2015, 07:43:20
Ist es beabsichtigt, dass bei disabled DOIF der Timer weiter läuft?
Siehe Screenshot

Gruß

Christian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 01 April 2015, 10:12:10
Zitat von: cwagner am 01 April 2015, 07:43:20
Ist es beabsichtigt, dass bei disabled DOIF der Timer weiter läuft?
Siehe Screenshot

Gruß

Christian

ja, die Idee war nach dem Aktivieren des Moduls im Takt zu bleiben. Wenn man nicht gerade im Sekundentakt triggert, sollte es auch keine Performanceeinbußen geben.

Alternative wäre das Modul komplett stillzulegen, allerdings müsste man beim Aktivieren dann wieder die Definition des Moduls durchführen um die Timer neuaufzusetzen.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: cwagner am 01 April 2015, 20:40:01
Zitat von: Damian am 31 März 2015, 10:06:16
Du musst am Ende deiner Perl-Funktion: return 0 oder return "" einbauen, dann kommt keine Fehlermeldung mehr.


Danke das war es, Damian, hätte ich auch selbst drauf kommen können...
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: joshi04 am 03 April 2015, 13:40:07
Hallo Damian,

das ist ja mal sowas von "was ich gerade gesucht habe"!

Mein Anwendungsfall:
Ein Fenster-Aktuator soll das Fenster bei überschreiten einer bestimmten CO2-Konzentration aufmachen. Der Befehl wird dabei so ausgeführt, dass das Fenstern nach einer bestimmten Zeit automatisch wieder zugefahren wird, falls der Befehl für das Zufahren beim Aktuator aus irgend einem Grunde nicht ankommt. Das sollte im Normalfall nicht passieren, da DOIF davon natürlich nichts mitbekommen würde.
Sobald die CO2-Konzentration unter einen bestimmen Wert gefallen ist, soll das Fenster wieder zugefahren werden, dieses soll aber auch passieren, wenn der Wert nach einer bestimmten Zeit noch nicht wieder unter den Wert gefallen ist. Diese Zeit ist kürzer gewählt, als die oben genannte und dient dazu, dass der Status des Moduls mit der Realität übereinstimmt.

Als letztes soll das zeitgesteuerte Zufahren natürlich nur ausgelöst werden, wenn das Fenster nicht bereits durch unterschreiten der CO2-Konzentration zugefahren wurde.  Wenn ich es mir recht überlege, müsste das bereits durch das Modul abgefangen werden, da es zur gleichen Bedingung gehört. Ich werde probieren.

Die Zeit zur Absenkung des CO2-Wertes lässt sich nicht genau bestimmen, da von mehrere Faktoren (Anzahl der Personen im Raum, Türöffnung, etc.) abhängig.

Der Code sieht derzeit so aus:

define SZ_Lueftungs_Logic DOIF ([SZ_Netatmo_r:co2] > 1200) \
(set SZ_Fenster_RE_Status level 100 10800 20,{ fhem 'setreading var SZ_window_opening_last '.strftime('%H:%M', localtime) }) \
    DOELSEIF ([SZ_Netatmo_r:co2] < 800 or ( [   (  [var:SZ_window_opening_last]+[01:30]  )    ] and [SZ_Lueftungs_Logic:state] ne "geschlossen") )\
(set SZ_Fenster_RE_Status level lock 0 20)\
attr SZ_Lueftungs_Logic cmdState offen|geschlossen
attr SZ_Lueftungs_Logic state Das Fenster ist [SZ_Lueftungs_Logic]


var ist ein Dummy, um die Zeit der letzten Öffnung als Reading auszunehmen.
SZ_Netatmo_r ist ein Sensor mit CO2-Messung. SZ_Fenster_RE ist der Fenster-Aktuator.

Cooles Modul, vielen Dank!
In diesem Sinne, frohe Ostern!

ps: Noch nicht abschließend getestet, daher ohne Flinte!
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 03 April 2015, 13:48:16
Zitat von: joshi04 am 03 April 2015, 13:40:07
Hallo Damian,

das ist ja mal sowas von "was ich gerade gesucht habe"!

Mein Anwendungsfall:
Ein Fenster-Aktuator soll das Fenster bei überschreiten einer bestimmten CO2-Konzentration aufmachen. Der Befehl wird dabei so ausgeführt, dass das Fenstern nach einer bestimmten Zeit automatisch wieder zugefahren wird, falls der Befehl für das Zufahren beim Aktuator aus irgend einem Grunde nicht ankommt. Das sollte im Normalfall nicht passieren, da DOIF davon natürlich nichts mitbekommen würde.
Sobald die CO2-Konzentration unter einen bestimmen Wert gefallen ist, soll das Fenster wieder zugefahren werden, dieses soll aber auch passieren, wenn der Wert nach einer bestimmten Zeit noch nicht wieder unter den Wert gefallen ist. Diese Zeit ist kürzer gewählt, als die oben genannte und dient dazu, dass der Status des Moduls mit der Realität übereinstimmt.

Als letztes soll das zeitgesteuerte Zufahren natürlich nur ausgelöst werden, wenn das Fenster nicht bereits durch unterschreiten der CO2-Konzentration zugefahren wurde.  Wenn ich es mir recht überlege, müsste das bereits durch das Modul abgefangen werden, da es zur gleichen Bedingung gehört. Ich werde probieren.

Die Zeit zur Absenkung des CO2-Wertes lässt sich nicht genau bestimmen, da von mehrere Faktoren (Anzahl der Personen im Raum, Türöffnung, etc.) abhängig.

Der Code sieht derzeit so aus:

define SZ_Lueftungs_Logic DOIF ([SZ_Netatmo_r:co2] > 1200) \
(set SZ_Fenster_RE_Status level 100 10800 20,{ fhem 'setreading var SZ_window_opening_last '.strftime('%H:%M', localtime) }) \
    DOELSEIF ([SZ_Netatmo_r:co2] < 800 or ( [   (  [var:SZ_window_opening_last]+[01:30]  )    ] and [SZ_Lueftungs_Logic:state] ne "geschlossen") )\
(set SZ_Fenster_RE_Status level lock 0 20)\
attr SZ_Lueftungs_Logic cmdState offen|geschlossen
attr SZ_Lueftungs_Logic state Das Fenster ist [SZ_Lueftungs_Logic]


var ist ein Dummy, um die Zeit der letzten Öffnung als Reading auszunehmen.
SZ_Netatmo_r ist ein Sensor mit CO2-Messung. SZ_Fenster_RE ist der Fenster-Aktuator.

Cooles Modul, vielen Dank!
In diesem Sinne, frohe Ostern!

ps: Noch nicht abschließend getestet, daher ohne Flinte!

ja, je mehr möglich ist, desto komplexer werden auch die Konstruktionen mit DOIF - hoffentlich brauchen wir nicht noch irgendwann ein Unterforum für DOIF-Konstruktionen ;)

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: joshi04 am 03 April 2015, 14:19:41
Hallo Damian,
zwar sehe ich es auch so, dass je mehr geht, auch die Komplexität steigt. Allerdings war der Wunsch und Bedarf so etwas zu realisieren, schon vorhanden, bevor ich alle Funktionalitäten von DOIF erkannt habe. Von daher hilft das Modul mir nun dabei, nicht mit gefühlten 25 at's und notify's hantieren zu müssen und das macht es wieder einfacher, zumindest vom Code her ;). Daher hier nochmal ein großes Dankeschön!

Jetzt wird's ein wenig OT:
Innerhalb meiner derzeitigen Lösung habe ich die Variable für die letzte Zeit der Fensteröffnung noch als Reading in ein separates Dummy geschrieben. Der Übersichtlichkeit halber wäre allerdings mein Wunsch, alles beieinander zu haben und das irgendwie der Definition des DOIF hinzuzufügen. Einfach ein weiteres Reading zu schreiben funktioniert natürlich auch, allerdings muss man das jeweils neu setzen, sollte man einmal die Definition ändern, daher ist das für die Testphase natürlich recht umständlich. Auch für andere Logikdefinitionen hatte ich schon diese Fragestellung und noch keine wirklich zufriedenstellende Lösung (noch Neuland). Gibt es hier eine elegantere Lösung?

Zurück zum Thema:
Gibt es noch eine elegantere und schlankere Möglichkeit, die Ausführung des 2. Kommandos vom Zeitpunkt der letzten Ausführung des 1. Kommandos abhängig zu machen? Meine Lösung fühlt sich für mich ja schon noch ein wenig zusammengebastelt an... ???

Schöne Grüße,
John


Edith sagt: Nicht dass man mich falsch versteht, ich bin über die steigende Komplexität seeehr froh!

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 03 April 2015, 15:06:06
Zitat von: joshi04 am 03 April 2015, 14:19:41
Hallo Damian,
zwar sehe ich es auch so, dass je mehr geht, auch die Komplexität steigt. Allerdings war der Wunsch und Bedarf so etwas zu realisieren, schon vorhanden, bevor ich alle Funktionalitäten von DOIF erkannt habe. Von daher hilft das Modul mir nun dabei, nicht mit gefühlten 25 at's und notify's hantieren zu müssen und das macht es wieder einfacher, zumindest vom Code her ;). Daher hier nochmal ein großes Dankeschön!

Jetzt wird's ein wenig OT:
Innerhalb meiner derzeitigen Lösung habe ich die Variable für die letzte Zeit der Fensteröffnung noch als Reading in ein separates Dummy geschrieben. Der Übersichtlichkeit halber wäre allerdings mein Wunsch, alles beieinander zu haben und das irgendwie der Definition des DOIF hinzuzufügen. Einfach ein weiteres Reading zu schreiben funktioniert natürlich auch, allerdings muss man das jeweils neu setzen, sollte man einmal die Definition ändern, daher ist das für die Testphase natürlich recht umständlich. Auch für andere Logikdefinitionen hatte ich schon diese Fragestellung und noch keine wirklich zufriedenstellende Lösung (noch Neuland). Gibt es hier eine elegantere Lösung?

Zurück zum Thema:
Gibt es noch eine elegantere und schlankere Möglichkeit, die Ausführung des 2. Kommandos vom Zeitpunkt der letzten Ausführung des 1. Kommandos abhängig zu machen? Meine Lösung fühlt sich für mich ja schon noch ein wenig zusammengebastelt an... ???

Schöne Grüße,
John


Edith sagt: Nicht dass man mich falsch versteht, ich bin über die steigende Komplexität seeehr froh!

Du könntest z. B. mit einem wait-Timer arbeiten:

define SZ_Lueftungs_Logic DOIF ([SZ_Netatmo_r:co2] > 1200) \
  (set SZ_Fenster_RE_Status level 100 10800 20) \
DOELSEIF ([SZ_Netatmo_r:co2] < 800)
   (set SZ_Fenster_RE_Status level lock 0 20)\
DOELSEIF ([SZ_Fenster_RE_Status] eq "10800")\
   (set SZ_Fenster_RE_Status level lock 0 20)\
attr SZ_Lueftungs_Logic cmdState offen|geschlossen|geschlossen
attr SZ_Lueftungs_Logic state Das Fenster ist [SZ_Lueftungs_Logic]
attr SZ_Lueftungs_Logic wait 0:0:5400


Statt "10800" musst du das eintragen, was bei dir nach "set SZ_Fenster_RE_Status level 100 10800 20" im Status des Aktors steht.

Die Lösung mit dem Timer geht natürlich auch, ich überlege noch, wie man das etwas eleganter definieren kann.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: joshi04 am 03 April 2015, 15:31:29
Ich wusste, ich bin schon wieder zu kompliziert unterwegs. Das ist auf alle Fälle schlanker und spart das Dummy.

Obwohl mir das Attribut bekannt war, hab ich das irgendwie nicht zusammengebracht. Die Komplexität...

Ich baue das dann bei mir mal ein...
Danke und schöne Grüße,
John

ps: Der Status ist "100" entsprechend des gesetzten Kommandos. Hab's aber auch gerade erst durch ausprobieren rausgefunden.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: KernSani am 05 April 2015, 20:17:26
Hallo,

triviales Problem, eo ich eigentlich der Meinung wäre, ich könnte es mit EINEM DOIF lösen, stehe aber auf dem Schlauch:

Derzeit habe ich das über zwei DOIF gelöst (1. ohne wait Attribut, 2. mit wait Attribut), schöner fände ich es allerdings in einem DOIF. Kann mir jemand vom Schlauch helfen?

Danke,

Grüße,

Oli
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 05 April 2015, 20:37:47
Zitat von: KernSani am 05 April 2015, 20:17:26
Hallo,

triviales Problem, eo ich eigentlich der Meinung wäre, ich könnte es mit EINEM DOIF lösen, stehe aber auf dem Schlauch:


  • Wenn event EV1 eintritt werden ein paar Aktionen ausgelöst
  • 5 Minuten nachdem EV1 eingetreten is sollen ein paar weitere Aktionen ausgelöst
  • ich habe keinen Dummy o.ä., der in 1. gesetzt wird (und den ich in einem DOELSEIF für 2. abfragen könnte
Derzeit habe ich das über zwei DOIF gelöst (1. ohne wait Attribut, 2. mit wait Attribut), schöner fände ich es allerdings in einem DOIF. Kann mir jemand vom Schlauch helfen?

Danke,

Grüße,

Oli

Ich würde in diesem Fall bei zwei DOIF´s bleiben. Man muss nicht alles in ein DOIF packen. Probleme, die in irgendeiner Form zusammen hängen, kann man zwecks Übersicht auch in eine Gruppe packen.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: KernSani am 05 April 2015, 21:47:53
ok, man muss es ja auch nicht übertreiben, dachte nur ich übersehe etwas.

Danke,

Oli
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 05 April 2015, 21:52:44
Zitat von: KernSani am 05 April 2015, 21:47:53
ok, man muss es ja auch nicht übertreiben, dachte nur ich übersehe etwas.

Danke,

Oli

Das Modul habe ich entsprechend der if-elseif-...-else Syntax programmiert. Und als Programmierer weiß man, dass man ein ganzes Programm nicht in ein if-Konstrukt quetschen kann ;)

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 05 April 2015, 22:02:01
Ich habe die neue Version eingecheckt. Die Doku wurde z. T. stark überarbeitet.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 06 April 2015, 13:39:50
Das ist ja mal der Hammer!
Vielen Dank für Deine Arbeit, die Du Dir da gemacht hast!
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: automatisierer am 06 April 2015, 20:14:52
Hallo,
ich hab seit dem ich heute Morgen ein Update gemacht habe ein Problem. Ich vermute es ist ein BUG, da ich mehrere ähnliche DOIF's verwende, die auch keine Probleme bereiten. An dem Problem DOIF habe ich auch nichts verändert.  Das Problem besteht darin, dass es nicht mehr auf CMD2 springt, durch anhängen eines DOELSE funktioniert es wieder. Habe mal ein list von beide Varianten gemacht.

list ohne DOELSE

Internals:
   DEF        ([Schaltsteckdose_1_SenPwr] < 10) (set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 '')
   NAME       ueberw_kuehltruhe
   NR         192
   NTFY_ORDER 50-ueberw_kuehltruhe
   STATE      Alarm
   TYPE       DOIF
   Readings:
     2015-04-06 19:42:38   cmd_event       Schaltsteckdose_1_SenPwr
     2015-04-06 19:42:38   cmd_nr          1
     2015-04-06 19:58:21   e_Schaltsteckdose_1_SenPwr_STATE 113.78
     2015-04-06 19:42:38   state           Alarm
     2015-04-06 19:45:19   wait_timer      06.04.2015 22:45:19 cmd_1 Schaltsteckdose_1_SenPwr
   Condition:
     0          InternalDoIf('Schaltsteckdose_1_SenPwr','STATE','') < 10
   Devices:
     0           Schaltsteckdose_1_SenPwr
     all         Schaltsteckdose_1_SenPwr
   Do:
     0          set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 ''
   Helper:
     last_timer 0
     sleepdevice Schaltsteckdose_1_SenPwr
     sleeptimer 0
   Internals:
     0           Schaltsteckdose_1_SenPwr:STATE
     all         Schaltsteckdose_1_SenPwr:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   cmdState   Alarm|laeuft
   do         always
   room       __Befehle
   wait       10800


die Bedingung ist nicht wahr, aber das DOIF bleibt bei cmd 1

nun das list mit DOELSE

Internals:
   DEF        ([Schaltsteckdose_1_SenPwr] < 10) (set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 '') DOELSE
   NAME       ueberw_kuehltruhe
   NR         192
   NTFY_ORDER 50-ueberw_kuehltruhe
   STATE      laeuft
   TYPE       DOIF
   Readings:
     2015-04-06 20:00:52   cmd_event       Schaltsteckdose_1_SenPwr
     2015-04-06 20:00:52   cmd_nr          2
     2015-04-06 20:00:52   e_Schaltsteckdose_1_SenPwr_STATE 110.4
     2015-04-06 20:00:52   state           laeuft
   Condition:
     0          InternalDoIf('Schaltsteckdose_1_SenPwr','STATE','') < 10
   Devices:
     0           Schaltsteckdose_1_SenPwr
     all         Schaltsteckdose_1_SenPwr
   Do:
     0          set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 ''
     1
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           Schaltsteckdose_1_SenPwr:STATE
     all         Schaltsteckdose_1_SenPwr:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   cmdState   Alarm|laeuft
   do         always
   room       __Befehle
   wait       10800


hier ist das DOIF auf cmd 2 gesprungen, so wie es mMn richtig ist.

Wie gesagt habe ich mehrere DOIF's die ähnliche Aufgaben erfüllen, fertig Meldung für Waschmaschine und Trockner, beide funktionieren auch ohne ein DOELSE.

Gruß
Ingo


Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 06 April 2015, 20:40:01
Zitat von: automatisierer am 06 April 2015, 20:14:52
Hallo,
ich hab seit dem ich heute Morgen ein Update gemacht habe ein Problem. Ich vermute es ist ein BUG, da ich mehrere ähnliche DOIF's verwende, die auch keine Probleme bereiten. An dem Problem DOIF habe ich auch nichts verändert.  Das Problem besteht darin, dass es nicht mehr auf CMD2 springt, durch anhängen eines DOELSE funktioniert es wieder. Habe mal ein list von beide Varianten gemacht.

list ohne DOELSE

Internals:
   DEF        ([Schaltsteckdose_1_SenPwr] < 10) (set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 '')
   NAME       ueberw_kuehltruhe
   NR         192
   NTFY_ORDER 50-ueberw_kuehltruhe
   STATE      Alarm
   TYPE       DOIF
   Readings:
     2015-04-06 19:42:38   cmd_event       Schaltsteckdose_1_SenPwr
     2015-04-06 19:42:38   cmd_nr          1
     2015-04-06 19:58:21   e_Schaltsteckdose_1_SenPwr_STATE 113.78
     2015-04-06 19:42:38   state           Alarm
     2015-04-06 19:45:19   wait_timer      06.04.2015 22:45:19 cmd_1 Schaltsteckdose_1_SenPwr
   Condition:
     0          InternalDoIf('Schaltsteckdose_1_SenPwr','STATE','') < 10
   Devices:
     0           Schaltsteckdose_1_SenPwr
     all         Schaltsteckdose_1_SenPwr
   Do:
     0          set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 ''
   Helper:
     last_timer 0
     sleepdevice Schaltsteckdose_1_SenPwr
     sleeptimer 0
   Internals:
     0           Schaltsteckdose_1_SenPwr:STATE
     all         Schaltsteckdose_1_SenPwr:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   cmdState   Alarm|laeuft
   do         always
   room       __Befehle
   wait       10800


die Bedingung ist nicht wahr, aber das DOIF bleibt bei cmd 1

nun das list mit DOELSE

Internals:
   DEF        ([Schaltsteckdose_1_SenPwr] < 10) (set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 '') DOELSE
   NAME       ueberw_kuehltruhe
   NR         192
   NTFY_ORDER 50-ueberw_kuehltruhe
   STATE      laeuft
   TYPE       DOIF
   Readings:
     2015-04-06 20:00:52   cmd_event       Schaltsteckdose_1_SenPwr
     2015-04-06 20:00:52   cmd_nr          2
     2015-04-06 20:00:52   e_Schaltsteckdose_1_SenPwr_STATE 110.4
     2015-04-06 20:00:52   state           laeuft
   Condition:
     0          InternalDoIf('Schaltsteckdose_1_SenPwr','STATE','') < 10
   Devices:
     0           Schaltsteckdose_1_SenPwr
     all         Schaltsteckdose_1_SenPwr
   Do:
     0          set pushIngo msg 'Warnung' 'Kuehltruhe hat seit 3 Stunden nicht mehr gelaufen' '' 1 ''
     1
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           Schaltsteckdose_1_SenPwr:STATE
     all         Schaltsteckdose_1_SenPwr:STATE
   Itimer:
   Readings:
   State:
   Timerfunc:
   Trigger:
Attributes:
   cmdState   Alarm|laeuft
   do         always
   room       __Befehle
   wait       10800


hier ist das DOIF auf cmd 2 gesprungen, so wie es mMn richtig ist.

Wie gesagt habe ich mehrere DOIF's die ähnliche Aufgaben erfüllen, fertig Meldung für Waschmaschine und Trockner, beide funktionieren auch ohne ein DOELSE.

Gruß
Ingo

ja, das habe ich wegen eines anderen Problems geändert, siehe hier:

http://forum.fhem.de/index.php/topic,30847.msg281484.html#msg281484

do always macht hier, so wie ich es gerade überblicke keinen Sinn. Lösche es, dann funktioniert es schon. Ansonsten hast du die von mir angedachte Lösung für "sinnvolle" do always Fälle ohne DOELSE mit der alleinigen DOELSE-Angabe schon selbst richtig erkannt.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 09 April 2015, 11:53:53
Ich habe ja meine DOIF-Anweisung für meine WandUhr abgeändert nach den neusten Anpassungen.
([Wanduhr_dummy:state] eq "on" and [:00]) ({WandUhr()})
DOELSEIF ([:15] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_15.mp3 -volume 83 −really−quiet &")})
DOELSEIF ([:30] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_30.mp3 -volume 83 −really−quiet &")})
DOELSEIF ([:45] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 83 −really−quiet &")})

Was mir nun aufgefallen ist, das mein FHEM nun immer ein save haben möchte. Könnte das mit der Umstellung zu tun haben?
Ich wüsste nämlich sonst nichts, was ich geändert hätte...
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 09 April 2015, 13:51:30
Zitat von: Toto1973 am 09 April 2015, 11:53:53
Ich habe ja meine DOIF-Anweisung für meine WandUhr abgeändert nach den neusten Anpassungen.
([Wanduhr_dummy:state] eq "on" and [:00]) ({WandUhr()})
DOELSEIF ([:15] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_15.mp3 -volume 83 −really−quiet &")})
DOELSEIF ([:30] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_30.mp3 -volume 83 −really−quiet &")})
DOELSEIF ([:45] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 83 −really−quiet &")})

Was mir nun aufgefallen ist, das mein FHEM nun immer ein save haben möchte. Könnte das mit der Umstellung zu tun haben?
Ich wüsste nämlich sonst nichts, was ich geändert hätte...

Dann müsste sich hier etwas an der Konfiguration ändert - das ist hier nicht der Fall. Ich habe den Befehl bei mir definiert. WandUhr und mplayer führt zwar zu einer Fehlermeldung, weil es die bei mir nicht gibt. Bei Save Config wird das Fragezeichen aber nicht aktiv.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: kvo1 am 09 April 2015, 16:32:39
ZitatWas mir nun aufgefallen ist, das mein FHEM nun immer ein save haben möchte. Könnte das mit der Umstellung zu tun haben?
Ich wüsste nämlich sonst nichts, was ich geändert hätte...

Bei mir kommt das z.B. durch die Einbindung des calendar bzw. calview , hier werden innerhalb der readingsgroup über at
die Daten aktualisiert !
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 10 April 2015, 12:11:55
Danke für den Hinweis!
Da muss ich mal genauer nachsehen, wo das her kommt!
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: FunkOdyssey am 12 April 2015, 20:54:22
Können diese neuen Zeit-Features eigentlich auch dazu genutzt werden, um verschiedene Zeitraster am Tag zu benutzen?


Ich starte meine Zirkulationspumpe folgendermaßen:

([+00:10]) (set powerMeter1_switch on-for-timer 120)


Ich möchte diesen Abstand aber in der Nacht erhöhen. Also muss ich Zeitraum und Zeitraster in der Bedingung kombinieren. Geht das?
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 12 April 2015, 21:14:39
Zitat von: Funk.Odyssey am 12 April 2015, 20:54:22
Können diese neuen Zeit-Features eigentlich auch dazu genutzt werden, um verschiedene Zeitraster am Tag zu benutzen?


Ich starte meine Zirkulationspumpe folgendermaßen:

([+00:10]) (set powerMeter1_switch on-for-timer 120)


Ich möchte diesen Abstand aber in der Nacht erhöhen. Also muss ich Zeitraum und Zeitraster in der Bedingung kombinieren. Geht das?

Schon etwas ausprobiert?

Bsp:

set Zeit 00:15

([+[Zeit]])(...)

oder

set Zeit 900

([+[Zeit]])(...)

oder

set Zeit +00:15

([[Zeit]]) (...)


oder ausgerichtet

set Zeit +:15

([[Zeit]]) (...)


Es gibt noch mehr Möglichkeiten mit runden Klammern (siehe Berechnung von Zeit in der Commandref), aber das sollte erst mal reichen.

such dir also etwas aus ;)

Edit: Dummy Zeit kannst du natürlich mit einem separaten DOIF zeitgesteuert setzen.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: FunkOdyssey am 13 April 2015, 07:28:19
Ich habe es quick&dirty folgendermaßen ausprobiert:


(
[22:00-06:00] and [+00:30]
)
(set powerMeter1_switch on-for-timer 150)
DOELSE
(set powerMeter1_switch on)


Muss noch schön gemacht werden. Aber es scheint zu funktionieren.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 14 April 2015, 11:12:13
Zitat von: Toto1973 am 09 April 2015, 11:53:53
Ich habe ja meine DOIF-Anweisung für meine WandUhr abgeändert nach den neusten Anpassungen.
([Wanduhr_dummy:state] eq "on" and [:00]) ({WandUhr()})
DOELSEIF ([:15] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_15.mp3 -volume 83 −really−quiet &")})
DOELSEIF ([:30] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_30.mp3 -volume 83 −really−quiet &")})
DOELSEIF ([:45] and [Wanduhr_dummy:state] eq "on") ({system ("mplayer /opt/fhem/Sound/BigBen_45.mp3 -volume 83 −really−quiet &")})

Was mir nun aufgefallen ist, das mein FHEM nun immer ein save haben möchte. Könnte das mit der Umstellung zu tun haben?
Ich wüsste nämlich sonst nichts, was ich geändert hätte...

Deine WandUhr lässt mich nicht in Ruhe schlafen  :)

ich hab's bei mir so vereinfacht:


define di_wall_clock DOIF ([+:15]) ({system("mplayer /opt/fhem/Sound/BigBen_".$min.".mp3 -volume 83 −really−quiet &")})
attr di_wall_clock do always


Gruss
flurin
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 23 April 2015, 11:55:17
Ich muss hier auch mal wieder was nachfragen.
Seit Anfang an mache ich mich mit dieser "Schaltung" hier rum:
([09:01-20:00] and [sz_Waesche_trocknen] eq "on" and [?Jahreszeit] eq "Winter") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([Jahreszeit] eq "Sommer") (set sz_Heizung desiredTemperature off)
DOELSEIF ([03:30-05:00|8] and [geofancy:currLoc_Toto] eq "Home" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Frueh") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([07:45-09:00|8] and [geofancy:currLoc_Toto] eq "Home" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Mittel") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([09:01-11:00] and [?sz_Waesche_trocknen] eq "off" and [?Jahreszeit] eq "Winter" and [geofancy:currLoc_Toto] eq "Home") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([11:01-18:00] and [?sz_Waesche_trocknen] eq "off" and [?Technoclub] eq "nein" and [?Jahreszeit] eq "Winter" and [geofancy:currLoc_Toto] eq "Home") (set sz_Heizung desiredTemperature 20)
DOELSEIF ([14:00-18:00|7] and [?sz_Waesche_trocknen] eq "off" and [Technoclub] eq "ja" and [?Jahreszeit] eq "Winter" and [geofancy:currLoc_Toto] eq "Home") (set sz_Heizung desiredTemperature 20)
DOELSE (set sz_Heizung desiredTemperature 17)


Es soll also zu verschiedenen Zeiten ein Heinzkörper gesteuert werden. Dies geschieht abhängig von verschiedene Faktoren (Dummys). Soweit funktioniert das auch im Teil ganz gut.
Allerdings springt mir der DOIF immer wieder in die DOELSE Bedienung, obwohl andere Bedienungen passen würde.
Also immer dann, wenn eine neue Zeit triggert, funktioniert es nicht mehr so, wie eigentlich gewollt.

Zu meinem Verständnis:
Ist es so, das DOIF zu erst die erste Bedingung abfragt (hier also die erste Zeile) und wenn die zutrifft, dann fragt es den Rest nicht mehr ab?
Weil ich vermute, das genau das nicht passiert!
Sprich, er fragt immer alles ab!
Ist das so richtig und wenn ja, kann man das nicht ändern?

Ergänzung:
Ich stelle mir das so vor:
Bedingung 1 wird durch die Uhrzeit und den Wäsche_trocknen Dummy wahr, dann ruht DOIF bis entweder die Endzeit erreicht ist (im Beispiel 20 Uhr) oder sich der Zustand des Wäsche_trocknen Dummy ändert.
Alle anderen Timer würde quasi ignoriert werden.
Das ganze könnte ja durch ein Attribut, das man setzen kann, aktiviert werden.
Das würde solche komplexen Steuerungen etwas übersichtlicher machen.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 23 April 2015, 12:54:02
Zitat von: Toto1973 am 23 April 2015, 11:55:17
Ich muss hier auch mal wieder was nachfragen.
Seit Anfang an mache ich mich mit dieser "Schaltung" hier rum:
([09:01-20:00] and [sz_Waesche_trocknen] eq "on" and [?Jahreszeit] eq "Winter") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([Jahreszeit] eq "Sommer") (set sz_Heizung desiredTemperature off)
DOELSEIF ([03:30-05:00|8] and [geofancy:currLoc_Toto] eq "Home" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Frueh") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([07:45-09:00|8] and [geofancy:currLoc_Toto] eq "Home" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Mittel") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([09:01-11:00] and [?sz_Waesche_trocknen] eq "off" and [?Jahreszeit] eq "Winter" and [geofancy:currLoc_Toto] eq "Home") (set sz_Heizung desiredTemperature 22)
DOELSEIF ([11:01-18:00] and [?sz_Waesche_trocknen] eq "off" and [?Technoclub] eq "nein" and [?Jahreszeit] eq "Winter" and [geofancy:currLoc_Toto] eq "Home") (set sz_Heizung desiredTemperature 20)
DOELSEIF ([14:00-18:00|7] and [?sz_Waesche_trocknen] eq "off" and [Technoclub] eq "ja" and [?Jahreszeit] eq "Winter" and [geofancy:currLoc_Toto] eq "Home") (set sz_Heizung desiredTemperature 20)
DOELSE (set sz_Heizung desiredTemperature 17)


Es soll also zu verschiedenen Zeiten ein Heinzkörper gesteuert werden. Dies geschieht abhängig von verschiedene Faktoren (Dummys). Soweit funktioniert das auch im Teil ganz gut.
Allerdings springt mir der DOIF immer wieder in die DOELSE Bedienung, obwohl andere Bedienungen passen würde.
Also immer dann, wenn eine neue Zeit triggert, funktioniert es nicht mehr so, wie eigentlich gewollt.

Zu meinem Verständnis:
Ist es so, das DOIF zu erst die erste Bedingung abfragt (hier also die erste Zeile) und wenn die zutrifft, dann fragt es den Rest nicht mehr ab?
Weil ich vermute, das genau das nicht passiert!
Sprich, er fragt immer alles ab!
Ist das so richtig und wenn ja, kann man das nicht ändern?

Zitat aus der Commandref:

ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch das Device beinhalten.


Das gilt insb. auch für Zeittrigger, wenn also z. B. um 03:30 die dritte Bedingung getriggert wird, wird auch nur diese zu diesem Zeitpunkt geprüft und wenn sie nicht stimmt, dann wird der DOELSE-Fall ausgeführt.
Ein Problem kann es bei 09:01 Uhr geben, denn das Modul wird um diese Zeit zweimal getriggert, dabei ist die zeitliche Abfolge der Überprüfung nicht sichergestellt. Es kann also sein, dass zuerst die erste Bedingung geprüft wird und dann die fünfte, es kann aber auch sein dass zuerst die fünfte geprüft wird und dann erst die erste.

Wenn man sicherstellen will, dass zuerst die erste Bedingung geprüft wird und dann die fünfte, dann sollte man bei der fünften statt 09:01... einen etwas späteren Zeitpunkt angeben z. B. 09:01:01....

Zukünftig wird die Reihenfolge der Abarbeitung bei gleicher Zeit sichergestellt werden (steht schon auf der todo-Liste).

Gruß

Damian

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 23 April 2015, 13:00:59
Das Problem ist aber noch die Zeitspanne oder?
Wenn eine Bedinung von 9 bis 11 Uhr geht, eine andere Bedingung von 10 bis 12 Uhr, dann wird um 10 Uhr geprüft und wenn die Bedinung nicht wahr ist, fällt DOIF auf die DOELSE Bedinung, richtig?
Logisch wäre ja dann aber, das Bedingung 1 weiter Bestand hätte, bis 11 Uhr.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 23 April 2015, 13:27:47
Zitat von: Toto1973 am 23 April 2015, 13:00:59
Das Problem ist aber noch die Zeitspanne oder?
Wenn eine Bedinung von 9 bis 11 Uhr geht, eine andere Bedingung von 10 bis 12 Uhr, dann wird um 10 Uhr geprüft und wenn die Bedinung nicht wahr ist, fällt DOIF auf die DOELSE Bedinung, richtig?
Logisch wäre ja dann aber, das Bedingung 1 weiter Bestand hätte, bis 11 Uhr.
ja, da könnte man überlegen,  ob man Attribut-gesteuert bei irgendeinem Zeittrigger die Überprüfung aller Bedingungen vornimmt - ich kann aber z. Zt. die Konsequenzen einer solchen Vorgehensweise noch nicht absehen.

Es ist immer kritisch mehrere DOELSIF-Fälle mit Zeitintervallen und einem DOELSE-Fall anzugeben. Weil man höllisch auf Zeitüberschneidungen achten muss und der DOELSE-Fall öfters zum Zuge kommt als man denkt. In solchen Fällen würde ich ohne Intervalle arbeiten und stattdessen nur mit Zeitpunkten arbeiten, denn diese sind wesentlich unkritischer zu handhaben, weil sie nur zum Triggerzeitpunkt wahr sind und sonst nicht - da hat man weniger Probleme mit irgendwelchen Überschneidungen bzw. Abhängigkeiten.

Bei dir würde sich damit die Anzahl der Fälle auf drei reduzieren temp 22, temp 20 und temp 17. In der entsprechenden Bedingung würde ich nur Zeitpunkte angeben, ab wann die Temperatur gelten soll und keinen DOELSE-Fall angeben.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 23 April 2015, 23:48:49
Vielen Dank für die Antwort. Ich werde das Ganze mal umbauen
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 24 April 2015, 08:20:14
Hallo Damian,

in Sachen Zeit-Features hätte ich noch eine Idee:

Ich möchte in verschiedenen DOIFs die Abfrage einbauen, ob seit dem Zeitpunkt der letzten Aktualisierung eines Readings bis jetzt eine Zeit von mehr oder weniger als XX Sekunden vergangen ist. Zur Zeit kann ich das m.E. nur durch eine Perl-Funktion realisieren, was ich auch tue.

Toll wäre aber, wenn das direkt in der DOIF-Definition mit eingebaut werden könnte nach folgendem Beispiel (hier steht die # für das Alter des Zeitstempels in Sekunden vom aktuellen Zeitpunkt - hier dann inkl. Trigger-Auslösung):


define Aktion DOIF ([IrgendeinEvent] and [#Mein_Device] > 30) (set Lampe on)


bzw. ohne Triggerauslösung


define Aktion DOIF ([IrgendeinEvent] and [?#Mein_Device] > 30) (set Lampe on)


Damit könnte man bei alleinigem Definitionsmerkmal insgesamt auch wunderbar Aktionen anstossen, bei denen bspw. die letzte Aktualisierung eines Readings schon XX Zeiteinheiten her ist.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 24 April 2015, 08:33:23
Zitat von: Ralli am 24 April 2015, 08:20:14
Hallo Damian,

in Sachen Zeit-Features hätte ich noch eine Idee:

Ich möchte in verschiedenen DOIFs die Abfrage einbauen, ob seit dem Zeitpunkt der letzten Aktualisierung eines Readings bis jetzt eine Zeit von mehr oder weniger als XX Sekunden vergangen ist. Zur Zeit kann ich das m.E. nur durch eine Perl-Funktion realisieren, was ich auch tue.

Toll wäre aber, wenn das direkt in der DOIF-Definition mit eingebaut werden könnte nach folgendem Beispiel (hier steht die # für das Alter des Zeitstempels in Sekunden vom aktuellen Zeitpunkt - hier dann inkl. Trigger-Auslösung):


define Aktion DOIF ([IrgendeinEvent] and [#Mein_Device] > 30) (set Lampe on)


bzw. ohne Triggerauslösung


define Aktion DOIF ([IrgendeinEvent] and [?#Mein_Device] > 30) (set Lampe on)


Damit könnte man bei alleinigem Definitionsmerkmal insgesamt auch wunderbar Aktionen anstossen, bei denen bspw. die letzte Aktualisierung eines Readings schon XX Zeiteinheiten her ist.

So etwas gibt es schon, siehe Commandref:



define Aktion DOIF ([IrgendeinEvent] and [?Mein_Device:reading:sec] > 30) (set Lampe on)


Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 24 April 2015, 08:40:52
 :o Uff. Danke.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 24 April 2015, 10:04:51
DOIF ist ja inzwischen so Umfangreich geworden, das man den Überblick verliert. Außerdem macht es viele andere Module inzwischen überflüssig!

Bei meinem Problem ist wohl DOIF nicht schuld. Ich vermute, das Geofancy da der Auslöser ist. Heute ist um 9:22 Uhr der DOELSE Fall eingetreten. Und da triggert keine Zeit.
Nach dem ich den Status von Geofancy nochmal auf home gesetzt habe, hat auch die passende Bedingung wieder geschallten.
Also werde ich mal da nach forschen...
Das Problem mit der zeit bleibt allerdings doch. Ich muss quasi alle Zeitabschnitte, die sich irgendwie überschneiden könnten, umgehen. Das wird ein Spaß, das zusammen zu bauen :-P

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 24 April 2015, 12:13:46
So sieht das dann aus, nach der Umstellung. Hier das Beispiel für das Thermostat im Bad.
([03:30:01|8] or [07:45:01|8] or [09:00:01|7] or [11:00:01] or [05:00:01|8] or [22:00:01] and [Jahreszeit] eq "Sommer" and [?Anwesend] eq "on" or [?Anwesend] eq "off") (set ba_Heizung desiredTemperature off)
DOELSEIF ([03:30|8] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Frueh") (set ba_Heizung desiredTemperature 22)
DOELSEIF ([07:45|8] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Mittel") (set ba_Heizung desiredTemperature 22)
DOELSEIF ([09:00|7] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter") (set ba_Heizung desiredTemperature 22)
DOELSEIF ([11:00] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter") (set ba_Heizung desiredTemperature 20)
DOELSEIF ([05:00|8] or [22:00] and [Anwesend] eq "off") (set ba_Heizung desiredTemperature 18)

So müsste ich alle Bedingungen abgedeckt haben und auch die Uhrzeiten sollten abgefangen werden...
Ergänzung:
Bei der ersten Bedingung habe ich mal wieder zu weit gedacht!
Da ja nur dann was geschalten wird, wenn eine Bedingung wahr wird, kann ich die ganzen Zeitangaben sowie die Abfrage für Anwesend weglassen oder?

Für die Erfassung, wenn Anwesend von Off auf on springt, brauche ich dann eine separate DOIF, die je nach Zeitfenster, den Thermostat steuert.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 24 April 2015, 13:10:04
Zitat von: Toto1973 am 24 April 2015, 12:13:46
So sieht das dann aus, nach der Umstellung. Hier das Beispiel für das Thermostat im Bad.
([03:30:01|8] or [07:45:01|8] or [09:00:01|7] or [11:00:01] or [05:00:01|8] or [22:00:01] and [Jahreszeit] eq "Sommer" and [?Anwesend] eq "on" or [?Anwesend] eq "off") (set ba_Heizung desiredTemperature off)
DOELSEIF ([03:30|8] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Frueh") (set ba_Heizung desiredTemperature 22)
DOELSEIF ([07:45|8] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Mittel") (set ba_Heizung desiredTemperature 22)
DOELSEIF ([09:00|7] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter") (set ba_Heizung desiredTemperature 22)
DOELSEIF ([11:00] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter") (set ba_Heizung desiredTemperature 20)
DOELSEIF ([05:00|8] or [22:00] and [Anwesend] eq "off") (set ba_Heizung desiredTemperature 18)

So müsste ich alle Bedingungen abgedeckt haben und auch die Uhrzeiten sollten abgefangen werden...

Ich würde dennoch Fälle mit gleicher Temperatur jeweils zu einem Zustand zusammenfassen, damit ggf. nicht unnötig geschaltet wird:

([03:30:01|8] or [07:45:01|8] or [09:00:01|7] or [11:00:01] or [05:00:01|8] or [22:00:01] and [Jahreszeit] eq "Sommer" and [?Anwesend] eq "on" or [?Anwesend] eq "off")
   (set ba_Heizung desiredTemperature off)
DOELSEIF (([03:30|8] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Frueh") or
([07:45|8] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter" and [?Schicht_dummy] eq "Mittel") or
([09:00|7] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter")
   (set ba_Heizung desiredTemperature 22)
DOELSEIF ([11:00] and [Anwesend] eq "on" and [?Jahreszeit] eq "Winter")
   (set ba_Heizung desiredTemperature 20)
DOELSEIF ([05:00|8] or [22:00] and [Anwesend] eq "off")
   (set ba_Heizung desiredTemperature 18)


Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Toto1973 am 25 April 2015, 11:16:04
Kurze Rückmeldung:
Nachdem ich jetzt alles so umgebaut habe, wie vorgeschlagen, funktioniert meine Heizungssteuerung endlich wie gewollt. Vielen Dank!
Manchmal kommt man selbst nicht auf die einfachsten Dinge ;-)
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Bartimaus am 04 Mai 2015, 09:19:54
Guten Morgen,

ist evtl. auch eine Erweiterung geplant, bei der man wie zB. die Wochentage, auch Monate setzen kann ? [06:00-12:00|123|M04M5M6M11] Also Mo+Di+Mi in April|Mai|Juni|November
Fänd ich gut bei Bewässerungsteuerung, Heizungsteuerung etc.....


LG
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 04 Mai 2015, 12:23:12
Zitat von: Bartimaus am 04 Mai 2015, 09:19:54
Guten Morgen,

ist evtl. auch eine Erweiterung geplant, bei der man wie zB. die Wochentage, auch Monate setzen kann ? [06:00-12:00|123|M04M5M6M11] Also Mo+Di+Mi in April|Mai|Juni|November
Fänd ich gut bei Bewässerungsteuerung, Heizungsteuerung etc.....


LG

so nicht, aber du kannst heute schon angeben:

([06:00-12:00|123] and ($month>=4 and $month<=6)) (...

Gruß

Damian


Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Bartimaus am 04 Mai 2015, 12:24:58
So nutze ich es derzeit ;)
Aber je schlanker desto besser  ;D
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 04 Mai 2015, 12:30:51
Zitat von: Bartimaus am 04 Mai 2015, 12:24:58
So nutze ich es derzeit ;)
Aber je schlanker desto besser  ;D

ja, mal schauen, was sonst noch auf der todo-Liste steht, wenn ich wieder Zeit habe  :)

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 13 Mai 2015, 19:28:07
Zitat von: Damian am 29 März 2015, 22:16:05
Ich habe heute das schlechte Wetter genutzt und neue Zeit-Features ins Modul eingebaut.

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)



Gruß

Damian

Hallo.
Habe da ein Problem mit genau diesem Beispiel..
Ich möchte alle 60sec. einen Dummy setzen, aber das klappt nur nach der ersten Minute, danach wird nichts mehr aktualisiert.


([+60]) ({ my $sld = ReadingsVal("SDM220M","Power__W",0);; fhem("set Xtender_Loader $sld ");;})


bei den readings steht folgendes




cmd_event timer_1                       2015-05-13 19:12:59
cmd_nr 1                                     2015-05-13 19:12:59
state cmd_1                                 2015-05-13 19:12:59
timer_1_c1   13.05.2015 19:24:59 2015-05-13 19:23:59

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 13 Mai 2015, 19:53:31
Zitat von: satprofi am 13 Mai 2015, 19:28:07
Hallo.
Habe da ein Problem mit genau diesem Beispiel..
Ich möchte alle 60sec. einen Dummy setzen, aber das klappt nur nach der ersten Minute, danach wird nichts mehr aktualisiert.


([+60]) (set Xtender_Loader [SDM220M:Power__W:d])


bei den readings steht folgendes




cmd_event timer_1                       2015-05-13 19:12:59
cmd_nr 1                                     2015-05-13 19:12:59
state cmd_1                                 2015-05-13 19:12:59
timer_1_c1   13.05.2015 19:24:59 2015-05-13 19:23:59



Ist do always gesetzt?


attr .... do always

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 13 Mai 2015, 19:57:06
Danke, das wars!
Wusste ich nicht.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Puschel74 am 13 Mai 2015, 21:40:58
Wozu hat sich Damian die Mühe mit einer deutschen commandref gemacht wenn sie sowieso nicht gelesen wird  ???
Wozu gibt es im Forum unzählige Beiträge wenn sie auch nicht gelesen werden  ???
Zitat von: satprofi am 13 Mai 2015, 19:57:06
Danke, das wars!
Wusste ich nicht.
Klar, die logische Entschuldigung für ... schlechte Doku nehm ich mal an.
Aber ok, die Hilfe im Forum nimmt einem das suchen ab und kostet nichts.
Ist nur fraglich wie lange sich Leute noch einbringen wenn es doch einfacher ist im Forum zu posten.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 13 Mai 2015, 21:52:07
Habe command ref gelesen. Leider sund da aber die neuen zeitfunktionen nicht drinn

Sent from my OPO

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Puschel74 am 13 Mai 2015, 22:21:23
Wetten das do always drinnen steht.
Auch wette ich das do always bereits zigmal hier beschrieben wurde.
ZitatHabe command ref gelesen. Leider sund da aber die neuen zeitfunktionen nicht drinn
Aber die Attribute sind beschrieben - in der commandref und hier im Forum.
Und an den Attributen hat sich nichts geändert - weder hier im Forum noch in der commandref.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 13 Mai 2015, 22:30:47
Ok. Bei do always war ich der meinung das dies nur dann aktiv sein soll wenn andere devices zwischenfunken.

Sent from my OPO

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Puschel74 am 13 Mai 2015, 23:07:37
Dann weicht deine Meinung von der Programmierung des DOIF sowie von der Erklärung in der commandref und auch den Erklärungen im Foum ab und ist falsch.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 14 Mai 2015, 10:47:40
Wird so sein

Sent from my OPO

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 14 Mai 2015, 11:56:57
Zitat von: satprofi am 14 Mai 2015, 10:47:40
Wird so sein

Sent from my OPO

Mit "do always" hatte ich am Anfang trotz hervorragender Dokumentation meine Mühe. Eigentlich lernt man den richtigen Gebrauch nur mit der praktischen Anwendung. Selbst Damian muss immer wieder darauf hinweisen.

Zudem haben neue Forumsbeiträge IMHO einen positiven Nebeneffekt. Sie sind aktuell und widerspiegeln den neusten Stand der Module. Alte Beiträge sind oft nicht mehr gültig oder komplizierter.

Gruss
flurin
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: All-Ex am 14 Mai 2015, 20:18:26
Hi, ich bin neu hier und habe inzwischen alles auf DOIF umgestellt. Vielen Dank für die tolle Arbeit, das ist für mich vieeel einfacher zu nutzen als AT und NOTIFY  :)

Eine Frage habe ich:
Ich würde gerne Rolladen um einen zufälligen Zeitraum (z.B. 0-10 Minuten) verzögert fahren lassen und habe das bisher erfolglos mit der wait Funktion probiert:
(([wetter.sonnenstand.dg_sued] eq "ein") or ([zeit.schlafen] eq "ein")) (bla bla Rolladen fahren runter)
wait int(rand(600))
PERL WARNING: Argument "int(rand(30))" isn't numeric in addition (+) at /usr/local/FHEM/share/fhem/FHEM/98_DOIF.pm line 1018.

Ist es mit wait möglich, eine zufällige Anzahl von Sekunden mit der Ausführung zu warten?

Grüße,
Alex
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 14 Mai 2015, 20:39:16
Zitat von: All-Ex am 14 Mai 2015, 20:18:26
Hi, ich bin neu hier und habe inzwischen alles auf DOIF umgestellt. Vielen Dank für die tolle Arbeit, das ist für mich vieeel einfacher zu nutzen als AT und NOTIFY  :)

Eine Frage habe ich:
Ich würde gerne Rolladen um einen zufälligen Zeitraum (z.B. 0-10 Minuten) verzögert fahren lassen und habe das bisher erfolglos mit der wait Funktion probiert:
(([wetter.sonnenstand.dg_sued] eq "ein") or ([zeit.schlafen] eq "ein")) (bla bla Rolladen fahren runter)
wait int(rand(600))
PERL WARNING: Argument "int(rand(30))" isn't numeric in addition (+) at /usr/local/FHEM/share/fhem/FHEM/98_DOIF.pm line 1018.

Ist es mit wait möglich, eine zufällige Anzahl von Sekunden mit der Ausführung zu warten?

Grüße,
Alex

Bei wait als Attribut sind z. Zt. nur feste Sekundenangaben möglich.

Du könntest es aber mit einem konventionellem sleep machen, z. B.

(([wetter.sonnenstand.dg_sued] eq "ein") or ([zeit.schlafen] eq "ein")) (sleep {(int(rand(30)))};bla bla Rolladen fahren runter)

mit einem Semikolon in DEF eingeben, in der Kommandozeile, mit zwei. Bitte beachten: eine solche sleep-Angabe funktioniert nur in DOIF, beim notify müsste man über Perl gehen.

Variable Angaben beim wait-Attribut werde ich mal auf die todo-Liste setzen.

Gruß

Damian

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: All-Ex am 14 Mai 2015, 22:35:31
Danke für die schnelle Antwort, funktioniert!  :)
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: tomster am 15 Mai 2015, 12:04:19
Servus zusammen!

Ich stricke gerade an einem DOIF für meine Waschmaschine. Dabei soll ein Dummy "Waschmaschine" wenn die Maschine fertig ist, den Status für 90 Minuten auf "Waschmaschine finished" setzen. Danach soll der Dummy auf den Status "Waschmaschine standby" gesetzt werden (immer vorausgesetzt, dass die Maschine in dieser Zeit nicht wieder in Betrieb geht). So recht hinhauen mag es aber noch nicht. Kann/ mag mir jemand auf die Sprünge helfen?

([WM_SenPwr] > 5) (set Waschmaschine running) DOELSEIF ([WM_SenPwr]< 5) (set Waschmaschine finished) DOELSEIF ([WM_SenPwr] = 0) (set Waschmaschine off) DOELSE (Waschmaschine standby)
...
attr <name> wait 300:5400
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 15 Mai 2015, 12:29:00
attr <name> wait 300:5400:0:0
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 15 Mai 2015, 12:39:28
Zitat von: tomster am 15 Mai 2015, 12:04:19

([WM_SenPwr] > 5) (set Waschmaschine running) DOELSEIF ([WM_SenPwr]< 5) (set Waschmaschine finished) DOELSEIF ([WM_SenPwr] = 0) (set Waschmaschine off) DOELSE (Waschmaschine standby)


Das DOIF wird so nix. Die dritte Alternative kommt nie zum Tragen, da vorher schon < 5 zuschlägt. Und die letzte Alternative wird auch nie zutreffen.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: tomster am 15 Mai 2015, 13:14:59
Zitat von: Ralli am 15 Mai 2015, 12:39:28
Das DOIF wird so nix. Die dritte Alternative kommt nie zum Tragen, da vorher schon < 5 zuschlägt. Und die letzte Alternative wird auch nie zutreffen.

OOPS, da hat er Recht, der Ralli...
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 15 Mai 2015, 13:18:09
versuchs mal so


([WM_SenPwr]< 5) (set Waschmaschine finished)
DOELSEIF ([WM_SenPwr] < 1) (set Waschmaschine off)
DOELSE (set Waschmaschine running)

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 15 Mai 2015, 14:42:14
Das wird auch nix.  :D
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 15 Mai 2015, 14:59:53
Zitat von: Ralli am 15 Mai 2015, 14:42:14
Das wird auch nix.  :D

glaub ich nicht.

das funktioniert auch


([Pac] > 2500 and [08:00-22:00]) (set LED_01 led green)
DOELSEIF ([Pac] > 1000 and [08:00-22:00]) ( set LED_01 led orange)
DOELSEIF ([Pac] < 1000 and [08:00-22:00]) (set LED_01 led red)

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 15 Mai 2015, 15:57:01
So könnte es klappen:


define di_WM DOIF ([WM_SenPwr] == 0)
  (setreading Waschmaschine state off)
DOELSEIF ([WM_SenPwr] > 5)
  (setreading Waschmaschine state running)
DOELSEIF ([WM_SenPwr] < 5 and [Waschmaschine] eq "running")
  (setreading Waschmaschine state finished)
DOELSEIF ([Waschmaschine] eq "finished")
  (setreading Waschmaschine state standby)
attr di_WM wait 0:0:0:5400
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: tomster am 15 Mai 2015, 16:16:50
Flurin, das funktioniert genauso wie ich es mir vorgestellt habe. Vielen Dank!

Hab das wait noch nach 0:0:300:5400 angepasst, damit das finished auch wirklich finished anzeigt.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 15 Mai 2015, 16:31:25
Zitat von: tomster am 15 Mai 2015, 16:16:50
Flurin, das funktioniert genauso wie ich es mir vorgestellt habe. Vielen Dank!

Hab das wait noch nach 0:0:300:5400 angepasst, damit das finished auch wirklich finished anzeigt.

Okey, mit Event monitor würde ich mal untersuchen, wie oft "Waschmaschine" gesetzt wird.
Vermutlich wird bei jeder WM_SenPwr-Änderung getriggert.
Wie ist der Bereich von WM_SenPwr? 0 bis xxx
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: tomster am 15 Mai 2015, 16:39:43
Zitat von: flurin am 15 Mai 2015, 16:31:25
Okey, mit Event monitor würde ich mal untersuchen, wie oft "Waschmaschine" gesetzt wird.
Vermutlich wird bei jeder WM_SenPwr-Änderung getriggert.
Wie ist der Bereich von WM_SenPwr? 0 bis xxx

Ja, es wird bei jeder Änderung getriggert. Im "Leerlauf" hab ich fast immer Werte zwischen 3.87 und 3.89. Ein event-on-change-reading mit entsprechendem Bereich dürfte die Trigger deutlich reduzieren. Probier ich mal.
Die Werte gehen laut offiziellen Angaben von eq-3 von 0-3680 Watt. Ich hab aber auch schon Werte um die 4500 Watt gesehen...
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 15 Mai 2015, 16:50:39
Zitat von: tomster am 15 Mai 2015, 16:39:43
Ja, es wird bei jeder Änderung getriggert. Im "Leerlauf" hab ich fast immer Werte zwischen 3.87 und 3.89. Ein event-on-change-reading mit entsprechendem Bereich dürfte die Trigger deutlich reduzieren. Probier ich mal.
Die Werte gehen laut offiziellen Angaben von eq-3 von 0-3680 Watt. Ich hab aber auch schon Werte um die 4500 Watt gesehen...

... zusätzlich könnte man das DOIF optimieren:


define di_WM DOIF ([WM_SenPwr] == 0 and [?Waschmaschine] ne "off")
  (setreading Waschmaschine state off)
DOELSEIF ([WM_SenPwr] > 5 and [?Waschmaschine] ne "running")
  (setreading Waschmaschine state running)
DOELSEIF ([WM_SenPwr] < 5 and [?Waschmaschine] eq "running")
  (setreading Waschmaschine state finished)
DOELSEIF ([Waschmaschine] eq "finished")
  (setreading Waschmaschine state standby)
attr di_WM wait 0:0:300:5400
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 15 Mai 2015, 19:39:36
Mal was anderes. Ich habe einen 2er-Taster, auf den ein DOIF reagiert. Und zwar immer gleich, mit einem set blabla toggle.

Das DOIF habe ich mit do always definiert. Klappt auch alles einwandfrei. Nun meine Verständnisfrage.

Angenommen, es wird jetzt (aus Versehen) ein Doppeltaster gedrückt, wie kann ich das verhindern? Ich habe es mit

cmdpause 3
repeatsame 1
do resetwait (oder always)

versucht, das funktioniert nicht - hier wird immer nur ein einziges mal der Toggle ausgeführt (denn der State ändert sich ja nicht). Wo ist mein Denkfehler?
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 15 Mai 2015, 22:13:13
Zitat von: flurin am 15 Mai 2015, 16:31:25
Okey, mit Event monitor würde ich mal untersuchen, wie oft "Waschmaschine" gesetzt wird.
Vermutlich wird bei jeder WM_SenPwr-Änderung getriggert.
Das DOIF ja, aber solange sich der State des DOIFs nicht ändert, (also auch wenn seine Bedingung immer und immer wieder zutrifft) wird sein Ausführungsteil auch nicht erneut ausgeführt. Außer es wäre "do always" gesetzt, was hier aber gerade keinen Sinn macht.

Im übrigen meine ich mich zu erinnern, dass das DOIF den State einnimmt, der nach den Bedingungszweigen als erstes zutrifft, alle anderen werden ignoriert. Wenn man die Bedingung nach "Leistung = 0" also vor der Abfrage "Leistung <5" einträgt, sollte es auch klappen.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 15 Mai 2015, 22:22:53
Zitat von: Ralli am 15 Mai 2015, 19:39:36
cmdpause 3
repeatsame 1
do resetwait (oder always)
... funktioniert nicht - hier wird immer nur ein einziges mal der Toggle ausgeführt Wo ist mein Denkfehler?
Mein Denkfehler (oder auch nicht) wäre "cmdpause 3" plus "do always", mehr nicht. cmdpause verzögert im Gegensatz zu wait nicht die Ausführung, sondern unterdrückt erneute Ausführungen für die Wartezeit.
repeatsame 1 hingegen sorgt dann dafür, dass es genau nur einmal funktioniert.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 16 Mai 2015, 06:37:41
Danke, Pfriemler.

Und ich dachte, repeatsame 1 würde bedeuten, dass innerhalb der mit cmdpause 3 eingestellten Wartezeit das Kommando nur einmal in drei Sekunden ausgeführt wird und danach der Zähler wieder zurückgesetzt wird.

Ich probiere :).

Bezüglich Deiner anderen Antwort: So sollte es sein. Interessanterweise habe ich mit folgendem DOIF aber eine andere Erfahrung gemacht:


([05:00|8] and [?FL_Rollo] eq "off") (set FL_Treppenlicht 30) DOELSEIF ([06:00|7] and [?GEN_Aussensensor:luminosity] > 10 and [?FL_Rollo] eq "off") (set FL_Rollo Schlitz) DOELSEIF ([06:00|7] and [?FL_Rollo] eq "off") (set FL_Treppenlicht 20)


Die logische Denkweise sagt, dass die erste Bedingung geprüft wird, nur dann, wenn die erste nicht zutrifft, die zweite und nur dann, wenn auch die nicht zutrifft, die dritte. Fakt ist aber, dass bei Nichtzutreffen der ersten Bedingung die zweite und die dritte immer beide angetriggert werden und den Ausführungsteil ausführen, wenn [?GEN_Aussensensor:luminosity] > 10, sonst natürlich nur die dritte.

Normalerweise sollte bei [?GEN_Aussensensor:luminosity] > 10 nach der zweiten Bedingung Schluss sein. Der Zeittrigger in der dritten Bedingung sorgt aber wohl trotzdem für ein Ausführen. Darum habe ich in der dritten dann noch ein [?GEN_Aussensensor:luminosity] <= 10 ergänzt.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 16 Mai 2015, 08:03:46
Zeitangaben im DOIF setzen interne Timer. Geprüft werden natürlich alle Bedingungen in den Zweigen. Im zweiten checkst du wochends um 6 Außenlicht und Rollo. Trifft alles zu, wird auf Schlitz gefahren. Wenn nicht, wird Zweig 3 gecheckt und ggf. ausgeführt.  Der ist die Alternative zu Zweig 2 und kommt dann zur Anwendung, wenn Außenlicht < 11 ist. Alles logisch.
Würdest Du Zweig 3 und 2 tauschen, würde unabhängig vom Außenlicht immer Zweig 2 greifen (bei FL_Rollo off)...

Du meinst jetzt aber, Zweig drei wird ohne den Test auf Helligkeit auch bei Helligkeit >10 ausgeführt?

Das ist unlogisch ... :)

edit: falls DOIF zwei Timer setzt (für die beiden Zweige quasi als Wecksignal je einen), um damit die Zweige zwei und drei nacheinander zu prüfen, würden evtl.  beide zutreffen und das DOIF zuerst auf 2, dann sofort auf 3 wechseln - faktisch beide ausführen. Dann führt aber das ELSE IF irgendwie logisch in die Irre... wäre praktisch eher ein DOALSOIF.
Und was sagt der Sprecher? :)
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 16 Mai 2015, 09:31:58
Zitat von: Pfriemler am 16 Mai 2015, 08:03:46
Zeitangaben im DOIF setzen interne Timer. Geprüft werden natürlich alle Bedingungen in den Zweigen. Im zweiten checkst du wochends um 6 Außenlicht und Rollo. Trifft alles zu, wird auf Schlitz gefahren. Wenn nicht, wird Zweig 3 gecheckt und ggf. ausgeführt.  Der ist die Alternative zu Zweig 2 und kommt dann zur Anwendung, wenn Außenlicht < 11 ist. Alles logisch.
Würdest Du Zweig 3 und 2 tauschen, würde unabhängig vom Außenlicht immer Zweig 2 greifen (bei FL_Rollo off)...

Du meinst jetzt aber, Zweig drei wird ohne den Test auf Helligkeit auch bei Helligkeit >10 ausgeführt?

Das ist unlogisch ... :)

edit: falls DOIF zwei Timer setzt (für die beiden Zweige quasi als Wecksignal je einen), um damit die Zweige zwei und drei nacheinander zu prüfen, würden evtl.  beide zutreffen und das DOIF zuerst auf 2, dann sofort auf 3 wechseln - faktisch beide ausführen. Dann führt aber das ELSE IF irgendwie logisch in die Irre... wäre praktisch eher ein DOALSOIF.
Und was sagt der Sprecher? :)

Zur Zeit wird für jede Zeitangabe ein separater Timer gesetzt. Geprüft wird grundsätzlich nur die Bedingung zum ausgelösten Timer.

Wenn man in zwei Bedingungen die gleiche Zeit angibt (hier 06:00 Uhr), so triggert das Modul zwei mal. Dabei ist bei gleicher Zeit die Reihenfolge des Triggerns nicht gewährleistet. Es kann also passieren, dass beim ersten Trigger Zweig 3 ausgeführt und beim zweiten Zweig 2.

Zukünftig will ich nur einen Timer für gleiche Zeit aufsetzen (damit würde man nur einmal triggern) und damit die Reihenfolge der Abarbeitung sicherstellen und es würde zum gleichen Zeitpunkt höchsten nur ein Zweig ausgeführt werden - der erste, für den die Bedingung wahr ist (wie man es eigentlich erwartet).

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 16 Mai 2015, 09:55:36
Danke für die Bestätigung. Kann Dich nur ermutigen das umzusetzen. Bleibt zu hoffen, dass nur wenige dieses Verhalten vielleicht trickreich ausgenutzt haben und dann auf die Nase fallen. Rallis DOIF würde aber auch dann weiter funktionieren.

geht nich Gips nich ...

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 16 Mai 2015, 10:03:14
Zitat von: Pfriemler am 16 Mai 2015, 09:55:36
Danke für die Bestätigung. Kann Dich nur ermutigen das umzusetzen. Bleibt zu hoffen, dass nur wenige dieses Verhalten vielleicht trickreich ausgenutzt haben und dann auf die Nase fallen. Rallis DOIF würde aber auch dann weiter funktionieren.

geht nich Gips nich ...

Da die Reihenfolge der Abarbeitung bei gleicher Zeit nicht gewährleistet ist, kann man es eigentlich nicht sinnvoll ausnutzen. Will man jetzt schon die Reihenfolge sicherstellen, so muss man leicht versetzte Zeiten angeben z. B. 06:00 Uhr im zweiten Fall und 06:00:01 Uhr im dritten.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 16 Mai 2015, 11:29:49
Zitat von: Pfriemler am 15 Mai 2015, 22:13:13
Das DOIF ja, aber solange sich der State des DOIFs nicht ändert, (also auch wenn seine Bedingung immer und immer wieder zutrifft) wird sein Ausführungsteil auch nicht erneut ausgeführt. Außer es wäre "do always" gesetzt, was hier aber gerade keinen Sinn macht.

Ja klar. Die vorgeschlagene "Schaltung" konnte ich ohne Gerät nicht ausführlich testen. Es kommt nicht selten vor, dass in der Praxis unerwartete Effekte auftauchen. Im Event Monitor nachzuschauen, ist immer hilfsreich.

Zitat von: Pfriemler am 15 Mai 2015, 22:13:13
Im übrigen meine ich mich zu erinnern, dass das DOIF den State einnimmt, der nach den Bedingungszweigen als erstes zutrifft, alle anderen werden ignoriert.

Ja, theoretisch. Es wird im Commandref auch ausführlich beschrieben. Ich versuche jedoch, die Abhängigkeit der Reihenfolge zu vermeiden.

Zitat von: Pfriemler am 15 Mai 2015, 22:13:13
Wenn man die Bedingung nach "Leistung = 0" also vor der Abfrage "Leistung <5" einträgt, sollte es auch klappen.

Stimmt nicht! In diesem Beispiel ist die Reihenfolge irrelevant. Folgende Bedingung hat nicht zufällig ein "and":


DOELSEIF ([WM_SenPwr] < 5 and [?Waschmaschine] eq "running")


Gruss
flurin
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 16 Mai 2015, 11:51:39
@flurin: ich meinte das Beispiel aus #70 und Rallis Einwand in #72. Durch einen entsprechenden Tausch sollte sich das doch ändern? Oder führt wie aktuell bei den Zeiten ein Event als einziger Trigger eines Zweiges dazu, dass alle betreffenden Zweige geprüft werden, auch wenn bereits einer zutraf? Dann wäre ja hier das "DOALSOIF" genauso angebracht.
Elseif-Strukturen in anderen Sprachen arbeiten m.W. immer so, dass die erste erfolgreiche Bedingung abgearbeitet und in diesem Fall keine weiteren Bedingungen mehr geprüft werden.

geht nich Gips nich ...

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 16 Mai 2015, 12:17:16
Zitat von: Pfriemler am 16 Mai 2015, 11:51:39
@flurin: ich meinte das Beispiel aus #70 und Rallis Einwand in #72. Durch einen entsprechenden Tausch sollte sich das doch ändern? Oder führt wie aktuell bei den Zeiten ein Event als einziger Trigger eines Zweiges dazu, dass alle betreffenden Zweige geprüft werden, auch wenn bereits einer zutraf? Dann wäre ja hier das "DOALSOIF" genauso angebracht.
Elseif-Strukturen in anderen Sprachen arbeiten m.W. immer so, dass die erste erfolgreiche Bedingung abgearbeitet und in diesem Fall keine weiteren Bedingungen mehr geprüft werden.

geht nich Gips nich ...

Grundsätzlich gilt:

1. Ein Trigger kann nur zur Ausführung eines Zweiges führen.

2. Es werden nur Bedingungen überprüft, wo der Trigger vorkommt (Device oder Zeit)

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 16 Mai 2015, 12:20:08
Zitat von: Pfriemler am 16 Mai 2015, 11:51:39
@flurin: ich meinte das Beispiel aus #70 und Rallis Einwand in #72. Durch einen entsprechenden Tausch sollte sich das doch ändern? Oder führt wie aktuell bei den Zeiten ein Event als einziger Trigger eines Zweiges dazu, dass alle betreffenden Zweige geprüft werden, auch wenn bereits einer zutraf? Dann wäre ja hier das "DOALSOIF" genauso angebracht.
Elseif-Strukturen in anderen Sprachen arbeiten m.W. immer so, dass die erste erfolgreiche Bedingung abgearbeitet und in diesem Fall keine weiteren Bedingungen mehr geprüft werden.

geht nich Gips nich ...

@Pfriemler

In deinem Posting #82 hast du mich zitiert. Ich konnte aus deinem Text nicht ableiten, worauf du dich bezogen hast.
Aber jetzt ist es klar. Wie gesagt, die Abhängigkeit der Reihenfolge zu vermeiden, finde ich bei DOIF sinnvoll.
Zudem kann man ein DOIF aufteilen, wenn es Konflikte gibt (siehe auch defensives Programmieren).

Im Commandref heisst es:

Zitat
Syntax angelehnt an Verzweigungen if - elseif - ... - elseif - else in höheren Sprachen

DOIF hat jedoch zusätzliche Eigenschaften und verhält sich nicht wie das "if" in höheren Sprachen.

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 16 Mai 2015, 12:31:30
Zitat von: flurin am 16 Mai 2015, 12:20:08
DOIF hat jedoch zusätzliche Eigenschaften und verhält sich nicht wie das "if" in höheren Sprachen.

ja, den Unterschied machen Trigger aus, die eine Aktion auslösen - die gibt es in höheren Sprachen bei "if" so nicht. Das macht die Sache etwas komplexer.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 16 Mai 2015, 13:18:27
Danke für den regen Austausch ;).

Also rein logisch betrachtet wäre es für die Abarbeitung eines DOIF sinnvoller, erst mal alle in der DOIF-Def vorhandenen Trigger "zu sammeln" bzw. auch zu konsolidieren (Stichwort gleiche Zeitangaben als Trigger) und dann rein strukturiert die Zweige mit ihren logischen Bedingungsprüfungen jeweils vom Start weg abzuarbeiten - egal, ob ein Trigger bspw. erst im dritten DOELSEIF auftaucht.

Dass das in der Programmierung komplex und nicht einfach ist, glaube ich gerne :).
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 16 Mai 2015, 13:48:17
Ich wiederhole mich: Zuerst ist man geneigt zu vermuten, das stets das gesamte DOIF gecheckt wird und als Trigger jedes irgendwo als Trigger definiertes Event im DOIF dient (so wie Ralli es eben vorschlägt). Wer "ElseIf" liest und es aus anderen Sprachen kennt, ist dann doch verwundert, wenn sich ein DOELSEIF nicht genauso verhält, wie es die Beispiele mit den Triggerzeiten und auch der Umstand, dass nur Bedingungszweige gecheckt werden, in denen der Trigger vorkommt, zeigen. DOIF verstehe ich stattdessen also als eine Sammlung von Bedingungsgruppen, deren letztes Zutreffen sich das DOIF zudem als Zustand merkt, und zwar jeweils nur den letzten, auch wenn sich mehrere Zweige quasi gleichzeitig als wahr erweisen und möglichweise auch ausgeführt werden.
ABER: Man kann hier nicht alles gleichzeitig haben, und es gibt ja genügend vernünftige Gründe es so zu tun wie es Damian umgesetzt hat, und mit
Zitat... die Abhängigkeit der Reihenfolge zu vermeiden, finde ich bei DOIF sinnvoll.
hat flurin auch absolut recht. Eine zusätzliche Abfrage in der entsprechenden Bedingungsgruppe kann viel Klarheit schaffen und tut niemandem weh. Ganz alternativ könnte man ja etwa bei dem Rollo-Beleuchtungs-Beispiel auch auf wochenends 6 Uhr triggern und den Rollozustand abfragen und erst im Ausführungsteil mit einem IF auf die Beleuchtungsstärke zwischen Rollobewegung und Treppenhausbeleuchtung entscheiden.

Etwas Offtopic:
Weiterhin: Eine ElseIf-Gruppe in anderen Sprachen hinterlässt nach ihrer Abarbeitung keine Spuren. DOIF ist ja zusätzlich noch ein Zustandsspeicher, und der Zustand des DOIF vor der erneuten Triggerung ist ohne "do always" auch eine versteckte Ausführungsbedingung. Das und der Umstand, dass die in den Zweigen formulierten Bedingungen aus völlig unterschiedlichen Kategorien stammen können, erlaubt einerseits interessante Zusammenfassungen von Automatisierungsvorgängen unter einem Dach, erlaubt aber immer noch nicht beliebige Konstruktionen als Zustandsspeicher (was kein Fehler von DOIF ist).

ZitatZudem kann man ein DOIF aufteilen, wenn es Konflikte gibt (siehe auch defensives Programmieren).

Genau. Ich habe mit meinem Garagentor versucht, dessen Zustände closed, opening, opened, closing und stopped (als Zwischenhalt unterwegs) durch die Abfrage von zwei Motorrelais und zwei Endlagenschaltern in ein DOIF zu pressen. Hierbei alle Eventualitäten zu berücksichtigen, etwa dass die Relais nicht gleich schnell schalten und der Motor erst nach dem Erreichen des Endlagenschalters stoppt, war auch mit gezielten waits nicht so trivial zu erreichen - letztlich wurde je ein DOIF für die Motorbewegung und ein weiteres für den Torzustand (closed, between, opend) und jeweilige sets auf einen Dummy die einfachere Lösung.

Ansonsten liebe ich gerade den Zustandsspeicher des DOIF und seine hervorragenden Formatierungsmöglichkeiten. Dass sich ganz ohne Zusatzdummys in der Weboberfläche ein DOIF hinter einer klarschriftlichen Bezeichnung (per alias) und einer Zustandsbeschreibung (per Attribut  cmdstate und ggf. state) verbergen kann, nutze ich so oft es irgend geht.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 16 Mai 2015, 13:58:38
Pfriemler, mein Beispiel-DOIF habe ich hier nur angeführt, um das "Problem" aufzuzeigen. Natürlich habe ich das längst um eine entsprechende Abfrage ergänzt und somit das "Problem" umschifft.

Letztendlich bleibt tatsächlich der letztendliche Unterschied zu einem klassischen elsif einer Programmiersprache. Man muss sich eben klar darüber sein, dass es in einem DOIF bislang scheinbar kein klassisches/echtes (DO)ELSIF gibt.

Damit wir uns recht verstehen: ich bin sehr froh über das Modul und noch mehr über Damians "Ansprechbarkeit"! Was ich aufzeigte, soll auch kein Gemecker sein - ich bin halt drüber gestolpert und wollte das hier kundtun, falls andere, die elsif kennen, hier ebenfalls an sich zweifeln :).
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 16 Mai 2015, 14:15:40
Zitat von: Ralli am 16 Mai 2015, 13:58:38
Pfriemler, mein Beispiel-DOIF habe ich hier nur angeführt, um das "Problem" aufzuzeigen. Natürlich habe ich das längst um eine entsprechende Abfrage ergänzt und somit das "Problem" umschifft.

Letztendlich bleibt tatsächlich der letztendliche Unterschied zu einem klassischen elsif einer Programmiersprache. Man muss sich eben klar darüber sein, dass es in einem DOIF bislang scheinbar kein klassisches/echtes (DO)ELSIF gibt.

Damit wir uns recht verstehen: ich bin sehr froh über das Modul und noch mehr über Damians "Ansprechbarkeit"! Was ich aufzeigte, soll auch kein Gemecker sein - ich bin halt drüber gestolpert und wollte das hier kundtun, falls andere, die elsif kennen, hier ebenfalls an sich zweifeln :).

Ich hatte schon mal geschrieben: Am Anfang der Entwicklungsphase des Moduls hat ein beliebiger Trigger immer zur Abarbeitung aller Zweige der Reihe nach geführt. Das war auch trivial zu programmieren, weil man sich nicht merken musste, welche Devices in welchen Bedingung steckten. Diese Vorgehensweise habe ich allerdings bereits vor der Veröffentlichen direkt verworfen, weil meine definierten DOIF-Module etwas taten, was ich eigentlich nicht wollte - Zweige auszuführen, die mit dem Trigger nichts zu tun hatten. Es zeigte sich nämlich, dass man beim Definieren einer Bedingung mit ihrem Ausführungsteil erst mal an die Sachen denkt, die in dieser Bedingung vorkommen und nicht an die Sachen, die in anderen Bedingung vorkommen. Das Problem zeigt sich immer noch beim DOELSE-Fall, an den viele nicht denken, der immer dann vorkommt, wenn die zu prüfenden Zweige nicht wahr sind - vor allem dann, wenn es mehrere DOELSEIF-Fälle gibt.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 16 Mai 2015, 17:31:10
Zitat...weil meine definierten DOIF-Module etwas taten, was ich eigentlich nicht wollte - Zweige auszuführen, die mit dem Trigger nichts zu tun hatten.
Darauf könnte ich antworten: Dann wäre zu überlegen, ob diese Zweige auch richtigerweise in dieses DOIF gehören. Denn eine Konstruktion wie (nur logisch gesprochen, nicht syntaktisch richtig)
DOIF ([Lichtdraußen] < x)(set Außenlicht on)
DOELSEIF ([LichtDrinnen] < y)(set Innenlicht on)
wird als Sammlung von Bedingungen wie gewünscht funktionieren, wenn die Zweige nur von den entsprechenden Triggern bedient werden: Wird's draußen dunkel, schalte das Licht ein, wird's drinnen dunkel, schalte das Licht ein. Beim Abklappern des gesamten DOIF nach dem Auftreten eines der beiden Trigger würde das Innenlicht aber nie angehen, wenn es zuerst draußen dunkel wird, weil die erste Bedingung wahr ist - und Schluss. Man kann sich aber an dieser Stelle trefflich streiten, ob diese beiden eigentlich voneinander völlig unabhängigen Fälle ins gleiche DOIF gehören. 

Abgesehen davon muss ich diese Aussagen:
ZitatDamit wir uns recht verstehen: ich bin sehr froh über das Modul und noch mehr über Damians "Ansprechbarkeit"! Was ich aufzeigte, soll auch kein Gemecker sein - ich bin halt drüber gestolpert und wollte das hier kundtun, falls andere, die elsif kennen, hier ebenfalls an sich zweifeln
mal ganz dick unterschreiben. Wir können uns nur wünschen, dass es so bleibt!
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 16 Mai 2015, 19:01:32
Zitat von: Pfriemler am 16 Mai 2015, 17:31:10
Darauf könnte ich antworten: Dann wäre zu überlegen, ob diese Zweige auch richtigerweise in dieses DOIF gehören. Denn eine Konstruktion wie (nur logisch gesprochen, nicht syntaktisch richtig)
DOIF ([Lichtdraußen] < x)(set Außenlicht on)
DOELSEIF ([LichtDrinnen] < y)(set Innenlicht on)
wird als Sammlung von Bedingungen wie gewünscht funktionieren, wenn die Zweige nur von den entsprechenden Triggern bedient werden: Wird's draußen dunkel, schalte das Licht ein, wird's drinnen dunkel, schalte das Licht ein. Beim Abklappern des gesamten DOIF nach dem Auftreten eines der beiden Trigger würde das Innenlicht aber nie angehen, wenn es zuerst draußen dunkel wird, weil die erste Bedingung wahr ist - und Schluss. Man kann sich aber an dieser Stelle trefflich streiten, ob diese beiden eigentlich voneinander völlig unabhängigen Fälle ins gleiche DOIF gehören. 

DOIF unterscheidet nicht grundsätzlich zwischen Zeit- bzw. Device-Triggerung.

Bei diesem Beispiel gehören beide Bedingungen in ein Modul, weil es sich um das gleiche Rollo handelt. Nun möchte jemand, dass es bei Helligkeit morgens hoch fährt und prinzipiell um 19:00 Uhr runter fährt, ob es noch hell ist oder nicht:

DOIF ([hell] eq "on") (set rollo hoch)
DOELSEIF ([19:00]) (set rollo runter)


Um 19:00 Uhr würde der Rollladen aber nicht runterfahren, wenn es noch hell ist.

Gruß

Damian


Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 17 Mai 2015, 18:54:50
Hallo. Habe fehlermeldung bei folgendem doif.

  ([ mytwilight:akt.event] eq "ss") (set Steckdose1 on-till 22:30,define next2 at +00:00:30 set Vorgarten_links1 on-till 22:32,define next3 at +00:01:00 set Vorgarten_Haus on-till 22:20,define next4 at +00:01:30 set Antikleuchte on-till 23:00,define next5 at +00:15:00 set Poolbeleuchtung on-till 22:31,set Dunkelheit on)

Error: define next5 already defined, delete it first.   Warum? Kann kein next5 finden

Sent from my OPO

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 18 Mai 2015, 00:19:33
Ernstlich? Dein DOIF definiert zur Ausführungzeit einmalige 5 at's, die sich nach Ausführung selbst löschen. Taucht die Fehlermeldung zur Ausführungszeit auf (z.B. im Log), dann war das betreffende at noch nicht aktiv und existiert demnach noch. Einmalige at tauchen nicht in der fhem.cfg, sondern nur im statefile auf. "list next.*" sollte Dir alle noch aktiven (wartenden) at's mit dem Namen auf der Kommandoebene zeigen.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 18 Mai 2015, 06:30:53
ja, wirklich. Fehlermeldung steht schon wieder an.
Ich denke kommt bei anlegen von next5. komisch das aber fehlerfrei geschalten wird.
vielleicht nur ein bug von DOIF ?

list next5 ergibt kein ergebnis.

gruss
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 18 Mai 2015, 07:19:13
Es könnte daran liegen, dass ein weiterer auslösender Event vor Ablauf der 15 Minuten das DOIF erneut getriggert hat. Setze mal im DOIF Verbose auf 5.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: duke-f am 18 Mai 2015, 09:38:53
Ohne dass ich jetzt alles hier mitverfolgt hätte: Könnte hier das neue "defmod" eine Lösung darstellen?
http://forum.fhem.de/index.php/topic,36326.0.html (http://forum.fhem.de/index.php/topic,36326.0.html)
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: flurin am 18 Mai 2015, 10:37:10
@satprofi

Was ist der Zweck der Verzögerungen? Evtl. geht es ohne "at".

Gruss
flurin
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 18 Mai 2015, 11:06:29
Zitat von: Ralli am 18 Mai 2015, 07:19:13
Es könnte daran liegen, dass ein weiterer auslösender Event vor Ablauf der 15 Minuten das DOIF erneut getriggert hat. Setze mal im DOIF Verbose auf 5.

Hallo.
Habe Fehler gefunden, doAlways ist hier fehl am Platz........

gruss
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Ralli am 18 Mai 2015, 11:35:29
Das wiederum glaube ich nicht - zumindest nicht mit der momentanen Definition. Denn Dein DOIF kann bislang nur genau einen Status annehmen und wird daher auch nur ein einziges mal und danach nie wieder das CMD_1 ausführen.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: satprofi am 18 Mai 2015, 14:08:00
Dürfte aber so gewesen sein.
Habe anderes reading als Test für triggerung genommen. Und da kam die meldung gleich nach änderung des readings, obwohl schon next* definiert waren.
Und ich denke das myTwilight auch regelmässig triggert.
werde heute abend genaueres wissen, wenn trigger anstöst.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 18 Mai 2015, 21:28:26
Zitat von: satprofi am 18 Mai 2015, 14:08:00
Dürfte aber so gewesen sein.
Habe anderes reading als Test für triggerung genommen. Und da kam die meldung gleich nach änderung des readings, obwohl schon next* definiert waren.
Und ich denke das myTwilight auch regelmässig triggert.
werde heute abend genaueres wissen, wenn trigger anstöst.

Wenn diese Meldung "define next5 already defined, delete it first." kommt, dann ist klar, dass im DOIF-Modul das at-Define wieder aufgesetzt wird, obwohl das vorherige at noch nicht abgearbeitet ist - das hat nicht viel mit DOIF zu tun. Wie schon vorgeschlagen, das neue defmod statt define verwenden, dann wird at neu aufgesetzt, obwohl das alte noch nicht ausgeführt ist. Am besten aber, du findest heraus, warum dein Modul öfters getriggert wird, als du denkst.

Gruß

Damian

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Christian72D am 28 Oktober 2015, 17:16:08
Das mit der Zeit klingt spannend.

Läßt sich folgendes realisieren: wenn meine Wohnungstür geöffnet wird (W.Tuer) und ein bestimmtes Gerät nicht innerhalb 60 Sekunden eingeschaltet wird (Strom), dann soll eine Lampe (Licht) eingeschaltet werden?
Dabei muß berücksichtigt werden daß  die Tür in der Zeit auch schon wieder geschlossen sein kann.

Stelle ich mir als eine Art Einbruchschutz vor.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 28 Oktober 2015, 21:20:20
Zitat von: Christian72D am 28 Oktober 2015, 17:16:08
Das mit der Zeit klingt spannend.

Läßt sich folgendes realisieren: wenn meine Wohnungstür geöffnet wird (W.Tuer) und ein bestimmtes Gerät nicht innerhalb 60 Sekunden eingeschaltet wird (Strom), dann soll eine Lampe (Licht) eingeschaltet werden?
Dabei muß berücksichtigt werden daß  die Tür in der Zeit auch schon wieder geschlossen sein kann.

Stelle ich mir als eine Art Einbruchschutz vor.

Das, was du vorhast hat eigentlich nichts mit den neuen (inzwischen alten) Zeit-Features zu tun.

define di DOIF ([W.Tuer] eq "opened") (set licht on) DOELSEIF ([Strom] eq "on")
attr di wait 60


Das wait-Attribut gab es immer schon.

Gruß

Damian

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: FunkOdyssey am 29 Oktober 2015, 10:44:07
Zitat von: Damian am 28 Oktober 2015, 21:20:20
Das, was du vorhast hat eigentlich nichts mit den neuen (inzwischen alten) Zeit-Features zu tun.

define di DOIF ([W.Tuer] eq "opened") (set licht on) DOELSEIF ([Strom] eq "on")
attr di wait 60


Das wait-Attribut gab es immer schon.

Aber genau das wird ja nicht funktionieren, oder?
Christian72D hat ja erwähnt, dass der Alarm auch dann ausgelöst werden soll, wenn die Tür wieder geschlossen wird.

In deinem Beispiel würde das Licht nicht angehen, wenn die Tür innerhalb von 60sec wieder geschlossen wird.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 29 Oktober 2015, 11:29:20
Zitat von: FunkOdyssey am 29 Oktober 2015, 10:44:07
Aber genau das wird ja nicht funktionieren, oder?
Christian72D hat ja erwähnt, dass der Alarm auch dann ausgelöst werden soll, wenn die Tür wieder geschlossen wird.

In deinem Beispiel würde das Licht nicht angehen, wenn die Tür innerhalb von 60sec wieder geschlossen wird.

Ich habe nichts von "Ausschalten eines Alarms" in seiner Anforderung gesehen. Für mich ist Lampe = Alarm.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: FunkOdyssey am 29 Oktober 2015, 11:52:51
Zitat von: Christian72D am 28 Oktober 2015, 17:16:08Dabei muß berücksichtigt werden daß  die Tür in der Zeit auch schon wieder geschlossen sein kann.

Ich hatte das hier so verstanden.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: rapster am 02 November 2015, 23:00:16
Hallo Damian,

steh grad bisschen auf dem Schlauch, ich möchte zu einer Zeit welche durch eine Perl-Funktion vorgegeben ist mit DOIF schalten, der Rückgabewert dieses Perlfunktion kann sich allerdings jederzeit ändern, und sollte zumindest alle X Minuten aktualisiert werden.

Wenn ich jetzt
([{fn()}]) (set dummy on)
mache, wird das nur bei einem modify aktualisiert.

So
([{fn("[+10]")}]) (set dummy on)
habe ich es auch schonmal probiert, aktualisiert allerdings trotzdem nicht (hab ich in nem anderen thread gefunden).

i.M. bin ich bei dieser Lösung mit einem zusätzlichen dummy angekommen, was nicht gerade hübsch ist aber zumindest funktioniert :-\
([+10]) (set timeDummy {fn()}) DOELSEIF ([[timeDummy]]) (set dummy on)

Hast du einen Tipp wie das evtl. ohne zwischenspeichern in einem dummy/reading lösbar ist?

Gruß
  Claudiu
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 03 November 2015, 15:05:36
Zitat von: rapster am 02 November 2015, 23:00:16
Hallo Damian,

steh grad bisschen auf dem Schlauch, ich möchte zu einer Zeit welche durch eine Perl-Funktion vorgegeben ist mit DOIF schalten, der Rückgabewert dieses Perlfunktion kann sich allerdings jederzeit ändern, und sollte zumindest alle X Minuten aktualisiert werden.

Wenn ich jetzt
([{fn()}]) (set dummy on)
mache, wird das nur bei einem modify aktualisiert.

So
([{fn("[+10]")}]) (set dummy on)
habe ich es auch schonmal probiert, aktualisiert allerdings trotzdem nicht (hab ich in nem anderen thread gefunden).

i.M. bin ich bei dieser Lösung mit einem zusätzlichen dummy angekommen, was nicht gerade hübsch ist aber zumindest funktioniert :-\
([+10]) (set timeDummy {fn()}) DOELSEIF ([[timeDummy]]) (set dummy on)

Hast du einen Tipp wie das evtl. ohne zwischenspeichern in einem dummy/reading lösbar ist?

Gruß
  Claudiu

Wann eine Funktion ihre Ausgabe ändert, kann das Modul natürlich nicht erkennen. Deswegen ist der Umweg über einen Dummy wohl die richtige Lösung.

Gruß

Damian
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: rapster am 03 November 2015, 15:53:52
Ok danke, dachte evtl. gibts da irgend ein attr, trigger-Anweisung oder sonstiges um die perl expressions regelmäßig auswerten zu lassen.

Gruß
  Claudiu
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: andies am 18 Dezember 2017, 13:38:20
Ich habe eine Frage zu den Zeitfunktionen. Ich möchte gern um 6 und um 18 Uhr etwas auslösen und dachte an
DOIF ([06:00] or [18:00]) (set blabla)
Allerdings wird bei mir der Befehl am Ende nicht ausgeführt. In den Readings wird er aber ,,angekündigt". Ist denn wenigstens erstmal die Syntax in Ordnung?
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: kumue am 18 Dezember 2017, 13:50:16
Attribut do always setzen, dann geht das...
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: andies am 18 Dezember 2017, 14:13:54
Oh Mist, das hatte ich doch gerade gelesen mit dem do always und dem Streit darüber...

@damian: Könnte man das nicht immer setzen? Oder spricht da etwas dagegen?
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: kumue am 18 Dezember 2017, 14:25:34
Zitat von: andies am 18 Dezember 2017, 14:13:54
Oh Mist, das hatte ich doch gerade gelesen mit dem do always und dem Streit darüber...

@damian: Könnte man das nicht immer setzen? Oder spricht da etwas dagegen?

wenn all deine DOIFs z.B. mit DO_ anfangen, könntest du auf global defined triggern...
define no1 notify global:DEFINED.DO_.* attr $EVTPART1 do always
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Wasserwerk33 am 22 Mai 2020, 16:48:07
Hallo Leute habe mir die Schreibweise von der ersten Seite genommen. Aber glaube nicht das ich es so richtig geschrieben habe. Den er sagt ich habe auch einen Fehler. Denke auch in den Klammern. Aber welche sind den falsch oder ejar zu viel.

([?20:00-03:30]
and
[avr:power] eq "off")
(set Erdgeschoss_Licht off )
DOELSEIF
([([22:30]+int(rand(1800))) |Mo Di Mi Do So]) or ([([22:20]+int(rand(7200)))] |Fr Sa])
and
[Eltern] eq "absend"
and
[Babysitter] eq "weg")
(set Erdgeschoss_Licht off )
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 22 Mai 2020, 18:03:50
([?20:00-03:30]
and
[avr:power] eq "off")
(set Erdgeschoss_Licht off )
DOELSEIF
(([([22:30]+int(rand(1800))) |Mo Di Mi Do So] or [([22:20]+int(rand(7200)))|Fr Sa])
and
[Eltern] eq "absend"
and
[Babysitter] eq "weg")
(set Erdgeschoss_Licht off )
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 22 Mai 2020, 19:30:08
Je nachdem woher der Wert für [Eltern] kommt, könnte es sein, dass sie nie "absend" sind...  ;)
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Wasserwerk33 am 22 Mai 2020, 23:55:18
@Damian
Danke für den Code werde ihn mal ausprobieren.

@Pfriemler

Sind unsere Handys die über die Fritzbox laufen und in einer Strucrure untergebracht sind. Das hat eigentlich immer funktoniert. Wieso meinst du den das das nicht funkoniert?
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Pfriemler am 23 Mai 2020, 08:13:35
Structures bekommen die Werte in der Regel anderweitig zugeliefert. Und abwesende Geräte sind i.d.R. absent, es sei denn Du hast selbst eine Umbenennung eingebaut
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Wasserwerk33 am 24 Mai 2020, 22:47:02
So habe es nochmal probiert habe das mit den Eltern auch rausgenommen und habe es durch mich und Frau auf present geändert.
Es schaltet nun aber dauerhaft obwohl wir zuhause sind und AVR:power on ist.

Internals:
   CFGFN     
   DEF        ([?20:00-03:30]
and
[avr:power] eq "off" and [Stefan] eq "present" or [Christin] eq "present")
(set Erdgeschoss_Licht off )
DOELSEIF
(([([22:00]+int(rand(1800))) |Mo Di Mi Do So]) or ([([22:20]+int(rand(7200))) |Fr Sa])
and
[Stefan] eq "absent" and [Christin] eq "absent"
and
[avr:power] eq "off")
(set Erdgeschoss_Licht off )
   FUUID      5ec6df24-f33f-faf7-3710-eae47bcededb8c02
   MODEL      FHEM
   NAME       Licht_steuerung
   NOTIFYDEV  global,Stefan,Christin,avr
   NR         16776
   NTFY_ORDER 50-Licht_steuerung
   STATE      cmd_1
   TYPE       DOIF
   VERSION    20811 2019-12-22 17:45:08
   READINGS:
     2020-05-24 22:45:12   Device          Christin
     2020-05-24 22:44:09   cmd             1
     2020-05-24 22:44:09   cmd_event       Stefan
     2020-05-24 22:44:09   cmd_nr          1
     2020-05-24 22:45:12   e_Christin_STATE present
     2020-05-24 22:45:09   e_Stefan_STATE  present
     2020-05-24 22:43:58   mode            enabled
     2020-05-24 22:44:09   state           cmd_1
     2020-05-24 22:43:58   timer_01_c01    25.05.2020 20:00:00
     2020-05-24 22:43:58   timer_02_c01    25.05.2020 03:30:00
     2020-05-24 22:43:58   timer_03_c02    25.05.2020 22:26:12|MoDiMiDoSo
     2020-05-24 22:43:58   timer_04_c02    24.05.2020 22:52:32|FrSa
   Regex:
     accu:
     cond:
       Christin:
         0:
           &STATE     ^Christin$
         1:
           &STATE     ^Christin$
       Stefan:
         0:
           &STATE     ^Stefan$
         1:
           &STATE     ^Stefan$
       avr:
         0:
           power      ^avr$:^power:
         1:
           power      ^avr$:^power:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms)  and  ::ReadingValDoIf($hash,'avr','power') eq "off" and ::InternalDoIf($hash,'Stefan','STATE') eq "present" or ::InternalDoIf($hash,'Christin','STATE') eq "present"
     1          (::DOIF_time_once($hash,2,$wday,"MoDiMiDoSo")) or (::DOIF_time_once($hash,3,$wday,"FrSa"))  and  ::InternalDoIf($hash,'Stefan','STATE') eq "absent" and ::InternalDoIf($hash,'Christin','STATE') eq "absent"  and  ::ReadingValDoIf($hash,'avr','power') eq "off"
   days:
     2          MoDiMiDoSo
     3          FrSa
   do:
     0:
       0          set Erdgeschoss_Licht off
     1:
       0          set Erdgeschoss_Licht off
     2:
   helper:
     DEVFILTER  ^global$|^Stefan$|^avr$|^Christin$
     NOTIFYDEV  global|Stefan|avr|Christin
     event      present,presence: present
     globalinit 1
     last_timer 4
     sleeptimer -1
     timerdev   Christin
     timerevent present,presence: present
     triggerDev Christin
     timerevents:
       present
       presence: present
     timereventsState:
       state: present
       presence: present
     triggerEvents:
       present
       presence: present
     triggerEventsState:
       state: present
       presence: present
   internals:
     all         Stefan:STATE Christin:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   localtime:
     0          1590429600
     1          1590370200
     2          1590438372
     3          1590353552
   readings:
     all         avr:power
   realtime:
     0          20:00:00
     1          03:30:00
     2          22:26:12
     3          22:52:32
   time:
     0          20:00:00
     1          03:30:00
     2          ([22:00]+int(rand(1800)))
     3          ([22:20]+int(rand(7200)))
   timeCond:
     0          0
     1          0
     2          1
     3          1
   timer:
     0          0
     1          0
     2          0
     3          0
   timers:
     1           2  3
   trigger:
   triggertime:
     1590353552:
       localtime  1590353552
       hash:
     1590370200:
       localtime  1590370200
       hash:
     1590429600:
       localtime  1590429600
       hash:
     1590438372:
       localtime  1590438372
       hash:
   uiState:
   uiTable:
Attributes:
   room       Licht


Irgendwo habe ich einen schreibfehler? Oder nimmt der einen wert irgendwo falsch??
Selbst wenn ich Set checkall ausführe. Er springt dann in CMD1 da dürfte er doch eigentlich nicht reinspringen.

danke
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: amenomade am 25 Mai 2020, 01:01:57
([?20:00-03:30] and [avr:power] eq "off" and [Stefan] eq "present" or [Christin] eq "present")


and or Vorrang.  Was Du geschrieben hast, ist wie:
(
([?20:00-03:30] and [avr:power] eq "off" and [Stefan] eq "present")
or [Christin] eq "present"
)


Jedes mal wenn Christin "present" meldet, ist die Bedingung 1 wahr, egal den Rest.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Wasserwerk33 am 25 Mai 2020, 21:56:36
@ amenomade
Ich habe es geändert wie du es mir geschrieben hast. Leider nicht geklappt. Und ja du hast recht er meldet die ganze Zeit Christin present.
Und schaltet daher.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: amenomade am 25 Mai 2020, 23:03:23
Ich habe überhaupt keine Lösung geschrieben. Ich habe nur deinen Fehler anders dargestellt, um besser zu zeigen, warum es ein Fehler ist. Beide "code" Abschnitte in meinem vorherigen Post sind absolut gleichwertig und führen zum gleichen Ergebnis.

Natürlich musst Du die Klammern anders setzen, damit es funktioniert:
xxx and xxx and (xxx or xxx)
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: cRossi am 24 Juni 2020, 20:42:29
Zitat von: Damian am 29 März 2015, 22:16:05



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)



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.


Ich habe versucht das anzuwenden:


define Wecker dummy
setreading Wecker alarm 05:45:00

([[Wecker:alarm]|AT]
and [?[Wecker:alarm]-{sunrise_abs(1800)}]) (
set blabla on
)


aber das funktioniert leider nicht richtig


timer_01_c01    25.06.2020 05:45:00|AT
timer_02_c01    24.06.2020 05:45:00


Der Timer aus dem reading bleibt immer eine Tag in der Vergangenheit hängen, während sunrise mit dem neuen Datum rechnet - somit ist das Intervall [?[Wecker:alarm]-{sunrise_abs(1800)}] immer wahr.  :(

Wie funktioniert das richtig...?


Danke und Gruß
cRossi

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 24 Juni 2020, 22:50:05
Das ist alles ok, der Trigger kommt jeden Tag, das Setzen beider Grenzen bei Zeitintervallen wird immer erst am Ende des Zeitintervalls gesetzt.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: cRossi am 26 Juni 2020, 10:29:35
Hmm, ist irgendwie nicht ganz mein Verständnis, dass hier das Datum in der Zeitberechnung enthalten ist - denn wenn ich anstelle des Readings die Zeit "05:45" direkt eingebe funktioniert das Spiel ja komischer Weise richtig...  ???

Wie bekomme ich das denn dann hin das der Wecker nur vor Sonnenaufgang angeht und zwar immer zu einer bestimmten Zeit die ich über ein Reading ändern kann?

Danke und Gruß
cRossi
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 26 Juni 2020, 10:38:32
Zitat von: cRossi am 26 Juni 2020, 10:29:35
Hmm, ist irgendwie nicht ganz mein Verständnis, dass hier das Datum in der Zeitberechnung enthalten ist - denn wenn ich anstelle des Readings die Zeit "05:45" direkt eingebe funktioniert das Spiel ja komischer Weise richtig...  ???

Wie bekomme ich das denn dann hin das der Wecker nur vor Sonnenaufgang angeht und zwar immer zu einer bestimmten Zeit die ich über ein Reading ändern kann?

Danke und Gruß
cRossi

Das, was ich gesagt habe, gilt nur für Zeitintervalle. Beim normalen Zeittrigger wird die neue Zeit zum Triggerzeitpunkt berechnet.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: cRossi am 26 Juni 2020, 11:18:42
Nicht wirklich hilfreich, außerdem geht es komischerweise wenn ich die Zeit auch im Intervall eintrage, aber danke dann bastel ich mir was anderes
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 26 Juni 2020, 12:43:38
Ich glaube wir reden aneinander vorbei.

1.) Die Wahrheit eines Zeitintervalls ist nur abhängig von der Uhrzeit und nicht vom Datum.

2.) Ein indirekter Timer (auch Zeitintervallgrenzen) werden immer! sofort aktualisiert, wenn sich die Zeitangabe ändert.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: cRossi am 26 Juni 2020, 13:57:57
Ok, dann mal anders gefragt:
Wie sieht eine Zeit-Bedingung aus die abfragt ob sunrise größer bzw. kleiner als eine definierte Zeit ist?

Das hier funktioniert ja leider auch nicht:



(... [?[Wecker:alarm] le {sunrise_abs(1800)}]) ...

Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 26 Juni 2020, 17:05:13
Dann eher

([[wecker:alarm]|AT] and [?wecker:alarm] le {sunrise_abs(1800)}) (
set blabla on
)

da der Vergleichoperator le Zeichen vergleicht (lexikografisch), solltest du wecker:alarm im Format hh:mm:ss setzen.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: bommel-bs am 02 Juli 2020, 11:15:58
Ich habe auch mit der Zeitberechnung getestet und komme zu keinem positiven Ergebnis.

Ich habe setreading di_KinderZimmer_Rolladen StartLangsam 09:30:00 gesetzt. Leider wird der Wert aber als 0 erkannt.

setreading di_KinderZimmer_Rolladen StartLangsam 09:30:00


ergibt dann

timer_10_c14 03.07.2020 00:10:00


Hier noch das ganze Listing:

Internals:
   DEF        ([06:15 | AT ] and [JasminFrei] eq "0" and ::isday and [KinderZimmer_Rolladen_Balkon:pct] < 20)
   (set KinderZimmer_Rolladen_Balkon 20)
DOELSEIF ([({sunrise(0,"08:30", "9:00")}) | 7] and [wech] eq "wech")
   (set KinderZimmer_Rolladen_Fenster on,
    set KinderZimmer_Rolladen_Balkon on)
DOELSEIF ([({sunrise(0,"07:30", "9:00")}) | 6] and [wech] eq "wech") 
   (set KinderZimmer_Rolladen_Fenster on,
    set KinderZimmer_Rolladen_Balkon on)
DOELSEIF ([({sunrise(0,"07:30", "9:00")} ) | AT ]  and [wech] eq "wech") 
   (set KinderZimmer_Rolladen_Fenster on,
    set KinderZimmer_Rolladen_Balkon on)
DOELSEIF ([({sunset(-600, "16:00", "22:00")} ) ] and [KinderZimmer_Balkontuer:state] eq "open" and [KinderZimmer_Rolladen_Balkon:pct] > 50)
   (set KinderZimmer_Rolladen_Fenster off,
    set KinderZimmer_Rolladen_Balkon 50,
    setreading di_KinderZimmer_Rolladen Balkon soll_zu)
DOELSEIF ([({sunset(-600, "16:00", "22:00")} ) ] and [KinderZimmer_Balkontuer:state] eq "open" and [KinderZimmer_Rolladen_Balkon:pct] <= 50)
   (set KinderZimmer_Rolladen_Fenster off)
DOELSEIF ([({sunset(-600, "16:00", "22:00")} ) ] and [KinderZimmer_Balkontuer:state] eq "closed")
   (set KinderZimmer_Rolladen_Fenster off,
    set KinderZimmer_Rolladen_Balkon off)
DOELSEIF ([({sunset(-600, "16:00", "22:00")} ) ] and [KinderZimmer_Balkontuer:state] eq "tilted"  and [KinderZimmer_Rolladen_Balkon:pct] > 10)
   (set KinderZimmer_Rolladen_Fenster off,
    set KinderZimmer_Rolladen_Balkon 10,
    setreading di_KinderZimmer_Rolladen Balkon soll_zu)
DOELSEIF ([({sunset(-600, "16:00", "22:00")} ) ] and [KinderZimmer_Balkontuer:state] eq "tilted"  and [KinderZimmer_Rolladen_Balkon:pct] <= 10)
   (set KinderZimmer_Rolladen_Fenster off,
    set KinderZimmer_Rolladen_Balkon off)
DOELSEIF ([KinderZimmer_Balkontuer:state] eq "closed" and [di_KinderZimmer_Rolladen:Balkon] eq "soll_zu")
   (set KinderZimmer_Rolladen_Balkon off,
   setreading di_KinderZimmer_Rolladen Balkon zu)
DOELSEIF ([Temp_outside:temperature] > 25 and [KinderZimmer_Rolladen_Fenster:pct] > 40 and [KinderZimmer_Rolladen_Fenster:UserMode] ne "manuell")
   (set KinderZimmer_Rolladen_Fenster 40)
DOELSEIF ([Temp_outside:temperature] > 25 and [KinderZimmer_Rolladen_Balkon:pct] > 40 and [KinderZimmer_Rolladen_Balkon:UserMode] ne "manuell")
   (set KinderZimmer_Rolladen_Balkon 40)
DOELSEIF ([di_KinderZimmer_Rolladen:StartLangsam ] and [JasminFrei] eq "1" and ::isday and [KinderZimmer_Rolladen_Balkon:pct] < 25)
   (set KinderZimmer_Rolladen_Balkon 25)
DOELSEIF ([di_KinderZimmer_Rolladen:StartLangsam | AT ] + [00:10] and [JasminFrei] eq "1" and ::isday and [KinderZimmer_Rolladen_Balkon:pct] < 50)
   (set KinderZimmer_Rolladen_Balkon 50)
DOELSEIF ([di_KinderZimmer_Rolladen:StartLangsam | AT ] + [00:20] and [JasminFrei] eq "1" and ::isday and [KinderZimmer_Rolladen_Balkon:pct] < 75)
   (set KinderZimmer_Rolladen_Balkon 75)
DOELSEIF ([di_KinderZimmer_Rolladen:StartLangsam | AT ] + [00:30] and [JasminFrei] eq "1" and ::isday and [KinderZimmer_Rolladen_Balkon:pct] < 100)
   (set KinderZimmer_Rolladen_Balkon 100,
    set KinderZimmer_Rolladen_Fenster on)
   FUUID      5c4b3ffe-f33f-78f8-d9d1-105e980cbe03d91f
   MODEL      FHEM
   NAME       di_KinderZimmer_Rolladen
   NOTIFYDEV  KinderZimmer_Rolladen_Fenster,global,di_KinderZimmer_Rolladen,wech,KinderZimmer_Rolladen_Balkon,Temp_outside,JasminFrei,KinderZimmer_Balkontuer
   NR         549
   NTFY_ORDER 50-di_KinderZimmer_Rolladen
   STATE      initialize
   TYPE       DOIF
   VERSION    22030 2020-05-25 14:10:16
   READINGS:
     2020-04-26 21:50:35   Balkon          zu
     2020-07-02 11:10:29   Device          Temp_outside
     2020-07-02 11:05:20   StartLangsam    09:30:00
     2020-07-02 08:47:00   e_KinderZimmer_Balkontuer_state closed
     2020-07-02 10:40:40   e_KinderZimmer_Rolladen_Balkon_UserMode Auto
     2020-07-02 10:49:59   e_KinderZimmer_Rolladen_Balkon_pct 100
     2020-07-02 10:40:09   e_KinderZimmer_Rolladen_Fenster_UserMode Auto
     2020-07-02 10:49:59   e_KinderZimmer_Rolladen_Fenster_pct 100
     2020-07-02 11:10:29   e_Temp_outside_temperature 20.5
     2020-07-02 11:05:36   mode            enabled
     2020-07-02 11:05:37   state           initialize
     2020-07-02 08:24:36   timer_01_c01    03.07.2020 06:15:00|AT
     2020-07-02 08:30:00   timer_02_c02    03.07.2020 08:30:00|7
     2020-07-02 08:24:36   timer_03_c03    03.07.2020 07:30:00|6
     2020-07-02 08:24:36   timer_04_c04    03.07.2020 07:30:00|AT
     2020-07-02 08:24:36   timer_05_c05    02.07.2020 22:00:00
     2020-07-02 08:24:36   timer_06_c06    02.07.2020 22:00:00
     2020-07-02 08:24:36   timer_07_c07    02.07.2020 22:00:00
     2020-07-02 08:24:36   timer_08_c08    02.07.2020 22:00:00
     2020-07-02 08:24:36   timer_09_c09    02.07.2020 22:00:00
     2020-07-02 08:24:36   timer_10_c14    03.07.2020 00:10:00
     2020-07-02 08:24:36   timer_11_c15    03.07.2020 00:20:00
     2020-07-02 08:24:36   timer_12_c16    03.07.2020 00:30:00
   Regex:
     accu:
     cond:
       JasminFrei:
         0:
           &STATE     ^JasminFrei$
         12:
           &STATE     ^JasminFrei$
         13:
           &STATE     ^JasminFrei$
         14:
           &STATE     ^JasminFrei$
         15:
           &STATE     ^JasminFrei$
       KinderZimmer_Balkontuer:
         0:
         1:
         10:
         11:
         12:
         13:
         14:
         15:
         2:
         3:
         4:
           state      ^KinderZimmer_Balkontuer$:^state:
         5:
           state      ^KinderZimmer_Balkontuer$:^state:
         6:
           state      ^KinderZimmer_Balkontuer$:^state:
         7:
           state      ^KinderZimmer_Balkontuer$:^state:
         8:
           state      ^KinderZimmer_Balkontuer$:^state:
         9:
           state      ^KinderZimmer_Balkontuer$:^state:
       KinderZimmer_Rolladen_Balkon:
         0:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         1:
         10:
         11:
           UserMode   ^KinderZimmer_Rolladen_Balkon$:^UserMode:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         12:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         13:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         14:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         15:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         2:
         3:
         4:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         5:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         6:
         7:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         8:
           pct        ^KinderZimmer_Rolladen_Balkon$:^pct:
         9:
       KinderZimmer_Rolladen_Fenster:
         0:
         1:
         10:
           UserMode   ^KinderZimmer_Rolladen_Fenster$:^UserMode:
           pct        ^KinderZimmer_Rolladen_Fenster$:^pct:
         11:
         12:
         13:
         14:
         15:
         2:
         3:
         4:
         5:
         6:
         7:
         8:
         9:
       Temp_outside:
         0:
         1:
         10:
           temperature ^Temp_outside$:^temperature:
         11:
           temperature ^Temp_outside$:^temperature:
         12:
         13:
         14:
         15:
         2:
         3:
         4:
         5:
         6:
         7:
         8:
         9:
       di_KinderZimmer_Rolladen:
         12:
           StartLangsam  ^di_KinderZimmer_Rolladen$:^StartLangsam :
         13:
           StartLangsam | AT  ^di_KinderZimmer_Rolladen$:^StartLangsam | AT :
         14:
           StartLangsam | AT  ^di_KinderZimmer_Rolladen$:^StartLangsam | AT :
         15:
           StartLangsam | AT  ^di_KinderZimmer_Rolladen$:^StartLangsam | AT :
         9:
           Balkon     ^di_KinderZimmer_Rolladen$:^Balkon:
       wech:
         1:
           &STATE     ^wech$
         2:
           &STATE     ^wech$
         3:
           &STATE     ^wech$
   attr:
     cmdState:
     cmdpause:
       
       
       
       
       
       
       
       
       
       
       120
       120
     wait:
       0:
         int(rand(300))
       1:
         int(rand(600))
       2:
         int(rand(600))
       3:
         int(rand(600))
       4:
         int(rand(600))
       5:
         int(rand(600))
       6:
         int(rand(600))
       7:
         int(rand(600))
       8:
         int(rand(600))
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday,"AT") and ::InternalDoIf($hash,'JasminFrei','STATE') eq "0" and ::isday and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') < 20
     1          ::DOIF_time_once($hash,1,$wday,"7") and ::InternalDoIf($hash,'wech','STATE') eq "wech"
     10         ::ReadingValDoIf($hash,'Temp_outside','temperature') > 25 and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Fenster','pct') > 40 and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Fenster','UserMode') ne "manuell"
     11         ::ReadingValDoIf($hash,'Temp_outside','temperature') > 25 and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') > 40 and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','UserMode') ne "manuell"
     12         ::ReadingValDoIf($hash,'di_KinderZimmer_Rolladen','StartLangsam ') and ::InternalDoIf($hash,'JasminFrei','STATE') eq "1" and ::isday and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') < 25
     13         ::ReadingValDoIf($hash,'di_KinderZimmer_Rolladen','StartLangsam | AT ') + ::DOIF_time_once($hash,9,$wday) and ::InternalDoIf($hash,'JasminFrei','STATE') eq "1" and ::isday and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') < 50
     14         ::ReadingValDoIf($hash,'di_KinderZimmer_Rolladen','StartLangsam | AT ') + ::DOIF_time_once($hash,10,$wday) and ::InternalDoIf($hash,'JasminFrei','STATE') eq "1" and ::isday and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') < 75
     15         ::ReadingValDoIf($hash,'di_KinderZimmer_Rolladen','StartLangsam | AT ') + ::DOIF_time_once($hash,11,$wday) and ::InternalDoIf($hash,'JasminFrei','STATE') eq "1" and ::isday and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') < 100
     2          ::DOIF_time_once($hash,2,$wday,"6") and ::InternalDoIf($hash,'wech','STATE') eq "wech"
     3          ::DOIF_time_once($hash,3,$wday,"AT")  and ::InternalDoIf($hash,'wech','STATE') eq "wech"
     4          ::DOIF_time_once($hash,4,$wday) and ::ReadingValDoIf($hash,'KinderZimmer_Balkontuer','state') eq "open" and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') > 50
     5          ::DOIF_time_once($hash,5,$wday) and ::ReadingValDoIf($hash,'KinderZimmer_Balkontuer','state') eq "open" and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') <= 50
     6          ::DOIF_time_once($hash,6,$wday) and ::ReadingValDoIf($hash,'KinderZimmer_Balkontuer','state') eq "closed"
     7          ::DOIF_time_once($hash,7,$wday) and ::ReadingValDoIf($hash,'KinderZimmer_Balkontuer','state') eq "tilted"  and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') > 10
     8          ::DOIF_time_once($hash,8,$wday) and ::ReadingValDoIf($hash,'KinderZimmer_Balkontuer','state') eq "tilted"  and ::ReadingValDoIf($hash,'KinderZimmer_Rolladen_Balkon','pct') <= 10
     9          ::ReadingValDoIf($hash,'KinderZimmer_Balkontuer','state') eq "closed" and ::ReadingValDoIf($hash,'di_KinderZimmer_Rolladen','Balkon') eq "soll_zu"
   days:
     0          AT
     1          7
     2          6
     3          AT
   do:
     0:
       0          set KinderZimmer_Rolladen_Balkon 20
     1:
       0          set KinderZimmer_Rolladen_Fenster on,      set KinderZimmer_Rolladen_Balkon on
     10:
       0          set KinderZimmer_Rolladen_Fenster 40
     11:
       0          set KinderZimmer_Rolladen_Balkon 40
     12:
       0          set KinderZimmer_Rolladen_Balkon 25
     13:
       0          set KinderZimmer_Rolladen_Balkon 50
     14:
       0          set KinderZimmer_Rolladen_Balkon 75
     15:
       0          set KinderZimmer_Rolladen_Balkon 100,     set KinderZimmer_Rolladen_Fenster on
     16:
     2:
       0          set KinderZimmer_Rolladen_Fenster on,     set KinderZimmer_Rolladen_Balkon on
     3:
       0          set KinderZimmer_Rolladen_Fenster on,      set KinderZimmer_Rolladen_Balkon on
     4:
       0          set KinderZimmer_Rolladen_Fenster off,     set KinderZimmer_Rolladen_Balkon 50,     setreading di_KinderZimmer_Rolladen Balkon soll_zu
     5:
       0          set KinderZimmer_Rolladen_Fenster off
     6:
       0          set KinderZimmer_Rolladen_Fenster off,     set KinderZimmer_Rolladen_Balkon off
     7:
       0          set KinderZimmer_Rolladen_Fenster off,     set KinderZimmer_Rolladen_Balkon 10,     setreading di_KinderZimmer_Rolladen Balkon soll_zu
     8:
       0          set KinderZimmer_Rolladen_Fenster off,     set KinderZimmer_Rolladen_Balkon off
     9:
       0          set KinderZimmer_Rolladen_Balkon off,    setreading di_KinderZimmer_Rolladen Balkon zu
   helper:
     DEVFILTER  ^global$|^KinderZimmer_Rolladen_Fenster$|^wech$|^KinderZimmer_Rolladen_Balkon$|^Temp_outside$|^JasminFrei$|^di_KinderZimmer_Rolladen$|^KinderZimmer_Balkontuer$
     NOTIFYDEV  global|KinderZimmer_Rolladen_Fenster|wech|KinderZimmer_Rolladen_Balkon|Temp_outside|JasminFrei|di_KinderZimmer_Rolladen|KinderZimmer_Balkontuer
     event      battery: ok,humidity: 72,T: 20.5 H: 72,temperature: 20.5,DiffNordOstBlack: 12.3,DiffNordOstWhite: 8.1
     globalinit 1
     last_timer 12
     sleeptimer -1
     triggerDev Temp_outside
     triggerEvents:
       battery: ok
       humidity: 72
       T: 20.5 H: 72
       temperature: 20.5
       DiffNordOstBlack: 12.3
       DiffNordOstWhite: 8.1
     triggerEventsState:
       battery: ok
       humidity: 72
       state: T: 20.5 H: 72
       temperature: 20.5
       DiffNordOstBlack: 12.3
       DiffNordOstWhite: 8.1
   internals:
     all         JasminFrei:STATE wech:STATE
   interval:
   intervalfunc:
   localtime:
     0          1593749700
     1          1593757800
     10         1593728400
     11         1593729000
     2          1593754200
     3          1593754200
     4          1593720000
     5          1593720000
     6          1593720000
     7          1593720000
     8          1593720000
     9          1593727800
   readings:
     all         KinderZimmer_Rolladen_Balkon:pct KinderZimmer_Balkontuer:state di_KinderZimmer_Rolladen:Balkon Temp_outside:temperature KinderZimmer_Rolladen_Fenster:pct KinderZimmer_Rolladen_Fenster:UserMode KinderZimmer_Rolladen_Balkon:UserMode di_KinderZimmer_Rolladen:StartLangsam 
   realtime:
     0          06:15:00
     1          08:30:00
     10         00:20:00
     11         00:30:00
     2          07:30:00
     3          07:30:00
     4          22:00:00
     5          22:00:00
     6          22:00:00
     7          22:00:00
     8          22:00:00
     9          00:10:00
   time:
     0          06:15:00
     1          ({sunrise(0,"08:30","9:00")})
     10         00:20:00
     11         00:30:00
     2          ({sunrise(0,"07:30","9:00")})
     3          ({sunrise(0,"07:30","9:00")})
     4          ({sunset(-600,"16:00","22:00")})
     5          ({sunset(-600,"16:00","22:00")})
     6          ({sunset(-600,"16:00","22:00")})
     7          ({sunset(-600,"16:00","22:00")})
     8          ({sunset(-600,"16:00","22:00")})
     9          00:10:00
   timeCond:
     0          0
     1          1
     10         14
     11         15
     2          2
     3          3
     4          4
     5          5
     6          6
     7          7
     8          8
     9          13
   timer:
     0          0
     1          0
     10         0
     11         0
     2          0
     3          0
     4          0
     5          0
     6          0
     7          0
     8          0
     9          0
   timers:
     0           0
     1           1
     13          9
     14          10
     15          11
     2           2
     3           3
     4           4
     5           5
     6           6
     7           7
     8           8
   trigger:
   triggertime:
     1593720000:
       localtime  1593720000
       hash:
     1593727800:
       localtime  1593727800
       hash:
     1593728400:
       localtime  1593728400
       hash:
     1593729000:
       localtime  1593729000
       hash:
     1593749700:
       localtime  1593749700
       hash:
     1593754200:
       localtime  1593754200
       hash:
     1593757800:
       localtime  1593757800
       hash:
   uiState:
   uiTable:
Attributes:
   cmdpause   ::::::::::120:120
   do         always
   room       99_System
   timerWithWait 1
   wait       int(rand(300)):int(rand(600)):int(rand(600)):int(rand(600)):int(rand(600)):int(rand(600)):int(rand(600)):int(rand(600)):int(rand(600))


Was mache ich hier falsch?

Danke
Stefan

Update:
Ich konnte das Problem lösen. Die Klammern waren falsch:
HIer ein richtiger Eintrag:
DOELSEIF ([([di_KinderZimmer_Rolladen:StartLangsam]+[00:10]) | AT] and [JasminFrei] eq "1" and ::isday and [KinderZimmer_Rolladen_Balkon:pct] < 50)

Gruß
Stefan
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: rubinho am 26 Mai 2022, 09:13:21
Hallo Zusammen,
kann mir ein das Phänomen erklären warum bei meinem DOIF mit relativem Zeitintervall und einer zusätzlichen Bedingung, immer ein Event generiert wird, obwohl keine Bedingung erfüllt ist (Ausser der Zeit natürlich).

([KNX_2_Hue_Wonhzimmertisch_2] eq "9" and [+1]) (set HUEGroup1 dimDown) DOELSEIF ([KNX_2_Hue_Wonhzimmertisch_2] eq "1" and [+1]) (set HUEGroup1 dimUp) DOELSE

2022-05-26 09:10:19 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:19 DOIF livingdim2hue cmd_3
2022-05-26 09:10:20 DOIF livingdim2hue cmd_nr: 3
2022-05-26 09:10:20 DOIF livingdim2hue cmd: 3
2022-05-26 09:10:20 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:20 DOIF livingdim2hue cmd_3
2022-05-26 09:10:21 DOIF livingdim2hue cmd_nr: 3
2022-05-26 09:10:21 DOIF livingdim2hue cmd: 3
2022-05-26 09:10:21 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:21 DOIF livingdim2hue cmd_3
2022-05-26 09:10:22 DOIF livingdim2hue cmd_nr: 3
2022-05-26 09:10:22 DOIF livingdim2hue cmd: 3
2022-05-26 09:10:22 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:22 DOIF livingdim2hue cmd_3
2022-05-26 09:10:23 DOIF livingdim2hue cmd_nr: 3


Zweite Frage, kann ich die Zeit noch unter eine Sekunde bekommen? Ich hätte da an eine halbe Sekunde gedacht. aber "0.5" wird nicht akzeptiert.?

Gruß
Rubinho

--Update--
Habe das letzte DOELSE weggelassen, jetzt hab ich kein Event mehr. Verstehen tue ich es trotzdem nicht.
Zweite Frage ist noch aktiv :D
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 26 Mai 2022, 11:53:16
Zitat von: rubinho am 26 Mai 2022, 09:13:21
Hallo Zusammen,
kann mir ein das Phänomen erklären warum bei meinem DOIF mit relativem Zeitintervall und einer zusätzlichen Bedingung, immer ein Event generiert wird, obwohl keine Bedingung erfüllt ist (Ausser der Zeit natürlich).

([KNX_2_Hue_Wonhzimmertisch_2] eq "9" and [+1]) (set HUEGroup1 dimDown) DOELSEIF ([KNX_2_Hue_Wonhzimmertisch_2] eq "1" and [+1]) (set HUEGroup1 dimUp) DOELSE

2022-05-26 09:10:19 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:19 DOIF livingdim2hue cmd_3
2022-05-26 09:10:20 DOIF livingdim2hue cmd_nr: 3
2022-05-26 09:10:20 DOIF livingdim2hue cmd: 3
2022-05-26 09:10:20 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:20 DOIF livingdim2hue cmd_3
2022-05-26 09:10:21 DOIF livingdim2hue cmd_nr: 3
2022-05-26 09:10:21 DOIF livingdim2hue cmd: 3
2022-05-26 09:10:21 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:21 DOIF livingdim2hue cmd_3
2022-05-26 09:10:22 DOIF livingdim2hue cmd_nr: 3
2022-05-26 09:10:22 DOIF livingdim2hue cmd: 3
2022-05-26 09:10:22 DOIF livingdim2hue cmd_event: timer_2
2022-05-26 09:10:22 DOIF livingdim2hue cmd_3
2022-05-26 09:10:23 DOIF livingdim2hue cmd_nr: 3


Zweite Frage, kann ich die Zeit noch unter eine Sekunde bekommen? Ich hätte da an eine halbe Sekunde gedacht. aber "0.5" wird nicht akzeptiert.?

Gruß
Rubinho

--Update--
Habe das letzte DOELSE weggelassen, jetzt hab ich kein Event mehr. Verstehen tue ich es trotzdem nicht.
Zweite Frage ist noch aktiv :D

Deine Definition ist so nicht sinnvoll und ressourcenintensiv, die sekündliche Abfrage kannst du weglassen, denn die Bedingung wird getriggert, wenn KNX_2_Hue_Wonhzimmertisch_2 sich ändert und ein Event erzeugt. Damit erledigt sich auch die zweite Frage - unter einer Sekunde ist nicht vorgesehen.
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: rubinho am 26 Mai 2022, 18:52:25
Zitat von: Damian am 26 Mai 2022, 11:53:16
Deine Definition ist so nicht sinnvoll und ressourcenintensiv, die sekündliche Abfrage kannst du weglassen, denn die Bedingung wird getriggert, wenn KNX_2_Hue_Wonhzimmertisch_2 sich ändert und ein Event erzeugt. Damit erledigt sich auch die zweite Frage - unter einer Sekunde ist nicht vorgesehen.

Wenn mir jemand eine bessere Lösung anbietet, wie ich meine Hue Lampe an einem KNX Schalter gedimmt bekomme, nehme ich die Lösung gerne.
Ich hab neben dieser Lösung noch eine recht zusammengebastelte Schleife unter 99_myUtils gescriptet, mit der ich allerdings nicht zufrieden bin.

Mein KNX Schalter hat die Zustände 1, 9 und die Grundstellung 0. Da pulst allerdings nichts. Der Wert steht einfach nur an. Und unter Hue gibt es meines Wissens keine Option die aus diesen Zuständen kontinuierlich hoch, oder runter dimmt.



Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 26 Mai 2022, 19:03:50
Zitat von: rubinho am 26 Mai 2022, 18:52:25
Wenn mir jemand eine bessere Lösung anbietet, wie ich meine Hue Lampe an einem KNX Schalter gedimmt bekomme, nehme ich die Lösung gerne.
Ich hab neben dieser Lösung noch eine recht zusammengebastelte Schleife unter 99_myUtils gescriptet, mit der ich allerdings nicht zufrieden bin.

Mein KNX Schalter hat die Zustände 1, 9 und die Grundstellung 0. Da pulst allerdings nichts. Der Wert steht einfach nur an. Und unter Hue gibt es meines Wissens keine Option die aus diesen Zuständen kontinuierlich hoch, oder runter dimmt.

Die einzige Frage, die du dir beantworten musst ist: Liefert dein KNX-Schalter ein Event (siehe Event-Monitor) wenn er seinen Zustand ändert?
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: rubinho am 26 Mai 2022, 22:02:46
Zitat von: Damian am 26 Mai 2022, 19:03:50
Die einzige Frage, die du dir beantworten musst ist: Liefert dein KNX-Schalter ein Event (siehe Event-Monitor) wenn er seinen Zustand ändert?
Na klar liefert der KNX Schalter ein Event. Solange ich die eine Taste drücke, den Wert 1, die andere Taste den Wert 9. Wenn kein Taste betätigt wird, steht der Wert 0 an und jedes mal wird ein Event generiert.
Das Problem ist doch aber ein anderes. Ich will ja nicht den Taster 20 mal betätigen bis er auf 5% gedimmt ist, sondern die Taste drücken und halten.
Ein internes Modul in Fhem muss für mich dann das Pulsieren des Events übernehmen. Deswegen der Sekundentakt.

Gruß
Rubinho
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 26 Mai 2022, 22:37:55
Zitat von: rubinho am 26 Mai 2022, 22:02:46
Na klar liefert der KNX Schalter ein Event. Solange ich die eine Taste drücke, den Wert 1, die andere Taste den Wert 9. Wenn kein Taste betätigt wird, steht der Wert 0 an und jedes mal wird ein Event generiert.
Das Problem ist doch aber ein anderes. Ich will ja nicht den Taster 20 mal betätigen bis er auf 5% gedimmt ist, sondern die Taste drücken und halten.
Ein internes Modul in Fhem muss für mich dann das Pulsieren des Events übernehmen. Deswegen der Sekundentakt.

Gruß
Rubinho

Dann solltest du dir eine andere Lösung überlegen. Du willst ja nicht 24/7 dein FHEM sekündlich triggern, damit du einmal am Tag etwas dimmen kannst.

Wenn du öfters so die Probleme löst, dann wird sich dein FHEM irgendwann mit sich selbst beschäftigen.


Der Lösungsansatz sollte anders sein:

Du reagierst auf den entsprechenden Wert und fängst erst dann an im Sekundentakt zu dimmen, solange die Taste gedrückt ist. Das kannst du auch mit DOIF machen. Allerdings bietet sich dafür der Perl-Modus mit der set_Exec-Funktion an, siehe: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Timer_setzen:_set_Exec.28.29
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: rubinho am 27 Mai 2022, 10:54:02
Alles klar, danke für die Info.

Es war jedenfalls ein Versuch wert. Allerdings skaliert dieser Lösungsansatz, wie du schon geschrieben hast nicht und von daher muss ich weiter Ausschau halten.
Ich suche nach einem Lösungsansatz ohne großartiges Scripting. Ich habe die Erfahrung gemacht, dass ich immer mal Monate habe (meistens die hellen Monate), wo Fhem einfach nur seine Arbeit verrichtet und ich keinen Gedanken daran verschwende. Wenn ich dann mal auf so ein Script stoße, dass ich vor Monaten mal verstanden habe und muss anpassungen daran durchführen, wirds immer kompliziert und ich muss das Rad immer wieder neu erfinden. Von daher verfolge ich immer mehr die Philosophie "keeping it simple". Einfache Lösungen, die auch nach einem Jahr ohne weiteres nachvollziehbar sind. Ein Hilfsmodul das pulst wäre so ein Ansatz.

Wie schon geschrieben, ich habe ja bereits ein Script. Aber mir wäre eine einfachere Lösung lieber.

Trotzdem danke.

Gruß
Rubinho
Titel: Antw:DOIF: neue Zeit-Features
Beitrag von: Damian am 27 Mai 2022, 11:10:17
Wenn du "HUE dimmen" in der Forumsuche eingibst, dann findest du unzählige Beiträge zu dem Thema - auch welche mit DOIF.
Titel: Aw: DOIF: neue Zeit-Features
Beitrag von: hyper2910 am 10 Juni 2023, 14:05:40
Hallo,

Ich habe mir ein DOIf erstellt welches zwei Werte voneinander abzieht.
Ich will dieses jede 5 Sekunden aktualisieren.  Leider macht das doif das ganze nur einmal anc läuft zwar der Timer aber keine neue Berechnung findet statt und auch das Reading wird nicht neu geschrieben.

Hat jemand eine Idee?

defmod doif_aktuellerverbauch DOIF ([+5]) (setreading PV_ModuleGesamt aktuellerverbrauch {([TibberPulse:power:d0]-[TibberPulse:powerProduction:d0])})
attr doif_
Titel: Aw: DOIF: neue Zeit-Features
Beitrag von: Damian am 10 Juni 2023, 14:26:03
Du musst das do always-Attribut setzen.
Titel: Aw: DOIF: neue Zeit-Features
Beitrag von: Per am 10 Juni 2023, 19:31:55
Warum lässt du das aller 5 min machen?