Autor Thema: Sommerzeit/Normalzeit als DOIF Objekt  (Gelesen 11362 mal)

Offline Loredo

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3753
  • ~ Challenging Innovation ~
Sommerzeit/Normalzeit als DOIF Objekt
« am: 13 Oktober 2015, 10:28:47 »
Ich wollte statt dst() gerne ein richtiges Reading nutzen können und habe mir dafür dieses DOIF erstellt:


define DST DOIF
(
   ([02:00] or [03:00]) and
   $isdst
)

DOELSE


Folgende Attribute wurden gesetzt:
alias Daylight Time
cmdState summer|normal
event-on-change-reading state
eventMap summer:Sommer normal:Normal initialized:---
group Season Details
icon time_clock
room Environment
« Letzte Änderung: 07 November 2015, 18:41:14 von Loredo »
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline moonsorrox

  • Hero Member
  • *****
  • Beiträge: 3952
  • Online
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #1 am: 13 Oktober 2015, 15:13:09 »
wenn die Anfänger das so in die Fhem Kommandozeile eingeben meckert er rum..!  ;)

dann sollten sie diese beiden Semikolons hinter "localtime(time);" weglassen
Ansonsten ist das ein echt guter Einfall, wenn man es irgendwo brauchen kann..!  :D
Intel-NUC i3: FHEM-Server 5.9 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Offline Loredo

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3753
  • ~ Challenging Innovation ~
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #2 am: 13 Oktober 2015, 15:21:39 »
Wer das in den Editor eingibt bekommt keine Fehler.
Bei solch langen Definitionen ist es immer sinnvoll erst ein leeres DOIF anzulegen und dann zu editieren:


define DST DOIF ([DST])
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Offline moonsorrox

  • Hero Member
  • *****
  • Beiträge: 3952
  • Online
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #3 am: 13 Oktober 2015, 15:27:50 »
OK gute Idee, hatte ich bisher auch noch nicht gemacht..!  ;) :D
Intel-NUC i3: FHEM-Server 5.9 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Offline cwagner

  • Sr. Member
  • ****
  • Beiträge: 672
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #4 am: 13 Oktober 2015, 16:56:21 »
Super-Idee so kurz vor dem nächsten Wechsel - zum Beispiel stellen die Wetterdienste die Tagesmenge Regen jeweils um 7:50 Ortszeit im Sommer und 6:50 Ortszeit im Winter fest. Die entsprechende automatische E-Mail kann ich mit Deiner Konstruktion jetzt ohne Änderung meines DOIF (anstelle eines at) umsetzen.

Christian
Raspi 2B+3B: Raspbian 9.11,Perl v5.28.1, FHEM 5.9. 270 Entities in DbLog  für Heizung mit FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HM (CUL), 1-Wire (FT232RL & DS2480B), EnOcean (TCM EPS3), MQTT2. Im Einsatz u.a. DOIF, PID20, Threshold, OWX NewGen; Micropelt IRTV, Volkszähler

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9019
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #5 am: 13 Oktober 2015, 17:54:08 »
Ich wollte statt dst() gerne ein richtiges Reading nutzen können und habe mir dafür dieses DOIF erstellt:


define DST DOIF

(
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);


([02:00] or [03:00]) and
$isdst
)


DOELSEIF
(
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);


([02:00] or [03:00]) and
!$isdst
)





alias      Daylight Time
cmdState   summer|normal
event-on-change-reading state
eventMap   summer:Sommer normal:Normal initialized:---
group      Season Details
icon       time_clock
room       Environment

Es ist schon erstaunlich, was so alles funktioniert - auch für mich. Auf diese Art und Weise lassen sich sogar ganze Perl-Programme in einer DOIF-Bedingung unterbringen :)

Allerdings ist in diesem konkreten Fall  der Aufruf von localtime überflüssig, weil ich es bereits intern in DOIF vor der Auswertung der Bedingung tue. Auch die DOELSEIF-Abfrage ist überflüssig, weil es die Negation des DO-Falls ist.

Daher reicht schon:

define DST DOIF (([02:00] or [03:00]) and $isdst) DOELSE
Gruß

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

Offline cwagner

  • Sr. Member
  • ****
  • Beiträge: 672
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #6 am: 13 Oktober 2015, 21:03:49 »
das ist ja noch geiler! Und damit zähle ich jetzt bei mir 23 DOIF  :) 8)
Raspi 2B+3B: Raspbian 9.11,Perl v5.28.1, FHEM 5.9. 270 Entities in DbLog  für Heizung mit FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HM (CUL), 1-Wire (FT232RL & DS2480B), EnOcean (TCM EPS3), MQTT2. Im Einsatz u.a. DOIF, PID20, Threshold, OWX NewGen; Micropelt IRTV, Volkszähler
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline tik-tak-tok

  • Jr. Member
  • **
  • Beiträge: 97
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #7 am: 29 März 2017, 21:06:02 »
Hallo,

ich habe nun folgendes DOIF angelegt um die Sommerzeit/Winterzeit abzufragen.
define SommerzeitWinterzeit (([02:00] or [03:00]) and $isdst) DOELSE

Nun würde ich gerne, sobald festgestellt wird "Es ist Winterzeit" folgenden set Befehl "set ThermostatProfile send_to_device BadezimmerWinter [BadzimmerHeizung_Clima]" mittels separatem DOIF absenden lassen (einmalig).
Sobald dann irgendwann wieder "Es ist Sommerzeit" festgestellt wird würde ich gerne den Befehl "set ThermostatProfile send_to_device BadezimmerSommer [BadzimmerHeizung_Clima]" absenden lassen.

Wie stelle ich das an? :-)
Vermutlich muss ich, wie bei einem Türkontakt auch, den State des DOIF "SommerzeitWinterzeit" prüfen (lassen).

Wäre hier folgendes möglich?
([SommerzeitWinterzeit] eq "cmd1" (set ThermostatProfile send_to_device BadezimmerWinter [BadzimmerHeizung_Clima]" und alternativ für den Sommer ([SommerzeitWinterzeit] eq "cmd2" (set ThermostatProfile send_to_device BadezimmerSommer [BadzimmerHeizung_Clima] möglich?

Bzw. falls nein, welchen State sollte das DOIF "SommerzeitWinterzeit" denn jeweils liefern?

Muss ich beim DOIF "SommerzeitWinterzeit" irgendwelche Attribute (außer do always) setzen? :-)

Vielen Dank und fhem`ige Grüße :-P

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9019
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #8 am: 29 März 2017, 21:49:19 »
Hallo,

ich habe nun folgendes DOIF angelegt um die Sommerzeit/Winterzeit abzufragen.
define SommerzeitWinterzeit (([02:00] or [03:00]) and $isdst) DOELSE

Nun würde ich gerne, sobald festgestellt wird "Es ist Winterzeit" folgenden set Befehl "set ThermostatProfile send_to_device BadezimmerWinter [BadzimmerHeizung_Clima]" mittels separatem DOIF absenden lassen (einmalig).
Sobald dann irgendwann wieder "Es ist Sommerzeit" festgestellt wird würde ich gerne den Befehl "set ThermostatProfile send_to_device BadezimmerSommer [BadzimmerHeizung_Clima]" absenden lassen.

Wie stelle ich das an? :-)
Vermutlich muss ich, wie bei einem Türkontakt auch, den State des DOIF "SommerzeitWinterzeit" prüfen (lassen).

Wäre hier folgendes möglich?
([SommerzeitWinterzeit] eq "cmd1" (set ThermostatProfile send_to_device BadezimmerWinter [BadzimmerHeizung_Clima]" und alternativ für den Sommer ([SommerzeitWinterzeit] eq "cmd2" (set ThermostatProfile send_to_device BadezimmerSommer [BadzimmerHeizung_Clima] möglich?

Bzw. falls nein, welchen State sollte das DOIF "SommerzeitWinterzeit" denn jeweils liefern?

Muss ich beim DOIF "SommerzeitWinterzeit" irgendwelche Attribute (außer do always) setzen? :-)

Vielen Dank und fhem`ige Grüße :-P

Wenn du das Attribut cmdState summer|normal bei deinem SommerzeitWinterzeit-DOIF setzt, kannst du in jedem anderen Modul den Status von SommerzeitWinterzeit auf summer oder normal prüfen, bei einem DOIF-Modul z. B.

DOIF ([SommerzeitWinterzeit] eq "summer") (set bla on)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline tik-tak-tok

  • Jr. Member
  • **
  • Beiträge: 97
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #9 am: 30 März 2017, 18:39:23 »
Dankeschön!

DOIFs entsprechend geändert :-)

Scheint zu funktionieren.
Wie könnte ich es nun gestalten das nicht mehrfach die Profile übertragen werden?
Ich sag mal, sobald Sommerzeit eingetreten ist und die Profile gesendet wurden...ist das ja schick und OK, aber dann könnte der Befehl ja "pausieren" bis "Winter bzw. normal" eintritt.

Danke & Grüße

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9019
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #10 am: 30 März 2017, 19:35:25 »
Dankeschön!

DOIFs entsprechend geändert :-)

Scheint zu funktionieren.
Wie könnte ich es nun gestalten das nicht mehrfach die Profile übertragen werden?
Ich sag mal, sobald Sommerzeit eingetreten ist und die Profile gesendet wurden...ist das ja schick und OK, aber dann könnte der Befehl ja "pausieren" bis "Winter bzw. normal" eintritt.

Danke & Grüße

ja, es gibt bei dieser Lösung zwei Zeittrigger pro Tag für das SommerzeitWinterzeit-DOIF. Der Zustand ändert sich nicht, d.h. für alle anderen gibt es keine Trigger. Im Vergleich zu tausend anderen Ereignissen, ist dieser Belastung zu vernachlässigen.
 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline tik-tak-tok

  • Jr. Member
  • **
  • Beiträge: 97
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #11 am: 30 März 2017, 20:33:28 »
Danke für deine Antwort! :-)

Okay,...also, da sich der State ja so gesehen nicht ändert bekomme ich mit der 1% Regel beim Senden über mein Homematic Modul diesbezüglich keine Probleme?
Heißt also auch, heute wird "Sommer" erkannt, heute werden die gesetzten Sommer Befehle gesetzt,...und am nä. Tag passiert nichts, da ja zwischenzeitlich der State "Sommer" nicht anders war, richtig gedeutet?

Danke :-)

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9019
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #12 am: 30 März 2017, 20:38:20 »
Danke für deine Antwort! :-)

Okay,...also, da sich der State ja so gesehen nicht ändert bekomme ich mit der 1% Regel beim Senden über mein Homematic Modul diesbezüglich keine Probleme?
Heißt also auch, heute wird "Sommer" erkannt, heute werden die gesetzten Sommer Befehle gesetzt,...und am nä. Tag passiert nichts, da ja zwischenzeitlich der State "Sommer" nicht anders war, richtig gedeutet?

Danke :-)


ja.  Aber selbst, wenn sich der Zustand ändern würde, würde das ja nur um 2:00  und 3:00 Uhr geschehen, da bist du von der 1% Regel ziemlich weit entfernt ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline Xell1984

  • Full Member
  • ***
  • Beiträge: 172
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #13 am: 06 März 2018, 18:47:09 »
Guten Abend,

im Bezug auf das obere habe ich eine Frage:

Da am Tag der Zeitumstellung die Jalousien noch in der alten Zeit liegen (Timer wird ja um Mitternacht gesetzt) möchte ich gern nach der Zeitumstellung die entsprechenden DOIF zurück setzen (Initialiseren) um die Timer neu zu generieren. Jeweils am Tag der Umstellung.

Das oben stehende DOIF mit CmdState Winter|Sommer  funktioniert

Internals:
   CFGFN     
   DEF        (([02:00] or [03:00]) and $isdst) DOELSE
   NAME       SommerzeitWinterzeit
   NR         5808
   NTFY_ORDER 50-SommerzeitWinterzeit
   STATE      Sommer
   TYPE       DOIF
   READINGS:
     2018-03-06 18:26:49   cmd             1
     2018-03-06 18:26:49   cmd_event       set_Sommer_cmd_1
     2018-03-06 18:26:49   cmd_nr          1
     2018-03-06 17:34:06   mode            enabled
     2018-03-06 18:26:49   state           Sommer
     2018-03-06 17:33:18   timer_01_c01    07.03.2018 02:00:00
     2018-03-06 17:33:18   timer_02_c01    07.03.2018 03:00:00
   Regex:
   condition:
     0          (DOIF_time_once($hash,0,$wday) or DOIF_time_once($hash,1,$wday)) and $isdst
   days:
   devices:
   do:
     0:
       0         
     1:
       0         
   helper:
     DOIF_Readings_events
     DOIF_eventas
     globalinit 1
     last_timer 2
     sleeptimer -1
   itimer:
   localtime:
     0          1520384400
     1          1520388000
   realtime:
     0          02:00:00
     1          03:00:00
   time:
     0          02:00:00
     1          03:00:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1520384400:
       localtime  1520384400
       hash:
     1520388000:
       localtime  1520388000
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   Sommer|Winter

Aber wie sollte das DOIF aussehen für die Neu Initialisierung der Timer? Würde das so funktionieren und Sinn machen? Geht es besser? Ich hab zum Testen mal einen Dummy angelegt.

Internals:
   CFGFN     
   DEF        ([SommerzeitWinterzeit] eq "Winter") (set SommerWinter.Dummy Winter )
DOELSEIF
([SommerzeitWinterzeit] eq "Sommer") (set SommerWinter.Dummy Sommer )

   NAME       WinterSommer_Initialisierung
   NR         7421
   NTFY_ORDER 50-WinterSommer_Initialisierung
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-03-06 18:44:44   Device          SommerzeitWinterzeit
     2018-03-06 18:44:44   cmd             2
     2018-03-06 18:44:44   cmd_event       SommerzeitWinterzeit
     2018-03-06 18:44:44   cmd_nr          2
     2018-03-06 18:44:44   e_SommerzeitWinterzeit_STATE Sommer
     2018-03-06 18:43:48   mode            enabled
     2018-03-06 18:44:44   state           cmd_2
   Regex:
   condition:
     0          InternalDoIf($hash,'SommerzeitWinterzeit','STATE') eq "Winter"
     1          InternalDoIf($hash,'SommerzeitWinterzeit','STATE') eq "Sommer"
   devices:
     0           SommerzeitWinterzeit
     1           SommerzeitWinterzeit
     all         SommerzeitWinterzeit
   do:
     0:
       0          set SommerWinter.Dummy Winter
     1:
       0          set SommerWinter.Dummy Sommer
     2:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      cmd_nr: 1,cmd: 1,cmd_event: set_Sommer_cmd_1,Sommer
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   SommerzeitWinterzeit
     timerevent cmd_nr: 1,cmd: 1,cmd_event: set_Sommer_cmd_1,Sommer
     triggerDev SommerzeitWinterzeit
     timerevents:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_Sommer_cmd_1
       Sommer
     timereventsState:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_Sommer_cmd_1
       state: Sommer
     triggerEvents:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_Sommer_cmd_1
       Sommer
     triggerEventsState:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_Sommer_cmd_1
       state: Sommer
   internals:
     0           SommerzeitWinterzeit:STATE
     1           SommerzeitWinterzeit:STATE
     all         SommerzeitWinterzeit:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:

Vielen Dank für den Input.
Razpberry on Raspberry Pi 3 mit Raspian Jessy

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 9019
Antw:Sommerzeit/Normalzeit als DOIF Objekt
« Antwort #14 am: 06 März 2018, 19:25:24 »
Ich denke, den Aufwand kannst du dir sparen. Ich habe die Zeitumstellung im Modul berücksichtigt ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF