Astroschaltung - Aktivieren/Deaktivieren

Begonnen von 4ndreas, 04 September 2017, 09:24:39

Vorheriges Thema - Nächstes Thema

4ndreas

Guten Morgen,

durch die letzte Hilfe https://forum.fhem.de/index.php/topic,76022.msg678891.html#msg678891 konnte ich erfolgreich meine erste Astroschaltung realisieren.
Im nächsten Schritt hatte ich die Vorstellung, dass ich einen Schalter mit drei Schaltmöglichkeiten erstelle: Ein/Aus/Astro
Das ist mir gelungen, obwohl ich mir vorstellen kann, dass es eleganter geht (Korrekturvorschläge sind gerne willkommen).

Jetzt meine Frage. Wenn ich den Schaler auf Astro stelle passiert erst einmal nichts, bis eine Bedingung für die Astroschaltung eintritt.
Besser wäre es, wenn geprüft würde, ob auf Grund der Astro-Bedingung aktuell das Licht ein- oder ausgeschaltet sein sollte.
Ist das ohne große Klimmzüge zu realisieren?

Nachfolgend der aktuelle Stand meiner Konfiguration:
# Aussenlicht - Grundeinrichtung
define Od.Kammer WifiLight RGBW LD382A:192.168.2.24
attr Od.Kammer colorCast 0, -20, -20, -25, 0, -10
attr Od.Kammer defaultColor 0,100,30
attr Od.Kammer room Outdoor
attr Od.Kammer webCmd RGB
attr Od.Kammer whitePoint 1, 1, 1
attr Od.Kammer widgetOverride RGB:colorpicker,RGB

# Aussenlicht - Astroschaltung
define Od_Kammer_morgens_an DOIF ([06:00-{sunrise_abs("REAL")}] and Value("switch_Od.Kammer") eq "Astro")(set Od.Kammer on) DOELSE (set Od.Kammer off)
define Od_Kammer_morgens_aus at *{sunrise_abs("REAL")} {if (Value("switch_Od.Kammer") eq "Astro") {fhem ("set Od.Kammer off")}}
define Od_Kammer_abends_an at *{sunset_abs("REAL")} {if (Value("switch_Od.Kammer") eq "Astro") {fhem ("set Od.Kammer on")}}
define Od_Kammer_abends_aus at *{"23:59:00"} {if (Value("switch_Od.Kammer") eq "Astro") {fhem ("set Od.Kammer off")}}

# Aussenlicht - Schalter
define switch_Od.Kammer dummy
attr switch_Od.Kammer devStateIcon Aus:off:Ein Ein:on:Astro Astro:on-for-timer:Aus
attr switch_Od.Kammer room Outdoor
attr switch_Od.Kammer setList state:Ein,Aus,Astro
attr switch_Od.Kammer webCmd Ein:Aus:Astro

# Aussenlicht - notify
define n_Od.Kammer_On notify switch_Od.Kammer:Ein set Od.Kammer on
define n_Od.Kammer_Off notify switch_Od.Kammer:Aus set Od.Kammer off


Gruß Andreas

amenomade

DOIF ([06:00-{sunrise_abs("REAL")}] and [switch_Od.Kammer] eq "Astro")wird auch beim Schalten vom Switch getriggert. Somit kannst Du dir das at sunrise sparen. Die zwei letzte ATs würde auch im ersten DOIF mit DOELSEIF Bedingungen reinpacken. Es ist immer einfacher zu debuggen, wenn ein Device nur an einer Stelle gesteuert wird.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

4ndreas

Zitat von: amenomade am 04 September 2017, 12:10:26
DOIF ([06:00-{sunrise_abs("REAL")}] and [switch_Od.Kammer] eq "Astro")wird auch beim Schalten vom Switch getriggert.

Ich habe die Schreibweise von...
Value("switch_Od.Kammer") eq "Astro" ... geändert auf ...
[switch_Od.Kammer] eq "Astro"
Macht das einen Unterschied?
Leider wird das Schalten auf "Astro" scheinbar nicht getriggert.
Bsp.: Jetzt, also ca. 12:45, sollte per Astro-Schaltung das Licht ausgeschaltet sein. Wenn ich den Schalter von "Ein" auf "Astro" ändere, sollte doch das Licht ausschalten, oder?

Im Event monitor sehe ich nur:
2017-09-04 12:48:35 dummy switch_Od.Kammer Astro
Brauche ich ggf. noch ein notify?



4ndreas

Mist, Klammer falsch gesetzt.
Habe jetzt alle notify's entfernt die DOIF Anweisung erweitert - läuft!
Danke!

4ndreas

Guten Morgen,
seit längerer Zeit schon ist mir aufgefallen, dass meine Schaltung nicht mehr funktioniert, wenn die Sonne vor 06:00 Uhr aufgeht.
Ich habe versucht, das in den Griff zu bekommen, aber leider ohne Erfolg.

Die folgende Logik hat funktioniert, solange die Sonne nach 06:00 aufgegangen ist:
([dy_Od.Kammer] eq "Astro" and ([06:00-{sunrise_abs("REAL")}] or [{sunset_abs("REAL")} - 23:59]))
  (set de_Od.Kammer on)
DOELSEIF ([dy_Od.Kammer] eq "Ein")
  (set de_Od.Kammer on)
DOELSEIF
  (set de_Od.Kammer off)


Mein aktueller Versuch wäre der Folgende:
(([dy_Od.Kammer] eq "Astro") and [06:00 - 23:59] and ({isday()} != 1))
  (set de_Od.Kammer on)
DOELSEIF ([dy_Od.Kammer] eq "Ein")
  (set de_Od.Kammer on)
DOELSE
  (set de_Od.Kammer off)


Leider führt das zu einem Fehler, den ich mir nicht erklären kann.
2018.07.16 09:11:25 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 144) line 1.
2018.07.16 09:11:25 3: eval: di_Od.Kammer: warning in condition c01
2018.07.16 09:11:25 3: de_Od.Kammer RGBW LD382A set on (0, 100, 30) 0
2018.07.16 09:11:25 3: de_Od.Kammer set HSV 0, 100, 30 with ramp: 0, flags:


Kann mir bitte jemand hierbei weiterhelfen?

Danke Andreas

Prof. Dr. Peter Henning

Wieso "nicht mehr" ?

Der berechnete Zeitraum für
[06:00-{sunrise_abs("REAL")}]
war schon immer nicht existent, wenn die Sonne vor 6:00 aufgeht.

Bitte die aktuelle Commandref zu DOIF lesen, da ist alles erläutert.

LG

pah

4ndreas

Zitat von: Prof. Dr. Peter Henning am 16 Juli 2018, 11:27:17
Der berechnete Zeitraum für
[06:00-{sunrise_abs("REAL")}]
war schon immer nicht existent, wenn die Sonne vor 6:00 aufgeht.
Ja, das weiß ich.

Zitat von: Prof. Dr. Peter Henning am 16 Juli 2018, 11:27:17
Bitte die aktuelle Commandref zu DOIF lesen, da ist alles erläutert.
Das habe ich getan, incl. einer entsprechenden Recherche.
Da ich nicht weiterkomme, habe ich hier meine Frage gestellt.
Sorry, aber ein Verweis auf die Doku hilft mir nicht weiter.

Prof. Dr. Peter Henning

#7
https://wiki.fhem.de/wiki/DOIF

Und vielleicht das Ganze nicht über 4 FHEM_Devices realisieren, sondern über ein kurzes Perl Unterprogramm.

LG

pah

4ndreas

Eigentlich habe ich kein Problem mit der DOIF Syntax.
Das Problem liegt wohl eher in der Bedingung.

Damian

Zitat von: 4ndreas am 16 Juli 2018, 13:10:04
Eigentlich habe ich kein Problem mit der DOIF Syntax.
Das Problem liegt wohl eher in der Bedingung.

   
[06:00-{sunrise("REAL",0,"06:00")}]

Damit erzeugst du ein Intervall, welches im ungünstigsten Fall [06:00-06:00] darstellt. Hier wird zwar um 06:00 Uhr einmal pro Tag getriggert, allerdings ist das Intervall nicht wahr.

Zur Information: Intervalle der Art z. B. [06:00-05:00] sind beim DOIF sehr wohl definierbar, sie sind von 06:00 Uhr bis zum nächsten Tag um 05:00 Uhr wahr oder umgekehrt gesagt: sie sind von 05:00 bis 06:00 Uhr nicht wahr.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

4ndreas

OK, danke für die Hinweise.
Aber, wie würde die Lösung aussehen?
Das Ganze bringt mich kein Stück weiter.

Was muss an den folgenden Zeilen geändert werden, damit es läuft?
(([dy_Od.Kammer] eq "Astro") and [06:00 - 23:59] and ({isday()} != 1))
  (set de_Od.Kammer on)
DOELSEIF ([dy_Od.Kammer] eq "Ein")
  (set de_Od.Kammer on)
DOELSE
  (set de_Od.Kammer off)

amenomade

Du muss überlegen, was triggern soll.
[dy_Od.Kammer] triggern wenn man es ändert
[06:00 - 23:59] triggert um 6:00 und um 23:59
[06:00-{sunrise("REAL",0,"06:00")}] triggert einmal um 6 Uhr, und einmal bei sunrise. Wenn sunrise vor 6 Uhr ist, triggert er um 6. Intervall ist aber (siehe Antwort von Damian) nicht wahr => Bedingung falsch.

Was willst Du denn machen, wenn die Sonne vor 6 Uhr aufgeht? Von sunrise bis 6 an machen?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus