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 24 Januar 2016, 11:44:25
Hallo Johannes,

ich werde das heute Abend testen...

Zwischendurch mal eine andere Frage:
Ich versuche gerade eine Telegram-Tonaufnahme auf einem Sonos-Player wiederzugeben. Das klappt nicht auf Anhieb, weil der Player das Format nicht abspielen kann (obwohl Ogg auf der Website als funktionierend deklariert ist).

Nun habe ich mir mal das Format mittels avprobe angeschaut (und wollte es einfach in MP3 konvertieren), erhalte aber folgende Ausgabe:

avprobe version 0.8.6-6:0.8.6-1+rpi1, Copyright (c) 2007-2013 the Libav developers
built on Mar 31 2013 13:58:10 with gcc 4.6.3
[ogg @ 0x1eb6660] Codec not found
/mnt/SonosSpeak/telegram_file_13.ogg: End of file

Ich bekomme avconv einfach nicht dazu, diese Datei zu akzeptieren, und zu konvertieren...
In der Datei sind unter den ersten Bytes die Zeichenfolge "ogg" vorhanden, und weiter hinten wird was von opuslib geschrieben...

Hat jemand schon mal diese Tonaufnahmen weiterverwendet? Weiß jemand wie ich diese korrigeren/konvertieren kann?

Danke schon mal für sachdienliche Hinweise :)

Grüße
Reiner

Ich muss mir das auch mal anschauen, im Browser konnte ich sie abspielen (Firefox/Windows) mit dem URL den das Modul zurückliefert. Bisher habe ich das nicht genauer analysiert.

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

JoeALLb

@Reiner, hast du den download schon automatisiert? Wenn ja,  kannst du mir einen Code geben? Ich hab erst begonnen, wegen Besuch musste ich aber unterbrechen....
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Reinerlein

Hi JoeALLb,

das ist nicht weiter kompliziert :)

Hier das Notify auf meinem TelegramBot (heißt "telegram"):

telegram:msgText:.received.voice.* {
  my $url = fhem("get $NAME urlForFile ".ReadingsVal($NAME, 'msgFileId', ''));
  my $fileName = "$NAME_$1" if ($url =~ m/.*\/(.*)/);
  my $newFileName = "$1.mp3" if ($fileName =~ m/(.*)\..*/);

  writeFile('/mnt/SonosSpeak/'.$fileName, get($url));
  qx(/usr/bin/avconv -i /mnt/SonosSpeak/$fileName /mnt/SonosSpeak/$newFileName);
  fhem('set '.ReadingsVal($NAME, 'currentSpeakPlayer', 'tmperror').' PlayURITemp \\\\192.168.0.11/SonosSpeak/'.$newFileName.' '.ReadingsVal($NAME, 'currentSpeakVolume', 5));
}


Und dann noch die Write-Prozedur in einer 99_myUtils.pm:

sub writeFile($$) {
my ($fileName, $data) = @_;

open IMGFILE, '>'.$fileName;
binmode IMGFILE;
print IMGFILE $data;
close IMGFILE;
}


Da steckt jetzt schon der Versuch drin, die Datei vor der Verwendung in ein MP3 umzuwandeln, was ja fehlschlägt (genauso wie die direkte Wiedergabe dieser Datei auf den Sonos-Player).
Und natürlich hat bei dir der Pi vermutlich eine andere IP-Adresse.

Für die Wiedergabe auf den Playern habe ich mir am TelegramBot-Device zwei eigene Readings eingebaut, die ich per Kommando verändern kann.
"currentSpeakPlayer" - Gibt den oder die Player an, wo die Wiedergabe erfolgen soll
"currentSpeakVolume" - Gibt die zu verwendende Lautstärke an.

Dann gibt es am TelegramBot-Device noch die Favoriten zum Setzen dieser Readings:

/jim=setreading telegram currentSpeakPlayer Sonos_Jim ; /joe=setreading telegram currentSpeakPlayer Sonos_Joe ; /wohnzimmer=setreading telegram currentSpeakPlayer Sonos_Wohnzimmer ; /kinder=setreading telegram currentSpeakPlayer Sonos_Jim,Sonos_Joe ; /schlafzimmer=setreading telegram currentSpeakPlayer Sonos_Schlafzimmer ; /all=setreading telegram currentSpeakPlayer Sonos_Jim,Sonos_Joe,Sonos_Schlafzimmer,Sonos_Wohnzimmer ; /speakvolume=setreading telegram currentSpeakVolume

Da gibt es Jim und Joe (nochmal als Gruppe "Kinder" zusammen), Schlafzimmer und Wohnzimmer, und alle zusammen.
Sowie den Favoriten zum Setzen der Abspiellautstärke. Das wird im Notify auch schon alles berücksichtigt/verwendet...

Was jetzt noch fehlt, ist eine saubere Konvertierung der Datei, damit Sonos diese wiedergeben kann. Dann kann die Durchsagerei losgehen :)

Grüße
Reiner

viegener

Zitat von: Reinerlein am 24 Januar 2016, 11:44:25
Ich versuche gerade eine Telegram-Tonaufnahme auf einem Sonos-Player wiederzugeben. Das klappt nicht auf Anhieb, weil der Player das Format nicht abspielen kann (obwohl Ogg auf der Website als funktionierend deklariert ist).

Nun habe ich mir mal das Format mittels avprobe angeschaut (und wollte es einfach in MP3 konvertieren), erhalte aber folgende Ausgabe:

Hat jemand schon mal diese Tonaufnahmen weiterverwendet? Weiß jemand wie ich diese korrigeren/konvertieren kann?

Hallo Reiner,
habe gerade mal versucht das auf dem Sonos abzuspielen. Bei mir kommt auch eine Fehlermeldung auf dem Sonos (nicht unterstütztes Format). VLC kann es allerdings ebenfalls abspielen, da ich keinen Konverter auf dem System habe ich mal einen Onlinekonverter ausprobiert (https://online-audio-converter.com/de/). Dabei gab es keine Probleme einen funktionsfähigen MP3 zu erzeugen...

Also Ja es gibt Probleme zwischen Sonos und dem Telegram Ogg-Format und ich denke man braucht dafür vermutlich einen Konverter.

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

JoeALLb

Zitat von: Reinerlein am 24 Januar 2016, 20:48:40
Hi JoeALLb,

das ist nicht weiter kompliziert :)

Och doch... mein Dateidownload (mit wget) war bei weitem nicht so elegant wie Deine Umsetzung!!!
Vielen Dank dafür!!

Hinweis:
Dieser Code hier konnte so nicht verwendet werden, da die Variable $NAME_ nicht definiert ist. Ich musste also den String leicht anders zusammenfügen, dann klappts aber gut!
"$NAME_$1"


Auf meinem Intel-Board mit Debian8 wird das OGG-File korrekt als MP3 umgewandelt--- Ich muss also nur noch die Sonos-Ansteuerung testen!

Vielen Dank nochmal!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

ulli

Zitat von: ulli am 21 Januar 2016, 21:23:51
Ich habe inzwischen alles gut am Laufen mit dem Telegram Modul.

Nun habe ich einen Chat erstellt mit zwei Benutzern und diesen Chat als defaultPeer angegeben.
Wenn ich jetzt den Bot direkt anschreibe (also nicht über den Chat) dann antwortet der Bot immer im Chat (also dem defaultPeer)
Kann man es irgendwie einstellen im Modul das der Bot dem Antwortet von dem er "gefragt" wird?

@Johannes gibt es zu oben beschriebenen Pronomen eine Lösungsidee?

Reinerlein

Hi Johannes, hi JoeALLb,

sooo, ich habe das mit der Durchsagewiedergabe nun hinbekommen.
Bei mir fehlten wohl einige Codecs im AVConverter.
Mit

sudo apt-get install libav-tools
hat er die fehlenden installiert. Mein Codebeispiel geht bei mir jetzt (natürlich mit der geschweiften Klammer um "$NAME", also "${NAME}_$1", die fehlten noch :) )

Auch die Rückgabe der Bilddaten direkt als Ergebnis eines Befehls klappt gut. Klasse...
Ich bin gerade noch dabei, herauszufinden, ob man einfach ein MP3 mit ID3v2-Tag erkennen kann. Meine MP3s haben immer einen solchen Tag, und kommen deshalb nicht als Ergebnis zurück... ist aber nicht Kriegsentscheidend...

Grüße
Reiner

JoeALLb

Super, dass es klappt.
Die Verzögerungen sind meist auch relativ kurz, bis die Sprachausgabe dann am Sonos herauskommt, aber manchmal bleibt es etwas "hängen".
Das werd ich mir an einem freien Wochenende mal genauer ansehen!
@Reiner: Ich hätte dazu einen Featurerequest: Könne das Sonos-Modul ein Reading pflegen, wieviele Geräte gerade am spielen sind?
Ähnlich wie beo roommates, das ausgibt, wieviele Personen gerade zuhause sind.
Im Moment behelfe ich mir mit folgender Abfrage, aber als Reading mit Events wäre das natürlich viel eleganter!
{scalar devspec2array("TYPE=SONOSPLAYER:FILTER=transportState=PLAYING:FILTER=currentTrackProvider!=Gruppenwiedergabe.*") }
Ich möchte die Sprachausgabe nur dann starten, wenn maximal 1 Player im ganzen Haus gerade spielt....

Zitat von: Reinerlein am 25 Januar 2016, 22:57:57
Ich bin gerade noch dabei, herauszufinden, ob man einfach ein MP3 mit ID3v2-Tag erkennen kann. Meine MP3s haben immer einen solchen Tag, und kommen deshalb nicht als Ergebnis zurück... ist aber nicht Kriegsentscheidend...

Den Satz verstehe ich nicht ganz?!?

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Reinerlein

Hi JoeALLb,

das mit den gerade spielenden Playern schaue ich mir mal an.

Der Satz mit dem ID3v2-Tag bezog sich auf die neue Rückgabemöglichkeit bei Kommandos.
Dort wird die Rückgabe des Kommandos einer Identifikation unterzogen, um zu erkennen, ob ein Audio-Stream zurückgegeben werden soll.
Diese Erkennung funktioniert nicht, wenn die Rückgabedaten eine MP3-Datei mit ID3v2-Tag sind. Ob das oft vorkommt sei mal dahingestellt (deswegen ja auch nicht soo wichtig), aber der vollständigkeithalber sollte es noch dazu...

Grüße
Reiner

PSI69

Super Modul - das Einrichten ging einfach, die ersten Nachrichten waren schnell geschickt. Und dann, dann kam mein Problem: Ich hätte nicht gedacht, mit dem Bot den FHEM in eine Boot-Endlosschleife zu schicken...

Meine Konfig:

#
# Telegram Interface
#
define TeleBot TelegramBot xxxxxxxxxxxxxxxxxxxxx
attr TeleBot cmdKeyword doit
# entspricht Account xxxx
attr TeleBot cmdRestrictedPeer 11111111
attr TeleBot defaultPeer xxxx
attr TeleBot pollingTimeout 20
attr TeleBot favorites shutdown restart
attr TeleBot cmdFavorites /short


Ich habe mir also einen Favoriten auf das 'shutdown restart' Kommando vom FHEM angelegt, ich dachte, es sei eine gute Idee, den FHEM bei Problemen per Kommando in den Reboot zu senden; schön. Am Telefon mittels '/short' im Telegram die Liste der Favoriten abgefragt, gewartet, das die Antwort kommt und gewundert, dass das Webinterface vom FHEM im Browser weg war.

Meine Lösungsversuche:
Reboot RasPi - negativ
Stop FHEM (sudo /etc/init.d/fhem stop); in der fhem.cfg alle Einträge vom TeleBot entfernen - negativ; Irgend ein Prozess setzt das Konfig File wieder auf den alten Stand, sobald ich den FHEM wieder starte und die Schleife geht weiter.

Steht auch schön im Logfile:

2016.01.27 21:29:27 0: Server shutdown
2016.01.27 21:29:30 1: Including fhem.cfg
2016.01.27 21:29:31 3: telnetPort: port 7072 opened
2016.01.27 21:29:31 3: WEB: port 8083 opened
2016.01.27 21:29:31 3: WEBphone: port 8084 opened
2016.01.27 21:29:31 3: WEBtablet: port 8085 opened
2016.01.27 21:29:31 2: eventTypes: loaded 48 events from ./log/eventTypes.txt
2016.01.27 21:29:31 3: Opening CUL433 device /dev/ttyACM0
2016.01.27 21:29:32 3: Setting CUL433 serial parameters to 9600,8,N,1
2016.01.27 21:29:32 3: CUL433 device opened
2016.01.27 21:29:32 3: CUL433: Possible commands: BbCFiAZNkGMKUYRTVWXefmLltux
2016.01.27 21:29:32 1: HMLAN_Parse: HMUSB new condition disconnected
2016.01.27 21:29:32 3: Opening HMUSB device 127.0.0.1:1234
2016.01.27 21:29:32 3: HMUSB device opened
2016.01.27 21:29:32 1: HMLAN_Parse: HMUSB new condition init
2016.01.27 21:29:32 0: Server shutdown
2016.01.27 21:29:35 1: Including fhem.cfg


Wer kann mir helfen, den Wahnsinn zu stoppen?
Als letzten Notnagel habe ich ein dd der kompletten SD auf dem NAS, da will ich aber jetzt noch nicht ran.

Eine Frage noch: Wie kann man so etwas (Restart FHEM per Telegram) besser als ich lösen? Oder besser gar nicht?!?

Vielen Dank im Voraus!
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

viegener

Zitat von: PSI69 am 27 Januar 2016, 21:50:10
Super Modul - das Einrichten ging einfach, die ersten Nachrichten waren schnell geschickt. Und dann, dann kam mein Problem: Ich hätte nicht gedacht, mit dem Bot den FHEM in eine Boot-Endlosschleife zu schicken...


Aua, jetzt dachte ich durch Erwähnung in der commandref und Abfangen des Befehls alles gemacht zu haben, aber jetzt stelle ich fest, dass ich nur auf shutdown selbst überprüfe. Das muss ich wohl noch Ändern.

2 Varianten:
- In Github ist eine neue Version, die den Shutdown-Befehl abfängt - Diese kannst Du manuell über die jetzige drüberkopieren dann müsste es aufhören
- Den Perl-Prozess selbst per kill beenden und dann die Änderung an der cfg durchführen, dann sollte auch Ruhe sein. Eigentlich musst Du in der cfg auch nur das Attribut für cmdRestrictedPeer auf einen unbekannten peer setzen (nicht löschen)

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

viegener

Zitat von: Reinerlein am 27 Januar 2016, 11:39:48
Der Satz mit dem ID3v2-Tag bezog sich auf die neue Rückgabemöglichkeit bei Kommandos.
Dort wird die Rückgabe des Kommandos einer Identifikation unterzogen, um zu erkennen, ob ein Audio-Stream zurückgegeben werden soll.
Diese Erkennung funktioniert nicht, wenn die Rückgabedaten eine MP3-Datei mit ID3v2-Tag sind. Ob das oft vorkommt sei mal dahingestellt (deswegen ja auch nicht soo wichtig), aber der vollständigkeithalber sollte es noch dazu...


Ich habe mir das gerade nochmal angeschaut, ja ich habe ja MP3 bereits vorbereitet, allerdings nicht mit den ID3v2 tags. Problem ist dass diese Datein mit ID3 anfangen und das war mir zu unsicher, da dieser Text auch mal am Anfang von normalen RÜckgaben/Nachrichten auftreten kann.

Ich habe jetzt mal einiges an MP3-Files angeschaut und bei meinen Versuchen würde eine Erkennung mit folgendem regexp gehen:

$msg =~ /^ID3.\x00/

Ich habe das mal so in github eingechecked, vielleicht reicht das ja aus?

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

PSI69

Hallo Johannes,

danke für die schnelle Antwort zu später Stunde!

Und, wer lesen kann, ist wie immer im Vorteil... in der commandref ist klar die Endlosschleife erwähnt.

Ich habe das aktuelle File und spiele das dann mal ein.

Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Reinerlein

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

Maista

Hallo Reiner,

klasse mit dem PNG. Das habe ich schon lange gesucht!
Interesse halber, wo befindet sich den /tmp genau?
Im Root unter /tmp sehe ich bei mir keine PNGs.

Zitat von: Reinerlein am 23 Januar 2016, 12:57:15

Dabei bleiben aber Reste im tmp-Ordner übrig, die man irgendwann mal wegräumen könnte/müsste. Da der Plot jeweils nur eine Datei übrig lässt, bleibt das aber im Rahmen...

Grüße
Reiner

Gruß
Gerd