Weihnachtsbeleuchtung mit Szenarien

Begonnen von Damian, 28 November 2020, 11:40:31

Vorheriges Thema - Nächstes Thema

Damian

Da man jedes Jahr auf´s Neue die Lichterketten aus der Kiste kramt, ist dieses Thema ja immer wieder aktuell :)

Für diesen Zweck habe ich meine Szenarien über die WEB-Oberfläche ein- und ausschaltbar um die Weihnachtsbeleuchtung erweitert. So kann ich jedes Jahr die Weihnachtsszenarien aktivieren und andere wieder deaktivieren. Das scheint mir praktikabler zu sein, als sich auf bestimmte Tage im Jahr festzulegen, wie in den vorherigen Beispielen.

Meine aktuelle Lösung sieht wie folgt aus. Daemmerung2 bzw. Dunkelheit sind DOIF´s, die abhängig von der Helligkeit wahr/unwahr werden.

Wer keinen Helligkeitssensor hat, der kann sich seine Dämmerung selbst definieren:

defmod Daemmerung DOIF init {set_State([{sunset()}-{sunrise()}])}

Und hier der komplette Code für die Lichtszenarien:

defmod di_Licht_all DOIF subs  {\
## Szenarien werden durch Hinzufügen einer Definitionszeile erstellt\
##              Szene         Dämmerungssensor    Zeitspanne                            Einschaltbefehl             Ausschaltbefehl\
push @{$_sc},["Erdgeschoss","Daemmerung2",      "[06:25-08:00|8] or [15:00-23:30]",   "Lampekueche,Lampeflur on", "Lampekueche,Lampeflur off"];;\
push @{$_sc},["Kinderz_2",  "Daemmerung2",      "[06:25-08:00|8] or [15:00-23:10]",   "schrank2 on",              "schrank2 off"];;\
push @{$_sc},["Terrasse",   "Dunkelheit",       "[16:00-23:30]",                      "Terrasse on",              "Terrasse off"];;\
push @{$_sc},["Garten",     "Dunkelheit",       "[16:00-23:30]",                      "Garten pct 50",            "Garten off"];;\
push @{$_sc},["Strauch1",   "Dunkelheit",       "[17:00-23:05]",                      "Strauch1 on",              "Strauch1 off"];;\
push @{$_sc},["Strauch2",   "Dunkelheit",       "[17:00-23:05]",                      "Strauch2 on",              "Strauch2 off"];;\
push @{$_sc},["Eingang",    "Dunkelheit",       "[17:00-23:35]",                      "Aussenbeleuchtung on",     "Aussenbeleuchtung off"];;\
push @{$_sc},["Weihnachtsbeleuchtung","Daemmerung2","[16:00-09:00]",                  "Terrasse,Schuppen on",     "Terrasse,Schuppen off"];;\
\
\
## Bei Änderung der Definition werden erfoderliche Readings erstellt und vorbelegt\
if ($::init_done) {\
  fhem("deletereading $SELF .*");;\
  set_State("initialized");;\
  for (my $i=0;;$i < @{$_sc};;$i++) {\
      set_Reading ($_sc[$i][0].".Status","off");;\
  set_Reading ($_sc[$i][0].".aktiv","off");;\
  }\
}\
} ## end of subs\
\
DEF TPL_light ( ## Definition des Templates namens TPL_light\
light_$1 {      ## Parameter: Szene Daemmerung Zeitspanne on off \
                ##            $1    $2         $3         $4 $5\
  if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "on") {\
      fhem_set($4);;\
      set_Reading("$1.Status","on",1);;\
    } else {\
      fhem_set ($5);;\
      set_Reading("$1.Status","off",1);;\
    }\
  }\
} ## Ende des light-Blocks\
\
active_$1 {\
  if ([$SELF:$1.aktiv] eq "on") {\
    fhem_set ($4);;\
    set_Reading("$1.Status","on",1);;\
  }\
  if ([$SELF:$1.aktiv] eq "off") {\
    fhem_set ($5);;\
    set_Reading("$1.Status","off",1);;\
  }\
} ## Ende des active-Blocks \
) ## Ende der Templatedefinition\
\
## Generierung der Steuerung pro Licht-Szene mit Hilfe des obigen Templates\
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,"$_$4","$_$5"))
attr di_Licht_all room Licht
attr di_Licht_all uiTable {\
  package ui_Table;;\
  ##$TC{1..5}="style='padding-left: 2px;; padding-right: 2px;; padding-top: 2px;; padding-bottom: 2px;;' align='center'";;\
  $TC{1..5}="style='padding-left: 2px;; padding-right: 2px;;' align='center'";;\
\
}\
\
## Überschrift der Parameter\
"Szene"|"Dämmerung"|"Zeitspanne"|"Status"|"ausgeführt"|"aktiv"\
\
## Pro Datensatz einer Licht-Szene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$_$1"|icon([$_$2])|"$_$3"|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0)|WID([$SELF:$_$1.aktiv],"select,auto,on,off"))


