Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: kkoeniger am 02 Juli 2014, 11:06:34
Wenn ich "attr disable 1" setze, so bleibt das letzte State unverändert entsprechend dem last_cmd stehen. Ware es nicht sinnvoller "disabled" anzuzeigen?

ja, kommt auf die todo-Liste für´s nächste Release :)

Gruß

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

cruser1800

Zitat von: Jens_B am 02 Juli 2014, 08:38:30
Das liegt möglicherweise daran, das Du irgendwo in einer oder mehreren Deiner Definitionen für einen regex Ausdruck nur "*" statt ".*" gesetzt hast.

Hat mit dem DOIF Modul zunächst erstmal nicht direkt was zu tun, möchte ich meinen.

Gruß
Jens

Danke das wars.

satprofi

#122
hallo.
wie wird eigentlich eine negative zahl ausgewertet?
habe hier eine < 100 , aber der zustand wird nicht angezeigt, tatsächlicher wert -200 .

ich denke da ist etwas grösseres im argen, weil letzter cmd war < 2000.


([Ueberschuss] > 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led green) DOELSEIF ([Ueberschuss] < 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led orange) DOELSEIF ([Ueberschuss] < 100 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led red) DOELSE (set LED_02 led off)


[edit]
hallo.
ich habe das ganze mit IF gelöst, DOIF dürfte nicht für solche Probleme optimal sein.

gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

kkoeniger

Zitat von: Damian am 02 Juli 2014, 11:08:51
ja, kommt auf die todo-Liste für´s nächste Release :)

...

Danke !  :)
LG,
Karl

Damian

Zitat von: satprofi am 02 Juli 2014, 14:44:40
hallo.
wie wird eigentlich eine negative zahl ausgewertet?
habe hier eine < 100 , aber der zustand wird nicht angezeigt, tatsächlicher wert -200 .

ich denke da ist etwas grösseres im argen, weil letzter cmd war < 2000.


([Ueberschuss] > 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led green) DOELSEIF ([Ueberschuss] < 2000 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led orange) DOELSEIF ([Ueberschuss] < 100 and $hms gt "08:00" and $hms lt "22:00") (set LED_02 led red) DOELSE (set LED_02 led off)


[edit]
hallo.
ich habe das ganze mit IF gelöst, DOIF dürfte nicht für solche Probleme optimal sein.

gruss

Da kann DOIF nichts dafür.

Dein Konstrukt kann so nicht funktionieren.

if-then-elseif-else Konstrukte werden in jeder Programmiersprache von links nach rechts, bzw. von oben nach unten abgearbeitet und so verhält sich auch DOIF.

Du hast die Bedingung <2000 vor <100 eingebaut. Da jede Zahl kleiner als 100, gleichzeitig kleiner als zwei tausend ist, wird <100 bei dir nie zum tragen kommen, weil vorher die Bedingung <2000 zuschlägt.

Also einfach die beiden Abfragen in der Reihenfolge tauschen.

Gruß

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

satprofi

Aha. Stimmt. Bei IF hab ich es so. Sorry. Gruss
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Brockmann

Ich habe eine grundsätzliche Verständnisfrage zum DOIF.

Ich möchte bei eintretender Dämmerung, aber nicht vor 17:00 Uhr, eine Lampe einschalten, wenn jemand zu Hause ist. Das würde ich nach meinem Verständnis von DOIF so umsetzen:
define Light_ctrl DOIF (LICHT_STATUS eq "Daemmerung" and $hms gt "17:00" and HAUS_STATUS eq "Anwesend")
(set Licht on) DOELSE (set Licht off)


Was passiert, wenn die Dämmerung schon um 16:30 Uhr eintritt? Die Bedingung $hms gt "17:00" ist da noch nicht erfüllt, also würde korrekterweise nicht geschaltet.
Aber wird dann intern ein Timer gesetzt, der um 17:00:01 Uhr erneut prüft, ob nun alle Bedingungen (noch) erfüllt sind? Oder macht das DOIF in diesem Fall einfach nichts mehr, bis es erneut extern angestossen wird, beispielsweise durch eine Änderung bei HAUS_STATUS?
Oder anders gefragt: Wird die Lampe im 17:00:01 Uhr eingeschaltet, wenn schon vorher Dämmerung eingetreten ist oder bleibt sie aus?

Ich würde eigentlich die erste Variante erwarten. Wenn nicht, wie könnte ich das DOIF in einem solchen Fall anders gestalten, um die gewünschte Funktionalität zu erreichen?
Aus den Beispielen im ersten Post konnte ich das so nicht ableiten.

Jens_B

Ich habe jetzt auch mal eine Frage zu DOIF:
Ich würde gern meine Terrassenbeleuchtung einschalten, wenn twilight im aktevent "ss_weather" hat, und die Beleuchtung soll wieder ausgeschaltet werden, wenn 2 bestimmte Rollladen abends geschlossen werden. Leider funktioniert das nicht so wirklich, weil natürlich das Akt_event sich danach noch wieder ändert... Hm. Im Logfile habe ich zudem dann ziemlich viele Schaltversuche in Bezug auf meine Beleuchtung:
2014.07.02 20:40:50 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:40:50 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:42:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:42:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:42:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:42:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:47:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:47:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:47:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:47:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:52:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:52:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:52:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:52:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:57:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 20:57:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 20:57:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 20:57:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:02:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:02:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 21:02:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 21:02:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:07:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off
2014.07.02 21:07:34 3: CUL_HM set LICHT_TERRASSE_KUECHE on
2014.07.02 21:07:34 3: CUL_HM LICHT_TERRASSE_KUECHE repeat, level C8 instead of 00
2014.07.02 21:07:34 3: CUL_HM set LICHT_TERRASSE_KUECHE off


mein Code sieht folgendermaßen aus:
([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu")  (set LICHT_TERRASSE_KUECHE aus) DOELSEIF ([mytwilight:aktEvent] eq "ss_weather" and $hour > 15) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([LICHT_TERRASSE_KUECHE] ne "aus") (set LICHT_TERRASSE_KUECHE aus)

Wie mache ich es mit DOIF richtig, damit das so funktioniert wie ich es mir vorstelle?

Achja, der Schalter draußen ist ein Homematic.

Gruß
Jens
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

Damian

Zitat von: Brockmann am 03 Juli 2014, 09:30:33
Ich habe eine grundsätzliche Verständnisfrage zum DOIF.

Ich möchte bei eintretender Dämmerung, aber nicht vor 17:00 Uhr, eine Lampe einschalten, wenn jemand zu Hause ist. Das würde ich nach meinem Verständnis von DOIF so umsetzen:
define Light_ctrl DOIF (LICHT_STATUS eq "Daemmerung" and $hms gt "17:00" and HAUS_STATUS eq "Anwesend")
(set Licht on) DOELSE (set Licht off)


Was passiert, wenn die Dämmerung schon um 16:30 Uhr eintritt? Die Bedingung $hms gt "17:00" ist da noch nicht erfüllt, also würde korrekterweise nicht geschaltet.
Aber wird dann intern ein Timer gesetzt, der um 17:00:01 Uhr erneut prüft, ob nun alle Bedingungen (noch) erfüllt sind? Oder macht das DOIF in diesem Fall einfach nichts mehr, bis es erneut extern angestossen wird, beispielsweise durch eine Änderung bei HAUS_STATUS?
Oder anders gefragt: Wird die Lampe im 17:00:01 Uhr eingeschaltet, wenn schon vorher Dämmerung eingetreten ist oder bleibt sie aus?

Ich würde eigentlich die erste Variante erwarten. Wenn nicht, wie könnte ich das DOIF in einem solchen Fall anders gestalten, um die gewünschte Funktionalität zu erreichen?
Aus den Beispielen im ersten Post konnte ich das so nicht ableiten.

Ich unterstelle mal, dass LICHT_STATUS (bitte in eckige Klammern setzen, sonst gibt´s Fehlermeldung) nur ein Event auslöst, wenn sich der Zustand ändert und nicht zyklisch sendet.

Die Abfrage bei dir wird also ausgewertet, wenn LICHT_STATUS oder HAUS_STATUS ein Event sendet. Das bedeutet, wenn Dämmerung und vor 17:00 stattgefunden hat und HAUS_STATUS vorher schon anwesend war, dann wird nach 17:00 nichts passieren. Wenn du sicherstellen willst, dass auch nach 17:00 geprüft wird, dann musst du das mit Hilfe einer Zeitangabe berücksichtigen. z. B.


define Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung" or [17:01])  and $hms gt "17:00" and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)


Eine zyklische Selbsttriggerung des Moduls habe ich mir bisher verkniffen einzubauen. Damit könnte man auch viel Blödsinn machen.

Gruß

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

satprofi

Zitat von: Jens_B am 03 Juli 2014, 10:17:53
Ich habe jetzt auch mal eine Frage zu DOIF:
Ich würde gern meine Terrassenbeleuchtung einschalten, wenn twilight im aktevent "ss_weather" hat, und die Beleuchtung soll wieder ausgeschaltet werden, wenn 2 bestimmte Rollladen abends geschlossen werden. Leider funktioniert das nicht so wirklich, weil natürlich das Akt_event sich danach noch wieder ändert...
Wie mache ich es mit DOIF richtig, damit das so funktioniert wie ich es mir vorstelle?

Achja, der Schalter draußen ist ein Homematic.

Gruß
Jens


([mytwilight:aktEvent] eq "ss_weather" and $hms gt "15:00" and [ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu") (set LICHT_TERRASSE_KUECHE off) DOELSEIF ([mytwilight:aktEvent] eq "ss_weather" and $hms gt "15:00" and [ROLLLADEN_KUECHE] eq "auf" or [ROLLLADEN_WZ_4] eq "auf")  (set LICHT_TERRASSE_KUECHE on) DOELSE (set LICHT_TERRASSE_KUECHE off)


würde ich so lösen.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Zitat von: Jens_B am 03 Juli 2014, 10:17:53
Ich habe jetzt auch mal eine Frage zu DOIF:
Ich würde gern meine Terrassenbeleuchtung einschalten, wenn twilight im aktevent "ss_weather" hat, und die Beleuchtung soll wieder ausgeschaltet werden, wenn 2 bestimmte Rollladen abends geschlossen werden. Leider funktioniert das nicht so wirklich, weil natürlich das Akt_event sich danach noch wieder ändert... Hm. Im Logfile habe ich zudem dann ziemlich viele Schaltversuche in Bezug auf meine Beleuchtung:
mein Code sieht folgendermaßen aus:
([ROLLLADEN_KUECHE] eq "zu" and [ROLLLADEN_WZ_4] eq "zu")  (set LICHT_TERRASSE_KUECHE aus) DOELSEIF ([mytwilight:aktEvent] eq "ss_weather" and $hour > 15) (set LICHT_TERRASSE_KUECHE an) DOELSEIF ([LICHT_TERRASSE_KUECHE] ne "aus") (set LICHT_TERRASSE_KUECHE aus)

Wie mache ich es mit DOIF richtig, damit das so funktioniert wie ich es mir vorstelle?



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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Jens_B

ZitatIch kenne nicht alle Bedingungen, die bei dir in der Realität vorkommen können, daher mal Folgendes unter Vorbehalt:

Code: [Auswählen]
([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

ich habe das in der Definition jetzt mal so eingefügt und warte mal was heute Abend passiert.

Gruß
Jens
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

Brockmann

Zitat von: Damian am 03 Juli 2014, 11:11:09
Die Abfrage bei dir wird also ausgewertet, wenn LICHT_STATUS oder HAUS_STATUS ein Event sendet. Das bedeutet, wenn Dämmerung und vor 17:00 stattgefunden hat und HAUS_STATUS vorher schon anwesend war, dann wird nach 17:00 nichts passieren. Wenn du sicherstellen willst, dass auch nach 17:00 geprüft wird, dann musst du das mit Hilfe einer Zeitangabe berücksichtigen. z. B.

define Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung" or [17:01])  and $hms gt "17:00" and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)


Aber wenn durch das [17:01] um 17:01 Uhr getriggert wird, ist dieser Teil der OR-Klammer doch wahr, oder?
Würde so nicht einfach um 17:01 Uhr geschaltet werden, selbst wenn noch gar keine Dämmerung ist?

Damian

Zitat von: Brockmann am 03 Juli 2014, 14:18:56
Aber wenn durch das [17:01] um 17:01 Uhr getriggert wird, ist dieser Teil der OR-Klammer doch wahr, oder?
Würde so nicht einfach um 17:01 Uhr geschaltet werden, selbst wenn noch gar keine Dämmerung ist?

Du hast Recht, mein Fehler. Es muss viel mehr heißen:

define Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung")  and ($hms gt "17:00" or [17:01]) and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)


Gruß

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

Brockmann

Zitat von: Damian am 03 Juli 2014, 14:25:17
Du hast Recht, mein Fehler. Es muss viel mehr heißen:
define Light_ctrl DOIF (([LICHT_STATUS] eq "Daemmerung")  and ($hms gt "17:00" or [17:01]) and [HAUS_STATUS] eq "Anwesend")
(set Licht on) DOELSE (set Licht off)

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.