neue Features: Wochentage mit Namen, Überarbeitung für indirekte Timer

Begonnen von Damian, 20 März 2017, 23:00:58

Vorheriges Thema - Nächstes Thema

Damian

Du willst, dass er am We schaltet und definierst aber Mi - das passt nicht ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ToKa

Man wie blind war ich... wenn die Box englische Wochentage liefert, sollte man diese auch in weekdays definieren.

Vielen Dank für den Schubers in die richtige Richtung - jetzt funktioniert es  :)
RaspberryPi3 mit RaZberry2 und Conbee II
Fibaro: FGWPE/F-101 Switch & FIBARO System FGWPE/F Wall Plug Gen5, FGSD002 Smoke Sensor
EUROtronic: SPIRIT Wall Radiator Thermostat Valve Control
Shelly2.5 Rollladenaktoren
Zipato Bulb 2, Osram und InnrLight

hoods

Hallo zusammen,

ich versuche gerade eine simple Zeitsteuerung für meine Rollos zu bauen. Leider bringt das DOIF einen Fehler (siehe Readings) und die timer passen noch nicht. Beispiel: timer_01_c01, müsste hier nicht stehen 22.04.2017 16:35:00|WE - da dies der nächste WE Tag ist?

defmod timer_Rollo_WZ_L DOIF ([[$SELF:WE_AUF,00:00]|WE] or [[$SELF:WD_AUF,00:00]|AT])(set Rollo_WZ_L up)\
DOELSEIF ([[$SELF:WE_AB,00:01]|WE] or [[$SELF:WD_AB,00:01]|AT])(set Rollo_WZ_L down)
attr timer_Rollo_WZ_L alias Wohnzimmer links
attr timer_Rollo_WZ_L group Rollo_Zeitsteuerung
attr timer_Rollo_WZ_L readingList WE_AUF WE_AB WD_AUF WD_AB
attr timer_Rollo_WZ_L room 99_Labor
attr timer_Rollo_WZ_L setList WE_AUF:time WE_AB:time WD_AUF:time WD_AB:time
attr timer_Rollo_WZ_L webCmd WE_AUF:WE_AB:WD_AUF:WD_AB
attr timer_Rollo_WZ_L weekdays So,Mo,Di,Mi,Do,Fr,Sa,WE,AT



   Readings:
     2017-04-18 16:24:33   WD_AB           16:30
     2017-04-17 14:26:44   WD_AUF          08:00
     2017-04-17 14:26:35   WE_AB           22:00
     2017-04-18 16:24:40   WE_AUF          16:35
     2017-04-18 16:30:00   cmd             2
     2017-04-18 16:30:00   cmd_event       timer_4
     2017-04-18 16:30:00   cmd_nr          2
     2017-04-18 16:47:26   error           timer_Rollo_WZ_L: error in default: 00:01
     2017-04-18 16:30:00   state           cmd_2
     2017-04-18 16:47:26   timer_01_c01    19.04.2017 16:35:00|WE
     2017-04-18 16:47:26   timer_02_c01    19.04.2017 08:00:00|AT
     2017-04-18 16:47:26   timer_03_c02    18.04.2017 22:00:00|WE
     2017-04-18 16:47:26   timer_04_c02    19.04.2017 16:30:00|AT


Hatte bereits doppelte Klammern und verschiedene andere Kombinationen probiert aber im Moment seh ich den Wald vor lauter Bäumen nicht.
Hat jemand einen Tipp?

Danke & Gruss Sven
Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD

Ellert

müsste hier nicht stehen 22.04.2017 16:35:00|WE - da dies der nächste WE Tag ist?

Es wird immer der aktuelle Tag oder der nächste Tag angezeigt. Ausgelöst wird aber nur, wenn die Wochentagbeschränkung zutrifft.
Den Default-Wert müsstest Du in Anführungszeichen setzen.

hoods

Super, klappt. Vielen Dank für die schnelle Antwort. Gruss Sven
Odroid C2, FHEM 5.8, HMUSB, Jeelink, Rademacher DuoFern Stick, Benning WR über HTTPMOD

Syrex-o

Hey,
ich versuche gerade die Wochentagsfunktion mit einem Regex aus einem Reading zu verwenden.
Mit den Zeiten funktioniert das auch super. Vielleicht ist auch eine Verkettung nicht möglich?

Folgendes Beispiel übergibt mein Reading, dass ich auslese:
20:51-20:52|2345|
Daraus mache ich dann im DOIF folgendes:

([
  [dummyTest:state:[([0-9]{2}:[0-9]{2})]]
-[dummyTest:state:[((?<=.).[0-9]:[0-9]{2})]] |
  [dummyTest:state:[((?<=.{12})[0-9]*)]]

]) (set Kreis1 on) DOELSE (set Kreis1 off)


leider wird das regex für die nummern nicht übernommen.
Ich bekomme die Meldung:
SetKreis1 DOIF: right bracket without left bracket: 9]*)]]
doch meines Erachtens fehlt dort nichts.
Vielleicht kann mich jemand eines besseren belehren.

Grüße

Damian

Was es alles gibt :)

Du möchtest Ausgabeformatierung bei Timern verwenden. Das ist zwar nirgends beschrieben und von mir nicht getestet, aber es könnte funktionieren :)

Warum hast du die Regex-Angaben in eckige Klammern gesetzt, sie werden lt. Commandref

Syntax: [<device>:<reading>|<internal>:d<number>|"<regex>":<output>]


in Anführungszeichen angegeben, also z. B.:

[dummyTest:state:"([0-9]{2}:[0-9]{2})"]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Syrex-o

Hey Damian,

Um genau zu sein, möchte ich die Wochentage aus dem Reading filtern, die in 1234 angegeben werden.
DOIF kann zum Beispiel folgendes ohne Probleme:

([
  [dummyTest:state:"([0-9]{2}:[0-9]{2})"]
-[dummyTest:state:"((?<=.).[0-9]:[0-9]{2})"] |1234

]) (set Kreis1 on) DOELSE (set Kreis1 off)


Das Problem entsteht erst mit dem dritten Regex
Muss ich die Wochentage als MoDi definieren?

Hab mal die Syntax umgestellt  ;)

Damian

Bei mir wird der Ausdruck soweit erkannt.

Die Wochentagangaben werden erst zum Triggerzeitpunkt ausgewertet, daher steht der Ausdruck für die Wochentage wie angegeben hinter der Zeit bei den Timerreadings.


Internals:
   CFGFN     
   DEF        ([
  [d_test:state:"([0-9]{2}:[0-9]{2})"]-[d_test:state:"((?<=.).[0-9]:[0-9]{2})"]|[d_test:state:"((?<=.{12})[0-9]*)"]
])
   MODEL      FHEM
   NAME       di_test1
   NR         7516
   NTFY_ORDER 50-di_test1
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-07-24 21:53:21   cmd             0
     2018-07-24 21:53:21   mode            enabled
     2018-07-24 21:53:21   state           initialized
     2018-07-24 21:53:21   timer_01_c01    25.07.2018 05:00:00|[d:test:state:"((?<=.{12})[0-9]*)"]
     2018-07-24 21:53:21   timer_02_c01    25.07.2018 06:00:00|[d:test:state:"((?<=.{12})[0-9]*)"]
   Regex:
   condition:
     0          DOIF_time($hash,0,1,$wday,$hms,"[d_test:state:"((?<=.{12})[0-9]*)"]")
   days:
     0          [d_test:state:"((?<=.{12})[0-9]*)"]
     1          [d_test:state:"((?<=.{12})[0-9]*)"]
   devices:
   do:
     0:
       0         
     1:
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   interval:
     0          -1
     1          0
   intervalfunc:
   itimer:
     all         d_test
   localtime:
     0          1532487600
     1          1532491200
   realtime:
     0          05:00:00
     1          06:00:00
   time:
     0          [d_test:state:"([0-9]{2}:[0-9]{2})"]
     1          [d_test:state:"((?<=.).[0-9]:[0-9]{2})"]
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1532487600:
       localtime  1532487600
       hash:
     1532491200:
       localtime  1532491200
       hash:
   uiState:
   uiTable:
Attributes:


Edit:

Das Problem wird wohl wegen doppelter Anführungszeichen dieser Perl-Ausdruck sein:

DOIF_time($hash,0,1,$wday,$hms,"[d_test:state:"((?<=.{12})[0-9]*)"]")

Alternativ könnte man die drei Zeitangaben in DOIF_Readings ablegen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Syrex-o

Moment mal.

Also ich habe mal deinen Test:

([
  [d_test:state:"([0-9]{2}:[0-9]{2})"]-[d_test:state:"((?<=.).[0-9]:[0-9]{2})"]|[d_test:state:"((?<=.{12})[0-9]*)"]
])
übernommen.
Ich bekomme jedoch weiter die Meldung: SetKreis1 DOIF: right bracket without left bracket: 9]*)"]

