Hauptmenü

Lauflicht mit FHEM

Begonnen von Dracolein, 02 September 2020, 08:47:09

Vorheriges Thema - Nächstes Thema

Damian

#15
So würde eine "programmierte" Lösung aussehen:

defmod lauflicht DOIF subs \
{\
  @{$_a}=qw/lamp1 lamp2 lamp3/;;   # Liste mit Lampen\
  $_max_repeat=5;;                 # Maximale Anzahl der Durchläufe\
  $_delay=0.5;;                    # Verzögerung\
  \
  @{$_state}=();;                  # Liste für Status der Lampen\
  $_counter=0;;                    # Zähler wird auf den ersten Wert gesetzt\
  $_repeat=0;;                     # Nummer der Durchlaufs\
  \
  sub lauflicht {    # Funktion zum Schalten der Lampen\
        if ($_repeat == $_max_repeat) {       # Wenn maximale Anzahl der Wiederholungen erreicht\
  set_states();;                       # Status der Lampen wiederherstellen\
  return;;                             # Ende\
}\
if ($_counter == @{$_a}) {            # letzte Lampe erreicht\
  fhem_set ($_a[@{$_a}-1]." off");;\
  $_counter=0;;\
  $_repeat++;;\
}\
fhem_set ($_a[$_counter]." on");;\
fhem_set ($_a[$_counter-1]." off") if ($_counter > 0) ;;\
$_counter++;;\
set_Exec("Timer",$_delay,'lauflicht');;  # Timer für den nächsten Schaltvorgang setzen\
  }\
  \
  sub save_states { \
   for ($i=0;;$i<@{$_a};;$i++) {$_state[$i]=ReadingsVal($_a[$i],"state","")};;  # Status der Lampen sichern\
   for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] off")};;                     # alle Lampen ausschalten\
  }\
  \
  sub set_states { # Status der Lampen wiederherstellen\
    for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] $_state[$i]")};;\
    $_counter=0;;\
    $_repeat=0;;\
  }\
}\
\
{## ["Taster:on"];;       # Aktion zum Staten des Lauflichts \
  save_states();;  # Merke Status der Lampen\
  lauflicht();;    # Lauflicht starten\
}\
\
{## ["Taster:off"];;     # Aktion zum Beenden des Lauflichts\
  del_Exec("Timer");; # Timer löschen\
  set_states();;      # Status der Lampen wiederherstellen\
}
attr lauflicht room DOIF_Labor


Die Angaben zu Lampen, Anzahl der Durchläufe und die Verzögerung werden am Anfang definiert. Die Aktion zum Starten oder vorzeitigen Beenden wird am Ende im jeweiligen Block definiert (Taster:on/off).

Testen kann man es mit Dummys lamp1, lamp2, lamp3. Starten des Lauflichts mit set lauflicht block_01, vorzeitiges Beenden mit set lauflicht block_02.

Die Lampen werden immer auf ihren ursprünglichen Zustand zurückgesetzt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Dracolein

Hallo, ich nochmal.

Inzwischen habe ich unsere 20 jahre alte Haustürklingel ganz simpel per 12VAC Relais und einem batteriebetriebenen Zigbee Türkontakt in FHEM integriert.
Kleines Problem: Beim Auslösen der Klingel werden kurzzeitig ganz viele Statusänderungen des Zigbee-Devices an FHEM übertragen, weil die Spule natürlich flickert.

Jetzt bin ich am überlegen, wie ich mein Lauflicht mit dem Klingelsignal kombinieren kann unter Verwendung des hier gebastelten DOIFs. Mein Problem: Sobald die Bedingung des DOIF-Befehls erlischt, bricht natürlich auch meine Lauflicht-Ablaufkette mittendrin ab, sodass manchmal eine Birne nicht abschaltet.
Jetzt könnte ich irgendwie versuchen, die Bedingung mit einem Timer zu kombinieren und die Zeit per trial&error genau abzupassen, sodass alle Birnen noch abgeschaltet werden; aber gibt es nicht eine elegantere Lösung?

Ideal wäre eine Ablaufkette / Schrittkette, die sich per Trigger einschaltet und durchläuft.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Damian

Zitat von: Dracolein am 15 September 2020, 18:33:51
Hallo, ich nochmal.

Inzwischen habe ich unsere 20 jahre alte Haustürklingel ganz simpel per 12VAC Relais und einem batteriebetriebenen Zigbee Türkontakt in FHEM integriert.
Kleines Problem: Beim Auslösen der Klingel werden kurzzeitig ganz viele Statusänderungen des Zigbee-Devices an FHEM übertragen, weil die Spule natürlich flickert.

Jetzt bin ich am überlegen, wie ich mein Lauflicht mit dem Klingelsignal kombinieren kann unter Verwendung des hier gebastelten DOIFs. Mein Problem: Sobald die Bedingung des DOIF-Befehls erlischt, bricht natürlich auch meine Lauflicht-Ablaufkette mittendrin ab, sodass manchmal eine Birne nicht abschaltet.
Jetzt könnte ich irgendwie versuchen, die Bedingung mit einem Timer zu kombinieren und die Zeit per trial&error genau abzupassen, sodass alle Birnen noch abgeschaltet werden; aber gibt es nicht eine elegantere Lösung?

Ideal wäre eine Ablaufkette / Schrittkette, die sich per Trigger einschaltet und durchläuft.

In meiner Lösung wird der ursprünglicher Zustand der Lampen wiederhergestellt, wenn die Bedingung (Taster:off) erlischt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

KyleK

ZitatInzwischen habe ich unsere 20 jahre alte Haustürklingel ganz simpel per 12VAC Relais und einem batteriebetriebenen Zigbee Türkontakt in FHEM integriert.

Off-Topic, aber kannst  du das etwas näher erläutern? Überlege schon lange wie ich meine bestehende Klingel smart machen kann.
FHEM on Futro S940
CUL868
7x MAX! Thermostat, 8x MAX! Fensterkontakte
Conbee II + deConz, TradFri Lampen, Osram Smart+ Steckdosen

MadMax-FHEM

#19
Zitat von: KyleK am 15 September 2020, 22:53:04
Off-Topic, aber kannst  du das etwas näher erläutern? Überlege schon lange wie ich meine bestehende Klingel smart machen kann.

Bzgl. Klingel smart machen sollte im Forum einiges zu finden sein -> schon mal gesucht!!?

Es kommt auch drauf an: welche Art von Klingel/Türsprcher etc. du hast...

Welche Systeme du schon laufen hast...

Hier denke ich: Relais "in" den Klingelkreis, Klingel wird gedrückt und klingelt -> Relais "schnappt zu" -> Zigbee-Sensor "erkennt" (wie Fensterkontakt) das und gibt das weiter...

Ich habe einen Homematic-Schalter-Sensor per "Gleichrichter" und Optokoppler (statt Relais) hängen...

Es gibt von Homematic auch direkt einen Klingelsensor, der kann "einfach so" in den Klingelkreis "gebaut" werden (hatte ich auch, hat aber vom Platz her nicht in meinen Türsprecher gepasst, daher andere Lösung)

Und wenn du z.B. einen Türsprecher mit "Bussystem" hast, dann musst du eben schauen.
Für z.B. Siedle gibt es wohl auch dafür Lösungen...

Ansonsten, da ja komplett off-topic: neuen Thread aufmachen... Dann verm. den 1000 und ersten ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Dracolein

Zitat von: MadMax-FHEM am 16 September 2020, 00:42:05

Hier denke ich: Relais "in" den Klingelkreis, Klingel wird gedrückt und klingelt -> Relais "schnappt zu" -> Zigbee-Sensor "erkennt" (wie Fensterkontakt) das und gibt das weiter...

Exakt, die Idee stammt auch weniger von mir, sondern mehr von Google.

Meine Klingel basiert auf 8-10VAC, wenn geklingelt wird, zieht eine Spule an und betätigt per Schieber die Klangmetalle.
Eigentlich wollte ich den Zigbee Türkontakt direkt an die Spule drankleben, mit der Absicht, dass der verbaute Reedkontakt von der besagten Spule magnetisch betätigt wird. Klappte leider nicht zuverlässig, also habe ich parallel zur Klingel das genannte Relais verbaut, dessen Spule von den 8-10VAC betätigt wird und dann einen Wechsler aktiviert, der den Reedkontakt des Zigbee Sesors schließt. Fertig. Zumindest auf der Hardwareseite.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

Ich hätte noch ein weiteres Problem, was ich nicht verstehe.

Inzwischen habe ich ein Notify gebastelt
define notify_Haustuerklingel notify Haustuerklingel:closed set dummy_Haustuerklingel on
was einen Dummy schaltet, sobald der Sensor das Klingelsignal bemerkt.

Der Dummy wiederum dient als Bedingung meines in diesem Thread gezeigten DOIFs. Sobald Dummy=on, startet das Doif seine Ablaufkette.
Nun dachte ich mir, jung und naiv wie ich bin, setze ich zum Schluss der Ablaufkette noch den Befehl dran
set dummy_Haustuerklingel off

Das klappt augenscheinlich auch. Die Ablaufkette läuft durch und zum Schluss wird der Dummy auf off gesetzt, ABER: das Doif lässt sich danach kein zweites Mal starten. Erst wenn ich im Webfrontend das Dummy per Mausklick "Off" betätige dann kann man die Ablaufkette ganz normal erneut einmalig starten.
Frage: wo liegt der Fehler?
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

slor

do = always hast du gesetzt?

slor

Super cooles Beispliel!
Bekommt man da noch mehr Knight Rider rein? also nicht "im Kreis" blinken, sondern lauflicht von links nach rechts und dann wieder von rechts nach links etc?

Zitat von: Damian am 05 September 2020, 13:19:57
So würde eine "programmierte" Lösung aussehen:

defmod lauflicht DOIF subs \
{\
  @{$_a}=qw/lamp1 lamp2 lamp3/;;   # Liste mit Lampen\
  $_max_repeat=5;;                 # Maximale Anzahl der Durchläufe\
  $_delay=0.5;;                    # Verzögerung\
  \
  @{$_state}=();;                  # Liste für Status der Lampen\
  $_counter=0;;                    # Zähler wird auf den ersten Wert gesetzt\
  $_repeat=0;;                     # Nummer der Durchlaufs\
  \
  sub lauflicht {    # Funktion zum Schalten der Lampen\
        if ($_repeat == $_max_repeat) {       # Wenn maximale Anzahl der Wiederholungen erreicht\
  set_states();;                       # Status der Lampen wiederherstellen\
  return;;                             # Ende\
}\
if ($_counter == @{$_a}) {            # letzte Lampe erreicht\
  fhem_set ($_a[@{$_a}-1]." off");;\
  $_counter=0;;\
  $_repeat++;;\
}\
fhem_set ($_a[$_counter]." on");;\
fhem_set ($_a[$_counter-1]." off") if ($_counter > 0) ;;\
$_counter++;;\
set_Exec("Timer",$_delay,'lauflicht');;  # Timer für den nächsten Schaltvorgang setzen\
  }\
  \
  sub save_states { \
   for ($i=0;;$i<@{$_a};;$i++) {$_state[$i]=ReadingsVal($_a[$i],"state","")};;  # Status der Lampen sichern\
   for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] off")};;                     # alle Lampen ausschalten\
  }\
  \
  sub set_states { # Status der Lampen wiederherstellen\
    for ($i=0;;$i<@{$_a};;$i++) {fhem_set ("$_a[$i] $_state[$i]")};;\
    $_counter=0;;\
    $_repeat=0;;\
  }\
}\
\
{## ["Taster:on"];;       # Aktion zum Staten des Lauflichts \
  save_states();;  # Merke Status der Lampen\
  lauflicht();;    # Lauflicht starten\
}\
\
{## ["Taster:off"];;     # Aktion zum Beenden des Lauflichts\
  del_Exec("Timer");; # Timer löschen\
  set_states();;      # Status der Lampen wiederherstellen\
}
attr lauflicht room DOIF_Labor


Die Angaben zu Lampen, Anzahl der Durchläufe und die Verzögerung werden am Anfang definiert. Die Aktion zum Starten oder vorzeitigen Beenden wird am Ende im jeweiligen Block definiert (Taster:on/off).

Testen kann man es mit Dummys lamp1, lamp2, lamp3. Starten des Lauflichts mit set lauflicht block_01, vorzeitiges Beenden mit set lauflicht block_02.

Die Lampen werden immer auf ihren ursprünglichen Zustand zurückgesetzt.

Damian

Zitat von: slor am 16 September 2020, 13:04:39
Super cooles Beispliel!
Bekommt man da noch mehr Knight Rider rein? also nicht "im Kreis" blinken, sondern lauflicht von links nach rechts und dann wieder von rechts nach links etc?

Das ist dir überlassen ;)

Da es fast ausschließlich Perl ist, kannst du alles programmieren, was du willst ;)

Vorausgesetzt man kann etwas Perl und versteht, was da passiert.

Zu der im Mittelpunkt stehenden Funktion set_Exec findet man hier die Doku: https://fhem.de/commandref_DE.html#DOIF_set_Exec

Sie wird demnächst etwas aufgebohrt und kann dann mit Wiederholungen umgehen, siehe: https://forum.fhem.de/index.php/topic,114252.0.html



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

Dracolein

Zitat von: slor am 16 September 2020, 13:01:42
do = always hast du gesetzt?
Nein das hatte ich nicht, mit Deinem Tip funktioniert es, danke. Den Rest muss ich heute abend vor Ort ausprobieren.
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;

Dracolein

Ich setze zum Abschluss deses Projekts nochmal mein aktuelles DOIF rein, falls andere Anfänger dies benötigen.
Im Prinzip habe ich auf simpelstem Niveau - aber funktionell - nun auch die Zustände jeder Birne vor Beginn der Lichtsequenz zwischengespeichert und nach Abschluss selbiger überschreibe ich die Readings wieder mit dem alten Wert. Sollte es z.B. eines winterlichen Abends klingeln und die Leuchten sind auf 25% gedimmt, aktiviert sich die Lauflichtsequenz und setzt die 25% Dimmung zum Abschluss wieder ein, sodass niemand im dunkeln sitzen bleibt.
Danken allen Helfern, das klappt bisher zuverlässig und gut.


Internals:
   DEF        ([dummy_Haustuerklingel:state] eq "on") (setreading HUEDevice5 pct_backup [HUEDevice5:pct]) (setreading HUEDevice6 pct_backup [HUEDevice5:pct]) (setreading HUEDevice7 pct_backup [HUEDevice5:pct]) (setreading HUEDevice8 pct_backup [HUEDevice5:pct]) (set HUEDevice5 pct 100) (set HUEDevice6 pct 100) (set HUEDevice7 pct 100, set HUEDevice5 off) (set HUEDevice8 pct 100, set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off) (set HUEDevice5 pct 100) (set HUEDevice6 pct 100) (set HUEDevice7 pct 100, set HUEDevice5 off) (set HUEDevice8 pct 100, set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off) (set HUEDevice5 pct 100) (set HUEDevice6 pct 100) (set HUEDevice7 pct 100, set HUEDevice5 off) (set HUEDevice8 pct 100, set HUEDevice6 off) (set HUEDevice7 off) (set HUEDevice8 off) (set dummy_Haustuerklingel off) (set HUEDevice5 pct [HUEDevice5:pct_backup]) (set HUEDevice6 pct [HUEDevice6:pct_backup]) (set HUEDevice7 pct [HUEDevice7:pct_backup]) (set HUEDevice8 pct [HUEDevice8:pct_backup])
   FUUID      5f61b6f0-f33f-4dec-c606-5dcdf20d2d0171d6
   MODEL      FHEM
   NAME       doif_Lauflicht_Klingel
   NOTIFYDEV  global,dummy_Haustuerklingel
   NR         123
   NTFY_ORDER 50-doif_Lauflicht_Klingel
   STATE      cmd_1
   TYPE       DOIF
   VERSION    22030 2020-05-25 14:10:16
   READINGS:
     2020-09-20 19:04:48   Device          dummy_Haustuerklingel
     2020-09-20 19:04:55   cmd             1.27
     2020-09-20 19:04:55   cmd_event       dummy_Haustuerklingel
     2020-09-20 19:04:55   cmd_nr          1
     2020-09-20 19:04:55   cmd_seqnr       27
     2020-09-20 19:04:48   e_dummy_Haustuerklingel_state on
     2020-09-18 13:56:31   mode            enabled
     2020-09-20 19:04:55   state           cmd_1
     2020-09-20 19:04:55   wait_timer      no timer
   Regex:
     accu:
     cond:
       dummy_Haustuerklingel:
         0:
           state      ^dummy_Haustuerklingel$:^state:
   attr:
     cmdState:
     wait:
       0:
         0
         0
         0
         0
         0
         0.4
         0.4
         0.4
         0.4
         0.4
         0
         0.4
         0.4
         0.4
         0.4
         0.4
         0
         0.4
         0.4
         0.4
         0.4
         0.4
         0.4
         0
         0
         0
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'dummy_Haustuerklingel','state') eq "on"
   do:
     0:
       0          setreading HUEDevice5 pct_backup [HUEDevice5:pct]
       1          setreading HUEDevice6 pct_backup [HUEDevice5:pct]
       10         set HUEDevice5 pct 100
       11         set HUEDevice6 pct 100
       12         set HUEDevice7 pct 100, set HUEDevice5 off
       13         set HUEDevice8 pct 100, set HUEDevice6 off
       14         set HUEDevice7 off
       15         set HUEDevice8 off
       16         set HUEDevice5 pct 100
       17         set HUEDevice6 pct 100
       18         set HUEDevice7 pct 100, set HUEDevice5 off
       19         set HUEDevice8 pct 100, set HUEDevice6 off
       2          setreading HUEDevice7 pct_backup [HUEDevice5:pct]
       20         set HUEDevice7 off
       21         set HUEDevice8 off
       22         set dummy_Haustuerklingel off
       23         set HUEDevice5 pct [HUEDevice5:pct_backup]
       24         set HUEDevice6 pct [HUEDevice6:pct_backup]
       25         set HUEDevice7 pct [HUEDevice7:pct_backup]
       26         set HUEDevice8 pct [HUEDevice8:pct_backup]
       3          setreading HUEDevice8 pct_backup [HUEDevice5:pct]
       4          set HUEDevice5 pct 100
       5          set HUEDevice6 pct 100
       6          set HUEDevice7 pct 100, set HUEDevice5 off
       7          set HUEDevice8 pct 100, set HUEDevice6 off
       8          set HUEDevice7 off
       9          set HUEDevice8 off
     1:
   helper:
     DEVFILTER  ^global$|^dummy_Haustuerklingel$
     NOTIFYDEV  global|dummy_Haustuerklingel
     event      on
     globalinit 1
     last_timer 0
     sleepdevice dummy_Haustuerklingel
     sleepsubtimer -1
     sleeptimer -1
     timerdev   dummy_Haustuerklingel
     timerevent on
     triggerDev dummy_Haustuerklingel
     DOIF_eventa:
       cmd_nr: 1
       cmd_seqnr: 27
       cmd_event: dummy_Haustuerklingel
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 27
       cmd_event: dummy_Haustuerklingel
       state: cmd_1
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
   perlblock:
   readings:
     all         dummy_Haustuerklingel:state
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Befehle
   wait       0,0,0,0,0,0.4,0.4,0.4,0.4,0.4,0,0.4,0.4,0.4,0.4,0.4,0,0.4,0.4,0.4,0.4,0.4,0.4,0,0,0,0
Raspberry Pi 4 mit FHEM; FTUI Dashboard auf Asus 15,6" VT168H Touchscreen; ZigBee mit ConBee2 USB-Stick; div. Shelly 2.5; integr. Gaszähler mit ESP8266 & ESPEasy;