Telegram instant messaging TelegramBot - Empfangen und Senden per FHEM

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

Vorheriges Thema - Nächstes Thema

Will

habe 50_TelegramBot installiert:

wenn der token ein _ hat, wird er nicht akzeptiert, musste mir mehrere Male einen geben lassen, bis ich was ohne _ (underscore) bekommen habe

Jetzt siehts erst mal gutaus, leider erkennt er keinen "Peer" ich dacht Vorname_Nachname...

viegener

Zitat von: Will am 21 September 2015, 21:00:34
habe 50_TelegramBot installiert:

wenn der token ein _ hat, wird er nicht akzeptiert, musste mir mehrere Male einen geben lassen, bis ich was ohne _ (underscore) bekommen habe

Jetzt siehts erst mal gutaus, leider erkennt er keinen "Peer" ich dacht Vorname_Nachname...

OK, guter Tip, da war ich nicht gründlich genug. Ich prüfe das Token auf Plausibilität (und ich hatte in meinen Token kein Underscore), das werde ich anpassen.

Du kannst einem peer nur etwas senden, wenn dieser peer zuerst an den Bot etwas sendet. Das ist eine Einschränkung des bot-apis, wie oben beschrieben. Telegram möchte keine Spam-Schleudern ermöglichen, die jedermann einfach etwas senden ohne identifizierbar zu sein...
Danach solltest Du Vorname_Nachname oder @<usernamer> oder die telegram user id verwenden können


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

viegener

Habe ein upgedatetes Modul angehängt.
Die aktuelle Version findet sich auch immer in github:

https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm

u.a.
- token werden auch mit Unterstrich akzeptiert
- Bestätigungen für ausgeführte Kommands enthalten auch Namen von contacts
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Will

Bei mir funktioniert es jetzt nachdem ich an meinen bot eine Nachricht gesendet habe. Allerdings muss ich die peer Id als Adresse angeben. Vorname_Nachname geht nicht...


Sent from my SGP611 using Tapatalk


igami

Habe mir nun einen TelegramBot eingerichtet und funktioniert bisher ganz gut.

Weißt du zufällig wie ich einen Zeilenumbruch bewerkstelligen kann? In dem cli ging es indem man die msg in " setzt und dann \n verwendet.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

viegener

Zitat von: igami am 22 September 2015, 20:05:28
Habe mir nun einen TelegramBot eingerichtet und funktioniert bisher ganz gut.

Weißt du zufällig wie ich einen Zeilenumbruch bewerkstelligen kann? In dem cli ging es indem man die msg in " setzt und dann \n verwendet.

Ohje, das war noch gar nicht auf meiner Liste für weitere Tests. Habe eine Erweiterung gemacht, damit die \n's korrekt umgesetzt werden für das bot-api.

Neue Version ist in github.


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

viegener

Zitat von: Will am 22 September 2015, 02:42:33
Bei mir funktioniert es jetzt nachdem ich an meinen bot eine Nachricht gesendet habe. Allerdings muss ich die peer Id als Adresse angeben. Vorname_Nachname geht nicht...

Kannst Du mal schauen, ob der entsprechende account in dem Reading Contacts auftaucht. Da sollte es einen Teil geben, der ungefähr so aussieht   
12345678:Beate_Mustermann:@mustermannaccount

Dann müsste Beate_Mustermann bei messageTo funktionieren (bei exakt gleicher Gross- und Kleinschreibung).

Wenn es nicht funktioniert, oder der account nicht auftaucht, sage mir bitte nochmal Bescheid.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

igami

Zitat von: viegener am 22 September 2015, 22:42:22
Ohje, das war noch gar nicht auf meiner Liste für weitere Tests. Habe eine Erweiterung gemacht, damit die \n's korrekt umgesetzt werden für das bot-api.

Werde ich nachher mal testen. Hatte gestern noch ein bisschen probiert und mittels

{my $msg = "Überschrift\n\nZeile1\nZeile2";;fhem("set myTelegramBot message $msg")}

einen Zeilenumbruch bewerkstelligt. Was jedoch umständlicher ist, da ich ja erst in perl wechseln muss.

Hast du dir schon Gedanken gemacht wo die Funktionen des Bots abgespeichert werden? Z.B.:
Zitat
igami:
  /Licht
TelegramBot:
  Welches Licht soll geschaltet werden?
  - /Flur
  - /Wohnzimmer
  - /Arbeitszimmer
igami:
  /Wohnzimmer
TelegramBot:
  - /Deckenlampe
  - /Spots
igami:
  /Deckenlampe
TelegramBot:
  - /ein
  - /aus
igami:
  - /aus

Dieser ganze Dialog muss ja für jeden Chat separat funktionieren, wenn also meine Freundin zeitgleich eine andere Funktion auf dem Bot benutzt darf das nicht zu Fehlern führen.
Werde mir dazu nachher auch noch Gedanken machen.

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

viegener

Hallo Igami,
absolut richtige Frage! Ich hatte genau darüber nachgedacht und bisher habe ich nur 2 Anfangsideen, was man realisieren könnte:
a) Angabe einer externen Dialogfunktion (z.B. in myUtils), die jeweils mitdem Dialog-Kommando aufgerufen würde und eine Antwort präsentiert
Vorteil: Einfach zu integrieren    / Nachteil: Für Nichtprogrammierer nicht benutzerfreundlich

b) Schablone in Attributen, um Kommandos und Antworten zu definieren
z.B. commandDef Tuer:{ set  door toggle;; } erlaubt das absenden von /Tuer als message und das Kommando wird ausgeführt
oder commandDef Lampe1[(on|off)]:{ set  Lampe1 $1;; } erlaubt das Definieren etwas komplexerer Kommandos mit regexps
Natürlich können mehrere als Liste definiert werden
Vorteil: Einfacher ohne grosse Programmierung / Nachteil: Wird schnell unübersichtlich und ermöglicht keine Dialoge

Grundsätzlich offen ist noch die Frage der Keyboards...
und natürlich gibt es auch noch andere Möglichkeiten...





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

Will

Bei mir funktioniert der Bot jetzt ganz gut. Habe Erinnerungen damit realisiert. Dann noch ein notify das auf bestimmte Messages reagiert. Wen man da vorher Verzweigungen drin hast wird der Quelltext recht lang:-). Funktionieren eigentlich Grotten?


Will


igami

Zitat von: viegener am 23 September 2015, 18:52:45
absolut richtige Frage! Ich hatte genau darüber nachgedacht und bisher habe ich nur 2 Anfangsideen, was man realisieren könnte:
a) Angabe einer externen Dialogfunktion (z.B. in myUtils), die jeweils mitdem Dialog-Kommando aufgerufen würde und eine Antwort präsentiert
Vorteil: Einfach zu integrieren    / Nachteil: Für Nichtprogrammierer nicht benutzerfreundlich
Wie wäre es mit einem weiteren Modul? Ich bleibe mal bei meinem Beispiel:

define TBD_Licht TelegramBotDialog [Licht]
case [Wohnzimmer] (
  case [Deckenlampe] (
    case [on] (set wz_Deckenlampe on)
    case [off] (set wz_Deckenlampe off)
  )
  case [Spots, romantisch] (
    case [on] (set wz_Spots on)
    case [50] (set wz_Spots 50)
    case [off] (set wz_Spots off)
  )
)
case [Arbeitszimmer] (
  case [on] (set az_light on)
  case [off] (set az_light off)
)

Orientieren würde ich mich dabei an einer switch case Umgebung, dann kann man auch noch super ein else einbauen falls der Benutzter Unsinn schreibt :D
Alles was in [eckigen Klammern] steht ist dann der Befehlname, sollte noch ein Komma drin vor kommen ist das was danach steht eine Erklärung. Denkbar wäre auch ein modifier z.B. [TV-Programm:keyboard] um dann statt den /ARD, /ZDF, etc. ein Keyboard mit größeren Tasten anzuzeigen. Die Befehle auf der ersten Stufe können dann jeweils schon im Bot als Befehl angewählt werden.

Zitat von: Will am 23 September 2015, 19:41:56
Habe ihr weitere anwendungsbeispiele?
Waschmaschine:
Zitat
igami:
  /Waschmaschine
TelegramBot:
  Status: aus
  Modus: manuell

  /einschalten
  /programmieren
igami:
  /programmieren
TelegramBot:
  Welches Wasch Programm wird verwendet?
  - /normal (Programm 4 bei 30 °C)
  - /Handtücher (Programm 4 bei 60 °C)
  - /anderes
igami:
  /normal
TelegramBot:
  Die voraussichtliche Waschdauer beträgt ca. 1:47 Stunden.
  Wann soll die Wäsche fertig sein?
igami:
  15:30
TelegramBot:
  Status: aus
  modus: auto
 
  Es wird normale Wäsche bei 30 °C auf Programm Nummer 4 gewaschen. Voraussichtlich ist sie um 15:30 Uhr fertig. Bitte die Waschmaschine vorbereiten.

...

TelegramBot:
  Die Waschmaschine wird in 15 Minuten eingeschaltet und ist dann voraussichtlich um 15:30 Uhr fertig.
  /ok
  /ändern
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

viegener

Zitat von: igami am 23 September 2015, 20:20:24
Wie wäre es mit einem weiteren Modul? Ich bleibe mal bei meinem Beispiel:

define TBD_Licht TelegramBotDialog [Licht]
case [Wohnzimmer] (
  case [Deckenlampe] (
    case [on] (set wz_Deckenlampe on)
    case [off] (set wz_Deckenlampe off)
  )
  case [Spots, romantisch] (
    case [on] (set wz_Spots on)
    case [50] (set wz_Spots 50)
    case [off] (set wz_Spots off)
  )
)
case [Arbeitszimmer] (
  case [on] (set az_light on)
  case [off] (set az_light off)
)

Orientieren würde ich mich dabei an einer switch case Umgebung, dann kann man auch noch super ein else einbauen falls der Benutzter Unsinn schreibt :D

Hallo Igami,
das mit dem separaten Modul könnte Sinn machen, wenn man mehrere Dialoge jeweils mit einem spezifischen Schlüsselwort definieren will.

Mir ist allerdings nicht ganz klar, wie Du Dir vorstellst das switch/case als Device umzusetzen? Ein Attribut oder mehrere, steht das ganze Switch in einem Attribute, dann wäre sicher ein myutils-Modul eher einfacher, denn sonst muss man quasi die halbe Perl-Umgebung (stichwort syntaxprüfung und Auswertung von Ausdrücken) nachimplementieren.
Gruss,
Johannes

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

viegener

Zitat von: Will am 23 September 2015, 19:40:16
Bei mir funktioniert der Bot jetzt ganz gut. Habe Erinnerungen damit realisiert. Dann noch ein notify das auf bestimmte Messages reagiert. Wen man da vorher Verzweigungen drin hast wird der Quelltext recht lang:-). Funktionieren eigentlich Grotten?

Grotten sind schön  ;D Ein Hoch auf die automatische Wortvervollständigung?

Grundsätzlich werden Gruppen auch gehen, lt. API (Stichwort chat-id) sind sie bereits vorhanden, aber ich habe bisher in meinen Daten noch keine chat-ids erhalten. Da muss ich noch etwas experimentieren. Es ist aber möglich einen bot zu einer Gruppe hinzuzufügen. Damit aber alle Einträge in der Gruppe auch an den Bot gehen, müssen die privacy einstellungen des Bots geändert werden --> botfather


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