define timer_rollo dummy
attr timer_rollo room Test.Rollladen
attr timer_rollo setList auf zu
attr timer_rollo webCmd auf:zu
define tuer_re dummy
attr tuer_re room Test.Rollladen
attr tuer_re setList gekippt offen verschlossen
attr tuer_re webCmd gekippt:offen:verschlossen
define rollo_li dummy
attr rollo_li room Test.Rollladen
attr rollo_li setList unten oben
attr rollo_li webCmd unten:oben
define rollo_re dummy
attr rollo_re room Test.Rollladen
attr rollo_re setList unten oben irgendwo lueften_wenig lueften_viel stop
attr rollo_re webCmd unten:oben:irgendwo:lueften_wenig:lueften_viel:stop
define di_rolladensteuerung_2 DOIF ## autom. Schließen alle außer Tür-rechts, diese auf Lüften fahren, wenn gekippt\
([timer_rollo] =~ "zu" and [tuer_re] =~ "gekippt") \
(set rollo_li unten)\
(set rollo_re lueften_wenig)\
## autom. Schließen wenn Tür-rechts zu\
DOELSEIF ([timer_rollo] =~ "zu" and [tuer_re] =~ "verschlossen")\
(set rollo_li unten)\
(set rollo_re unten)\
## autom. Schließen wenn Tür-rechts offen\
DOELSEIF ([timer_rollo:"zu"] and [?tuer_re] !~ "verschlossen|gekippt")\
(set rollo_li unten)\
## autom. Lüften wenn Tür-rechts offen\
DOELSEIF ([timer_rollo] =~ "zu" and [tuer_re:"offen"] and [?rollo_re] =~ "lueften_wenig|lueften_viel|unten")\
(set rollo_re lueften_viel)\
## autom. Öffnen alle Rollos, wenn Tür-rechts gekippt oder geschlossen\
DOELSEIF ([timer_rollo:"auf"] and [tuer_re] =~ "gekippt|verschlossen") \
((set rollo_li,rollo_re oben))\
## autom. Öffnen alle Rollos, außer Tür-rechts wenn offen\
## wenn Rollladen rechts tiefer als Lüftern_wenig-Position, dann Öffnen bis Lüften_wenig,\
## sonst Rollladen rechts nicht fahren\
DOELSEIF ([timer_rollo:"auf"] and [tuer_re] !~ "gekippt|verschlossen") \
(set rollo_li oben)\
(IF ([rollo_re] !~ "lueften_wenig|unten") (set rollo_re lueften_wenig))\
## Lüften_wenig-Position\
DOELSEIF ([tuer_re:"gekippt"] and [?rollo_re] =~ "unten")\
(set rollo_re lueften_wenig)\
## Lüften_viel-Position\
DOELSEIF ([tuer_re:"offen"] and [?rollo_re] =~ "unten|lueften_wenig")\
(set rollo_re lueften_viel)\
## Schließen nach Lüften\
DOELSEIF ([tuer_re:"verschlossen"] and [?rollo_re] =~ "lueften_wenig|lueften_viel" and ([$SELF:cmd] == 7 or [$SELF:cmd] == 8))\
(set rollo_re unten)\
attr di_rolladensteuerung_2 checkall event
attr di_rolladensteuerung_2 room Test.Rollladen
Zitat von: spi3845 am 27 März 2017, 13:28:59Ich würde gerne hören, wie ihr solch ein Problem angehen würdet? Tatsächlich jede einzelne Bedingungen im DOIF abbilden? Oder mehrere DOIFs wie bei der Ampel?Mein Vorgehen (im Laufe der Zeit hat diese sich erst ergeben, es existieren also noch alte Relikte :-[):
Zitat von: Per am 27 März 2017, 14:10:58Danke - und wie sehen die DOIFs aus (die neuen, nicht die Relikte ;))? Verkettest Du alle Bedingungen einander (so wie in meinem einfachen Beispiel) oder versuchst Du (schöne :) ) Zustandsautomaten abzubilden?
- für jeden Aktor existiert max. ein DOIF. Alles, was diesen Aktor betrifft, kommt da hinein.
Zitat von: spi3845 am 27 März 2017, 14:22:42
Ich bin quasi auf der Suche nach der Antwort, wie man funktionierenden, übersichtlichen und gut pflegbaren DOIF-Code erstellt.
Zitat von: Wuppi68 am 27 März 2017, 14:30:19Genau das war ja mein Ansatz in meinem Beispiel-Code. Nur führt das zu einer langen Verkettung von Bedingungen, da mehrere Ereignisse eintreten können, die abhängig verschiedener Zustände zu unterschiedlichen Ergebnissen führen. Ich hatte gehofft, es gäbe da noch irgend einen Trick, den ich in der Doku nicht gefunden habe...
versuche die ganze Problematik am besten Ereignis anstelle von Zustand gesteuert zu überdenken
Zitat von: betateilchen am 27 März 2017, 15:24:38:D und statt dessen? Voodoo?
Indem man ihn wegläßt. Macht die Sache sehr übersichtlich.
Zitat von: spi3845 am 27 März 2017, 15:34:01
und statt dessen? Voodoo?
Zitat von: betateilchen am 27 März 2017, 15:43:49Warum nicht gleich Assembler oder gar Machinencode? Notify und Perl doch für dich auch nur "Krücken" sein, oder?
nein, die dafür originär implementierten Möglichkeiten wie notify und echtes perl nutzen.
Zitat von: betateilchen am 27 März 2017, 15:43:49Was kann notify was DOIF nicht kann? Das ginge doch dann in die Richtung mehrerer DOIFs parallel - so wie beim Ampel-Beispiel.
nein, die dafür originär implementierten Möglichkeiten wie notify und echtes perl nutzen.
Zitat von: spi3845 am 27 März 2017, 15:56:09Darum geht es nicht. betateilchen ist bekennender DOIF-Hasser. Und das versucht er gern auch mal an unpassender Stelle loszuwerden. Also lass dich nicht davon beirren.
Was kann notify was DOIF nicht kann?
Zitat von: spi3845 am 27 März 2017, 15:56:09DOIF ist ein sehr komplexes Werkzeug, das aber eben den Nachteil hat, dass man genau diese Komlexität gerne übersieht. Darauf zielt nach meinem Eindruck auf Wuppie68 ab:
Was kann notify was DOIF nicht kann? Das ginge doch dann in die Richtung mehrerer DOIFs parallel - so wie beim Ampel-Beispiel.
Zitat von: Wuppi68 am 27 März 2017, 14:30:19
versuche die ganze Problematik am besten Ereignis anstelle von Zustand gesteuert zu überdenken
Zitat von: Per am 27 März 2017, 16:12:02Den Eindruck einer halben Seite hatte ich nach dem Codieren des (einfachen) Rollladenbeispiels. Daher die Frage nach alternativen Ansätzen.
wo ist da die Grenze, ich bin kein gelernter Programmierer (obwohl ich schon den Z8 mit Assembler bearbeitet habe), ich entscheide sowas eher pragmatisch von Fall zu Fall. Wenn du einen Extrem-Fall als Standard definierst, wirst du irgendwann eine Anwendung finden, bei der das andere Extrem einen Zweizeiler, deine Wahl hingegen eine halbe Seite Code erfordert (Übertreibung macht anschaulich ;)).
Zitat von: Beta-User am 27 März 2017, 16:36:05Mit einem Notify wird man ja dann bei unterschiedlichen Ereignissen nicht auskommen. Ist die Analogie dazu nicht "mehrere DOIFs"? Mir ist es am Ende egal, ob ich notify oder DOIF nutze, ich will nur die Vor-/Nachteile ausloten...
Mit einem notify (das übrigens zusammen mit at vermutlich der älteste und damit "härteste" Bestandteil von FHEM ist), reagiert man eben auf ein Ereignis und kann dann ggf. mit einfachen (perl-) if Abfragen genau die Frage nach dem aktuellen Zustand diverser (nicht-DOIF)-devices klären und daran anknüpfend dann eben genau die Reaktion auf das Ereignis auswählen, die jetzt angezeigt ist.
Zitat von: Beta-User am 27 März 2017, 16:36:05Das ganze ist dann nicht assembler, sondern kann recht stringenter code sein, der (als perl, klar, aber mindestens) ebenso gut zu verdauen ist als ein DOIF mit einer Vielzahl von attr., bei denen jedenfalls ich niemals verstehen werde, welche Kombination jetzt auf meinen Fall Sinn macht.Urgh, so geht's mir auch nach dem Rollladen-Beispiel...
Zitat von: Beta-User am 27 März 2017, 16:36:05Bei Gelegenheit wollte ich mal eine Userreading-basierte Rolladenautomatik angehen, da gibt es leider bislang wohl nur halbgare Ansätze. Kann ich da irgendwo im Forum was finden, was mir hilft, mein (vermutlich (!) nach der commandref gebasteltes) DOIF-Konstrukt loszuwerden?Da würde ich gerne mitmachen...
Zitat von: Beta-User am 27 März 2017, 16:36:05PS: Wer so einen Titel wählt, braucht sich über Anworten wie meine und betateilchens nicht wundernPasst, ich wollte eine Diskussion, jetzt habe ich eine Diskussion.
Zitat von: spi3845 am 27 März 2017, 17:11:37Kommt drauf an. Man kann für dieselbe Reaktion bei beiden Modulen (DOIF und notify) ja auswählen, auf welche Bedingungen reagiert werden soll, bei notify aber halt "nur" im Sinne von "...oder .... oder ... oder" als (alternative) Eingangsbedingungen (bei DOIF geht es auch "weiter hinten" irgendwo in einem else-Zweig). Bei Notify muß man es "hinterher" erledigen, Dinge rauszufiltern, auf die man jetzt halt doch nicht reagieren will.
Mit einem Notify wird man ja dann bei unterschiedlichen Ereignissen nicht auskommen. Ist die Analogie dazu nicht "mehrere DOIFs"? Mir ist es am Ende egal, ob ich notify oder DOIF nutze, ich will nur die Vor-/Nachteile ausloten...
Zitat von: spi3845 am 27 März 2017, 17:11:37...eine Zeitlang habe ich geglaubt, es läge an mir, warum ich das alles nicht auf die Reihe bekomme :'(, aber dann habe ich einige threads gesehen, bei denen sich die Macher schon nicht einig waren, in welcher Kombination jetzt welche attr Snn machen und ob es eine DOELSE braucht 8). (Nur zur Klarstellung: Der Ansatz ist löblich, aber ich bin kein Programmierer und damit überfordert, und obigen Verdacht werde ich in diesem Leben nicht mehr loswerden, dafür komme ich zwischenzeitlich mit C-Code klar (DOIF goes Arduino 8)), jetzt ist dann halt perl an der Reihe).
Urgh, so geht's mir auch nach dem Rollladen-Beispiel...
Zitat von: spi3845 am 27 März 2017, 17:11:37Ich bin kein Programmierer, daher wird das kein Spaß ;).
Da würde ich gerne mitmachen...
Zitat von: spi3845 am 27 März 2017, 17:11:37Mach' das nicht zu oft, es macht keinen Sinn, die Leute hier gegeneinander aufzubringen!
Passt, ich wollte eine Diskussion, jetzt habe ich eine Diskussion.
Zitat von: Beta-User am 27 März 2017, 17:43:50Bin schon am Testen von notify statt DOIF...
Und ich bin ziemlich sicher, dass daran anknüpfender guter perl-Code auch in 20 Jahren noch zuverlässig seinen Dienst tun wird und nicht das Nachpflegen irgendwelcher attr brauchen wird.
Zitat von: Beta-User am 27 März 2017, 17:43:50So geht's mir auch. Und was daraus geworden ist, ist das Code-Beispiel oben...
Ich habe HM-Hardware (Tri-State Fenstersensoren, UP-Rolladen)...
Bei Interesse kann ich gerne meine Gendanken mal zu Papier bringen, was an Elementen m.E. so zweckmäßig wäre, aber wie gesagt: Eigentlich habe ich keine Ahnung, wie man "sowas" angeht.
Zitat von: Beta-User am 27 März 2017, 17:43:50Dar war nicht mein Ziel, Leute gegeneinander aufzubringen. Nur zu verstehen, welche Vor- und Nachteile unterschiedliche Vorgehensweisen haben. Sollte ich jemandem auf die Füße getreten sein - mea culpa. Und danke allen für das Teilen ihrer Ideen...
Mach' das nicht zu oft, es macht keinen Sinn, die Leute hier gegeneinander aufzubringen!
Zitat von: Beta-User am 27 März 2017, 16:36:05Kennst Du das? https://wiki.fhem.de/wiki/ROLLO
Bei Gelegenheit wollte ich mal eine Userreading-basierte Rolladenautomatik angehen, da gibt es leider bislang wohl nur halbgare Ansätze. Kann ich da irgendwo im Forum was finden, was mir hilft, mein (vermutlich (!) nach der commandref gebasteltes) DOIF-Konstrukt loszuwerden?
Zitat von: Beta-User am 27 März 2017, 16:36:05
@betateilchen:
Bei Gelegenheit wollte ich mal eine Userreading-basierte Rolladenautomatik angehen,
Zitat von: betateilchen am 27 März 2017, 18:45:24Gaszähler liefert Daten in m³, du möchtest jedoch lieber Readings als kWh. Wie machst du das?
In meiner FHEM Installation gibt es keine userreadings - mir ist einfach noch keine sinnvolle Anwendungsmöglichkeit (geschweige denn Notwendigkeit) begegnet.
Zitat von: vbs am 27 März 2017, 18:53:24
Gaszähler liefert Daten in m³, du möchtest jedoch lieber Readings als kWh. Wie machst du das?
Zitat von: betateilchen am 27 März 2017, 18:45:24Hast Du mir ein Stichwort, wie man "sowas" sonst zweckmäßigerweise angeht?
In meiner FHEM Installation gibt es keine userreadings - mir ist einfach noch keine sinnvolle Anwendungsmöglichkeit (geschweige denn Notwendigkeit) begegnet.
Zitat von: Beta-User am 27 März 2017, 19:04:37Kannst Du kurz erläutern, welche Zustände diese userreadings darstellen sollen? Wenn ich nach AutoSingle7upEnd google, kommt als einziger Fund "Bildhübsche Polinnen". Hm.
Was die Userreadings angeht vielleicht noch zur Erläuterung, an was ich auf die Schnelle gedacht hätte (lasse mich aber gerne belehren, wie das alles besser geht):
Reading Werte Bemerkungen
AutoMode Manual, AutoSingle, Group1, Group2, Group3
AutoSingle7upStart
AutoSingle8upStart
AutoSingle7upEnd
AutoSingle8upEnd
WindowContactAssociated
WindowContactOpenMaxClosed
WindowContactOnHoldState on, off für notify bei Schließen: automatisch vollends schließen (oder öffnen?)
my %ctrl ;
$ctrl{"Rollo"}{100}{tilted}{true}{close} = "set $name 30pct";
defmod Automatik_Terrassentuer_Jalousie notify Jalousie_Mitte:leve.*|Terrassentuer_EZ:ope.* IF ( [Jalousie_Mitte:level] < 55) and [Terrassentuer_EZ:state] eq "open") (set Jalousie_Mitte 60)
attr Automatik_Terrassentuer_Jalousie group Türen und Fenster
attr Automatik_Terrassentuer_Jalousie icon fts_shutter_automatic
attr Automatik_Terrassentuer_Jalousie room Esszimmer
# ToDo: Rollo nicht runter fahren wenn entsprechendes Fenster geöfnet ist (Ein/Ausschaltbar)
# ToDo: Testen Testen Testen
# Todo: Funktion von der SPS nach FHEM verlagern
################################################################################################################################################
####################################################### Rollo 1 ################################################################################
################################################################################################################################################
# Rollo Dummy runter
define Rollo_Dummy_1_runter dummy
attr Rollo_Dummy_1_runter alias Rollo Dummy 1 runter
attr Rollo_Dummy_1_runter event-on-change-reading state
attr Rollo_Dummy_1_runter room Rollo
# Rollo Dummy hoch
define Rollo_Dummy_1_hoch dummy
attr Rollo_Dummy_1_hoch alias Rollo Dummy 1 hoch
attr Rollo_Dummy_1_hoch event-on-change-reading state
attr Rollo_Dummy_1_hoch room Rollo
define Rollo_Dummy_1 ROLLO
attr Rollo_Dummy_1 automatic-enabled on
attr Rollo_Dummy_1 devStateIcon offen:fts_shutter_10:geschlossen geschlossen:fts_shutter_100:offen schlitz:fts_shutter_80:geschlossen drive-up:fts_shutter_up@red:stop drive-down:fts_shutter_down@red:stop position-100:fts_shutter_100:offen position-90:fts_shutter_80:geschlossen position-80:fts_shutter_80:geschlossen position-70:fts_shutter_70:geschlossen position-60:fts_shutter_60:geschlossen position-50:fts_shutter_50:geschlossen position-40:fts_shutter_40:offen position-30:fts_shutter_30:offen position-20:fts_shutter_20:offen position-10:fts_shutter_10:offen position-0:fts_shutter_10:geschlossen
attr Rollo_Dummy_1 device 1
attr Rollo_Dummy_1 drive-down-time-to-100 5
attr Rollo_Dummy_1 drive-up-time-to-100 7
attr Rollo_Dummy_1 funktionsweise Typ2
attr Rollo_Dummy_1 genericDeviceType blind
attr Rollo_Dummy_1 homebridgeMapping CurrentPosition=invert=1 TargetPosition=invert=1
attr Rollo_Dummy_1 kanal1 Rollo_Dummy_1_hoch
attr Rollo_Dummy_1 kanal2 Rollo_Dummy_1_runter
attr Rollo_Dummy_1 room Rollo
attr Rollo_Dummy_1 webCmd offen:geschlossen:schlitz:position
# Schalter für die Automatik generell -> Als Bedingung über alles
define Rollo_Dummy_1_Automatik_Schalter dummy
attr Rollo_Dummy_1_Automatik_Schalter alias Rollo 1
attr Rollo_Dummy_1_Automatik_Schalter devStateIcon Auto:fts_shutter_automatic Hand:fts_shutter_manual
attr Rollo_Dummy_1_Automatik_Schalter room Rollo
attr Rollo_Dummy_1_Automatik_Schalter setList state:Auto,Hand
attr Rollo_Dummy_1_Automatik_Schalter webCmd Auto:Hand
# Zeit, wann das Rollo Mo-Fr hoch fahren soll
define Rollo_Dummy_1_Werktags_hoch_Zeit dummy
attr Rollo_Dummy_1_Werktags_hoch_Zeit room Rollo
attr Rollo_Dummy_1_Werktags_hoch_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45
# Zeit, wann das Rollo Mo-Fr runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst per Dämmerungssensor
define Rollo_Dummy_1_Werktags_runter_Zeit dummy
attr Rollo_Dummy_1_Werktags_runter_Zeit room Rollo
attr Rollo_Dummy_1_Werktags_runter_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45
#Position auf die das Rollo Mo-Fr runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst auf die Position "Rollo_Dummy_1_Daemmerung_Position"
define Rollo_Dummy_1_Werktags_runter_Position dummy
attr Rollo_Dummy_1_Werktags_runter_Position room Rollo
attr Rollo_Dummy_1_Werktags_runter_Position setList state:0,10,20,30,40,50,60,70,80,90,100
# Zeit, wann das Rollo in Sa+So hoch fahren soll
define Rollo_Dummy_1_Wochenende_hoch_Zeit dummy
attr Rollo_Dummy_1_Wochenende_hoch_Zeit room Rollo
attr Rollo_Dummy_1_Wochenende_hoch_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45
# Zeit, wann das Rollo in Sa+So runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst per Dämmerungssensor
define Rollo_Dummy_1_Wochenende_runter_Zeit dummy
attr Rollo_Dummy_1_Wochenende_runter_Zeit room Rollo
attr Rollo_Dummy_1_Wochenende_runter_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45
#Position auf die das Rollo Sa+So runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst auf die Position "Rollo_Dummy_1_Daemmerung_Position"
define Rollo_Dummy_1_Wochenende_runter_Position dummy
attr Rollo_Dummy_1_Wochenende_runter_Position room Rollo
attr Rollo_Dummy_1_Wochenende_runter_Position setList state:0,10,20,30,40,50,60,70,80,90,100
# Schalter für die Sonnenschutzfunktion
define Rollo_Dummy_1_Sonnenschutz_Schalter dummy
attr Rollo_Dummy_1_Sonnenschutz_Schalter room Rollo
attr Rollo_Dummy_1_Sonnenschutz_Schalter setList state:Ein,Aus
attr Rollo_Dummy_1_Sonnenschutz_Schalter webCmd Ein:Aus
# Zeit, wann das Rollo wieder hoch fahren soll
define Rollo_Dummy_1_Sonnenschutz_hoch_Zeit dummy
attr Rollo_Dummy_1_Sonnenschutz_hoch_Zeit room Rollo
attr Rollo_Dummy_1_Sonnenschutz_hoch_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45
# Zeit, wann das Rollo zum Sonnenschutz runterfahren soll
define Rollo_Dummy_1_Sonnenschutz_runter_Zeit dummy
attr Rollo_Dummy_1_Sonnenschutz_runter_Zeit room Rollo
attr Rollo_Dummy_1_Sonnenschutz_runter_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45
# Position für Sonnenschutz zB 70%
define Rollo_Dummy_1_Sonnenschutz_Position dummy
attr Rollo_Dummy_1_Sonnenschutz_Position room Rollo
attr Rollo_Dummy_1_Sonnenschutz_Position setList state:0,10,20,30,40,50,60,70,80,90,100
# Schalter legt fest, ob das Rollo anstelle der in "Rollo_Dummy_1_????_runter_Zeit" eingestellten Zeit runterfahren soll wenn der Daemmerungssensor ausloest
define Rollo_Dummy_1_Daemmerung_Schalter dummy
attr Rollo_Dummy_1_Daemmerung_Schalter room Rollo
attr Rollo_Dummy_1_Daemmerung_Schalter setList state:Ein,Aus
attr Rollo_Dummy_1_Daemmerung_Schalter webCmd Ein:Aus
# Zeit, um die nach ausloesen des Daemmerungssensors verzoegert wird um das Rollo runter zu fahren
define Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit dummy
attr Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit room Rollo
attr Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit setList state:0,10,20,30,40,50,60,70,80,90,100,110,120
# Position auf die das Rollo bei Daemmerung fahren soll
define Rollo_Dummy_1_Daemmerung_Position dummy
attr Rollo_Dummy_1_Daemmerung_Position room Rollo
attr Rollo_Dummy_1_Daemmerung_Position setList state:0,10,20,30,40,50,60,70,80,90,100
# Die eigentliche Automatik...(Zeitgesteuertes Hoch und Runterfahren, Daemmerungsautomatik, Beschattungsautomatik,...)
define DOIF_Rollo_Dummy_1 DOIF ([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [([Rollo_Dummy_1_Werktags_hoch_Zeit]+[00:00])-([Rollo_Dummy_1_Werktags_hoch_Zeit]-[00:01])|0123456]) (set Rollo_Dummy_1 position 0)\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [([Rollo_Dummy_1_Wochenende_hoch_Zeit]+[00:00])-([Rollo_Dummy_1_Wochenende_hoch_Zeit]-[00:01])|78]) (set Rollo_Dummy_1 position 0)\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Daemmerung_Schalter] eq "Aus" and [([Rollo_Dummy_1_Werktags_runter_Zeit]+[00:00])-([Rollo_Dummy_1_Werktags_runter_Zeit]-[00:01])]) (set Rollo_Dummy_1 position [Rollo_Dummy_1_Werktags_runter_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Daemmerung_Schalter] eq "Aus" and [([Rollo_Dummy_1_Wochenende_runter_Zeit]+[00:00])-([Rollo_Dummy_1_Wochenende_runter_Zeit]-[00:01])]) (set Rollo_Dummy_1 position [Rollo_Dummy_1_Wochenende_runter_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Daemmerung_Schalter] eq "Ein" and [Daemmerungssensor] eq "on") (set Rollo_Dummy_1 position [Rollo_Dummy_1_Daemmerung_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Sonnenschutz_Schalter] eq "Ein" and [([Rollo_Dummy_1_Sonnenschutz_runter_Zeit]+[00:00])-([Rollo_Dummy_1_Sonnenschutz_runter_Zeit]-[00:01])]) (set Rollo_Dummy_1 position [Rollo_Dummy_1_Sonnenschutz_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Sonnenschutz_Schalter] eq "Ein" and [([Rollo_Dummy_1_Sonnenschutz_hoch_Zeit]+[00:00])-([Rollo_Dummy_1_Sonnenschutz_hoch_Zeit]-[00:01])]) (set Rollo_Dummy_1 position 0)\
attr DOIF_Rollo_Dummy_1 room Rollo
attr DOIF_Rollo_Dummy_1 wait 0:0:0:0:[Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit]:0:0
#Verzoegert den 5. Teil des DOIFs um die Zeit "Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit"
attr Rollo_Dummy_1 setReading_Werktags_hoch_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45
Zitat von: lenoxef am 29 März 2017, 13:15:17Wieso überhaupt einen Dummy neben dem eigentlichen Gerät?
Ich hätte auch gern für jedes Rollo nur einen Dummy,
Zitat von: lenoxef am 29 März 2017, 13:15:17Was war genau das Problem? Das Setzen oder die Auswertung (letzteres sollte mit z.B. "[Rollo_Dummy_1:Werktags_hoch_Zeit]" doch zu lösen sein)?
Ich habe es schon mal mit userReadings versucht, allerdings vergeblich.
Zitat von: Joker am 29 März 2017, 13:24:42
Also meine Rolladensteuerung setzt vor allem auf perl-Code, notifys und dummies.
ZitatWas war genau das Problem? Das Setzen oder die Auswertung (letzteres sollte mit z.B. "[Rollo_Dummy_1:Werktags_hoch_Zeit]" doch zu lösen sein)?
Zitat von: lenoxef am 29 März 2017, 13:38:05OK, nach Bemühen der commandref glaube ich, den falschen Begriff gewählt zu haben :(.
ich denke mein Problem ist viel trivialer. Wie bekomme ich das Reading "Werktags_hoch_Zeit" zum "Rollo_Dummy_1"?
attr MYSENSOR_99 mapReading_ir_send3 3 ir_send
attr Rollo_Dummy_1 mapReading_Werktags_hoch_Zeit 10 Werktags_hoch_Zeit
Zitat von: Beta-User am 29 März 2017, 13:30:49Aktuell nicht, aber ich kann die Tage mal versuchen das zusammenzuschreiben. Der Kern befindet sich ja prinzipiell in einer Datei.
Kann man Deine Lösung irgendwo nachlesen?
Das klingt sehr nach einer erstrebenswerten Lösung!
Gruß, Beta-User
Zitat von: Joker am 29 März 2017, 14:00:06Das wäre klasse!
Aktuell nicht, aber ich kann die Tage mal versuchen das zusammenzuschreiben. Der Kern befindet sich ja prinzipiell in einer Datei.
attr Rol.* userattr Auto_Modus:bei_Abwesenheit,immer Auto_hoch:aus,Zeit,Astro Auto_runter:aus,Zeit,Astro Auto_offen_Pos:Auf,Luft Auto_Himmelsrichtung Auto_Abschattung:ja,nein,verspaetet Auto_Zeit_hoch_frueh Auto_Zeit_hoch_spaet Auto_Zeit_hoch_WE_Urlaub Auto_Zeit_runter_frueh Auto_Zeit_runter_spaet
attr Rol.* Auto_Modus immer
attr Rol.* Auto_hoch aus
attr Rol.* Auto_runter aus
attr Rol.* Auto_offen_Pos Luft
attr Rol.* Auto_Himmelsrichtung 178
attr Rol.* Auto_Abschattung nein
attr Rol.* Auto_Zeit_hoch_frueh 07:30:00
attr Rol.* Auto_Zeit_hoch_spaet 09:00:00
attr Rol.* Auto_Zeit_hoch_WE_Urlaub 09:30:00
attr Rol.* Auto_Zeit_runter_frueh 16:30:00
attr Rol.* Auto_Zeit_runter_spaet 21:30:00
Zitat von: lenoxef am 29 März 2017, 13:38:05
ich denke mein Problem ist viel trivialer. Wie bekomme ich das Reading "Werktags_hoch_Zeit" zum "Rollo_Dummy_1"?
setreading Rollo_Dummy_1 Werktags_hoch_Zeit 08:15
defmod n_Rolladen_Window notify .*(closed|open)..to.VCCU. { winOpenShutterTester(AttrVal($NAME,'ShutterAssociated','none'), "Window") }
attr n_Rolladen_Window group Türen und Fenster
attr n_Rolladen_Window icon fts_shutter_automatic
defmod n_Rolladen_Stop notify .*:motor:.stop.* { winOpenShutterTester($NAME, "Rollo")}
attr n_Rolladen_Stop group Türen und Fenster
attr n_Rolladen_Stop icon fts_shutter_automatic
sub winOpenShutterTester($$) {
#Als Parameter muss der device-Name übergeben werden
my ($dev, $event) = @_;
#Erst mal prüfen, ob das übergebene device überhaupt existiert
if ($defs{$dev}) {
#Als erstes brauchen wir die Info, welcher Rolladen bzw. welcher Fenster- bzw. Türkontakt
#betroffen sind
#Also erst mal so tun, als wäre es der Rolladen gewesen, der augeslöst hat:
my $windowcontact = AttrVal($dev,'WindowContactAssociated',"none");
my $shutter=$dev;
if (!$shutter) {}
else {
#Wir speichern ein paar Infos, damit das nicht zu unübersichtlich wird
my $position = ReadingsVal($shutter,'level',0);
my $winState = Value($windowcontact);
my $maxPosition = AttrVal($shutter,'WindowContactOpenMaxClosed',100);
my $onHoldState = AttrVal($shutter,'WindowContactOnHoldState',"none");
#Jetzt können wir nachsehen, ob der Rolladen zu weit unten ist...
if($position < $maxPosition && $winState ne "closed" && $windowcontact ne "none") {
fhem("set $shutter $maxPosition");
fhem("attr $shutter WindowContactOnHoldState $position");
}
#...oder ob eine alte Position wegen Schließung des Fensters angefahren werden soll...
elsif ($event eq "Window" && $winState eq "closed" && $maxPosition ne "none") {
fhem("set $shutter $onHoldState");
fhem("attr $shutter WindowContactOnHoldState none");
}
#...oder ob die Positionsinfo wegen manueller Änderung gelöscht werden kann.
elsif ($event eq "Rollo" && $onHoldState ne "none" && $position ne $maxPosition) {
fhem("attr $shutter WindowContactOnHoldState none");
}
}
}
}
sub winShutterAssociate($$$) {
#Als Parameter müssen die Namen vom Fensterkontakt und Rolladen übergeben werden sowie der Maxlevel bei Fensteröffnung
my ($windowcontact, $shutter, $maxPosition) = @_;
my ($hash, @param) = @_;
#Erst mal prüfen, ob die Parameter sinnvoll sind
if ($defs{$windowcontact} && $defs{$shutter}) {
if (AttrVal($shutter,'subType', undef) eq "blindActuator" && AttrVal($windowcontact,'subType',undef) eq "threeStateSensor") {
my $oldAttrWin = AttrVal($windowcontact,'userattr',undef);
my $oldAttrRollo = AttrVal($shutter,'userattr',undef);
#Jetzt können wir sehen, ob und welche notwendigen userattr vorhanden sind
#und ggf. Werte zuweisen
if(index($oldAttrWin,"ShutterAssociated") < 0){
fhem("attr $windowcontact userattr $oldAttrWin ShutterAssociated");
}
fhem("attr $windowcontact ShutterAssociated $shutter");
if(index($oldAttrRollo,"WindowContactAssociated") < 0) {
fhem("attr $shutter userattr $oldAttrRollo WindowContactAssociated");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
fhem("attr $shutter WindowContactAssociated $windowcontact");
if(index($oldAttrRollo,"WindowContactOnHoldState") < 0) {
fhem("attr $shutter userattr $oldAttrRollo WindowContactOnHoldState");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
if(index($oldAttrRollo,"WindowContactOpenMaxClosed") < 0) {
fhem("attr $shutter userattr $oldAttrRollo WindowContactOpenMaxClosed");
}
fhem("attr $shutter WindowContactOpenMaxClosed $maxPosition");
}
else { return "One of the devices has wrong subtype";}
}
else { return "One of the devices does not exist";}
}
{ winShutterAssociate("Fenster_Wohnzimmer_SSW","Rolladen_WZ_SSW",10) }
attr Fenster_Wohnzimmer_SSW userattr ShutterAssociated
attr Fenster_Wohnzimmer_SSW ShutterAssociated Rolladen_WZ_SSW
attr Rolladen_WZ_SSW userattr room_map structexclude WindowContactAssociated WindowContactOnHoldState WindowContactOpenMaxClosed
attr Rolladen_WZ_SSW WindowContactAssociated Fenster_Wohnzimmer_SSW
attr Rolladen_WZ_SSW WindowContactOnHoldState none
attr Rolladen_WZ_SSW WindowContactOpenMaxClosed 10
Zitat von: Beta-User am 28 März 2017, 07:47:18Nach dem Testen der notifys (ich bleib jetzt dabei ;) ) würde mir auch folgender Ansatz gefallen:
Zu meinen Userreadings:
Hatte weniger an hübsche Osteuropäerinnen gedacht 8), sondern an eine Unterscheidung zwischen WE/Ferien ("7") und unter der Woche ("8"). Gemeint ist also z.B. "früheste Zeit am WE" und "späteste Zeit am WE", dazwischen wird über einen Helligkeitswert entschieden, wann genau der Rollanden hoch soll (bzw. dann wieder runter).
Dabei würden diese Werte nur herangezogen, wenn das "Grundreading" "AutoMode" auf Single steht, ansonsten wäre das analog aus der Gruppenzugehörigkeit abzuleiten.
Die WindowContact-Angaben hätte ich für eine generische Ablösung der obigen notify-Struktur genommen (habe aktuell 2 davon, aber eben nur für die beiden Türen mit Jalousien, nicht für alle Fenster).
Zitat von: Beta-User am 28 März 2017, 07:47:18Ich hatte auch darüber nachgedacht, das Modul ROLLO zu nutzen, habe dann aber die Zeiten in den Homematic-Aktoren direkt gespeichert (und vorher ewig gemessen). Mein Problem dabei war, dass die Fahrzeiten von den obersten und untersten Positionen bis exakt zur Mitte unterschiedlich sind. Die Mitte des Rollladens ist die Mitte des Fensters und mein Rollladen hat beim Erreichen der unteren Fensterpositionen noch Schlitze offen - um die zu schließen, muss er noch weiter fahren. Um irgendwelche Positionen (z.B. 30%) wiederholt halbwegs exakt von der untersten (Rollladen komplett zu) oder obersten (Rollladen komplett offen) Position anfahren zu können, habe ich unterschiedliche Fahrzeiten konfiguriert. Dabei hat mir http://heinz-otto.blogspot.de/2016_01_01_archive.html (http://heinz-otto.blogspot.de/2016_01_01_archive.html) geholfen, da die Aktoren erst etwas später abschalten. Zusätzlich habe ich für das Öffnen eine längere Fahrt gespeichert, da das Öffnen ja eigentlich erst beginnt, wenn die Schlitze des Rollladens offen sind und er die unterste Fensterposition erreicht. Damit habe ich mich dann an die unterschiedlichen Fahrzeiten zum Öffnen und Schließen rangetastet.
Die HM-Teile sollte man auch entsprechend konfigurieren, die Parameter sind "driveDown", "driveTurn" und "driveUp", dann kann man da auch die %-Öffnung usw. problemlos einstellen (die Parameter werden auf dem Aktor gespeichert). Das Modul bringt also nur dann Vorteile, wenn es darüber hinaus eine Funktionalität hat (?).
R-driveDown 35.5 s
R-driveTurn 0.5 s
R-driveUp 43 s
Zitat von: Beta-User am 28 März 2017, 07:47:18Interessanter Gedanke, aber warum verlässt Du dich nicht auf Ereignisse? Z.B. zeitlichen trigger durch at/DOIF oder Twilight-Helligkeitswert?
Ansonsten hätte ich dann noch über ein Dauer-at (alle 5 Minuten oder so) alle Rolläden durchgegangen und geprüft, ob etwas zu tun ist (Anfangszeit überschritten, Helligkeitswert über- bzw. unterschritten, späteste Zeit erreicht/überschritten).
Zitat von: Joker am 29 März 2017, 13:24:42Da wäre ich auch interessiert zu lernen...
Also meine Rolladensteuerung setzt vor allem auf perl-Code, notifys und dummies.
Zitat von: Beta-User am 03 April 2017, 11:40:37Respekt. Ich sehe schon, das nächste Wochenende ist versaut mit Nachstellen, Testen und Verstehen. Hoffe, meine Frau ist nicht im Garten...
So, nach einigen Experimenten die vergangenen Tage nachfolgend mal einen Zwischenstand zu einer Lösung auf Basis von notify, perl und userattr, allerdings erst mal ohne Zeitsteuerung und mit nur einer Lüftungsposition (ist für meine Zwecke ausreichend).
Zitat von: Beta-User am 03 April 2017, 11:40:37Interessanter Ansatz. Nur so ein Gedanke - einige von uns haben unabhängig voneinander unterschiedlichste Ansätze zur Rollladensteuerung entwickelt. Wäre das nicht etwas für ein eigenes Modul? Ok, ich gebe zu, ich habe keine Ahnung, wie aufwendig und pflegeintensiv das ist. Aber hier sind ein paar echt gute Ideen diskutiert worden.
- Was die zukünftige Pflege des ganzen angeht, gab es im Beitrag "Rollosteuerung für große Installationen (https://forum.fhem.de/index.php/topic,61844.0.html)" eine recht interessante Readingsgroup-Lösung, die man allerdings anpassen müßte (das dürfte aber kein Hexenwerk sein).
Zitat von: Beta-User am 04 April 2017, 08:10:18Das finde ich auch. Ich habe das in meiner FHEM-Installation konsequent so durchgezogen, auch wenn es nur one-liner sind: Ein notify ruft bei mir immer eine perl-Funktion auf (teilweise auch mehrere), die folgendem Namensschema folgt:
Die Kombination notify/at->perl@myUtils ist m.E. sinnvoll, weil die Logik über einen "one-Liner" doch deutlich rausgeht
ZitatFür sehr gut halte ich auch den Ansatz, Parametrierungsinformationen usw. beim zu schaltenden Device direkt abzuspeichern. Das hält es einigermaßen übersichtlich; wenn das mit der readingsgroup dann visualisiert (und parametriert) werden kann, ist auch die Vielzahl der Infos gut handhabbar, die bei einem HM-Rolladen liegen.Das ist vermutlich auch keine schlechte Idee. Ich habe das bei meinen Rollo-Funktionen so gelöst, dass in der 99_myUtilsBlinds.pm ein mehrdimensionales Array definiert ist, wo die Parametrierungen stehen, und die Funktionen schauen dort nach. Werde das mal hier posten- ist vermutlich eher nicht so gut, oder vielleicht doch, ich weiß es nicht... Vorteil ist jedenfalls, dass ich es zentral in der perl-Datei umparametrieren kann, allerdings halt nur per Code-Änderung und nicht per Maus- finde ich aber nicht schlimm, denn das soll auch nur jemand tun der weiß was er tut.
Zitat von: Joker am 04 April 2017, 12:24:40habe ich bisher in der Form auch noch nirgendwo gesehen, ist schon interessant, auf was man nicht alles kommt...
Ich habe das bei meinen Rollo-Funktionen so gelöst, dass in der 99_myUtilsBlinds.pm ein mehrdimensionales Array definiert ist, wo die Parametrierungen stehen, und die Funktionen schauen dort nach.
Zitatmodulname_onXXX, also z.B. blinds_onWindowClosedDanke für den Denkanstoß zur Namenskonvention, das Thema hatte ich bislang erfolgreich verdrängt.
Zitat von: Beta-User am 03 April 2017, 11:40:37Verständnisfrage: meine Türkontakte habe ich so konfiguriert, dass sie 3 Sekunden verzögert senden, um sauber den Zustand von "offen" nach "gekippt" zu erkennen. Dein "n_Rolladen_Window" würde dann auf open oder closed sauber triggern. Ein "defmod ... at" wäre damit hinfällig? Übrigens - ist das nicht ein "define n_Rolladen_Window notify ..." statt "defmod n_Rolladen_Window notify ..."?
- Das mit der Unterscheidung für zwei Lüftungspositionen würde wohl noch weitere userattr benötigen, eine Erweiterung der Auswertelogik und ggf. einen bei Öffnung eines Fensters verzögerten Aufruf (wegen des Zwischenereignisses "ganz offen" vor "gekippt"; "defmod <name> at ...").
Zitat von: Beta-User am 03 April 2017, 11:40:37Da dein "n_Rolladen_Window" auch auf open triggert, müsste m. M. nach die Routine winOpenShutterTester ergänzt werden um eine Abfrage etwa der Art
- Da derzeit nicht abgefragt wird, ob der Motor gerade läuft (denkbar, wenn das Fenster geöffnet wird oder zukünftig bei einem Zeitereignis usw.), kann es wegen der Laufzeit der Rolläden ggf. zu Seiteneffekten kommen. Dazu habe ich noch keine Idee und muß mal sehen, ob das überhaupt ein praxisrelevantes Problem ist.
elsif ($event eq "Window" && $shutterMotorState eq "down" && $emergencyStop eq "yes"){
fhem("set $shutter stop");
}
Zitat von: Beta-User am 03 April 2017, 11:40:37Gedanke:
- Planungen: erst mal um eine Zeitsteuerung erweitern, in einem weiteren Schritt dann ggf. um Beschattung (dachte an eine 360°-Angabe für jeden Rolladen). Das wird aber dauern, wie eingangs erwähnt, bin ich erst mal dabei zu ergründen, wie man mit perl überhaupt "programmiert".
define wdt WeekdayTimer timer_rollo_n !$we|{sunrise_abs("HORIZON=0.0",0,"6:00","8:00")}|auf $we|{sunrise_abs("HORIZON=0.0",0,"7:00","9:00")}|auf {sunset_abs("HORIZON=0.0",0,"17:00","22:00")}|zu
define wdt WeekdayTimer .*_Rollo_.* \
Mo|AttrVal($NAME,'mo_auf','none')|auf Mo|AttrVal($NAME,'mo_zu','none')|zu \
Di|AttrVal($NAME,'di_auf','none')|auf Di|AttrVal($NAME,'di_zu','none')|zu \
...
So|AttrVal($NAME,'so_auf','none')|auf So|AttrVal($NAME,'so_zu','none')|zu \
Zitat von: Beta-User am 03 April 2017, 11:40:37Harter Stoff. Muss ich erst durchdringen. Würde das gerne aber irgendwie vereinfachen, da auf Dauer vermutlich schwer pflegbar.
- Was die zukünftige Pflege des ganzen angeht, gab es im Beitrag "Rollosteuerung für große Installationen (https://forum.fhem.de/index.php/topic,61844.0.html)" eine recht interessante Readingsgroup-Lösung, die man allerdings anpassen müßte (das dürfte aber kein Hexenwerk sein).
Zitat von: Beta-User am 04 April 2017, 13:38:27Interessante Gedanken. Ich würde noch einen hinzufügen - fhem ist eine OpenSource-Lösung geboren aus der Not (oder Interesse) eines Einzelnen, der am Anfang alles selbst codiert und dokumentiert hat. Eine Rollladensteuerung ist dann einfach nur noch banal :). Viele proprietäre (Closed-Source) Lösungen zielen darauf, schnell sichtbare Ergebnisse zu liefern, Kompromissbereitschaft vorausgesetzt. Standard-Use-Cases nicht mitzuliefern wäre dann verkaufshemmend... Und selber basteln macht halt auch wirklich Spaß, ich bin bei Punkt 4 dabei...
Am Rande und off-Topic:
Warum ist es eigentlich so, dass zu dieser Standardaufgabe in praktisch jeder Installation (und dann noch bei einer so weit verbreiteten Hardware) jeder immer wieder das Rad neu erfindet, so von Grund auf? Ich behaupte mal, dass es (jedenfalls bei mir) nicht an ausgiebiger Recherche dazu fehlt. Es gibt zwar auch im Wiki ein paar Musterlösungsansätze, aber nichts, das ich als in jedem Punkt nachahmenswerten Ansatz empfunden habe bzw. als etwas, das einfach auf meine Bedürfnisse anzuwenden.
Mutmaßungen:
- Für wirklich Programmiererfahrene ist das zu trivial und hier hat es nur diesen Typ User ( ::))...
- Die Zahl der zu berücksichtigenden Informationsquellen und Wünsche ist zu groß, um was "von der Stange" anzubieten
- DOIF ist (jedenfalls aus Sicht der "Nichtprogrammierer") zu gut und mit etwas Hilfe im Forum geht es einfach zu parametrieren
- Der Weg ist das Ziel, an sowas hat jeder Spaß und daher soll auch jeder mal müssen?!?
-...?!?
Na ja, jedenfalls Danke an alle, die mit ihren Beispielen (u.a.) hier Denkanstöße und Lösungsansätze geliefert haben. Ein bißchen ist es für mich schon so, dass Punkt 4 greift ;), und: nachdem ich erste perl-Erfolge hatte, ist perl-scripting für mich zukünftig das Mittel der Wahl ;).
Zitat von: spi3845 am 05 April 2017, 01:06:53Der Gedanke hierzu kam mir erst später, muss ich noch prüfen: DOIF statt WeekdayTimer? Hier schließt sich der Kreis :)
Diesen WeekdayTimer würde ich gerne noch generalisieren, damit die Zeiten nicht direkt drin stehen, sondern aus den userattr der entsprechenden Rollläden (die alle irgendwie heißen wie eg_Rollo_WoZi_li) ausgelesen werden. Geht so etwas überhaupt? Ich denke da an (der Übersichtlichkeit wegen auf mehrere Zeilen verteilt):Code Auswählendefine wdt WeekdayTimer .*_Rollo_.* \
Mo|AttrVal($NAME,'mo_auf','none')|auf Mo|AttrVal($NAME,'mo_zu','none')|zu \
Di|AttrVal($NAME,'di_auf','none')|auf Di|AttrVal($NAME,'di_zu','none')|zu \
...
So|AttrVal($NAME,'so_auf','none')|auf So|AttrVal($NAME,'so_zu','none')|zu \
Zitat von: spi3845 am 05 April 2017, 01:06:53Harter Stoff, ja, aber mein Eindruck ist gerade andersrum: Wenn man das mal hat, ist es super-einfach, einzelne Parameter anzupassen. Aber ich habe da auch erst mal nur Bahnhof, Abfahrt... verstanden, muß mich da auch erst eindenken.
Harter Stoff. Muss ich erst durchdringen. Würde das gerne aber irgendwie vereinfachen, da auf Dauer vermutlich schwer pflegbar.
Zitat von: spi3845 am 05 April 2017, 01:39:05Dazu erwartest Du keinen ernsthaften Kommentar, oder? 8)
Der Gedanke hierzu kam mir erst später, muss ich noch prüfen: DOIF statt WeekdayTimer? Hier schließt sich der Kreis :)
Zitat von: Beta-User am 05 April 2017, 10:28:43
Hi Bernd,
sorry, hatte den Quervergleich nicht gemacht ::).
Ist aber erst mal schön zu hören, dass das Konzept mit dem Auslesen der userattr an sich zu funktionieren scheint.
Anmerkung noch zu der notify-Sache:
Es dürfte einfacher sein, wenn man das in 2 Subfunktionen teilt, nämlich einen "Rahmenpart", der alle Rolläden dann einzeln an die eigentliche "Mache mir at's"-Funktion (für den einzelnen Rolladen) schickt. Dann sollte man diese Teilfunktion nämlich einfacher vom notify aus direkt mit Angabe des betreffenden Rolladens aufrufen können. Aber wie gesagt: bin auch nur am Experimentieren...
attr Rol.* userReadings Auto_Modus:bei_Abwesenheit,immer Auto_hoch:aus,Zeit,Astro Auto_runter:aus,Zeit,Astro Auto_offen_Pos:Auf,Luft Auto_Himmelsrichtung Auto_Abschattung:ja,nein,verspaetet Auto_Zeit_hoch_frueh Auto_Zeit_hoch_spaet Auto_Zeit_hoch_WE_Urlaub Auto_Zeit_runter_frueh Auto_Zeit_runter_spaet Auto_Zufall_Minuten
sub randomtime_with_realtime($;$;$)
{
my $ZtA;
my ($MeH,$MeM,$MeS)=split(':',shift(@_));
my $MeB=shift(@_);
my $MeD=shift(@_);
if ($MeD eq '+') {$ZtA = int($MeH*3600 + $MeM*60 + rand($MeB*60) + $MeS);} # Minuten addieren
else {$ZtA = int($MeH*3600 + $MeM*60 - rand($MeB*60) + $MeS);} # Minuten subtrahiern
my $ZtH = int($ZtA/3600);
my $ZtM = int(($ZtA-$ZtH*3600)/60);
my $ZtS = int($ZtA-($ZtH*3600+$ZtM*60));
return sprintf("%2.2d:%2.2d:%2.2d",$ZtH,$ZtM,$ZtS);
}
sub Auto_Rol_calc_at($)
{
#Als Parameter muss der device-Name übergeben werden
my $dev=shift(@_);
#Erst mal prüfen, ob das übergebene device überhaupt existiert
if ($defs{$dev}) {
my $Hoch_Zeit;
my $Runter_Zeit;
my $hoch_at;
my $runter_at;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
#Aus dem device werden nun, sofern vorhanden, die ganzen Attribut ausgelesen.
#Wenn das Attribut nicht vorhanden ist, bekommt es einen Standardwert (z.B. 'nv' für nicht vorhanden)
my $A_Modus=AttrVal($dev,'Auto_Modus ','immer');
my $A_hoch=AttrVal($dev,'Auto_hoch','aus');
my $A_runter=AttrVal($dev,'Auto_runter','aus');
my $A_offen_Pos=AttrVal($dev,'Auto_offen_Pos','Luft');
#my $A_Himmelsrichtung=AttrVal($dev,'Auto_Himmelsrichtung',0);
#my $A_Abschattung=AttrVal($dev,'Auto_Abschattung','nein');
my $A_Zeit_hoch_frueh=AttrVal($dev,'Auto_Zeit_hoch_frueh','07:30:00');
my $A_Zeit_hoch_spaet=AttrVal($dev,'Auto_Zeit_hoch_spaet','09:00:00');
my $A_Zeit_hoch_WE_Urlaub=AttrVal($dev,'Auto_Zeit_hoch_WE_Urlaub','09:30:00');
my $A_Zeit_runter_frueh=AttrVal($dev,'Auto_Zeit_runter_frueh','16:30:00');
my $A_Zeit_runter_spaet=AttrVal($dev,'Auto_Zeit_runter_spaet','21:30:00');
my $A_Zufall_Minuten=AttrVal($dev,'Auto_Zufall_Minuten','30');
my $A_Zufall_Sekunden=$A_Zufall_Minuten*60;
my $Raeume=AttrVal($dev,'room','');
#Festlegen des Namens für die Timer, die angelegt werden um den Rollladen zu gewünschter
#Zeit zu fahren.
#my $Rol_hoch_Timername=$dev.'_hochTimer';
#my $Rol_runter_Timername=$dev.'_runterTimer';
my $Rol_hoch_Timername='Rol_Timer_hoch_'.$dev;
my $Rol_runter_Timername='Rol_Timer_runter_'.$dev;
my $Rol_at='Timer_build_at_'.$dev;
# #Sollten diese Timer bereits existieren, so werden sie zunächst gelöscht.
Log 1,"delete $Rol_hoch_Timername" if ($defs{$Rol_hoch_Timername});
fhem("delete $Rol_hoch_Timername") if ($defs{$Rol_hoch_Timername});
Log 1,"delete $Rol_runter_Timername" if ($defs{$Rol_runter_Timername});
fhem("delete $Rol_runter_Timername") if ($defs{$Rol_runter_Timername});
Log 1,"delete Timer_build_at_$dev" if ($defs{$Rol_at});
fhem("delete Timer_build_at_$dev") if ($defs{$Rol_at});
fhem("setreading $dev Auto_hoch_Zeit --:--:--");
fhem("setreading $dev Auto_hoch_Pos ---");
fhem("setreading $dev Auto_hoch_Zeit --:--:--");
$Hoch_Zeit = $A_Zeit_hoch_WE_Urlaub; # Zeit zum Hochfahren mit der Wochenend- bzw. Urlaubs-Zeit vorbesetzen
if ($wday > 5) {goto ABWESENHEITSCHECK;} # Wochenende oder Urlaub? ==> dann Sprung (Urlaub noch nicht vorgesehen)
if ($A_hoch eq 'aus') {goto CHECK_SET_DOWN_TIME;} # Automatik für morgens ausgeschaltet? ==> dann Sprung!
elsif ($A_hoch eq 'Astro'){ # Automatik auf Astro-Programm?
$Hoch_Zeit = sunrise_abs("REAL",$A_Zufall_Sekunden-rand($A_Zufall_Sekunden*2),randomtime_with_realtime("$A_Zeit_hoch_frueh","$A_Zufall_Minuten","+"),randomtime_with_realtime("$A_Zeit_hoch_spaet","$A_Zufall_Minuten","-"));
}
elsif ($A_hoch eq 'Zeit'){ # Automatik auf normalem Zeitprogramm?
$Hoch_Zeit = randomtime_with_realtime("$A_Zeit_hoch_frueh","$A_Zufall_Minuten","+");
}
ABWESENHEITSCHECK:
$hoch_at = "define $Rol_hoch_Timername at $Hoch_Zeit set $dev $A_offen_Pos";
fhem("$hoch_at");
fhem("attr $Rol_hoch_Timername room $Raeume");
fhem("setreading $dev Auto_hoch_Zeit $Hoch_Zeit");
fhem("setreading $dev Auto_hoch_Pos $A_offen_Pos");
CHECK_SET_DOWN_TIME:
if ($A_runter eq 'aus') {goto ENDE;} # Automatik für abends ausgeschaltet? ==> dann Sprung!
elsif ($A_runter eq 'Astro'){ # Automatik auf Astro-Programm?
$Runter_Zeit = sunset_abs("REAL",$A_Zufall_Sekunden-rand($A_Zufall_Sekunden*2),randomtime_with_realtime("$A_Zeit_runter_frueh","$A_Zufall_Minuten","+"),randomtime_with_realtime("$A_Zeit_runter_spaet","$A_Zufall_Minuten","-"));
}
elsif ($A_runter eq 'Zeit'){ # Automatik auf normalem Zeitprogramm?
$Runter_Zeit = randomtime_with_realtime("$A_Zeit_runter_spaet","$A_Zufall_Minuten","-");
}
$runter_at = "define $Rol_runter_Timername at $Runter_Zeit set $dev off";
fhem("$runter_at");
fhem("attr $Rol_runter_Timername room $Raeume");
fhem("setreading $dev Auto_runter_Zeit $Runter_Zeit");
ENDE:
my $TimerErzeugerName='TimerErzeuger_'.$dev;
fhem("define $TimerErzeugerName at *00:05:00 {Auto_Rol_calc_at(\"$dev\")}") if (!($defs{$TimerErzeugerName})); # Timer zum Starten dieser Funktion erzeugen, falls noch nicht vorhanden
fhem("attr $TimerErzeugerName room $Raeume");
}
}
{Auto_Rol_calc_at("Rol.Bad")}
ZitatUserAttribute = UserAttribute + <weitere UserAttribute>(wenn noch nicht vorhanden), aber eben Rolladen für Rolladen und mit Schreiben der Attribute, auch wenn sie bereits belegt sein sollten.
Zitat von: Beta-User am 05 April 2017, 17:45:08[Ähem] wenn ich mir was wünschen dürfte - eine Funktion, die alle Rollos mit userattr initial belegt [/Ähem]
Einen (ungetesteten) update der Bausteine habe ich übrigens auf github (https://github.com/rejoe2/FHEM/tree/master/myShutter) liegen, da gäbe es dann auch den "Tilted"-Level (wenn es klappt ;)). Wer meint, Fehler gefunden zu haben oder sinnvolle Ergänzungen, kann gerne die github-Funktionalität nutzen (schon wieder was, in das ich mich etwas einarbeiten sollte, hoffe, das klappt ggf. so einfach ::)). Wer Vorschläge hat für eine bessere, ggf. einheitliche Benennung der Attribute und Funktionen: her damit, jetzt ist es (jedenfalls für mich) noch recht einfach, das zu ändern.
Zitat von: Beta-User am 03 April 2017, 11:40:37Ist Dir beim Testen irgend etwas aufgefallen bzgl. der Seiteneffekte?
- Da derzeit nicht abgefragt wird, ob der Motor gerade läuft (denkbar, wenn das Fenster geöffnet wird oder zukünftig bei einem Zeitereignis usw.), kann es wegen der Laufzeit der Rolläden ggf. zu Seiteneffekten kommen. Dazu habe ich noch keine Idee und muß mal sehen, ob das überhaupt ein praxisrelevantes Problem ist.
Zitat von: spi3845 am 05 April 2017, 17:58:12Hm, da muß ich erst nachdenken, was Du mir mitteilen willst... Die Rolläden, die ich bisher angefaßt habe, hatten schon ein userattr gesetzt, aber die FK's eher nicht (?). Ergo wage ich zu behaupten, dass die Hilfsfunktion ein "attr userattr" anlegt, wenn es nicht vorhanden ist. War das gemeint? Oder bräuchtest Du ein weiteres userattr mit dem Namen "initial"?
[Ähem] wenn ich mir was wünschen dürfte - eine Funktion, die alle Rollos mit userattr initial belegt [/Ähem]
Zitat von: spi3845 am 05 April 2017, 17:58:12Bisher nicht, aber der Gedanke "notify auch für motor:down" gefällt mir sehr gut und sollte ebenso weiterhelfen wie der Stups zur Erkenntnis, dass "in Bewegung" wohl ein schlichtes "!=stop" sein dürfte. Muß nur rausfinden, wie man ggf. ein "Taste runter gedrückt" von einem "set_90" unterscheidet und das letztere dann nicht versehentlich in ein "set_80" umwandelt (Ziellevel höher als Mindestlevel bei Öffnung).
Ist Dir beim Testen irgend etwas aufgefallen bzgl. der Seiteneffekte?
Zitat von: spi3845 am 05 April 2017, 17:58:12...kommt mir bekannt vor 8)...
P.S. Nächstes $we versaut, da weitere Tests :)
Zitat von: Beta-User am 05 April 2017, 18:23:13Si. Das war gemeint - für alle Rollläden, Fenster, Fensterkontakte und was sonst noch alles beim ersten Anlegen die entsprechenden userattr gleich mit anlegen und mit default-Werten belegen. Habe deine Funktion noch nicht im Detail angeschaut, daher der Wunsch...
Hm, da muß ich erst nachdenken, was Du mir mitteilen willst... Die Rolläden, die ich bisher angefaßt habe, hatten schon ein userattr gesetzt, aber die FK's eher nicht (?). Ergo wage ich zu behaupten, dass die Hilfsfunktion ein "attr userattr" anlegt, wenn es nicht vorhanden ist. War das gemeint?
Zitat von: Beta-User am 05 April 2017, 18:23:13Das ich das richtig verstehe - set_xx wird doch nur gesetzt, wenn der Rollladen-Level von fhem aus gesetzt wird. Bei einem Tastendruck direkt auf dem Aktor wird doch kein set_xx gesetzt oder irre ich mich da? Dann hätten wir doch eine Unterscheidung: motor!=stop und set_xx ==> per fhem getriggert, ansonsten per Taster.
Bisher nicht, aber der Gedanke "notify auch für motor:down" gefällt mir sehr gut und sollte ebenso weiterhelfen wie der Stups zur Erkenntnis, dass "in Bewegung" wohl ein schlichtes "!=stop" sein dürfte. Muß nur rausfinden, wie man ggf. ein "Taste runter gedrückt" von einem "set_90" unterscheidet und das letztere dann nicht versehentlich in ein "set_80" umwandelt (Ziellevel höher als Mindestlevel bei Öffnung).
Zitat von: Beta-User am 05 April 2017, 18:23:13Ein weiteres userattr das angibt, ob Lamellen zu berücksichtigen sind oder nicht. In dem Fall von Jalousien in Endstellung für einige Sekunden dann in andere Richtung fahren.
Eventuell bräuchte es noch eine Unterscheidung zwischen Rolladen (bei "down" sofort anhalten, ggf. wieder nach oben) und einer Jalousie (Drehbewegung der Lamellen zulassen bzw. alternativ die Lamellen nach Zwangsöffnung gleich wieder "nach unten" drehen, das ist aber vermutlich etwas komplizierter)
Zitat von: Beta-User am 05 April 2017, 07:56:26Dieses System läuft seit fast 2 Jahren sehr zufriedenstellend und mit den diversen Optimierungen wirklich vollautomatisch. Sollte außer dem Perlcode noch etwas unklar sein, bitte Bescheid geben, damit ich auch das ausführlicher beschreiben kann.
Harter Stoff, ja, aber mein Eindruck ist gerade andersrum: Wenn man das mal hat, ist es super-einfach, einzelne Parameter anzupassen. Aber ich habe da auch erst mal nur Bahnhof, Abfahrt... verstanden, muß mich da auch erst eindenken.
Zitat von: hugomckinley am 05 April 2017, 22:10:53Das wäre prima! Danke!
Da meine Lösung (https://forum.fhem.de/index.php/topic,61844.msg532545.html#msg532545 (https://forum.fhem.de/index.php/topic,61844.msg532545.html#msg532545)) anscheinend von einigen als interessant gesehen wird, kann ich gerne anbieten meinen (zugegebenermaßen) nicht ganz offensichtlichen Code besser zu kommentieren, um euch das Lesen zu erleichtern.
Zitat von: Beta-User am 05 April 2017, 17:45:08Auf die Schnelle ist mir folgendes aufgefallen (ok, so schnell war's auch nicht, musste erst Doku unter https://wiki.fhem.de/wiki/99_myUtils_anlegen (https://wiki.fhem.de/wiki/99_myUtils_anlegen) lesen :) ).
Einen (ungetesteten) update der Bausteine habe ich übrigens auf github (https://github.com/rejoe2/FHEM/tree/master/myShutter) liegen, da gäbe es dann auch den "Tilted"-Level (wenn es klappt ;)).
sub winShutterAssociate($$$) {
muss sub winShutterAssociate($$$$) {
heißen, ein $ fehlt.Zitat von: spi3845 am 06 April 2017, 00:48:28Kurze Anmerkung dazu: Dass sie auf Utils enden muss stimmt so nicht, scheinbar muss Utils irgendwo im Namen vorkommen (weiß es aber auch nicht näher). Meine Dateien heißen z.B. 99_myUtilsWindows, 99_myUtilsBlinds etc. und die werden auch unter "Edit files" angezeigt.
Damit die auf github liegende "99_myShutter.pm" in fhem unter "Edit files" angezeigt wird, muss sie "99_myShutterUtils.pm" heißen. Alles was auf Utils endet, wird angezeigt... Die initialize-Funktion muss "myShutterUtils_Initialize($$)" heißen (und damit dem Dateinamen entsprechen).
Zitat von: Beta-User am 06 April 2017, 07:45:11Klar, macht Sinn. Willst Du dann das Anfahren der unterschiedlichen Positionen aber nur im Zeitfenster durchführen, wenn die Rollläden per Timer runtergefahren wurden oder auch zu anderen Zeiten (z.B. Rollladen wurde tagsüber komplett runtergefahren und es macht jemand ein Fenster auf --> Rollladen fährt in Lüften-Position)?
winOpenShutterTester($$) ist tatsächlich im Moment rein ereignisorientiert und wird immer aufgerufen, wenn ein Rolladen hält oder ein Tür-/Fensterkontakt ein Ereignis meldet (tilted@github ist noch nicht getestet). Mit der Zeitsteuerung hat es (noch) nichts zu tun (das macht bei mir noch je Gruppe ein DOIF, deren Parametrierung ich nicht verstehe und die ich daher loswerden will), das wäre dann aber nach meiner bisherigen Idee einfach ein weiterer Aufrufparameter (vielleicht mit dem von einem Timer mitgelieferten Ziellevel, bei dem dann geprüft wird, ob das so "durchgewunken" werden kann oder ein neuer onHoldLevel-Wert geschriebenen wird und der zulässige max-Wert angefahren?).
Zitat von: Beta-User am 06 April 2017, 07:45:11Symbolischer Haken dran...
Das mit der userattr-Werteinitialisierung hat sich nach code-Analyse erledigt, nehme ich an? (sonst müßte man auf den HM-Maintainer zugehen, oder? ;))
Zitat von: Beta-User am 06 April 2017, 07:45:11Klingt gut. Etwas höher fahren, dann x Sekunden nach unten, dann erst onHoldLevel ändern.
Zum Drehen nach dem Hochfahren muß man wieder nach unten. Damit wäre man dann wieder unterhalb des Mindestlevels, also: Spiel von vorne => geht so nicht. Ansatz dazu wäre, den weiteren Parameter gleich dazu zu nutzen, erst einen Ticken in Höhe des Parameters zu weit nach oben zu fahren und dann erst wieder (automatisch wegen "stop" ;)) auf den eigentlichen Ziellevel. Dann muß man nur verhindern, dass der onHoldLevel gelöscht wird. Andere Ideen oder Anregungen?
Zitat von: Beta-User am 06 April 2017, 07:45:11Ganz klar Bahnhof ;). Ich versuche mal zu interpretieren:
Zu "motor:down" und "set_xx":
motor:down sollte sowohl bei manueller Steuerung über einen Taster wie auch bei FHEM-Kommandos kommen, set_xx nur, wenn FHEM-seitig angestoßen. Wenn wir auch FHEM-seitige Kommandos modifizieren, bleibt die Zwangsöffnung unabhängig von der Zeitsteuerung und man kann nichts falsch machen, wenn man andere als "unsere" Bausteine zur Steuerung verwendet. Daher halte ich es für gut, das gleich auch noch mit abzufangen. Nachvollziehbar oder zu sehr um's Eck gedacht?
Zitatset_xx nur, wenn FHEM-seitig angestoßenJa, wenn ich auf den Taster direkt drücke, sehe ich beim Aktor kein set_xx
ZitatWenn wir auch FHEM-seitige Kommandos modifizierenHm, was meinst Du mit modifizieren?
Zitat von: Joker am 06 April 2017, 15:31:34
Kurze Anmerkung dazu: Dass sie auf Utils enden muss stimmt so nicht, scheinbar muss Utils irgendwo im Namen vorkommen (weiß es aber auch nicht näher). Meine Dateien heißen z.B. 99_myUtilsWindows, 99_myUtilsBlinds etc. und die werden auch unter "Edit files" angezeigt.
Zitat von: spi3845 am 06 April 2017, 15:34:47Erklärungsversuch:
Ganz klar Bahnhof ;). Ich versuche mal zu interpretieren: Ja, wenn ich auf den Taster direkt drücke, sehe ich beim Aktor kein set_xx Hm, was meinst Du mit modifizieren?
Warum wollen wir die Bewegung erkennen? Um während der Abwärts-Bewegung eines Rollladens diesen beim Öffnen einer Tür oder eines Fensters anzuhalten? Also Einklemm- und Aussperrschutz? Wäre es dann nicht egal, ob der Rollladen von fhem oder per Taster abwärts gefahren wird? Ich denke da an spielende Kinder, der eine drückt auf den Taster und der andere macht das Fenster auf und hängt den Rüssel raus ???
Zitat von: Beta-User am 05 April 2017, 17:45:08Hallo Beta-User,
Einen (ungetesteten) update der Bausteine habe ich übrigens auf github (https://github.com/rejoe2/FHEM/tree/master/myShutter) liegen, da gäbe es dann auch den "Tilted"-Level (wenn es klappt ;)).
elsif ($event eq "Window" && $winState eq "closed" && $maxPosition ne "none") {
elsif ($event eq "Window" && $winState eq "closed" && $onHoldState ne "none") {
my $onHoldState = AttrVal($shutter,'WindowContactOnHoldState',"none");
if($onHoldState eq "none") { fhem("setreading $shutter:WindowContactOnHoldState $position");}
my $onHoldState = AttrVal($shutter,'WindowContactOnHoldState',"none");
my $onHoldState = ReadingsVal($shutter,'WindowContactOnHoldState',"none");
fhem("setreading $shutter:WindowContactOnHoldState none");
fhem("setreading $shutter WindowContactOnHoldState none");
Zitat von: Beta-User am 06 April 2017, 16:33:04Bestimmt :) Rudimentär würde mir ein locked Attribut einfallen (nennt man das Semaphore?), das dann von einem at nach z.B. 3 Sekunden wieder gelöscht würde. Solange es gesetzt ist, würde das Skript sich gleich wieder beenden (oder irgend etwas anderes tun). Das würde in etwa dem entsprechen, 3 Sekunden lang nicht auf Ereignisse motor:stop|up|down zu reagieren (vielleicht kann man auch das anders erreichen). Das Skript wird hier nicht blockiert, reagiert einfach nur auf bestimmte Ereignisse nicht.
Die Jalousiedrehung würde ich nicht blockierend gestalten (geht das überhaupt?)
Zitat von: Beta-User am 06 April 2017, 16:33:04Können alle Aktoren Rollläden/Jalousien auf x.5 Werte fahren?
Konzept dazu: ein numerisches Jalousie-Attribut kann gesetzt werden (Beispiel: "3"), der Rolladen soll beim ersten Durchlauf auf {WindowContactOpenMaxClosed-3.5} geschickt werden. Stoppt er dann auf genau diesem Wert, darf er wieder auf WindowContactOnHoldState zurück (neuer Fall für das perl-script, nur dass in diesem Fall die onHoldPosition nicht gelöscht werden soll). Durch den Zwischenziellevel (-3.5 statt -3) ist es praktisch ausgeschlossen, dass jemand mittels Taster oder FHEMWEB die Jalousie dahin geschickt hat ;).
Zitat von: Beta-User am 06 April 2017, 16:33:04Hoffentlich verstanden ???. Das ist dann eine Art Übersteuern des Zielwerts beim Schließen der Rollläden und Öffnen des Fensters. Also so?
Erklärungsversuch:
Gibt jemand irgendwie das Kommando, dass der Rolladen nach unten soll, soll er an der "richtigen" Stelle anhalten, ist das Fenster offen, also an der offen-Position, aber eben nur wenn diese unterhalb des Ziellevels liegt (oder dieses nicht angegeben wurde=Taster). Allerdings könnte es sein, dass wir z.B. durch unsere zeitgesteuerte Automatikfunktion ja wollen, dass das Fenster am Ende (irgendwann, ausgelöst durch Schließen des Fensters) dann weiterfährt. Dann muß einfach der Ziellevel des trigger-Ereignisses als neue onHoldPosition gesetzt werden...
Die Modifikation des triggernden "motor:down" würde also aus einem "set 20" ein "set 60" machen (bei WindowContactOpenMaxClosed=60) und die onHoldPosition auf 20 setzen.
Jetzt nachvollziehbar?
Zitat von: spi3845 am 09 April 2017, 00:42:11...definitiv, Danke für die Code-Analyse! Ich hoffe, mein perl-Verständnis, wird irgendwann besser ::).
Hoffe, die Änderungen machen Sinn... Meinen Dummies hat's gefallen ;)
defmod rg_Rolladen_Auto_Oeffnen readingsGroup <Gerät>,<Offen-Pos.>,<Gekippt-Pos.>,<Jalousie>,<On-Hold> (Rolladen_.*|Jalousie_.*)..:level,?WindowContactOpenMaxClosed,?WindowContactTiltedMaxClosed,?JalousieTurnLevel,?WindowContactOnHoldState,
attr rg_Rolladen_Auto_Oeffnen commands { 'WindowContactOpenMaxClosed' => 'WindowContactOpenMaxClosed:10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100','WindowContactTiltedMaxClosed' => 'WindowContactTiltedMaxClosed:10,20,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100',}
Zitat von: spi3845 am 09 April 2017, 01:10:06Ganz genau. Das wird dann aber wieder eine größerer Aufwand werden (jedenfalls mit meinen bescheidenen Kenntnissen), mal schauen, ob ich da heute Mittag auf der Terrasse ein paar Eingebungen habe ;). Ideen: wie immer willkommen...
Hoffentlich verstanden ???. Das ist dann eine Art Übersteuern des Zielwerts beim Schließen der Rollläden und Öffnen des Fensters. Also so?
Zitat von: Beta-User am 09 April 2017, 11:49:44Morgähn,
Beim Testen war leider der Teil mit tilted und Zwischenständen noch nicht ganz so in der Reaktion wie erhofft, neueste Version auf github sollte das jetzt besser können...
Zitat von: Beta-User am 09 April 2017, 07:46:17
Solche Text-Übungen, wie ein "set_off" zu trennen und dann aus "off" ein "0" zu machen, sind sicher nicht schwer. Wenn jemand dazu bereits fertigen code hat, den ich mir erst mühsam erarbeiten muß: Gerne her damit!
my $str = "The black cat climbed the green tree";
my $z = substr $str, 14, 7, "jumped from";
say $z; # climbed
say $str; # The black cat jumped from the green tree
Zitat von: Beta-User am 09 April 2017, 12:54:40Jalousie kann ich in Ermangelung an Hardware nicht testen. Habe den Code an Rollläden getestet und habe dazu zwei Fragen:
Er hat die Position nicht sauber angefahren, wenn der onHold-Wert zwischen open und tilted lag (beim Wechsel von open nach tilted).
Da ich zwischenzeitlich den Code auch im Hinblick auf Jalousien umgebaut hatte, waren Deine Anmerkungen nicht mehr 1:1 umsetzbar. Da war vermutlich mit der Jalousiefunktion ein Logikfehler reingekommen. Für Jalousien muß man ein weiteres Attribut setzen (lassen), das dann angibt, um wieviel zuerst zu weit nach oben gefahren werden soll (bei mir scheint 3 ein guter Wert zu sein).
Bastle grade noch an "motor:down", wird noch ein Weilchen dauern, aber die erste Vorverarbeitung der erforderlichen Werte sollte demnächst fertig sein. Das Einbauen in die Gesamtstruktur wird dann der spannende Teil 8).
elsif ($event eq "Rollo")
if ($event eq "Window")
elsif ($maxPosTilted < $onHoldState) { $maxPosTilted = $onHoldState; }
WindowContactOpenMaxClosed 30
WindowContactTiltedMaxClosed 10
WindowContactOnHoldState 20
Zitat von: Beta-User am 10 April 2017, 10:27:37Ist es.
Ziemlich tricky, das ganze...
#Wir speichern ein paar Infos, damit das nicht zu unübersichtlich wird
my $event = "Window";
my $windowcontact = "Fenster1";
my $position = 5; # Werte 0-100
my $winState = "open"; # Werte open, tilted oder closed
my $maxPosOpen = 30; # Lüften-Position bei winstate=open
my $maxPosTilted = 10; # Lüften-Position bei winstate=tilted
my $onHoldState = "none"; # "none" oder alte Position
#Jetzt können wir nachsehen, ob der Rolladen zu weit unten ist (Fenster offen)...
if($position < $maxPosOpen && $winState eq "open" && $windowcontact ne "none") {
print "fhem(\"set $shutter $maxPosOpen\")\n";
if($onHoldState eq "none") { print "fhem(\"setreading $shutter WindowContactOnHoldState $position\")\n"; }
}
#...(gekippt)...
elsif($winState eq "tilted" && $windowcontact ne "none") {
if($position < $maxPosTilted && $onHoldState eq "none") { print "fhem(\"setreading $shutter WindowContactOnHoldState $position\")\n"; }
elsif ($maxPosTilted < $onHoldState) { $maxPosTilted = $onHoldState; }
print "fhem(\"set $shutter $maxPosTilted\")\n";
}
#...oder ob eine alte Position wegen Schließung des Fensters angefahren werden soll...
elsif ($event eq "Window" && $winState eq "closed" && $onHoldState ne "none") {
print "fhem(\"set $shutter $onHoldState\")\n";
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")\n";
}
#...oder ob es sich um einen Stop zum Drehen der Jalousielamellen handelt...
elsif ($event eq "Rollo") {
#...oder die Positionsinfo wegen manueller Änderung gelöscht werden kann.
if ($position != $maxPosOpen && $position != $maxPosTilted && $onHoldState ne "none") {
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")\n";
}
}
Zitat von: spi3845 am 10 April 2017, 15:03:34Habe echt schon einen Knoten im Hirn >:(....
Ist es.
Zitat von: Beta-User am 10 April 2017, 15:30:24Und ich erst...
Habe echt schon einen Knoten im Hirn >:(....
Zitat von: Beta-User am 10 April 2017, 15:30:24Ich sehe vor lauter Ablaufplänen keinen Code mehr vor Augen, daher der Versuch alles zu minimieren...
Was "Trockenübungen" angeht, habe ich meine Zweifel, wie weit das trägt, aber einen Versuch wäre es wert. Der Soll-Ablauf an sich ist ja gar nicht sooo schwer... (Aber die Jalousifunktion gefällt mir, sollte eigentlich drin bleiben 8)).
Zitat von: Beta-User am 10 April 2017, 15:30:24Hm, das käme dann auf den Versuch darauf an. Ich glaube, wir könnten mit einer Semaphore etwas abfangen, die zu Beginn des Skripts auf "running" gesetzt und am Ende wieder gelöscht wird. Eine Abfrage ganz zu Beginn des Skripts auf =~ running beendet das Skript gleich wieder, weil es ja bereits läuft. Ggf. muss man die Semaphore aber auf den Namen des Device setzen, da eine mehrfache Ausführung für unterschiedliche Geräte nicht hinderlich ist.
- Sind die Events für die notifys OK oder kann man das noch besser begrenzen, um eventuelle Mehrfachauslösungen (oder zu frühe) zu vermeiden (ergo: sind ggf. bereits bestimmte Zustände vorab gesetzt oder nicht)?
- Anders formuliert: Inwiefern spielt die Reihenfolge eine Rolle, in der CUL_HM die EVENTS feuert bzw. wie herum berücksichtigt man das am besten.
Zitat von: Beta-User am 10 April 2017, 15:30:24Klingt gut. Vermutlich kann man einige Events zusammenfassen und gleich behandeln, aber das kann auch im Skript erfolgen.
- Wäre es nicht insgesamt besser, die Ereignisse ($EVENT) oder Teile davon an die subs zu übergeben statt des Texts? Dann kann man auch dort noch Duplikate aussortieren und hat "Rohevents" für den Fall, dass man das detailierter auswerten muß (für FK wohl egal, aber sonst habe ich die Hoffnung, dass das helfen würde...?).
Zitat von: Beta-User am 10 April 2017, 15:30:24Urgh, noch 'ne Baustelle. Was muss ich tun?
Ansonsten ist Github mit der Änderungsverfolgung wirklich hilfreich, auch wenn es die Formatierung zerhackt (ist wahrscheinlich eher ein Thema des internen Editors, da sieht das ok aus).
use Switch;
#Wir speichern ein paar Infos, damit das nicht zu unübersichtlich wird
my $event = "Window";
my $windowcontact = "Fenster1";
my $position = 8; # Werte 0-100
my $winState = "tilted"; # Werte open, tilted oder closed
my $maxPosOpen = 30; # Lüften-Position bei winstate=open
my $maxPosTilted = 10; # Lüften-Position bei winstate=tilted
my $onHoldState = "none"; # "none" oder alte Position
if($windowcontact eq "none") { die "Fehler, Türkontakt nicht zugeordnet"; } # in Subroutine dann return verwenden
switch($event){
case "Window" {
switch($winState){
case "open" {
if($position < $maxPosOpen) {
print "fhem(\"set $shutter $maxPosOpen\")";
if ($onHoldState eq "none") { print "fhem(\"setreading $shutter WindowContactOnHoldState $position\")"; }
}
}
case "tilted" {
if($position < $maxPosTilted) {
print "fhem(\"set $shutter $maxPosTilted\")";
if ($onHoldState eq "none") { print "fhem(\"setreading $shutter WindowContactOnHoldState $position\")"; }
}
}
case "closed" {
if ($onHoldState ne "none") {
print "fhem(\"set $shutter $onHoldState\")";
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")";
}
}
else { print "Fehler: unbekannter winState $winState\n" }
}
case "Rollo" {
if($position != $maxPosOpen && $position != $maxPosTilted && $onHoldState ne "none") {
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")";
}
}
}
else { print "Fehler: unbekannter event $event" }
}
sudo apt-get install libswitch-perl
Zitat von: spi3845 am 10 April 2017, 16:22:10Kann ich irgendwo für Dummies nachlesen, was das ist und wie das geht?!?
Ich glaube, wir könnten mit einer Semaphore etwas abfangen, die zu Beginn des Skripts auf "running" gesetzt und am Ende wieder gelöscht wird.
ZitatUrgh, noch 'ne Baustelle. Was muss ich tun?War nicht als Aufforderung gedacht, an der Stelle nutze ich grade auch nicht den "git commit"-Mechanismus auf der Konsole vom PI, sondern die Web-Schnittstelle. Bei Interesse kannst Du ja einen eigenen Account beantragen (kostet für öffentlich sichtbaren code nichts) und mein Repo "forken". Damit könntest Du mir Änderungswünsche übermitteln.
Zitat von: Beta-User am 10 April 2017, 16:57:15Ich habe gerade einen kleinen Run auf Switch ;)
Zu Switch und so melde ich mich ggf. später, sieht interessant aus, wobei ich mich schon an die vielen elsif's gewöhnt habe...
use Switch;
#Wir speichern ein paar Infos, damit das nicht zu unübersichtlich wird
my $event = "Timer_up";
my $windowcontact = "Fenster";
my $position = 0; # Werte 0-100
my $winState = "closed"; # Werte open, tilted oder closed
my $maxPosOpen = 30; # Lüften-Position bei winstate=open
my $maxPosTilted = 10; # Lüften-Position bei winstate=tilted
my $posBlindClosed = 0; # Position, auf die Rollo beim Schließen gefahren werden soll
my $posBlindOpened = 100; # Position, auf die Rollo beim Öffnen gefahren werden soll
my $posBlindNotToOpen = 20; # Position, ab der erst ein Rollo bei offener Tür automatisch geöffnet wird, um ein Eindringen zu verhindern
my $onHoldState = "none"; # "none" oder alte Position
if($windowcontact eq "none") { die "Fehler, Türkontakt nicht zugeordnet"; } # in Subroutine dann return verwenden
switch($event){
case "Window" {
switch($winState){
case "open" {
if($position < $maxPosOpen) {
print "fhem(\"set $shutter $maxPosOpen\")";
if ($onHoldState eq "none") { print "fhem(\"setreading $shutter WindowContactOnHoldState $position\")"; }
}
}
case "tilted" {
if($position < $maxPosTilted) {
print "fhem(\"set $shutter $maxPosTilted\")";
if ($onHoldState eq "none") { print "fhem(\"setreading $shutter WindowContactOnHoldState $position\")"; }
}
}
case "closed" {
if ($onHoldState ne "none") {
print "fhem(\"set $shutter $onHoldState\")";
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")";
}
}
else { print "Fehler: unbekannter winState $winState\n" }
}
}
case "Timer_down" {
switch($winState){
case "open" { # Aussperrschutz, nichts tun
print "fhem(\"setreading $shutter WindowContactOnHoldState $posBlindClosed\")";
}
case "tilted" { # auf Lüften-Position gekipptes Fenster fahren, als alte Position Schließposition des Rollos speichern
print "fhem(\"set $shutter $maxPosTilted\")";
print "fhem(\"setreading $shutter WindowContactOnHoldState $posBlindClosed\")";
}
case "closed" {
print "fhem(\"set $shutter $posBlindClosed\")";
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")";
}
else { print "Fehler: unbekannter winState $winState\n" }
}
}
case "Timer_up" {
switch($winState){
case "open" { # Eindringen von außen verhindern
if($position > $posBlindNotToOpen) {
print "fhem(\"set $shutter $posBlindOpened\")";
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")";
}
else { print "fhem(\"setreading $shutter WindowContactOnHoldState $posBlindOpened\")"; }
}
case ["tilted","closed"] { # Rollos eines gekipptes Fenster können geöffnet werden, ansonsten tilted wie open behandeln
print "fhem(\"set $shutter $posBlindOpened\")";
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")";
}
else { print "Fehler: unbekannter winState $winState\n" }
}
}
case "Rollo" {
if($position != $maxPosOpen && $position != $maxPosTilted && $onHoldState ne "none") {
print "fhem(\"setreading $shutter WindowContactOnHoldState none\")";
}
}
else { print "Fehler: unbekannter event $event" }
}
Zitat von: Beta-User am 10 April 2017, 16:57:15Ich würde so etwas vorschlagen...
Kann ich irgendwo für Dummies nachlesen, was das ist und wie das geht?!?
sub winOpenShutterTester($$) {
my ($dev, $event) = @_;
#Erst mal prüfen, ob das übergebene device überhaupt existiert
if ($defs{$dev}) {
# Lock-Status lesen
my $lock = ReadingsVal($shutter,'winOpenShutterTesterLock',0);
if($lock == 1) { return "Skript für dieses Devices läuft bereits"; }
# Lock setzen, falls es 0 war
fhem("setreading $shutter winOpenShutterTesterLock 1");
# "normale" Skript-Funktionen, Lock ist jetzt 1, sollte das Skript für dieses Device ein weiteres Mal gestartet werden,
# beendet es sich wieder, bevor irgendwelche Aktionen ausgelöst werden
...
# am Ende Lock wieder löschen
fhem("setreading $shutter winOpenShutterTesterLock 0");
}
Zitat von: spi3845 am 10 April 2017, 16:59:18Es sieht vom Aufbau her nachvollziehbar aus, allerdings müßte ich für meine "Abfanglogik" noch einiges mehr berücksichtigen, was ich auf die Schnelle aber von den Auswirkungen her nicht überblicken kann.
Habe das Codebeispiel (aka Logik) erweitert um Timer. Macht das Sinn?
Zitat von: spi3845 am 10 April 2017, 17:21:35OK, Danke für die Info. Das geht in die Richtung wie ReadingsAge(), ohne dass man dafür ein eigenes Attribut bräuchte (?). ReadingsAge() sollte auch für eine sequenzielle Abarbeitung tauglich sein und ist in Zeilen 24 und 28 im Dev-tree für die "Abfangfunktion" schon genutzt, den Umbau im Tester habe ich gestern nicht mehr geschafft, was so schon spät ::).
Ich würde so etwas vorschlagen...
Zitat von: Beta-User am 10 April 2017, 18:03:01Interessanter Gedanke, wie würde Das Konzept aussehen? Kannst Du das skizzieren, dann überlege ich, wie man das abbilden könnte. Aktuell haben wir notifys für FK und motor, bräuchten dann noch Timer, die müssen aber irgend etwas anderes triggern, z.B. Rollopositionen. Timer könnten dann abgebildet werden als "set Rollo 0" und "set Rollo 100".
"timer" als case gefällt mir irgendwie nicht, das paßt nicht mehr so richtig zu dem dynamischen Konzept, bei der jeder Fahrbefehl wieder analysiert wird unabhängig davon, wo er herkommt. Danach gilt: wer zuletzt kommt, bestimmt die Ziel- und onHold-Positionen, ganz gleich ob über timer, Schalter oder FHEMWEB ausgelöst...
Zitat von: Beta-User am 10 April 2017, 18:03:01Geht das in die Richtung "Vergessen, Tür zu schließen und jetzt will ich wenigstens noch Rollladen schließen"? Dann wäre ja ein Aussperrschutz beim Feuern des Timers ok. Danach periodische Erinnerung, dass Balkontür offen steht... Nach 30 Min ohne Reaktion Rollladen zu :-X
Ganz neu (für meine Betrachtung) ist der Gedanke, trotz geöffnetem Fenster den Rolladen runterzumachen ???. Macht unter Sicherheitsaspekten Sinn, bisher war das gedanklich eher andersrum: ich komme ursprünglich von dem Ansatz zu verhindern, dass ich mich aussperre. Hmmm, sieht so aus, als würde dafür noch ein (einstellbares) Attribut benötigt, um den Aussperrschutz zu übersteuern.
Zitat von: Beta-User am 10 April 2017, 18:03:01Was ist denn das nun schon wieder? Muss nicht nur fhem, perl, DOIF lernen, jetzt auch noch ReadingsAge ::)
Das geht in die Richtung wie ReadingsAge(), ohne dass man dafür ein eigenes Attribut bräuchte (?).
Zitat von: Beta-User am 10 April 2017, 18:03:01Habe Dev erst jetzt gesehen, muss ich mir noch ansehen. Noch mehr Code... Ich keinen Code mehr sehen... 8)
ReadingsAge() sollte auch für eine sequenzielle Abarbeitung tauglich sein und ist in Zeilen 24 und 28 im Dev-tree für die "Abfangfunktion" schon genutzt, den Umbau im Tester habe ich gestern nicht mehr geschafft, was so schon spät ::).
Zitat von: spi3845 am 10 April 2017, 18:53:33Das hatte ich so als Wunsch von Deiner Seite verstanden ;D, ich brauche sowas eher nicht.
Geht das in die Richtung "Vergessen, Tür zu schließen und jetzt will ich wenigstens noch Rollladen schließen"?...
Zitat von: Beta-User am 10 April 2017, 19:54:07Ne, ich brauche nur Aussperrschutz. Sonst sitzt meine Familie draußen, wenn ich mal nicht da bin :)
OK, den dev-tree hast Du ja gefunden wg. des Konzepts. Damit bliebe erst mal alles Event-basiert, nur dass eben durch irgendwas (timer usw.) veranlasste settings angepaßt würden.Das hatte ich so als Wunsch von Deiner Seite verstanden ;D, ich brauche sowas eher nicht.
Zitat von: Beta-User am 10 April 2017, 19:54:07Ich glaube mit Switch geht das einfacher, denn die case-Befehle könnten die Events direkt aufnehmen.
Habe mir eben das mit den Events nochmal angesehen. Das wäre m.E. wirklich zielführend, die Events mit zu übergeben, ist aber ein gewisser Umbau.
Zitat von: Beta-User am 10 April 2017, 19:54:07Auf den Motor zu triggern führt zu einer Verzögerung. Denn erst gibt es irgendein Ereignis (Taste wird gedrückt oder Timer feuert), das wird verarbeitet und dann triggert der Aktor den Motor. Da die Aktoren die Position aus der Laufzeit bestimmen, dauert deren Bestimmung entsprechend. Deshalb habe ich versucht, den Timer gleich in die Funktion mit einzubauen - weiß noch nicht, wie gut das funktioniert. Der Timer ist im endlichen Automaten ein Ereignis wie "Tür auf", "Tür zu" oder "Schalter gedrückt" und führt zu einem Ergebnis wie Rolladen auf oder zu.
Denn sowohl der "stop" wie der "down"-Event senden die aktuelle Position mit, zu der Zeit ist aber der STATE des Geräts noch nicht geändert, das passiert erst danach. Damit holt Value() einen veralteten Wert, daher m.E. die trigger-loop. Man muß also den Value() überschreiben, (mindestens) wenn ein "stop" auslöst.
Zitat von: Beta-User am 10 April 2017, 19:54:07Kenne ich 8)
Mal sehen, wann ich dazu komme...
{ WinShutterTester(AttrVal("t.r.sp.tuerkontakt_re",'ShutterAssociated','none'), "Timer_down") }
{ WinShutterTester(AttrVal("t.r.sp.tuerkontakt_re",'ShutterAssociated','none'), "Timer_up") }
# am Anfang nach anderen use-Statements einfügen
use Switch;
# ...
# Enter you functions below _this_ line.
sub WinShutterTester($$) {
#Als Parameter muss der device-Name übergeben werden
#notify-Definitionen:
#defmod n_Rolladen_Window notify .*(closed|open|tilted)..to.VCCU. { WinShutterTester(AttrVal($NAME,'ShutterAssociated','none'), "Window") }
#defmod n_Rolladen_Stop notify .*:motor:.stop.* { WinShutterTester($NAME, "Rollo")}
#Hint for window contacts: make sure to modify settings of device wrt. some delay in sending state changes to avoid unnecessary triggers
my ($dev, $event) = @_;
#Erst mal prüfen, ob das übergebene device überhaupt existiert
if ($defs{$dev}) {
#Als erstes brauchen wir die Info, welcher Rolladen bzw. welcher Fenster- bzw. Türkontakt
#betroffen sind
my $windowcontact = AttrVal($dev,'WindowContactAssociated',"none");
my $shutter=$dev;
if (!$shutter) {}
else {
#Wir speichern ein paar Infos, damit das nicht zu unübersichtlich wird
my $position = ReadingsVal($shutter,'level',0);
my $winState = Value($windowcontact);
my $maxClosedIfOpen = AttrVal($shutter,'ShutterMaxClosedIfOpen',30);
my $maxClosedIfTilted = AttrVal($shutter,'ShutterMaxClosedIfTilted',10);
my $onHoldState = ReadingsVal($shutter,'ShutterOnHoldState',"none");
my $maxClosed = AttrVal($shutter,'ShutterMaxClosed',0);
my $maxOpened = AttrVal($shutter,'ShutterMaxOpened',100);
my $notOpenIfBelow = AttrVal($shutter,'ShutterNotOpenIfBelow',20);
# wenn kein $windowcontact, so tun als wäre Fenster immer zu (=closed)
if($windowcontact eq "none") { $winState = "closed"; }
switch($event){
case "Window"{
switch($winState){
case "open"{
if($position < $maxClosedIfOpen) {
fhem("set $shutter $maxClosedIfOpen");
if ($onHoldState eq "none") { fhem("setreading $shutter ShutterOnHoldState $position"); }
}
}
case "tilted"{
if($position < $maxClosedIfTilted) {
fhem("set $shutter $maxClosedIfTilted");
if ($onHoldState eq "none") { fhem("setreading $shutter ShutterOnHoldState $position"); }
}
}
case "closed"{
if ($onHoldState ne "none") {
fhem("set $shutter $onHoldState");
fhem("setreading $shutter ShutterOnHoldState none");
}
}
else { return "Fehler: unbekannter winState $winState"; }
}
}
case "Timer_down"{
switch($winState){
case "open"{ # Aussperrschutz, nichts tun
fhem("setreading $shutter ShutterOnHoldState $maxClosed");
}
case "tilted"{ # gekipptes Fenster auf Lüften-Position fahren,
# als alte Position Schließposition des Rollos speichern
fhem("set $shutter $maxClosedIfTilted");
fhem("setreading $shutter ShutterOnHoldState $maxClosed");
}
case "closed"{
fhem("set $shutter $maxClosed");
fhem("setreading $shutter ShutterOnHoldState none");
}
else { return "Fehler: unbekannter winState $winState"; }
}
}
case "Timer_up"{
switch($winState){
case "open"{ # Eindringen von außen verhindern
if($position > $notOpenIfBelow) {
fhem("set $shutter $maxOpened");
fhem("setreading $shutter ShutterOnHoldState none");
}
else {
fhem("set $shutter $notOpenIfBelow");
fhem("setreading $shutter ShutterOnHoldState $maxOpened");
}
}
case ["tilted","closed"]{ # Rollos eines gekippten Fensters können geöffnet werden,
# ansonsten müsste tilted wie open behandelt werden
fhem("set $shutter $maxOpened");
fhem("setreading $shutter ShutterOnHoldState none");
}
else { return "Fehler: unbekannter winState $winState"; }
}
}
case "Rollo"{ # noch nicht fertig, testen
if($position != $maxClosedIfOpen && $position != $maxClosedIfTilted && $onHoldState ne "none") {
fhem("setreading $shutter ShutterOnHoldState none");
}
}
else { return "Fehler: unbekannter event $event"; }
}
}
}
}
sub WinShutterLink($$$$$$$) {
#Als Parameter müssen die Namen vom Fensterkontakt und Rolladen übergeben werden sowie der Maxlevel bei Fensteröffnung und tilted
#Call in FHEMWEB e.g.: { WinShutterLink("Fenster_Wohnzimmer_SSW","Rolladen_WZ_SSW",30,10,0,100,20) }
my ($windowcontact, $shutter, $maxClosedIfOpen, $maxClosedIfTilted, $maxClosed, $maxOpened, $notOpenIfBelow) = @_;
my ($hash, @param) = @_;
#Erst mal prüfen, ob die Parameter sinnvoll sind
if($defs{$windowcontact} && $defs{$shutter}) {
if(AttrVal($shutter,'subType', undef) =~ "blindActuator|dummy|" && AttrVal($windowcontact,'subType',undef) =~ "threeStateSensor|dummy|") {
my $oldAttrWin = AttrVal($windowcontact,'userattr',undef);
my $oldAttrRollo = AttrVal($shutter,'userattr',undef);
#Jetzt können wir sehen, ob und welche notwendigen userattr vorhanden sind
#und ggf. Werte zuweisen
if(index($oldAttrWin,"ShutterAssociated") < 0){
fhem("attr $windowcontact userattr $oldAttrWin ShutterAssociated");
}
fhem("attr $windowcontact ShutterAssociated $shutter");
if(index($oldAttrRollo,"WindowContactAssociated") < 0) {
fhem("attr $shutter userattr $oldAttrRollo WindowContactAssociated");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
fhem("attr $shutter WindowContactAssociated $windowcontact");
if(index($oldAttrRollo,"ShutterOnHoldState") < 0) {
fhem("attr $shutter userattr $oldAttrRollo ShutterOnHoldState");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
fhem("setreading $shutter ShutterOnHoldState none");
if(index($oldAttrRollo,"ShutterMaxClosed") < 0) {
fhem("attr $shutter userattr $oldAttrRollo ShutterMaxClosed");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
fhem("attr $shutter ShutterMaxClosed $maxClosed");
if(index($oldAttrRollo,"ShutterMaxOpened") < 0) {
fhem("attr $shutter userattr $oldAttrRollo ShutterMaxOpened");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
fhem("attr $shutter ShutterMaxOpened $maxOpened");
if(index($oldAttrRollo,"ShutterMaxClosedIfOpen") < 0) {
fhem("attr $shutter userattr $oldAttrRollo ShutterMaxClosedIfOpen");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
fhem("attr $shutter ShutterMaxClosedIfOpen $maxClosedIfOpen");
if(index($oldAttrRollo,"ShutterMaxClosedIfTilted") < 0) {
fhem("attr $shutter userattr $oldAttrRollo ShutterMaxClosedIfTilted");
$oldAttrRollo = AttrVal($shutter,'userattr',undef);
}
fhem("attr $shutter ShutterMaxClosedIfTilted $maxClosedIfTilted");
if(index($oldAttrRollo,"ShutterNotOpenIfBelow") < 0) {
fhem("attr $shutter userattr $oldAttrRollo ShutterNotOpenIfBelow");
}
fhem("attr $shutter ShutterNotOpenIfBelow $notOpenIfBelow");
}
else { return "One of the devices has wrong subtype"; }
}
else { return "One of the devices does not exist"; }
}
define t.r.sp.rollo_re dummy
attr t.r.sp.rollo_re userattr WindowContactAssociated ShutterOnHoldState ShutterNotOpenIfBelow
attr t.r.sp.rollo_re ShutterMaxClosed 0
attr t.r.sp.rollo_re ShutterMaxClosedIfOpen 30
attr t.r.sp.rollo_re ShutterMaxClosedIfTilted 10
attr t.r.sp.rollo_re ShutterMaxOpened 100
attr t.r.sp.rollo_re ShutterNotOpenIfBelow 20
attr t.r.sp.rollo_re WindowContactAssociated t.r.sp.tuerkontakt_re
attr t.r.sp.rollo_re room Test.Rollladen.sp
attr t.r.sp.rollo_re userReadings level { ReadingsVal("t.r.sp.rollo_re","state",0);;;; }
attr t.r.sp.rollo_re webCmd 0:5:10:20:30:50:70:100
define t.r.sp.tuerkontakt_re dummy
attr t.r.sp.tuerkontakt_re userattr ShutterAssociated
attr t.r.sp.tuerkontakt_re ShutterAssociated t.r.sp.rollo_re
attr t.r.sp.tuerkontakt_re room Test.Rollladen.sp
attr t.r.sp.tuerkontakt_re setList tilted open closed
attr t.r.sp.tuerkontakt_re webCmd tilted:open:closed
define t.r.sp.n_Rolladen_Window notify t.r.sp.tuerkontakt_.*(closed|open|tilted) { WinShutterTester(AttrVal($NAME,'ShutterAssociated','none'), "Window") }
attr t.r.sp.n_Rolladen_Window group Türen und Fenster
attr t.r.sp.n_Rolladen_Window icon fts_shutter_automatic
attr t.r.sp.n_Rolladen_Window room Test.Rollladen.sp
{ WinShutterLink("t.r.sp.tuerkontakt_re","t.r.sp.rollo_re",30,10,0,100,20) }
t.r.sp.tuerkontakt_re | Device Türkontakt |
t.r.sp.rollo_re | Device Rollo |
30 | Lüften-Position des Rollos, wenn Tür offen ist |
10 | Lüften-Position des Rollos, wenn Tür gekippt ist |
0 | Soll-Position des Rollos nach autom. Schließen |
100 | Soll-Position des Rollos nach autom. Öffnen |
20 | Schwellwert des Rollos, ab der es autom. geöffnet wird, sollte die Tür offen sein (Schutz vor Eindringen) Ist das Rollo darunter, wird es bis zu dieser Position geöffnet, wenn die Tür beim autom. Öffnen offen steht. |
Zitat von: spi3845 am 10 April 2017, 22:03:44Im realen Leben stimmen diese Annahmen m.E. leider nicht immer. Auf "motor: down" und "motor: stop" habe ich nur deswegen ein notify gelegt, weil bei einem Tastendruck am Aktor selbst (also am eingebauten Schalter) eben nur diese beiden (bzw. noch "up") kommen. "stop" braucht man auch, weil die Alternative wäre, Änderungen im Device-STATE auszuwerten. Diese kommen während des Fahrens uU aber zum einen sehr schnell, können andererseits jedoch erst sinnvoll ausgewertet werden, wenn eine gewisse Zeit keine Änderung mehr kommt. Sonst wäre manches einfacher ;), weil man dann nicht nochmal prüfen müßte, ob alle Parameter bereits geprüft und richtig gesetzt sind.
Auf den Motor zu triggern führt zu einer Verzögerung. Denn erst gibt es irgendein Ereignis (Taste wird gedrückt oder Timer feuert), das wird verarbeitet und dann triggert der Aktor den Motor.
Zitat von: spi3845 am 10 April 2017, 22:03:44...Der Timer ist im endlichen Automaten ein Ereignis wie "Tür auf"...Achtung: Die Begrifflichkeit ist etwas anders als das, was ich bisher gedacht habe. Ich verstehe das so und habe das bisher auch in den Beiträgen entsprechend verwendet:
Zitat von: Beta-User am 11 April 2017, 09:11:01Ich meine zu verstehen, vielleicht aber auch nicht ???
Achtung: Die Begrifflichkeit ist etwas anders als das, was ich bisher gedacht habe. Ich verstehe das so und habe das bisher auch in den Beiträgen entsprechend verwendet:
- Ein Ereignis ist irgendetwas, was mit einem "notify" ausgewertet werden kann. Dieses kann dann der perl-Funktion Informationen übergeben, die erst durch das Ereignis näher konkretisiert werden, insbesondere $NAME und $EVENT (oder Teile davon). Wenn ich von "Event" spreche, meine ich also, ein notify wird getriggert werden (oder könnte es werden, wenn es eines gäbe) und der Übergabewert (verkürzt zu das "Event") sollte dann zukünftig auch $EVENT (oder uU. Teile davon) sein.
- Ein Timer ist etwas, was rein zeitbasiert geschieht, klassischerweise ein "at". Dieses kann natürlich auch Ereignisse auslösen.
Meine Idee zur Aussperrschutz- und Lüftungsfunktion (nicht aber Eindringschutz) bisher war, in diesem Sinne rein Event-basiert vorzugehen, damit jeder diese Funktion nutzen kann, unabhängig davon, ob er die anderen Teile, die noch zu entwickeln wären (1. Morgens auf/abends zu bzw. 2. Beschattung) ebenfalls nutzen will.
Zitat von: spi3845 am 11 April 2017, 21:33:36Das haut in etwa so hin, wie Du das jetzt beschreibst.
Ich meine zu verstehen, vielleicht aber auch nicht ???
ZitatEin Fahrkommando aus der fhem GUI wäre auch ein Ereignis - könnte ja z.B. ein Dummy aka virtuelle Taste sein, der durch ein notify registriert wird.Es braucht nicht mal einen Dummy, die Gerätedarstellung eines Rolladenaktors in FHEMWEB tut es auch (oder ein Set-Kommando, das von einem at, weekdaytimer usw., aus aufgerufen wird...)
ZitatDie ursprüngliche Version deiner Funktion reagierte auf die Events "Tür auf/zu/gekippt" und "motor:.*".Korrekterweise neben den Fenster-Kontakt-Events nur auf "motor:.stop", wenn also der Rolladen - warum auch immer - angehalten hat.
ZitatWenn das Szenario tatsächlich so wie beschrieben ist, was sind aus deiner Erfahrung Vor-/Nachteile der einen gegenüber der anderen Lösung? Ich lerne immer noch fhem und die Lernkurve der letzten Tage war so etwas von steil - echt danke dafür!Danke zurück!
Zitat von: hugomckinley am 12 April 2017, 20:14:30Danke! Die nächsten freien Tage sind versaut mit dem Lesen von Code 8)
Hier nun die ordentlich kommentierte Version meines Scripts in der 99_myUtils.pm https://forum.fhem.de/index.php/topic,61844.msg532545.html#msg532545 (https://forum.fhem.de/index.php/topic,61844.msg532545.html#msg532545)
Bei weiteren Fragen einfach melden.
Hugo
Zitat von: Beta-User am 15 April 2017, 14:47:27Wow, hätte nicht gedacht, dass sich das so rasant entwickelt! Perfekt!
Wesentlicher Unterschied: Es gibt jetzt nur noch ein notify! Die Idee dahinter ist, das tatsächlich in Richtung eines Moduls auszubauen. Vorläufiger Name: HM-Shuttertools?
Zitat von: Cluni am 16 April 2017, 01:24:46Cool, gefällt mir. Wie ist deine Erfahrung in der Zusammenarbeit mit mehreren bzgl. Änderungen nachverfolgen?
https://www.draw.io (https://www.draw.io)
digraph finite_state_machine {
rankdir=TB; /* LR für von links nach rechts */
size="8,5"
node [shape=box,style="rounded,bold"];
ro [color=black,label="Rollo oben\n[ro]",labelloc=b];
lv [color=blue,label="Lüften viel\n[lv]",labelloc=b];
lw [color=blue,label="Lüften wenig\n[lw]",labelloc=b];
ru [color=black,label="Rollo unten\n[ru]",labelloc=b];
ro -> ru [ label = "Rollo zu" ];
ru -> ro [ label = "Rollo auf && Tür!=offen" ];
ro -> lw [ label = "Rollo zu && Tür=gekippt" ];
lv -> lw [ label = "Tür kippen" ];
lw -> ru [ label = "Tür zu" ];
lv -> ru [ label = "Tür zu" ];
ru -> lw [ label = "Tür kippen" ];
ru -> lv [ label = "Tür öffnen" ];
lw -> lv [ label = "Tür öffnen" ];
lw -> ro [ label = "Rollo auf && Tür!=offen" ];
}
dot -T png ea_rollo_001.gv -o ea_rollo.png
digraph finite_state_machine {
rankdir=TB; /* LR für von links nach rechts */
node [shape=box,style="rounded,bold"];
ro [color=black,label="Rollo steht oben\n[ro]",labelloc=b];
rülo [color=blue,label="Rollo steht oberhalb Position\n'Lüften bei offener Tür'\n[rülo]",labelloc=b];
rfülo [color=red,label="Rollo fährt oberhalb Position\n'Lüften bei offener Tür'\n[rfülo]",labelloc=b];
rfalo [color=red,label="Rollo fährt an Position\n'Lüften bei offener Tür'\n[rfalo]",labelloc=b];
lo [color=green,label="Rollo steht in Position\n'Lüften bei offener Tür'\n[lo]",labelloc=b];
rülg [color=blue,label="Rollo steht oberhalb Position\n'Lüften bei gekippter Tür'\n[rülg]",labelloc=b];
rfülg [color=red,label="Rollo fährt oberhalb Position\n'Lüften bei gekippter Tür'\n[rfülg]",labelloc=b];
rfalg [color=red,label="Rollo fährt an Position\n'Lüften bei gekippter Tür'\n[rfalg]",labelloc=b];
lg [color=green,label="Rollo steht in Position\n'Lüften bei gekippter Tür'\n[lg]",labelloc=b];
rulg [color=blue,label="Rollo steht unterhalb Position\n'Lüften bei gekippter Tür'\n[rulg]",labelloc=b];
rfulg [color=red,label="Rollo fährt unterhalb Position\n'Lüften bei gekippter Tür'\n[rfulg]",labelloc=b];
ru [color=black,label="Rollo steht unten\n[ru]",labelloc=b];
ro -> ru [ label = "Rollo zu" ];
ru -> ro [ label = "Rollo auf && Tür!=offen (Einbruchschutz)" ];
ro -> ro [ label = "Rollo auf && Tür=offen (Aussperrschutz)" ];
ro -> lg [ label = "Rollo zu && Tür=gekippt" ];
lo -> lg [ color=green,fontcolor=green,label = "Tür kippen" ];
lg -> ru [ label = "Tür zu" ];
lo -> ru [ label = "Tür zu" ];
ru -> lg [ color=green,fontcolor=green,label = "Tür kippen" ];
ru -> lo [ color=green,fontcolor=green,label = "Tür öffnen" ];
lg -> lo [ color=green,fontcolor=green,label = "Tür öffnen" ];
lg -> ro [ label = "Rollo auf && Tür!=offen" ];
ro -> rfülo [ label = "Rollo zu" ];
rfülo -> rülo [ color=red,fontcolor=red,label = "Stopp gedrückt" ];
rfülo -> rfalo [ color=orange,fontcolor=orange,label = "weiter 'Rollo zu'" ];
rfalo -> rfülg [ color=orange,fontcolor=orange,label = "weiter 'Rollo zu'" ];
rfülg -> rülg [ color=red,fontcolor=red,label = "Stopp gedrückt" ];
rfülg -> rfalg [ color=orange,fontcolor=orange,label = "weiter 'Rollo zu'" ];
rfalg -> rfulg [ color=orange,fontcolor=orange,label = "weiter 'Rollo zu'" ];
rfalo -> lo [ color=red,fontcolor=red,label = "Stopp gedrückt" ];
rfalg -> lg [ color=red,fontcolor=red,label = "Stopp gedrückt" ];
rfulg -> rulg [ color=red,fontcolor=red,label = "Stopp gedrückt" ];
rülo -> rfülo [ label = "Rollo auf/zu" ];
rfülo -> ro [ color=orange,fontcolor=orange,label = "weiter 'Rollo auf'" ];
rülg -> rfülg [ label = "Rollo auf/zu" ];
rfülg -> rfalo [ color=orange,fontcolor=orange,label = "weiter 'Rollo auf'" ];
rulg -> rfulg [ label = "Rollo auf/zu" ];
rfulg -> rfalg [ color=orange,fontcolor=orange,label = "weiter 'Rollo auf'" ];
{ rülo,rülg,rulg -> lo [ color=purple,fontcolor=purple, label = "Tür öffnen" ] };
{ rülo,rülg,rulg -> lg [ color=purple,fontcolor=purple, label = "Tür kippen" ] };
{ rfülo,rfalo,rfülg,rfalg,rfulg -> lo [ color=purple,fontcolor=purple, label = "Tür öffnen" ] };
{ rfülo,rfalo,rfülg,rfalg,rfulg -> lg [ color=purple,fontcolor=purple, label = "Tür kippen" ] };
}
Schwarz = Rollo im Anschlag ober oder unten
Grün = Rollo bei geöffneter/gekippter Tür
Blau = Rollo in anderen Positionen
Rot = Rollo in Bewegung
Zitat von: Beta-User am 16 April 2017, 08:02:22Ich kann die Mitnahme "Soll-Position" mit einzeichnen, würde aber gerne erst einmal diskutieren, ob wir die Darstellung fortführen wollen. Sie ist jetzt schon ziemlich umfangreich. Habe geute etwas mit GraphViz rumgespielt und es ist zwar einfach, neue Zustände und Übergänge aufzunehmen, auf die Darstellung selbst hat man aber wenig Einfluss. Das Ergebnis kann dann etwas überwältigend sein 8) Anbei eine aktualisierte Grafik. Wenn gewünscht, kann ich die pflegen, würde dann aber vorschlagen, dass wir
Danke für den Versuch eine Visualisierung! Es erinnert an die HM-Statemachine-Beschreibung im Einsteigerdokument, die wirklich hilfreich war, um zu verstehen, wie so ein Gerät "denkt" (und das dann ggf. auch mit einem Arduino etc. für andere Bereiche abzubilden).
Was ich in der Abbildung so nicht gefunden habe, ist die "Mitnahme" der "Soll-Position" beim Schließen des Fensters (wenn unterhalb des aktuellen Levels).
Zitat von: Beta-User am 16 April 2017, 08:02:22Also doch keine DOIFs? Damit ist meine allererste Frage beantwortet :D
Der Ansatz, das gemeinsam weiterzuentwickeln, gefüllt mir sehr gut! Hätte nur 2 Bedingungen: Möglichst keine weiteren Abhängigkeiten (perl-Module) und (zwingend!) in der Doku keine DOIF. (Wer mag, kann das verwenden, es schließt sich nicht aus. Aber es geht sicher auch ohne...).
Zitat von: Beta-User am 16 April 2017, 08:02:22devspec2array klingt interessant, würde dann aber auch Rollläden erwischen, für die wir keine Automatik wollen (wer kann so etwas wollen?). Wie würden dann die entsprechenden Fensterkontakte zugeordnet werden? Über Namenskonvention (z.B. Name FK = Name des Rollos mit angehängtem FK?) oder standardmässig none zuweisen und dann manuell in den userattr setzen? Oder eine zweispaltige Liste, die wir über die GUI zuordnen... Geht so etwas überhaupt?
- Ansonsten sind mir bei der Durchsicht nur 2 Dinge aufgefallen, die eventuell "eleganter" gelöst werden können:
-- devspec2array statt alle Geräte zur Konfiguration zu durchlaufen und
-- (zu den ReadingsGroups): ob die Readings in den userattr nicht teilweise direkter gesetzt werden könnten (?)
Zitat von: Beta-User am 16 April 2017, 08:02:22Ebenso!
Frohe Ostern allseits,
Zitat von: spi3845 am 16 April 2017, 18:26:24Fehlt da nicht noch die Unterscheidung beim Fahren, ob eine Zielposition gegeben ist (FHEM-veranlaßt) oder nicht (Tastendruck). Im ersteren Fall muß man m.E. noch unterscheiden, ob die Zielposition oberhalb der aktuellen ist (dann reagieren wir erst wieder bei "stop") oder unterhalb (dann generieren wir daraus eine neue on-Hold-Position)...
Ich kann die Mitnahme "Soll-Position" mit einzeichnen, würde aber gerne erst einmal diskutieren, ob wir die Darstellung fortführen wollen. Sie ist jetzt schon ziemlich umfangreich.
Zitatdevspec2array klingt interessant, würde dann aber auch Rollläden erwischen, für die wir keine Automatik wollen (wer kann so etwas wollen?)."Mein" notify reagiert schon heute auf alle Rolläden und Tür-/Fensterkontakte im Haus und prüft, ob was getan werden soll. Das ist im Moment eben nur bei 4 Rolläden und 2 Drehkontakten sowie 2 "Auf/Zu"-Kontakten der Fall. Damit etwas passiert, braucht es die entsprechenden Attribute.
ZitatWie würden dann die entsprechenden Fensterkontakte zugeordnet werden?Die Zuordnung soll über eine "set"-Funktion des Moduls erfolgen, was man 1x pro Paar für diesen Teil der Funktionalität machen müßte. Dafür ist man in der Wahl der Namen frei, kann also nehmen, was da ist, man braucht kein "Name FK = Name des Rollos mit angehängtem FK?".
set RolloTools softpair Rolladen_WZ_SSO Fenster_Wohnzimmer_1 <offenWert><tiltedWert>
einmalig eingeben muß und die letzten beiden Werte auch als Default nehmen bzw. später einfach über eine Readingsgroup ändern kann, ist das ok.ZitatWas meinst Du mit Readings in den userattr direkter setzen?Hugo verwendet in der ReadingsGroup noch eine command-definition, um darüber dann ein "attr ..." auszuführen. M.E. braucht es das nicht, habe das aber - außer für die max-Level - noch nicht weiter ausprobiert.
attr Rol\..* userattr Auto_Modus:bei_Abwesenheit,immer Auto_hoch:aus,Zeit,Astro Auto_runter:aus,Zeit,Astro Auto_offen_Pos:on,Luft,10,20,30,40,50,60,70,80,90 Auto_Himmelsrichtung Auto_Abschattung:ja,nein,verspaetet Auto_Zeit_hoch_frueh Auto_Zeit_hoch_spaet Auto_Zeit_hoch_WE_Urlaub Auto_Zeit_runter_frueh Auto_Zeit_runter_spaet Auto_Zufall_Minuten Auto_Fensterkontakt Auto_Luft_Fenster_offen:ja,nein Auto_Sperre_Fenster_offen:ja,nein
attr Rol\..* Auto_Modus immer
attr Rol\..* Auto_hoch aus
attr Rol\..* Auto_runter aus
attr Rol\..* Auto_offen_Pos Luft
attr Rol\..* Auto_Himmelsrichtung 178
attr Rol\..* Auto_Abschattung nein
attr Rol\..* Auto_Zeit_hoch_frueh 07:30:00
attr Rol\..* Auto_Zeit_hoch_spaet 09:00:00
attr Rol\..* Auto_Zeit_hoch_WE_Urlaub 09:30:00
attr Rol\..* Auto_Zeit_runter_frueh 16:30:00
attr Rol\..* Auto_Zeit_runter_spaet 21:30:00
attr Rol\..* Auto_Luft_Fenster_offen ja
attr Rol\..* Auto_Sperre_Fenster_offen nein
Internals:
NAME Rolllanden.Automatik.morgens
NR 273
STATE on
TYPE dummy
Readings:
2017-04-17 09:49:46 state on
Attributes:
alias Automatik morgens
genericDeviceType switch
group Rollladen_Automatik
icon weather_sun
room Haus,Homekit,Rollladen
setList on off
sortby 2
webCmd on:off
Internals:
NAME Rolllanden.Automatik.abends
NR 274
STATE on
TYPE dummy
Readings:
2017-04-17 09:49:42 state on
Attributes:
alias Automatik abends
genericDeviceType switch
group Rollladen_Automatik
icon weather_moon_phases_8
room Haus,Homekit,Rollladen
setList on off
sortby 3
webCmd on:off
sub randomtime_with_realtime($;$;$)
{
my $ZtA;
my ($MeH,$MeM,$MeS)=split(':',shift(@_));
my $MeB=shift(@_);
my $MeD=shift(@_);
if ($MeD eq '+') {$ZtA = int($MeH*3600 + $MeM*60 + rand($MeB*60) + $MeS);} # Minuten addieren
else {$ZtA = int($MeH*3600 + $MeM*60 - rand($MeB*60) + $MeS);} # Minuten subtrahiern
my $ZtH = int($ZtA/3600);
my $ZtM = int(($ZtA-$ZtH*3600)/60);
my $ZtS = int($ZtA-($ZtH*3600+$ZtM*60));
return sprintf("%2.2d:%2.2d:%2.2d",$ZtH,$ZtM,$ZtS);
}
sub Auto_Rol_group_at($)
{
#Als Parameter muss der Anfang der device-Namen übergeben werden, der bei allen Rollladen gleich ist
my $group_name=shift(@_);
my @monitored=devspec2array("($group_name\..*)");
foreach my $dev (@monitored) {
#Erst mal prüfen, ob das übergebene device überhaupt existiert und ob es ein Rollladen ist
if (($defs{$dev}) and (AttrVal($dev,'subType','nv') eq 'blindActuator')) {
my $Hoch_Zeit;
my $Runter_Zeit;
my $hoch_at;
my $runter_at;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
my $Ferien=ReadingsVal('Ferientag','state',-1);
my $Feiertag=ReadingsVal('Feiertag','state',-1);
#Aus dem device werden nun, sofern vorhanden, die ganzen Attribut ausgelesen.
#Wenn das Attribut nicht vorhanden ist, bekommt es einen Standardwert (z.B. 'nv' für nicht vorhanden)
my $A_Modus=AttrVal($dev,'Auto_Modus','immer');
my $A_hoch=AttrVal($dev,'Auto_hoch','aus');
my $A_runter=AttrVal($dev,'Auto_runter','aus');
my $A_offen_Pos=AttrVal($dev,'Auto_offen_Pos','Luft');
#my $A_Himmelsrichtung=AttrVal($dev,'Auto_Himmelsrichtung',0);
#my $A_Abschattung=AttrVal($dev,'Auto_Abschattung','nein');
my $A_Zeit_hoch_frueh=AttrVal($dev,'Auto_Zeit_hoch_frueh','07:30:00');
my $A_Zeit_hoch_spaet=AttrVal($dev,'Auto_Zeit_hoch_spaet','09:00:00');
my $A_Zeit_hoch_WE_Urlaub=AttrVal($dev,'Auto_Zeit_hoch_WE_Urlaub','09:30:00');
my $A_Zeit_runter_frueh=AttrVal($dev,'Auto_Zeit_runter_frueh','16:30:00');
my $A_Zeit_runter_spaet=AttrVal($dev,'Auto_Zeit_runter_spaet','21:30:00');
my $A_Zufall_Minuten=AttrVal($dev,'Auto_Zufall_Minuten','30');
my $A_Zufall_Sekunden=$A_Zufall_Minuten*60;
#my $Raeume=AttrVal($dev,'room','');
#Festlegen des Namens für die Timer, die angelegt werden um den Rollladen zu gewünschter
#Zeit zu fahren.
my $Rol_hoch_Timername='Rol_Timer_hoch_'.$dev;
my $Rol_runter_Timername='Rol_Timer_runter_'.$dev;
my $Rol_at='Timer_build_at_'.$dev;
# #Sollten diese Timer bereits existieren, so werden sie zunächst gelöscht.
Log 1,"delete $Rol_hoch_Timername" if ($defs{$Rol_hoch_Timername});
fhem("delete $Rol_hoch_Timername") if ($defs{$Rol_hoch_Timername});
Log 1,"delete $Rol_runter_Timername" if ($defs{$Rol_runter_Timername});
fhem("delete $Rol_runter_Timername") if ($defs{$Rol_runter_Timername});
Log 1,"delete Timer_build_at_$dev" if ($defs{$Rol_at});
fhem("delete Timer_build_at_$dev") if ($defs{$Rol_at});
if ($A_Modus eq 'immer') {fhem("setreading $dev Auto_Modus Automatik auch bei Anwesenheit");}
elsif ($A_Modus eq 'bei_Abwesenheit') {fhem("setreading $dev Auto_Modus Automatik nur, wenn niemand zu Hause ist");}
fhem("setreading $dev Auto_hoch_Zeit --:--:--");
fhem("setreading $dev Auto_hoch_Pos ---");
fhem("setreading $dev Auto_hoch_Zeit --:--:--");
$Hoch_Zeit = randomtime_with_realtime("$A_Zeit_hoch_WE_Urlaub","$A_Zufall_Minuten","+"); # Zeit zum Hochfahren mit der Wochenend- bzw. Urlaubs-Zeit vorbesetzen
if ($A_hoch eq 'aus') {goto CHECK_SET_DOWN_TIME;} # Automatik für morgens (für diesen Rollladen) ausgeschaltet? ==> dann Sprung!
if (($wday > 5) or ($wday == 0) or ($Ferien == 1) or ($Feiertag == 1)) {goto ABWESENHEITSCHECK;} # Wochenende, Urlaub oder Feiertag? ==> dann Sprung
elsif ($A_hoch eq 'Astro'){ # Automatik (für diesen Rollladen) auf Astro-Programm?
$Hoch_Zeit = sunrise_abs("REAL",$A_Zufall_Sekunden-rand($A_Zufall_Sekunden*2),randomtime_with_realtime("$A_Zeit_hoch_frueh","$A_Zufall_Minuten","+"),randomtime_with_realtime("$A_Zeit_hoch_spaet","$A_Zufall_Minuten","-"));
}
elsif ($A_hoch eq 'Zeit'){ # Automatik (für diesen Rollladen) auf normalem Zeitprogramm?
$Hoch_Zeit = randomtime_with_realtime("$A_Zeit_hoch_frueh","$A_Zufall_Minuten","+");
}
ABWESENHEITSCHECK:
if ($A_Modus eq 'immer') {$hoch_at = "define $Rol_hoch_Timername at $Hoch_Zeit { if (ReadingsVal(\"Rolllanden.Automatik.morgens\",\"state\",\"nv\") eq \"on\" ) { fhem(\"set $dev $A_offen_Pos\") }}";}
elsif ($A_Modus eq 'bei_Abwesenheit') {$hoch_at = "define $Rol_hoch_Timername at $Hoch_Zeit { if ((ReadingsVal(\"jemand_zu_Hause\",\"state\",\"\") eq \"absent\" ) and (ReadingsVal(\"Rolllanden.Automatik.morgens\",\"state\",\"nv\") eq \"on\" )) { fhem(\"set $dev $A_offen_Pos\") }}";}
fhem("$hoch_at");
fhem("attr $Rol_hoch_Timername room Timer");
fhem("attr $Rol_hoch_Timername icon fts_shutter_automatic\@yellow");
fhem("setreading $dev Auto_hoch_Zeit $Hoch_Zeit");
fhem("setreading $dev Auto_hoch_Pos $A_offen_Pos");
CHECK_SET_DOWN_TIME:
if ($A_runter eq 'aus') {goto ENDE;} # Automatik (für diesen Rollladen) für abends ausgeschaltet? ==> dann Sprung!
elsif ($A_runter eq 'Astro'){ # Automatik (für diesen Rollladen) auf Astro-Programm?
$Runter_Zeit = sunset_abs("REAL",$A_Zufall_Sekunden-rand($A_Zufall_Sekunden*2),randomtime_with_realtime("$A_Zeit_runter_frueh","$A_Zufall_Minuten","+"),randomtime_with_realtime("$A_Zeit_runter_spaet","$A_Zufall_Minuten","-"));
}
elsif ($A_runter eq 'Zeit'){ # Automatik (für diesen Rollladen) auf normalem Zeitprogramm?
$Runter_Zeit = randomtime_with_realtime("$A_Zeit_runter_spaet","$A_Zufall_Minuten","-");
}
if ($A_Modus eq 'immer') {$runter_at = "define $Rol_runter_Timername at $Runter_Zeit { if (ReadingsVal(\"Rolllanden.Automatik.abends\",\"state\",\"nv\") eq \"on\" ) { fhem(\"set $dev off\") }}";}
elsif ($A_Modus eq 'bei_Abwesenheit') {$runter_at = "define $Rol_runter_Timername at $Runter_Zeit { if ((ReadingsVal(\"jemand_zu_Hause\",\"state\",\"\") eq \"absent\" ) and (ReadingsVal(\"Rolllanden.Automatik.abends\",\"state\",\"nv\") eq \"on\" )) { fhem(\"set $dev off\") }}";}
fhem("$runter_at");
fhem("attr $Rol_runter_Timername room Timer");
fhem("attr $Rol_runter_Timername icon fts_shutter_automatic\@green");
fhem("setreading $dev Auto_runter_Zeit $Runter_Zeit");
ENDE:
}
}
my $TimerErzeugerName='TimerErzeuger_'.$group_name;
fhem("define $TimerErzeugerName at *00:05:00 {Auto_Rol_group_at(\"$group_name\")}") if (!($defs{$TimerErzeugerName})); # Timer zum Starten dieser Funktion erzeugen, falls noch nicht vorhanden
fhem("attr $TimerErzeugerName room Timer");
fhem("attr $TimerErzeugerName icon clock\@blue");
fhem("attr $TimerErzeugerName webCmd execNow"); # Webcmd zur einfachen Neuberechnung anlegen
# nun noch ein Notify erzeugen, damit bei einem Neustart von Fhem die temporaeren Timer berechnet werden (die sind sonst naemlich weg)
fhem("define TimerSystemStart.ntfy notify global:INITIALIZED {fhem(\"set $TimerErzeugerName execNow\")}") if (!($defs{"TimerSystemStart.ntfy"})); # Notify erzeugen, falls noch nicht vorhanden
fhem("attr TimerSystemStart.ntfy room Timer");
fhem("attr TimerSystemStart.ntfy icon system_fhem_reboot\@orange");
}
{Auto_Rol_group_at("Rol")}
{Auto_Rol_group_at("Rol")}
oder
set TimerErzeuger_Rol execNow
Zitat von: Beta-User am 16 April 2017, 19:47:32Vorschlag: schaut euch die Grafik an, malt drin rum (gerne mit Stift, dann Einscannen und mir schicken) - ich baue das wieder ein. Dann haben wir eine Art "Lastenheft", in dem wir die verschiedenen Funktionen abbilden.
Fehlt da nicht noch die Unterscheidung beim Fahren, ob eine Zielposition gegeben ist (FHEM-veranlaßt) oder nicht (Tastendruck). Im ersteren Fall muß man m.E. noch unterscheiden, ob die Zielposition oberhalb der aktuellen ist (dann reagieren wir erst wieder bei "stop") oder unterhalb (dann generieren wir daraus eine neue on-Hold-Position)...
Zitat von: Beta-User am 16 April 2017, 19:47:32Klar, das macht ja die entsprechende Associate-Funktion. Meine Frage bezog sich darauf, wie devspec2array helfen soll. In der Associate-Funktion doch nur, wenn auf einen Schlag für alle entsprechenden Devices default-Werte eingetragen würden, da ansonsten eine 1:1-Zuordnung Fenster-Fensterkontakt definiert werden muss (und hier hilft doch devspec2array nicht oder verstehe ich die Funktion falsch?). Automatisch könnte das dann nur geschehen, wenn aus dem einen Device-Namen der andere abgeleitet werden könnte (Namenskonvention).
"Mein" notify reagiert schon heute auf alle Rolläden und Tür-/Fensterkontakte im Haus und prüft, ob was getan werden soll. Das ist im Moment eben nur bei 4 Rolläden und 2 Drehkontakten sowie 2 "Auf/Zu"-Kontakten der Fall. Damit etwas passiert, braucht es die entsprechenden Attribute.
Zitat von: spi3845 am 17 April 2017, 20:58:58Beim Thema Rolladen-Lüftenpositionen dürfte das gar nicht helfen, eher bei der timer-Generierung bzw- -prüfung. Das war darauf bezogen, dass Hugo in seinen Funktionen quasi eine eigene Funktion geschreiben hat, die (wie ich das verstanden habe) was verglichbares bezweckt.
wie devspec2array helfen soll.
ZitatWie wollen wir Vorschläge und Wünsche abbilden? Bsp. Rollladen fährt aus der ganz offen-Position nach unten und befindet sich über der "Tür offen"-Lüftenposition. Die Tür wird geöffnet. Wohin soll der Rollladen dann fahren? Der eine mag vielleicht, dass der Rolladen sofort stehen bleibt, oder eine obere Aussperrposition anfährt (z.B. nur 30% geschlossen), der dritte mag vielleicht, dass der Rollladen auf die "Tür offen"-Lüftenposition fährt.M.M. wird der Versuch eher schwierig, alle Wünsche und Möglichkeiten abzubilden. Bereits der Versuch, 2 Zwischenzustände zu definieren machte es schwierig, den fahrenden Rolladen abzugreifen erwies sich dann als ausgesprochen tricky.
M. M. gibt es hier zwei Möglichkeiten, die eine ist, dass wir so etwas erkennen, besprechen und flexibel im Code (aka späteren Modul ;) ) abbilden. Dazu werden wir entsprechende zusätzliche userattr brauchen und eine Darstellung, die jeder versteht.
@list = devspec2array("subType=threeStateSensor:FILTER=winOpenMsg=1");
Zitat'automatic.on' => 'attr $DEVICE automatic off', 'automatic.off' => 'attr $DEVICE automatic on',erforderlich ist. Ist aber eher ein völlig unbedeutendes Detail...
ZitatHallo,
ich betreibe meine Rolladensteuerung bereits mit mehreren DOIFs. Die intelligenten Rolläden, also jene wo die Fenster mit Drehgriffsensoren ausgestattet sind, besitzen zwei DOIFs. Eins für die normalen Fahrzeiten und eins für die Türöffnung.
ZitatBei Interesse liefer ich den aber nach. Ist aber nen DOIF
([06:00|8])
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.RolloZustand:FILTER=STATE!="Tag" Tag, set dum.eg.wz.RolladeGartenRechtsPos up)
DOELSEIF
([{sunset("REAL",+900,"18:00","21:00")}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "closed")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="down" down, set dum.RolloZustand:FILTER=STATE!="Nacht" Nacht, set dum.eg.wz.RolladeGartenRechtsPos down)
DOELSEIF
([{sunset("REAL",+900,"18:00","21:00")}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "tilted")
(set rol.eg.wz.RolladeGartenRechts 70, setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand:FILTER=STATE!="Nacht" Nacht, set dum.eg.wz.RolladeGartenRechtsPos 70)
DOELSEIF
([{sunset("REAL",+900,"18:00","21:00")}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand:FILTER=STATE!="Nacht" Nacht)
DOELSEIF
([{sunrise("CIVIL",0,"07:00","08:00")}|7])
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.RolloZustand:FILTER=STATE!="Tag" Tag, set dum.eg.wz.RolladeGartenRechtsPos up)
DOELSEIF
([{sunset("REAL",+4500,"18:00","22:00")}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "closed")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="down" down, set dum.RolloZustand:FILTER=STATE!="Nacht" Nacht, set dum.eg.wz.RolladeGartenRechtsPos down)
DOELSEIF
([{sunset("REAL",+4500,"18:00","22:00")}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "tilted")
(set rol.eg.wz.RolladeGartenRechts 70, setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand:FILTER=STATE!="Nacht" Nacht, set dum.eg.wz.RolladeGartenRechtsPos 70)
DOELSEIF
([{sunset("REAL",+4500,"18:00","22:00")}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand:FILTER=STATE!="Nacht" Nacht)
([sen.eg.wz.TerrassentuerRechts] eq "open" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 80))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "open" and ([?rol.eg.wz.RolladeGartenRechts] eq "down" or [?rol.eg.wz.RolladeGartenRechts] <= 80))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.eg.wz.RolladeGartenRechtsPos up)
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "tilted" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 30))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "tilted" and ([?rol.eg.wz.RolladeGartenRechts] eq "down" or [?rol.eg.wz.RolladeGartenRechts] <= 30))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="30" 30, set dum.eg.wz.RolladeGartenRechtsPos 30)
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "closed" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] eq "100" or [?rol.eg.wz.RolladeGartenRechts] eq "30" or [?rol.eg.wz.RolladeGartenRechts] eq "80") and [?rol.eg.wz.RolladeGartenRechts:speicher] ne "up")
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:speicher], set dum.eg.wz.RolladeGartenRechtsPos [rol.eg.wz.RolladeGartenRechts:speicher])
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "closed" and ([?rol.eg.wz.RolladeGartenRechts] ne "up" or [?rol.eg.wz.RolladeGartenRechts] ne "100" or [?rol.eg.wz.RolladeGartenRechts] ne "30" or [?rol.eg.wz.RolladeGartenRechts] ne "80") and ([?rol.eg.wz.RolladeGartenRechts:speicher] eq "up" or [?rol.eg.wz.RolladeGartenRechts:speicher] eq "100"))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])
([MeinWetter:temp_c] > 19 and [?myTwilight:azimuth] > 220 and [?myTwilight:azimuth] < 290 and [?sen.eg.wz.TerrassentuerRechts] eq "closed" and [?dum.eg.wz.RolloAutomatik] eq "Automatik" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] < 71))
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="70" 70, set dum.eg.wz.RolladeGartenRechtsPos 70, set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="70" 70)
DOELSEIF
([MeinWetter:temp_c] > 19 and [?myTwilight:azimuth] > 220 and [?myTwilight:azimuth] < 290 and [?sen.eg.wz.TerrassentuerRechts] eq "tilted" and [?dum.eg.wz.RolloAutomatik] eq "Automatik" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] < 71))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="70" 70, set dum.eg.wz.RolladeGartenRechtsPos 70, set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="70" 70)
DOELSEIF
([MeinWetter:temp_c] > 19 and [?myTwilight:azimuth] > 220 and [?myTwilight:azimuth] < 290 and [?sen.eg.wz.TerrassentuerRechts] eq "open" and [?dum.eg.wz.RolloAutomatik] eq "Automatik" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 91))
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="90" 90, setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set dum.eg.wz.RolladeGartenRechtsPos 90, set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="70" 70)
DOELSEIF
([MeinWetter:temp_c] < 19 and ([?myTwilight:azimuth] > 220 or [?myTwilight:azimuth] < 290) and [?sen.eg.wz.TerrassentuerRechts] ne "aa" and [?dum.eg.wz.RolloAutomatik] eq "Automatik" and [?dum.RolloZustand] eq "Tag")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.eg.wz.RolladeGartenRechtsPos up, set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="up" up)
DOELSEIF
([MeinWetter:temp_c] < 19 and [?sen.eg.wz.TerrassentuerRechts] ne "aa" and [?rol.eg.wz.RolladeGartenRechts] > 69 and d[?dum.RolloZustand] eq "Tag" and [?dum.eg.wz.RolloAutomatik] eq "Automatik")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.eg.wz.RolladeGartenRechtsPos up, set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="up" up)
([rol.eg.wz.RolladeGartenRechts:STATE] ne [?dum.eg.wz.RolladeGartenRechtsPos:STATE])
(set dum.eg.wz.RolloAutomatik Manuell)
DOELSE
(set dum.eg.wz.RolloAutomatik Automatik)
Zitat von: Beta-User am 06 April 2017, 07:45:11
winOpenShutterTester($$) ist tatsächlich im Moment rein ereignisorientiert ...
Zitat von: kjmEjfu am 23 Mai 2017, 10:50:57Das mit dem "ich gehe ins Bett, mach den Rolladen zu" würde ich außerhalb dieser Art der Automatik lösen (egal, ob man das wie Frini löst oder über scripte). Den 2. Punkt - Gast ist da - würde ich irgendwann dann gerne so lösen, dass ich die "Automatik-Gruppe" des Rolladens dann auf "Manual" (oder eine andere Gruppe, wenn doch später "zwangsgeöffnet" werden soll) setze (per notify auf "Gast kommt/geht" oder manuell über eine weitere Readingsgroup).
Es wäre cool, wenn auch der Status eines zugeordneten Residents mit berücksichtigt werden könnte.
Also z.B. Rollo X automatisch runterfahren, sobald der Status des zugeordneten Residents auf "go to sleep" wechselt, spätestens aber automatisch um xx Uhr.
Oder Rollo Y automatisch hochfahren um xx Uhr, aber nicht wenn ein zugeordneter Resident (Guest) anwesend ist (z.B. fürs Gästezimmer).
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44Öhm, warum nicht? Den Namen "Rol\..*" musst du natürlich ändern in "TestRol.*" (der \ bei mir ist nur da, weil nach meinem "Rol" bei allen Rollladen im Namen ein "." kommt - und mit dem ".*" wird daraus dann "\..*".
Die Anlage der UserAttr wollte er nicht...also händisch, da ja eh nur 1 Rollo.
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44Belegung der UserAttr per Hand ebenfalls okay (auch wenn ich nicht alle vorhandenen verstehe).Sind welche nicht in der Textdatei beschrieben? ???
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44Offen ist noch:Dazu machst du dir am besten einen Dummy "Helligkeit", dem du über ein Notify per
Wie gebe ich meinen Lichtsensor an? Das Device "Wetterstation" hat ein Reading namens "Luminosity2". Der Wert wird also nicht im State dargestellt.
define ntfy.Helligkeit notify (Wetterstation: Luminosity2.*) {fhem("setreading Helligkeit brightness $EVTPART1")}
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44Helfen könntest du mir noch mit dem korrekten notify für die Twilight-Parameter.
define ntfy.sunpos (T_N_Wetter:azimuth.*) set Sonnenposition $EVTPART1
==> auf Dummy "Sonnenposition"define ntfy.sunheight (T_N_Wetter:elevation.*) set Sonnenhoehe $EVTPART1
==> auf Dummy "Sonnenhoehe"define ntfy.Temp (Klima.Terrasse:temperature.*) set Aussentemperatur $EVTPART1
==> auf Dummy "Aussentemperatur"Zitat von: Chris8888 am 02 Juni 2017, 21:09:44Das muss ich mir ansehen. Da scheinen wir den Namen hardcodiert drin zu haben... Danke für den Hinweis!
Was m.E.nicht korrekt ist:
In der Ansicht Timer -> Rolladenstatus zeigt er eine Übersicht aller meiner Rollos an (die beginnen alle mit "Rollo", aber nicht mein TestRollo. Da scheint er die Definition nicht übernommen zu haben.
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44Ist notiert ;)
So als weitere Idee noch: Ich hätte gerne einen "Button" zum Abschalten der Beschattungsautomatik...zB wenn der Fensterputzer da ist...der erschrickt immer so :-)
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44Doch, das ist korrekt - deshalb ist das at zur Berechnung ja nach Mitternacht. Dann werden die korrekten Werte für diesen Tag berechnet. Lass dich überraschen... :P
PS: im Attr Auto_Zeit_hoch_WE_Urlaub habe ich 09:00:00, der Timer für morgen steht trotzdem auf 08:00 Uhr. Richtig?
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44
Was m.E.nicht korrekt ist:
In der Ansicht Timer -> Rolladenstatus zeigt er eine Übersicht aller meiner Rollos an (die beginnen alle mit "Rollo", aber nicht mein TestRollo. Da scheint er die Definition nicht übernommen zu haben.
Zitat von: Chris8888 am 02 Juni 2017, 21:09:44
PS: im Attr Auto_Zeit_hoch_WE_Urlaub habe ich 09:00:00, der Timer für morgen steht trotzdem auf 08:00 Uhr. Richtig?
Zitat von: Cluni am 03 Juni 2017, 09:27:44
Und, hat es funktioniert oder sind jetzt alle sauer auf dich? :P
Zitat von: Cluni am 03 Juni 2017, 00:11:00Okay, mein Fehler. Das kannte ich nicht.
Öhm, warum nicht? Den Namen "Rol\..*" musst du natürlich ändern in "TestRol.*" (der \ bei mir ist nur da, weil nach meinem "Rol" bei allen Rollladen im Namen ein "." kommt - und mit dem ".*" wird daraus dann "\..*".
Zitat von: Cluni am 03 Juni 2017, 00:11:00Beschrieben schon. Ich verstehe zB das hier nicht:
Sind welche nicht in der Textdatei beschrieben? ???
Zitat von: Cluni am 03 Juni 2017, 00:11:00erledigt. Klappt! (für die Nachahmer in den defines oben fehlt noch der Modulname notify.)
Dazu machst du dir am besten einen Dummy "Helligkeit", dem du über ein Notify perCode Auswählendefine ntfy.Helligkeit notify (Wetterstation: Luminosity2.*) {fhem("setreading Helligkeit brightness $EVTPART1")}
den Wert auf das Reading "brightness" schreibst (nagel mich bitte nicht auf das Notify fest - habe es nicht ausprobiert). Und als Helligkeitssensor trägst du dann "Helligkeit" ein.Code Auswählendefine ntfy.sunpos (T_N_Wetter:azimuth.*) set Sonnenposition $EVTPART1
==> auf Dummy "Sonnenposition"Code Auswählendefine ntfy.sunheight (T_N_Wetter:elevation.*) set Sonnenhoehe $EVTPART1
==> auf Dummy "Sonnenhoehe"Code Auswählendefine ntfy.Temp (Klima.Terrasse:temperature.*) set Aussentemperatur $EVTPART1
==> auf Dummy "Aussentemperatur"
T_N_Wetter bzw. Klima.Terrasse musst du natürlich auf deine Gegebenheiten anpassen.
Zitatgemacht inkl Reload. Die Ansicht ändert sich aber nicht. Könnte das an dem DEF liegen? "Rol..*:pct,Automatik_Modus_...."? Muss ich den auch noch anpassen?
In Zeile 425 das "Rol" durch "$group_name" ersetzen...
Zitat von: Cluni am 04 Juni 2017, 14:08:17Ja, genau. In der aktuellen Testtüre habe ich nur einen Fensterkontakt. Deinen Tip schnell getestet und läuft! Prima! WAF = 10 :-)
Hast du an der Türe, die sich ganz öffnen soll einen Fenster oder einen Drehgriff Kontakt. Das geht nur beim Drehgriff kontakt. Es müsste aber auch funktionieren, wenn du den Fensterkontakt als Drehgriff Kontakt einträgst (aber nur dort, nicht bei beiden). Versuche das mal. Natürlich fährt der Rollladen dann immer komplett auf - egal, ob du die Tür kippst oder ganz öffnest.
Zitat von: Cluni am 04 Juni 2017, 14:08:17Ah, dafür also. Das macht bestimmt bei einigen Szenarien Sinn. Danke für die Erklärung.
Die offset Minuten kommen auf die berechnete Zeit drauf. Wenn du überall die gleichen Bedingungen (also zum Beispiel Astro, gleiche Zufallszeit) einstellst, dann ereichst du so, dass alle Rollladen zwar wie gewollt in einem gewissen Maße jeden Tag zu unterschiedlichen und auch in unterschiedlicher Reihenfolge fahren. Aber wenn du beispielsweise bei der Terrasse Tür den offset größer/gleich der Zufallszeit machst, dann ist sichergestellt, dass dieser Rollladen als letztes herunter fährt.
Zitat von: Cluni am 04 Juni 2017, 14:08:17
Das mit den Räumen ist halt an meine Gegebenheiten angepasst. Ich muss mal schauen. Das müsste mal eventuell durch einen eigenen dummy für die komplette Rollladen Automatik mit ein paar Userattributen in den Griff bekommen können. Ich werde mal scharf drüber nachdenken, wie man das machen kann.
Die Sache ist halt, dass ich das anfangs ja nur für mich programmiert habe und deshalb noch einige Dinge da sind, die noch nicht so "beweglich" sind, dass da jeder mit zufrieden ist. Da wäre ein eigenes Modul für diesen Zweck wahrscheinlich zielführender. Damit kenne ich mich aber leider (noch) nicht mit aus und mir fehlt da etwas die Zeit dazu. Es war ja auch der Anstoß für mich, was eigenes zu machen. Die Vorschläge, die hier in verschiedenen threads schon vorgestellt wurden, passten mir aus irgendwelchen Gründen nicht und waren mir zu starr. Bei meiner Version gebe ich aber auch zu, dass man dabei einiges an Vorarbeit leisten muss, damit alles so funktioniert, wie gedacht (Kalender, verschiedene dummies,...). Das ist für Anfänger sehr erschlagend und schwer umsetzbar. Aber langsam aber sicher bin ich sehr zufrieden mit der Funktionsweise. Wir sind auf der Zielgeraden... [emoji6]
Zitat von: Chris8888 am 03 Juni 2017, 14:55:20
In der Anleitung steht:
10.) Dummies f¸r Aussentemperatur, Sonnenhoehe und SonnenPosition, die per Notify mit Daten vom Twilight-Modul versorgt werden:
Sonnenposition muss aber mit kleinem "p" geschrieben werden.
Zitat von: Chris8888 am 03 Juni 2017, 14:55:20
Noch ein Verbesserungsvorschlag:
Ich würde 2 getrennte Attr für "attr Rol\..* Auto_Abschattung_Wartezeit 20" vorschlagen. Ich fahre bisher recht schnell runter bei Sonne 5 Min, aber erst später wieder hoch bei Wolken 20 Min.
Zitat von: Chris8888 am 03 Juni 2017, 14:55:20
Den Nachrichtendienst nutze ich nicht...
set teleBot message
Kann man diese Funktion abschalten?
Zitat von: Chris8888 am 03 Juni 2017, 14:55:20
zB der Notify für die Abschattung wird in 2 Räumen angelegt: Notify und Wetterdaten
Ziemlich viele neue Räume die ich bisher nicht hatte. Da würde ich mir etwas "Passform" für meine Installation wünschen.
define Rolllanden.Automatik.Abschattung dummy
attr Rolllanden.Automatik.Abschattung alias Automatik Abschattung
attr Rolllanden.Automatik.Abschattung group Rollladen_Automatik
attr Rolllanden.Automatik.Abschattung icon weather_cloudy_light
attr Rolllanden.Automatik.Abschattung setList on off
attr Rolllanden.Automatik.Abschattung webCmd on:off
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x95fd928)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x54fcc38)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0xa633d88)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x98c8cd0)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x547c080)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x54f5a50)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0xa26b088)
2017.06.06 08:01:22 3: Ferien.notify return value: SCALAR(0x5a8a030)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x9677ac0)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x54908a8)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x5c866c0)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x5c8eff0)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0xa07bbe0)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0x5505690)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0xa5cf6f8)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0x9defa28)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0x99b11a8)
Zitat von: Chris8888 am 08 Juni 2017, 10:36:51
Ein paar kurze Anmerkungen:
Im Code taucht öfter der Befehl auf: ELSIF ....das soll sicherlich ELSEIF lauten
Zitat von: Chris8888 am 08 Juni 2017, 10:36:51
Und noch 2 kleine Vertipper:
define Rolllanden.Automatik.Abschattung dummy -> Im Dummy ist ein "n" zuviel...aber im Code ist es auch so, von daher funktioniert es ja
Zitat von: Chris8888 am 08 Juni 2017, 10:36:51
In der Doku Punkt 10 fehlt ein "notify".
Zitat von: Chris8888 am 08 Juni 2017, 10:36:51
Danke für die neuen Features! Sehr cool! :-)
Test läuft!
Zitat von: MarkusHiba am 07 Juni 2017, 00:22:24
@ Cluni
ist die Rollladensteuerung nur für HomeMatic Aktoren?
Ich habe leider nur das ROLLO Modul.
Man könnte viel mit DOIF oder notify machen aber das ist viel gerade für so eine Komplexe Steuerung und bei vielen Rollläden (ein Haus).
Ich weis auch das das ROLLO Modul auch schon viel kann.
Könnte man so eine Steuerung für das ROLLO Modul entwickeln und alles über ein Modul steuern lassen, wo man nur noch die anderen Aktoren bzw Sensoren einfügt und dessen Schwellenwerte eingeben muss?
Zitat von: MarkusHiba am 07 Juni 2017, 00:22:24
Ihr alle habt schon super Ideen eines fällt mir noch ein was ist mit Unwetter, Sturm, Hagel, usw. oder die Windgeschwindigkeit?
Zitat von: kjmEjfu am 08 Juni 2017, 10:42:59
Kann man die Dummys eventuell durch Verweise auf andere Geräte überschreiben?
Ich finde es immer unschön, wenn ich mir ein Dummy für einen Wert erstellen muss, den ich schon als Reading an einem Device habe, also z.B. die Werte vom Twilight-Device.
Eventuell könnte man ja eine Variable mit dem Namen des Twilights-Gerätes anlegen und wenn die leer ist, wird stattdessen ein Dummy abgefragt?
Zitat von: Cluni am 08 Juni 2017, 11:09:42
Nein, das passt schon - bei Perl heißt das so... ;)
Zitat von: Chris8888 am 06 Juni 2017, 16:36:08
Hast du eine Idee woher das hier kommt?Code Auswählen2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x95fd928)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x54fcc38)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0xa633d88)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x98c8cd0)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x547c080)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0x54f5a50)
2017.06.06 08:01:21 3: Ferien.notify return value: SCALAR(0xa26b088)
2017.06.06 08:01:22 3: Ferien.notify return value: SCALAR(0x5a8a030)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x9677ac0)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x54908a8)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x5c866c0)
2017.06.06 08:02:54 3: Feiertag.notify return value: SCALAR(0x5c8eff0)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0xa07bbe0)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0x5505690)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0xa5cf6f8)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0x9defa28)
2017.06.06 08:02:55 3: Feiertag.notify return value: SCALAR(0x99b11a8)
Ich konnte auf Anhieb nichts dazu finden....Danke vorab!
NRW_Feiertage { \ fhem "set Feiertag " . (ReadingsVal("NRW_Feiertage", "modeStart", "") =~ "schulferieneu" ? 1: 0) }
NRW_Feiertage { my $Rueckgabe = ReadingsVal("NRW_Feiertage", "modeStart", ""); my $setval = 0; if (index($Rueckgabe,"schulferieneu") > 0) {$setval = 1;}; fhem ("set Feiertag $setval")}
Zitat von: Chris8888 am 03 Juni 2017, 14:55:20
Noch ein Verbesserungsvorschlag:
Ich würde 2 getrennte Attr für "attr Rol\..* Auto_Abschattung_Wartezeit 20" vorschlagen. Ich fahre bisher recht schnell runter bei Sonne 5 Min, aber erst später wieder hoch bei Wolken 20 Min.
.....
2017.06.08 09:05:38 3: bridge_HUEDevice1: I/O device is bridge
2017.06.08 09:05:38 3: bridge_HUEGroup0: I/O device is bridge
2017.06.08 09:05:38 3: bridge_HUEGroup1: I/O device is bridge
2017.06.08 09:05:40 1: HMCCURPC: Device ccu_rpc. Initialized version 0.95 beta
2017.06.08 09:05:40 3: TelegramBot_Define Telegram: called
2017.06.08 09:05:40 3: eq3: Defined with URL http://www.eq-3.de/service/downloads.html and interval 86400
2017.06.08 09:05:40 3: eq3: added hint :text,reading,internal,expression,delete to attr readingMaxAgeReplacementMode in userattr list
2017.06.08 09:05:41 1: Including ./log/fhem.save
2017.06.08 09:05:44 1: ./log/fhem.save: Unknown command if, try help.
Unknown command elsif, try help.
Unknown command elsif, try help.
2017.06.08 09:05:44 3: Device Aussenthermometer added to ActionDetector with 000:10 time
2017.06.08 09:05:44 3: Device BewegungsmelderFlur added to ActionDetector with 000:20 time
2017.06.08 09:05:44 3: Device BewegungsmelderGWC added to ActionDetector with 000:20 time
2017.06.08 09:05:44 3: Device BewegungsmelderKueche added to ActionDetector with 000:20 time
...
2017.06.09 19:50:43 1: PERL WARNING: "my" variable $Tempvar masks earlier declaration in same scope at ./FHEM/99_myUtils_Shutter.pm line 169.
Zitat von: Chris8888 am 11 Juni 2017, 22:37:10
Hast du eine Idee wieso? Und woher kommt die 10?
Zitat von: MarkusHiba am 12 Juni 2017, 13:28:52Nur als Tip von jemandem, der auch keine wirkliche Ahnung von perl hat, aber den "Vorteil", sich mal mit der Modul-Thematik beschäftigt zu haben (siehe einige Posts weiter oben):
Ich bin noch ein Neuling. Ich wollte auch jeden befehl verstehen.
Zitat von: MarkusHiba am 12 Juni 2017, 14:02:30Das meinte ich mit "Komplizierter und aufwendiger kann es immer noch irgendwann werden."
... dann warten bis Wind abgenommen hat aber dort auch warten nicht das zufällig ein Windstoß kommt danach wieder alles auf Automatik.
Zitat von: MarkusHiba am 12 Juni 2017, 14:29:18Das ist nicht das Problem, aber: Es muß zum Rest des Codes passen bzw. der andere Teil des Codes muß damit umgehen können...
Ok ja kompliziert kann man es machen aber ich kenne es so auf Arbeit haben wir auch sowas wenn Wind ist geht Rollo hoch und ist gesperrt wenn Wind weg ist ist es wieder freigegeben sowas wie beim Aussperrschutz könnte man machen für Wind.
Zitat von: MarkusHiba am 12 Juni 2017, 14:17:03Genau der; aber Achtung, ich habe eigentlich seit mehreren Wochen nichts mehr an diesem Teil des codes rumgeschraubt (außer einem Typo), kenne also den wirklichen Stand der Funktionalität nicht, zumal da nur HM abgebildet ist...
Welchen code meinst du auf github? Ist das der https://github.com/rejoe2/FHEM/tree/dev-module/myShutter (https://github.com/rejoe2/FHEM/tree/dev-module/myShutter)
Zitat von: MarkusHiba am 12 Juni 2017, 14:29:18
Ok ja kompliziert kann man es machen aber ich kenne es so auf Arbeit haben wir auch sowas wenn Wind ist geht Rollo hoch und ist gesperrt wenn Wind weg ist ist es wieder freigegeben sowas wie beim Aussperrschutz könnte man machen für Wind.
Zitat von: Beta-User am 12 Juni 2017, 14:41:38Das ist auch nicht das Problem - der andere Code wird wenn gesperrt ja gar nicht ausgeführt. Aber es muss durchdacht, programmiert und getestet werden. Wann genau verlasse ich wieder den sicheren Modus und entsperre wieder alles? Da kommen einige Dinge zusammen, die sich AUSSERHALB der Routine gemerkt werden müssen und sehr viele Dinge/Überlegungen, die beachtet werden müssen. Deshalb erstmal der Ansatz: wenn windiger als Schwelle ==> sicher Zustand und warten auf manuelle Freigabe. ALLES ANDERE WIRD DANN SPÄTER NOCH DAZU KOMMEN!
Das ist nicht das Problem, aber: Es muß zum Rest des Codes passen bzw. der andere Teil des Codes muß damit umgehen können...
Zitat von: kjmEjfu am 12 Juni 2017, 14:48:33Aus diesem Grund mein obiger Vorschlag zu dem Attribut "Aktion bei Schwellwert-Überschreitung (aus, hoch, runter)"
das betrifft aber primär Jalousien. Rollos kann man ja durchaus bei Sturm runterfahren. Da wäre dann die Option eher die komplett runterzufahren und keine Lüftungsschlitze zu lassen. Nach dem Sturm müssten sie auf eine vorher eventuell vorhandene Lüftungsposition fahren.
Ist also gar nicht so einfach ...
Zitat von: Cluni am 12 Juni 2017, 09:51:19
Mojn!
Miss dieser Sache momentan bitte mal nicht zu viel Bedeutung zu. Matthias und ich haben uns grade drauf verständigt, dass wir einige Sachen umbauen wollen, damit u.A. das automatische Speichern in der Nacht entfällt (was mir seit Anfang an ein Dorn im Auge war). Da dies ein ziemlich grundlegender Umbau sein wird, werden wir eh alles nochmal umkramen müssen und uns dementsprechend auch bei den einzelnen Fallunterscheidungen alles nochmal genausten anschauen. Der Umbau könnte jedoch ein paar Tage in Anspruch nehmen, da wir ja auch noch andere Dinge tun. Ich bzw. wir melden uns mit einer aktuellen Version, sobald der Umbau fertig ist! ;)
Grüße Bernd
Zitat von: Franz Tenbrock am 13 Juni 2017, 10:47:01Grade dann solltest du dir schon die Mühe machen und wenigstens die letzten paar Seiten lesen... ::)
Sorry erst mal. hab den ganzen Thread nicht gelesen ....
Wie die meisten hier habe ich auch Rolladenaktoren ( HM )
Wie die meisten hier möchte ich die auch smart schalten.
Zitat von: Franz Tenbrock am 13 Juni 2017, 10:47:01Das alles kann unser Code bereits (von Frini und mir):
so in der Art verschiedener Attribute, Aussperrschutz ein aus, Kopplung Türsensor etc.
Zitat von: Franz Tenbrock am 13 Juni 2017, 10:47:01Bei uns werkeln nur Notifies und ats. Die ats werden auch bleiben (weil sich die Zeiten ja täglich ändern). Momentan sind es aber noch viele Notifies, die auf ein Minimum reduziert werden sollen. Außerdem packt unsere Routine die ganzen Abfragen und Befehle in das jeweilige def des Notify/at - das soll sich bald auch ändern und somit viel übersichtlicher werden. Ein Modul werde ich aber nach momentanen Stand nicht daraus bauen. Aber vielleicht mache ich das ja mal, wenn alles so weit läuft, wie ich es gerne hätte...
kann kein Modul programmieren, aber wäre es nicht sinnvoller ein Rolladen Smart Modul zu entwickeln ?
Wenn man sich die doifs so anschaut wie lange der Code ist und das für jede Rollade ?
Zitat von: Franz Tenbrock am 13 Juni 2017, 10:47:01
Sorry erst mal. hab den ganzen Thread nicht gelesen ....
..
...
..
kann kein Modul programmieren, aber wäre es nicht sinnvoller ein Rolladen Smart Modul zu entwickeln ?
Wenn man sich die doifs so anschaut wie lange der Code ist und das für jede Rollade ?
Zitat von: Cluni am 13 Juni 2017, 11:23:42
Was genau meinst du ansonsten mit einem "Rollladen Smart Modul"?
Zitat von: Franz Tenbrock am 21 Juni 2017, 22:25:07Aus diesem Grund habe ich mehrere Dinge getan. Es gibt zwei Dateien. In Fhem wird ein neues, eigenes Modul mit dem Namen "99_myUtils_Shutter.pm" erzeugt. Dort hinein kommt der Inhalt der gleichnamigen Datei in meinem Anhang am obigen Post. Alle anderen Voraussetzungen sind denke ich ziemlich gut Schritt-für-Schritt in der Textdatei erklärt. Für das alles braucht man kein Ass im Programmieren sein - mehr an die Hand genommen werden kann man ja schon kaum. Und ich denke, dass alles, was ggf. noch offen bleibt, auch entweder selber recht schnell und einfach hier im Forum herausgefunden werden kann und wenn man sich dazu auch noch nicht im Stande sieht, dann kann man ja auch immer noch hier fragen. Aber grundsätzlich ohne genauer hinzusehen einfach sagen, das ist zu kompliziert - na, dann musst du halt weiterhin Knöpfchen drücken, wenn es dir zu hell ist. Man muss ja wenigstens mal die Zeit investieren und das lesen, was andere mühsam zusammen geschrieben haben als Erklärung für Außenstehende (mal von der Programmierung bzw dem Testen ganz abgesehen)...
es sind halt hier auch viele die eben nicht tagtäglich programmieren
Zitat von: Franz Tenbrock am 22 Juni 2017, 11:34:28Die letzten 5 bis 10 Post sollte man aber schon anschauen, wenn man sich mit der Thematik beschäftigt... (die von mir gemeinte Antwort war #170 und nun sind wir bei #178 - ist sogar auf der gleichen Seite)
Du verwaist auf eine Post mit erin pm und Erklärungen, der ist aber auch shcon wieder aufgrund unserer Diskussion einiges weiter oben.
Zitat von: Franz Tenbrock am 22 Juni 2017, 11:34:28Hättest du dir die Mühe gemacht die letzten paar (!) Seiten (ich rede nicht von allen Seiten) zu lesen, dann wüsstest du auch bereits, was ich dazu gesagt habe...
Der Übersichtlichkeit halber wäre doch vielleicht folgendes sinnvoll.
macht einen neuen Thread auf für euer pm Modul, im ersten Post der aktuell gehalten wird die wichtigsten Infos, so dass man sich schnell zurecht findet und schauen kann ob das Modul für einen selber geeignet ist.
Die Updatereihenfolge, die ja in der TXT drin ist, im 1. Post im Klartext dann kann man schnell sehen was läuft Hilfe und Erweiterungen im Thread, hier dann ein Link damit es alle finden.
userattr Auto_Modus_hoch:bei_Abwesenheit,immer,aus Auto_Modus_runter:bei_Abwesenheit,immer,aus Auto_hoch:Zeit,Astro,Civil Auto_runter:Zeit,Astro,Civil Auto_Abschattung_Pos:0,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100 Auto_Abschattung_Pos_nach_Abschattung:-1,0,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100 Auto_Lueften_Pos:0,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100 Auto_offen_Pos:0,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100 Auto_Himmelsrichtung Auto_Abschattung:ja,nein,verspaetet,bei_Abwesenheit,bei_Anwesenheit Auto_Zeit_hoch_frueh Auto_Zeit_hoch_spaet Auto_Zeit_hoch_WE_Urlaub Auto_Zeit_runter_frueh Auto_Zeit_runter_spaet Auto_Zufall_Minuten Auto_Drehgriffkontakt Auto_Fensterkontakt Auto_Luft_Fenster_offen:ja,nein Auto_Aussperrschutz:ja,nein Auto_Geoeffnet_Pos:0,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100 Auto_Abschattung_Winkel_links:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90 Auto_Abschattung_Winkel_rechts:0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90 Auto_Abschattung_Helligkeitssensor Auto_Abschattung_Schwelle_sonnig Auto_Abschattung_Schwelle_wolkig Auto_Abschattung_Wartezeit Auto_Abschattung_min_elevation Auto_Abschattung_min_Temp_aussen Auto_Abschattung_Sperrzeit_nach_manuell Auto_Offset_Minuten_morgens Auto_Offset_Minuten_abends Auto_Abschattung_Sperrzeit_vor_Nacht Auto_Abschattung_schnell_oeffnen:nein,ja Auto_Abschattung_schnell_schliessen:nein,ja