Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker 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.1k

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

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

Telegram Keyboard mit callback_data (statt QWERTZ)

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascriptcommunication
6 Beiträge 2 Kommentatoren 975 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    Mephist0
    schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
    0
    • M Offline
      M Offline
      Mephist0
      schrieb am zuletzt editiert von
      #2

      Niemand eine Idee?

      M 1 Antwort Letzte Antwort
      0
      • M Mephist0

        Niemand eine Idee?

        M Offline
        M Offline
        Malaus
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        1
        • M Offline
          M Offline
          Mephist0
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
            0
            • M Offline
              M Offline
              Mephist0
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              0
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              738

              Online

              32.4k

              Benutzer

              81.4k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe