doif - wieder mal auf fehlersuche ...

Begonnen von the ratman, 19 Dezember 2017, 22:00:06

Vorheriges Thema - Nächstes Thema

the ratman

was mach ich falsch?
ich kriege immer nur "ja", nie "nein"
Internals:
   CFGFN     
   DEF        ## urlaub, sondertag oder feiertag

(
(
[doif_urlaub:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
and
[doif_urlaub:urlaub_io] eq "ein"
)
or
(
[doif_frei:frei:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
and
[doif_frei:frei_io] eq "ein"
)
or
[br:state] ne "none"
)
(
   set $SELF feiertag ja;
)

DOELSEIF ## kein urlaub, sondertag oder feiertag

(
(
[doif_urlaub:urlaub_bis:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
or
[doif_urlaub:urlaub_io] eq "aus"
)
and
[doif_frei:frei_io] eq "aus"
and
[br:state] eq "none"
)
(
   set $SELF feiertag nein;
)

DOELSE
   NAME       doif_istfeiertag
   NR         1507
   NTFY_ORDER 50-doif_istfeiertag
   STATE      ja
   TYPE       DOIF
   READINGS:
     2017-12-19 21:49:44   Device          doif_urlaub
     2017-12-19 21:49:20   cmd             1
     2017-12-19 21:49:20   cmd_event       doif_frei
     2017-12-19 21:49:20   cmd_nr          1
     2017-12-19 21:49:43   e_doif_frei_frei 19.12.2017
     2017-12-19 21:49:43   e_doif_frei_frei_io aus
     2017-12-19 21:49:44   e_doif_urlaub_urlaub_bis 20.12.2017
     2017-12-19 21:49:44   e_doif_urlaub_urlaub_io aus
     2017-12-19 21:49:44   e_doif_urlaub_urlaub_von 19.12.2017
     2017-12-19 21:49:20   feiertag        ja
     2017-12-19 21:49:20   state           ja
   Regex:
     STATE:
       doif_istfeiertag:
         STATE:
           feiertag   ^doif_istfeiertag$:^feiertag:
   condition:
     0            ( ReadingValDoIf($hash,'doif_urlaub','urlaub_von','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday" and ReadingValDoIf($hash,'doif_urlaub','urlaub_io') eq "ein" ) or ( ReadingValDoIf($hash,'doif_frei','frei','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday" and ReadingValDoIf($hash,'doif_frei','frei_io') eq "ein" ) or ReadingValDoIf($hash,'br','state') ne "none"
     1            ( ReadingValDoIf($hash,'doif_urlaub','urlaub_bis','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday" or ReadingValDoIf($hash,'doif_urlaub','urlaub_io') eq "aus" ) and ReadingValDoIf($hash,'doif_frei','frei_io') eq "aus" and ReadingValDoIf($hash,'br','state') eq "none"
   devices:
     0           doif_urlaub doif_frei br
     1           doif_urlaub doif_frei br
     all         doif_urlaub doif_frei br
   do:
     0:
       0              set doif_istfeiertag feiertag ja;
     1:
       0              set doif_istfeiertag feiertag nein;
     2:
       0         
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      urlaub_io: aus
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   doif_urlaub
     timerevent urlaub_io: aus
     triggerDev doif_urlaub
     timerevents:
       urlaub_io: aus
     timereventsState:
       urlaub_io: aus
     triggerEvents:
       urlaub_io: aus
     triggerEventsState:
       urlaub_io: aus
   internals:
   itimer:
   readings:
     0           doif_urlaub:urlaub_von doif_urlaub:urlaub_io doif_frei:frei doif_frei:frei_io br:state
     1           doif_urlaub:urlaub_bis doif_urlaub:urlaub_io doif_frei:frei_io br:state
     all         doif_urlaub:urlaub_von doif_urlaub:urlaub_io doif_frei:frei doif_frei:frei_io br:state doif_urlaub:urlaub_bis
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      haben wir einen feiertag?
   cmdState   nein|ja
   group      umrechnen
   icon       helper_doif
   readingList feiertag:nein,ja
   room       logik und schalten
   state      [$SELF:feiertag]
→do↑p!dnʇs↓shit←

Damian

Zitat von: the ratman am 19 Dezember 2017, 22:00:06
was mach ich falsch?
ich kriege immer nur "ja", nie "nein"
Internals:
   CFGFN     
   DEF        ## urlaub, sondertag oder feiertag

(
(
[doif_urlaub:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
and
[doif_urlaub:urlaub_io] eq "ein"
)
or
(
[doif_frei:frei:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
and
[doif_frei:frei_io] eq "ein"
)
or
[br:state] ne "none"
)
(
   set $SELF feiertag ja;
)

DOELSEIF ## kein urlaub, sondertag oder feiertag

(
(
[doif_urlaub:urlaub_bis:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
or
[doif_urlaub:urlaub_io] eq "aus"
)
and
[doif_frei:frei_io] eq "aus"
and
[br:state] eq "none"
)
(
   set $SELF feiertag nein;
)

DOELSE
   NAME       doif_istfeiertag
   NR         1507
   NTFY_ORDER 50-doif_istfeiertag
   STATE      ja
   TYPE       DOIF
   READINGS:
     2017-12-19 21:49:44   Device          doif_urlaub
     2017-12-19 21:49:20   cmd             1
     2017-12-19 21:49:20   cmd_event       doif_frei
     2017-12-19 21:49:20   cmd_nr          1
     2017-12-19 21:49:43   e_doif_frei_frei 19.12.2017
     2017-12-19 21:49:43   e_doif_frei_frei_io aus
     2017-12-19 21:49:44   e_doif_urlaub_urlaub_bis 20.12.2017
     2017-12-19 21:49:44   e_doif_urlaub_urlaub_io aus
     2017-12-19 21:49:44   e_doif_urlaub_urlaub_von 19.12.2017
     2017-12-19 21:49:20   feiertag        ja
     2017-12-19 21:49:20   state           ja
   Regex:
     STATE:
       doif_istfeiertag:
         STATE:
           feiertag   ^doif_istfeiertag$:^feiertag:
   condition:
     0            ( ReadingValDoIf($hash,'doif_urlaub','urlaub_von','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday" and ReadingValDoIf($hash,'doif_urlaub','urlaub_io') eq "ein" ) or ( ReadingValDoIf($hash,'doif_frei','frei','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday" and ReadingValDoIf($hash,'doif_frei','frei_io') eq "ein" ) or ReadingValDoIf($hash,'br','state') ne "none"
     1            ( ReadingValDoIf($hash,'doif_urlaub','urlaub_bis','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday" or ReadingValDoIf($hash,'doif_urlaub','urlaub_io') eq "aus" ) and ReadingValDoIf($hash,'doif_frei','frei_io') eq "aus" and ReadingValDoIf($hash,'br','state') eq "none"
   devices:
     0           doif_urlaub doif_frei br
     1           doif_urlaub doif_frei br
     all         doif_urlaub doif_frei br
   do:
     0:
       0              set doif_istfeiertag feiertag ja;
     1:
       0              set doif_istfeiertag feiertag nein;
     2:
       0         
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      urlaub_io: aus
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   doif_urlaub
     timerevent urlaub_io: aus
     triggerDev doif_urlaub
     timerevents:
       urlaub_io: aus
     timereventsState:
       urlaub_io: aus
     triggerEvents:
       urlaub_io: aus
     triggerEventsState:
       urlaub_io: aus
   internals:
   itimer:
   readings:
     0           doif_urlaub:urlaub_von doif_urlaub:urlaub_io doif_frei:frei doif_frei:frei_io br:state
     1           doif_urlaub:urlaub_bis doif_urlaub:urlaub_io doif_frei:frei_io br:state
     all         doif_urlaub:urlaub_von doif_urlaub:urlaub_io doif_frei:frei doif_frei:frei_io br:state doif_urlaub:urlaub_bis
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      haben wir einen feiertag?
   cmdState   nein|ja
   group      umrechnen
   icon       helper_doif
   readingList feiertag:nein,ja
   room       logik und schalten
   state      [$SELF:feiertag]


Da kann man nur feststellen, dass immer nur die erste Bedingung wahr ist, warum - wird dir keiner sagen können, denn nur du kannst die Zustände der abgefragten Readings überprüfen, die zu cmd_1 führen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

the ratman

die zustände passen und werden auch immer aktuell aus den div. quellen übernommen im doif.

das problem liegt also meiner meinung nach bei meiner deffinition - nur wo, das kapier ich eben nicht.
fangt schon damit an, das ich in teilen euer https://wiki.fhem.de/wiki/DOIF/Zeitspanne_zwischen_zwei_Terminen_schalten mißbraucht hab, und nicht sicher bin, ob das so stimmt, was ich draus verbrochen hab.
→do↑p!dnʇs↓shit←

Damian

Zitat von: the ratman am 19 Dezember 2017, 22:36:43
die zustände passen und werden auch immer aktuell aus den div. quellen übernommen im doif.

das problem liegt also meiner meinung nach bei meiner deffinition - nur wo, das kapier ich eben nicht.
fangt schon damit an, das ich in teilen euer https://wiki.fhem.de/wiki/DOIF/Zeitspanne_zwischen_zwei_Terminen_schalten mißbraucht hab, und nicht sicher bin, ob das so stimmt, was ich draus verbrochen hab.

Dazu kannst du dir einfach ein DOIF definieren, dass nur die einzelnen Abfragen beinhalten z. B. nur:

[doif_urlaub:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"

[br:state] ne "none"

usw.

und schauen was passiert wahr oder nicht wahr.

Und dann Logik-Verständnis mitbringen, daran scheitern bereits viele, z. B.

nicht (A oder B) ist nicht das Gleiche wie nicht A oder nicht B sondern ...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

the ratman

irgendwie geht auch eure laborversion nicht.
die schaffts nicht aus dem status "initialized" weg und es steht auch nix im log.
→do↑p!dnʇs↓shit←

Per

Steht denn was passendes im EveltLog? Und was sagen die Readings?

the ratman

das logfile sagt gar nix.
die readings werden aus den anderen devics korrekt ausgelesen und im doif auch eingetragen (e_xxx)

der 2. teil - also das umschalten auf "nein" funzt (wobei da auch diese datumsaufdröselung nicht wichtig ist, weil er auch auf direkt auf das ein/aus-schalten des kalenders reagieren darf.
der 1. teil geht eben teilweise nicht. davon
(
[?doif_urlaub:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
and
[doif_urlaub:urlaub_io] eq "ein"
)
or
(
[?doif_frei:frei:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday"
and
[doif_frei:frei_io] eq "ein"
)
diesen code hab ich, wie gesagt, aus dem labor abgetippselt. ich hab allerdings die zeit weggelassen, weil ich nur das datum brauch. da ich mal grundsätzlich nicht versteh, wie der code mit dem datum zw. urlaub_von und urlaub_bis umgeht, brauch ich da eben ein wenig hilfe.
→do↑p!dnʇs↓shit←

Per

Zitat von: the ratman am 20 Dezember 2017, 13:13:59da ich mal grundsätzlich nicht versteh, wie der code mit dem datum zw. urlaub_von und urlaub_bis umgeht, brauch ich da eben ein wenig hilfe.
Perl ist auch nicht meine Muttersprache, daher nehme ich für sowas entweder ideone.com und/oder
Code (https://fhem.de/commandref_DE.html#DOIF_Readings) Auswählen
DOIF_Readings.
Wobei ich in deinem Fall eher mit dem Datum direkt arbeiten würde. Da du nur "Gleich" brauchst, ist das Format (yyyy-mm-dd oder dd.mm.yyyy) egal.

[doif_urlaub:urlaub_von] ~= "$mday.$month.$year"
Behebt zwar nicht den Fehler an sich, umgeht ihn aber

the ratman

#8
ZitatDa du nur "Gleich" brauchs
das versteh ich eben nicht.
ich hab doch nur datum1 und datum2 und brauche auch an allen tagen dazwischen meinen urlaub.

mein problem ist auch, dass ich ja sogar die labor-version aus dem doif-wiki (link findest irgendwo weiter oben) mit den selben problemen nicht zum laufen krieg.
das ding hat mich ja erst auf die idee gebracht, dass mit 2 kalendern zu machen (waf-freundlichkeit wäre enorm).

ums genau zu beschreiben, was ich machen will:
ich habe ein datum für den urlaubsbeginn und eines für das ende des urlaubs.
dazu kommt noch ein ein/aus button, falls man die funktion ganz abstellen will.
daraus will ich wissen, ob heute nun ein urlaubstag ist, oder nicht.
→do↑p!dnʇs↓shit←

Per

Das geht aber aus deinem DOIF (ohne den Perl-Teil) nicht hervor.
Versuch doch erstmal, ganz ohne Perl, das DOIF zu gestalten. Kannst ja mit Dummys arbeiten.

Urlaub wäre z.B., wenn Aktuell >= Beginn und Aktuell <= Ende ist.

Noch einfacher ist es, wenn du dir eine eigene Ferien äh Urlaubs-Datei machst und gg. die prüfst.

the ratman

ich wollt eig. meine feiertage-datei verwenden, kann nur nicht verlangen, dass meine holde dort was einträgt. drum diese umwege.
und ähnlich deinem tipp bastel ich grad was, hab aber noch ne wichtigere baustelle derzeit im fhem.
→do↑p!dnʇs↓shit←

Ellert

Ist nicht das Calendar-Modul die bessere Wahl?

the ratman

#12
ja, ist es, wie einen beitrag vorher geschrieben.

mußt du mir nur noch sagen, wie ich in das textfile vom floorplan aus nen urlaub eintragen und wieder löschen kann. das wäre sowieso mein liebster weg gewesen.

nachtrag:
nun hab ich das doif nur für den urlaubsteil ganz nachgebaut und, so hoff ich, vereinfacht:

(
[?$SELF:urlaub_von] eq "$mday.$month.$year"
)

(
set $SELF urlaub_heute ja
)
   
DOELSEIF

(
[?$SELF:urlaub_bis] eq "$mday.$month.$year"
or
["^global$:^MODIFIED $SELF$"]
)

(
set $SELF urlaub_heute nein
)

funzt auch nicht - die readings passen und lassen sich stellen.
und was macht ["^global$:^MODIFIED $SELF$"] eigentlich?
→do↑p!dnʇs↓shit←

the ratman

langsam verzweifel ich.
ich such mir einen ab, finde aber nix konkretes, ob man mit datum im doif ebenso rechnen kann, wie mit zeiten.
wenn ja, müsste dann ja ein simples ([datum1] <= [datum2]) funzen, ohne gleich auf unixtime umrechnen zu müssen (wie immer ich das im doif auch hinkriegen würde)?
also nach muster
(
[$SELF:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] >= "$year-$month-$mday"
and
[$SELF:urlaub_bis:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] <= "$year-$month-$mday"
and
[$SELF:urlaub_io] eq "ein"
)
was natürlich nicht geht ...

wenn ja, bin ich aber scheints zu blöd für - kann man mir helfen?
→do↑p!dnʇs↓shit←

Ellert

#14
Zitat von: the ratman am 21 Dezember 2017, 00:23:56
langsam verzweifel ich.
ich such mir einen ab, finde aber nix konkretes, ob man mit datum im doif ebenso rechnen kann, wie mit zeiten.
wenn ja, müsste dann ja ein simples ([datum1] <= [datum2]) funzen, ohne gleich auf unixtime umrechnen zu müssen (wie immer ich das im doif auch hinkriegen würde)?
also nach muster
(
[$SELF:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] >= "$year-$month-$mday"
and
[$SELF:urlaub_bis:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] <= "$year-$month-$mday"
and
[$SELF:urlaub_io] eq "ein"
)
was natürlich nicht geht ...

wenn ja, bin ich aber scheints zu blöd für - kann man mir helfen?
([datum1] <= [datum2]), le aber {"100%" le "99%" } ist 1