Hier gibt's den Wiki-Eintrag dazu:
https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kjmEjfu

Ich habe es mal etwas erweitert, damit man mit einem Brightness-Wert arbeiten kann, aber nicht bei jeder kleinen Änderung direkt in hektisches ein-/ausschalten verfallen wird. Außerdem noch einen Zufallswert, damit die Schaltzeit etwas variiert.

defmod di_Licht_all DOIF subs  {\
## Ein Szenario wird durch Hinzufügen einer Definitionszeile erstellt\
##              Szene               Daemmerungssensor               Schwellwert_ein   Schwellwert_aus     Zeitspanne         Zufallswert     Einschaltbefehl                Ausschaltbefehl\
push (@{$_sc},["Weihnachten_1",   "Sensor_Aussen_1",                "180",            "210",              "[07:00-22:15]",   "5",            "Steckdose_Aussen_1 on",       "Steckdose_Aussen_1 off"]);;\
push (@{$_sc},["Weihnachten_2",   "Sensor_Aussen_2",                "180",            "210",              "[07:00-22:15]",   "0",            "Steckdose_Aussen_2 on",       "Steckdose_Aussen_2 off"]);;\
\
## Bei Änderung der Definition werden erforderliche Readings erstellt und vorbelegt
if ($::init_done) {
  fhem("deletereading $SELF .*");
  set_State("initialized");
  for (my $i=0;$i < @{$_sc};$i++) {
      set_Reading ($_sc[$i][0].".Status","off");
      set_Reading ($_sc[$i][0].".aktiv","off");
  }
}
} ## end of subs

DEF TPL_light ( ## Definition des Templates namens TPL_light
light_$1 {      ## Parameter: Szene   Daemmerungssensor  Schwellwert_ein   Schwellwert_aus      Zeitspanne   Zufallswert    on  off
                ##            $1      $2                 $3                $4                    $5           $6             $7  $8
  if ([$SELF:$1.aktiv] eq "auto") {
    if (($5) and ([$2:control:d] < $3) and ([$SELF:$1.Status] ne "on")) {
  if (get_Exec("$1_off")) {
del_Exec("$1_off");
  } else {
        set_Exec("$1_on",rand($6),'fhem_set($7)');
        set_Reading("$1.Status","on",1);
  }
    } elsif ((([$2:control:d] > $4) or !($5)) and ([$SELF:$1.Status] ne "off")) {
  if (get_Exec("$1_on")) {
del_Exec("$1_on");
  } else {
        set_Exec("$1_off",rand($6),'fhem_set($8)');
        set_Reading("$1.Status","off",1);
  }
    }
  }
} ## Ende des light-Blocks

active_$1 {
  if (([$SELF:$1.aktiv] eq "on") and ([$SELF:$1.Status] ne "on")) {
    fhem_set ($7);
    set_Reading("$1.Status","on",1);
  }
  if (([$SELF:$1.aktiv] eq "off") and ([$SELF:$1.Status] ne "off")) {
    fhem_set ($8);
    set_Reading("$1.Status","off",1);
  }
} ## Ende des active-Blocks
) ## Ende der Templatedefinition
FOR (@{$_sc},TPL_light($_$1,$_$2,$_$3,"$_$4","$_$5","$_$6","$_$7","$_$8"))
attr di_Licht_all_new group Logik
attr di_Licht_all_new room Homematic
attr di_Licht_all_new uiTable {\
  package ui_Table;;\
  $TC{1..5}="style='padding-left: 2px;; padding-right: 2px;;' align='center'";;\
\
}\
\
## Überschrift der Parameter\\
"Szene"|"Dämmerung"|"Zeitspanne"|"Status"|"ausgeführt"|"aktiv"\
\
## Pro Datensatz einer Licht-Szene wird eine Zeile mit Werten und Widgets generiert\
FOR (@{$VAR{sc}},"$_$1"|"$_$3 - $_$4"|"$_$5"|icon([$SELF:$_$1.Status])|::ReadingsTimestamp("$SELF","$_$1.Status",0)|WID([$SELF:$_$1.aktiv],"select,auto,on,off"))


Migriere derzeit zu Home Assistant

Damian

Zitat von: kjmEjfu am 30 November 2021, 10:52:10
Ich habe es mal etwas erweitert, damit man mit einem Brightness-Wert arbeiten kann, aber nicht bei jeder kleinen Änderung direkt in hektisches ein-/ausschalten verfallen wird. Außerdem noch einen Zufallswert, damit die Schaltzeit etwas variiert.

Schön, wenn du in der Lage warst, den Code anzupassen.

Ich habe bei mir verschiedene Dämmerungsstufen über separate DOIFs definiert. Die passende Dämmerungsstufe gebe ich dann unter Daemmerungssensor an.

Wenn mir eine Dämmerungsstufe zu hell oder zu dunkel wäre, dann könnte ich sie außerhalb des Codes anpassen.

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

gestein

Hallo,

ich hätte noch 2 Fragen bzw. Bitten zu dem DOIF:
1) Wie könnte man die Schaltzustände "Status" mit den wirklichen Zuständen der Lampen angleichen?
   Meine Frau schaltet manchmal die Beleuchtung manuell ein bzw. aus.
   Ist war nur Kosmetik, aber immerhin.
2) Wie könnte man die Lampensymbole schaltbar machen?

Im Prinzip könnte ich da schon was selbst probieren, aber bei den 2 Themen bräuchte ich bitte einen kleinen Schupser in die richtige Richung ;-)

Danke, lg, Gerhard

Damian

Dazu müsste man in der ui_Table-Definition statt icon([$SELF:$_$1.Status] die switch-Funktion mit der Lampe angeben siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Schaltbares_Icon_mit_Hilfe_der_Funktion_switch

In meinem Beispiel funktioniert das nicht, weil ich pro Szenario nicht nur ein Device vorgesehen habe, sondern auch mehrere.

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

moonsorrox

Für mein Verständnis, was bedeutet denn Auto ist das in Zusammenhang mit dem Dämmerungssensor zu verstehen.
Die Beleuchtung ist dann "on" wenn der Dämmerungssensor auch sagt "on"
Dann "off" ist normal klar bedeutet es geht gar nicht "Ein" obwohl der Dämmerungssensor sagt "on"

Denn auch auf dem Bild ist bei allen der Dämmerungssensor auf  "on"
Dann habe ich gesehen im Code du hast 2 Dämmerungssensoren, "Dämmerung2" und "Dunkelheit" wie ist das zu verstehen.

Ich möchte das gerne mal nachbauen muss aber erst einmal die Logik dahinter verstehen, denn du hast ja auch Zeitangaben das würde doch eigentlich ausreichen.
Es ist wohl auch nicht "nur" eine Weihnachtsbeleuchtung sondern wird auch sonst als Szenario genutzt..?
Intel-NUC i5: FHEM-Server 6.1 :: 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

Damian

#36
Pro Szenario wird eine Bedingung erstellt der Art (verglichen mit FHEM-Modus):

([Daemmerung] eq "on" and [von-bis]) (set etwas on) DOELSE (set etwas off)

D. h. in der vorgegebenen Zeitspanne wenn es dunkel wird etwas einschalten, wenn es hell wird oder wenn die bis-Zeit erreicht wird ausschalten.

Dämmerung ist ein on/off-Dämmerungssensor, entweder hat man einen solchen oder man baut sich einen solchen oder mehrere mit separaten DOIFs für verschiedene Helligkeitsstufen.

on ist dauerhaft on, off ist dauerhaft off, auto ist automatisch, das sollte logisch sein. Wenn ich ein Szenario deaktivieren will, dann setze ich es auf off, sonst stelle ich es auf auto, on ist nice to have.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

moonsorrox

Vielen Dank Damian, das ist sehr gut dargestellt und die Szenarien erklärt.
Ich gehe bei vielen Dummys ähnlich vor mit dem Status, entweder Dämmerung, oder Ein, oder Aus

So kann ich aber mal probieren meine gesamten DOIFs zu überarbeiten und alles in dem einen unter zu bringen mit den verschiedenen Möglichkeiten, mal schauen ob ich das so hinbekomme, wie ich es haben möchte... ;-))
Danke
Intel-NUC i5: FHEM-Server 6.1 :: 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

Damian

Zitat von: moonsorrox am 17 Dezember 2021, 22:27:49
Vielen Dank Damian, das ist sehr gut dargestellt und die Szenarien erklärt.
Ich gehe bei vielen Dummys ähnlich vor mit dem Status, entweder Dämmerung, oder Ein, oder Aus

So kann ich aber mal probieren meine gesamten DOIFs zu überarbeiten und alles in dem einen unter zu bringen mit den verschiedenen Möglichkeiten, mal schauen ob ich das so hinbekomme, wie ich es haben möchte... ;-))
Danke

Ein weiterer Vorteil bei diesem Codeschnipsel ist, dass beim Setzen einer Szene auf off gleichzeitig die Aktoren ausgeschaltet werden, beim Setzen auf auto werden die Aktoren auf on gesetzt, wenn die Bedingung stimmt, man muss also nicht bis zum nächsten Ereignis warten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

teufelchen

Vielen Dank Damian,

das verschafft mir wesentlich mehr Übersichtlichkeit und auch das deaktivieren nach Weihnachten wird erleichtert.

Noch zwei Fragen:
Kann es statt der Uhrzeit auch eine andere Bedingung sein, die dann wahr oder falsch ist?
Oder muss ich noch etwas beachten?
(([Anwesenheit] eq "present"
and (([05:00-12:00|AT] and [05:00-12:00|Mo]) or [05:30-12:00|AT] or [06:30-21:45] or [21:45-22:30|MWE] or [TVs] ne "absent"))
or (([05:00-06:00|AT] or [06:00-22:30]) and ([Rollo_Kueche] eq "open"))


Mein Helligkeitsdummy liefert die Werte "hell" und "dunkel", reicht es den folgenden Teil
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "on") {\

zu ersetzen durch:
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "dunkel") {\

und noch das Icon für die Webansicht zu ergänzen:
(@{$VAR{sc}},"$_$1"|icon([$_$2],"weather_sun\@yellow","light_question\@DarkOrange","hell","dunkel")|"$_$3"|

Oder doch lieber ein zusätzliches Userreading mit on/off im Dummy erstellen und dann bei Sensor auf dieses Reading verweisen?

Danke


Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

Damian

Zitat von: teufelchen am 21 Dezember 2021, 14:40:27
Vielen Dank Damian,

das verschafft mir wesentlich mehr Übersichtlichkeit und auch das deaktivieren nach Weihnachten wird erleichtert.

Noch zwei Fragen:
Kann es statt der Uhrzeit auch eine andere Bedingung sein, die dann wahr oder falsch ist?
Oder muss ich noch etwas beachten?
(([Anwesenheit] eq "present"
and (([05:00-12:00|AT] and [05:00-12:00|Mo]) or [05:30-12:00|AT] or [06:30-21:45] or [21:45-22:30|MWE] or [TVs] ne "absent"))
or (([05:00-06:00|AT] or [06:00-22:30]) and ([Rollo_Kueche] eq "open"))


Mein Helligkeitsdummy liefert die Werte "hell" und "dunkel", reicht es den folgenden Teil
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "on") {\

zu ersetzen durch:
if ([$SELF:$1.aktiv] eq "auto") {\
    if (($3) and [$2] eq "dunkel") {\

und noch das Icon für die Webansicht zu ergänzen:
(@{$VAR{sc}},"$_$1"|icon([$_$2],"weather_sun\@yellow","light_question\@DarkOrange","hell","dunkel")|"$_$3"|

Oder doch lieber ein zusätzliches Userreading mit on/off im Dummy erstellen und dann bei Sensor auf dieses Reading verweisen?

Danke

In die Bedingung kannst du alles reinpacken, was du willst. Du kannst die Tabelle erweitern, wie es  @kjmEjfu gemacht hat, dann musst du ggf. die Parameter $1,$2,$3,usw. anpassen.  Ob du über Userreading on/off abbildest oder über ein separates DOIF  oder über DOIF_Readings oder ob du auf hell/dunkel abfragst oder ... ist dir überlassen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

teufelchen

Zitat von: Damian am 21 Dezember 2021, 16:45:16
In die Bedingung kannst du alles reinpacken, was du willst. Du kannst die Tabelle erweitern, wie es  @kjmEjfu gemacht hat, dann musst du ggf. die Parameter $1,$2,$3,usw. anpassen.  Ob du über Userreading on/off abbildest oder über ein separates DOIF  oder über DOIF_Readings oder ob du auf hell/dunkel abfragst oder ... ist dir überlassen.

Danke.

Meine Weihnachtsbeleuchtung habe ich mit günstigen 433 mHz Funksteckdosen realisiert.
Oftmals reicht aber ein Befehl nicht für eine Schaltung, so dass ich bisher den Einbefehl 2 mal und den Ausbefehl 4 mal im Abstand von 15 Sekunden Sekunde schicke und habe damit sehr gute Erfahrungen.
attr xyz repeatcmd 15:15
attr xyz repeatsame 2:4

Mehrfach den Befehl schicken, kann ich ja wenn ich die entsprechende Zeile mehrfach aufführe.
Wie baue ich noch zusätzlich die verzögerte Wiederholung ein?
Im Beispiel zum Abfall-Modul habe ich folgendes gefunden, weiß aber nicht wie ich das anpasse:
## Beim Start, um 02:00 Uhr und 08:00 Uhr wird zeitverzögert die obige Funktion 'update' aufgerufen\
init {[02:00];;[08:00];;set_Exec("Timer",60,'update()');;\

Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

Damian

set_Exec ist schon die richtige Funktion:

hier findest du Beispiele zur Wiederholung in einem bestimmten Abstand:

https://fhem.de/commandref_DE.html#DOIF_set_Exec
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF