Seite 1 von 1
Befehle via Telegram an Openhab
Verfasst: 17. Jan 2020 21:04
von wighdeas
Hallo zusammen,
eine generelle Frage zum Telegram-Binding: ist es möglich Telegram bidirektional zu verwenden? Meinem aktuellen Wissensstand nach kann ich nur Benachrichtigungen an Telegram senden. Nun wäre es natürlich klasse (z.B. via Script) auch Befehle zurückzusenden.
Hat das von euch schon jemand umgesetzt bzw. gibt es Alternativvorschläge?
Re: Befehle via Telegram an Openhab
Verfasst: 18. Jan 2020 05:54
von udo1toni
Schau mal hier:
https://www.openhab.org/addons/bindings/telegram/
Die Beispiele sind zwar zum allergrößten Teil auf das Senden von Nachrichten bezogen, aber die letzte Rule erläutert, wie man eine Nachfrage auswertet. Genauso sollte man auch direkte Befehle empfangen können, natürlich nur über eine Rule, welche die Telegramme auswertet.
Kennst Du schon HABot?
Re: Befehle via Telegram an Openhab
Verfasst: 18. Jan 2020 09:55
von wighdeas
Hi,
danke dir. Ich werde mir das mal zu Gemüte führen und berichten obs geklappt hat, sieht auf den ersten Blick aber gut aus. HABot habe ich schon irgendwo mal gesehen. Was genau ist dessen Funktion oder für was kann es genutzt werden?
Re: Befehle via Telegram an Openhab
Verfasst: 18. Jan 2020 17:19
von udo1toni
Es stellt einen Bot zur Verfügung, mit dem man "mit natürlicher Sprache" kommunizieren kann. Normal ist das z.B. über die Android App erreichbar. Ich hab das selbst auch noch nicht ausprobiert, aber eigentlich sollte es damit bequem möglich sein, im Telegram-Stil zu kommunizieren. Ist auch in der Doku erlkärt...
Re: Befehle via Telegram an Openhab
Verfasst: 26. Aug 2020 22:16
von poetos
Hallo zusammen,
in diesem Forum bin ich schon länger unterwegs und auch oft fündig geworden. Für diese Aufgabe hab ich auch eine Lösung gesucht und bin deshalb hier gelandet. Hab dann, auch mit Hilfe aus anderen Foren eine Lösung gefunden, die ich euch nicht vorenthalten möchte. Ich versuche mal den Code der Rule hier irgendwie rein zu bekommen. Bin kein Programmierer, schon etwas älter und intellektuell nicht gerade auf der Überholspur unterwegs aber auch nicht auf der Standspur. Mein erster Beitrag, ihr seid ja nachsichtig, habe ich schon mehrfach positiv festgestellt!
Code: Alles auswählen
rule "Telegramm - Status anfordern"
when
Item TelegramBotLastMessageDate received update
then
if (TelegramBotChatId.state == "13xxxxx496") { antwAn = "bot1" }
if (TelegramBotChatId.state == "13xxxxx020") { antwAn = "bot2" }
if (TelegramBotChatId.state == "12xxxxx819") { antwAn = "bot3" }
anFrage = TelegramBotLastMessageText.state.toString
tlang = anFrage.length().toString
logInfo("WerWas", tlang + ", " + TelegramBotLastMessageName.state.toString + ", " + anFrage)
if (anFrage.length() > 20) { sendTelegram(antwAn, "Anfrage zu lang - auf 20 Zeichen begrenzt") return; } // Das SEMIKOLON hinter return ist wichtig!!!
nachricht = "Mit dieser Anfrage ist keine Anwendung verknüpft! Verwende - xxx - Küchenlampe - Wohnzimmerlampe - yyy"
if (anFrage == "xxx" ) {
if (Shelly1KLRelayOutput.state == ON) { kuechenl = "Küchenlampe ist an, " }
else { kuechenl = "Küchenlampe ist aus, " }
if (Shelly1WLRelayOutput.state == ON) { wohnl = "Wohnzimmerlampe ist an, " }
else { wohnl = "Wohnzimmerlampe ist aus, " }
if (SamsungPower.state == ON) { fernsW = "Ferns. Wohnz. ist an, " }
else { fernsW = "Ferns. Wohnz. ist aus, " }
if (TvKuecheOnline.state == ON) { fernsK = "Ferns. Küche ist an, " }
else { fernsK = "Ferns. Küche ist aus, " }
wohnr = "Wohnzimmer Rollo " + ShellyRolloRollerRollerpos.state + "% geöffnet."
nachricht = kuechenl + fernsK + wohnl + fernsW + wohnr
}
if (anFrage == "yyy" ) {
if (xxxxxS9Online.state == ON) { papaH = " Papas Handy ist im W-Lan!" }
else { papaH = " Papas Handy ist nicht im W-Lan!" }
if (Papalampe.state == ON) { nachricht = "Papa ist zu Hause oder xxx yyy" + papaH }
else { nachricht = "Papa ist nicht zu Hause oder xxx yyy!" + papaH }
}
if (anFrage == "Küchenlampe" ) {
if (Shelly1KLRelayOutput.state == ON) { Shelly1KLRelayOutput.sendCommand(OFF) nachricht = "Küchenlampe wurde ausgeschaltet" }
else { Shelly1KLRelayOutput.sendCommand(ON) nachricht = "Küchenlampe wurde eingeschaltet" }
}
if (anFrage == "Wohnzimmerlampe" ) {
if (Shelly1WLRelayOutput.state == ON) { Shelly1WLRelayOutput.sendCommand(OFF) nachricht = "Wohnzimmerlampe wurde ausgeschaltet" }
else { Shelly1WLRelayOutput.sendCommand(ON) nachricht = "Wohnzimmerlampe wurde eingeschaltet" }
}
sendTelegram(antwAn, nachricht)
end
Durch diese Rule können meine Kinder einschätzen ob sie anrufen dürfen oder Mama beim Mittagschlaf stören. Oder sich bemerkbar machen indem sie eine Lampe schalten, oder, oder. „LastMessageDate received update“ - sollte der Auslöser sein, da sich nur der Wert bei jeder Anfrage ändert. Das SEMIKOLON hinter „return“ ist wichtig! Hab ich auch lange gesucht. Vermutlich ist der Code nicht ganz sauber und greift auf das „Actions“ und auf die „Bindung“ von Telegram zu, beide installiert; aber die Sache läuft!
Re: Befehle via Telegram an Openhab
Verfasst: 27. Aug 2020 00:33
von udo1toni

Optimierungsmöglichkeiten gibt es ja eigentlich immer

wichtig ist aber vor allem, dass die Rule für Dich funktioniert.
return ; : Das Semikolon ist aus einem einfachen Grund wichtig: return erwartet zwingend einen Rückgabewert. Nun kann return diesen Rückgabewert aber nirgends abliefern. Gäbe man also einen Rückgabewert an, so käme die Rule aus dem Tritt. Gibt man einfach "keinen" Rückgabewert an, so wird eben das nächste Wort in der Rule als Rückgabewert verwendet -> Siehe Version mit Rückgabewert. Das Semikolon erzwingt hier also einen leeren Rückgabewert, so dass die Rule sauber abgebrochen werden kann. Man könnte diese Rule auch leicht umformulieren und ohne das return; auskommen, man handelt sich damit aber eine weitere Klammerebene ein, die Variante mit return; ist also schon die bessere.
Was Action und Binding betrifft: Da solltest Du tatsächlich bis Ende des Jahres tätig werden, denn mit OH3 werden V1-Bindings nicht mehr zur Verfügung stehen. Im V2 Telegram Binding steht die Action auch zur Verfügung, muss aber in den Rules initialisiert werden, damit man sie nutzen kann (myTelegramAction = telegram.getAction...) Auch wenn OH2.5 weiterhin gepflegt wird, wird es irgendwann ausgemustert werden, und Du möchtest sicher nicht abgehängt werden

Re: Befehle via Telegram an Openhab
Verfasst: 28. Aug 2020 23:50
von poetos
Vielen Dank Udo,
den Tipp die V1-Bindings zu meiden nehme ich dankend an. Bei Telegram ist diese entsorgt. Musste zwar einige Rules ändern, aber man hat mehr Möglichkeiten. Im letzten Beitrag hatte ich geschrieben, der Auslöser für die Rule sollte # LastMessageDate # sein. Ich nehme alles zurück; nach # Text # ist sinnvoller. Hab dann auch gleich einige Rules mit: -sendTelegramQuery- entworfen. Lange gesucht habe ich nach der Möglichkeit die Antwort an nur den Fragenden zu senden. Macht vielleicht Sinn wenn die hier auch noch mal erwähnt wird.
#.sendTelegramQuery(Long.decode(TelegramBotChatId.state.toString),#
Das funktioniert soweit ganz gut.
# .sendTelegramAnswer(TelegramReplyId.state.toString, #
Die Antwort kommt auch und geschaltet wird auch, alles wie gewünscht. Aber diese Antwort verursacht ein kleines Error im Log. Stört nicht! Ich schicke die Antwort eh ohne # Answer #, da die Auswahlkästchen dann sichtbar bleiben. Da kann man mehrere Dinge hintereinander erledigen, ohne die Anfrage erneut zu senden. Soll man zwar nicht, aber mir gefällt das besser und es gibt auch keine Fehlermeldung! Die Meldung:
# [ntime.internal.engine.RuleEngineImpl] - Rule 'Frage Teichpumpe aus': null #
Darauf erwarte ich jetzt keine Antwort, hat evtl. etwas mit einem Rückgabewert zu tun?
Oder weil er damit beschäftigt ist die Auswahlkästchen im Chat zu entsorgen?