Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

satprofi

Hallo.
Irgendwie verstehe ich das DOIF noch nicht ganz.

Mit notify IF klappt folgendes:


IF ([Klima_SZ] eq "off" and $hms gt "08:00 and lt "22:00") (set LED_04 led green) ELSE (set LED_04 led off)


mit DOIF leider nicht


([Klima_SZ] eq "off" and $hms gt "08:00 and lt "22:00") (set LED_04 led green) DOELSE (set LED_04 led off)


why?
fehlt mir das attr do ? Da habe ich auch verständnisprobleme mit.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Brockmann

Zitat von: satprofi am 03 Juli 2014, 16:04:26
mit DOIF leider nicht

([Klima_SZ] eq "off" and $hms gt "08:00 and lt "22:00") (set LED_04 led green) DOELSE (set LED_04 led off)

Was soll das DOIF denn bewirken?
Wenn zwischen 08:00 Uhr und 22:00 Uhr der Status von KLIMA_SZ auf "off" wechselt, wird die LED angeschaltet.
Wenn zwischen 08:00 Uhr und 22:00 Uhr der Status von KLIMA_SZ auf irgendwas anderes wechselt, wird die LED ausgeschaltet.
Nicht mehr, nicht weniger.

In jedem Fall tut das DOIF nur etwas, wenn sich am Status von Klima_SZ etwas ändert.
Es tut nichts um 08:00 Uhr und nichts um 22:00 Uhr, falls Du das erwartest.

Damian

#137
Zitat von: Brockmann am 03 Juli 2014, 15:10:34
Ja, so sollte es gehen. Zwar nicht ganz so elegant wie erhofft. Aber Deine Bedenken bzgl. Schleifen durch Selbsttriggern kann ich nachvollziehen.

Danke für die Hinweise.

ja, vielleicht lasse ich mir noch etwas für Zeitintervalle einfallen.

z. B.

DOIF ([Schalter] eq "on" and [08:00-20:00])(set...

damit würde ich um 08:00 und 20:00 Uhr triggern und der Ausdruck wäre in dieser Zeit wahr.

ebenso würde bei

DOIF ([Schalter] and [08:00-])(set...

um 08:00 getriggert und zwischen 08:00 bis 00:00 wahr

bzw.

bis 20:00 Uhr

DOIF ([Schalter] eq "on" and [-20:00])(set...

Gruß

Damian

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

satprofi

#138
Zitat von: Brockmann am 03 Juli 2014, 16:22:29
Was soll das DOIF denn bewirken?
Wenn zwischen 08:00 Uhr und 22:00 Uhr der Status von KLIMA_SZ auf "off" wechselt, wird die LED angeschaltet.
Wenn zwischen 08:00 Uhr und 22:00 Uhr der Status von KLIMA_SZ auf irgendwas anderes wechselt, wird die LED ausgeschaltet.
Nicht mehr, nicht weniger.

In jedem Fall tut das DOIF nur etwas, wenn sich am Status von Klima_SZ etwas ändert.
Es tut nichts um 08:00 Uhr und nichts um 22:00 Uhr, falls Du das erwartest.

mehr habe ich auch nicht erwartet, aber leider schaltet die Led nur wenn ich sie manuell schalte.
DOIF leider nicht.
Oder wird die led nur einmal ausgeschaltet, danach erst wieder am nächsten tag nach 8:00h ?

Kann es auch sein, das DOIF zwischenzeitlich manuell getätigte commandos nicht erkennt und nur seinen letzten last_cmd_event auswertet?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Brockmann

Zitat von: satprofi am 03 Juli 2014, 17:13:54
mehr habe ich auch nicht erwartet, aber leider schaltet die Led nur wenn ich sie manuell schalte.
DOIF leider nicht.
Oder wird die led nur einmal ausgeschaltet, danach erst wieder am nächsten tag nach 8:00h ?
Kann es auch sein, das DOIF zwischenzeitlich manuell getätigte commandos nicht erkennt und nur seinen letzten last_cmd_event auswertet?
DOIF macht nur etwas, wenn sich sein Zustand verändert. Wenn zuletzt zwischen 08:00 Uhr und 22:00 Uhr set Klima_SZ off kam und erst am nächsten Tag kommt nun wieder set Klima_SZ off, dann wird nichts geschaltet, weil sich der Status aus Sicht von DOIF nicht verändert hat. Das DOIF kann ja nicht wissen, ob Du die LED zwischenzeitlich manuell ausgeschaltet hast oder nicht.
Dieses Verhalten kannst Du aber mit attr <NAME> do always ändern. Dann würde DOIF jedesmal die LED entsprechend schalten, wenn zwischen 08:00 und 22:00 Uhr ein Status-Event von Klima_SZ reinkommt.

satprofi

Heisst das, das während eines neustartes von fhem ein zwischenzeitliches event nicht von DOIF erkannt wird? wie kann man eine abfrage der verschiedenen state´s regelmässig erwirken?
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Brockmann

Zitat von: Damian am 03 Juli 2014, 17:01:52
ja, vielleicht lasse ich mir noch etwas für Zeitintervalle einfallen.
Vielleicht denkst Du über das Thema Intervalle auch etwas grundlegender nach. Sowohl bei DOIF als auch IF wäre es toll, wenn man Intervalle direkt angeben könnte, etwa
(40 < [Bad:humidity] < 70) oder vielleicht auch in einer anderen Syntax, wenn das einfacher handbar ist. Das macht den Code intuitiver und besser lesbar, finde ich.
(Mir ist klar, dass das durch Verwenden von Perl-Ausdrücken schon jetzt möglich ist, aber das macht es eben nicht intuitiver und lesbarer.)

Die Idee, beim Definieren von statischen Uhrzeit diese bei Erreichen jeweils einmal zu triggern, finde ich gut. Allerdings macht das einen kleinen, aber feinen Unterschied.
Jetzt-Zustand: Wenn im Zeitraum Z Bedingung B eintritt, führe Aktion A aus.
Dann-Zustand: Wenn Bedingung B gegeben ist, führen im Zeitraum Z Aktion A aus.

Ich bin mir nicht sicher, aber ich denke, es gibt für beide Varianten sinnvolle Anwendungsszenarien.


Brockmann

Zitat von: satprofi am 03 Juli 2014, 18:21:06
Heisst das, das während eines neustartes von fhem ein zwischenzeitliches event nicht von DOIF erkannt wird? wie kann man eine abfrage der verschiedenen state´s regelmässig erwirken?
Was hat das mit einem Neustart zu tun? Irgendwie reden wir aneinander vorbei, fürchte ich.
Vielleicht beschreibst Du mal etwas ausführlicher, was Du eigentlich vorhast?

satprofi

Sorry fürs unverständnis.

Ich habe einige readings die einen actor über DOIF schalten. Wenn jetzt eine bedingung wahr ist wird geschalten, ok. aber was passiert wenn zwischenzeitlich ein anderes reading den state wechselt? egal ob autom. od. manuell? erkennt DOIF dies?

ebenso wenn fhem eine "pause" einlegt, in der zwischenzeit ein state umswitcht?

mein vorhaben ist, eine klima autom. schalten zu lassen, aber vielleicht zwischenzeitlich manuell einzugreifen, per fhem.
aber zur zeit wird nach dem manuellen eingriff von DOIF nichts mehr unternommen, und wenn es nur die Abfrage der raumtemperatur ist, die eigentlich die klima über DOIF schaltet.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: satprofi am 03 Juli 2014, 18:41:14
Sorry fürs unverständnis.

Ich habe einige readings die einen actor über DOIF schalten. Wenn jetzt eine bedingung wahr ist wird geschalten, ok. aber was passiert wenn zwischenzeitlich ein anderes reading den state wechselt? egal ob autom. od. manuell? erkennt DOIF dies?

ebenso wenn fhem eine "pause" einlegt, in der zwischenzeit ein state umswitcht?

mein vorhaben ist, eine klima autom. schalten zu lassen, aber vielleicht zwischenzeitlich manuell einzugreifen, per fhem.
aber zur zeit wird nach dem manuellen eingriff von DOIF nichts mehr unternommen, und wenn es nur die Abfrage der raumtemperatur ist, die eigentlich die klima über DOIF schaltet.

Das Modul arbeitet, wie die meisten FHEM-Module, ereignisgesteuert. D. h. eine Bedingung wird nur dann überprüft, wenn ein angegebenes Reading oder Status oder Timer (angaben in eckigen Klammern) ein Event auslöst, sonst nicht. Wenn du manuellen Modus berücksichtigen willst, dann musst du den mit in der Bedingung angeben (z. B. durch einen dummy oder sonst etwas). Oder du musst von außen das DOIF-Modul mit Attribut disable deaktivieren.

Gruß

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

Damian

#145
Zitat von: Brockmann am 03 Juli 2014, 18:32:07
Vielleicht denkst Du über das Thema Intervalle auch etwas grundlegender nach. Sowohl bei DOIF als auch IF wäre es toll, wenn man Intervalle direkt angeben könnte, etwa
(40 < [Bad:humidity] < 70) oder vielleicht auch in einer anderen Syntax, wenn das einfacher handbar ist. Das macht den Code intuitiver und besser lesbar, finde ich.
(Mir ist klar, dass das durch Verwenden von Perl-Ausdrücken schon jetzt möglich ist, aber das macht es eben nicht intuitiver und lesbarer.)

Die Idee, beim Definieren von statischen Uhrzeit diese bei Erreichen jeweils einmal zu triggern, finde ich gut. Allerdings macht das einen kleinen, aber feinen Unterschied.
Jetzt-Zustand: Wenn im Zeitraum Z Bedingung B eintritt, führe Aktion A aus.
Dann-Zustand: Wenn Bedingung B gegeben ist, führen im Zeitraum Z Aktion A aus.

Ich bin mir nicht sicher, aber ich denke, es gibt für beide Varianten sinnvolle Anwendungsszenarien.

Ich werde mich hüten selbst logische Abfragen auszuwerten, dass habe ich bereits beim THRESHOLD-Modul versucht. Über eine AND bzw. OR-Verknüpfung bin ich nicht gekommen. Die Besonderheit des DOIF-Moduls wie auch beim IF ist, dass ich die Eigenschaften eines Interpreters (hier Perl) ausnutze. Und genau diese Eigenschaft macht die Sache recht flexibel.

Die Zeitabfragen mit $hms habe ich erst mal so übernommen, wie sie auch heute schon unzählig in Perl-Konstrukten mit if immer wieder genutzt werden. Es ist allerdings aus meiner Sicht eher eine Notlösung. Daher werde ich die bereits angesprochene Intervallangabe für Zeit mit Triggerung am Anfang (Zustand: wahr) und am Ende (Zustand: falsch) und der Möglichkeit der Abfrage in der Zwischenzeit (Zustand: wahr) noch einbauen, dann haben sich die umständlichen Angaben mit $hms auch erledigt.

Gruß

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

Brockmann

Zitat von: Damian am 03 Juli 2014, 22:06:25
Ich werde mich hüten selbst logische Abfragen auszuwerten, dass habe ich bereits beim THRESHOLD-Modul versucht. Über eine AND bzw. OR-Verknüpfung bin ich nicht gekommen. Die Besonderheit des DOIF-Moduls wie auch beim IF ist, dass ich die Eigenschaften eines Interpreters (hier Perl) ausnutze. Und genau diese Eigenschaft macht die Sache recht flexibel.

Es ginge ja nicht so sehr darum, selbst logische Abfragen auszuwerten, sondern dem Benutzer das Definieren von Intervallen möglichst einfach zu machen.
(40 < [Bad:humidity] < 70) müssten ja nur intern in ([Bad:humidity] > 40 and [Bad:humidity] < 70) umgesetzt und so an den Interpreter weitergereicht werden.
Aber mag sein, dass ich da zu simpel denke und sich das nicht so ohne weiteres umsetzen lässt.

Damian

#147
Zitat von: Brockmann am 03 Juli 2014, 22:46:30
Es ginge ja nicht so sehr darum, selbst logische Abfragen auszuwerten, sondern dem Benutzer das Definieren von Intervallen möglichst einfach zu machen.
(40 < [Bad:humidity] < 70) müssten ja nur intern in ([Bad:humidity] > 40 and [Bad:humidity] < 70) umgesetzt und so an den Interpreter weitergereicht werden.
Aber mag sein, dass ich da zu simpel denke und sich das nicht so ohne weiteres umsetzen lässt.

Parser ist eine Wissenschaft für sich.

Ich kümmere mich z. Zt. nur um "eckige Klammern" und schaue, ob zu jeder Klammer auf eine Klammer zu existiert, und kümmer mich in der Abfrage sonst um nichts :)

Gruß

Damian

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

Jens_B


Zitat von: Damian am 03 Juli 2014, 13:01:51
Ich kenne nicht alle Bedingungen, die bei dir in der Realität vorkommen können, daher mal Folgendes unter Vorbehalt:

([mytwilight:aktEvent] eq "ss_weather" and ($hour > 15 or [16:01])) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu" and $hour > 15) (set LICHT_TERRASSE_KUECHE aus)

Wenn die Rollläden vor 16:00 Uhr schon unten waren, dann passiert hier allerdings nichts.

Du kannst auch im DOELSEIF-Fall noch eine Zeitangabe zum Triggern angeben, wenn du zum Ausschalten des Lichtes auf Nummer sicher gehen willst.

Gruß

Damian

Das hat jetzt so funktioniert, wie ich es mir vorstelle.
Noch eine Frage zum Verständnis:
Muss ich in der Definition das mit der Uhrzeit [16:01] drin haben?
Oder würde es reichen einfach nur abzufragen ob $hour > 15 ist?

Gruß
Jens


Gesendet von meinem iPhone mit Tapatalk
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

Brockmann

Zitat von: Jens_B am 04 Juli 2014, 09:05:43
Muss ich in der Definition das mit der Uhrzeit [16:01] drin haben?
Oder würde es reichen einfach nur abzufragen ob $hour > 15 ist?
Das [16:01] sorgt dafür, dass das DOIF um 16:01 einmal getriggert wird.
Das deckt den Fall ab, dass ss_weather vor 16:00 Uhr erfolgt. Dann würde das DOIF sonst nämlich gar nicht schalten.