Hauptmenü

neues Modul DOIF

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

Vorheriges Thema - Nächstes Thema

Damian

#945
Zitat von: MarkusN am 21 Dezember 2014, 19:23:53
Damian, ich möchte einfach mal Danke sagen. Das DOIF Modul macht viele Anwendungsfälle deutlich einfacher, ich habe unzählige notify und at gelöscht, Fälle in denen ich ein Konstrukt aus mehreren notifys und dummys gebaut habe sind mit einem DOIF abgebacken. Es gibt zwar einige Fallstricke, aber wenn man die verstanden hat (und auch nicht wieder vergisst :D ) ist das wirklich eine herrliche Sache, ich bin begeistert. Danke! Auch für das IF-Modul den IF-Befehl!

Grüße,

Markus

Danke für die Blumen. Das war aber noch nicht alles. Hier ein kleiner Vorgeschmack zu Weihnachten: ;)

Ich habe das Wochenende kreativ genutzt. Immerhin konnte ich in den beiden letzten Tagen folgende Features einbauen (siehe todo-Liste im ersten Post):

-relative Zeitangaben [+<time>] oder [+<begin>-+<end>] natürlich kombinierbar mit Funktionen in geschweiften Klammern wie bisher.
-do resetwait
-Zeitintervalle  und Eventangaben ohne Trigger mit [?....]
-attr initialize für Vorbelegung des Status bei der Definition.
-weitere Attribute: repeatsame, waitnext, waitsame, eventpause (siehe todo im ersten Post)
-Reading und Statusangaben in [] sowie Berechnungen in {} innerhalb des Perlcodes in geschweiften Klammern im Ausführungsteil, sowie im FHEM-Code jetzt möglich
-für Berechnungen im Ausführungsteil in geschweiften Klammern braucht man jetzt keine runden Klammern anzugeben.

Es fehlt noch: wait zwischen den Kommandos und mehrer Bedingungen zu einem cmd (siehe todo im ersten Post)

Ich bin immer mehr von Perl begeistert, in einer anderen Programmiersprache hätte ich wahrscheinlich nicht so viel geschafft innerhalb von zwei Tagen.

In diesem Sinne...

Gruß

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

maxritti

#946
Auch auf die Gefahr, dass es hier etwas Off-Topic wird.

Ich habe einen Dummy definiert, der bei Änderungen an meinen Zeit-Dummies die DOIFs Definitionen aktualisiert.
Klappt auch wunderbar.

CFGFN
   DEF        ([du_Rollo_Zeit_ru] or [du_Rollo_Zeit_ho_WE] or [du_Rollo_Zeit_ho]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseLinks:&DEF])
   NAME       di_Rollo_SetTime
   NR         185
   NTFY_ORDER 50-di_Rollo_SetTime
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2014-12-21 20:57:56   cmd_event       du_Rollo_Zeit_ho_WE
     2014-12-21 20:57:56   cmd_nr          1
     2014-12-21 20:45:42   e_du_Rollo_Zeit_ho_STATE 06:35
     2014-12-21 20:57:56   e_du_Rollo_Zeit_ho_WE_STATE 08:00
     2014-12-21 20:39:24   e_du_Rollo_Zeit_ru_STATE 20:40
     2014-12-21 20:57:56   state           cmd_1
   Condition:
     0          InternalDoIf('du_Rollo_Zeit_ru','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_WE','STATE','') or InternalDoIf('du_Rollo_Zeit_ho','STATE','')
   Devices:
     0           du_Rollo_Zeit_ru du_Rollo_Zeit_ho_WE du_Rollo_Zeit_ho
     all         du_Rollo_Zeit_ru du_Rollo_Zeit_ho_WE du_Rollo_Zeit_ho
   Do:
     0          modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseLinks:&DEF]
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           du_Rollo_Zeit_ru:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Zeit_ho:STATE
     all         du_Rollo_Zeit_ru:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Zeit_ho:STATE
   Readings:
   State:
Attributes:
   do         always
   room       LichtRollo

   
Nun dachte ich, dass ich mir ein Notify baue, welches bei global:INIZIALIZED das gleiche macht.

Also das hier geschrieben:

CFGFN
   DEF        global:INITIALIZED {Log 3, "----> Initialized: ".Value("du_Rollo_Zeit_ho")}
   NAME       no_Initialized
   NOTIFYDEV  global
   NR         187
   NTFY_ORDER 50-no_Initialized
   REGEXP     global:INITIALIZED
   STATE      2014-12-21 20:57:16
   TYPE       notify

   
Mache ich ein Restart, wird auch wunderbar der Wert des du_Rollo_Zeit_ho angezeigt:

2014.12.21 20:57:16.419 3: ----> Initialized: 06:35

Nur wie stelle ich jetzt dazu an, in dem notify die Defintionen der DOIFs zu aktualisieren?

Schreibe ich die DEF des notifys so:

global:INITIALIZED modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF]

erhalte ich nach einem shutdown restart dies:

2014.12.21 21:16:41.587 3: no_Initialized return value: di_EG_ku_RO_StrasseLinks DOIF: no left bracket of condition: [di_EG_ku_RO_StrasseLinks:&DEF]


Eventuell lasse ich die Klimmzüger am besten. Nach einem Reboot von FHEM einfach ein Dummy geändert und das DOIF aktualisiert die Definitonen der anderen DOIFs.

Wobei automatisiert wäre das schon schick  ;)

dieda

Hallo Damian,

danke erst einmal für das tolle Modul.

Habe aber noch eine Frage. Ich habe so was hier definiert:Internals:
   DEF        ([{sunset("REAL")}-22:35|01234] or [weihn_dr] eq "on" or [{sunset("REAL")}-23:30|56]) (set weihn_dr on) DOELSE (set weihn_dr off)
   NAME       Weihnachtsbeleuchtung_dr
   NR         831
   NTFY_ORDER 50-Weihnachtsbeleuchtung_dr
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2014-12-22 10:11:36   cmd_event       weihn_dr
     2014-12-22 10:11:36   cmd_nr          2
     2014-12-22 10:11:36   e_weihn_dr_STATE off
     2014-12-22 10:11:36   state           cmd_2
     2014-12-21 16:21:30   timer_1_c1      22.12.2014 16:21:59|01234
     2014-12-21 22:35:00   timer_2_c1      22.12.2014 22:35:00|01234
     2014-12-21 16:21:30   timer_3_c1      22.12.2014 16:21:59|56
     2014-12-21 23:30:00   timer_4_c1      22.12.2014 23:30:00|56
   Condition:
     0          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"01234") or InternalDoIf('weihn_dr','STATE','') eq "on" or DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"56")
   Days:
     0          01234
     1          01234
     2          56
     3          56
   Devices:
     0           weihn_dr
     all         weihn_dr
   Do:
     0          set weihn_dr on
     1          set weihn_dr off
   Helper:
     last_timer 4
     sleeptimer -1
   Internals:
     0           weihn_dr:STATE
     all         weihn_dr:STATE
   Readings:
   Realtime:
     0          16:21:59
     1          22:35:00
     2          16:21:59
     3          23:30:00
   State:
   Time:
     0          {sunset("REAL")}
     1          22:35:00
     2          {sunset("REAL")}
     3          23:30:00
   Timecond:
     0          0
     1          0
     2          0
     3          0
   Timer:
     0          0
     1          0
     2          0
     3          0
   Timerfunc:
   Timers:
     0           0  1  2  3
Attributes:
   do         always
   room       Weihnachten


Leider schaltet es nicht ganz so wie ich es möchte.

Ich habe dies im Log stehen:


2014.12.21 16:21:30 3: FS20 set weihn_dr on
2014.12.21 16:21:30 3: FS20 set weihn_dr on
2014.12.21 16:21:30 3: FS20 set weihn_dr on
2014.12.21 16:21:30 3: FS20 set weihn_wz on
2014.12.21 16:21:30 3: FS20 set weihn_wz on
2014.12.21 22:35:00 3: FS20 set weihn_dr on
2014.12.21 23:30:00 3: FS20 set weihn_dr on
2014.12.21 23:48:35 3: FS20 set weihn_dr off

Ich habe da bestimmt wieder was überlesen... Vlt. hilft dein scharfer Blick aber ...
Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

MarkusN

Wenn weihn_dr an ist wird weihn_dr eingeschaltet? Deine erste Bedingung solltest du noch mal überdenken.

Billy

Hallo,
bei mir laufen einige DOIFS nur mit dem folgenden habe ich Probleme:

define di_lightTest DOIF ([{sunset("REAL",0,"16:00","21:00")}]) (set FS_1BEAE8 on-for-timer 3000, set Schalter_1BEA79 on-for-timer 3000, set Brunnen_20C4F6 on-for-timer 3000, {(`echo set myRolS_son on | nc -w 1 192.168.148.17 7072`)}, {(`echo set myRolW_son on | nc -w 1 192.168.148.17 7072`)})

Geht nach dem initialisieren einmal am Abend, am nächsten Abend nicht.
d.h. gestern initialisiert, lief heute nicht.

Readings:
------------------------------------------------------------------------
cmd_event             timer_1                            2014-12-21 16:18:19
cmd_nr                  1                                      2014-12-21 16:18:19
state                       cmd_1                             2014-12-21 16:18:19
timer_1_c1             23.12.2014 16:19:15     2014-12-22 16:18:43
-------------------------------------------------------------------------

Sicher nur eine Kleinigkeit. Hilfe gerne.

Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

MarkusN

Hallo Billy,

wenn ich die Commandref richtig verstehe erzeugt deine Definition keine Statusänderung, daher musst du das Attribut do auf always setzen

Auszug Commandref:

ZitatAngaben, bei denen aufgrund der Definition kein Zustandswechsel erfolgen kann z. B.:

define di_light DOIF ([08:00]) (set switch on)
attr di_light do always

müssen mit Attribut "do always" definiert werden, damit sie nicht nur einmal, sondern jedes mal (hier jeden Tag) ausgeführt werden.

Grüße,

Markus

Billy

Hallo Markus,

Danke :) werde ich ausprobieren.

Gruß
Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

dieda

Zitat von: MarkusN am 22 Dezember 2014, 12:27:08
Wenn weihn_dr an ist wird weihn_dr eingeschaltet? Deine erste Bedingung solltest du noch mal überdenken.

Es verhält sich genauso, wenn ich den Teil

Zitator [weihn_dr] eq "on"

rausnehme. Daran liegt es also nicht.
Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

Brockmann

Zitat von: dieda am 22 Dezember 2014, 18:23:46
Es verhält sich genauso, wenn ich den Teil
rausnehme. Daran liegt es also nicht.
Dieser Teil hat aber schon einen wesentlichen Unterschied gemacht, denn vorher war die Kondition immer wahr, wenn weihn_dr erst einmal eingeschaltet war. Das DOIF konnte also gar nicht wieder ausschalten.
Wenn Du das or [weihn_dr] eq "on" rausnimmst, bekommst Du eine relative simple Zeitsteuerung, die eigentlich keine Probleme bereiten sollte. Wobei Du das do always-Attribut in dem Fall weglassen kannst.

Wenn es also immer noch nicht klappt, dann poste bitte nochmal die aktuelle Definition sowie ggf. die erzeugten Events/Logeinträge.

Spartacus

Hallo,
ich bin immer noch an meiner Eingangsbeleuchtung. Durch einen Tipp von Brockmann bin ich schon ein ganzes Stück weiter...Besten Dank dafür!

Jetzt habe ich mir das Sequence Problem vorgenommen. Hat jemand eine Idee, wie ich in einem DOIF auf den langen Tastendruck reagieren kann? Es gibt kein Readings in der Sequence die ich auswerten kann. Nur das eigentliche Event "sKurzerLangerDruck_UR:partial_1".

# Squence Test
#
define sKurzerLangerDruck_UR sequence PTM210.Gira.01:BI 0.5 PTM210.Gira.01:buttons:.released
attr sKurzerLangerDruck_UR disable 0
attr sKurzerLangerDruck_UR reportEvents 1
attr sKurzerLangerDruck_UR room 99-Test
attr sKurzerLangerDruck_UR triggerPartial 1
#
# Kurzer Druck
#
define nKurzerDruck_UR notify sKurzerLangerDruck_UR:trigger set TestLampe on
attr nKurzerDruck_UR disable 0
attr nKurzerDruck_UR room 99-Test
#
# Langer Druck
#
define nLangerDruck_UR notify sKurzerLangerDruck_UR:partial_1 set TestLampe off
attr nLangerDruck_UR disable 0
attr nLangerDruck_UR room 99-Test

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

moonsorrox

ich habe auch ein Problem mit meinem DOIF, welches ich vorher auf "Zufall" nicht ausprobiert habe. Ich hatte es gestern umgestellt und bekomme nun folgenden Fehler:

InternalDoIf('Zeitsteuerung','STATE','') ~= "Dämmerung|Aus": syntax error at (eval 342092) line 1, near ") ~"

der Code vom DOIF:
( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",1200,"17:00","22:20")}|12345] or [{sunset("CIVIL",800,"17:00","22:20")}|06]))
    (set WegLampe_Sw_01 on)
DOELSEIF ( [Zeitsteuerung] eq "Dämmerung" and ([{sunset("CIVIL",9000,"19:00","22:20")}|0123456]))
    (set WegLampe_Sw_01 off,set WegLampe_Sw_02 on)
DOELSEIF ([Zeitsteuerung] eq "Dämmerung" and ([00:15|12345] or [01:15|06]))
    (set WegLampe_Sw_02 off)
DOELSEIF([Zeitsteuerung] ~= "Dämmerung|Aus")(attr ZufallsTimerAussenlicht disable 1)
DOELSEIF([Zeitsteuerung] eq "Zufall")(attr ZufallsTimerAussenlicht disable 0)


Hatte das Dummy immer auf Dämmerung und alles lief, nun auf Zufall geht es nicht
wo liegt jetzt der Fehler..?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Brockmann

Zitat von: moonsorrox am 23 Dezember 2014, 20:14:58
Hatte das Dummy immer auf Dämmerung und alles lief, nun auf Zufall geht es nicht
wo liegt jetzt der Fehler..?
Es muss =~ heißen und nicht ~=.
Eventuell wurde diese Kondition zuvor nie getriggert, weil vorher immer schon eine andere zugeschlagen hat, und deshalb ist es nicht aufgefallen.

moonsorrox

Au, Mensch Super diese Kleinigkeit..! ;)
aber genau diese sind es, werde ich heute gleich mal umschreiben und testen, ja klar hast du Recht wurde vorher noch nie getriggert...
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Spartacus

Hallo,
ich möchte mit einem DOIF einen Aktor an Heiligabend in der Zeit von 16:00 bis 23:00 einschalten, wenn innerhalb dieser Zeit ein Taster betätigt wird. Um 23:00 geht dann das Licht automatisch aus.

[16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and  [Taster:buttons] eq "pressed"

Das funktioniert leider nicht, da der Taster dirket wieder auf "released" geht und damit die Bedingung nicht mehr erfüllt ist.
Jemand nen Tipp?
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Damian

Zitat von: Spartacus am 24 Dezember 2014, 12:05:10
Hallo,
ich möchte mit einem DOIF einen Aktor an Heiligabend in der Zeit von 16:00 bis 23:00 einschalten, wenn innerhalb dieser Zeit ein Taster betätigt wird. Um 23:00 geht dann das Licht automatisch aus.

[16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and  [Taster:buttons] eq "pressed"

Das funktioniert leider nicht, da der Taster dirket wieder auf "released" geht und damit die Bedingung nicht mehr erfüllt ist.
Jemand nen Tipp?
Spartacus

Dazu brauchst du, wie könnte es anders sein, das DOIF-Weihnachtspaket ;) aus dem Nachbarthread.

Dann Zeit mit Fragezeichen angeben:

[?16:00-23:00] and [hl.01.Feiertag:state] eq "Heiligabend" and  [Taster:buttons] eq "pressed"

Gruß

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