Seite 1 von 3

Regel wenn ein Gruppemember ON ist

Verfasst: 25. Feb 2020 22:39
von Piko
Hallo,
ich mal wieder.

Ich steh mal wieder auf dem Schlauch.


Ich würde gerne folgende Szene regeln.

Alle haben das haus verlassen, ein Member der Gruppe glicht ist noch an. Dann soll es abgeschaltet werden. Irgendwie Scheiter ich gerade daran. Wobei es wahrscheinlich mal wieder so einfach ist. :-(


habt ihr da einen Ansatz für mich ?

Code: Alles auswählen

if (glicht.members ....
weiter komme ich gerade im Kopf nicht mehr nachdem ich gefühlte 100 verschiedene Sachen probiert habe.


schönen Abend noch

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 25. Feb 2020 23:09
von 03chris
die regel muss dann etwa so aufgebaut werden:

Code: Alles auswählen

...
then
    gLicht.members.filter[ licht|licht.state != OFF ].forEach [ licht | licht.sendCommand(OFF)]
end
dann sollten alle Lichter, die noch an sind, ein Ausschaltbefehl bekommen.

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 26. Feb 2020 00:32
von udo1toni
Fast.

Man sollte zwei unterschiedliche Objekte verwenden, also

Code: Alles auswählen

...
then
    gLicht.members.filter[ i|i.state != OFF ].forEach[ licht | licht.sendCommand(OFF)]
end
Die Rule setzt voraus, dass es sich um Switch Items handelt (wenngleich ein State != OFF auch für einen Zahlenwert gültig ist, also ein Dimmer Item ebenfalls ausgeschaltet würde).

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 26. Feb 2020 09:11
von Piko
Super, das hat geklappt.

jetzt hab ich da letzte Nacht was gelesen :)

Ist es auch möglich das ich mir ein Telegram sende welche Lampe noch an war ?
hab das wie in nem anderen Beitrag mit

Code: Alles auswählen

triggeringItem.name
versucht, das bringt aber wenig erfolg :D


ich wünsche euch einen schönen start in den Tag

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 26. Feb 2020 09:34
von udo1toni
triggeringItem ist ein implizites Objekt, welches eben das triggernde Item enthält. Hier möchtest Du aber wissen, an welche Lichter der OFF-Befehl gesendet wurde. Du nutzt dazu einfach mehrere Befehle im Lambda:

Code: Alles auswählen

...
then
    gLicht.members.filter[ i|i.state != OFF ].forEach[ licht | 
        licht.sendCommand(OFF)
        sendTelegram("bot",licht.name + " musste ausgeschaltet werden!")
    ]
end
Telegram verwende ich momentan nicht, vermutlich ist die Syntax mindestens leicht abweichend ;) Der Punkt ist, dass nun für jedes eingeschaltete Licht ein Telegram versendet wird.
Wenn Du nur genau ein Telegram bekommen willst, musst Du mit einer Variablen arbeiten:

Code: Alles auswählen

...
then
    var String strLightsOn = ""
    gLicht.members.filter[ i|i.state != OFF ].forEach[ licht | 
        licht.sendCommand(OFF)
        if (strLightsOn != "") 
            strLightsOn =strLightsOn +  ", "
        strLightsOn =strLightsOn + licht.name
    ]
    if(strLightsOn != "")
        sendTelegram("bot",strLightsOn + " musste"+if(strLighsOn.contains(",")) "n" + " ausgeschaltet werden!")
end
In strLightsOn werden alle Itemnamen der eingeschalteten Lichter gesammelt, während sie abgeschaltet werden. Ist der String anschließend nicht leer, so muss die Nachricht versendet werden. Da der String einen oder auch mehr Namen enthalten kann, muss für eine korrekte Formulierung noch das n in den Text hinein gemogelt werden, falls im Sammelstring mindestens ein Komma vorkommt.

Fleißaufgabe: Finde heraus, wie Du das letzte Komma im Sammelstring durch die Zeichenfolge " und" ersetzen kannst und denke daran, den ternären Operator (das ist das if() im sendTelegram) entsprechend anzupassen. :D

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 26. Feb 2020 09:47
von Piko
Wow
Das nenn ich mal eine Antwort.
Die Aufgabe werde ich mir sobald ich kann ansehen.

Jetzt muss ich leider zur Arbeit, obwohl ich lieber am pc sitzen würde [emoji23]

Aber danke schon mal für die Mühe und die ausführliche Erklärung.


Gesendet von iPhone mit Tapatalk

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 5. Mär 2020 14:45
von Piko
Hallo Udo,

ich mal wieder ;)

Ich hab deine 2. Variante heute mal ausprobiert und auch soweit anpassen können. Allerdings habe ich einen kleinen Fehler bei dem du mir sicherlich helfen kannst.

Werden mehrere Lampen ausgeschaltet funktioniert es super, wird nur eine ausgeschaltet, bekomme ich als telegramm EZ_Deckenlampe musstenull.

Also hängt das ja irgendwie mit der Variablen zusammen ? Die gibt wahrscheinlich NULL aus ? was mich wundert das dann der Rest der regel abgebrochen wird.


Danke dir schon mal für deinen Rat

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 5. Mär 2020 19:33
von udo1toni
Oh. ja, vermutlich ein kleiner Denkfehler meinerseits :)

Ändere mal bitte den sendTelegram Aufruf:

Code: Alles auswählen

sendTelegram("bot",strLightsOn + " musste" + if(strLighsOn.contains(",")) "n" else "" + " ausgeschaltet werden!")
zwischen den beiden + steht ein ternärer Operator, wenn der nicht zutrifft, wird dann vermutlich null zurückgegeben, wenn man kein else angibt.

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 5. Mär 2020 21:02
von Piko
Ja jetzt verstehe ich das auch.
Das ergibt Sinn. War schon am überlegen wegen dem Else
Allerdings wusste ich noch nicht genau wo ich es setzten muss.

Werd es wenn ich es schaffe gleich noch probieren.

Danke dir.


Gesendet von iPhone mit Tapatalk

Re: Regel wenn ein Gruppemember ON ist

Verfasst: 2. Apr 2020 12:09
von Piko
Hallo Udo,

da es mit der letzten Rule so super geklappt hat und ich immer wieder was neues entdecke, bräuchte ich nochmal deine Hife. :-)

Ich möchte in einer Rule alle staten addieren und dann posten.

Die abfrage ist ja noch recht einfach :-D
aber wie gebe ich die werte aus und addiere sie?

hier mal der Anfang der Rule

Code: Alles auswählen

rule "Gesamtverbrauch errechnen"

when 
Member of g_gesamtV received update

then 
 Gesamtverbraucht_Wh.postUpdate( ??? )

end 

im netz finde ich viel aber nicht das richtige für mich glaube ich.

oder vielleicht hast du noch ne bessere Idee wie ich den Gesamtverbrauch errechne. Denn ne 100% Lösung ist das für mich nicht, da die werte via Mqtt von Shelly´s kommen. Diese verlieren da bekanntlich die werte nach einen Stromausfall. Hast du dafür vielleicht auch eine Lösung ?

Das sind meine Things

Code: Alles auswählen

Number                      Gesamtverbrauch_Stehlampe           "Gesamtvervrauch Stehlampe [%.1f W]"                        (g_gesamtV)                                         { channel="mqtt:topic:52686471:gesamtverbrauch_stehlampe" }
Number                      Gesamtverbrauch_Flur                "Gesamtverbrauch Flur [%.1f W]"                             (g_gesamtV)                                         { channel="mqtt:topic:b1f4d480:gesamtverbrauch_flur"}
Number                      Gesamtverbrauch_Wandlampe           "Gesamtverbrauch Wandlampe[%.1f W]"                         (g_gesamtV)                                         { channel="mqtt:topic:92b809b7:gesamtverbrauch_wandlampe"}    
Number                      Gesamtverbrauch_Deckenlampe_Ez      "Gesamtverbrauch Deckenlampe Esszimmer[%.1f W]"             (g_gesamtV)                                         { channel="mqtt:topic:92b809b7:gesamtverbrauch_deckemlampe"}
Number                      Gesamtverbrauch_Deckenlampe_Wz      "Gesamtverbrauch deckenlampe wohnzimmer[%.1f W]"            (g_gesamtV)                                         { channel="mqtt:topic:39dc0e98:Gesamtverbrauch_Deckenlampe_Wz"}
Number                      GesamtverbrauchEzVitrine             "Gesamtverbrauch Esszimmer Vitrine[%.1f W]"                (g_gesamtV)                                         { channel="mqtt:topic:39dc0e98:GesamtverbrauchEzVitrine"}
Danke schon mal für deine mühe :)