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
Telegram Licht komplett Abfragen und Antworten
-
- Beiträge: 29
- Registriert: 10. Nov 2020 09:14
- udo1toni
- Beiträge: 14849
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Telegram Licht komplett Abfragen und Antworten
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...)
Im Beispiel heißt der Bot in openHAB Telegram_Bot
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:
Und eine zweite Rule, welche auf das Ereignis reagiert:
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
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" ]
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
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"}
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 Textvariante ist halt einigermaßen leicht lesbar
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.1, LXC), mit openHABian eingerichtet