NEWS
Telegram Button Script
-
Moin,
ich möchte hier mal eine kurze Anleitung zu Telegram und Buttons geben. Falls man das Script verkürzen kann oder zusammenfassen kann könnt ihr ja gerne schreiben. Ich hab es ja leider nicht so mit dem Programmieren. :lol:
Was wird benötigt?
ioBroker mit Text to command Adapter und den Telegram Adapter.
Ich gehe mal davon aus das das alles schon läuft.
Ich trigger den ersten Button befehl per Text to command mit:
Schalte irgendwas an oder aus | Übersicht (Das ist Aktivierungswort für die Buttons) | Haken setzen | script auswählen was wir gleich erstellen | true | Antwort leer lassen
Zum Script (Beispiel Script):
sendTo('telegram.0', { text: 'Bitte wähle ein Button', reply_markup: { keyboard: [ ['Zeit', 'Temperaturabfrage'], ], resize_keyboard: true, one_time_keyboard: true } });
Text wird dann beim Aktivieren im Telegram angezeigt.
Zeit und Temperaturabfrage sind triggerwörter für Text to Command.
Zeit ist kein Script sondern ein Text to Command befehl der die Zeit wiedergibt.
Temperaturabfrage ist ein weiteres Script mit Buttons.
Dazu erstellen wir mit Text to Command
Schalte irgendwas an oder aus | Temperaturabfrage | Haken setzen | script auswählen was wir gleich erstellen | true | Antwort leer lassen
Script:
sendTo('telegram.0', { text: 'Wähle ein Zimmer', reply_markup: { keyboard: [ ['Temperatur Küche', 'Temperatur Wohnzimmer', 'Temperatur Schlafzimmer'], ['Übersicht'] ], resize_keyboard: true, one_time_keyboard: true } });
Nun habe ich oben 3 Buttons mit 3 Triggerwörtern und unten ein Button womit ich zurück auf die Übersicht komme.
Übersicht haben wir ja schon erstellt.
Ich habe in 3 Räumen HM Heizkörperaktoren die ich mit Text to Command nun abfrage und zwar die Temperatur mit den oben im Script geschriebenen Triggerwörtern.
Ich hoffe das es verständlich genug beschrieben ist. Ansonsten einfach melden.
Hier noch ein paar Bilder.
2343_telegram.png
2343_ttc.png -
Ich grabe das noch mal aus. Ich kriege es nicht gebacken ? Wenn ich die Scripte manuell auslöse erscheinen im Bot brav die Button. Aber wenn ich diese Button betätige passiert nichts ? Bzw. auch anders herum, wie löse ich am Handy die Abfrage (Button) aus ?
Ich habe Deine Scripte mal 1 zu 1 kopiert und auch die im Screenshot gezeigten Dinge 1 zu 1 bei mir eingestellt.
(allerdings teste ich es mit einer Abfrage wie der Status meines Fernsehers ist–-, also an oder aus)
Irgendwas mache ich wohl falsch ?
LG Heiko
Edit: ich habe es hin bekommen und jetzt auch verstanden. Danke für die Anleitung.
-
Text 2 command braucht man eigentlich nicht. Man kann auch Direkt im Script auf die Telegram Nachrichten reagieren.
Habe sowas auch gemacht: http://forum.iobroker.net/viewtopic.php?p=78219#p78219
Wenn ich in Telegram schreibe "Wie ist die Temperatur im Wohnzimmer" kriege ich die Antwort … "Temperatur im Wohnzimmer beträgt x °C"..
Wenn ich schreibe "Wie warm ist es im Kellerloch"? Kriege ich eine Auswahl mit den Verfügbaren Zimmern, weil es das Zimmer "Kellerloch" im Skript nicht gibt.
Ist eventuell auch für den ein oder anderen interessant.
Gruß
-
Hallo Zusammen,
ich greife das Thema hier noch mal auf da ich aktuell eine Frage dazu habe.
Soweit funktioniert alles mit Telegram und den Button. Aber es gibt doch bestimmt eine
Möglichkeit die 3 Werte (oder auch noch mehr) mit einem Button abzufragen.
Im Moment sieht es noch so aus:
Ich habe es schon selber versucht, aber irgendwie fehlt da noch was oder ist falsch.
Ich habe auch keine Ahnung wie ich das Script in Text to Command platzieren soll.
Ich bin mir auch nicht sicher ob das in Zeile 4 alles stimmt da ich es aus einem bestehenden
Script hier aus dem Forum für mich abgeändert habe.
Vielleicht kann mir einer von den Spezialisten unter die Arme greifen und mein Script "reparieren"
oder falls es völliger Mühl ist, eine andere Lösung vorschlagen/machen.
Für eure Mühe vielen Dank im voraus.
Gruss
Paulchen
-
was hälst Du von dieser Variante ?
(ich bin gerade unterwegs, Script habe ich jetzt nicht zur Hand)
![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201802 ... b60c51.jpg">https://uploads.tapatalk-cdn.com/20180209/9e84620c88ab8e462f7763b2c4b60c51.jpg</link_text>" />![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201802 ... c90d18.jpg">https://uploads.tapatalk-cdn.com/20180209/f1a149fd7ed615204f9e9f60a0c90d18.jpg</link_text>" />~~~~ -
Sieht gut aus.
Am liebsten wäre mir ein Button (z.B. Name Status) wenn ich den drücke
sollen alle Zustände/Temperaturen usw. die mir wichtig sind, untereinander
erscheinen wie bei Dir in deinem Fenster.
Muss nicht sein, dass es nach Räumen unterteilt ist.
Ich möchte nur die mir wichtigsten unter Status zusammenfassen aber auch
die Möglichkeit haben mal einen im Script hinzuzufügen oder rauszunehmen.
Falls ich ein bestehendes für mich umschreiben müsste, sollte es für mich als
fortgeschrittener Anfänger machbar sein und ich würde auch gerne verstehen
was da passiert.
Gruss
Paulchen
-
beim zweiten Bild werden ja alle angezeigt.
Nur sind bei meiner Variante die auf einmal anzeigbaren Werte begrenzt. Ich nutze das gleiche Script zum Abfragen der Batteriezustände, also wieviel Volt die Geräte noch haben. Wenn das Ergebnisfenster eine bestimmte Größe/Länge erreicht hatte kam eine Fehlermeldung im Log. Sinngemäß "zu lang, oder zu groß"
(ich wollte dort auch alle Geräte auf einmal anzeigen, sind aber fast 50 Geräte, das ging dann nicht)
-
deshalb bei mir der Weg über Räume..
![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201802 ... 76c74f.jpg">https://uploads.tapatalk-cdn.com/20180209/e4c1c31a04d7e6c37f26b92faa76c74f.jpg</link_text>" />![](</s><URL url=)<link_text text="https://uploads.tapatalk-cdn.com/201802 ... ca52d8.jpg">https://uploads.tapatalk-cdn.com/20180209/e42e1545840d1d619c2c3296e0ca52d8.jpg</link_text>" />~~~~ -
So viele werden es bei mir nicht. Sind zwar mitlerweile auch 52 Geräte,
aber ich will wie gesagt nur die mir wichtigsten angezeigt bekommen.
6 Systemvariablen
3 Temperaturen und Luftfeuchte
1 Terrassentür
und dann noch 4-5 Zustände von Aktoren.
-
ach ja, hier steht das Script schon…
-
Oh Ha, das ist aber ein ordentliches Script.
Da werde ich beim umschreiben sicherlich Hilfe benötigen.
-
sieht nur so viel aus (durch die Menge der Geräte)
Wenn Du es in Ruhe auf dem PC anschaust wirst Du das sehen.
Ist eigentlich nicht viel drann.
Der obere Teil sind die Button und danach kommen die abzufragenden Geräte.
-
OK.
Hab mir das Script mal näher angesehen.
Bis auf eine Zeile (Zeile 5) und in Teilen Zeile 3 und 4, ist mir alles klar und ich weiß
wie ich es umschreiben muss.
Zeile 5
if (befehl.search(/(?=.*(\bBATTERIE\b|\bVOLL\b|\bLEER\b|\bVOLT\b)).+/ig) != -1)
Ich vermute das da ein Zusammenhang besteht mit Zeile 4.
Was in Zeile 3 und 4 passiert ist mir auch nicht ganz klar und ob ich da was für mich
umschreiben muss.
var benutzer = stateval.substring(1,stateval.indexOf("]"));
var befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length);
Wenn ich das Script umgeschrieben habe rufe ich es über Text to Command auf indem
ich einen Button (z.B. Status) damit belege, oder?
Gruß
Paulchen
Edit:
Hab es jetzt mal für mich umgeschrieben bis auf besagte Zeile 5.
Läuft aber so noch nicht.
id: 'telegram.0.communicate.request', change: 'any'}, function (obj) { var stateval = getState('telegram.0.communicate.request').val; // Statevalue in Variable schreiben var benutzer = stateval.substring(1,stateval.indexOf("]")); // Benutzer aus Statevalue extrahieren var befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length); // Befehl/Text aus Statevalue extrahieren if (befehl.search(/(?=.*(\bBATTERIE\b|\bVOLL\b|\bLEER\b|\bVOLT\b)).+/ig) != -1) { sendTo('telegram', { user: benutzer, text: 'Für welchen Raum möchtest du den Status abfragen?', reply_markup: { inline_keyboard: [ // [{ text: 'alle Räume', callback_data: '%Status'}], [{ text: 'Wohnzimmer', callback_data: '%StatusWohnzimmer'}], [{ text: 'Flur', callback_data: '%StatusFlur'}], [{ text: 'Keller', callback_data: '%StatusKeller'}], [{ text: 'Terrasse', callback_data: '%StatusTerrasse'}], [{ text: 'Garten', callback_data: '%StatusGarten'}], ] } }); } // Auswahl alle Räume oder einzeln.Alle Räume ist für Telegramm zu lang = Fehler im log /* else if (befehl === "%Status") { sendTo('telegram', { user: benutzer, text: "Alle Räume Status angefragt", answerCallbackQuery: { text: '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val , showAlert: true } }); }*/ else if (befehl === "%StatusWohnzimmer") { sendTo('telegram', { user: benutzer, text: "Wohnzimmer Status angefragt", answerCallbackQuery: { text: 'Schranklicht ' + getState("hm-rpc.0.GEQ0209223.1.STATE").val + ' %\nWohnzimmerlicht ' + getState("hm-rpc.0.NEQ0257178.1.LEVEL").val + ' %\nEsszimmerlicht ' + getState("hm-rpc.0.JEQ0202637.1.LEVEL").val + '\nSteckdose Laptop ' + getState("hm-rpc.0.MEQ1435110.1.STATE").val + '\nSteckdose Tablet ' + getState("hm-rpc.0.GEQ0209632.1.STATE").val + '\nTerrassentür ' + getState("hm-rpc.0.MEQ0179152.1.STATE").val , showAlert: true } }); } else if (befehl === "%StatusFlur") { sendTo('telegram', { user: benutzer, text: "Flur Status angefragt", answerCallbackQuery: { text: 'Repeater ' + getState("hm-rpc.0.HEQ0102360.2.STATE").val + '\nAndriod laden ' + getState("hm-rpc.0.HEQ0102360.1.STATE").val + '\nFlurlicht ' + getState("hm-rpc.0.JEQ0097197.1.STATE").val + '\nNachtlicht ' + getState("hm-rpc.0.OEQ0174232.1.STATE").val + '\nHaustürCam ' + getState("hm-rpc.0.HEQ0175625.1.STATE").val , showAlert: true } }); } else if (befehl === "%Status Keller") { sendTo('telegram', { user: benutzer, text: "Keller Status angefragt", answerCallbackQuery: { text: 'Kellerfenster Links ' + getState("hm-rpc.0.LEQ1175462.1.STATE").val + '\nKellerfenster Rechts ' + getState("hm-rpc.0.LEQ1175621.1.STATE").val + '\nLuftentfeuchter ' + getState("hm-rpc.0.GEQ0209623.1.STATE").val + '\nSteckdose KellerCam ' + getState("hm-rpc.0.HEQ0102493.2.STATE").val + '\nRPi ioBroker ' + getState("hm-rpc.0.MEQ1565039.1.STATE").val + '\nRPi Nextcloud ' + getState("hm-rpc.0.MEQ1561418.1.STATE").val , showAlert: true } }); } else if (befehl === "%StatusTerrasse") { sendTo('telegram', { user: benutzer, text: "Terrasse Status angefragt", answerCallbackQuery: { text: 'Markisse ' + getState("hm-rpc.0.NEQ1320295.1.LEVEL").val + ' %\nÜberdachung ' + getState("hm-rpc.0.MEQ1008372.1.STATE").val + '\nFrei ' + getState("hm-rpc.0.MEQ1008372.2.STATE").val + '\nTerrassenbeleuchtung ' + getState("hm-rpc.0.GEQ0209667.1.STATE").val , showAlert: true } }); } else if (befehl === "%StatusGarten") { sendTo('telegram', { user: benutzer, text: "Garten Status angefragt", answerCallbackQuery: { text: 'Gartenlicht ' + getState().val + ' %\nGartenhaus ' + getState("hm-rpc.0.LEQ0771728.1.STATE").val + '\nGartenhauslicht ' + getState("hm-rpc.0.OEQ0818221.1.STATE").val + '\nBW-Melder ' + getState("hm-rpc.0.LEQ1278626.1.MOTION").val + '\nLichtwert ' + getState("hm-rpc.0.LEQ1278626.1.BRIGHTNESS").val + 'Lux ' , showAlert: true } }); }
-
OK.
Hab mir das Script mal näher angesehen.
Bis auf eine Zeile (Zeile 5) und in Teilen Zeile 3 und 4, ist mir alles klar und ich weiß
wie ich es umschreiben muss.
Zeile 5
if (befehl.search(/(?=.*(\bBATTERIE\b|\bVOLL\b|\bLEER\b|\bVOLT\b)).+/ig) != -1)
Ich vermute das da ein Zusammenhang besteht mit Zeile 4.
Was in Zeile 3 und 4 passiert ist mir auch nicht ganz klar und ob ich da was für mich
umschreiben muss.
var benutzer = stateval.substring(1,stateval.indexOf("]"));
var befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length);
Wenn ich das Script umgeschrieben habe rufe ich es über Text to Command auf indem
ich einen Button (z.B. Status) damit belege, oder?
Gruß
Paulchen
Edit:
Hab es jetzt mal für mich umgeschrieben bis auf besagte Zeile 5.
Läuft aber so noch nicht.
id: 'telegram.0.communicate.request', change: 'any'}, function (obj) { var stateval = getState('telegram.0.communicate.request').val; // Statevalue in Variable schreiben var benutzer = stateval.substring(1,stateval.indexOf("]")); // Benutzer aus Statevalue extrahieren var befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length); // Befehl/Text aus Statevalue extrahieren if (befehl.search(/(?=.*(\bBATTERIE\b|\bVOLL\b|\bLEER\b|\bVOLT\b)).+/ig) != -1) { sendTo('telegram', { user: benutzer, text: 'Für welchen Raum möchtest du den Status abfragen?', reply_markup: { inline_keyboard: [ // [{ text: 'alle Räume', callback_data: '%Status'}], [{ text: 'Wohnzimmer', callback_data: '%StatusWohnzimmer'}], [{ text: 'Flur', callback_data: '%StatusFlur'}], [{ text: 'Keller', callback_data: '%StatusKeller'}], [{ text: 'Terrasse', callback_data: '%StatusTerrasse'}], [{ text: 'Garten', callback_data: '%StatusGarten'}], ] } }); } // Auswahl alle Räume oder einzeln.Alle Räume ist für Telegramm zu lang = Fehler im log /* else if (befehl === "%Status") { sendTo('telegram', { user: benutzer, text: "Alle Räume Status angefragt", answerCallbackQuery: { text: '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val + '\nXXX ' + getState().val , showAlert: true } }); }*/ else if (befehl === "%StatusWohnzimmer") { sendTo('telegram', { user: benutzer, text: "Wohnzimmer Status angefragt", answerCallbackQuery: { text: 'Schranklicht ' + getState("hm-rpc.0.GEQ0209223.1.STATE").val + ' %\nWohnzimmerlicht ' + getState("hm-rpc.0.NEQ0257178.1.LEVEL").val + ' %\nEsszimmerlicht ' + getState("hm-rpc.0.JEQ0202637.1.LEVEL").val + '\nSteckdose Laptop ' + getState("hm-rpc.0.MEQ1435110.1.STATE").val + '\nSteckdose Tablet ' + getState("hm-rpc.0.GEQ0209632.1.STATE").val + '\nTerrassentür ' + getState("hm-rpc.0.MEQ0179152.1.STATE").val , showAlert: true } }); } else if (befehl === "%StatusFlur") { sendTo('telegram', { user: benutzer, text: "Flur Status angefragt", answerCallbackQuery: { text: 'Repeater ' + getState("hm-rpc.0.HEQ0102360.2.STATE").val + '\nAndriod laden ' + getState("hm-rpc.0.HEQ0102360.1.STATE").val + '\nFlurlicht ' + getState("hm-rpc.0.JEQ0097197.1.STATE").val + '\nNachtlicht ' + getState("hm-rpc.0.OEQ0174232.1.STATE").val + '\nHaustürCam ' + getState("hm-rpc.0.HEQ0175625.1.STATE").val , showAlert: true } }); } else if (befehl === "%Status Keller") { sendTo('telegram', { user: benutzer, text: "Keller Status angefragt", answerCallbackQuery: { text: 'Kellerfenster Links ' + getState("hm-rpc.0.LEQ1175462.1.STATE").val + '\nKellerfenster Rechts ' + getState("hm-rpc.0.LEQ1175621.1.STATE").val + '\nLuftentfeuchter ' + getState("hm-rpc.0.GEQ0209623.1.STATE").val + '\nSteckdose KellerCam ' + getState("hm-rpc.0.HEQ0102493.2.STATE").val + '\nRPi ioBroker ' + getState("hm-rpc.0.MEQ1565039.1.STATE").val + '\nRPi Nextcloud ' + getState("hm-rpc.0.MEQ1561418.1.STATE").val , showAlert: true } }); } else if (befehl === "%StatusTerrasse") { sendTo('telegram', { user: benutzer, text: "Terrasse Status angefragt", answerCallbackQuery: { text: 'Markisse ' + getState("hm-rpc.0.NEQ1320295.1.LEVEL").val + ' %\nÜberdachung ' + getState("hm-rpc.0.MEQ1008372.1.STATE").val + '\nFrei ' + getState("hm-rpc.0.MEQ1008372.2.STATE").val + '\nTerrassenbeleuchtung ' + getState("hm-rpc.0.GEQ0209667.1.STATE").val , showAlert: true } }); } else if (befehl === "%StatusGarten") { sendTo('telegram', { user: benutzer, text: "Garten Status angefragt", answerCallbackQuery: { text: 'Gartenlicht ' + getState().val + ' %\nGartenhaus ' + getState("hm-rpc.0.LEQ0771728.1.STATE").val + '\nGartenhauslicht ' + getState("hm-rpc.0.OEQ0818221.1.STATE").val + '\nBW-Melder ' + getState("hm-rpc.0.LEQ1278626.1.MOTION").val + '\nLichtwert ' + getState("hm-rpc.0.LEQ1278626.1.BRIGHTNESS").val + 'Lux ' , showAlert: true } }); } ```` `
In Zeile 5 stehen lediglich "Schlagworte" für Telegram, womit Du die Funktion in Telegram aufrufen kannst. Die kannst Du nach Deinen wünschen anpassen. Also für meine Batterieabfrage nutze ich halt die Begriffe voll/leer/ oder volt (einer würde auch reichen).
Für Temperaturabfragen habe ich sowas wie warm oder kalt (halt möglichst kurz, damit ich in Telegramm nicht erst soviel eintippen muss)
Text to Command brauchst Du hier gar nicht. Das macht genau diese Zeile 5.
Also einfach die oder das Schlagwort bei Telegram eintippen und das Script ruft die Button auf.
PS: irgendwie fehlt bei Dir aber auch ganz am Anfang das on… (bei id)
PPS: wenn Du das von mir verlinkte Script 1:1 übernimmst und bei Dir einfügst und startest und dann in Deinem Telegram Bot die Begriffe wie voll/leer/volt usw. eintippst und absendest sollten schon mal alle Button da sein (die Du ja verändern kannst im Script). Abfragen kannst Du dann natürlich mit den angezeigten Buttons noch nichts, dafür musst Du Deine Geräte im Script hinterlegen/umschreiben.
-
So, funktioniert ohne Probleme.
Danke, für deine Unterstützung.
Jetzt würde mich noch interessieren, ob man das Aufklappen der
Tastatur unterdrücken kann wenn ich durch das Schlüsselwort das
Script aufrufe.
Gruß
Paulchen
-
das mit der Tastatur weiß ich leider nicht…
-
Es ist möglich eine gesendete Message zu editieren und damit beispielsweise die Tastatur zu entfernen. (es gibt ein zeitliches Limit)
Dafür benötigst du die message ID der Meldung. Im Github gibt es einen Pull request der zwei neue Datenpunkte hinzufügt, welche die chat ID und message ID der zuletzt gesendeten Meldung enthält.
Bis dahin kannst du auch die message ID der letzten empfangenen Meldung nehmen und eins dazu addieren. Solange du nicht mehrere Nutzer hast funktioniert das.
-
Ist es auch möglich den button im telegram zu bekommen ohne etwas eingeben zu müssen am anfang?
Also direkt bei öffnen des bot channels.
-
Hallo,
Ich brauche mal wieder eure Hilfe da ich leider noch gar keinen Plan von Scripten habe.
Ich möchte gerne im Telegramm Unterpunkte haben, sodass ich zb. Erst auf LED drücken muss und dann die Farben auswählen kann.
Bis jetzt sieht es so aus:
sendTo('telegram.0', {
text: 'Bitte wähle ein Button',
reply_markup: {
keyboard: [
['Wohnwand An', 'Wohnwand Aus'],
['Arbeitszimmerlicht An', 'Arbeitszimmerlicht Aus'],
['LED An', 'LED Aus'],
['LED Blau'],
['LED Rot'],
['LED Grün'],
['LED Gelb'],
['LED Weiß'],
],
resize_keyboard: true,
one_time_keyboard: true
}
});
Vielen Dank im Vorraus
Jan
-
Das geht doch relativ einfach.
Einfach ein Unter Script erstellen in dem du dann die Farben ändern kannst.
Dann kannst du das Script z.B Farben nennen und auf Farben einen Trigger setzen.
Es macht wahrscheinlich sinn die Farbwahl neben An/Aus zu platzieren.