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: neonet am 19 Februar 2017, 15:17:10
Nachdem ich /test an FHEM via Telegram gesendet habe, erhielt ich folgende Antwort:

TelegramBot FHEM :
    Befehl: list n_ChatMessage :
  Ergebnis:
Internals:
   DEF        teleBot:msgText.* {
    if ($EVTPART1 eq 'Licht') {
        if ($EVENT =~ 'an') {
            fhem("set Tischlampe on");
   fhem("set WZ_Fensterlicht on");
            fhem("set WZ_Fernsehlicht on");
        }
        elsif ($EVENT =~ 'aus') {
            fhem("set Tischlampe off");
   fhem("set WZ_Fensterlicht off");
            fhem("set WZ_Fernsehlicht off");
        }
    }
    elsif ($EVTPART1 eq 'Zocken') {
        fhem("set WZ_Receiver on");
        fhem("set WZ_TV power on");
        fhem("sleep 15 quiet");
        fhem("set WZ_TV input hdmi1");
        fhem("set WZ_Receiver input GAME");
        fhem("set WZ_Fernsehlicht on");
    }
    elsif ($EVTPART1 eq 'FireTV') {
        fhem("set WZ_Receiver on");
        fhem("set WZ_TV power on");
        fhem("sleep 15 quiet");
        fhem("set WZ_TV input hdmi1");
        fhem("set WZ_Receiver input DVD");
        fhem("set WZ_Fernsehlicht on");
    }
    elsif ($EVTPART1 eq 'Nacht') {
        fhem("set WZ_Dekolicht off");
        fhem("set WZ_Fensterlicht off");
        fhem("set WZ_Fernsehlicht off");
        fhem("set WZ_Receiver off");
        fhem("set WZ_TV power off");
    }
    elsif ($EVTPART1 eq 'Status') {
        my $temperature = ReadingsVal("OUT.Wetter", "temperature", "");
        fhem("set $NAME send Temperatur: $temperature");
    }
    elsif ($EVTPART1 eq 'Spritpreis') {
        my $spritPreis = ReadingsVal("OUT.Spritpreis", "Diesel", "");
        fhem("set teleBot send Preis: $spritPreis");
    }
else {

    }
}
   NAME       n_ChatMessage
   NOTIFYDEV  teleBot
   NR         34
   NTFY_ORDER 50-n_ChatMessage
   REGEXP     teleBot:msgText.*
   STATE      2017-02-19 15:13:59
   TYPE       notify
   Readings:
     2017-02-18 00:48:35   state           active
Attributes:
   icon       message_mail
   room       Draussen


Ja genau das ist das erwartete Ergebnis - es war ja nur ein Test zur Erklärung der Favoriten
ACHTUNG: Hast Du cmdRestrictedPeer gesetzt auf die ID der Telegramuser die Deinem Bot Befehlen senden dürfen?
Wenn nicht: Ratschlag lies Dich tiefer ein und überlege was Du tust, ohne cmdRestrictedPeer öffnest Du jedem, der bei Dir etwas ausführen will ein Scheunentor!!!


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

viegener

Zitat von: neonet am 19 Februar 2017, 15:07:50
Vielen Dank an viegener und MadMax-FHEM! Ich bin schon an der Umsetzung.

Hier die Beschreibung im wiki:
https://wiki.fhem.de/wiki/ABFALL
Hier der Link von dem Tutorial:
https://haus-automatisierung.com/hardware/fhem/2016/12/21/fhem-tutorial-reihe-part-3-2-Muellplan-auf-abfall-modul-umstellen.html


Ich habe das at fogendermassen angepasst:
*18:30:00 IF ([Abfall:Muelltonnen_Kalender_Restmuell_text] == 1) ( set teleBot Morgen wird die schwarze Tonne abgeholt. )

Anbei noch ein screenshot von dem Abfall Modul.


Bzgl. des list ... werde ich mich gleich mal einlesen.


Vielen Dank für eure Hilfe.


Oben in Deinem List ist erkennbar, dass im Reading ...._text der Name der Mülltonne steht, da Du vermutlich keine Mülttone mit Name 1 hast wird der at nie etwas tun.

Aber wenn Du Dich nicht selber ein einarbeitest, kann ich nicht weiter helfen. Bei mir kommt das Gefühl uaf, Du möchtest eine fertige Lösung haben, die irgendjemand für Dich schreibt. Das habe ich nicht vor und da es für diesen Thread offtopic ist, würde ich auch vorschlagen, dass woanders hinzuverschieben.



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

neonet

@ viegener: ich danke dir wirklich vielmals für deine Informationen.

ZitatAber wenn Du Dich nicht selber ein einarbeitest, kann ich nicht weiter helfen. Bei mir kommt das Gefühl uaf, Du möchtest eine fertige Lösung haben, die irgendjemand für Dich schreibt. Das habe ich nicht vor und da es für diesen Thread offtopic ist, würde ich auch vorschlagen, dass woanders hinzuverschieben.
Ich werde mich auch weiterhin tiefer in die Materie einarbeiten. (Bin erst seit ca. 3 Wochen mit FHEM in Kontakt gekommen, und das seit dem fast täglich bis spät in die Nacht. Ich bin kein Programmierer deswegen fehlt mir oft das nötige Hintergrundwissen, ich bin schon dabei perl zu erlernen, weil großes Interesse meinerseits besteht)

Sorry das ich teilweise deinen Thread gesprengt habe, das wird mein letzter Post dies bzgl. sein.


Nochmals vielen Dank an viegener und alle anderen, und noch einen schönen Sonntag.

MadMax-FHEM

Zitat von: neonet am 19 Februar 2017, 16:31:57
@ viegener: ich danke dir wirklich vielmals für deine Informationen.

Ich werde mich auch weiterhin tiefer in die Materie einarbeiten. (Bin erst seit ca. 3 Wochen mit FHEM in Kontakt gekommen, und das seit dem fast täglich bis spät in die Nacht. Ich bin kein Programmierer deswegen fehlt mir oft das nötige Hintergrundwissen, ich bin schon dabei perl zu erlernen, weil großes Interesse meinerseits besteht)

Sorry das ich teilweise deinen Thread gesprengt habe, das wird mein letzter Post dies bzgl. sein.


Nochmals vielen Dank an viegener und alle anderen, und noch einen schönen Sonntag.

Du kannst auch einen eigenen neuen Thread aufmachen...

Sowas wie notify bzw. at im Umfeld Abfallkalender...
...den dann entweder in Anfängerfragen oder gleich beim passenden Modul Abfallkalender/Hilfsmodule...

Aber vorher mit notify und at beschäftigen (fhem commandref bzw. Wiki) ist ratsam weil dir auch dort vermutlich nur Hinweise/Denkanstöße gegeben werden (wenn nur vage Fragen kommen) und spätestens dann musst du dich einarbeiten...

Viel Erfolg! Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Carsten

Hallo,

nachdem ich heute mal wieder ein bißchen Zeit gefunden habe, an meinem Bot zu basteln und vor kurzem hoch erfreut bemerkt habe, dass das Inline-Keyboard jetzt implementiert ist, habe ich damit direkt ein kleines Problem.

Bei "normalen" Textbefehlen schickt mein Bot die Antwort an den Absender, wenn msgChat leer ist und an den Gruppenchat, wenn msgChat den Gruppenchat enthält.
Dafür scheint es aber bei der Inline-Keyboard-Variante kein Äquivalent zu geben, oder habe ich etwas übersehen?

Ich könnte mir merken, an wen ich das Inlinekeyboard mit queryReplyMsgId ursprünglich geschickt habe, aber das würde dazu führen, dass ich eine immer länger werdende Liste von MsgIDs führen müsste, oder dass bei rollierender Liste alte InlineKeyboards irgendwann nicht mehr richtig zugeordnet werden könnten. Prinzipiell soll dem Bot aber egal sein, wie alt der Button ist, der gedrückt wurde.
Wäre es möglich, für die queries auch ein queryChat-Reading zu implementieren?

Ein anderes ( Mini-) Problem, das ich gerade habe: Beim Testen von Inlinekeyboard habe ich zwischendurch einmal vergessen, das Dropdown auf queryInline umzustellen und die Key-Struktur über set <Bot> _msg (keyboard) text geschickt.

Jetzt habe ich da, wo sonst der [/]-Button ist, einen Button, um diese Nonsense-Tastatur auszuklappen. Wie bekommt man die wieder weg?

Ansonsten kann ich nur zum wiederholten Male meinen Dank für Deine hervorragende Arbeit an diesem Modul aussprechen. Tolle Arbeit!

szoller

Hätte auch eine kurze Zwischenfrage:
Wie kann ich es einstellen, dass FHEM demjenigen antwortet, der ihm auch den jeweiligen Befehl geschickt (z.B in einer Gruppe) hat und nicht dem defaultpeer?

oniT

Hi szoller,

relativ einfach. Hier eine Beispiel DOIF mit der Rückmeldung der Außentemperatur.

Wie funktioniert es? Du schickst eine Anfrage mit dem Wort Aussentemperatur.  In der [teleBot:msgPeerId] steht die ID des Anfragenden und gibt hier im Beispiel entsprechende Reading state aus den Device zurück.


define doif_teleBot_msg DOIF ([teleBot:"Aussentemperatur"])(set teleBot msg @[teleBot:msgPeerId] Die Aussentemperatur ist aktuell [dim_outdoor_temperature:state]°C)
DOELSE (set teleBot msg @[teleBot:msgPeerId] Anfrage ist unbekannt!)


Gruß
Tino
BBB - debian weezy - FHEM 5.7
HMLAN - HM-LC-Bl1-FM, HM-ES-PMSw1-PI, HM-LC-Sw1-FM, HM-TC-IT-WM-W-EU, HM-WDS40-TH-I, HM-Sen-Wa-Od, HM-Sec-RHS
Dimplex Wärmepumpe / Dimplex ZL 300 - Modbus TCP
SDM630M - Modbus TCP
SolarLog 200 / SMA SonnyBoy 1.5/2.5 - Modbus TCP

szoller

Danke, klingt schonmal toll! werde ich ausprobieren!

Genial, klappt super, außer, dass DoElse auch ausgeführt wird.
Mein Code:
define doif_TeleBot_msg DOIF ([TeleBot:"TempSchlafzimmer"])(set TeleBot msg @[TeleBot:msgPeerId] Die Temperatur im Schlafzimmer ist aktuell [Heizung_Schlafzimmer:temperature]°C) DOELSE (set TeleBot msg @[TeleBot:msgPeerId] Anfrage ist unbekannt!)

Der Bot sagt:
HomeBot:
ZitatDie Temperatur im Schlafzimmer ist aktuell 15.3°C
Anfrage ist unbekannt!

Bin recht unerfahren mit DOIF, laut Kurzreferenz sollte es aber doch stimmen oder?
DOELSE brauch ich zwar nicht (wenn der Bott nix erkennt, soll er auch bessernicht antworten), aber würde trotzdem gern wissen, warum er DOELSE trotzdem zeigt.

Was mir auch aufgefallen ist, ist dass er zumindest nicht in Gruppen antwortet, sondern dem Schreiber der Nachricht direkt.

viegener

Zitat von: Carsten am 21 Februar 2017, 23:15:19
Hallo,

nachdem ich heute mal wieder ein bißchen Zeit gefunden habe, an meinem Bot zu basteln und vor kurzem hoch erfreut bemerkt habe, dass das Inline-Keyboard jetzt implementiert ist, habe ich damit direkt ein kleines Problem.

Bei "normalen" Textbefehlen schickt mein Bot die Antwort an den Absender, wenn msgChat leer ist und an den Gruppenchat, wenn msgChat den Gruppenchat enthält.
Dafür scheint es aber bei der Inline-Keyboard-Variante kein Äquivalent zu geben, oder habe ich etwas übersehen?

Ich könnte mir merken, an wen ich das Inlinekeyboard mit queryReplyMsgId ursprünglich geschickt habe, aber das würde dazu führen, dass ich eine immer länger werdende Liste von MsgIDs führen müsste, oder dass bei rollierender Liste alte InlineKeyboards irgendwann nicht mehr richtig zugeordnet werden könnten. Prinzipiell soll dem Bot aber egal sein, wie alt der Button ist, der gedrückt wurde.
Wäre es möglich, für die queries auch ein queryChat-Reading zu implementieren?

Ein anderes ( Mini-) Problem, das ich gerade habe: Beim Testen von Inlinekeyboard habe ich zwischendurch einmal vergessen, das Dropdown auf queryInline umzustellen und die Key-Struktur über set <Bot> _msg (keyboard) text geschickt.

Jetzt habe ich da, wo sonst der [/]-Button ist, einen Button, um diese Nonsense-Tastatur auszuklappen. Wie bekommt man die wieder weg?

Ansonsten kann ich nur zum wiederholten Male meinen Dank für Deine hervorragende Arbeit an diesem Modul aussprechen. Tolle Arbeit!

Leider musst Du Dir genau merken an wen bzw. welchen Chat Du das keyboard gesendet hast, denn die Antwort von telegram enthält leider den chat nicht sondern nur den eigentlichen Benutzer (https://core.telegram.org/bots/api#callbackquery). Die chat_instance die im API zurückgeliefert wird enthält nicht den Namen / die ID des chats, das habe ich gestern mal ausprobiert.  Sich Namen und msgId zu merken macht aber auch Sinn, wenn mehrere Benutzer dieselbe callback query id bekommen. Ich baue dafür einen Hash auf in dem ich das merke (in Perl)

Das "unnütze" Keyboard bekommst Du weg in dem Du zum Beispiel ein Favoritenkeyboard anforderts. Ob man das auf den [/] zurücksetzen kann, weiss ich leider nicht.

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

viegener

Zitat von: szoller am 22 Februar 2017, 19:25:25
Hätte auch eine kurze Zwischenfrage:
Wie kann ich es einstellen, dass FHEM demjenigen antwortet, der ihm auch den jeweiligen Befehl geschickt (z.B in einer Gruppe) hat und nicht dem defaultpeer?

Das kommt etwas darauf an, was Du verwendest um Befehle abzuarbeiten. Bei Verwendung von cmdKeyword oder Favoriten wird normalerweise an denjenigen geantwortet der den Befehl sendet (Zumindest wenn derjenige authorisiert ist).

Über defaultPeerCopy lässt sich einstellen, ob zusätzlich noch der defaultpeer die Antowrt erhalten soll.

Bei dem DOIF von oniT findet keine Berechtigungsorüfung statt. Im Normalfall kann dann jeder Deinem FHEM Kommandos schicken, bei Temperaturen mag das nicht kritisch sein, aber sobald wirklich Kommandos ausgeführt werden...

Frage: Warum verwendet Ihr keine Favoriten oder generell cmdKeyword - ist der DOIF nicht viel schwieriger als einen Favoriten anzulegen?

/temp=set mybot msg [mybot :msgPeerId] Die Temperatur im Schlafzimmer ist aktuell [Heizung_Schlafzimmer:temperature] Grad;


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

Carsten

Hi und danke für die Antwort!
Zitat von: viegener am 24 Februar 2017, 10:21:15
Leider musst Du Dir genau merken an wen bzw. welchen Chat Du das keyboard gesendet hast, denn die Antwort von telegram enthält leider den chat nicht sondern nur den eigentlichen Benutzer (https://core.telegram.org/bots/api#callbackquery). Die chat_instance die im API zurückgeliefert wird enthält nicht den Namen / die ID des chats, das habe ich gestern mal ausprobiert.  Sich Namen und msgId zu merken macht aber auch Sinn, wenn mehrere Benutzer dieselbe callback query id bekommen. Ich baue dafür einen Hash auf in dem ich das merke (in Perl)

Was steht denn dann in chat_instance? Muss ja zumindest unique und immer gleich sein, wenn man sich laut API-Referenz damit den Game-Highscore merken kann.
Ich werde wahrscheinlich einfach den Keyboards, die ich an die Gruppe schicke, einen Prefix für die Kommandos mitgeben. Das sollte eigentlich seinen Zweck erfüllen.

Zitat von: viegener am 24 Februar 2017, 10:21:15
Das "unnütze" Keyboard bekommst Du weg in dem Du zum Beispiel ein Favoritenkeyboard anforderts. Ob man das auf den [/] zurücksetzen kann, weiss ich leider nicht.
In der API gibt es dafür scheinbar https://core.telegram.org/bots/api#replykeyboardremove. Habe ich eine Chance, das zu senden?


Und noch eine Frage mit sehr niedriger Priorität: Ich habe im Moment das Attribut queryAnswertext auf 0, weil mir der Kreisel genug Feedback war. Jetzt habe ich aber doch einen Fall, wo der Answertext ganz nett wäre. Das bedeutet dann aber, dass ich alle Antworten selber handeln muss, oder gibt es eine Möglichkeit automatisch den Default zu schicken, ausser es wurde schon etwas anderes geschickt?

viegener

Zitat von: Carsten am 24 Februar 2017, 11:13:18
Hi und danke für die Antwort!
Was steht denn dann in chat_instance? Muss ja zumindest unique und immer gleich sein, wenn man sich laut API-Referenz damit den Game-Highscore merken kann.
Ich werde wahrscheinlich einfach den Keyboards, die ich an die Gruppe schicke, einen Prefix für die Kommandos mitgeben. Das sollte eigentlich seinen Zweck erfüllen.
In der API gibt es dafür scheinbar https://core.telegram.org/bots/api#replykeyboardremove. Habe ich eine Chance, das zu senden?


Und noch eine Frage mit sehr niedriger Priorität: Ich habe im Moment das Attribut queryAnswertext auf 0, weil mir der Kreisel genug Feedback war. Jetzt habe ich aber doch einen Fall, wo der Answertext ganz nett wäre. Das bedeutet dann aber, dass ich alle Antworten selber handeln muss, oder gibt es eine Möglichkeit automatisch den Default zu schicken, ausser es wurde schon etwas anderes geschickt?

In chat_instance steht eine Zahl, ja vermutlich eindeutig, aber trotzdem muss ja die Zuordnung zur Gruppe / user irgendwo gespeichert werden.

Ich kann schon eine Methode einbauen, die ein Keyboard removed aber wenn Du Favoriten nutzt, kannst Du doch das bisherige jederzeit überschhreiben, oder?

Zu Deiner Frage bzgl queryAnswertext, im Prinzip kannst Du da ja eine Perl-Funktion hinterlegen, die immer "" oder ähnliches zurückliefert ausser in dem Fall, wo Du einen speziellen Antworttext brauchst. Der perl-teil kann auch ganz einfach sein und nur per if die spezielle Rückgabe anfordern.

Automatische Antworten sind nur für ddas TBot_List-Modul angelegt.

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

Carsten

Zitat von: viegener am 24 Februar 2017, 12:59:59
In chat_instance steht eine Zahl, ja vermutlich eindeutig, aber trotzdem muss ja die Zuordnung zur Gruppe / user irgendwo gespeichert werden.

Ja, genau wie für die Gruppen-ID. Die Zuordnung Gruppe <-> User brauch ich zumindest in meinem Anwendungsfall nicht. Ich wüsste jedenfalls nicht, wofür. Ich habe eine Liste von Usern, auf die der Bot reagieren soll ( Konkret einen Dummy pro User, der unter anderem ein Reading für die Telegram-ID hat ). Wenn einer davon die Funktion aus der Gruppe heraus triggert, wird er wohl in der Gruppe sein. Mir fällt kein Grund ein, warum ich das im Vorraus wissen müsste.
Relevant ist für mich derzeit nur, ob der Trigger aus der Gruppe kam oder direkt, damit ich ggf. weiß, wohin mit der Antwort, aber das kann ich dann wie gesagt auch über einen cmd-Prefix erkennen.

Zitat von: viegener am 24 Februar 2017, 12:59:59
Ich kann schon eine Methode einbauen, die ein Keyboard removed aber wenn Du Favoriten nutzt, kannst Du doch das bisherige jederzeit überschhreiben, oder?
Ich nutz das Keyboard ( bisher ) gar nicht, bzw. nur aus Versehen.  ;D
Wenn es die Möglichkeit schon gäbe, würde ich sie jetzt genau einmal nutzen, um meine Fehleingabe zu korrigieren. Insofern besteht kein Grund, die jetzt für mich einzubauen.

Zitat von: viegener am 24 Februar 2017, 12:59:59
Zu Deiner Frage bzgl queryAnswertext, im Prinzip kannst Du da ja eine Perl-Funktion hinterlegen, die immer "" oder ähnliches zurückliefert ausser in dem Fall, wo Du einen speziellen Antworttext brauchst. Der perl-teil kann auch ganz einfach sein und nur per if die spezielle Rückgabe anfordern.
Okay, das habe ich mir schon gedacht. Werde ich wohl hinkriegen.  :)
Leerstrings ist dann gleichbedeutend mit 0 im Attribut? Also "" = keine Meldung wird angezeigt, aber Spinner verschwindet?

viegener

Zitat von: Carsten am 24 Februar 2017, 13:27:56
Ja, genau wie für die Gruppen-ID. Die Zuordnung Gruppe <-> User brauch ich zumindest in meinem Anwendungsfall nicht. Ich wüsste jedenfalls nicht, wofür. Ich habe eine Liste von Usern, auf die der Bot reagieren soll ( Konkret einen Dummy pro User, der unter anderem ein Reading für die Telegram-ID hat ). Wenn einer davon die Funktion aus der Gruppe heraus triggert, wird er wohl in der Gruppe sein. Mir fällt kein Grund ein, warum ich das im Vorraus wissen müsste.
Relevant ist für mich derzeit nur, ob der Trigger aus der Gruppe kam oder direkt, damit ich ggf. weiß, wohin mit der Antwort, aber das kann ich dann wie gesagt auch über einen cmd-Prefix erkennen.

Bei mir wäre es möglich, dass jemand sowohl aus der Gruppe als auch im Einzelchat einen Dialog startet, dafür müsste ich mir eigentlich die Kombination als Schlüssel merken, da ich bei mir aber nicht rausfinden kann von wo der Benutzer gerade schreibt, habe ich das vereinfacht und schreibe immer direkt an den Benutzer zurück, denn die Interaktion interessiert die anderen in der Gruppe nicht.

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

Carsten

Zitat von: viegener am 24 Februar 2017, 16:46:03
Bei mir wäre es möglich, dass jemand sowohl aus der Gruppe als auch im Einzelchat einen Dialog startet, dafür müsste ich mir eigentlich die Kombination als Schlüssel merken, da ich bei mir aber nicht rausfinden kann von wo der Benutzer gerade schreibt, habe ich das vereinfacht und schreibe immer direkt an den Benutzer zurück, denn die Interaktion interessiert die anderen in der Gruppe nicht.

Achso. Bei mir ist Gruppe der Hauptzweck und Direktchat Bonus.
Dialoge gibt es bei mir derzeit nur mit max einer Rückfrage des Bots in der Form User: /befehl -> Bot: Rückfrage -> User: Detail -> Bot: Antwort -> ENDE
Dazu merke ich mir in einem Dummy mit ( ggf. ) Chat-ID und User-ID für zwei Minuten den Ursprungsbefehl und interpretiere den nächsten Text von <User> in <Chat> als Antwort auf die Rückfrage. Ist ein bißchen "grobmotorisch", funtioniert aber ganz gut.

Die Menü-Untermenüstrukturen mit den Inlines wie in dem Zettelbot von pah habe ich mir erstmal abgeschminkt. Das ist im Gruppenchat wohl eher verwirrend.  ;D

Ansonsten ist das mit den Inlines für meine Zwecke perfekt. So müssen die Leute sich nicht mehr zig Befehle merken, der Chat selbst wird nicht mit den Befehlen zugespammt und schneller ist es so auch.