Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. Telegram / Edit Message [gelöst]

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Telegram / Edit Message [gelöst]

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      MarkusK last edited by MarkusK

      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,
                  }
              }
          });
      }
      
      bahnuhr Zarello 2 Replies Last reply Reply Quote 0
      • bahnuhr
        bahnuhr Forum Testing Most Active @MarkusK last edited by

        @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

        M 1 Reply Last reply Reply Quote 0
        • Zarello
          Zarello @MarkusK last edited by

          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;
          
          1 Reply Last reply Reply Quote 0
          • M
            MarkusK @bahnuhr last edited by

            @bahnuhr:

            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 statt

            var 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.

            bahnuhr 1 Reply Last reply Reply Quote 0
            • bahnuhr
              bahnuhr Forum Testing Most Active @MarkusK last edited by

              @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.

              1 Reply Last reply Reply Quote 1
              • liv-in-sky
                liv-in-sky last edited by liv-in-sky

                außer fehler die oben schon beschrieben

                ein test damit funktioniert - es darf nicht unmittelbar alles hintereinander audgeführt werden

                damit gehts - zum testen

                sendtext()
                 waiter().then(updatetext)
                //updatetext()
                
                async function sendtext() {
                
                   sendTo('telegram.0', {
                
                       text: 'Message to chat'
                
                       });
                   await wait(1000);
                   var messageid=getState("telegram.0.communicate.botSendMessageId").val;
                
                   var chatid=getState("telegram.0.communicate.botSendChatId").val;
                   await wait(2000);log("hier")
                   setState('0_userdata.0.CONTROL-OWN.AAATEST.telegram_messageid', String(messageid));
                
                   setState('0_userdata.0.CONTROL-OWN.AAATEST.telegram_chatid', String(chatid));
                
                }
                
                
                
                async function updatetext() {
                
                   let mid=getState("0_userdata.0.CONTROL-OWN.AAATEST.telegram_messageid").val
                   let mch=getState("0_userdata.0.CONTROL-OWN.AAATEST.telegram_chatid").val
                   log(mid+'  -  '+mch)
                
                
                   sendTo('telegram.0', {
                
                      text: 'New text message',
                
                       editMessageText: {
                
                           options: {
                
                               chat_id: mch,
                
                               message_id: mid,
                                
                
                           }
                
                       }
                
                   });
                
                }
                
                async function waiter(){  await wait(4000);}
                

                postit-dp (29).gif

                M 1 Reply Last reply Reply Quote 1
                • M
                  MarkusK @liv-in-sky last edited by

                  @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.

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  634
                  Online

                  31.9k
                  Users

                  80.3k
                  Topics

                  1.3m
                  Posts

                  4
                  7
                  359
                  Loading More Posts
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes
                  Reply
                  • Reply as topic
                  Log in to reply
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                  The ioBroker Community 2014-2023
                  logo