Theoretisch könnte ich ja auch nach den "|  |" filtern und sie im selben regex nicht berücksichtigen.
Aber wie nur?  :o

Wie würde denn so ein DOIF Rediang dafür aussehen?
Da bin ich überfragt.

Edit: Leider geht auch das Folgende Regex nicht:

[dummyTest:state:"(?<=.{12})(.*)(?=\|)

Ich bekomme als timer nicht die werte aufgelistet, sondern das: timer_01_c01
24.07.2018 22:32:00|[dummyTest:state:"(?<=\|)(.*)(?=\|)"]

Grüße

Damian

Dann hast du evtl. nicht die aktuelle DOIF-Version.

Mit DOIF-Readings:

Internals:
   CFGFN     
   DEF        ([
  [$SELF:anfang]-[$SELF:ende]|[$SELF:woche]
])
   MODEL      FHEM
   NAME       di_test1
   NR         7516
   NTFY_ORDER 50-di_test1
   STATE      initialized
   TYPE       DOIF
   DOIF_Readings:
     anfang     ReadingValDoIf($hash,'d_test','state','','([0-9]{2}:[0-9]{2})')
     ende       ReadingValDoIf($hash,'d_test','state','','((?<=.).[0-9]:[0-9]{2})')
     woche      ReadingValDoIf($hash,'d_test','state','','((?<=.{12})[0-9]*)')
   READINGS:
     2018-07-24 23:20:08   anfang          05:00
     2018-07-24 23:19:53   cmd             0
     2018-07-24 23:20:08   ende            06:00
     2018-07-24 23:19:53   mode            enabled
     2018-07-24 23:19:53   state           initialized
     2018-07-24 23:20:08   timer_01_c01    25.07.2018 05:00:00|[di_test1:woche]
     2018-07-24 23:20:08   timer_02_c01    25.07.2018 06:00:00|[di_test1:woche]
     2018-07-24 23:20:08   woche           123
   Regex:
     DOIF_Readings:
       d_test:
         anfang:
           state      ^d_test$:^state:
         ende:
           state      ^d_test$:^state:
         woche:
           state      ^d_test$:^state:
   condition:
     0          DOIF_time($hash,0,1,$wday,$hms,"[di_test1:woche]")
   days:
     0          [di_test1:woche]
     1          [di_test1:woche]
   devices:
   do:
     0:
       0         
     1:
   helper:
     DOIF_Readings_events
     globalinit 1
     last_timer 2
     sleeptimer -1
   interval:
     0          -1
     1          0
   intervalfunc:
   intervaltimer:
   itimer:
     all         di_test1
   localtime:
     0          1532487600
     1          1532491200
   realtime:
     0          05:00:00
     1          06:00:00
   time:
     0          [di_test1:anfang]
     1          [di_test1:ende]
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1532487600:
       localtime  1532487600
       hash:
     1532491200:
       localtime  1532491200
       hash:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings anfang:[d_test:state:"([0-9]{2}:[0-9]{2})"],ende:[d_test:state:"((?<=.).[0-9]:[0-9]{2})"],woche:[d_test:state:"((?<=.{12})[0-9]*)"]



Die DOIF_Readings werden erst gesetzt, wenn d_test aktualisiert wird

hier  z. B mit

set d_test 05:00-06:00|123
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Syrex-o

Vielen Dank für den Hinweis.

Habe mal ein Update durchlaufen lassen und scheibar war ich hinter dem DOIF_Readings Stand.

Auf DOIF_Readings schaltet das DOIF nun, jetzt muss ich nur noch rausbekommen, wie ich einen dummy damit trigger.

Edit: Hat sich auch gerade gelöst.

Dankeschön für die tolle und späte Hilfe ;D

Damian

Zitat von: Syrex-o am 24 Juli 2018, 23:55:00
Dankeschön für die tolle und späte Hilfe ;D

Warum spät, meine Reaktionszeit nach deiner ersten Anfrage betrug gerade mal 34 Minuten ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

l2r

Wissen ist Macht.
Ich weiß nix.
Macht nix.

Damian

Zitat von: l2r am 25 Juli 2018, 09:19:55
ich glaube das war auf die Uhrzeit bezogen ;-)

Dann hätte es wohl zur späten Zeitstunde heißen müssen ;) immerhin Problem gelöst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF