[gelöst] DOIF erkennt Eintrag in holiday, $we=1, holiday2we nicht als Feiertag

Begonnen von Ellert, 27 November 2015, 08:53:51

Vorheriges Thema - Nächstes Thema

Ellert

Seit einiger Zeit beobachte ich , dass das DOIF Einträge in der holiday-Datei,$we nicht mehr als Feiertag, Wochenende erkennt, wie in der Commandref erwähnt.
Zitat7 für Wochenende und Feiertage (entspricht $we) und 8 für Arbeitstage (entspricht !$we)
Das normale Wochenende wird richtig interpretiert, würde ich in der  Rückschau meinen.
Heute habe ich das mal dokumentiert am Beispiel dieses DOIFs:
Internals:
   DEF        ([([21:45:02]+int(rand(1800)))]) (set OG_Bad down)
DOELSEIF ([AziInt] >= 179 and [AziInt] < 269 and ([?WeatherCond_di] or ([?RTDN1_Bad:measured-temp] >= 22.5) and [?WeatherClear] =~ [?aktWetter:code]) and ![?Heizperiode])(set OG_Bad stop)
DOELSEIF ([([wendoBlindStSZ:HMS]-600+int(rand(600)))|7] or [([workoBlindStSZ:HMS]-600+int(rand(600)))|8]) (set OG_Bad up)
   NAME       RolloBad_di
   NR         322
   NTFY_ORDER 50-RolloBad_di
   STATE      cmd_3
   TYPE       DOIF
   Readings:
     2015-11-27 08:11:25   Device          AziInt
     2015-11-27 06:08:53   cmd_event       timer_3
     2015-11-27 06:08:53   cmd_nr          3
     2015-11-27 08:11:25   e_AziInt_STATE  127
     2015-11-27 06:08:53   state           cmd_3
     2015-11-26 22:06:53   timer_1_c1      27.11.2015 21:59:11
     2015-11-27 07:28:18   timer_2_c3      28.11.2015 07:26:50|7
     2015-11-27 06:12:12   timer_3_c3      28.11.2015 06:06:22|8
     2015-09-07 19:53:32   timer_4_c4      08.09.2015 08:46:09
   Condition:
     0          DOIF_time_once($hash,$hash->{timer}{0},$wday,"")
     1          InternalDoIf('AziInt','STATE','') >= 179 and InternalDoIf('AziInt','STATE','') < 269 and (InternalDoIf('WeatherCond_di','STATE','') or (ReadingValDoIf('RTDN1_Bad','measured-temp','') >= 22.5) and InternalDoIf('WeatherClear','STATE','') =~ ReadingValDoIf('aktWetter','code','')) and !InternalDoIf('Heizperiode','STATE','')
     2          DOIF_time_once($hash,$hash->{timer}{1},$wday,"7") or DOIF_time_once($hash,$hash->{timer}{2},$wday,"8")
   Days:
     1          7
     2          8
   Devices:
     1           AziInt
     all         AziInt
   Do:
     0:
       0          set OG_Bad down
     1:
       0          set OG_Bad stop
     2:
       0          set OG_Bad up
     3:
   Helper:
     globalinit 1
     last_timer 3
     sleeptimer -1
   Internals:
     1           AziInt:STATE
     all         AziInt:STATE
   Itimer:
     all         wendoBlindStSZ workoBlindStSZ
   Readings:
   Realtime:
     0          21:59:11
     1          07:26:50
     2          06:06:22
   State:
   Time:
     0          ([21:45:02]+int(rand(1800)))
     1          ([wendoBlindStSZ:HMS]-600+int(rand(600)))
     2          ([workoBlindStSZ:HMS]-600+int(rand(600)))
   Timecond:
     0          0
     1          2
     2          2
   Timer:
     0          0
     1          0
     2          0
   Timerfunc:
   Timers:
     0           0  0
     2           1  2  1  2
   Trigger:
Attributes:
   alias      00_Rollladensteuerungsplan_Bad
   disable    0
   group      Rolladen
   icon       time_note
   room       1_Alles

Hier hat heute morgen "timer_3_c3      28.11.2015 06:06:22|8" geschaltet, es hätte  timer_2_c3      28.11.2015 07:26:50|7 schalten sollen.

