Seite 2 von 4

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

Verfasst: 19. Jun 2020 13:26
von djuscha
hab Telegramm Binding 2 und Action Telegramm 1

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

Verfasst: 19. Jun 2020 16:04
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?

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

Verfasst: 19. Jun 2020 23:42
von udo1toni
getActions() liefert einen Handle für die Action des angegebenen Addons. Dieser Handle steht dann über das Objekt zur Verfügung.

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

Verfasst: 30. Jun 2020 20:51
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.

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

Verfasst: 2. Jul 2020 19:50
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?

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

Verfasst: 3. Jul 2020 19:09
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

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

Verfasst: 4. Jul 2020 17:58
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

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

Verfasst: 4. Jul 2020 19:16
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.

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

Verfasst: 5. Jul 2020 00:16
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)
    

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

Verfasst: 5. Jul 2020 15:25
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)