(gelöst) DOIF für sonnenaufganggestütztes Schalten einer Lampe

Begonnen von romarira, 17 November 2018, 09:42:14

Vorheriges Thema - Nächstes Thema

romarira

Ich komme mit diesem Code nicht weiter


([{sunrise(-9522,"05:15","07:15")}-{sunrise(0,"05:15","07:15")}] and [hellejahreszeit_dum] eq "nein" and !$we) (set Kaminlicht on, set teleBot message Kaminlicht morgens an) DOELSE (set Kaminlicht off, set teleBot message Kaminlicht morgens aus)


Was möchte ich erreichen?

Ich habe einen dummy "hellejahreszeit_dum". Wenn dieser auf nein ist, soll an den Tagen Montag bis Freitag eine gewisse Zeit vor Sonnenaufgang eine Lampe eingeschaltet werden. Frühestens aber um 5:15 Uhr, spätestens um 7:15 Uhr. Bei Sonnenaufgang soll sie dann wieder ausgeschaltet werden, auf jeden Fall aber um 7:15 Uhr.

Bei dem DOIF oben hatte ich den Uhrzeitteil erst mit festen Zeiten, z.B. [17:15-17:17] getestet. Das funktionierte. Wenn ich jetzt die Uhrzeiten durch die sunrise-Befehle ersetze, funktioniert es nicht, wie mir die Telegram-Nachrichten gezeigt haben.

Ich habe heute morgen (Samstag) zwei Telegram-Nachrichten bekommen. Und zwar um 5:15 und 7:15, jeweils mit der Nachricht "Kaminlicht morgens aus". Das heißt, es wurde weder die !$we-Bedingung eingehalten und es wurde nur der DOELSE-Teil abgearbeitet.

Ich bin noch Anfänger und weiß jetzt nicht, wo hier mein Fehler liegt.

Vielleicht kann mir jemand von euch helfen.
Intel NUC, FHEM VMe auf debian Proxmox-Server, Sonoff S20/Basic/POW, Shelly 1 & 2.5
Homematic IP-HK-Thermostate, Wandthermostat, FTK
FHT80b-HK-Thermostate und FTK
Raspberrymatic auf separater VM
Unifi/Ubiquiti-Wlan-Netzwerk, DHCP-Server über Firtzbox

Gisbert

Hier mal ein funktionierendes Beispiel mit "heller" Jahreszeit im DOIF ohne zusätzlichen Dummy und mit sunset:

define Treppenhaus.Markisensteuerung DOIF ([?Treppenhaus.Markise.hoch.dum] eq "off" and ($md ge "04-15" and $md le "10-15") \
and [?Treppenhaus.Markise:level] != 0 and [?Wetter.Proplanta:wind] <= 25 and [TH.Kuhlmannweg8:temperature] >= 18 \
and ReadingsAge("Wetter.Proplanta","weather","") <= 900 and [?Wetter.Proplanta:weather] =~ /^(sonnig|klar|heiter)$/ \
and [?Buienradar:rainDataNow] == 0 and [?13:00-22:00] and [?myTwilight:azimuth] >=185 and sunset_abs(-3420) gt $hms) \
(set Treppenhaus.Markise off) \
DOELSEIF ([?Treppenhaus.Markise.hoch.dum] eq "off" and ($md ge "04-15" and $md le "10-15") \
and [?Treppenhaus.Markise:level] != 0 and [?Wetter.Proplanta:wind] <= 25 and [TH.Kuhlmannweg8:temperature] >= 20 \
and ReadingsAge("Wetter.Proplanta","weather","") <= 900 \
and ([?Wetter.Proplanta:weather] =~ /^(sonnig|klar|heiter|wolkig)$/ or [?Wetter.Proplanta:weather2] =~ /^(starkbewoelkt)$/) \
and [?Buienradar:rainDataNow] == 0 and [?13:00-22:00] and [?myTwilight:azimuth] >=185 and sunset_abs(-3420) gt $hms) \
(set Treppenhaus.Markise off) \
DOELSEIF ([?Treppenhaus.Markise.runter.dum] eq "on" and [?Treppenhaus.Markise:level] != 100 \
and ([Wetter.Proplanta:wind] > 25 or [Buienradar:rainDataNow] != 0 \
or ([?Wetter.Proplanta:weather] !~ /^(sonnig|klar|heiter|wolkig)$/ and [?Wetter.Proplanta:weather2] !~ /^(starkbewoelkt)$/))) \
(set Treppenhaus.Markise on) \
DOELSEIF ([?Treppenhaus.Markise.runter.dum] eq "off" and [?Treppenhaus.Markise:level] != 100 \
and ([Wetter.Proplanta:wind] > 25 or [TH.Kuhlmannweg8:temperature] < 18 \
or ReadingsAge("Wetter.Proplanta","weather","") > 1260 \
or ([?Wetter.Proplanta:weather] !~ /^(sonnig|klar|heiter|wolkig)$/ and [?Wetter.Proplanta:weather2] !~ /^(starkbewoelkt)$/) \
or [Buienradar:rainDataNow] != 0 or [myTwilight:azimuth] <185 or sunset_abs(-3420) le $hms)) \
(set Treppenhaus.Markise on) \
DOELSEIF ([Treppenhaus.Markise.runter.dum] eq "on") \
DOELSEIF ([Treppenhaus.Markise.hoch.dum] eq "on") \
DOELSEIF ([Treppenhaus.Markise:level] == 100 and [+3600]) (setreading Treppenhaus.Markise level 100) \
DOELSEIF ([Treppenhaus.Markise:level] == 0 and [+600]) (setreading Treppenhaus.Markise level 0)
attr Treppenhaus.Markisensteuerung comment Umlaut in bewölkt durch einen Punkt (.) ersetzt. \
Der Punkt kann alles mögliche sein, ein normales Zeichen, ein Umlaut oder auch ein Leerzeichen. \
Das scheint aber bei "stark bewölkt" nicht gut zu funktionieren. \
Deshalb wurde eine weiteres Reading bei Wetter.Proplanta (weather2) erzeugt, welches "starkbewoelkt" zurückliefert.
attr Treppenhaus.Markisensteuerung devStateIcon (cmd_1|cmd_2|cmd_8):fts_sunblind@red (cmd_3|cmd_4|cmd_7):fts_sunblind_0@gray cmd_5:fts_shutter_down@red cmd_6:fts_shutter_up@red
attr Treppenhaus.Markisensteuerung icon fts_sunblind
attr Treppenhaus.Markisensteuerung repeatsame 3:3:3:3:3:3:3:60
attr Treppenhaus.Markisensteuerung room CUL_HM,Mobile,Rollladen
attr Treppenhaus.Markisensteuerung wait 60:60:60:60:1:1:1:1
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Gisbert

#2
Und hier noch ein funktionierendes Beispiel einer Haustürleuchte, die morgens und abends angeht, wenn es dunkel ist oder wird, und automatisiert ausgeht:
define Haustuer.Licht.Schaltzeit DOIF ([06:45|8] and [?Schalter.1] eq "off" and [?Feiertag.NRW] == 0 and sunrise_abs(1130) gt $hms) \
(set Haustuer.Licht on-till {sunrise_abs(1190)}) \
DOELSEIF (([07:45|7] or ([07:45] and [?Feiertag.NRW] == 1)) and [?Schalter.1] eq "off" and sunrise_abs(1130) gt $hms) \
(set Haustuer.Licht on-till {sunrise_abs(1190)}) \
DOELSEIF ([{sunset_abs(-660)}] and [?Schalter.1] eq "off") \
(set Haustuer.Licht on-till {sunset_abs(2700,"22:13:26","23:11:43")})
attr Haustuer.Licht.Schaltzeit devStateIcon .*:fts_shutter_1w_0
attr Haustuer.Licht.Schaltzeit do always
attr Haustuer.Licht.Schaltzeit icon FS20.off
attr Haustuer.Licht.Schaltzeit room CUL_HM

Schalter1 ist eine Weihnachtsbeleuchtung an der Haustür; ich könnte mir dafür einen sinnigeren Namen einfallen lassen  :)

Hier noch die Weihnachtsbeleuchtung / Schalter1 in der "dunkelen" Jahreszeit:
defmod Schalter.1.Schaltzeit DOIF ([06:30|8] and ($md ge "11-24" or $md le "01-06") and [?Feiertag.NRW] == 0 and sunrise_abs(1130) gt $hms) \
(set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}) \
DOELSEIF (([07:15|7] or ([07:15] and [?Feiertag.NRW] == 1)) and ($md ge "11-24" or $md le "01-06") and sunrise_abs(1130) gt $hms) \
(set Schalter.1 on-till {sunrise_abs(2090,"5:00","9:30")}) \
DOELSEIF ([{sunset_abs(-1200,"15:00","23:00")}] and ($md ge "11-24" or $md le "01-06")) \
(set Schalter.1 on-till {sunset_abs(2700,"22:47:26","23:33:43")})
attr Schalter.1.Schaltzeit devStateIcon .*:fts_shutter_1w_0
attr Schalter.1.Schaltzeit do always
attr Schalter.1.Schaltzeit icon FS20.off
attr Schalter.1.Schaltzeit room CUL_HM
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Damian

Zitat von: romarira am 17 November 2018, 09:42:14
Ich komme mit diesem Code nicht weiter


([{sunrise(-9522,"05:15","07:15")}-{sunrise(0,"05:15","07:15")}] and [hellejahreszeit_dum] eq "nein" and !$we) (set Kaminlicht on, set teleBot message Kaminlicht morgens an) DOELSE (set Kaminlicht off, set teleBot message Kaminlicht morgens aus)


Was möchte ich erreichen?

Ich habe einen dummy "hellejahreszeit_dum". Wenn dieser auf nein ist, soll an den Tagen Montag bis Freitag eine gewisse Zeit vor Sonnenaufgang eine Lampe eingeschaltet werden. Frühestens aber um 5:15 Uhr, spätestens um 7:15 Uhr. Bei Sonnenaufgang soll sie dann wieder ausgeschaltet werden, auf jeden Fall aber um 7:15 Uhr.

Bei dem DOIF oben hatte ich den Uhrzeitteil erst mit festen Zeiten, z.B. [17:15-17:17] getestet. Das funktionierte. Wenn ich jetzt die Uhrzeiten durch die sunrise-Befehle ersetze, funktioniert es nicht, wie mir die Telegram-Nachrichten gezeigt haben.

Ich habe heute morgen (Samstag) zwei Telegram-Nachrichten bekommen. Und zwar um 5:15 und 7:15, jeweils mit der Nachricht "Kaminlicht morgens aus". Das heißt, es wurde weder die !$we-Bedingung eingehalten und es wurde nur der DOELSE-Teil abgearbeitet.

Ich bin noch Anfänger und weiß jetzt nicht, wo hier mein Fehler liegt.

Vielleicht kann mir jemand von euch helfen.

Du musst eins wissen:

Das Gegenteil von a and b and c ist  not a  or  not b  or  not c

D. h. sobald einer der Operanden (a,b,c) nicht wahr ist gilt der sonst-Fall.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

romarira

Hallo Gisbert, hallo Damian,

vielen Dank für die Tipps und die Codebeispiele. Ich schaue mir das mal an und teste wieder.
Ich gebe eine Rückmeldung, was bei rausgekommen ist.
Intel NUC, FHEM VMe auf debian Proxmox-Server, Sonoff S20/Basic/POW, Shelly 1 & 2.5
Homematic IP-HK-Thermostate, Wandthermostat, FTK
FHT80b-HK-Thermostate und FTK
Raspberrymatic auf separater VM
Unifi/Ubiquiti-Wlan-Netzwerk, DHCP-Server über Firtzbox

romarira

Die Codebeispiele von Gisbert waren mir zu schwierig um sie für meine Verhältnisse anzupassen. An dem Versuch den Ausschaltbefehl direkt mit in das DOIF aufznehmen bin ich auch gescheitert.
Ich habe jetzt zwei DOIF angelegt, eins für einschalten und eins für ausschalten. Und das klappt.

Hier meine Lösung:
DOIF für Ein
([hellejahreszeit_dum] eq "nein" and !$we and [{sunrise(-9522,"05:15","07:15")}]) (set Kaminlicht on, set teleBot message Kaminlicht morgens an)

DOIF für Aus

([hellejahreszeit_dum] eq "nein" and !$we and [Kaminlicht:state] eq "ON" and [{sunrise(0,"05:15","07:15")}]) (set Kaminlicht off, set teleBot message Kaminlicht morgens aus)


Intel NUC, FHEM VMe auf debian Proxmox-Server, Sonoff S20/Basic/POW, Shelly 1 & 2.5
Homematic IP-HK-Thermostate, Wandthermostat, FTK
FHT80b-HK-Thermostate und FTK
Raspberrymatic auf separater VM
Unifi/Ubiquiti-Wlan-Netzwerk, DHCP-Server über Firtzbox

Damian

Zitat von: romarira am 19 November 2018, 12:38:19
Die Codebeispiele von Gisbert waren mir zu schwierig um sie für meine Verhältnisse anzupassen. An dem Versuch den Ausschaltbefehl direkt mit in das DOIF aufznehmen bin ich auch gescheitert.
Ich habe jetzt zwei DOIF angelegt, eins für einschalten und eins für ausschalten. Und das klappt.

Hier meine Lösung:
DOIF für Ein
([hellejahreszeit_dum] eq "nein" and !$we and [{sunrise(-9522,"05:15","07:15")}]) (set Kaminlicht on, set teleBot message Kaminlicht morgens an)

DOIF für Aus

([hellejahreszeit_dum] eq "nein" and !$we and [Kaminlicht:state] eq "ON" and [{sunrise(0,"05:15","07:15")}]) (set Kaminlicht off, set teleBot message Kaminlicht morgens aus)


Wenn du zwei kannst, dann kannst du auch eins: ;)

DOIF für Ein
([hellejahreszeit_dum] eq "nein" and !$we and [{sunrise(-9522,"05:15","07:15")}]) (set Kaminlicht on, set teleBot message Kaminlicht morgens an)
DOELSEIF
([hellejahreszeit_dum] eq "nein" and !$we and [Kaminlicht:state] eq "ON" and [{sunrise(0,"05:15","07:15")}]) (set Kaminlicht off, set teleBot message Kaminlicht morgens aus)

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

romarira

ZitatWenn du zwei kannst, dann kannst du auch eins: ;)

Stimmt! Hat geklappt   :D
Intel NUC, FHEM VMe auf debian Proxmox-Server, Sonoff S20/Basic/POW, Shelly 1 & 2.5
Homematic IP-HK-Thermostate, Wandthermostat, FTK
FHT80b-HK-Thermostate und FTK
Raspberrymatic auf separater VM
Unifi/Ubiquiti-Wlan-Netzwerk, DHCP-Server über Firtzbox