Zeitschaltung mit [HH:MM|Wochentage] funktioniert nicht?

Begonnen von M_I_B, 27 April 2016, 07:49:04

Vorheriges Thema - Nächstes Thema

M_I_B

Hallo liebe Leute,

in einer längeren DOIF/DOELSEIF/DOELSE habe ich u.a. folgende Zeile:
DOELSEIF ([23:00|01234] or [00:00|56]) (set STD_4 off) \
Ursprünglich war das mal "[23:00|8] or [00:00|7])". Das funktionierte zwar perfekt, nur leider kann ich damit logischer Weise nicht SO-DO Abend resp. FR-SA Abend setzen. Also habe ich das konform zum http://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung umgebaut, auch wenn ich dann auf die Feiertags-Erkennung verzichten muss (OT: Wie wird letzteres eigentlich erkannt, in welchem Bundesland ich bin? Ist mir nicht ganz klar...)
... was soll ich sagen? Es funktioniert aus mir unerfindlichen Gründen nicht; der nachfolgende Befehl wird innert beider OR- Teile nie ausgeführt.


Bartimaus

#1
Moin,

es gibt keine "automatische" Bundesland/Feiertags-Erkennung", wenn Du das meinst.
Du legst eine *.holiday Datei an, deren Namen Du frei vergibst. Diese füllst Du dann händisch mit den Feiertagen/Ferientagen für Dein Bundesland. (Für die osternabhängigen Feiertage gibt es eine Funktion).
Anschliessend verknüpfst Du diese Datei mit dem Attribut holiday2we. http://fhem.de/commandref_DE.html#holiday Dann funktioniert auch die Steuerung in DOIF mit 7|8. oder 04 oder 56. (Dann musst Du aber eine Bedingung einbauen [*.holiday:state] eq "none" bzw. ne "none".

Verständlich ?

LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

M_I_B

Zitat von: Bartimaus am 27 April 2016, 08:45:13Verständlich ?
... öhhh ... zum Teil ;)

*der verstandene Teil *
Zumindest bezgl. Feiertage hast Du mich auf die richtige Spur gebracht; vielen Dank. Da werde ich mich noch mal mit auseinander setzen müssen. Da gab/gibt es ja auch irgendwie die Möglichkeit, ext. Kalender einzubinden (Schulferien.org, Google, ...), meine ich zumindest gelesen zu haben. Das wäre ziemlich genial, wenn zum einen die Ferien der Minizicke und auch ggf. in Google eingetragene FaulenzerZeiten berücksichtigt werden könnten...

*der unverstandene Teil*
aBär.... Wenn ich die einzelnen Ziffern für die Tage verwende (0-6), dann spielen ja die Feiertage keine Rolle, ebenso bei 7 & 8, wobei nach meiner Sichtweise dann zumindest Werktag/Wochenende ausgewertet werden müsste (ohne Feiertage), oder?

Zumindest in meinem Beispiel benutze ich ja nur die Tage 0-6. Aber das funktioniert leider nicht und ich kann mir nicht erklären, warum nicht. Rein theoretisch ist das ja funktionell identisch zu ...
DOELSEIF ([23:00|0] or ([23:00|1] or ([23:00|2] or ([23:00|3] or ([23:00|4] or [00:00|5] or [00:00|6]) (set STD_4 off) \
... was ich allerdings nicht probiert habe. In beiden Fällen sollte aber nach meinem Verständnis das gleiche Ergebnis heraus kommen, oder?

Bartimaus

aBär.... Wenn ich die einzelnen Ziffern für die Tage verwende (0-6), dann spielen ja die Feiertage keine Rolle, ebenso bei 7 & 8, wobei nach meiner Sichtweise dann zumindest Werktag/Wochenende ausgewertet werden müsste (ohne Feiertage), oder?


Genau, hierbei werden "Feiertage" nicht berücksichtigt.

Probiermal:

DOELSEIF ([23:00|01234]
and [*.Holiday:tomorrow] eq "none")
(set STD_4 off)
DOELSEIF ([00:00|56] or ([00:00] and [*.Holiday:tomorrow] ne "none"))
(set STD_4 off)
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Ellert

#4
Zitat von: M_I_B am 27 April 2016, 07:49:04
Hallo liebe Leute,

in einer längeren DOIF/DOELSEIF/DOELSE habe ich u.a. folgende Zeile:
DOELSEIF ([23:00|01234] or [00:00|56]) (set STD_4 off) \
Ursprünglich war das mal "[23:00|8] or [00:00|7])". Das funktionierte zwar perfekt, nur leider kann ich damit logischer Weise nicht SO-DO Abend resp. FR-SA Abend setzen. Also habe ich das konform zum http://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung umgebaut, auch wenn ich dann auf die Feiertags-Erkennung verzichten muss (OT: Wie wird letzteres eigentlich erkannt, in welchem Bundesland ich bin? Ist mir nicht ganz klar...)
... was soll ich sagen? Es funktioniert aus mir unerfindlichen Gründen nicht; der nachfolgende Befehl wird innert beider OR- Teile nie ausgeführt.
Zitatnie ausgeführt
stimmt nicht, denn, wenn Du Zeitpunkte in einem Bedingungszweig an gibst, dann verwendet DOIF keinen internen cmd_2 Status, daher wird Dein DOIF nur einmal ausgeführt, siehe http://fhem.de/commandref_DE.html#DOIF letzter Absatz der Einleitung und hier http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung das Anwendungsbeispiel und hier http://fhem.de/commandref_DE.html#DOIF_Relative_Zeitangaben das Beispiel.

Welche DOIF-Version verwendest Du? version DOIF

M_I_B

#5
... Version ist 98_DOIF.pm 10985 2016-03-03 17:25:24Z damian-s

Ok, so in etwa habe ich das verstanden. Aber ist es nicht so, das ein Attribut "do always" das aufhebt? Ich habe mal das ganze Konstrukt hier kopiert, damit wir auch sicher über das Gleiche reden:
define EsIstDunkel DOIF ([16:00-23:00] and [brightness.av:state] < 140) (set STD_(1|2|3|4|6) on,set HM4A1_4 on) \
DOELSEIF ([06:40|8]) (set STD_4 on_for_timer 1200) \
DOELSEIF ([23:00]) (set STD_(2|3) off) \
DOELSEIF ([01:30]) (set STD_(1|6) off,set HM4A1_4 off) \
DOELSEIF ([23:00|01234] or [00:00|56]) (set STD_4 off) \
DOELSE
attr EsIstDunkel do always

Wie gesagt funktioniert jede einzelne Zeile bis auf die letzte DOELSEIF. Wenn ich jetzt (vermutlich fehlerhaft) Deine Aussage zu den CMD'S versuche zu verstehen und umzusetzen, dürften die vorhergehenden Zeilen doch auch nicht funktionieren, oder? Komme ich ehrlich noch nicht ganz mit :-[

Zitatand [*.Holiday:tomorrow] eq "none")
... aber nur, wenn ich mein Holliday- Kram fertig eingerichtet habe?!?

BTW: Ist so etwas eigentlich erlaubt?
DOIF ([([23:00|7]-[24:00])]) blablub
... also 24h VOR dem Beginn des als Wochenende deklarierten ...?


Bartimaus

Zitat von: M_I_B am 27 April 2016, 10:32:54... aber nur, wenn ich mein Holliday- Kram fertig eingerichtet habe?!?


Yip, geht aber fix...  ;)
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

M_I_B

Zitat von: Bartimaus am 27 April 2016, 10:54:06Yip, geht aber fix...  ;)
... glaube ich Dir ... wenn man's drauf hat ;) Ich habe es noch nicht so drauf und mache das lieber Schritt für Schritt; besser is dat ...

Ellert

Zitat von: M_I_B am 27 April 2016, 10:32:54
... Version ist 98_DOIF.pm 10985 2016-03-03 17:25:24Z damian-s

Ok, so in etwa habe ich das verstanden. Aber ist es nicht so, das ein Attribut "do always" das aufhebt? Ich habe mal das ganze Konstrukt hier kopiert, damit wir auch sicher über das Gleiche reden:
define EsIstDunkel DOIF ([16:00-23:00] and [brightness.av:state] < 140) (set STD_(1|2|3|4|6) on,set HM4A1_4 on) \
DOELSEIF ([06:40|8]) (set STD_4 on_for_timer 1200) \
DOELSEIF ([23:00]) (set STD_(2|3) off) \
DOELSEIF ([01:30]) (set STD_(1|6) off,set HM4A1_4 off) \
DOELSEIF ([23:00|01234] or [00:00|56]) (set STD_4 off) \
DOELSE
attr EsIstDunkel do always

Wie gesagt funktioniert jede einzelne Zeile bis auf die letzte DOELSEIF. Wenn ich jetzt (vermutlich fehlerhaft) Deine Aussage zu den CMD'S versuche zu verstehen und umzusetzen, dürften die vorhergehenden Zeilen doch auch nicht funktionieren, oder? Komme ich ehrlich noch nicht ganz mit :-[
... aber nur, wenn ich mein Holliday- Kram fertig eingerichtet habe?!?

BTW: Ist so etwas eigentlich erlaubt?
DOIF ([([23:00|7]-[24:00])]) blablub
... also 24h VOR dem Beginn des als Wochenende deklarierten ...?

Die Version ist o.k., heute gibt es eine Neue.

Aus der DOIF Einleitung:
ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.

Zitatdefine EsIstDunkel DOIF ([16:00-23:00] and [brightness.av:state] < 140) (set STD_(1|2|3|4|6) on,set HM4A1_4 on) \
   DOELSEIF ([06:40|8]) (set STD_4 on_for_timer 1200) \
   DOELSEIF ([23:00]) (set STD_(2|3) off) \
   DOELSEIF ([01:30]) (set STD_(1|6) off,set HM4A1_4 off) \
   DOELSEIF ([23:00|01234] or [00:00|56]) (set STD_4 off) \
   DOELSE
Die markierten Zeiten können sich daher beeinflussen nur  [00:00|56] dürfte in dem Zweig unbeeinflusst funktionieren.

24:00 wird nicht klappen, gibt es auf einer Digitaluhr auch nicht ;)

Zitatand [*.Holiday:tomorrow] eq "none")
zur Syntax von Events siehe http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events

Bartimaus

Gehe auf "Edit Files"
Öffne eine bestehende Datei
Leere den Inhalt
Füge folgenden Inhalt (NRW) ein:
# Schulferien
4 03-21 04-02 Ostern
4 05-17 05-18 Pfingsten
4 07-11 08-23 Sommer
4 10-10 10-21 Herbst
4 12-23 12-31 Weihnachten
4 01-01 01-06 Weihnachten


# festes Datum
1 01-01 Neujahr
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 Silvester

# abhaengig von Ostersonntag
2 -48 Rosenmontag
2 -47 Veilchendienstag
2 -2 Karfreitag
2 1 Ostermontag
2 39 Christi Himmelfahrt
2 50 Pfingstmontag
2 51 PfingstDienstag
2 60 Fronleichnam


Speichere die Datei mit SAVE AS "Schulferien.holiday"

Unter "global" fügst Du das Attribut "holiday2we" mit Schulferien.holiday hinzu. Feddich.
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

M_I_B

Zitat von: Bartimaus am 27 April 2016, 11:34:43Gehe auf "Edit Files"
Ok, das ist ja einfach; das bekomme ich als DAU sogar hin ;) Aber das Ding müsste ich, zumindest für die Sommerferien, jede Jahr neu stricken. Bei schulferien.org gibt es den Ferienkalender per Bundesland aber im iCal- Format, was ich z.B. in unseren Google- Kalender eingebunden habe. Auch die Feiertage für jedes Bundesland sind an anderer Stelle aufgeführt, aber leider nicht im iCal- Format. Wie bekommt man die Ferien also von dort dynamisch ins FHEM?

Zitat von: Ellert am 27 April 2016, 11:20:32Aus der DOIF Einleitung: Die markierten Zeiten können sich daher beeinflussen nur  [00:00|56] dürfte in dem Zweig unbeeinflusst funktionieren.
Ja, das habe ich schon verstanden. Ich hatte nur angenommen, das "[23:00]" eine andere Bedingung ist als "[23:00|123]" oder auch "[16:00-23:00]". Dann ist das in etwas so ähnlich wie while/wend in PHP u.a. zu verstehen?
Wenn ja, wie könnte man dafür sorgen (vielleicht mit einem neuen "Befehl" IFDO? *DuckUndWech*), das auch bei einer erfüllten Bedingung die darauf folgenden ebenfalls überprüft werden?

Zitat von: Ellert am 27 April 2016, 11:20:3224:00 wird nicht klappen, gibt es auf einer Digitaluhr auch nicht ;)
Naja, schon klar... Ich meinte das auch nicht als Uhrzeit, sondern als Anzahl Stunden, welche vom vorausgehenden Wert abgezogen werden. Also quasi "Wochenende minus 24h"...

Ellert

ZitatJa, das habe ich schon verstanden. Ich hatte nur angenommen, das "[23:00]" eine andere Bedingung ist als "[23:00|123]" oder auch "[16:00-23:00]".
Es sind verschiedene Bedingungen, aber wenn ([16:00-23:00] and [brightness.av:state] < 140) um 23:00 Uhr wahr wird haben die anderen beiden Zeitpunkte keine Chance mehr. Hier ([23:00]) haben alle nachfolgenden Bedingungen keine Chance.
ZitatDann ist das in etwas so ähnlich wie while/wend in PHP u.a. zu verstehen?
Eher wie SELECT ... CASE.
ZitatWenn ja, wie könnte man dafür sorgen (vielleicht mit einem neuen "Befehl" IFDO? *DuckUndWech*), das auch bei einer erfüllten Bedingung die darauf folgenden ebenfalls überprüft werden?
Ja, so wie hier: https://forum.fhem.de/index.php/topic,52489.0.html , davon würde ich abraten, nimm einfach 23:00:00, 23:00:01, 23:00:02 als Zeitangaben.
ZitatNaja, schon klar... Ich meinte das auch nicht als Uhrzeit, sondern als Anzahl Stunden, welche vom vorausgehenden Wert abgezogen werden. Also quasi "Wochenende minus 24h"...
([([23:00|7]-[24:00])]) wäre der vorherige Tag 23:00. Am Besten, Du probierst es aus, würde mich auch interessieren ob es klappt, oder eine Fehlermeldung erzeugt.

M_I_B

Zitat von: Ellert am 27 April 2016, 17:02:33... haben alle nachfolgenden Bedingungen keine Chance. .../... Eher wie SELECT ... CASE.
Ahhh! Eine Insel mit zwei Bergen! Jetzt dämmert's mir so langsam ;D Alte Männer brauche halt mal ne Weile, bis die Wahrheit sich durch die verkalkten Gehirnwindungen gequält haben ::)

Zitat von: Ellert am 27 April 2016, 17:02:33Ja, so wie hier: https://forum.fhem.de/index.php/topic,52489.0.html , davon würde ich abraten, ...
Hmmm, wenn ich das richtig verstanden habe, triggert sich jedes DOELSEIF über $self selber?!? Is kompliziert und vermutlich enorm fehlerträchtig; da lasse ich mal die Finger von  :o

Zitat von: Ellert am 27 April 2016, 17:02:33([([23:00|7]-[24:00])]) wäre der vorherige Tag 23:00. Am Besten, Du probierst es aus, ...
Genau so war das gemeint. Denn wenn die Aktion am Vorabend des WE/Feiertages passieren soll, muss ich ja rückwärts denken. Ich probiere das einfach mal. Hab ja noch die 8CH-Aktoren hier im Büro liegen, so das nix passieren kann; ich werde berichten...

M_I_B

Zitat von: Bartimaus am 27 April 2016, 11:34:43... Unter "global" fügst Du das Attribut "holiday2we" mit Schulferien.holiday hinzu. Feddich.
... habe mal so getan wie befohlen ;)

Datei "ferien_feier.cfg" im FHEM-root
### Schulferien und Feiertage 2016 NDS ###

# Schulferien
4 01-28 01-29 Winter
4 03-18 04-02 Ostern
4 05-06 05-17 Pfingsten
4 06-23 08-03 Sommer
4 10-04 10-15 Herbst
4 12-21 12-31 Weihnachten
4 01-01 01-06 Weihnachten

# festes Datum
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

# abhaengig von Ostersonntag
2 -2 Karfreitag
2 01 Ostermontag
2 39 Christi Himmelfahrt
2 50 Pfingstmontag


Und in der fhem.cfg ...
attr global holiday2we /ferien_feier.cfg

Is richtig dat... Is doch?

Würde mich trotzdem interessieren, wie ich das direkt dynamisch aus schulferien.org resp. aus meinem Google- Kalender einlesen kann ...

Bartimaus

#14
Zitat von: M_I_B am 27 April 2016, 17:55:07
... habe mal so getan wie befohlen ;)

Datei "ferien_feier.cfg" im FHEM-root

Und in der fhem.cfg ...
attr global holiday2we /ferien_feier.cfg

Is richtig dat... Is doch?


JEIN ! Hast Du nicht...., die Datei sollte ferien_feier.holisday heissen, und nicht ferien_feier.cfg.


NIE NIE NIE NIEMALS NICHT als "Anfänger" direkt in der fhem.cfg editieren.

Man kann ALLES über die FHEM-Kommandozeile und den DEF-Editor in FHEM erledigen. Und Attribute kann man direkt am Device einstellen.

Nicht umsonst ist die FHEM.cfg per default zum editieren gesperrt.

Ich habe als blutiger Anfänger auch in der cfg "herumgepfuscht", System war dadurch ziemlich instabil, bis hin zur zersemmelten fhem.save und und und.

Kannst Du die Datei Ferien...cfg anklicken und z.B. get ferien_feier tomorrow abrufen ? Wenn ja, mit welchem Ergebnis ?
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly