Telegram instant messaging TelegramBot - Empfangen und Senden per FHEM

Begonnen von viegener, 20 Juni 2015, 18:59:41

Vorheriges Thema - Nächstes Thema

viegener

Zitat von: wthiess am 16 Dezember 2016, 22:07:03
Hallo Max!

Habe ich grad gemacht. Jetzt kommt keine Meldung. Aber wie bekomme ich jetzt die Buttons ins Telegramm.
Gibt es ein bestimmtes Kommando?

lg
Wolfgang

Mit der Version aus github, die demnächst auch über update verfügbar sein wird geht es folgendermassen

set telegramBot queryInline (taste1:code1) (taste2:code2) Und eine Nachricht
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Prof. Dr. Peter Henning

@viegener: Eher umgekehrt. Text in eine Zeile eingeben, dann aber nicht "senden" klicken, sondern einen der Buttons des Keyboards. Das Zusammensetzen der Callback-Daten aus Button-Id+Parameterwert sollte der Client übernehmen. Wird aber vermutlich nie gehen, weil das auch der Philosophie eines Instant Messengers etwas widerspricht. Danke für die Umsetzung der anderen features.

@wthiess und dergeberl:  Diese Versuche in allen Ehren, aber das ist ziemlich unsauber programmiert. Längerer Perl-Quellcode, insbesondere mit Variablen, der Auswertung von Strings etc. gehört nicht in die Konfigurationsdatei, sondern in ein eigenes Modul, z.B. als Routine in die 99_myUtils.pm.

LG

pah

Prof. Dr. Peter Henning

@viegener: Erste Testresultate sehen sehr schön aus.

Was ich noch nicht verstehe: Sende ich direkt in der Kommandozeile ein
set Telegram queryInline (Einkauf|Einkauf hinzu|Einkauf entf) (Baumarkt|Baumarkt hinzu|Baumarkt entf) PostIt

kommt richtigerweise nur das Keyboard an.

Definiere ich aber unter Favorites

/H=set Telegram queryInline (Einkauf|Einkauf hinzu|Einkauf entf) (Baumarkt|Baumarkt hinzu|Baumarkt entf) PostIt

und sende /H an den Bot, wird im Client an das Keyboard noch eine Textzeile "none" angehängt.

LG

pah

viegener

Zitat von: Prof. Dr. Peter Henning am 17 Dezember 2016, 07:35:33
Definiere ich aber unter Favorites

/H=set Telegram queryInline (Einkauf|Einkauf hinzu|Einkauf entf) (Baumarkt|Baumarkt hinzu|Baumarkt entf) PostIt

und sende /H an den Bot, wird im Client an das Keyboard noch eine Textzeile "none" angehängt.


Kann es sein, dass Du das Attribute textResponseResult gesetzt hast (Wenn ja auf welchen Wert?)

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

Zitat von: Prof. Dr. Peter Henning am 17 Dezember 2016, 06:55:36
@viegener: Eher umgekehrt. Text in eine Zeile eingeben, dann aber nicht "senden" klicken, sondern einen der Buttons des Keyboards. Das Zusammensetzen der Callback-Daten aus Button-Id+Parameterwert sollte der Client übernehmen. Wird aber vermutlich nie gehen, weil das auch der Philosophie eines Instant Messengers etwas widerspricht. Danke für die Umsetzung der anderen features.


OK, ein Teil der Funktion des inlineBots geht in diese Richtung - @bold macht so etwas ähnliches als text auszeichnung.
Eigentlich müsste man dazu einen weiteren Bot anlegen (generell kein Problem)
der als inlineBot agiert (das ist ein ganzer Set von neuer methoden im bot api und erfordert eigentlich eine separate Implementierung in FHEM)

Dann könnte jemand soetwas wie

Zitat@Einkauf Milch
tippen

Es würden Optionen auftauchen etwas zu entfernen und der Einkauf bot würde dann eine List von Optionen inline (also während man an der Nachricht schreibt) bereitstellen, die dann zum Beispiel hinzufügen oder Löschen von der EInkaufsliste erlauben

Beim Click des Buttons würde die Nachricht dann an den eigentlichen telegramBot geschickt (wobei der Einkauf'sbot noch etwas hinzufügt oder abändert)

Ausprobiert habe ich das rudimentär aber die grösste Hürde ist, dass man eigentlich eine neue Bot-implementierung für inline bots anfangen müsste
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Prof. Dr. Peter Henning

Nein, das habe ich schon.

Mit der Message
/Einkauf+ Bollenknollen
wird aus der Favorites-Liste ersetzt
/Einkauf+   =>  set Task set PostIt add Einkaufsliste

Weitergereicht an FHEM wird aber das komplexe Kommando
set Task set PostIt add Einkaufsliste Bollenknollen

Damit wird  der Dummy Task gesetzt auf den Wert "set PostIt add Einkaufsliste Bollenknollen"
Das erzeugt natürlich einen entsprechenden Event.

Das Dummy Device Task wiederum wird von meiner FHEM-Hauptinstanz via FHEM2FHEM überwacht.
Dort läuft ein Notify, das auf Events vom Typ "set Task <Wert>" reagiert - und den <Wert> dann ausführt.

Als Folge dieser Kette wird in der FHEM_Hauptinstanz ausgeführt

set PostIt add Einkaufsliste Bollenknollen

Dazu braucht es auch keinen neuen Bot.

Schön wäre es nun, wenn ich nicht noch "/Einkauf+" tippen müsste - sondern nur noch einen Button auf dem virtuellen Keyboard.

Ich bastele derzeit gerade an einem zweistufigen Verfahren, mit einem Tastdruck mehr. Und damit immer noch deutlich komfortabler, als "/Einkauf" zu tippen.

LG

pah

viegener

Zitat von: viegener am 17 Dezember 2016, 10:52:18
Kann es sein, dass Du das Attribute textResponseResult gesetzt hast (Wenn ja auf welchen Wert?)

@pah - Kann es sein, dass Du dieses Attribut auf "none" gesetzt hast? Das würde auch erklären, warum Du den extracode zum rausfiltern von "none" in deinem Beitrag weiter oben hattest?

Setze das Attribut mal auf "\t", das sollte die Meldung entfernen, ausserdem habe ich gerade einen FIX eingecheckt, damit telegram sich nicht über die leere Nachricht beschwert...
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Prof. Dr. Peter Henning

Kann es sein, dass Du das Attribute textResponseResult

Ah, stimmt. Mein Fehler, danke für den Hinweis.

Noch ein Tipp für das nächste Release: entweder ein INTERNAL oder einen get-Befehl, mit dem eine Versionsnummer abgefragt werden kann.

LG

pah

Prof. Dr. Peter Henning

Die aktuellste Version enthält jetzt noch einen neuen Fehler.

Sendet man von einem Telegram-Client ein beliebiges Kommando (egal ob aus den Favorites oder einfach mit MagicWord), bekommt man im Log immer den Fehler
2016-12-17 15:34:53 TelegramBot Telegram sentMsgResult: Callback returned error:Bad Request: Message must be non-empty:
2016-12-17 15:34:53 TelegramBot Telegram sentMsgId:


Es sieht so aus, als ob auch bei "normalen" Kommandos immer die Callback-Funktion aufgerufen wird, allerdings ohne Parameter.

LG

pah

viegener

Zitat von: Prof. Dr. Peter Henning am 17 Dezember 2016, 15:40:23
Die aktuellste Version enthält jetzt noch einen neuen Fehler.

Sendet man von einem Telegram-Client ein beliebiges Kommando (egal ob aus den Favorites oder einfach mit MagicWord), bekommt man im Log immer den Fehler
2016-12-17 15:34:53 TelegramBot Telegram sentMsgResult: Callback returned error:Bad Request: Message must be non-empty:
2016-12-17 15:34:53 TelegramBot Telegram sentMsgId:


Es sieht so aus, als ob auch bei "normalen" Kommandos immer die Callback-Funktion aufgerufen wird, allerdings ohne Parameter.

LG

pah

Ja, ist gefixt, telegram lehnt auch Nachrichten ab, die nur aus Steuerzeichen bestehen, das filtere ich jetzt auch raus
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können


wthiess

#1061
Hallo viegener!

Habe folgende Zeile eingegeben:
set teleBot queryInline (Port4ein:set prxPortB4 on) (Port4aus:set prxPortB4 off) Ports ein aus


Nun erscheinen in Telegram 2 Buttons. Wenn ich darauf drücke erscheint in der unteren Ecke des Button eine kleine Uhr. Aber in Fhem keine Schalt-Reaktion. Im Monitor sehe ich das was daherkommt. Muss ich in der neuesten Version des Moduls auch in myUtils was reinschreiben oder ein notify anlegen? die Setbefehle direkt in Telegram funktionieren.

Monitor:

d set prxPortB4 on

2016-12-17 21:16:37 TelegramBot teleBot msgId: 50
2016-12-17 21:16:37 TelegramBot teleBot msgPeer: Wolfgang_Thiess
2016-12-17 21:16:37 TelegramBot teleBot msgChat:
2016-12-17 21:16:37 TelegramBot teleBot msgPeerId: 316399906
2016-12-17 21:16:37 TelegramBot teleBot msgText: d set prxPortB4 off
2016-12-17 21:16:37 TelegramBot teleBot msgFileId:
2016-12-17 21:16:37 I2C_MCP23017 icMCP23017 Ok
2016-12-17 21:16:37 I2C_MCP23017 icMCP23017 Ok
2016-12-17 21:16:37 TelegramBot teleBot sentMsgResult: SUCCESS
2016-12-17 21:16:37 TelegramBot teleBot sentMsgId: 51

Button:
2016-12-17 21:17:12 TelegramBot teleBot callbackID: 1358927249730274231
2016-12-17 21:17:12 TelegramBot teleBot callbackPeer: Wolfgang_Thiess
2016-12-17 21:17:12 TelegramBot teleBot callbackPeerId: 316399906
2016-12-17 21:17:12 TelegramBot teleBot callbackData: set prxPortB4 off
2016-12-17 21:17:12 TelegramBot teleBot callbackReplyMsgId: 31


lg
Wolgang

Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......

Prof. Dr. Peter Henning

#1062
Es muss ein notify angelegt werden, Kommandos können nicht direkt angegeben werden. Steht alles in der Commandref...

LG

pah

viegener

Zitat von: wthiess am 17 Dezember 2016, 21:11:54
Hallo viegener!

Habe folgende Zeile eingegeben:
set teleBot queryInline (Port4ein:set prxPortB4 on) (Port4aus:set prxPortB4 off) Ports ein aus


Nun erscheinen in Telegram 2 Buttons. Wenn ich darauf drücke erscheint in der unteren Ecke des Button eine kleine Uhr. Aber in Fhem keine Schalt-Reaktion. Im Monitor sehe ich das was daherkommt. Muss ich in der neuesten Version des Moduls auch in myUtils was reinschreiben oder ein notify anlegen? die Setbefehle direkt in Telegram funktionieren.

Monitor:

d set prxPortB4 on

2016-12-17 21:16:37 TelegramBot teleBot msgId: 50
2016-12-17 21:16:37 TelegramBot teleBot msgPeer: Wolfgang_Thiess
2016-12-17 21:16:37 TelegramBot teleBot msgChat:
2016-12-17 21:16:37 TelegramBot teleBot msgPeerId: 316399906
2016-12-17 21:16:37 TelegramBot teleBot msgText: d set prxPortB4 off
2016-12-17 21:16:37 TelegramBot teleBot msgFileId:
2016-12-17 21:16:37 I2C_MCP23017 icMCP23017 Ok
2016-12-17 21:16:37 I2C_MCP23017 icMCP23017 Ok
2016-12-17 21:16:37 TelegramBot teleBot sentMsgResult: SUCCESS
2016-12-17 21:16:37 TelegramBot teleBot sentMsgId: 51

Button:
2016-12-17 21:17:12 TelegramBot teleBot callbackID: 1358927249730274231
2016-12-17 21:17:12 TelegramBot teleBot callbackPeer: Wolfgang_Thiess
2016-12-17 21:17:12 TelegramBot teleBot callbackPeerId: 316399906
2016-12-17 21:17:12 TelegramBot teleBot callbackData: set prxPortB4 off
2016-12-17 21:17:12 TelegramBot teleBot callbackReplyMsgId: 31


lg
Wolgang

Die Schaltbefehle musst Du selber über ein notify (oder ähnliches) auslösen basierend auf dem Inhalt der callback... Readings (vor allem callbackData)

Mit dem Attribut queryAnswerText kannst Du steuern, ob der telegramBot automatisch eine Antwort schicken soll

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

wthiess

Danke für die Antworten. Leider verstehe ich das nicht.
Ich geb's auf. Gebe mich mit den Favoriten zufrieden. Die funktionieren super.

lg
Wolfgang
Raspberry Pi 3; 8xRelais; Aptodec Nano V3.0 Pro; FS1000a; RF-5V; Hama TS33C; 3x Brennerstuhl FunkSteckdosen; 9x Dooya funk Rollo; KWL Systemair VR400; Thermokon Modbusthermostat; diverse China Modbus Thermostate; 1-wire Bus; Telegram; QuickFhem; FhemNative; Firmata; Alexa ......