NEWS
Telegram / Edit Message [gelöst]
-
Ich möchte das Klingeln an der Haustür per Telegram melden. Jedoch soll die Telegramnachricht einige Sekunden später durch ein Bild ergänzt werden. Dazu möchte ich die Edit-Möglichkeit von Telegram nutzen. Aber bereits das Updaten einer einfachen Textnachricht klapppt nicht.
Hier beispielhaft zwei Funktionen für senden und updaten. Ich möchte das ganze später erweitern mit Buttons (Tür öffnen) und dem Updates/Hinzufügen eines Fotos.
Was mache ich falsch?function sendtext() { sendTo('telegram.0', { text: 'Message to chat' }); var messageid=getState("telegram.0.communicate.botSendMessageId").val; var chatid=getState("telegram.0.communicate.requestChatId").val; setState('telegram_messageid', messageid); setState('telegram_chatid', chatid); } function updatetext() { sendTo('telegram.0', { text: 'New text message', editMessageText: { options: { chatid: getState("telegram_chatid").val, messageid: getState("telegram_messageid").val, } } }); }
-
@markusk
Ich hab nicht verstanden was du da machen willst !Es ist doch so:
- du hast irgendein trigger der erkennt, dass geklingelt wurde.
Bei mir ist es ein Homematic Taster. Und das werdest du aus und dann sendest du ein sendto zu telegram.
also so:
on({id: "hm-rpc.0.LEQ0029078.1.PRESS_SHORT", val: true, ack: true}, function() { // Klingel HM Taster sendTo('telegram.0', { user: "abc", text: "Es klingelt!", parse_mode: 'HTML' }); });
Und ein Bild senden geht so:
//Bild senden mit Telegram request.get({url: 'http://192.168.xxx.xxx:88//cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=xxx&pwd=xxx', encoding: 'binary'}, function (err, response, body) { fs.writeFile("/opt/iobroker/iobroker-data/tmp/snap.jpg", body, 'binary', function(err) { if (err) { console.error(err); } else { console.log('Snapshot sent'); sendTo('telegram.0', {text: '/opt/iobroker/iobroker-data/tmp/snap.jpg', caption: 'Haustür: Es klingelt.'}); } }); });
Und natürlich musst du die url angleichen.
mfg
- du hast irgendein trigger der erkennt, dass geklingelt wurde.
-
Kann es sein, dass die Funktion sendTo asynchron ist? Damit würden direkt nach dem sendTo noch die falschen Werte in den beiden getState abgefragt werden. Ich bin mir aber nicht sicher und habe gerade keine Möglichkeit das zu testen.
@markusk sagte in Telegram / Edit Message:
function sendtext() { sendTo('telegram.0', { text: 'Message to chat' }); var messageid=getState("telegram.0.communicate.botSendMessageId").val; var chatid=getState("telegram.0.communicate.requestChatId").val;
-
Also zum Ersten habe ich bereits einen Fehler gefunden. In den options muss chat_id und message_id mit Unterstrich geschrieben werden:
options: { chat_id: xxxx, message_id: yyy,
Dann hat es zumindest einmal die nachträgliche Änderung funktioniert. Allerdings nur einmal. Irgendwie kommen da die ID's durcheinander.
Ich habe auch stattvar messageid=getState("telegram.0.communicate.botSendMessageId").val;
diese ID verwendet:
var messageid=getState("telegram.0.communicate.requestMessageId").val;
Das sendto ist asycron, allerdings scheint es schnell genug zu sein, um danach die aktuellen ID's zu liefern. Ich Logge die ID's und diese stehen auch einige Zeit nach dem Senden der ersten Nachricht so in den Datenpunkte drin.
Also grundsätzlich würde ich gerne mit dem Klingeln sofort eine Message an Telegram senden. Das funktioniert. Schön wäre es, wenn ich dort einen Button habe, um die Tür zu öffnen. Das funktioniert auch mittels:
sendTo('telegram.0', { text: 'Press button', reply_markup: { keyboard: [ ['Line 1, Button 1', 'Line 1, Button 2'], ['Line 2, Button 3', 'Line 2, Button 4'] ], resize_keyboard: true, one_time_keyboard: true } });
Ich würde auch ein Foto, ggf. Video senden, was grundsätzlich auch in der einfachen Form ebenfalls funktioniert:
sendTo('telegram.0', { text: '/var/www/html/x.jpg', caption: 'Snapshot', disable_notification: false });
Ich möchte gerne das Foto nachträglich, also in der ursprünglichen Klingel-Message, mit einem Button zum Öffnen unterbringen. Es soll also keine zweite Message mit dem Foto gesendet werden, sondern ein Update der Klingel-Nachricht gemacht werden.
Das Foto kann ich nicht sofort übermitteln, da ich gerne dazu eine Blink-Kamera (Tochterfirma von Amazon) nutze und das Triggern eines Foto asyncron abläuft. D.h. ich muss mindestens 5 sec. warten, bis ich das Foto in der Cloud abrufen kann. In der Zwischenzeit soll aber bereits die Klingel-Message mit dem Tür-Öffnen-Button (ggf. mit Placeholder-Foto) versendet worden sein. Ich befürchte aber, dass die Telegram API gar nicht alles unterstützt und ich ggf. doch auf eine zweite Nachricht zurückgreifen muss,Hintergrund:
Das ganze System habe ich bereits in ähnlicher Form am Laufen, soll aber durch eine andere und bessere Lösung ersetzt werden. Statt Telegram verwende ich momentan Email, Foto kann ich gleich mitliefern, da ich es bei einem alten Kamerasystem per wget holen kann. Tür öffnen mache ich noch per Relais an einem Arduino, soll aber durch Nuki ersetzt werden. -
@markusk sagte in Telegram / Edit Message:
Ich möchte gerne das Foto nachträglich, also in der ursprünglichen Klingel-Message, mit einem Button zum Öffnen unterbringen. Es soll also keine zweite Message mit dem Foto gesendet werden, sondern ein Update der Klingel-Nachricht gemacht werden.
Warum ?
Dann warte doch einfach 5 Sek. und sende dann das Bild mit der caption ist hat geklingelt.
Siehe Script oben.Warum schwierig ! wenn es auch einfach geht.
-
außer fehler die oben schon beschrieben
ein test damit funktioniert - es darf nicht unmittelbar alles hintereinander audgeführt werden
damit gehts - zum testen
-
@liv-in-sky
Super. Danke. So klappt es. Hatte zwar auch auf ein Timing Problem getippt, aber war mir durch das Loggen der ID's recht sicher, dass die ID's schon geändert waren.