Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Telegram Keyboard mit callback_data (statt QWERTZ)

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.0k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.7k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.0k

Telegram Keyboard mit callback_data (statt QWERTZ)

Telegram Keyboard mit callback_data (statt QWERTZ)

Scheduled Pinned Locked Moved JavaScript
javascriptcommunication
6 Posts 2 Posters 973 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Mephist0
    wrote on last edited by Mephist0
    #1

    Hallo ihr Broker und Telegrammer,

    ich habe meinem Bot das keyboard beigebracht, wie in diversen Threats beschrieben (z.B. hier https://forum.iobroker.net/topic/6138/telegram-button-script/4 ). Das funktioniert auch alles tadellos inklusive einer mehrstufigen Hierarchie.

    Bei einem Schönheitsfehler komme ich allerdings nicht weiter:
    In meinem Javascript rufe ich auf:

    sendTo('telegram.0', {
        user: benutzer,
        text: 'Menü',
        reply_markup: {
        inline_keyboard: 
            [
             [{ text: 'Wohnzimmer', callback_data: '_WZ,Wohnzimmer'}, { text: 'Bad', callback_data: '_BA,Bad'}],  
             [{ text: 'Arbeitszimmer', callback_data: '_AZ,Arbeitszimmer'}, { text: 'WC', callback_data: '_WC,WC'}], 
             [{ text: 'Schlafzimmer', callback_data: '_SZ,Schlafzimmer'}, { text: 'Flur', callback_data: '_FL,Flur'}],
            ],
            resize_keyboard:   true,
            one_time_keyboard: true
        }
    });
    

    So kommt das Ganze dann in im Telegram an:
    2020-01-11 13.28.53.png

    Aktuell werden die Buttons im Chat angezeigt. Ich hätte jedoch gerne, dass sie meine QWERTZ-Tastatur ersetzen. Wenn ich in meinem Coding das inline_keyboard ersetze durch keyboard wandern zwar meine Buttons in den Chat, jedoch verliere ich damit die Werte für das callback_data. Diese sind für mich allerdings essentiell.

    sendTo('telegram.0', {
        user: benutzer,
        text: 'Menü',
        reply_markup: {
        keyboard: //ersetzt inline_keyboard
            [
             [{ text: 'Wohnzimmer', callback_data: '_WZ,Wohnzimmer'}, { text: 'Bad', callback_data: '_BA,Bad'}],  
             [{ text: 'Arbeitszimmer', callback_data: '_AZ,Arbeitszimmer'}, { text: 'WC', callback_data: '_WC,WC'}], 
             [{ text: 'Schlafzimmer', callback_data: '_SZ,Schlafzimmer'}, { text: 'Flur', callback_data: '_FL,Flur'}],
            ],
            resize_keyboard:   true,
            one_time_keyboard: true
        }
    });
    

    So soll es aussehen. Allerdings sendet der Button z.B. "WC" und nicht "_WC,WC"
    2020-01-11 13.30.33.png

    In der Dokumentation von Telegram für den InlineKeyboardButton ist callback_data dokumentiert: https://core.telegram.org/bots/api#inlinekeyboardbutton
    Für den KeyboardButton jedoch nicht:
    https://core.telegram.org/bots/api#keyboardbutton

    Wie bekomme ich also das keyboard mit callback_data verheiratet?

    1 Reply Last reply
    0
    • M Offline
      M Offline
      Mephist0
      wrote on last edited by
      #2

      Niemand eine Idee?

      M 1 Reply Last reply
      0
      • M Mephist0

        Niemand eine Idee?

        M Offline
        M Offline
        Malaus
        wrote on last edited by
        #3

        @Mephist0

        Wie wäre es mit dieser Lösung?

        on({id: 'telegram.0.communicate.request', change: 'any'}, function (obj) {
            stateval = getState('telegram.0.communicate.request').val;              // Statevalue in Variable schreiben
            benutzer = stateval.substring(1,stateval.indexOf("]"));                 // Benutzer aus Statevalue extrahieren
            befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length);   // Befehl/Text aus Statevalue extrahieren
        
            switch (befehl) {
        
                case 'Wohnzimmer':
                Wohnzimmer ();
                break;
        
                case 'Bad':
                Bad ();
                break;
        
                default:
                console.log ("Geht nicht ");
                break;
        

        Wenn "Wohnzimmer" zurück kommt tu das..usw
        Ich führe allerdings Funktionen aus.
        Ich weiß nicht, wie du das bei dir aufgebaut hast. Also was würde den bei "_WC,WC" kommen?

        1 Reply Last reply
        1
        • M Offline
          M Offline
          Mephist0
          wrote on last edited by
          #4

          Der Hintergrund ist, dass ich eine Mehrstufige Hierarchie habe.
          Im 1. Schritt wähle ich zum Beispiel das Zimmer und im 2. Schritt die Wunschtemperatur.
          Wenn ich im 2. Schritt nur "21 Grad" zurück bekomme, weiß ich nicht mehr in welchem Zimmer das passieren soll. Mein callback_data entält dann am Ende z.B. : _WC_21. Damit weiß ich, dass ich das WC auf 21 Grad stellen soll.
          Ich könnte mir jedoch in einer State Variable speichern, welches Zimmer zuvor ausgewählt wurde. Und dann nur noch hoffen, dass nicht 2 gleichzeitige User interferieren.
          Trotzdem fände ich es charmanter und sicherer, wenn das mit Boardmitteln des Chatbots ginge.

          Bei deinem Skript rufst du zwar Wohnzimmer (); und Bad (); auf, aber auch dort musst du ja jeweils einen Listener auf den telegram request setzen.

          M 1 Reply Last reply
          0
          • M Mephist0

            Der Hintergrund ist, dass ich eine Mehrstufige Hierarchie habe.
            Im 1. Schritt wähle ich zum Beispiel das Zimmer und im 2. Schritt die Wunschtemperatur.
            Wenn ich im 2. Schritt nur "21 Grad" zurück bekomme, weiß ich nicht mehr in welchem Zimmer das passieren soll. Mein callback_data entält dann am Ende z.B. : _WC_21. Damit weiß ich, dass ich das WC auf 21 Grad stellen soll.
            Ich könnte mir jedoch in einer State Variable speichern, welches Zimmer zuvor ausgewählt wurde. Und dann nur noch hoffen, dass nicht 2 gleichzeitige User interferieren.
            Trotzdem fände ich es charmanter und sicherer, wenn das mit Boardmitteln des Chatbots ginge.

            Bei deinem Skript rufst du zwar Wohnzimmer (); und Bad (); auf, aber auch dort musst du ja jeweils einen Listener auf den telegram request setzen.

            M Offline
            M Offline
            Malaus
            wrote on last edited by Malaus
            #5

            @Mephist0 ja das hab ich ja auch. Das Skript oben, war ja nur ein Beispiel von mir

            Stell dir das Switch Case wie ein Inhaltsverzeichnis vor. Nach jeder Nachricht/Befehl wird nachgeschaut, wo es als nächstes hin muss. Und in jedem Kapitel gibt es eine Funktion, die etwas ausführt.
            Ich hab dir mal mein komplettes Skript angehängt. Da sind auch solche Untermenüs drin, wie du es beschrieben hast. Nur das ich keine extra Variable schreiben muss.

            Wie du es am Ende machst, ist dir überlassen. 🙂

            var stateval;
            var benutzer;
            var befehl;
            
            //command = 'xvfb-run -a --server-args="-screen 0, 1440x300x24" cutycapt --insecure --delay=3000 --url=';
            
            
            
            //Telegram Menü im Fenster zum anklicken. Antwort kommt als Popup
            
            on({id: 'telegram.0.communicate.request', change: 'any'}, function (obj) {
                stateval = getState('telegram.0.communicate.request').val;              // Statevalue in Variable schreiben
                benutzer = stateval.substring(1,stateval.indexOf("]"));                 // Benutzer aus Statevalue extrahieren
                befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length);   // Befehl/Text aus Statevalue extrahieren
            
                switch (befehl) {
            
                    case '/Menü':
                    Übersicht ();
                    break;
            
                    case '%Strom':
                    Strom ();
                    break;
            
                    case '%StromInfo':
                    StromInfo ();
                    break;
            
                    case '%StromDia':
                    StromDia ();
                    break;
            
                    case '%Temp':
                    Temp ();
                    break;
            
                    case '%TempInfo':
                    TempInfo ();
                    break;
            
                    case '%TempDia':
                    TempDia ();
                    break;
            
                    case '%Pflanzen':
                    Pflanzen ();
                    break;
            
                    case '%PflanzenDia':
                    PflanzenDia ();
                    break;
            
                    case '%PflanzenInfo':
                    PflanzenInfo ();
                    break;
            
                    default:
                    console.log ("Geht nicht ");
                    break;
                };
            
            
            function Übersicht () {
            sendTo('telegram', {
                        user: benutzer,
                        text: 'Welche Werte möchtest du abfragen?',
                        reply_markup: {
                            one_time_keyboard: false,
                            inline_keyboard: [
                                [{ text: 'Strom', callback_data: '%Strom'}],
                                [{ text: 'Temperatur', callback_data: '%Temp'}],
                                [{ text: 'Pflanzen', callback_data: '%Pflanzen'}],
                                ],
                            }, 
            });}
            
            // Auswahl
            function Strom () {
            sendTo('telegram', {
                        user: benutzer,
                        text: 'Mit Diagramm?',
                        reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Ja', callback_data: '%StromDia'}],
                        [{ text: 'Nein', callback_data: '%StromInfo'}],
                        [{ text: 'Zurück', callback_data: '/Menü'}],]
                        },
                })
            
            }
            
            function StromDia (){
            
            command = 'xvfb-run cutycapt --min-width=1300 --min-height=400 --delay=2500 --url=';
            
            bild_pfad = '/home/pi/screenshot/chartstrom.png';
            
            chart_url = '"http://192.168.178.141:3000/d/pMX2uwigk/strom?orgId=1&width=1440&height=300&kiosk=tv&refresh=30s/"';
            
            command_final = [command,chart_url,' --out=',bild_pfad].join('');
            
            exec(command_final);
            
            sendTo("telegram.0", "send", {
                  text: 'Aktueller Verbrauch: ' + getState(ENERGY_CURRENT).val +
                        
                         'W\nVerbrauch heute: ' + getState(ENERGY_TODAY).val +
                       
                         'kWh\nVerbrauch gestern: ' + getState(ENERGY_YESTERDAY).val +
            
                         'kWh\n\n L1: ' + getState(L1).val +
                        
                         'W\n L2: ' + getState(L2).val + 
            
                         'W\n L3: ' + getState(L3).val + "W",
            });
            
            timeout = setTimeout(function () {
                  sendTo("telegram", "send", {
                      text: bild_pfad,
                      reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Menü', callback_data: '/Menü'}],]
                        }});
                }, 6000);
            }
            
            
            function StromInfo () {
                sendTo("telegram.0", "send", {
                  text: 'Aktueller Verbrauch: ' + getState(ENERGY_CURRENT).val +
                        
                         'W\nVerbrauch heute: ' + getState(ENERGY_TODAY).val +
                       
                         'kWh\nVerbrauch gestern: ' + getState(ENERGY_YESTERDAY).val +
            
                         'kWh\n\n L1: ' + getState(L1).val +
                        
                         'W\n L2: ' + getState(L2).val + 
            
                         'W\n L3: ' + getState(L3).val + "W",
            
                        //showAlert: true,
                        reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Menü', callback_data: '/Menü'}],]
                        }
                        })
            
              };
            function Temp (){
                sendTo('telegram', {
                        user: benutzer,
                        text: 'Mit Diagramm?',
                        reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Ja', callback_data: '%TempDia'}],
                        [{ text: 'Nein', callback_data: '%TempInfo'}],
                        [{ text: 'Zurück', callback_data: '/Menü'}],]
                        },
                })
            };
            function TempDia (){
            
            command = 'xvfb-run cutycapt --min-width=1500 --min-height=800 --delay=2500 --url=';
            
            bild_pfad = '/home/pi/screenshot/charttemp.png';
              
            chart_url = "'http://192.168.178.141:3000/d/SWj-9wmgz/temperaturen?orgId=1&width=1440&height=300&kiosk=tv&refresh=30s/'";
            
            command_final = [command,chart_url,' --out=',bild_pfad].join('');
            
            exec(command_final);
            
            sendTo("telegram.0", "send", {
                  text: 'CO2: ' + getState(CO2).val +
                        
                         'ppm\n\nT Zimmer: ' + getState(TZimmer).val +
                       
                         '°C\nrF Zimmer: ' + getState(rFZimmer).val +
                        
                         '%\n\nT Bad: ' + getState(TBad).val +
                        
                         '°C\nrF Bad: ' + getState(rfBad).val + 
            
                         '%\n\nT Außen: ' + getState(TAußen).val + 
                         
                         '°C\nrF Außen: ' + getState(rFAußen).val + "%",
            });
            
            timeout = setTimeout(function () {
                  sendTo("telegram", "send", {
                      text: bild_pfad,
                      reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Menü', callback_data: '/Menü'}],]
                        }});
                }, 6000);
            }
            
            
            function TempInfo () {
                sendTo("telegram.0", "send", {
                  text: 'CO2: ' + getState(CO2).val +
                        
                         'ppm\n\nT Zimmer: ' + getState(TZimmer).val +
                       
                         '°C\nrF Zimmer: ' + getState(rFZimmer).val +
                        
                         '%\n\nT Bad: ' + getState(TBad).val +
                        
                         '°C\nrF Bad: ' + getState(rfBad).val + 
            
                         '%\n\nT Außen: ' + getState(TAußen).val + 
                         
                         '°C\nrF Außen: ' + getState(rFAußen).val + "%",
            
                        //showAlert: true,
                        reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Menü', callback_data: '/Menü'}],]
                        }
                        })
            
              };
            function Pflanzen (){
                sendTo('telegram', {
                        user: benutzer,
                        text: 'Mit Diagramm?',
                        reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Ja', callback_data: '%PflanzenDia'}],
                        [{ text: 'Nein', callback_data: '%PflanzenInfo'}],
                        [{ text: 'Zurück', callback_data: '/Menü'}],]
                        },
                })
            };
            function PflanzenDia (){
            
            command = 'xvfb-run cutycapt --min-width=1600 --min-height=1100 --delay=2500 --url=';
            
            bild_pfad = '/home/pi/screenshot/chartpflanzen.png';
              
            chart_url = "'http://192.168.178.141:3000/d/azis1_igk/pflanzen?orgId=1&width=1440&height=300&kiosk=tv&refresh=30s/'";
            
            command_final = [command,chart_url,' --out=',bild_pfad].join('');
            
            exec(command_final);
            
            sendTo("telegram.0", "send", {
                  text: 'Große Palme ' + getState(GrPalmeW).val +
                        '%\nMittlere Palme ' + getState(MitPalmeW).val + 
                        '%\nKleine Palme ' + getState(KlPalmeW).val + 
                        '%\nDrachenbaum ' + getState(DrbaumW).val + 
                        '%\nFicus ' + getState(FicusW).val + '°%',
            });
            
            timeout = setTimeout(function () {
                  sendTo("telegram", "send", {
                      text: bild_pfad,
                      reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Menü', callback_data: '/Menü'}],]
                        }});
                }, 6000);
            }
            
            
            function PflanzenInfo () {
                sendTo("telegram.0", "send", {
                  text: 'Große Palme ' + getState(GrPalmeW).val +
                        '%\nMittlere Palme ' + getState(MitPalmeW).val + 
                        '%\nKleine Palme ' + getState(KlPalmeW).val + 
                        '%\nDrachenbaum ' + getState(DrbaumW).val + 
                        '%\nFicus ' + getState(FicusW).val + '°%',
                       
            
                        //showAlert: true,
                        reply_markup: {
                        one_time_keyboard: false,
                        inline_keyboard: [
                        [{ text: 'Menü', callback_data: '/Menü'}],]
                        }
                        })
            
              };
            
            
            });
            
            1 Reply Last reply
            0
            • M Offline
              M Offline
              Mephist0
              wrote on last edited by
              #6

              Schubs mich mal bitte von dem Schlauch runter auf dem ich gerade stehe 🙂

              Du nutzt doch auch das inline_keyboard mit callback_data? Und mein Problem ist ja, dass dort die Tastatur nicht ersetzt wird, sondern die Buttons im Chat erscheinen.

              1 Reply Last reply
              0
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              Support us

              ioBroker
              Community Adapters
              Donate

              256

              Online

              32.4k

              Users

              81.3k

              Topics

              1.3m

              Posts
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              ioBroker Community 2014-2025
              logo
              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Recent
              • Tags
              • Unread 0
              • Categories
              • Unreplied
              • Popular
              • GitHub
              • Docu
              • Hilfe