Seite 1 von 1
Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 20. Mär 2019 18:39
von DavGre
Hallo zusammen,
ich komme bei einer Regel nicht weiter. So sieht meine rule aus:
Code: Alles auswählen
rule "Steckdose Flur oben an"
when
Channel "astro:sun:home:set#event" triggered START
then
if(Anwesenheitskontrolle.state == ON) {
sendCommand (S20_flur_oben, ON)
}
end
Ich würde gerne folgende Regel realisieren:
- S20_flur_oben soll 30 Minuten vor Sonnenuntergang und nur wenn der Anwesenheitsstatus = On ist, angehen.
Das klappt mit der o.g. Regel auch schon wunderbar.
- S20_flur_oben soll aber auch angehen, wenn es < 30 Minuten vor Sonnenuntergang ist und der Anwesenheitsstatus dann erst auf ON wechselt.
Wenn ich z.B. im Winter erst um 21 Uhr nach Hause komme und den Anwesenheitsstatus auf ON setze, soll die Lampe natürlich auch noch angehen.
Wie lässt sich das am besten mit in der o.g. Regel realisieren? Ich stehe gerade total auf dem Schlauch.
Re: Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 20. Mär 2019 18:51
von udo1toni
Entweder Du definierst eine zweite Rule, oder Du fügst einen weiteren Trigger zu Deiner Rule hinzu. Allerdings musst Du so oder so ein Item haben, in dem die Information gespeichert ist, ob Sonnenuntergang vorbei ist. Das Item muss dann logischerweise spätestens zu Sonnenaufgang wieder OFF sein, wenn es zu Sonnenuntergang nach ON wechselt.
Re: Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 20. Mär 2019 19:52
von DavGre
Heißt also, dass ich ein Item definieren muss, welches 30 Minuten vor Sonnenuntergang auf ON switched und zum Sonnenaufgang dann auf OFF switched.
Dann könnte ich in der Regel also nicht mehr den Channel "astro:sun:home:set#event" ansprechen, sondern einfach das neu erstellte Item.
Gedankengang so halbwegs korrekt?
Meine rule könnte dann ungefähr so aussehen?
Code: Alles auswählen
Wenn Anwesenheitskontrolle received command On
then
if Item Sonnenuntergang is ON {
send command Steckdose ON
(Nur mal grob niedergeschrieben. Das die Begrifflichkeiten der Regel so nicht korrekt sind ist mir bewusst)
Re: Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 21. Mär 2019 08:02
von udo1toni
Genau. Der event Channel ist ein Trigger, hat aber keinen Status. Deshalb kannst Du ihn leider nicht direkt in der Rule verwenden. Eine Möglichkeit ist, ein Item (z.B. Tageszeit) zu schaffen, welches mittels Rules verschiedene Zustände annimmt. Das Item kann z.B. ein String Item sein und dann NACHT, MORGEN, TAG, MITTAG, NACHMITTAG, ABEND als Werte speichern. Die Umschaltung der Werte machst Du mit einer oder mehreren Rules, über Time cron, Astro Events, whatever.
Vorteil dieses Items ist, dass Du es in allen Rules verwenden kannst (kommt ja schon häufiger vor, dass bestimmte Vorgänge tageszeitabhängig sind).
Deine "Schalt Rule" löst dann auf das Item Tageszeit aus und zusätzlich auf das zweite Item (in diesem Fall Anwesenheitskontrolle). Damit löst Die Rule in beiden Situationen aus. In der Rule prüfst Du, ob beide Items den passenden Zustand haben. Die Rule kann sich auch um das Abschalten kümmern, ist ja nur ein anderer Zustand der beiden Items.
Du kannst auch ein Number Item verwenden. Wenn Du den Zustand in der Sitemap darstellen willst, nutzt Du eine MAP. In der Rule kannst Du dann einfach auf Zahlen prüfen, evtl. auch auf Zahlenbereiche (je nachdem, wie man die Definition macht).
Re: Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 26. Mär 2019 18:16
von DavGre
Okay. Habe ich soweit verstanden.
Scheitere aber glaube ich daran, den Status des Tageszeit_dummy richtig "auszulesen".
Folgenden Aufbau habe ich geschaffen:
Code: Alles auswählen
String Tageszeit_dummy "Tageszeit [MAP(tageszeit.map):%s]" // Dummy, über den die Tageszeit definiert wird. Zunächst nur Tag u. Nacht
Dazu die entsprechende tagszeit.map
Und eine dummy.rules
Code: Alles auswählen
rule "Tag"
when
Channel "astro:sun:home:rise#start" triggered START
then
Tageszeit_dummy.postUpdate(1)
end
rule "Nacht"
when
Channel "astro:sun:home:set#event" triggered START
then
Tageszeit_dummy.postUpdate(2)
end
Das Tageszeit_dummy Item funktioniert soweit auch. Es verändert, wie gewünscht, seinen Status.
Wie baue ich das denn jetzt in eine funktionierende Regel ein?
Code: Alles auswählen
rule "Steckdose Flur oben an"
when
Item Tageszeit_dummy.state == 2
then
if(Anwesenheitskontrolle.state == ON) {
sendCommand (S20_flur_oben, ON)
}
end
Diese Regel habe ich geschrieben. Die funktioniert aber nicht.
Re: Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 26. Mär 2019 19:17
von udo1toni
Ja nee, nicht so
erstmal das Item. Mit dem Mapping ist es schon mal gut, aber warum verwendest Du dann ein String Item? So geht es richtig:
Code: Alles auswählen
Number Tageszeit_dummy "Tageszeit [MAP(tageszeit.map):%s]"
Das Mapping sorgt dafür, dass aus dem (als String übergebenen) Status des Items ein anderer String gebildet und im Label angezeigt wird. Das Item selbst bleibt davon unberührt und sollte vom Typ Number sein.
Die beiden Rules für die Aktualisierung des dummies sollten so passen.
Die dritte Rule muss aber den allgemeinen Rgeln einer Rule entsprechen:
Code: Alles auswählen
rule "Steckdose Flur oben an"
when
Item Tageszeit_dummy changed or
Item Anwesenheitskontrolle changed
then
if(Anwesenheitskontrolle.state != ON || !(Tageszeit_dummy.state instanceof Number)) {
return;
}
if((Tageszeit_dummy.state as Number) == 2 && S20_flur_oben.state != ON)
S20_flur_oben.sendCommand(ON)
} else if((Tageszeit_dummy.state as Number) == 1 && S20_flur_oben.state != OFF)
S20_flur_oben.sendCommand(OFF)
}
end
Die Rule triggert, falls sich eines der beteiligten Items ändert.
Falls die Anwesenheitskontrolle nicht ON is oder Tageszeit_dummy keine gültige Zahl enthält, wird die Rule beendet.
Falls Tageszeit_dummy = 2 ist, S20_flur_oben aber nicht ON ist, wird der Befehl ON gesendet.
Falls Tageszeit_dummy = 1 ist, S20_flur_oben aber nicht OFF ist, wird der Befehl OFF gesendet.
Vorteil des Number Items ist, dass man dann auch Bereiche prüfen kann, also z.B.
Code: Alles auswählen
if((Tageszeit_dummy.state as Number) > 1 && (Tageszeit_dummy.state as Number) <= 5)
was natürlich verwendet werden kann, um mehrere Tageszeiten abzudecken (man muss sich natürlich vorher Gedanken über die geschickteste Anordnung machen).
Re: Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 4. Apr 2019 13:20
von DavGre
Ich melde mich nochmal. Deine Regel hat super geklappt. Inzwischen schalte ich mehrere Lampen damit und bin absolut zufrieden.
Als nächstes möchte ich aber noch einen "Schlafmodus" einbauen. Das habe ich auch mit einem ganz simplen Switch, wie schon bei der Anwesenheitserkennung, gemacht:
Im Prinzip soll das Licht ausgehen, sobald Anwesenheitskontrolle OFF oder Nachtmodus ON sind. Dazu habe ich folgende Regel aufgestellt:
Code: Alles auswählen
rule "Steckdose Flur oben aus"
when
Item Nachtmodus received command ON or
Item Anwesenheitskontrolle received command OFF
then
sendCommand(S20_flur_oben, OFF)
end
Bis hier klappt alles wunderbar.
Wie kann ich den Switch "Nachtmodus" jetzt noch bei der ON-Regel ergänzen?
Im Prinzip soll die Lampe wieder angehen, sofern der Nachtmodus auf OFF wechselt und der Tageszeit_dummy noch auf 2 steht.
Code: Alles auswählen
rule "Steckdose Flur oben an"
when
Item Tageszeit_dummy changed or
Item Anwesenheitskontrolle changed
then
if(Anwesenheitskontrolle.state != ON || !(Tageszeit_dummy.state instanceof Number)) {
return;
}
if((Tageszeit_dummy.state as Number) == 2 && S20_flur_oben.state != ON)
S20_flur_oben.sendCommand(ON)
} else if((Tageszeit_dummy.state as Number) == 1 && S20_flur_oben.state != OFF)
S20_flur_oben.sendCommand(OFF)
}
end
Re: Frage zur Regel: Lampe an, wenn Sonnenuntergang+Anwesend
Verfasst: 4. Apr 2019 19:22
von udo1toni
Na ja, eben genauso:
Code: Alles auswählen
then
if(Nachtmodus == ON || Anwesenheitskontrolle.state != ON || !(Tageszeit_dummy.state instanceof Number)) {
return;
}