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: Reinerlein am 28 Januar 2016, 09:42:48
Hi Johannes,

das war auch einer meiner ersten Gedanken. Allerdings ist diese \x00 ein Teil der Versionsnummer des ID3-Tags, und könnte damit auch mal ungleich 0 sein :)
Unter http://id3.org/id3v2.3.0#ID3v2_header gibt es eine Beschreibung des 10Byte Headers. Demnach ist dort am Anfang lediglich die ID3-Textfolge fest.

Meine Idee ging jetzt in die Richtung, dass ich diese 10 Bytes auslese, die Position für den Anfang des eigentlichen MP3-Files ausrechne (die Anzahl der Bytes für den ID3-Tag selbst stehen mit im Header), und dort die eigentlichen MP3-Identifiier suche... Ich komme da aber momentan nicht zu...

Grüße
Reiner

Da ich die Analyse auf die verschiedenen Dateiformate bei jeder Nachricht durchführen muss, will ich vermeiden, dass das zuviel Rechenaufwand verbraucht. Ich habe deshalb jetzt mal auf die aktuell verwendeten/definierten ID3V2-Versionen geprüft
(Also 2.2.x / 2.3.x / 2.4.x wobei 2.4.x wohl noch relativ wenig in Benutzung sind)

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

viegener

Die aktuelle Version 1.4 ist jetzt auch im SVN abgelegt und dann mit dem nächsten FHEM Update verfügbar.

Wesentliche Änderungen:

Das Empfangen von Mediendateien im Bot (Bilder, etc). Sobald ein solcher Empfangen wird, kann man über einen weiteren Aufruf den URL zur Datei (bei Telegram) erhalten. Dieser URL ist nur temporär verwendbar.
Achtung: Der URL enthält dann auch das TelegramBot AuthToken!

Das Senden von Mediendateien direkt im Aufruf ohne den Umweg erst eine Datei anlegen zu müssen. Das Dateiformat wird dabei aus dem Stream abgeleitet (MP3, PNG, JPG, PDF und Office-Docs sind unterstützt).



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

Reinerlein

Hallo Gerd,

der Ordner liegt auf oberster Ebene (deshalb ja mit einem "/" beginnend :) ).
Mittels

ls -la /tmp/plot_*.png
kannst du dir die bereits erzeugten Dateien (zumindest wenn du mein Codebeispiel übernommen hast) auflisten lassen.

Wie gesagt, räumt sich das nicht von selber auf, ist aber schon mal an einer Stelle, die für temporäre Dateien vorgesehen ist :)

Grüße
Reiner

Maista

Hallo Reiner,

ich bin gerade etwas verwundert.

Ich habe als Favoriten z.B. folgendes in meinem Bot stehen :
Zitat/Luftdruck={plotAsPng('SVG_log_LI_28_A3D984001605_1')}

Damit und zu allen anderen Sensoren kann ich mir jeweils ein Bild der Aufzeichnung schicken lassen.
Diese Zeile habe ich in der Hilfe zum TelegramBot gesehen.

Nun bin ich davon ausgegangen das dies irgend wie mit deinem Perl-Beispiel aus der 99_myUtils.pm zusammen hängt.
Nach dem ich aber in dieser alles auskommentiert habe, geht die Funktion weiter hin.

Ich hatte dein Beispiel kopiert und nach Misserfolg noch die Library wie geschrieben installiert und dann tat es.
Erst als ich noch ein Text mit ausgeben wollte um zu sehen wo den bei mir das /tmp ist, habe ich bemerkt das die
Zeilen in der 99_myUtils.pm gar nicht angesprochen werden  ::).

Und bin nun der Meinung das dein Beispiel nichts mit meinem Befehl und folglich auch nichts mit den Temp-Verzeichnis zu tun hat ???

Den ich hatte in deinem Beispiel bei mir vergessen den Bot umzubenennen.
Und war kurz erstaunt das es überhaupt funktionierte.

Demnach hat Johannes die Funktion in den TelegramBot eingebaut.
Wen dem so ist, kann natürlich auch nichts im /tmp stehen bleiben , hatte mit dem MC auf dem RPi gesucht und nichts gefunden :)

Aber für weitere Beispiele ist das auch praktisch. Programmiere zwar sporadisch etwas in Perl, aber das FHEM-Spezielle
erschliesst sich mir nicht immer sofort.

