Seite 2 von 3

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

Verfasst: 9. Jul 2019 16:38
von seppy
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

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

Verfasst: 10. Jul 2019 17:33
von Kito
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)

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

Verfasst: 10. Jul 2019 18:12
von peter-pan
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.

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

Verfasst: 10. Jul 2019 19:10
von sihui
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.

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

Verfasst: 10. Jul 2019 19:14
von Kito
Ich habe nur im Astro Binding geschaut und da steht nichts von offset.

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

Verfasst: 10. Jul 2019 20:09
von PeterA
....doch....
Im Binding im jeweiligen Channel:
Screenshot_20190710-200751.png

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

Verfasst: 10. Jul 2019 22:41
von peter-pan
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.

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

Verfasst: 14. Jul 2019 19:44
von udo1toni
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.

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

Verfasst: 18. Jul 2019 16:39
von Kito
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

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

Verfasst: 18. Jul 2019 19:58
von udo1toni
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.