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]
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.
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.
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 ...
irgendwie geht auch eure laborversion nicht.
die schaffts nicht aus dem status "initialized" weg und es steht auch nix im log.
Steht denn was passendes im EveltLog? Und was sagen die Readings?
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.
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
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
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.
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.
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.
Ist nicht das Calendar-Modul die bessere Wahl?
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?
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?
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
du sprichst in kreuzworträtseln ...
wären 1 oder 2 sätze möglich, die ich auch versteh?
nach nem konkreten beispiel trau ich mich schon eh nicht fragen.
Zitat von: the ratman am 21 Dezember 2017, 10:54:26
du sprichst in kreuzworträtseln ...
wären 1 oder 2 sätze möglich, die ich auch versteh?
nach nem konkreten beispiel trau ich mich schon eh nicht fragen.
Du vergleichst Zeichenketten und keine Zahlen, daher gelten hier Vergleichsoperatoren für Zeichenketten und nicht für Zahlen, also: le statt <=, ge statt >=, lt statt <, gt statt > usw.
ahh, jetzt kapier ichs!
DAS geht? le und ge?
man kann mit "buchstaben" rechnen?
auf jeden fall probier ichs und dank dir für die info!
geht leider nicht - "isnt numeric"
[$SELF:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] ge "$year-$month-$mday"
and
[$SELF:urlaub_bis:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] le "$year-$month-$mday"
Natürlich nicht.
Bei Stings gilt:
"1" < "9"
und
"10" < "9"
Bei Zahlen aber:
1<9
und
10 > 9
Bisher hast du ja nur auf Gleich geprüft, da ist == bei Zahlen gleich mit eq bei Strings.
und was mach ich da?
du redest mit einem, der 0 ahnung vom programmieren hat (ausser html is über nacht ne programmiersprache geworden *g*)
Versuch doch noch mal die Ausgangswerte (Reading, Eingabe, woher kommen die Daten) darzustellen.
Das Zerlegen der Readings in Datumswerte kannst du parallel, wie schon geschrieben, mittels DOIF_Reading (https://forum.fhem.de/index.php/topic,77690.msg708629.html#msg708629) üben. Da kannst du mit Perl spielen, bis du was Passendes hast.
die readings kommen aus 2 readingsgroups und einem calendar
schauen dann z.b. so aus (nur mal schnell aus der raw-def kopiert) und sind auch immer korrekt.setstate doif_istfeiertag 2017-12-21 11:06:18 Device doif_istfeiertag
setstate doif_istfeiertag 2017-12-21 11:03:50 cmd 2.2
setstate doif_istfeiertag 2017-12-21 11:03:50 cmd_event doif_istfeiertag
setstate doif_istfeiertag 2017-12-21 11:03:50 cmd_nr 2
setstate doif_istfeiertag 2017-12-21 11:03:50 cmd_seqnr 2
setstate doif_istfeiertag 2017-12-21 11:06:18 e_doif_istfeiertag_frei_datum 21.12.2017
setstate doif_istfeiertag 2017-12-21 11:06:18 e_doif_istfeiertag_frei_io aus
setstate doif_istfeiertag 2017-12-21 11:06:18 e_doif_istfeiertag_urlaub_bis 30.12.2017
setstate doif_istfeiertag 2017-12-21 11:06:18 e_doif_istfeiertag_urlaub_io aus
setstate doif_istfeiertag 2017-12-21 11:06:18 e_doif_istfeiertag_urlaub_von 05.12.2017
setstate doif_istfeiertag 2017-12-21 11:03:50 feiertag nein
setstate doif_istfeiertag 2017-12-21 00:17:59 frei_datum 21.12.2017
setstate doif_istfeiertag 2017-12-21 00:18:01 frei_io aus
setstate doif_istfeiertag 2017-12-20 19:53:12 frei_txt test text
setstate doif_istfeiertag 2017-12-21 11:03:50 state cmd_2
setstate doif_istfeiertag 2017-12-20 20:04:42 urlaub_art zuhause
setstate doif_istfeiertag 2017-12-21 11:03:56 urlaub_bis 30.12.2017
setstate doif_istfeiertag 2017-12-21 11:06:18 urlaub_io aus
setstate doif_istfeiertag 2017-12-20 23:54:20 urlaub_von 05.12.2017
damit wir auf dem neuesten stand sind - so schaut das doif aus
(
(
[$SELF:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] ge "$year-$month-$mday"
and
[$SELF:urlaub_bis:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1] le "$year-$month-$mday"
and
[$SELF:urlaub_io] eq "ein"
)
or
(
[$SELF:frei_datum] eq "$mday.$month.$year"
and
[$SELF:frei_io] eq "ein"
)
or
[bw:state] ne "none"
)
(
set $SELF feiertag ja
)
DOELSE
()
(
set $SELF feiertag nein
)
das funzt auch, bis eben auf die urlaubsberechnung. auch der besondere tag "frei_datum" haut hin. es happert also "nur" noch am urlaubs-teil. der ist immer noch fast 1:1 aus dem wiki-beispiel. hab nur die berechnung für führende nullen raus, weil das eh korrekt aus der readingsgroup kommt.
doif-readings - juhuu - aber "Beliebiger Perlausdruck ". wie gsagt ... keinen schimmer hab. wenn du bei mir irgendwas mit perl siehst, liegt das daran, dass ichs ohne hirn und verstand abgeschrieben hab ...
ich habs nie kapiert, ich kapiers nicht und ich werds nie kapieren.
Das:
[$SELF:urlaub_von:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".$2."-".$1]
wäre ein "beliebiger" Perlausdruck. Natürlich nicht ganz beliebig, dieser enthält eine DOIF-Komponente.
Jetzt noch die Ausgabeformatierung (https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen)
[mydevice:myreading:"(\d\d):(\d\d):(\d\d)":"hours: $1, minutes $2, seconds: $3"]
im Hinterkopf, kannst du dich rantasten. Zumindest mache ich das so, mangels Fhem im Zugriff kann ich dir kein fertiges Ergebnis liefern.
ich gebs auf ...