[Gelöst] DOIF und HM-RC-8 (8-Tasten FB). Kein Trigger auf Tastendruck

Begonnen von bmwfan, 21 März 2021, 20:11:22

Vorheriges Thema - Nächstes Thema

bmwfan

Hallo,
ich komme leider mit dem DOIF nicht weiter. Über einen kurzen Tastendruck an der FB möchte ich einen Shelly RGBW und den LED-Streifen dahinter ein-/ausschalten. Seltsamerweise triggert immer nur cmd1, auch wenn die Beleuchtung an ist. Denn Grund kann ich mir nicht erklären, da ich ja explizit den Status des Shelly abfrage. Ich habe auch schon die Reihenfolge der Abfragen im cmd geändert, aber keine Auswirkung.

di_Tageslicht:SunDownTimeKor ist ein DOIF, mit dem ich den Sonnenuntergang (horizon-3) bestimme und über ein User-Reading die Zeit in HH:MM ermittele und davon 30 min. abziehe. Grund: Bei Sonnenuntergang ist es im WZ schon zu dunkel und die Raumbeleuchtung muss vorher angehen.

Internals:
   DEF        ([di_Tageslicht:SunDownTimeKor] or ([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "off")) (set MQTT2_shellyrgbw2_01083F on)
DOELSEIF (([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "on") or [22:30]) (set MQTT2_shellyrgbw2_01083F off)
   FUUID      603ba6b2-f33f-6b6f-32a8-eb1d693a1f0ad3e2
   MODEL      FHEM
   NAME       di_Licht_WZ_Schrank_Oben
   NOTIFYDEV  FB_8_Btn_05,global,di_Tageslicht
   NR         1831
   NTFY_ORDER 50-di_Licht_WZ_Schrank_Oben
   STATE      An
   TYPE       DOIF
   VERSION    24020 2021-03-20 09:46:38
   READINGS:
     2021-03-21 19:57:50   Device          FB_8_Btn_05
     2021-03-21 19:57:50   cmd             1
     2021-03-21 19:57:50   cmd_event       FB_8_Btn_05
     2021-03-21 19:57:50   cmd_nr          1
     2021-03-21 19:57:50   e_FB_8_Btn_05_STATE Short 1_52 (to HM_572922)
     2021-03-21 19:57:24   mode            enabled
     2021-03-21 19:57:50   state           An
     2021-03-21 19:57:24   timer_01_c02    21.03.2021 22:30:00
   Regex:
     accu:
     cond:
       FB_8_Btn_05:
         0:
           &STATE     ^FB_8_Btn_05$
         1:
           &STATE     ^FB_8_Btn_05$
       di_Tageslicht:
         0:
           SunDownTimeKor ^di_Tageslicht$:^SunDownTimeKor:
   attr:
     cmdState:
       0:
         An
       1:
          Aus
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'di_Tageslicht','SunDownTimeKor') or (::InternalDoIf($hash,'FB_8_Btn_05','STATE') =~ "Short" and ::InternalDoIf($hash,'MQTT2_shellyrgbw2_01083F','STATE') eq "off")
     1          (::InternalDoIf($hash,'FB_8_Btn_05','STATE') =~ "Short" and ::InternalDoIf($hash,'MQTT2_shellyrgbw2_01083F','STATE') eq "on") or ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set MQTT2_shellyrgbw2_01083F on
     1:
       0          set MQTT2_shellyrgbw2_01083F off
     2:
   helper:
     DEVFILTER  ^global$|^FB_8_Btn_05$|^di_Tageslicht$
     NOTIFYDEV  global|FB_8_Btn_05|di_Tageslicht
     event      Short 1_52 (to HM_572922),trigger: Short_52,triggerTo_HM_572922: Short_52,trigger_cnt: 52
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   FB_8_Btn_05
     timerevent Short 1_52 (to HM_572922),trigger: Short_52,triggerTo_HM_572922: Short_52,trigger_cnt: 52
     triggerDev FB_8_Btn_05
     timerevents:
       Short 1_52 (to HM_572922)
       trigger: Short_52
       triggerTo_HM_572922: Short_52
       trigger_cnt: 52
     timereventsState:
       state: Short 1_52 (to HM_572922)
       trigger: Short_52
       triggerTo_HM_572922: Short_52
       trigger_cnt: 52
     triggerEvents:
       Short 1_52 (to HM_572922)
       trigger: Short_52
       triggerTo_HM_572922: Short_52
       trigger_cnt: 52
     triggerEventsState:
       state: Short 1_52 (to HM_572922)
       trigger: Short_52
       triggerTo_HM_572922: Short_52
       trigger_cnt: 52
   internals:
     all         FB_8_Btn_05:STATE MQTT2_shellyrgbw2_01083F:STATE
   intervalfunc:
   localtime:
     0          1616362200
   readings:
     all         di_Tageslicht:SunDownTimeKor
   realtime:
     0          22:30:00
   time:
     0          22:30:00
   timeCond:
     0          1
   timer:
     0          0
   timers:
     1           0
   trigger:
   triggertime:
     1616362200:
       localtime  1616362200
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   An | Aus
   comment    Versuch über Reading Tageslicht (ist Zeit) zu triggern.
   do         always
   room       1.1_Wohnzimmer,9.8.1_DOIF


Hat jemand eine Idee, woran das liegen kann.

Gruß
Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

bmwfan

Noch ein weiteres Problem ist aufgetreten.
Meine Idee, anhand des Readings "di_Tageslicht:SunDownTimeKor", in dem die Zeit steht zu dem das Licht angehen soll, ein Event zu generieren und das Licht anzuschalten geht nicht. Morgens um 06:01 frage ich die Zeit des Sonnenunterganges des Tages ab und errechne daraus das Reading "di_Tageslicht:SunDownTimeKor". Genau zu dem Zeitpunkt triggert dieses DOIF, da die Änderung des Wertes "di_Tageslicht:SunDownTimeKor" ein Event generiert.

Internals:
   DEF        ([{sunrise("HORIZON=-4")}]) (set du_Tageslicht hell)
DOELSEIF ([{sunset("HORIZON=-3")}]) (set du_Tageslicht dunkel)
   FUUID      5c4c3931-f33f-6b6f-479e-df5724a54a7d2405
   MODEL      FHEM
   NAME       di_Tageslicht
   NOTIFYDEV  global
   NR         1327
   NTFY_ORDER 50-di_Tageslicht
   STATE      hell
   TYPE       DOIF
   VERSION    24020 2021-03-20 09:46:38
   READINGS:
     2021-03-22 06:01:03   Sonnenaufgang   06:01
     2021-03-22 06:01:03   Sonnenuntergang 18:47
     2021-03-22 06:01:03   SunDownTimeKor  18:17
     2021-03-21 14:31:41   SundownTime     14:28
     2021-03-22 06:01:03   cmd             1
     2021-03-22 06:01:03   cmd_event       timer_1
     2021-03-22 06:01:03   cmd_nr          1
     2021-03-21 14:28:32   mode            enabled
     2021-03-22 06:01:03   state           hell
     2021-03-22 06:01:03   timer_01_c01    23.03.2021 05:58:59
     2021-03-21 18:47:01   timer_02_c02    22.03.2021 18:48:30
   Regex:
     accu:
   attr:
     cmdState:
       0:
         hell
       1:
          dunkel
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
     1          ::DOIF_time_once($hash,1,$wday)
   days:
   do:
     0:
       0          set du_Tageslicht hell
     1:
       0          set du_Tageslicht dunkel
     2:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1616475539
     1          1616435310
   perlblock:
   realtime:
     0          05:58:59
     1          18:48:30
   time:
     0          {sunrise("HORIZON=-4")}
     1          {sunset("HORIZON=-3")}
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1616435310:
       localtime  1616435310
       hash:
     1616475539:
       localtime  1616475539
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   hell | dunkel
   comment    SunDownTimeKor: Sonnenuntergang minus 30 Minuten.
$4 ergibt Fehlermeldung beim booten. Uninitialiced value???

Bisheriger Code:
Sonnenaufgang {(split " ",(ReadingsVal($name, "timer_01_c01", "")))[1]},
Sonnenuntergang {(split " ",(ReadingsVal($name, "timer_02_c02", "")))[1]},
   do         always
   initialize hell
   room       9.8.1_DOIF
   userReadings Sonnenaufgang {ReadingsTimestamp($name,"timer_01_c01","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "$4";},
Sonnenuntergang {ReadingsTimestamp($name,"timer_02_c02","") =~ /^(\d+)-(\d+)-(\d+)\s(\d+:\d+):(\d+)$/;
  return "$4";},
SunDownTimeKor  {POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name,"timer_02_c02","2000-01-01 00:00:00"))-30*60))},


Wie muss ich dieses Reading abfragen, damit die darin stehende Zeit als Triggerereignis genommen wird. Ich dachte es geht wie eine übliche Zeitabfrage im DOIF wie z.B.: [20:00]

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Otto123

#2
Moin Jürgen,

schau mal in die Doku und dort unter indirekte Zeitangaben und Events.
https://commandref.fhem.de/commandref_DE.html#DOIF_Indirekten_Zeitangaben
https://commandref.fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
[di_Tageslicht:SunDownTimeKor] -> [[di_Tageslicht:SunDownTimeKor]]

Allerdings ist das was Du da im Userreading verhackstückst auch direkt in der Funktion sunrise_el vorhanden. Siehe Offset:
https://commandref.fhem.de/commandref_DE.html#SUNRISE_EL

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rabehd

Hallo Jürgen,

beschreibe doch einfach mal was Du eigentlich tun willst?
Du willst einen Shelly schalten zu einer errechneten Zeit und per Tastendruck an der FB?
Es ist oft übersichtlicher, wenn Du das in separtaten Zweigen machst, zumindest bis es funktioniert.
"di_Tageslicht" kannst Du Dir sparen, das
Zitatich den Sonnenuntergang (horizon-3) bestimme und über ein User-Reading die Zeit in HH:MM ermittele und davon 30 min. abziehe.
geht im DOIF selbst gut.
DOELSEIF ([{sunset_abs("REAL", 600, "15:30","20:45")}]) (set FS7 on) nur mal als Beispiel.
Auch funktionierende Lösungen kann man hinterfragen.

bmwfan

Morgen Otto,
auf das Thema mit den doppelten eckigen Klammern bei der indirekten Zeitangabe bin ich heute Morgen auch gestossen und habe es eingefügt. Das löst hoffentlich das Problem, dass durch die Änderung des Wertes und nicht durch die hinterlegte Zeit getriggert wird. Wird sich heute Abend zeigen.

Offset in sunriese_el: Kenne ich, dachte aber es ist programmtechnisch besser, direkt beim ermitteln der Sonnenauf- und untergangszeit über ein Userreading meine Sollzeit zu errechnen anstatt in einem weiteren DOIF noch einmal die Funktion aufzurufen und dort die Sollzeit zu errechnen.

Auswertung von Events: Da muss ich gestehen, dass ich an meine Grenzen des Verständnisses komme da sich mir der Unterschied nicht erschließt. Auch in der Teilausdrucksabfrage wird doch nach dem Wort "Short" gesucht und wenn es gefunden wird, sollte die Bedingung wahr werden. Wird sie aber nicht und deswegen wird die Bedingung nicht wahr. Kann es daran liegen, dass der String "Short" immer darin vorkommt und nur ein Index hochgezählt wird, wenn die FB betätigt wird?
Ich versuche mal die Version mit Eventauswertung, auch wenn ich den Unterschied nicht verstehe.

Gruß Jürgen



Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

bmwfan

@rabehd:
Genau. Shelly per Taste der FB und nach einer vom Sonnenuntergang abhängigen Zeit.

di_Tageslicht brauche ich an vielen Stellen im Programm (Jalousiensteuerung, Lichtsteuerung...).

Zum Start in separaten Zweigen ist eine gute Idee. Ich versuche immer alles gleich "perfekt" zu machen und dann wird es halt manchmal zu kompliziert.

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

bmwfan

Erste Erfolgsmeldung!
Nach Umstellung auf
([[di_Tageslicht:SunDownTimeKor]] and [?MQTT2_shellyrgbw2_01083F] eq "off") (set MQTT2_shellyrgbw2_01083F on)
DOELSEIF ([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "off") (set MQTT2_shellyrgbw2_01083F on)
DOELSEIF (([FB_8_Btn_05] =~ "Short" and [?MQTT2_shellyrgbw2_01083F] eq "on") or [22:30]) (set MQTT2_shellyrgbw2_01083F off)


gehen Zweig 2 und 3, Schalten mit der FB. Zweig 1 wird sich heute Abend zeigen.

Danke schon mal für die Hilfe.
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Otto123

ZitatOffset in sunriese_el: Kenne ich, dachte aber es ist programmtechnisch besser, direkt beim ermitteln der Sonnenauf- und untergangszeit über ein Userreading meine Sollzeit zu errechnen anstatt in einem weiteren DOIF noch einmal die Funktion aufzurufen und dort die Sollzeit zu errechnen.
Das meinte ich auch nicht. Ich meine, wenn Du die Temperatur in deinem Keller in die Berechnung Deines persönlichen Sonnenaufganges mit einfließen lassen musst ist das ok, aber einfach nur eine Zeitverschiebung? Da muss Du die Daten nicht rumschubsen, die Funktion macht das doch direkt!?
[{sunrise("HORIZON=-4",-30*60)}]
Das mit den Events oder Abfrage ist am Ende egal, nur ist die direkte Auswertung des Events effizienter.

Noch ein Hinweis wegen der Auswertung von Short: Die eine Hälfte der Menschheit kommt damit mEn nicht klar. Sie will drücken bis was passiert. Du solltest also auch long auswerten!

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

bmwfan

@Otto
Den tatsächlichen Sonnenuntergang brauche ich in 95% der Fälle. Nur für wenige Lichter, die ich früher einschalten will, benötige ich eine andere Zeit. Dachte, dass es über ein Userreading am Einfachsten wäre.

Mit LONG wollte ich später eine Dimmfunktion einbauen. Soweit bin ich aber noch nicht, deswegen ist es einstweilen sicher besser, auch Long abzufragen.

Ich bekomme manchmal auch einen Zustand "LongRelease", wenn ich lange auf der Taste bleibe und sie dann loslasse. Weist Du, für was das gedacht ist?
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Otto123

Na genau dafür: das Ende von Long - Du weisst damit das es zu Ende ist. ;)

Das mit dem Sonnuntergang verstehe ich immer noch nicht. Wenn Du Tag Nacht brauchst ist isday() am Einfachsten. Ansonsten nimmts Du  {sunrise("HORIZON=-4")} direkt oder eben mit Korrektur. Aber man braucht doch diesen Wert nicht immer extra abzulegen? Aber wenn Du das so willst - mach es gerne. :) Ob es so oder so einfacher oder logischer ist - liegt immer im Auge des Betrachters :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

bmwfan

Erschließt sich mir nicht, wofür man das Ende vom Long (Tastendruck) benötigt, aber wenn das so vorgesehen ist.  ;)

Vermutlich hätte ich anstatt meinem dummy du_tageslicht mit Status hell/dunkel, der von di_Tageslicht einmal am Tag gesetzt wird, auch immer isday() im Programm abfragen können. Bin ich in der Anfangszeit von FHEM gar nicht daraufgekommen. Jetzt habe ich das zig-fach in den Abfragen drinnen und will es nicht mehr ändern.
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Otto123

Zitat von: bmwfan am 22 März 2021, 10:40:14
Erschließt sich mir nicht, wofür man das Ende vom Long (Tastendruck) benötigt, aber wenn das so vorgesehen ist.  ;)
Wäre eine einfache Abfrage, dass jemand lange gedrückt hat - egal wie lange. Du denkst nur an Deinen Dimmer :) und willst das bei long was passiert
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz