Telegram Licht komplett Abfragen und Antworten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
astrong
Beiträge: 29
Registriert: 10. Nov 2020 09:14
Answers: 0

Telegram Licht komplett Abfragen und Antworten

Beitrag von astrong »

Servus,

ich kämpfe gerade mit dem Telegram-Bindings.

https://www.openhab.org/addons/bindings/telegram/

Dort habe ich mich bereits durchgelesen, bekomme es aber nicht umgesetzt... Der Syntax ist dort wieder in DSL Rule. Mein OH4 möchte das aber so einfach nicht umsetzen.

Mein Wunschszenario:

Abfrage: IF any (tag = LIGHT) STATE = ON
then:
Frage um 23Uhr per Telegram Nachricht "Es sind noch Lichter an, soll ich Ausschalten?" (Antwort JA/NEIN)
if Antwort = JA
All Lights OFF
Sende Nachricht "Alle Lichter aus"
IF Antwort = Nein
Sende Nachricht "Ich lasse die Lichter an"


Ich bekomme o.g. Umsetzung einfach nicht auf die Kette.
Gibts da vllt. zwei OH4 fertige Rules? Ich komme mit dem DSL oder Blocky nicht zurecht (das ist einfach nicht so intuitiv)

danke

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

Re: Telegram Licht komplett Abfragen und Antworten

Beitrag von udo1toni »

Erst mal musst Du von einer anderen Seite kommen...

Die Rule Engine ist Ereignis-gesteuert, d.h. es muss etwas passieren, damit eine Rule ausgeführt wird. Das passende Event ist hier "Es ist 23 Uhr".

Du könntest jetzt über "but only if" versuchen, einzugrenzen, dass die Rule nur gestartet wird, wenn eins der Lichter an ist, aber da Du eh Code benötigst, ist es einfacher, das direkt im Code zu implementieren.
Da Du per Telegram eine Nachricht verschicken willst, braucht es aber zunächst mal einen TelegramBot (Schritt für Schritt erklärt: https://www.openhab.org/addons/bindings/telegram/ ).
Dazu öffnest Du zunächst einen Telegram Chat mit BotFather. Dann sendest Du /newBot und beantwortest alle Fragen. Abschließend bekommst Du ein Token, welches Du kopieren musst.
Nun legst Du mit dem Bot den Chat an, der genutzt werden soll und sendest eine Nachricht an den Bot.
Danach kannst Du über die URL https://api.telegram.org/bot<token>/getUpdates ein JSON abrufen, in dem im Feld id. die ChatID angegeben ist.
Da es sich vermutlich um einen Group Chat handeln soll, achte darauf, dass Du das - am Anfang mit kopierst, das ist Teil der ChatID.
Jetzt kannst Du testen, dass der Bot funktioniert, indem Du ihn nutzt, um eine Nachricht zu schicken: https://api.telegram.org/bot<token>/sen ... xt=testing wobei<token> durch den Token und <<chatid> durch die ChatID zu ersetzen sind :)

Funktioniert soweit alles, musst Du in openHAB ein Thing einrichten, welches die Verbindung zu diesem Bot darstellt.
Letztlich musst Du nur Token und ChatID(s) eintragen (ein Bot kann mehrere ChatIDs nutzen...)

Code: Alles auswählen

Thing telegram:telegramBot:Telegram_Bot [ chatIds="ID1","ID2", botToken="TOKEN" ]
Im Beispiel heißt der Bot in openHAB Telegram_Bot

Code: Alles auswählen

rule "check lights at 23"
when
    Time cron "0 0 23 * * ?" // täglich 23:00:00 Uhr
then
    if(gLights.members.filter[i|i.getStateAs(OnOffType) =! OFF].size == 0)
        return;
    val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot")
    val strMessage = "Es sind noch Lichter an, soll ich ausschalten?"
    telegramAction.sendTelegramQuery(strMessage, "Reply_Lights", "Ja", "Nein")
end
Die Rule triggert um 23 Uhr und prüft, ob unmittelbare Member der Gruppe gLights nicht ausgeschaltet sind. Dabei wird der Status gezielt darauf geprüft, ob er als OnOffType vom Wert OFF abweicht. Diese Abfrage funktioniert auch für Dimmer und Color Items!
Es wird eine Liste aller Items erstellt, auf die der Filter zutrifft (ungleich OFF) und anschließend geprüft, ob diese Liste keine (0) Einträge aufweist. Ist das der Fall, wird die Rule sofort abgebrochen.

Läuft die Rule weiter, so wird die Telegram Frage gesendet.
Nun antwortet jemand auf die Frage, das stellt ein zweites Ereignis dar (Bot empfängt Antwort), entsprechend braucht es zwei Items, welche signalisieren, dass eine Antwort empfangen wurde, und welche Antwort dies ist:

Code: Alles auswählen

String telegramReplyId "Reply" {channel="telegram:telegramBot:Telegram_Bot:replyId"}
String telegramMessage "Message" {channel="telegram:telegramBot:Telegram_Bot:lastMessageText"}
Und eine zweite Rule, welche auf das Ereignis reagiert:

Code: Alles auswählen

rule "check telegram answer"
when
   Item telegramReplyId received update "Reply_Lights"
then
    val telegramAction = getActions("telegram","telegram:telegramBot:Telegram_Bot")
    if(telegramMessage.state.toString != "Ja") {
        telegramAction.sendTelegramAnswer(telegramReplyId.state.toString, "Ich lasse die Lichter an")
        return;
    }
    telegramAction.sendTelegramAnswer(telegramReplyId.state.toString, "Ich schalte die Lichter aus")
    gLights.members.forEach[i|i.sendCommand(OFF)]
end
Die Rules kannst Du auch über die UI anlegen (Achtung, dann ist die Schreibweise anders), mittels Blockly, Groovy, Ruby, JavaScript... egal, aber um Code kommst Du nicht herum.
Die Textvariante ist halt einigermaßen leicht lesbar :)
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.1, LXC), mit openHABian eingerichtet

Antworten