on_as_long_as_daylight (tageslicht/bewölkungsabhängige Steuerung der Rolladen)

Begonnen von habichthugo, 13 Mai 2014, 15:11:19

Vorheriges Thema - Nächstes Thema

habichthugo

Das Ganze (http://forum.fhem.de/index.php?topic=23383) noch mal ordentlich...

Ich habe eine Funktion bzw. Modul geschrieben, mit dem sich die tageslicht/bewölkungsabhängige Steuerung pro Rolladen i.A. in einer Zeile abwickeln lässt (abhängig von twilight bzw. twilight_weather), z.B.:
define MyBlindActuator:auto at +*00:01:00 { on_as_long_as_daylight('MyBlindActuator', 'MyTwilight', 100, 50, $we ? '09:00' : '07:00', '09:00', -2*60, '16:00', '23:59:59', 15*60);; }
Das bewirkt, in Kurzform, dass MyBlindActuator unter der Woche zwischen 7:00 und 9:00 Uhr tageslichtabhängig (twilight_weather >= 50) hochfährt (spätestens 9:00 Uhr; zusätzlich um 0..2 Min. zufällig variiert), am Wochenende immer um 9:00 Uhr (+0..2 Min.). Ab 16:00 Uhr fährt er dann tageslichtabhängig wieder runter (+15 Min. nach eigentlich berechnetem Zeitpunkt; dazu später).

Aufrufparameter im Detail:
on_as_long_as_daylight(
    dev_blind_actuator, # instance of an on/off device, like 'define <dev_blind_actuator> CUL_HM ...' (subType blindActuator)
    dev_twilight,       # instance of 'define <dev_twilight> Twilight ...'
    weather_influence,  # 0..100 [%]
    on_level,           # 0..100 [%]
    earliest_on,        # HH:MM[:SS]
    latest_on,          # HH:MM[:SS]
    delay_on,           # [s] < 0 => random =>(0..-<delay_on>)
    earliest_off,       # HH:MM[:SS]
    latest_off,         # HH:MM[:SS]
    delay_off,          # [s] < 0 => random => (0..-<delay_off>)
)
Die Funktion muss zyklisch aufgerufen werden (at +*00:01:00 => also jede Minute). MyBlindActuator ist z.B. ein HM-Rollladenaktor, MyTwilight eine Instanz von Twilight. Mit weather_influence (0..100%) kann man angeben wieviel Wetter/Bewölkungseinfluss man haben will (100% => nur twilight_weather; 0% => nur twilight), hier also 100%. on_level (0..100%) gibt dann den Schwellwert (gen twilight_weather bzw. twilight) vor, ab dem der Rolladen offen (on) sein sollen, hier 50%. Zwischen 00:00 Uhr und earliest_on (HH:MM[:SS]) soll der Rollladen immer geschlossen sein, hier 09:00 (Wochenende) bzw. 07:00 Uhr (unter der Woche). Bis latest_on (HH:MM[:SS], hier 9:00 Uhr) wird nun aktiv geprüft, ob der on_level erreicht/überschritten ist und ggf. der Rolladen hochgefahren (set <dev_blind_actuator> on). Sollte on_level danach wieder unterschritten werden wird er aber >nicht< wieder geschlossen. Spätestens ab latest_on wird er auf jeden Fall hochgefahren und bleibt bis earliest_off (HH:MM[:SS], hier 16:00 Uhr) offen.
Das Öffnen kann mit delay_on (+-0..24*60*60s, hier 2*60 = 120s) verzögert werden, mit positiven Werten absolut, mit negativen Werten um eine zufällige Zeit (0..-delay_on).
Ab earliest_off wird der on_level dann auf Unterschreitung geprüft und ggf. der Rollladen zugefahren (off). Sollte on_level danach wieder überschritten werden wird er aber >nicht< wieder geöffnet. Spätestens ab latest_off (HH:MM[:SS], hier 23:59:59 Uhr) wird er auf jeden Fall geschossen. delay_off siehe delay_on für's schließen.

I.A. (fhem wird nicht gestoppt) gibt es also nur ein Mal am Tag ein on und ein off, das war mir wichtig, ebenso die 'Kernzeiten', wo der Rolladen offen oder zu ist. Dazu ist der Wettereinfluss regelbar und man kann die Lichtschwelle fein justieren (u.a. z.B. bei Nordfenstern höher als im Süden). Die Delays brauche ich um Szenarien wie 'Licht 15 Min. vor schließen des Rolladen an' oder 'Rolladen zeitversetzt fahren' zu machen (letztlich 'belebtes Haus').

Es wird ein Reading 'state-on_as_long_as_daylight' ('on' oder 'off'; nur je ein Mal am Tag) in dev_blind_actuator geschrieben, und zwar ggf. schon in dem Moment, wenn das Delay abgesetzt wird (define <dev_blind_actuator>:on_as_long_as_daylight.delay at +<delay> ...). Auf 'state-on_as_long_as_daylight' kann man also mit einem notify triggern, z.B.:
define MySwitch:auto notify MyBlindActuator:state-on_as_long_as_daylight:.off set MySwitch on-till 23:00:00
Passend zu obigem Beispiel würde das also MySwitch (z.B. Licht) 15. Min. vor dem Schließen des  MyBlindActuator anschalten (und um 23:00 Uhr wieder aus).

Wer's probieren will: Anhang (99_on_as_long_as_daylight.pm) nach /opt/fhem/FHEM kopieren und laden (fhem neu starten)...

p.s.: Kürzere Stopps von FHEM sollten keine Probleme machen. Längere Abstinenz kann (noch) dazu führen, dass das jeweils nächste Schalten aus bleibt bzw. 'irgend wann' erfolgt. Also z.B. 'fhem stop' in einer on-Phase und dann 'fhem start' in einer off-Phase setzt dann z.B. morgens um 3:00 Uhr ein off ab (fährt den Rolladen zu >und< schaltet das Licht bis 23:00 Uhr ein!).

Nachtrag (10.04.2016):
Die aktuell angehängte Version sollte jetzt auch mit aktuellem FHEM wieder funktionieren. FHEM akzeptiert nun keine Namen mehr, die einen Doppelpunkt (:) enthalten, womit 'define <dev_blind_actuator>:on_as_long_as_daylight.delay ...' nur noch einen Fehler (im Log) ergab. Ansonsten habe ich noch ein paar Parameter zur Steuerung für einen Sonnenschutz ergänzt.
CUL (CC1101-USB-Lite module-V3) + 5*fht80b + 6*Mumbi-Funksteckdosen (=Elro AB440); HM-LAN + 11*HM-LC-Bl1PBU-FM Rollladenaktor + 1*HM-LC-Sw1PBU-FM Funklichtschalter + 2*HM-RC-12-W; Raspbian (Raspberry Pi Model B Rev 1 ECN0001 256MB)

Jens_B

Danke noch mal für die ausführliche Anleitung.
Gruß
Jens


Gesendet von meinem iPhone mit Tapatalk
RaspberryPi 4 (Raspian Buster)FHEM+Homebridge
HMLAN für Homematic
Z-Wave USB Stick
Shelly Devices
Fritz!Box 7590Ax

geri

hi habichthugo!

habe deine funktion probiert aber ich bekomme folgenden logeintrag:
2014.11.05 12:30:08.480 1: PERL WARNING: print() on unopened filehandle DATEI at ./FHEM/99_on_as_long_as_daylight.pm line 65.
ich habe die in meine config folgenden code eingefügt:
define MyBlindActuator:auto at +*00:01:00 { on_as_long_as_daylight('eg_rollladen_badfenster', 'myTwilight', 100, 50, $we ? '09:00' : '07:00', '09:00', -2*60, '16:00', '23:59:59', 5*60);;;; }
und natürlich die "99_on_as_long_as_daylight.pm" hochgeladen.

kannst du dir den logeintrag erklären?

wie kann ich mehrere rollladen ansteuern?

besten dank im vorraus für deine hilfe.

gruss
Gerald
Raspberry mit COC für HM
RS485 USB für HMW

Puschel74

Hallo,

und auch ein reload 99_on_as_long_as_daylight oder ein shutdown restart(Holzhammermethode) gemacht?
VOR dem shutdown aber unbedingt save config anklicken  ;)

grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

geri

Zitat von: Puschel74 am 05 November 2014, 12:45:12
Hallo,

und auch ein reload 99_on_as_long_as_daylight oder ein shutdown restart(Holzhammermethode) gemacht?
VOR dem shutdown aber unbedingt save config anklicken  ;)

grüße
hi!

einen restart hatte ich bereits mehrfach gemacht, aber ein reload nicht. habs mal gemacht und dann folgende einträge iom log erhalten:
2014.11.05 13:13:50.781 1: PERL WARNING: print() on unopened filehandle DATEI at ./FHEM/99_on_as_long_as_daylight.pm line 65.
2014.11.05 13:13:32.805 1: PERL WARNING: Subroutine on_as_long_as_daylight redefined at ./FHEM/99_on_as_long_as_daylight.pm line 16.
2014.11.05 13:13:32.796 1: PERL WARNING: Subroutine ch_auto_state redefined at ./FHEM/99_on_as_long_as_daylight.pm line 52.
2014.11.05 13:13:32.790 1: PERL WARNING: Subroutine at_delay redefined at ./FHEM/99_on_as_long_as_daylight.pm line 37.
2014.11.05 13:13:32.786 1: PERL WARNING: Subroutine _twilight redefined at ./FHEM/99_on_as_long_as_daylight.pm line 31.
2014.11.05 13:13:32.779 1: PERL WARNING: Subroutine on_as_long_as_daylight_Initialize redefined at ./FHEM/99_on_as_long_as_daylight.pm line 11.


gruss
Gerald
Raspberry mit COC für HM
RS485 USB für HMW

habichthugo

Zitat von: geri am 05 November 2014, 13:16:41
einen restart hatte ich bereits mehrfach gemacht, aber ein reload nicht. habs mal gemacht und dann folgende einträge iom log erhalten:
2014.11.05 13:13:50.781 1: PERL WARNING: print() on unopened filehandle DATEI at ./FHEM/99_on_as_long_as_daylight.pm line 65.
2014.11.05 13:13:32.805 1: PERL WARNING: Subroutine on_as_long_as_daylight redefined at ./FHEM/99_on_as_long_as_daylight.pm line 16.
2014.11.05 13:13:32.796 1: PERL WARNING: Subroutine ch_auto_state redefined at ./FHEM/99_on_as_long_as_daylight.pm line 52.
2014.11.05 13:13:32.790 1: PERL WARNING: Subroutine at_delay redefined at ./FHEM/99_on_as_long_as_daylight.pm line 37.
2014.11.05 13:13:32.786 1: PERL WARNING: Subroutine _twilight redefined at ./FHEM/99_on_as_long_as_daylight.pm line 31.
2014.11.05 13:13:32.779 1: PERL WARNING: Subroutine on_as_long_as_daylight_Initialize redefined at ./FHEM/99_on_as_long_as_daylight.pm line 11.

Zeile 65 (print DATEI "my $now = $hour + $min/60 + $sec/3600\n"; ) einfach rausschmeissen (Reste von Testcode). Was die 'redefined' sollen, weiss ich nicht.
CUL (CC1101-USB-Lite module-V3) + 5*fht80b + 6*Mumbi-Funksteckdosen (=Elro AB440); HM-LAN + 11*HM-LC-Bl1PBU-FM Rollladenaktor + 1*HM-LC-Sw1PBU-FM Funklichtschalter + 2*HM-RC-12-W; Raspbian (Raspberry Pi Model B Rev 1 ECN0001 256MB)

habichthugo

Zitat von: geri am 05 November 2014, 12:35:50
wie kann ich mehrere rollladen ansteuern?
Na einfach pro Rolladen einen Eiltrag a la 'define MyBlindActuator:auto at +*00:01:00 { on_as_long_as_daylight(...'.
Natürlich mit jeweils anderem Namen, statt 'MyBlindActuator:auto'. Bei dir z.B. 'eg_rollladen_badfenster:auto', oder 'eg_rollladen_badfenster_auto', oder 'eg_rollladen_badfenster_fahrad'...;)
CUL (CC1101-USB-Lite module-V3) + 5*fht80b + 6*Mumbi-Funksteckdosen (=Elro AB440); HM-LAN + 11*HM-LC-Bl1PBU-FM Rollladenaktor + 1*HM-LC-Sw1PBU-FM Funklichtschalter + 2*HM-RC-12-W; Raspbian (Raspberry Pi Model B Rev 1 ECN0001 256MB)

betateilchen

Das "redefined" tritt immer dann auf, wenn eine bereits geladene Moduldatei neu geladen wird und ist völlig normal.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

geri

Zitat von: habichthugo am 05 November 2014, 14:08:25
Zeile 65 (print DATEI "my $now = $hour + $min/60 + $sec/3600\n"; ) einfach rausschmeissen (Reste von Testcode). Was die 'redefined' sollen, weiss ich nicht.
danke, so klappt es ohne logeinträge.

Zitat von: betateilchen am 05 November 2014, 14:32:10
Das "redefined" tritt immer dann auf, wenn eine bereits geladene Moduldatei neu geladen wird und ist völlig normal.
danke für den hinweis.

gruss
Gerald
Raspberry mit COC für HM
RS485 USB für HMW

geri

Zitat von: habichthugo am 05 November 2014, 14:14:44
Na einfach pro Rolladen einen Eiltrag a la 'define MyBlindActuator:auto at +*00:01:00 { on_as_long_as_daylight(...'.
Natürlich mit jeweils anderem Namen, statt 'MyBlindActuator:auto'. Bei dir z.B. 'eg_rollladen_badfenster:auto', oder 'eg_rollladen_badfenster_auto', oder 'eg_rollladen_badfenster_fahrad'...;)
dachte es gibt einen weg alle rollladen in einen eintrag um code zu sparen.  ;)

gruss
Gerald
Raspberry mit COC für HM
RS485 USB für HMW

habichthugo

Zitat von: geri am 05 November 2014, 16:08:22
dachte es gibt einen weg alle rollladen in einen eintrag um code zu sparen.  ;)
Nö, wobei mir diese Form das zu machen auch nicht wirklich gefällt. Als eigenes Modul ware besser, aber noch habe ich andere Baustellen...
Aber eine Zeile pro Rolladen ware bei mir so oder so fällig, da ich jeden Rolladen anders steuere.
CUL (CC1101-USB-Lite module-V3) + 5*fht80b + 6*Mumbi-Funksteckdosen (=Elro AB440); HM-LAN + 11*HM-LC-Bl1PBU-FM Rollladenaktor + 1*HM-LC-Sw1PBU-FM Funklichtschalter + 2*HM-RC-12-W; Raspbian (Raspberry Pi Model B Rev 1 ECN0001 256MB)

geri

Zitat von: habichthugo am 05 November 2014, 16:42:32
Nö, wobei mir diese Form das zu machen auch nicht wirklich gefällt. Als eigenes Modul ware besser, aber noch habe ich andere Baustellen...
Aber eine Zeile pro Rolladen ware bei mir so oder so fällig, da ich jeden Rolladen anders steuere.
hi!
habe es jetzt mit "structure" versucht. es läuft super.

gruss
Gerald
Raspberry mit COC für HM
RS485 USB für HMW

habichthugo

CUL (CC1101-USB-Lite module-V3) + 5*fht80b + 6*Mumbi-Funksteckdosen (=Elro AB440); HM-LAN + 11*HM-LC-Bl1PBU-FM Rollladenaktor + 1*HM-LC-Sw1PBU-FM Funklichtschalter + 2*HM-RC-12-W; Raspbian (Raspberry Pi Model B Rev 1 ECN0001 256MB)

geri

Zitat von: habichthugo am 06 November 2014, 17:34:26
?
eine "structure" aller rollladen = 1 zeile in der config
und diese in deine code = 1 zeile in der config

ist weniger code als jeden einzeln ein zeile zu spendieren. und ich kann die "structure" auch für andere aktionen nutzen. ;-)

gruss
Gerald
Raspberry mit COC für HM
RS485 USB für HMW

habichthugo

Zitat von: geri am 06 November 2014, 18:39:51
eine "structure" aller rollladen = 1 zeile in der config
und diese in deine code = 1 zeile in der config
Ok, structure ist ein Erweiterungsmodul, aber im Wiki für mich nicht verständlich beschrieben. Kannst du mal anschaulich zeigen, was das soll?
CUL (CC1101-USB-Lite module-V3) + 5*fht80b + 6*Mumbi-Funksteckdosen (=Elro AB440); HM-LAN + 11*HM-LC-Bl1PBU-FM Rollladenaktor + 1*HM-LC-Sw1PBU-FM Funklichtschalter + 2*HM-RC-12-W; Raspbian (Raspberry Pi Model B Rev 1 ECN0001 256MB)