Wenn item = ein dann nach 1h Stunde ausschalten

Alles zu Rules, Items, Sitemaps unter openHAB 1.X

Moderatoren: seppy, udo1toni

Benutzeravatar
seppy
Beiträge: 626
Registriert: 24. Sep 2015 20:25
Wohnort: Bonn

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von seppy » 9. Jul 2019 16:38

Hi,

ich konnte jetzt nicht rauslesen, ob Deine rule funktioniert. Aber für die Lüftergeschichte ist das expire binding perfekt geeignet:

Code: Alles auswählen

Switch badluefter "Badlüfter" (gBad) [ "Lighting" ] {knx="<0/0/40", expire="1h00m,command=OFF" }
Damit wärst Du ohne Regel und ohne Timer fertig. Nur das Expire binding muss aktiviert sein!

Grüße,
Seppy
Homematic über 1x HMLAN an homegear. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 60 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2)
- Werkstatt Kompressorsteuerung (HM-LC-Sw4-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation, iBeacon und WLAN
- Philips HUE Einbindung

Kito
Beiträge: 18
Registriert: 7. Jul 2019 15:30

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von Kito » 10. Jul 2019 17:33

Danke, funktioniert damit auch wunderbar. 8-)

Habe noch eine Frage zu meiner anderen rule. Sie funktioniert, so dass bei Sonnenuntergang die Gruppe Rollos runter gefahren werden. Wie kann man das umsetzen, dass ich sage es soll nur 50% gefahren werden? Geht das über die rule?

Code: Alles auswählen

when
Channel 'astro:sun:xxx:set#event' triggered START
then
createTimer(now.plusMinutes(2)) [|   gSUG.allMembers.forEach(gSUG | { gSUG.sendCommand(DOWN) } ) ]
end
Edit.. hat sich erledigt... sendCommand(50)

Benutzeravatar
peter-pan
Beiträge: 357
Registriert: 28. Nov 2018 12:03
Wohnort: Schwäbisch Gmünd

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von peter-pan » 10. Jul 2019 18:12

Ich kenne mich mit Rollos zwar nicht aus (habe leider keine), aber es sollte funktionieren, wenn du die Items als Typ Rollershutter definiert hast. Hier ein paar Links zu diesem Thema:
https://community.openhab.org/t/virtuel ... er/64604/4
https://www.openhab.org/docs/configurat ... .html#type
viewtopic.php?t=401

Du findest hier im Forum sicher noch mehr Posts zu diesem Thema. Schau doch mal unter Openhab2 nach. Was mich zu der Frage bringt, warum hast du das unter Openhab 1 gepostet ?

Zum Problem mit dem Astro-Binding. Es gibt natürlich die Möglichkeit des Offsets.

Zum besseren Verständnis, ier meine astro.things-Datei

Code: Alles auswählen

//    Astro - Binding Geo-Position  geolocation="xx.xxxxxx,y.yyyyy,zzz"

Thing astro:sun:local     "Sonnen Daten"    [geolocation="xx.xxxxxx,9.8709123,zzz", interval=300]
Thing astro:moon:local    "Mond Daten"      [geolocation="xx.xxxxxx,9.8709123,zzz", interval=300]
                                        

Thing astro:sun:minus90   "Offset -90"     [geolocation="xx.xxxxxx,9.8709123,zzz", interval=300]{
  Channels:
    Type rangeEvent : set#event [
      offset=-90
    ]
    Type start : set#start [
      offset=-90
    ]
    Type end : set#end [
      offset=-90
    ]
  }

Thing astro:sun:stowing   "Offset -180"     [geolocation="xx.xxxxxx,9.8709123,zzz", interval=300]{
  Channels:
    Type rangeEvent : set#event [
      offset=-180,
      earliest="19:40"
    ]
  }
Thing astro:sun:stowing1   "Offset 20"     [geolocation="xx.xxxxxx,9.8709123,zzz", interval=300]{
  Channels:
    Type rangeEvent : noon#event [
      offset=20,
      earliest="13:00"
    ]
    Type rangeEvent : set#event [
      offset=20,
      earliest="20:10"
    ]
    Type start : rise#start [
      offset=20,
     earliest="09:00"
    ]
    Type end : rise#end [
      offset=20
    ]
    Type start : set#start [
      offset=20,
      earliest="21:10"
    ]
    Type end : set#end [
      offset=20,
      latest="21:50"
    ]
  }
  Thing astro:sun:stowing2   "Offset -90"     [geolocation="xx.xxxxxx,9.8709123,zzz", interval=300]{
  Channels:
    Type rangeEvent : set#event [
      offset=-90
    ]
    Type start : set#start [
      offset=-90
    ]
    Type end : set#end [
      offset=-90
    ]
  }

und ein paar korrespondierende Regeln

Code: Alles auswählen

var Number count=1
var Number mooncount=0

/*===============================================================================
|                           Begin Astro Rules                                   |
=================================================================================*/
//===============================================================================
*/
//===============================================================================
rule "Stowing1_Noon200_Event Test"
    when
            Channel 'astro:sun:stowing1:noon#event' triggered START
    then
        logInfo("astro-rules" + '_Test', " Noon_200 Event. START")
        //EG_EG_Kind2_Licht.sendCommand(ON)
end
//===============================================================================
rule "Stowing1_Set200_Start Test"
    when
            Channel 'astro:sun:stowing1:set#event' triggered START
    then
        logInfo("astro-rules" + '_Test', " Set_200 Event. START")
        //EG_EG_Kind2_Licht.sendCommand(ON)
end
rule "Moonset Ende"
    when
        Channel 'astro:moon:local:set#event' triggered END
    then
        logInfo("astro-rules" + '_02'," Der Mond geht unter. END")
        //Sonoff_Basic_03.sendCommand(ON)
end
//===============================================================================
rule "Sunset_180 Start"
    when
            Channel 'astro:sun:stowing:set#event' triggered START
    then
        logInfo("astro-rules" + '_03', " Sunset_180 Start. START")
        //EG_EG_Kind2_Licht.sendCommand(ON)
end
//===============================================================================
rule "Sunset_180 Ende"
    when
            Channel 'astro:sun:stowing:set#event' triggered END
    then
        logInfo("astro-rules" + '_04', " Sunset_180 Ende. END")
        //EG_EG_Kind2_Licht.sendCommand(ON)
end

//===============================================================================
rule "Sunrise Start"
    when
            Channel 'astro:sun:local:rise#event' triggered START
    then
        logInfo("astro-rules" + '_05', " Sunrise START ")
        //EG_EG_Kind2_Licht.sendCommand(ON)
end

//===============================================================================
rule "Mittag Start"
    when
        Channel 'astro:sun:local:noon#event' triggered START
    then
        logInfo("astro-rules" + '_06', " Mittag - noon. START")
        //Sonoff_Basic_03.sendCommand(ON)
end
//===============================================================================
Vieleicht kannst du ja damit was anfangen.

Benutzeravatar
sihui
Beiträge: 638
Registriert: 11. Apr 2018 19:03

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von sihui » 10. Jul 2019 19:10

peter-pan hat geschrieben:
10. Jul 2019 18:12
Es gibt natürlich die Möglichkeit des Offsets.
Hat er nicht oder will er nicht :(
sihui hat geschrieben:
8. Jul 2019 22:28
Für deine Beispiele bietet sich aber eher ein Offset im Range Event des Astro Bindings an.
Kito hat geschrieben:
8. Jul 2019 22:34
Offset gibt es nicht im Astro Binding.
openHAB2 mit Zwave, Tinkerforge, Alexa, ESP8266, Logitech Harmony, Philips HUE und Xiaomi Hardware

Kito
Beiträge: 18
Registriert: 7. Jul 2019 15:30

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von Kito » 10. Jul 2019 19:14

Ich habe nur im Astro Binding geschaut und da steht nichts von offset.

Peter Aschinger
Beiträge: 205
Registriert: 8. Feb 2019 12:12

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von Peter Aschinger » 10. Jul 2019 20:09

....doch....
Im Binding im jeweiligen Channel:
Screenshot_20190710-200751.png

Benutzeravatar
peter-pan
Beiträge: 357
Registriert: 28. Nov 2018 12:03
Wohnort: Schwäbisch Gmünd

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von peter-pan » 10. Jul 2019 22:41

Ich denke da gibt es ein kleines Missverständnis. Wie Peter (mein Namensvetter) das beschrieben hat, kann man das auch in der PaperUI setzen. Ich bevorzuge die Textvariante.
Man kann es aber auch nachlesen. z. B. hier.

Benutzeravatar
udo1toni
Beiträge: 1788
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von udo1toni » 14. Jul 2019 19:44

Kito hat geschrieben:
10. Jul 2019 17:33
Danke, funktioniert damit auch wunderbar. 8-)

Habe noch eine Frage zu meiner anderen rule. Sie funktioniert, so dass bei Sonnenuntergang die Gruppe Rollos runter gefahren werden. Wie kann man das umsetzen, dass ich sage es soll nur 50% gefahren werden? Geht das über die rule?

Code: Alles auswählen

when
Channel 'astro:sun:xxx:set#event' triggered START
then
createTimer(now.plusMinutes(2)) [|   gSUG.allMembers.forEach(gSUG | { gSUG.sendCommand(DOWN) } ) ]
end
Edit.. hat sich erledigt... sendCommand(50)
Wenn Deine Rollos absolutes Positionieren unterstützen, kannst Du auch einen Zahlwert senden:

Code: Alles auswählen

gSUG.allMembers.forEach[i | i.sendCommand(50)]
Bitte nicht identische Bezeichner über unterschiedliche Dinge in unterschiedlichen Kontexten verwenden, das geht irgendwann grandios schief.

Im vorliegenden Fall gibt es eine Gruppe gSUG, deren Member nacheinander einen Befehl bekommen. Dabei sollte das einzelne Item nicht mit dem Gruppennamen gSUG dargestellt werden, sondern mit einem übergeordnet einmaligen Zeichen (hier i für Item). Da i nur in diesem Kontext gültig ist, kann man i auch in anderen Kontxten verwenden, aber natürlich nicht in übergeordneten oder untergeordneten Kontexten, denn hier schlägt die Vererbung zu.

Kito
Beiträge: 18
Registriert: 7. Jul 2019 15:30

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von Kito » 18. Jul 2019 16:39

Hey Udo, danke für deine Rückmeldung. Habe es nun so hinterlegt.

Code: Alles auswählen

when
Channel 'astro:sun:xxxx:set#event' triggered START
then
createTimer(now.plusMinutes(2)) [|   gSUG.allMembers.forEach(i | { i.sendCommand(DOWN) } ) ]
end
Das könnte ich jetzt mit jeder Gruppe so machen mit dem "i"?

Und dann habe ich noch eine Bitte. Wie muss denn eine Regel aussehen, dass diese z.b. nur von Datum x bis Datum y aktiv sein soll. Nehmen wir mal diese Regel:

Code: Alles auswählen

rule "Aussenbeleuchtung EIN"
 
when
Channel 'astro:sun:xxx:set#event' triggered START
then
createTimer(now.plusMinutes(1)) 
        [|
            sendCommand(gAussenbel, ON)
        ]
end
Kann man das nach Tagen regeln? Also Regel nur ein zwischen dem 01.08.2019 und 20.08.2019 z.B. Danke

Benutzeravatar
udo1toni
Beiträge: 1788
Registriert: 11. Apr 2018 18:05
Wohnort: Darmstadt

Re: Wenn item = ein dann nach 1h Stunde ausschalten

Beitrag von udo1toni » 18. Jul 2019 19:58

Solche Einschränkungen kann man auf unterschiedliche Weise erreichen. Enweder Du fragst die entsprechenden Werte in der Rule ab:

Code: Alles auswählen

if(now.getDayOfMonth < 21 && now.getMonthOfYear == 8 && now.getYear == 2019)
oder Du setzt z.B. ein Item in Abhängigkeit vom Datum über entsprechende Rules und wertest dieses Item aus. Letzteres kann von Vorteil sein, wenn die Bedingungen ansonsten zu kompliziert werden. Man kann ja Rules über Time cron Trigger auslösen lassen...

Deine Schreibweise des Lambdas ist fehlerhaft. Mag sein, dass Du mit den geschweiften Klammern zum Ziel kommst, es ist aber verkehrt. Korrekt sieht die Rule so aus:

Code: Alles auswählen

var Timer tSunset = null
rule "zwei Minuten nach sunset"
when
    Channel 'astro:sun:xxxx:set#event' triggered START
then
    tSunset?.cancel
    tSunset = createTimer(now.plusMinutes(2), [|
        gSUG.allMembers.forEach[i | i.sendCommand(DOWN)]
    ])
end
Alternativ kannst Du das Lambda auch nach dem createTimer() definieren, aber so wie ich es geschrieben habe, wird deutlich, dass es sich beim Lambda um ein Argument der Funktion createTimer() handelt.
Alles innerhalb eines Lambdas befindet sich in einem eigenen Kontext, es ist also nicht nötig, noch geschweifte Klammern zu setzen.

Man sollte einen Timer möglichst nicht ohne Handler anlegen, sonst verliert man die Kontrolle darüber. So, wie ich es geschrieben habe, ist sichergestellt, dass der Timer exakt einmal läuft, gleichgültig, wie oft die Rule triggert. dabei gewinnt der letzte Trigger, da vor Anlegen des Timers ein eventuell laufender Timer abgebrochen wird.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast