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.
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 ?
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?
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)
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
... Version ist
98_DOIF.pm 10985 2016-03-03 17:25:24Z damian-sOk, 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 ...?
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... ;)
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 ...
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
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.
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"...
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.
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...
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 ...
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 ?
Zitat von: Bartimaus am 27 April 2016, 19:35:47NIE 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.
... ach, halb so wild. Das mache ich von Anfang an so und bin es gewohnt ...
Das man alles aus der Kommandozeile machen kann, ist schon klar, aber wenn man etwas größere Sachen macht, ist das extrem ekelig für mein Gefühl. Da nehme ich lieber Notepad++ und habe alles, ggf. auch mal mehrere Dateien, direkt im Blick...
Zitat von: Bartimaus am 27 April 2016, 19:35:47Kannst Du die Datei Ferien...cfg anklicken und z.B. get ferien_feier tomorrow abrufen ? Wenn ja, mit welchem Ergebnis ?
...nnnnöö... Weil ich sie nicht finden kann ::)
Aber mal was anderes dazu: Muss die Extension zwingend "holiday" sein?!?
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, würde mich auch interessieren ob es klappt, oder eine Fehlermeldung erzeugt.
Klappt nicht...
DOELSEIF ([([23:00:02|8]-[24:00])] or [([00:00|7]-[24:00])]) (set STD_4 off)
... generiert die folgende Fehlermeldung im LOG:
2016.04.27 23:00:00 1: PERL WARNING: Use of uninitialized value in numeric eq (==) at ./FHEM/98_DOIF.pm line 1169.
Was mich irritiert ist, das im LOG "23:00:00" steht und nicht wie erwartet "23:00:02". Oder bezieht sich die Sache auf die Eingangsbedingung des ganzen Konstruktes?
Zitat von: M_I_B am 28 April 2016, 08:30:39
Klappt nicht...
DOELSEIF ([([23:00:02|8]-[24:00])] or [([00:00|7]-[24:00])]) (set STD_4 off)
... generiert die folgende Fehlermeldung im LOG:
2016.04.27 23:00:00 1: PERL WARNING: Use of uninitialized value in numeric eq (==) at ./FHEM/98_DOIF.pm line 1169.
Was mich irritiert ist, das im LOG "23:00:00" steht und nicht wie erwartet "23:00:02". Oder bezieht sich die Sache auf die Eingangsbedingung des ganzen Konstruktes?
Der Hinweis auf die sekundengenaue Angabe der Zeiten bezieht sich auf dieses DOIF:
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
und zwar, um die Zeiten zu entzerren.
ZitatOder bezieht sich die Sache auf die Eingangsbedingung des ganzen Konstruktes?
Ja, die Fehlermeldung sagt ja, dass die Warnung bei einem numerischen Vergleich mit == entsteht. Wo das in Deinem DOIF der Fall ist, kannst nur Du selbst sehen.
Übrigens ([([23:00|7]-[24:00])]) liefert "Wrong timespec 23:00|7: either HH:MM:SS or {perlcode}: ([23:00|7]-[24:00]) "
Zitat von: Ellert am 28 April 2016, 09:05:31Der Hinweis auf die sekundengenaue Angabe der Zeiten bezieht sich auf dieses DOIF: ...
Ja, das nahm ich auch an; blindes Huhn findet auch mal'n Korn ;)
Zitat von: Ellert am 28 April 2016, 09:05:31Ja, die Fehlermeldung sagt ja, dass die Warnung bei einem numerischen Vergleich mit == entsteht. Wo das in Deinem DOIF der Fall ist, kannst nur Du selbst sehen.
Übrigens ([([23:00|7]-[24:00])]) liefert "Wrong timespec 23:00|7: either HH:MM:SS or {perlcode}: ([23:00|7]-[24:00]) "
Damit ich das richtig verstehe...
Dieses Konstrukt mit -24h funktioniert deshalb nicht, weil der PERL-Interpreter intern bei der Abarbeitung gegen die Wand läuft, da er bei der Subtraktion mit "23:00
|7" nicht klar kommt?
Zitat von: M_I_B am 28 April 2016, 10:42:59
Ja, das nahm ich auch an; blindes Huhn findet auch mal'n Korn ;)
Damit ich das richtig verstehe...
Dieses Konstrukt mit -24h funktioniert deshalb nicht, weil der PERL-Interpreter intern bei der Abarbeitung gegen die Wand läuft, da er bei der Subtraktion mit "23:00|7" nicht klar kommt?
Es ist zwar nicht der Perl-Interpreter, sondern der "DOIF"-Interpreter - aber du hast recht. Bei Intervallen kann man nur am Ende für beide Zeiten einen Wochentag angeben.
Gruß
Damian
Zitat von: M_I_B am 27 April 2016, 19:56:20
Aber mal was anderes dazu: Muss die Extension zwingend "holiday" sein?!?
Yo -> http://fhem.de/commandref_DE.html#holiday
@Damian: Ok, dann funktioniert das so mit dem "Vortag eines Wochenende/Ferientages/Feiertages" nicht :(
Gibt es ggf. noch eine andere Möglichkeit, den Vortag zu erfassen, ohne irgendwelche Verrenkungen machen zu müssen? Denn "Anwendungen" zu Vortag resp. Folgetag fallen mir auf die schnelle einige ein ...
@Bartimaus: öhhh... Tja... Hab eich glatt überlesen; danke. Dsa erklärt natürlich so einiges ::)
[08:00|56] (set bla on)
DOELSEIF
[08:00|01234] and [Ferien:tomorrow] ne "none" (set bla on)
finde ich nicht sehr verrenkt...
... ich meinte das in Bezug auf die Zahlencodes 0-6,7,8 Das würde die Sache sehr vereinfachen und die Zeilen übersichtlich halten.
Ich dachte da z.B. an Bit-opperative Möglichkeiten, wenn ich davon ausgehe, das die vorhandenen Codes 4 Bit belegen würden und man mit weiteren 4 Bit diese Sachen steuern könnte. Dann wäre nur noch eine Addition nötig, um die gewünschten Sachen ala Vortag, Vorwoche, Vormonat resp. Folgetag, Folgewoche, Folgemonat zu realisieren.
Wie dem auch sei; nur eine Idee. Hätte ja sein können, das es das schon längst gibt und ich es nur mal wieder nicht gesehen habe ...
Ich baue jetzt erst einmal mein DOIF- Konstrukt um und teile es auf, damit das mal ordentlich läuft...
Ich habe das jetzt mal zerlegt und folgendes verbrochen:
define EsIstDunkel DOIF ([16:00:01-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) \
DOELSE
attr EsIstDunkel do always
define CynthiaZimmer1 DOIF ([15:00-22:00] and [brightness.av:state] < 140) (set STD_4 on) \
DOELSEIF ([06:40|8]) (set STD_4 on_for_timer 1200) \
DOELSEIF ([23:00] and [nds:tomorrow] eq "none") (set STD_4 off) \
DOELSEIF ([00:00] and [nds:tomorrow] ne "none") (set STD_4 off) \
DOELSE
attr CynthiaZimmer1 do always
Der gedachte Ablauf soll sein:
1. Wenn Helligkeitswert unter 140 und zwischen 15 und 22 Uhr dann STD_4 ON
2. An Werktagen (wenn keine Feiertage/Ferien) um 6:40 STD_4 ON für 20 Minuten
3. Wenn morgen kein Feiertag/Ferien dann STD_4 OFF um 23 Uhr
4. Wenn morgen Feiertag/Ferien dann STD_4 erst um Mitternacht OFF
Die Ferien/Feiertags- Datei habe ich nun "nds.holiday" genannt und ins Verzeichnis "/FHEM" gelegt, wo auch die 99_myUtils.pm liegt. In der fhem.cfg habe ich dazu "attr global holiday2we nds.holiday" notiert, wobei ich mir nicht sicher bin, ob man dort die Extension mit angeben muss/soll oder nicht ...
Zitat von: M_I_B am 28 April 2016, 12:26:00
... ich meinte das in Bezug auf die Zahlencodes 0-6,7,8 Das würde die Sache sehr vereinfachen und die Zeilen übersichtlich halten.
Ich dachte da z.B. an Bit-opperative Möglichkeiten, wenn ich davon ausgehe, das die vorhandenen Codes 4 Bit belegen würden und man mit weiteren 4 Bit diese Sachen steuern könnte. Dann wäre nur noch eine Addition nötig, um die gewünschten Sachen ala Vortag, Vorwoche, Vormonat resp. Folgetag, Folgewoche, Folgemonat zu realisieren.
ja, allerdings habe ich das Modul insb. auch für Nicht-Informatiker programmiert, daher braucht es einer geeigneten Übersetzung, die alle solchen Fälle abdeckt und intuitiv ist.
Gruß
Damian
Zitat von: Damian am 28 April 2016, 22:17:00ja, allerdings habe ich das Modul insb. auch für Nicht-Informatiker programmiert, daher braucht es einer geeigneten Übersetzung, die alle solchen Fälle abdeckt und intuitiv ist.
Ja, da hast Du natürlich vollkommen recht und ich habe nicht drüber nachgedacht ...
Vielleicht könnte man ja sowas wie z.B. " [20:00|7(-2D)]" oder "[17:30|8(3W)]" bosseln, wobei D=Tag, W=Woche, M=Monat sowie die vorangestellte Ziffer ein Multilikator ist. Im ersten Beispiel also 2 Tage vorher, im zweiten Beispiel 3 Wochen später (was wohl eher selten vorkommt...Is ja nur'n Beispiel) ...
Nich meggern; viel mir gerade so spontan ein ^^
Aber für's WE ist erst mal Mopedfahren angesagt und nix FHEM; wie jedes Jahr findet man uns in Brokdorf an der Elbe beim diesjährigen 25. internationalen 6-Zylinder-Treffen mit Schlechtwetter- und Bodenfrost- Garantie 8)
ZitatVielleicht könnte man ja sowas wie z.B. " [20:00|7(-2D)]" oder "[17:30|8(3W)]" bosseln, wobei D=Tag, W=Woche, M=Monat sowie die vorangestellte Ziffer ein Multilikator ist. Im ersten Beispiel also 2 Tage vorher, im zweiten Beispiel 3 Wochen später (was wohl eher selten vorkommt...Is ja nur'n Beispiel) ...
Nich meggern; viel mir gerade so spontan ein ^^
Für Termine, die übers Jahr verteilt oder im Jahr periodisch auftreten, ist es sinnvoller das Calendar-Modul in Verbindung mit einem Kalender zu nutzen, um Befehle zu triggern, s. http://fhem.de/commandref_DE.html#Calendar
Oder Du versuchst es so: https://forum.fhem.de/index.php/topic,39070.msg446203.html#msg446203
*** grrrr ***
Das mit den Feiertagen u.s.w. läuft ja jetzt endlich, aber seit einigen Tagen funktioniert eine/die Zeitschaltung nur noch gelegentlich, wenn überhaupt. Ich habe mir schon einen Wolf gesucht, finde aber den Fehler nicht >:(
Ursprünglich war die Zeitschaltung so definiert:
define EsIstDunkel DOIF ([16:00-22:00] and [brightness.av:state] < 140) (set STD_(1|2|3|4|6|10) on,set HM4A1_4 on) \
DOELSEIF ([23:00]) (set STD_(2|3) off) \
DOELSEIF ([01:30]) (set STD_(1|6|10) off,set HM4A1_4 off) \
DOELSE
attr EsIstDunkel do always
Das hat wochenlang einwandfrei funktioniert, allerdings mit einer Einschränkung. Wenn man nämlich innerhalb der Zeit 16:00-22:00 die Lampen per RC manuell abgeschaltet hat, wurden die natürlich durch das DoAlways wieder eingeschaltet.
Also habe ich das Attribut gelöscht in der Annahme, das es ja auch ohne DoAlways funktionieren sollte; es wird ja nur einmal dunkel am Tag ^^
Weit gefehlt... Die ersten zwei Tage kein Problem, aber seit gestern Abend ging erst mal gar nichts mehr?!?
Also habe ich das Attribut wieder hinein genommen... nix... Dann habe ich das Ganze mal ohne die Uhrzeit gesetzt, einmal mit, einmal ohne Attribut:
define EsIstDunkel DOIF ([brightness.av:state] < 140) (set STD_(1|2|3|4|6|10) on,set HM4A1_4 on) \
DOELSEIF ([23:00]) (set STD_(2|3) off) \
DOELSEIF ([01:30]) (set STD_(1|6|10) off,set HM4A1_4 off) \
DOELSE
attr EsIstDunkel do always
Geht alles nicht mehr. Also alles wieder auf Anfang... ebenfalls ohne Erfolg...
Und nun ist der Punkt erreicht, an dem ich einfach nicht mehr weiter komme. Wieso hat das vorher schmerzfrei funktioniert und nun auf einmal nicht mehr?
... geht wieder, aus welchen Gründen auch immer :o :o :o
Ich nehme an, dass die Helligkeit bei dir zyklisch gesendet wird, daher ist do always bei:
define EsIstDunkel DOIF ([16:00-22:00] and [brightness.av:state] < 140) (set STD_(1|2|3|4|6|10) on,set HM4A1_4 on)
ungünstig, weil ständig und unnötig bei dir geschaltet wird.
Gruß
D. Sordyl
.... hmmmm ... Danke für den Hinweis!
Die Werte für die Helligkeit kommen aus einem Logfile, welches aus dem Mittelwert mehrerer Helligkeitssensoren generiert wird. Darin kommt z.B. ein Wert 139 nur einmal am Abend vor (bisher)...
Das "do always" hatte aber einen anderen unschönen Nebeneffekt und wurde inzwischen entsorgt. Wenn nämlich innert der angegebenen Zeit manuell per RC das Licht abgeschaltet werden sollte, machte es "schwupp" und die Funzeln waren wieder an ::)
Ich habe die ganze Sache inzwischen anders gelöst:
define EsIstDunkel DOIF ([brightness.av:state] < 140 and [brightness.av:state] > 135) (set STD_(1|2|3|6|10) on,set HM4A1_4 on) \
DOELSEIF ([23:00]) (set STD_(2|3) off) \
DOELSEIF ([01:30]) (set STD_(1|6|10) off) \
DOELSEIF ([brightness.av:state] > 150) (set STD_(1|2|3|6|10) off,set HM4A1_4 off) \
DOELSE
Das läuft noch im Test um zu erkennen, ob da noch irgendwo eine Macke drin ist; vergangene Nacht z.B. sind aus unerfindlichen Gründen alle Lampen irgendwann an gegangen... Ich hätte es nicht mitbekommen, da ich einen "gesunden" Schlaf habe, aber meine Frau bemerkte gegen 0400, das Licht auf edr Terasse an ist ^^
... tja ... Irgend etwas klemmt immer noch:
### Beleuchtung WZ, EZ, KU
define EsIstDunkel DOIF ([17:00-[SunDN_r]] and [brightness.av:state] < 140 and [brightness.av:state] > 135) (set STD_(1|2|3|6|10) on,set HM4A1_4 on) \
DOELSEIF ([23:00]) (set STD_(2|3) off) \
DOELSEIF ([01:30]) (set STD_(1|6|10) off) \
DOELSE
### Beleuchtung, Lüfter
define CynthiaZimmer1 DOIF ([17:00-[SunDN_r]] and [brightness.av:state] < 140 and [brightness.av:state] > 135) (set STD_4 on) \
DOELSEIF ([06:40|8] and [NDS:state] eq "none") (set STD_4 on-for-timer 1200) \
DOELSEIF ([23:00|01234] and [NDS:tomorrow] eq "none") (set STD_4 off) \
DOELSEIF ([00:00|7]) (set STD_4 off) \
DOELSE
Wenn man jeweils die relevante erste Zeile betrachtet, also die mit dem DOIF, findet man keinerlei Unterschied zwischen den Beiden, von den anderen Aktoren mal abgesehen (in "SunDN_r" steht der Wert von "sunset_abs("REAL")").
Dennoch wird erwartungsgemäß "EsIstDunkel" ausgeführt, hingegen "CynthiaZimmer1" nicht. Schalte ich STD_4 manuell ein, laufen alle anderen Vorgänge einwandfrei ab, also der "Weckruf" am Morgen wenn Schule ist so wie die Abschaltung abhängig davon, ob am nächten Tag Schule ist (23:00) oder nicht (00:00). Auch wenn ich STD_4 nicht manuell einschalte, wird der "Weckruf" am Morgen ausgeführt. Also sind alle DOELSEIF in beiden Fällen korrekt.
Wo liegt hier das Problem? Ist mir ein echtes Rätsel ... :-[