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