Danke fürs zuhören.

Gruss
Gerd

Reinerlein

Hallo Gerd,

da hast du recht. Mittlerweile kann das TelegramBot-Modul direkt binäre Ergebnisse versenden. Dazu wird direkt im binären Stream geschaut, was für ein Typ das Ergebnis ist, damit die Antwort korrekt gemeldet werden kann.

Die Funktion "plotAsPng()" kommt direkt aus dem zentralen SVG-Modul. Allerdings muss man besagte Library in Perl nachinstallieren...
Mein "sendPlot()"-Beispiel ist nur noch für die Suppe :) Der einzige Vorteil ist noch, dass man direkt einen Text mitgeben kann, der dann unter dem Plot dargestellt wird. Ich lasse mir z.B. täglich Morgens die Aussentemperaturkurve der letzten 24 Stunden zusenden. Solche Infos sende ich mir gerne mit einem Untertitel, um mitzuteilen, warum das nun gesendet wurde...
Die neue Variante verwende ich für meine direkten Anweisungen für Plots, die ich gerne sehen möchte, aber keine große Vorbereitung getroffen habe. Da steht dann ja auch mein Befehl im Chat direkt drüber, und ich weiß, warum ich das Ergebnis erhalte :)

Grüße
Reiner

viegener

Zitat von: Maista am 08 Februar 2016, 22:36:00
Den ich hatte in deinem Beispiel bei mir vergessen den Bot umzubenennen.
Und war kurz erstaunt das es überhaupt funktionierte.

Demnach hat Johannes die Funktion in den TelegramBot eingebaut.
Wen dem so ist, kann natürlich auch nichts im /tmp stehen bleiben , hatte mit dem MC auf dem RPi gesucht und nichts gefunden :)

Aber für weitere Beispiele ist das auch praktisch. Programmiere zwar sporadisch etwas in Perl, aber das FHEM-Spezielle
erschliesst sich mir nicht immer sofort.


Ich kann zumindest folgendes erhellen:

Die Funktion plotAsPng stammt eigentlich aus dem SVG-Modul, ich habe nur die Möglichkeit in TelegramBot eingebaut, dass Daten direkt an den Bot übergeben werden können, die dann als Bilder/Audio oder Dokument über Telegram versendet werden, ohne dass man erst eine Datei erzeugen muss.

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

Maista

Hallo zusammen,

danke für Eure Antworten.

Ich hatte mich schon gewundert das ich etwas in die 99_myUtils.pm rein schreibe welches dann nicht per Bot aufgerufen wurde :=)
Aber so ist das ganze doch wesentlich einfacher.

Vielleicht kann Johannes bei Gelegenheit noch die Möglichkeit schaffen ein Kommentar dem Bild mit zu geben  ::)

Danke

Gerd

Reinerlein

Hallo Gerd,

natürlich kann das das Modul bereits (deswegen kann ich es ja in meiner "sendPlot()" verwenden).
Nur geht das natürlich nicht bei einer Antwort eines Perl-Aufrufs. Der Aufruf kann ja nur ein Ergebnis liefern. Hier wären aber zwei notwendig. Und dann müsste vermutlich irgendwo noch stehen, was denn für ein Text mitgesendet werden sollte...

Grüße
Reiner

Reinerlein

Hallo Johannes,

besteht die Möglichkeit, dass das Modul Nachrichten für den Versand puffert, wenn gerade keine Verbindung zum Internet besteht?

Ich habe momentan eine halbdefekte Fritzbox im Betrieb (der Austausch zieht sich leider hin) die in unmotivierten Zeitabständen das Internet neu verbindet. Wenn gerade in einem solchen Zeitraum eine Message versendet werden sollte, wird sie nach einer Timeout-Fehlermeldung verworfen...

Grüße
Reiner

Reinerlein

Hallo Johannes,

ich schon wieder :)

Ich baue gerade eine ganze Menge Mitteilungen in mein System ein. Momentan geht das nur an mich, allerdings besteht so langsam ein Bedarf, dass manche Mitteilung auch an andere Familienmitglieder gesendet wird.
Dafür wäre es viel einfacher, wenn man dem Modul eine (bzw. mehrere) Gruppe(n) definieren könnte, die man beim Versenden der Nachrichten angibt, und einfach nachträglich zentral am Modul anpassen könnte.
Dabei wollte ich absichtlich nicht auf einen bestimmten Chat zurückgreifen, sondern das ganze Fhem-intern abwickeln.

Man könnte z.B. ein Attribut definieren:

attr telegram sendGroups &Fenster:@Nutzer1,@Nutzer2 | &Türen:@Nutzer1,@Nutzer3 | &Batterien:@Nutzer2,@Nutzer4


Dann könnte man eine Nachricht an diesen Empfängerkreis senden mit

set telegram msg &Batterien Die Batterie von Device xyz ist leer!

Wobei das absichtlich jeweils eine eigene Kopie an jeden Empfänger ist, und somit äquivalent zu

set telegram msg @Nutzer2 @Nutzer4 Die Batterie von Device xyz ist leer!
wäre.

Dafür kann man später sehr einfach den Empfängerkreis für Batteriemeldungen anpassen, ohne bei den einzelnen Meldungen eine Anpassung vornehmen zu müssen...

Ich kann dich da auch gerne unterstützen :)

Grüße
Reiner

viegener

Zitat von: Reinerlein am 13 Februar 2016, 15:45:31
Hallo Johannes,

ich schon wieder :)

Ich baue gerade eine ganze Menge Mitteilungen in mein System ein. Momentan geht das nur an mich, allerdings besteht so langsam ein Bedarf, dass manche Mitteilung auch an andere Familienmitglieder gesendet wird.
Dafür wäre es viel einfacher, wenn man dem Modul eine (bzw. mehrere) Gruppe(n) definieren könnte, die man beim Versenden der Nachrichten angibt, und einfach nachträglich zentral am Modul anpassen könnte.
Dabei wollte ich absichtlich nicht auf einen bestimmten Chat zurückgreifen, sondern das ganze Fhem-intern abwickeln.

Man könnte z.B. ein Attribut definieren:

attr telegram sendGroups &Fenster:@Nutzer1,@Nutzer2 | &Türen:@Nutzer1,@Nutzer3 | &Batterien:@Nutzer2,@Nutzer4


Dann könnte man eine Nachricht an diesen Empfängerkreis senden mit

set telegram msg &Batterien Die Batterie von Device xyz ist leer!

Wobei das absichtlich jeweils eine eigene Kopie an jeden Empfänger ist, und somit äquivalent zu

set telegram msg @Nutzer2 @Nutzer4 Die Batterie von Device xyz ist leer!
wäre.

Dafür kann man später sehr einfach den Empfängerkreis für Batteriemeldungen anpassen, ohne bei den einzelnen Meldungen eine Anpassung vornehmen zu müssen...

Ich kann dich da auch gerne unterstützen :)

Grüße
Reiner

Kein Problem: Anregungen sind immer willkommen!

Ich verstehe Deine Anfrage und auch, warum Du keine Chat-Id verwenden willst. Aber eigentlich gibt es doch dafür extra Gruppen in Telegram? Mir ist jetzt noch nicht klar, welchen Nutzen eine eigene Gruppenverwaltung im FHEM-Modul bieten würde. Ich arbeite bei mir fast nur mit den Benutzerids und das ist sicherer aber natürlich nicht sehr nutzerfreundlich.

Also die Frage, warum keine Telegram-Benutzergruppen dafür verwenden?

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

viegener

Zitat von: Reinerlein am 09 Februar 2016, 13:52:12
Hallo Johannes,

besteht die Möglichkeit, dass das Modul Nachrichten für den Versand puffert, wenn gerade keine Verbindung zum Internet besteht?

Ich habe momentan eine halbdefekte Fritzbox im Betrieb (der Austausch zieht sich leider hin) die in unmotivierten Zeitabständen das Internet neu verbindet. Wenn gerade in einem solchen Zeitraum eine Message versendet werden sollte, wird sie nach einer Timeout-Fehlermeldung verworfen...

Grüße
Reiner

Ahh, das macht natürlich Sinn. Wenn man sich auf Telegram als Info zu wichtigen Ereignissen verlassen soll, dann sollte es eine Art "guaranteed delivery" geben.

Fragen dazu:

- Ich würde allerdings trotzdem eine Art "timeout" oder max-retries vorsehen, also wenn nach einer bestimmten Zeit oder eine bestimmten Anzahl von Versuchen kein durchkommen ist, wird aufgegeben? (meine Vorstellung wäre default ist 24h)
- Sollten die gepufferten Meldungen auch einen Neustart überleben? - Mein Vorschlag: erstmal nicht

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

Reinerlein

Hi Johannes,

danke schon mal für deine Reaktion.

zu den Gruppen: Ich wollte die wirklichen Empfänger im Prinzip darüber im unklaren lassen, wer die Nachricht noch so alles bekommen hat. Wenn ich eine Gruppe bei Telegram richtig verstehe, dann sieht jeder ja, wer noch enthalten ist, und man bekommt bei Veränderungen auch immer Nachrichten darüber (was im Normalfall nun ja auch wirklich sinnvoll ist).

Ich wollte (sind ja hauptsächlich meine Familienmitglieder) nicht mit zusätzlichen Infos spammen, sondern, sozusagen im Untergrund, die Zustellungsgruppen anpassen können.

Zu dem Buffer: Ich denke auch, dass es im ersten Schritt keinen Neustart überstehen muß, und ein 24h Timeout tut auch nicht weh und erscheint mir ebenfalls sinnvoll. Dann bereinigt sich das System auf jeden Fall selber. Die seltenen Fälle von Neustart (wegen Update oder so) dürfen dann halt nicht mit fehlendem Internet zusammenfallen :).
Mein Fhem läuft ja stabil (auch wenn die Perfomance wegen des sporadisch fehlenden Internets stark absinkt), nur mein Internet momentan überhaupt nicht :(
Ich bin da gerade sicherlich auch ein Sonderfall, aber auch der normale 24h-Trenner kann ja im ungünstigsten Fall zu einer Nachrichtenverhinderung führen...

Grüße
Reiner

viegener

Hallo Reiner,
bei den Gruppen bin ich noch nicht überzeugt, ich tue mich da etwas schwer, die Funktionalität von Telegram im Modul zu doppeln. Bei mir sollen auch alle potentiellen Empfänger mitbekommen, wenn Sie Teil einer Gruppe/Verteilerliste sind (eigentlich sollen Sie sich auch selber aus der Liste entfernen können).
Ist es möglich das innerhalb von FHEM z.B. mit dem msg-Befehl abzuwickeln?

Die Änderung zum Resend habe ich mal vorbereitet, dabei ist mir aber klar geworden, dass es verschiedene Fälle gibt:
a) Fehler, die in FHEM liegen -> Hier möchte man kein retry, damit man die Fehlermeldung sofort lösen kann
b) Temporäre Fehler (timeout, Netzwerkfehler wie bei Dir, etc) -> Retry macht Sinn
c) Generelle Fehler (Account falsch, Format nicht unterstützt etc) -> Eigentlich kein Retry

Nur im Fall b möchte man einen Retry haben. Da ich das gerne unterscheiden möchte, wäre die Frage welche Fehlermeldung bekommst Du denn bei Netzwerkfehlern (in sentMsgResult?

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

Reinerlein

Hi Johannes,

das mit den Gruppen ist auch nicht Kriegsentscheidend. Da die meisten meiner Nachrichten mit einem umliegenden DOIF versendet werden, habe ich ja sehr einfachen Zugriff auf Readings von Devices. Ich lege mir einfach zu jeder "Gruppe" ein Reading mit den Benutzern an, wie es beim "set telegram msg"... als erstes geschrieben werden muss, und kann damit meine Gruppen intern im Reading verwalten...
Ich würde das auch nicht Gruppenverwaltung nennen, sondern eher als Zweck-Alias für einen oder mehrere Benutzer sehen. Damit kann ich locker leben... es sollte ja nur ein Vorschlag sein...

Zu dem ausfallenden Internet:
Ich habe das mal gerade beobachtet. Erst steht dort ein "WAITING" drin, und nach kurzer Zeit (vielleicht 20-60s, ich habe leider nicht auf die Uhr gesehen) dann "NonBlockingGet: returned connect to to https://api.telegram.org:443 timed out" (mit dem doppelten "to").

Wie möchtest du denn a) erkennen? Zwischen b) und c) sehe ich ja noch eine gute Differenzierbarkeit, aber bei a) hört die Erkennbarkeit doch auf, oder? Sonst könntest du mit deinem Code ja die allgemeine Fehlersuche in Fhem revolutionieren :)

Grüße
Reiner