Die holiday-Datei sh.holiday sieht so aus:

# Siehe auch
# http://de.wikipedia.org/wiki/Feiertage_in_Deutschland

1 01-01 Neujahr
1 05-01 Tag der Arbeit
1 10-03 Tag der deutschen Einheit
1 12-24 Heiligabend
1 12-25 1. Weihnachtstag
1 12-26 2. Weihnachtstag
1 12-31 Silvester

2 -2 Karfreitag
2  1 Ostermontag
2 39 Christi Himmelfahrt
2 50 Pfingsten
# *************************
1 11-27 frei

Der 27.11. müsste als Wochenende interpretiert werden.
Im holiday-Device stimmt es:

Internals:
   DEF
   NAME       sh
   NR         24
   STATE      frei
   TRIGGERTIME 1448665202.07022
   TYPE       holiday
   Readings:
     2015-11-27 00:00:02   state           frei
     2015-11-27 00:00:02   tomorrow        none
     2015-11-27 00:00:02   yesterday       none
Attributes:
   alias      900_Feiertag
   group      0_Raumklimastatus,Kalender
   icon       time_note
   room       1_Alles,5_Heizung


$we zeigt auch den richtigen Zustand an.
{return "\$we: $we"} ergibt: $we: 1
holiday2we ist bei mir auch gesetzt.
attr global holiday2we sh

Bis vor kurzem hat das Zusammenspiel holiday2we, $we, holiday, DOIF korrekt funktioniert.

Hat das beschriebene Verhalten noch jemand beobachtet?
Mache ich etwas falsch oder habe ich eine Anpassung vergessen im Zusammenhang mit Featurelevel: 5.7?

rudolfkoenig

Nur als Info: seit der Umstellung auf 5.7 war $we kaputt, ich habe es am 24.11 gefixt, per update ausgeliefert wird es seit 25.11.

Ellert

Mein letztes Update habe ich gestern am 26.11., um 8.49 Uhr durchgeführt. 

Vize

Hi,

hatte heute das gleiche "Phänomen"...http://forum.fhem.de/index.php/topic,44757.0.html

Ich habe gerade erstmal nur das Modul 95_holiday.pm per update aktualisiert.
{return "\$we: $we"}
ergibt für mich aber immer noch $we: 0 ...

95_holiday.pm       10004 2015-11-25 12:58:12Z rudolfkoenig

Gruß
Andreas

Tante Edit sagt: Nach einem Komplettupdate ergibt
{return "\$we: $we"}
$we: 1

Gruß
Andreas

Ellert

{$value("sh")} liefert unter featurelevel 5.7 immer noch nichts zurück.
Mit "attr global featurelevel 5.6" wird der Feiertag angezeigt.

Das ist auch der Grund, weshalb das DOIF den Feiertag nicht erkennt, das wird mit dieser Funktion ermittelt:
DOIF_we($) {
  my ($wday)=@_;
  my $we = (($wday==0 || $wday==6) ? 1 : 0);
  if(!$we) {
    my $h2we = $attr{global}{holiday2we};
    $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none");
  }
  return $we;
}


und hier wird der nicht gefüllte $value{$h2we} abgefragt.

krikan

Zitat von: Ellert am 27 November 2015, 20:58:04
{$value("sh")} liefert unter featurelevel 5.7 immer noch nichts zurück.
Mit "attr global featurelevel 5.6" wird der Feiertag angezeigt.
Dann arbeitet es doch wie in den Updatehinweisen beschrieben: http://forum.fhem.de/index.php/topic,44094.0.html !?

Zitat- $value{def} gibts nicht mehr, bitte Value("def") verwenden

Ellert

Nach dem ich nun glaube das Problem verstanden zu haben, gibt es aus meiner Sicht folgende Lösungen, solange DOIF Featurelevel 5.7 nicht unterstützt.

FHEM auf Featurelevel 5.6 umstellen:
attr global featurelevel 5.6

oder die Zeile 627 in der 98_DOIF.pm von $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none"); in $we = 1 if($h2we && Value($h2we) && Value($h2we) ne "none"); ändern.

krikan

Verstehe ich nicht: Warum sollte DOIF featurelevel 5.7 nicht unterstützen?

Zitat$we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none");
$value{def} geht ab featurelevel 5.7 von FHEM laut Ankündigung nicht mehr und muss eben so wie von Dir geschrieben abgeändert werden. Also arbeitet doch alles wie angekündigt!?

Damian

Zitat von: Ellert am 28 November 2015, 10:15:13
Nach dem ich nun glaube das Problem verstanden zu haben, gibt es aus meiner Sicht folgende Lösungen, solange DOIF Featurelevel 5.7 nicht unterstützt.

FHEM auf Featurelevel 5.6 umstellen:
attr global featurelevel 5.6

oder die Zeile 627 in der 98_DOIF.pm von $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none"); in $we = 1 if($h2we && Value($h2we) && Value($h2we) ne "none"); ändern.

Ich habe DOIF angepasst und eingecheckt, sollte jetzt 5.7 kompatibel sein. Ab morgen per Update verfügbar.

Gruß

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

bmwfan

Hallo,

ich muss den Thread nochmal aufmachen, da ich aktuell genau das Problem habe. 2 Urlaubstage habe ich in der holiday-Datei eingetragen. Die werden mir auch nach Abfrage von {return "\$we: $we"} mit $we= 1 angezeigt, d.h. es ist "Wochenende". Trotzdem sind die Jalousien zu der Zeit eines Arbeitstages hochgefahren. Meine Module date ich regelmäßig (zuletzt Montag) up. 98_DOIF ist vom 2016-04-26, 95_holiday ist vom 2016-01-16.

Meine DOIF der Jalousie:
([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [21:45]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}})
DOELSEIF ([du_Tageslicht] eq "dunkel" and [SteigStr:state] ne "home") ({if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}})
DOELSEIF ([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [rr_Juergen:state] eq "home" and [Jal_KU_Ost_03:level] == 0)) (set Jal_KU_Ost winkel 50)
DOELSEIF ([du_Rollo_Master] eq "an" and  ([du_Tageslicht] eq "hell" and ([07:00-09:00|134] or [09:15-09:30|257])))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "0") < 40) {fhem("set Jal_KU_Ost level 100")}})


Meine Feiertagsdatei:
# Feiertagskalender Baden-Wuerttemberg
# Format für einzelne Tage: 1 MM-DD <Text>
1 01-01 Neujahr
1 01-06 Heilige Drei Könige
1 05-01 Tag der Arbeit
1 10-03 Tag der Deutschen Einheit
1 11-01 Allerheiligen
1 12-24 Heiligabend
1 12-25 1. Weihnachtstag
1 12-26 2. Weihnachtstag
1 12-31 Sylvester

# Osterbezogene Feiertage
# Format: 2 <relative Tage von Ostern> <Text>
2 -2 Karfreitag
2  1 Ostermontag
2 39 Christi Himmelfahrt
2 50 Pfingsten
2 60 Fronleichnam

# Urlaube
# Format: 4 MM-DD MM-DD <Text>
4 12-28 12-30 Urlaub
4 05-04 05-05 Urlaub


Hatte im Thread gelesen, dass das Problem gelöst wäre, bei mir tritt es aber noch - oder wieder - auf. Hat jemand eine Idee, warum?

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Ellert


bmwfan

Hallo Ellert,

ich habe mir beides mehrmals durchgelesen, kann aber den Fehler nicht finden. Lediglich, dass ich Samstag nicht explizit aufgeführt habe, aber der wird ja in 7 (WE) eingerechnet. Ansonsten bin ich der Meinung, dass die Zeitangaben korrekt sind und es paßt ja auch für die Arbeitstage, Feiertage und Wochenende. Lediglich die Urlaubstage stimmen nicht. Daher dachte ich nicht, dass es an den Zeitangaben liegt.
Kannst Du mir bitte genauer sagen, was Deiner Meinung nach nicht stimmt?

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Damian

Zitat von: bmwfan am 04 Mai 2016, 20:18:48
Hallo Ellert,

ich habe mir beides mehrmals durchgelesen, kann aber den Fehler nicht finden. Lediglich, dass ich Samstag nicht explizit aufgeführt habe, aber der wird ja in 7 (WE) eingerechnet. Ansonsten bin ich der Meinung, dass die Zeitangaben korrekt sind und es paßt ja auch für die Arbeitstage, Feiertage und Wochenende. Lediglich die Urlaubstage stimmen nicht. Daher dachte ich nicht, dass es an den Zeitangaben liegt.
Kannst Du mir bitte genauer sagen, was Deiner Meinung nach nicht stimmt?

Grüße Jürgen

Warum benutzt du if und nimmst den umständlichen Umweg über Perl, wenn DOIF if bereits eingebaut hat?

([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [21:45]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}})


entspricht

([du_Rollo_Master] eq "an" and [du_Tageslicht] eq "dunkel" and [21:45] and [Jal_KU_Ost_03:level] != 0) (set Jal_KU_Ost level 0)

Wenn man irgend etwas zum Verhalten von DOIF sagen soll, so braucht man ein list-Output deines Moduls.

Gruß

Damian

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

Ellert


bmwfan

@Damian:
Hatte das in einem Beispiel so gesehen und es hat funktioniert. Ich muss gestehen, dass ich mich trotz der sehr ausführlichen Dokumentation sehr schwer tue, Abläufe damit zu erstellen. Häufig nehme ich ein Beispiel als Vorlage und ändere das ab. So auch bei diesem Ablauf. Besten Dank für den Tip. Werde ich umsetzen.

Anbei das list:
Internals:
   CFGFN      ./FHEM/Jalousien.cfg
   DEF        ([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [21:45]))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}})
DOELSEIF ([du_Tageslicht] eq "dunkel" and [SteigStr:state] ne "home") ({if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}})
DOELSEIF ([du_Rollo_Master] eq "an" and ([du_Tageslicht] eq "dunkel" and [rr_Juergen:state] eq "home" and [Jal_KU_Ost_03:level] == 0)) (set Jal_KU_Ost winkel 50)
DOELSEIF ([du_Rollo_Master] eq "an" and  ([du_Tageslicht] eq "hell" and ([07:00-09:00|134] or [09:15-09:30|257])))
({if (ReadingsVal("Jal_KU_Ost_03", "level", "0") < 40) {fhem("set Jal_KU_Ost level 100")}})
   NAME       di_EG_KU_Jal_Ost
   NR         219
   NTFY_ORDER 50-di_EG_KU_Jal_Ost
   STATE       unten50
   TYPE       DOIF
   Readings:
     2016-05-04 21:46:16   Device          Jal_KU_Ost_03
     2016-05-04 21:46:13   cmd             3
     2016-05-04 21:46:13   cmd_event       Jal_KU_Ost_03
     2016-05-04 21:46:13   cmd_nr          3
     2016-05-04 21:46:16   e_Jal_KU_Ost_03_level 1
     2016-05-04 20:26:58   e_SteigStr_state home
     2016-05-04 20:54:12   e_du_Tageslicht_STATE dunkel
     2016-05-04 18:24:08   e_rr_Juergen_state home
     2016-05-04 21:46:13   error           set Jal_KU_Ost winkel 50: Winkelangabe ist mit 45 Grad vorgegeben
     2016-05-04 21:46:13   state            unten50
     2016-05-04 21:45:00   timer_1_c1      05.05.2016 21:45:00
     2016-05-04 09:00:00   timer_2_c4      05.05.2016 07:00:00|134
     2016-05-04 09:00:00   timer_3_c4      05.05.2016 09:00:00|134
     2016-05-04 09:30:00   timer_4_c4      05.05.2016 09:15:00|257
     2016-05-04 09:30:00   timer_5_c4      05.05.2016 09:30:00|257
     2016-05-03 21:26:35   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'du_Rollo_Master','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "an" and (InternalDoIf($hash,'du_Tageslicht','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "dunkel" and DOIF_time_once($hash,$hash->{timer}{0},$wday,""))
     1          InternalDoIf($hash,'du_Tageslicht','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "dunkel" and ReadingValDoIf($hash,'SteigStr','state','','',AttrVal($hash->{NAME},'notexist',undef)) ne "home"
     2          InternalDoIf($hash,'du_Rollo_Master','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "an" and (InternalDoIf($hash,'du_Tageslicht','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "dunkel" and ReadingValDoIf($hash,'rr_Juergen','state','','',AttrVal($hash->{NAME},'notexist',undef)) eq "home" and ReadingValDoIf($hash,'Jal_KU_Ost_03','level','','',AttrVal($hash->{NAME},'notexist',undef)) == 0)
     3          InternalDoIf($hash,'du_Rollo_Master','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "an" and  (InternalDoIf($hash,'du_Tageslicht','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "hell" and (DOIF_time($hash,$hash->{realtime}{1},$hash->{realtime}{2},$wday,$hms,"134") or DOIF_time($hash,$hash->{realtime}{3},$hash->{realtime}{4},$wday,$hms,"257")))
   Days:
     1          134
     2          134
     3          257
     4          257
   Devices:
     0           du_Rollo_Master du_Tageslicht
     1           du_Tageslicht SteigStr
     2           du_Rollo_Master du_Tageslicht rr_Juergen Jal_KU_Ost_03
     3           du_Rollo_Master du_Tageslicht
     all         du_Rollo_Master du_Tageslicht SteigStr rr_Juergen Jal_KU_Ost_03
   Do:
     0:
       0          {if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}}
     1:
       0          {if (ReadingsVal("Jal_KU_Ost_03", "level", "100") != 0) {fhem("set Jal_KU_Ost level 0")}}
     2:
       0          set Jal_KU_Ost winkel 50
     3:
       0          {if (ReadingsVal("Jal_KU_Ost_03", "level", "0") < 40) {fhem("set Jal_KU_Ost level 100")}}
     4:
   Helper:
     event      direction: none,level: 1,working: 0%,level_1
     globalinit 1
     last_timer 5
     sleeptimer -1
     timerdev   Jal_KU_Ost_03
     timerevent direction: up,level: 0,working: 100%,level_0
     triggerDev Jal_KU_Ost_03
     timerevents:
       direction: up
       level: 0
       working: 100%
       level_0
     timereventsState:
       direction: up
       level: 0
       working: 100%
       state: level_0
     triggerEvents:
       direction: none
       level: 1
       working: 0%
       level_1
     triggerEventsState:
       direction: none
       level: 1
       working: 0%
       state: level_1
   Internals:
     0           du_Rollo_Master:STATE du_Tageslicht:STATE
     1           du_Tageslicht:STATE
     2           du_Rollo_Master:STATE du_Tageslicht:STATE
     3           du_Rollo_Master:STATE du_Tageslicht:STATE
     all         du_Rollo_Master:STATE du_Tageslicht:STATE
   Interval:
     1          -1
     2          1
     3          -1
     4          3
   Itimer:
   Localtime:
     0          1462477500
     1          1462424400
     2          1462431600
     3          1462432500
     4          1462433400
   Readings:
     1           SteigStr:state
     2           rr_Juergen:state Jal_KU_Ost_03:level
     all         SteigStr:state rr_Juergen:state Jal_KU_Ost_03:level
   Realtime:
     0          21:45:00
     1          07:00:00
     2          09:00:00
     3          09:15:00
     4          09:30:00
   Regexp:
     0:
     1:
     2:
     3:
     All:
   State:
   Time:
     0          21:45:00
     1          07:00:00
     2          09:00:00
     3          09:15:00
     4          09:30:00
   Timecond:
     0          0
     1          3
     2          3
     3          3
     4          3
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
   Timers:
     0           0
     3           1  2  3  4
   Trigger:
   Triggertime:
     1462424400:
       localtime  1462424400
       Hash:
     1462431600:
       localtime  1462431600
       Hash:
     1462432500:
       localtime  1462432500
       Hash:
     1462433400:
       localtime  1462433400
       Hash:
     1462477500:
       localtime  1462477500
       Hash:
Attributes:
   cmdState   unten | unten | unten50 | oben
   room       1.2_Kueche,9.8.1_DOIF
   verbose    1
   wait       0:0:0:0


cmd 3, da die Jalousie zur bestimmten Zeit heruntergefahren ist und sich dann auf einen Öffnungswinkel von 50 ° gestellt hat. Alles korrekt trotz Error. Ich habe die Winkelangabe stufig ausgeführt, die Überprüfung ist aber noch linear.. Brauchst Du ein List morgen früh, wenn die Jalousie wieder zu früh hochfahren sollte? Morgen ist auch als Urlaub eingetragen.

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd