Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von djuscha »

hab Telegramm Binding 2 und Action Telegramm 1

shaggy0815
Beiträge: 20
Registriert: 24. Nov 2019 09:37
Answers: 0

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von shaggy0815 »

Hab ich auch nicht gewusst, dass jetzt beides mit dem Telegramm Binding 2 geht.

Hab mein Telegramm Action 1 jetzt rausgeschmissen und nutze nur noch das Binding und es geht. Hab lediglich meine
Rules zum senden von Messages so angepasst wie im Binding beschrieben.

Meine Regel zum Anfordern der Lampenstatus sieht jetzt so aus:

Code: Alles auswählen

rule "Telegramm Status Lampen anfordern"
when
    Item LastMessageText received update "Status Lampen"
then
    val StringBuilder sb = new StringBuilder
    gLampen.members.filter[ i | i.state == ON].forEach[i | sb.append(", " + i.name) ]
    //sendTelegram("openHAB", sb.toString)
    val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot")
    telegramAction.sendTelegram(sb.toString)
end
Die auskommentierte Zeile hab ich ersetzt durch die beiden darauffolgenden so wie im Binding beschrieben. Mir ist nur nicht ganz klar,
warum ich laut Beschreibung eine telegramAction Instanz erstellen muss, bevor ich telegramAction.sendTelegram() nutzen kann.

Wahrscheinlich hole ich mir über getActions quasi die Verbindungsparameter, richtig?

Benutzeravatar
udo1toni
Beiträge: 13979
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von udo1toni »

getActions() liefert einen Handle für die Action des angegebenen Addons. Dieser Handle steht dann über das Objekt zur Verfügung.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

J-N-K
Beiträge: 126
Registriert: 20. Jun 2020 12:21
Answers: 4
Wohnort: Gelsenkirchen, NRW

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von J-N-K »

Es macht wenig Sinn, jetzt neu mit dem v1 Binding einzusteigen (Erkennt man an der 1 am Ende des Namens). OH3 wird keine v1 Bindings mehr unterstützen. Wenn im v2-Binding etwas fehlt, besser Bescheid sagen. Meistens ist sowas schnell nachrüstbar.
openHAB 4.0.0-SNAPSHOT - - local build -
APU2, 4GB RAM, 32GB SSD, Debian Buster
openHAB Core/Distro/Addons & SmartHome/J Maintainer

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von djuscha »

hab jetzt endlich Telegramm Binding auf 2 umgestellt und alle regeln geändert. Es geht soweit.. Kann auch jetzt Lampen aus und einshalten über Telegramm
Was noch nicht geht diese Status Abfrage bekomme ne Warnung

Code: Alles auswählen

Failed to send telegram message: Bad Request: message text is empty
die Regel hab ich so probiert

Code: Alles auswählen

rule "Telegramm Status Lampen anfordern"
when
    Item Telegram_Last_Text received update "Status Lampen"
then
    val StringBuilder sb = new StringBuilder
    GR_Lichtdr.members.filter[ i | i.state == ON].forEach[i | sb.append(", " + i.name) ]
 
    val telegramAction = getActions("telegram","telegram:telegramBot:bot1")
    telegramAction.sendTelegram(sb.toString)
end
GR_Lichtdr ist meine Gruppe Lichter Darussen.

Code: Alles auswählen

Group:Switch:OR(ON,OFF) 		GR_Lichtdr		"Decolicht  [(%d)]" 	<lightbulb>
was mache ich falsch?

Benutzeravatar
udo1toni
Beiträge: 13979
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von udo1toni »

Ich habe jetzt noch nicht mit StringBuilder gearbeitet, aber ich würde erwarten, dass Du nicht direkt auf den Wert zugreifen kannst, sondern etwas wie sb.get oder so verwenden musst.

Tipp: probiere mit logInfo() was da raus kommt.

Code: Alles auswählen

logInfo(“logger“,“sb hat den Wert {}“,sb)
Und dann kannst Du verschiedene Optionen ausprobieren.


Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von djuscha »

hab ja einfach rule von @shaggy0815 genommen und angepasst für meine Daten

Code: Alles auswählen

logInfo(“logger“,“sb hat den Wert {}“,sb)
kann ich gar nicht ausprobieren bekomme nur Fehler in Editor

Code: Alles auswählen

 rule "Telegramm Status Lampen anfordern"
when
    Item Telegram_Last_Text received update "Status Lampen"
then
    val StringBuilder sb = new StringBuilder
    GR_Lichtdr.members.filter[ i | i.state == ON].forEach[i | sb.append(", " + i.name) ]
    val telegramAction = getActions("telegram","telegram:telegramBot:bot1")
    logInfo(“logger“,“sb hat den Wert {}“,sb)
    telegramAction.sendTelegram(sb.toString)
    
end

Benutzeravatar
udo1toni
Beiträge: 13979
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von udo1toni »

Ich hab's nicht extra dazu geschrieben... das iPad erzeugt die falschen Anführungszeichen. Bei Copy&Paste sollte man immer darauf gefasst sein, dass eventuell einzelne Zeichen nicht so übernommen werden, wie sie gebraucht werden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von djuscha »

das hätte ich sehen müssen ,das hat man wenn man ohne Lesebrille am Rechner sitzt :)
Danke Udo hab die Anführungszeichen geändert und Fehler waren weg.
das war aber nicht das Problem, rule funktioniert nur meine Lapen waren aus deswegen hatte ich keine Meldung , wenn die Lampen an sind kommt als Meldung mit Lampennamen aus dem Item mehr nicht.

Code: Alles auswählen

 sb hat den Wert , Gosund1, Light3_Toggle, Light4_Toggle, Light6_Toggle, Light8_Toggle, FDSwitch8
also doch noch nicht so ganz richtig.

hab jetzt noch abfrage auf OFF eingefügt jetz kommt die gleiche Meldung wenn alle Lampen aus sind.

Code: Alles auswählen

 rule "Telegramm Status Lampen anfordern"
when
    Item Telegram_Last_Text received update "Status Lampen"
then
    val StringBuilder sb = new StringBuilder
    GR_Lichtdr.members.filter[ i | i.state == ON].forEach[i | sb.append(", " + i.name) ]
     GR_Lichtdr.members.filter[ i | i.state == OFF].forEach[i | sb.append(", " + i.name) ]
    val telegramAction = getActions("telegram","telegram:telegramBot:bot1")
    logInfo("logger","sb hat den Wert {}",sb)
    telegramAction.sendTelegram(sb.toString)
    

Benutzeravatar
udo1toni
Beiträge: 13979
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Möglichkeit der Abfrage welche Lampen eingeschaltet sind per Telegramm

Beitrag von udo1toni »

Ja, ich hab in der Zwischenzeit mal nach dem StringBuilder Objekt geschaut, tatsächlich ist .toString die Funktion, welche genutzt wird, um den String auszugeben.
Der String sieht auch genau so aus, wie ich ihn erwarten würde. Vermutlich störst Du Dich am ersten Komma :) aber auch das ist ja zu erwarten - schließlich wird das beim Bbilden des Strings jedes Mal vorne angehängt.
Möglichkeit eins: Du prüfst zunächst, ob der String nicht leer ist if(sb.toString != "") und fügst nur unter dieser Bedingung das ", " an (in einer separaten Zeile oder auch inline)
Möglichkeit zwei: Du entfernst die ersten beiden Zeichen (StringBuilder bietet dafür eine Funktion) bevor Du den String übergibst. Auch hier musst Du natürlich prüfen, ob sich bereits Zeichen im String befinden, sonst kommt es bei einem leeren String vermutlich zu einer nullPointer-Exception.

Mir erscheint Möglichkeit ein einfacher. Eventuell braucht sie mehr Taktzyklen :) aber ich denke, der Code muss nicht hochgradig optimiert werden.

Code: Alles auswählen

rule "Telegramm Status Lampen anfordern"
when
    Item Telegram_Last_Text received update "Status Lampen"
then
    val StringBuilder sb = new StringBuilder
    GR_Lichtdr.members.filter[ i | i.state == ON].forEach[j | sb.append((if(sb.toString != "")", " else "") + j.name) ]
    sb.append(" sind eingeschaltet")
    GR_Lichtdr.members.filter[ i | i.state == OFF].forEach[j | sb.append(", " + j.name) ]
    sb.append(" sind ausgeschaltet.")
    logInfo("logger","sb hat den Wert {}",sb)
    val telegramAction = getActions("telegram","telegram:telegramBot:bot1")
    telegramAction.sendTelegram(sb.toString)
end
Ich verwende hier den ternären Operator, um bei einem leeren String kein Komma einzufügen.
Beim Durchlauf für die OFF-Items landet das Komma hinter dem Text "eingeschaltet", weshalb es nicht entfernt werden muss :)

Eine weitere Herausforderung wäre, das letzte Komma durch das Wort "und" zu ersetzen. Man kann einen Index mit angeben, der dann infach auf die Größe des Filters geprüft werden muss. In etwa so:

Code: Alles auswählen

GR_Lichtdr.members.filter[ i | i.state == ON].forEach[j,k | 
    if (sb.toString != "") {
        if(k < GR_Lichtdr.members.filter[ i | i.state == ON].size)
            sb.append(", ")
        else
            sb.append(" und ")
    }
    sb.append(j.name) 
]
Das ist natürlich nur der String für die ON-Lichter.
Ein weiterer Schönheitsfehler ist, dass der Text " sind eingeschaltet" auch ausgegeben wird, wenn kein Licht an ist. Also eine weitere Prüfung...

Code: Alles auswählen

rule "Telegramm Status Lampen anfordern"
when
    Item Telegram_Last_Text received update "Status Lampen"
then
    val StringBuilder sb = new StringBuilder
    if(GR_Lichtdr.members.filter[ i | i.state == ON].size > 0) {
        GR_Lichtdr.members.filter[ i | i.state == ON].forEach[j,k | 
            if (k > 1) {
                if(k < GR_Lichtdr.members.filter[ i | i.state == ON].size)
                    sb.append(", ")
                else
                    sb.append(" und ")
            }
            sb.append(j.name) 
        ]
        
        sb.append((if(GR_Lichtdr.members.filter[ i | i.state == ON].size > 1)" sind" else " ist") + " eingeschaltet")
    }
    if(GR_Lichtdr.members.filter[ i | i.state == OFF].size > 0) {
        sb.append(", ")
        GR_Lichtdr.members.filter[ i | i.state == OFF].forEach[j,k |
            if (k > 1) {
                if(k < GR_Lichtdr.members.filter[ i | i.state == OFF].size)
                    sb.append(", ")
                else
                    sb.append(" und ")
            }
            sb.append(j.name)
        ]
        sb.append((if(GR_Lichtdr.members.filter[ i | i.state == ON].size > 1)" sind" else " ist") + " ausgeschaltet")
    }
    sb.append(".")
    logInfo("logger","sb hat den Wert {}",sb)
    val telegramAction = getActions("telegram","telegram:telegramBot:bot1")
    telegramAction.sendTelegram(sb.toString)
end
Nun sollte eigentlich alles berücksichtigt sein... ;) Wobei man natürlich auch noch den Fall abfangen könnte, dass alle Licht an bzw. ausgeschaltet sind. Dazu prüft man die Größe der ungefilterten Gruppe oder alternativ die Größe der gefilterten Gruppe ist 0 (das habe ich ja oben schon eingebaut...) um dann die Meldung in anderer Form auszugeben, eben "Alle Lichter sind [an|aus]geschaltet." Wird auch nicht weiter aufwändig sein :) allerdings kommt dann der Moment, wo es sinnvoll ist, die Größe der gefilterten Gruppe in einer Variablen zu speichern (das muss dann vermutlich eine globale Variable sein)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten