FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Damian am 14 Juli 2020, 20:43:44

Titel: neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 14 Juli 2020, 20:43:44
Ich habe mal den ersten Aufschlag für eine neue Wiki-Seite gemacht: https://wiki.fhem.de/wiki/DOIF/Automatisierung

Ich habe mit dem Thema Licht begonnen. Die Seite wird von mir in der nächsten Zeit immer wieder verfeinert und erweitert werden.
Titel: Antw:wiki: DOIF-Automatisierung
Beitrag von: Damian am 18 Juli 2020, 21:40:19
neuer Beitrag zu generalisierten Beschattungssteuerung für mehrere Fenstergruppen ohne Visualisierung:

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Beschattungssteuerung_abh.C3.A4ngig_von_der_Zimmertemperatur_und_Sonneneinstrahlung_f.C3.BCr_mehrere_Szenarien
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 19 Juli 2020, 14:54:32
neuer Beitrag zu generalisierten Beschattungssteuerung für mehrere Fenstergruppen mit Visualisierung:

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Beschattungssteuerung_abh.C3.A4ngig_von_der_Zimmertemperatur_und_Sonneneinstrahlung_f.C3.BCr_mehrere_Szenarien_mit_Visualisierung
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: cwagner am 23 Juli 2020, 23:21:04
Vielen Dank für das schöne Beispiel der Beschattungssteuerung, das meine zwei leidlich erfolgreichen DOIFs elegant ablösen könnte. Ich sehe aber noch einen ungeregelten Fall im sub shutter_$1: Wenn nämlich der Grenzwert für die Beschattung (in dem Beispiel die Raumtemperatur; in meiner Version die Solarstrahlung) bis zum Ende der eingestellten Zeitspanne überschritten bleibt, bleibt der Rollladen nämlich am Ende der Zeit in Beschattungsposition. Beispiel wäre R_Kinderzimmer1_O. Das Kind würde also den Nachmittag im Halbdunkel verbringen ;-)

Ich würde das mit einem else-Zweig im äußersten if regeln: fhem_set("$4:FILTER=STATE!=off off". Das wird dann einmal am Ende der Zeitspanne gültig und wegen des "Filter" nur an der Aktor gefeuert, wenn der Rollladen nicht hochgezogen ist.

Sehe ich das richtig?
Christian
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 24 Juli 2020, 08:02:35
Zitat von: cwagner am 23 Juli 2020, 23:21:04
Vielen Dank für das schöne Beispiel der Beschattungssteuerung, das meine zwei leidlich erfolgreichen DOIFs elegant ablösen könnte. Ich sehe aber noch einen ungeregelten Fall im sub shutter_$1: Wenn nämlich der Grenzwert für die Beschattung (in dem Beispiel die Raumtemperatur; in meiner Version die Solarstrahlung) bis zum Ende der eingestellten Zeitspanne überschritten bleibt, bleibt der Rollladen nämlich am Ende der Zeit in Beschattungsposition. Beispiel wäre R_Kinderzimmer1_O. Das Kind würde also den Nachmittag im Halbdunkel verbringen ;-)

Ich würde das mit einem else-Zweig im äußersten if regeln: fhem_set("$4:FILTER=STATE!=off off". Das wird dann einmal am Ende der Zeitspanne gültig und wegen des "Filter" nur an der Aktor gefeuert, wenn der Rollladen nicht hochgezogen ist.

Sehe ich das richtig?
Christian

Es ist eine von vielen Möglichkeiten. Ich habe bei mir den Zweig zum Hochfahren ursprünglich komplett deaktiviert, weil mir das mehrfache Rauf-Runter zu viel war (tut den Rollos auch nicht gut). Ich finde es nicht schlimm, wenn über Nacht die Rollos auf Beschattung stehen. Man kann ja selbst entscheiden, ob sie unten bleiben sollen oder ob man sie manuell hoch fährt, aber das ist natürlich eine persönliche Entscheidung, sie kann bei jedem anders sein.

Alternativ kann man im elsif-Fall den Endzeittrigger zum Hochfahren hinzufügen:


Zitatelsif ([$2:measured-temp] < 23.5 and [$3] eq "off" and get_Reading("$9") eq "on" or [$8])

Ich habe bei mir letztens noch den Zeitpunkt der Aktion in der Übersicht (uiTable) hinzugefügt.

ZitatFOR (@{$VAR{sc}},"$_$1"|temp_ring([$_$2:measured-temp])|icon([$_$3:state],"fa_cloud","weather_sun\@yellow")|[$SELF:$_$1.von]|[$SELF:$_$1.bis]|icon([$SELF:$_$1.Status],"fts_shutter_10","fts_shutter_80").substr(::ReadingsTimestamp("$SELF","$_$1.Status",0),11,5)|WID([$SELF:$_$1.aktiv],"select,on,off"))

sieht dann so aus:



Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: cwagner am 24 Juli 2020, 08:54:56




Zitat von: Damian am 24 Juli 2020, 08:02:35
Alternativ kann man im elsif-Fall den Endzeittrigger zum Hochfahren hinzufügen:

Danke für den Fingerzeig: Das ist natürlich viel eleganter.

Die Zahl der der Rauf-Runters will ich über die Hysterese steuern (ich benutzte nicht die Raumtemperatur, sondern einen zentralen Sensor, der näherungsweise die Infrarot-Strahlung, also den Wärmeeintrag der Sonne in den Raum berücksichtigt). Die Uhrzeiteingrenzung sorgt dann dafür, dass nur die Zeiten berücksichtigt werden, in denen die Sonne direkt in den Raum scheint.

Jetzt bin ich noch am Überlegen, wie ich Deine Rollladensteuerung sub shutter {
   my ($value,$color,$type)=@_;
   $color="\@darkorange" if (!defined ($color) or $color eq "");
   if (!defined ($type) or $type == 3) {
return ($value,"","iconRadio,$color,0,fts_shutter_10,70,fts_shutter_50,100,fts_shutter_100","set");
   }
}

anstelle der reinen Zustandsanzeige noch einbaue, um hier auch gleich die manuelle Steuerung zu vereinen.

Christian
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 26 Juli 2020, 09:56:09
Zitat von: cwagner am 24 Juli 2020, 08:54:56



Danke für den Fingerzeig: Das ist natürlich viel eleganter.

Die Zahl der der Rauf-Runters will ich über die Hysterese steuern (ich benutzte nicht die Raumtemperatur, sondern einen zentralen Sensor, der näherungsweise die Infrarot-Strahlung, also den Wärmeeintrag der Sonne in den Raum berücksichtigt). Die Uhrzeiteingrenzung sorgt dann dafür, dass nur die Zeiten berücksichtigt werden, in denen die Sonne direkt in den Raum scheint.

Jetzt bin ich noch am Überlegen, wie ich Deine Rollladensteuerung sub shutter {
   my ($value,$color,$type)=@_;
   $color="\@darkorange" if (!defined ($color) or $color eq "");
   if (!defined ($type) or $type == 3) {
return ($value,"","iconRadio,$color,0,fts_shutter_10,70,fts_shutter_50,100,fts_shutter_100","set");
   }
}

anstelle der reinen Zustandsanzeige noch einbaue, um hier auch gleich die manuelle Steuerung zu vereinen.

Christian

Es kommt darauf an, wie viele Fenster eine Beschattungsszene hat. Da bei mir mehrere Fenster pro Szene vorkommen können, habe ich nur den Status pro Szene eingebaut.

Falls du nur einen Rollladen pro Szene steuerst, kannst du deine Routine mit dem Rollladen (hier: Nr. $_$4) aufrufen. Z. B.

ZitatFOR (@{$VAR{sc}},"$_$1"|temp_ring([$_$2:measured-temp])|icon([$_$3:state],"fa_cloud","weather_sun\@yellow")|[$SELF:$_$1.von]|[$SELF:$_$1.bis]|shutter([$_$4:pct]) .substr(::ReadingsTimestamp("$SELF","$_$1.Status",0),11,5)|WID([$SELF:$_$1.aktiv],"select,on,off"))

Dann sieht die Sache so aus, wenn ich nur einen Rollladen pro Szene angebe:

P.S. Für diejenigen, die das shutter-Widget nicht kennen - der Rollladen lässt sich über das Anklicken der Icons manuell steuern.
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Sany am 28 August 2020, 17:07:10
Hallo Damian,

es ist mir schon mal gelungen, eine ui_Table mittels template und FOR etc zu erstellen. Ich würds nur gerne besser verstehen und scheitere bei meinen Suchen die richtigen Infos zu finden. Genauer geht es mit um sowas wie
@{$VAR{sc}}, was ja ein array ist, aber diese Schreibweise habe ich bisher nirgends gefunden. Auch ob $VAR etwas bestimmtes in Perl ist oder eine Namensgebung deinerseits?
Ebenso finde ich bei split nix über das q in split (/\| */,   q(Szene|       Daemmerung|  ....
Ich weiß, ist haupsächlich Perl, aber wie gesagt per Suchmaschine hatte ich noch keinen Erfolg.
Vielleicht kannst Du mich da in die richtige Richtung schubsen?

Danke schon mal!
Und mal wieder großes Lob für die Möglichkeiten mit DOIF.

Sany
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 28 August 2020, 18:13:25
Zitat von: Sany am 28 August 2020, 17:07:10
Hallo Damian,

es ist mir schon mal gelungen, eine ui_Table mittels template und FOR etc zu erstellen. Ich würds nur gerne besser verstehen und scheitere bei meinen Suchen die richtigen Infos zu finden. Genauer geht es mit um sowas wie
@{$VAR{sc}}, was ja ein array ist, aber diese Schreibweise habe ich bisher nirgends gefunden. Auch ob $VAR etwas bestimmtes in Perl ist oder eine Namensgebung deinerseits?
Ebenso finde ich bei split nix über das q in split (/\| */,   q(Szene|       Daemmerung|  ....
Ich weiß, ist haupsächlich Perl, aber wie gesagt per Suchmaschine hatte ich noch keinen Erfolg.
Vielleicht kannst Du mich da in die richtige Richtung schubsen?

Danke schon mal!
Und mal wieder großes Lob für die Möglichkeiten mit DOIF.

Sany

Auf diese Fragen habe ich gewartet :)
Ich werde das noch genauer im Wiki erklären.

Um modulspezifische Variablen zu erzeugen, sogenannte Instanzvariablen, musste ich mir was einfallen lassen.

$VAR wird durch $hash->{var} ersetzt.

aus

@{$VAR{sc}}

wird also

@{$hash->{var}{sc}}

was nichts anderes ist, als ein Array, das über die hash-Variable $hash->{var}{sc} erreichbar ist. Damit ist das Array nur innerhalb des definierten Modules bekannt und kann nicht mit anderen Variablen kollidieren.

Mit dem push-Befehl wird jeweils ein Element ins Array abgelegt. Nun ist das Element, nicht eine einfache Variable, sondern wieder ein Array.

man könnte definieren

push (@{$VAR{sc}},[("Erdgeschoss","Daemmerung2",....)]


da die Angabe der Anführungszeichen lästig ist, habe ich das Array mit den Parametern über den split-Befehl angegeben

split (/\| +/,q(Erdgeschoss| Daemmerung2|.....)) entspricht ("Erdgeschoss","Daemmerung2",....)

Der erste Parameter beim split ist eine Regex-Angabe für die Definition des Trennzeichens, hier also ein | und mindestens ein Leerzeichen, um die einzelnen Angaben zu trennen, das q macht noch Anführungszeichen um die Angaben, damit es eine Zeichenkette für den split-Befehl ist.

Damit erreiche ich, dass ich die einzelnen Angaben ohne Anführungzeichen mit beliebig vielen Leerzeichen ausgerichtet darstellen kann.

Auf diese Weise entsteht ein zweidimensionales Array, auf das man im definierten Modul sowohl im DEF-Bereich als auch im uiTable-Attribut z. B. über den FOR-Befehl zugreifen kann.
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Sany am 29 August 2020, 00:01:32
Hallo Damian,

vielen Dank für die Super Erklärung. Das war genau der Blick hinter die Kulissen, der mir bisher gefehlt hat. Ich denke, damit komme ich zurecht. Dann werde ich mal meine Vorhaben angehen.

Ich werde berichten....
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 25 Oktober 2020, 14:54:53
Bedingt durch die Jahreszeit rückt die Beschattungssteuerung in den Hintergrund, dafür wird die Heizungsregelung für die kommende Heizperiode wieder interessant. Ich habe zwei neue Automatisierungsbeispiele zur Heizungsregelung im Wiki aufgenommen.

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Zeitgesteuerte_Heizungsregelung_mit_Hilfe_von_Raumthermostaten

Das erste Beispiel ist einfach realisiert, jegliche Änderungen müssen in der Definition des Moduls vorgenommen werden.

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f.C3.BCr_mehrere_R.C3.A4ume_ohne_GUI

Das zweite Beispiel ist flexibler, lässt sich einfach erweitern, besitzt ein GUI zur Visualisierung sowie zur Änderung von Zeiten und Vorgabe-Temperaturen.

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Steuerung_von_Raumthermostaten_f.C3.BCr_mehrere_R.C3.A4ume_mit_GUI
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 26 Oktober 2020, 19:23:01
Vielleicht ist dem einen oder anderen aufgefallen, dass ich im Beispiel der Heizungsregelung eine etwas einfacher Variante der Definition von Arrays genutzt habe als im Beschattungsbeispiel:

statt
push (@{$VAR{sc}},[split (/\| */,q(Bad|                TH_Bad_HM|    Sonne_s|R_Bad|               30|  on|12:00|21:00| off|on))])
kann man ebenso definieren:
push (@{$VAR{sc}},[qw(Bad                TH_Bad_HM    Sonne_s R_Bad                30   on 12:00 21:00  off on)])
oder noch kürzer:
push (@{$_sc},[qw(Bad                TH_Bad_HM    Sonne_s R_Bad                30   on 12:00 21:00  off on)])
denn sowohl @{$VAR{sc}} als auch @{$_sc} wird intern abgebildet auf @{$hash->{var}{sc}}

Ich werde das Beschattungsbeispiel ebenfalls auf die einfachere Definition ändern.

PS

qw(...) funktioniert solange die einzelnen Parameter selbst keine Leerzeichen beinhalten, es handelt sich hierbei um Perlsyntax
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 29 Oktober 2020, 09:55:19
Da bald die Lichterketten und Tannenbaumbeleuchtungen installiert werden, habe ich die Lichtsteuerung, wie bei der Heizungsregelung, von der Definition her vereinfacht.

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht

Auch bei der Beschattungssteuerung habe ich die split-Befehle herausgenommen.

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Beschattungssteuerung_abh.C3.A4ngig_von_der_Zimmertemperatur_und_Sonneneinstrahlung_f.C3.BCr_mehrere_Szenarien_mit_Visualisierung

Jetzt sollten die unterschiedlichen Steuerungsszenarien von der Definition her vereinheitlicht und hoffentlich etwas einsteigerfreundlicher sein.
Titel: Antw:neue Wiki-Seite: DOIF-Automatisierung
Beitrag von: Damian am 19 Juli 2021, 23:06:03
Ich habe meine Licht-Steuerung, die sich in den letzten Monaten bewährt hat, aktualisiert, siehe:

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Helligkeitsabh.C3.A4ngige_Zeitsteuerung_f.C3.BCr_mehrere_Szenarien_mit_tabellarischer_.C3.9Cbersicht