NEWS
Pushover + Command = Telegram
-
Und schon wieder ich.
Wie werden Push-Nachrichten mit Umlauten und Sonderzeichen beim ioBroker konvertiert?
Ich habe mir dafür auf der CCU2 ein eigenes WebUI-Skript erstellt, dass die UTF-8-Konvertierung folgendermaßen durchführt:
!
! +++++ Umwandlung von Sonderzeichen gem. UTF-8 +++++ foreach(message_index, message.Split("%")){message_tmp = message_tmp + message_index + "%25";} if(message.Substr(message.Length()-1, message.Length()-1) != "%"){message = message_tmp.Substr(0, message_tmp.Length()-3);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split(" ")){message_tmp = message_tmp + message_index + "%20";}; if(message.Substr(message.Length()-1, message.Length()-1) != " "){message = message_tmp.Substr(0, message_tmp.Length()-3);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("Ä")){message_tmp = message_tmp + message_index + "%C3%84";} if(message.Substr(message.Length()-1, message.Length()-1) != "Ä"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("Ö")){message_tmp = message_tmp + message_index + "%C3%96";} if(message.Substr(message.Length()-1, message.Length()-1) != "Ö"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("Ü")){message_tmp = message_tmp + message_index + "%C3%9C";} if(message.Substr(message.Length()-1, message.Length()-1) != "Ü"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ä")){message_tmp = message_tmp + message_index + "%C3%A4";} if(message.Substr(message.Length()-1, message.Length()-1) != "ä"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ö")){message_tmp = message_tmp + message_index + "%C3%B6";} if(message.Substr(message.Length()-1, message.Length()-1) != "ö"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ü")){message_tmp = message_tmp + message_index + "%C3%BC";} if(message.Substr(message.Length()-1, message.Length()-1) != "ü"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ß")){message_tmp = message_tmp + message_index + "%C3%9F";} if(message.Substr(message.Length()-1, message.Length()-1) != "ß"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("°")){message_tmp = message_tmp + message_index + "%C2%B0";} if(message.Substr(message.Length()-1, message.Length()-1) != "°"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("²")){message_tmp = message_tmp + message_index + "%C2%B2";} if(message.Substr(message.Length()-1, message.Length()-1) != "²"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("³")){message_tmp = message_tmp + message_index + "%C2%B3";} if(message.Substr(message.Length()-1, message.Length()-1) != "³"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; !
Näheres dazu findet sich http://homematic-forum.de/forum/viewtopic.php?f=31&t=26282.
Damit erhalte ich dann z.B. ein Mal in der Woche die folgende Push-Nachricht per Telegram:
filename="2016-07-26_11h22_30.png" index="1">~~
Wenn ich mir nun aber den Inhalt der entsprechenden CCU2-Systemvariablen für den Gasverbrauch mit dem Telegram-Adapter für ioBroker hole, dann sieht das Resultat etwas anders aus:
filename="2016-07-26_11h22_48.png" index="0">~~
Wie man sieht, werden insb. "%0A" für den Zeilenumbruch und "%B3" für die Kubikmeter nicht umgewandelt. Wäre schön, wenn das noch implementiert werden könnte.
Gruß,
Thorsten
-
@dtp:Und schon wieder ich.
Wie werden Push-Nachrichten mit Umlauten und Sonderzeichen beim ioBroker konvertiert?
Ich habe mir dafür auf der CCU2 ein eigenes WebUI-Skript erstellt, dass die UTF-8-Konvertierung folgendermaßen durchführt:
!
! +++++ Umwandlung von Sonderzeichen gem. UTF-8 +++++ foreach(message_index, message.Split("%")){message_tmp = message_tmp + message_index + "%25";} if(message.Substr(message.Length()-1, message.Length()-1) != "%"){message = message_tmp.Substr(0, message_tmp.Length()-3);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split(" ")){message_tmp = message_tmp + message_index + "%20";}; if(message.Substr(message.Length()-1, message.Length()-1) != " "){message = message_tmp.Substr(0, message_tmp.Length()-3);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("Ä")){message_tmp = message_tmp + message_index + "%C3%84";} if(message.Substr(message.Length()-1, message.Length()-1) != "Ä"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("Ö")){message_tmp = message_tmp + message_index + "%C3%96";} if(message.Substr(message.Length()-1, message.Length()-1) != "Ö"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("Ü")){message_tmp = message_tmp + message_index + "%C3%9C";} if(message.Substr(message.Length()-1, message.Length()-1) != "Ü"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ä")){message_tmp = message_tmp + message_index + "%C3%A4";} if(message.Substr(message.Length()-1, message.Length()-1) != "ä"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ö")){message_tmp = message_tmp + message_index + "%C3%B6";} if(message.Substr(message.Length()-1, message.Length()-1) != "ö"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ü")){message_tmp = message_tmp + message_index + "%C3%BC";} if(message.Substr(message.Length()-1, message.Length()-1) != "ü"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("ß")){message_tmp = message_tmp + message_index + "%C3%9F";} if(message.Substr(message.Length()-1, message.Length()-1) != "ß"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("°")){message_tmp = message_tmp + message_index + "%C2%B0";} if(message.Substr(message.Length()-1, message.Length()-1) != "°"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("²")){message_tmp = message_tmp + message_index + "%C2%B2";} if(message.Substr(message.Length()-1, message.Length()-1) != "²"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; foreach(message_index, message.Split("³")){message_tmp = message_tmp + message_index + "%C2%B3";} if(message.Substr(message.Length()-1, message.Length()-1) != "³"){message = message_tmp.Substr(0, message_tmp.Length()-6);} else{message = message_tmp;} message_tmp = ""; !
Näheres dazu findet sich http://homematic-forum.de/forum/viewtopic.php?f=31&t=26282.
Damit erhalte ich dann z.B. ein Mal in der Woche die folgende Push-Nachricht per Telegram:
filename="2016-07-26_11h22_30.png" index="1">~~
Wenn ich mir nun aber den Inhalt der entsprechenden CCU2-Systemvariablen für den Gasverbrauch mit dem Telegram-Adapter für ioBroker hole, dann sieht das Resultat etwas anders aus:
filename="2016-07-26_11h22_48.png" index="0">~~
Wie man sieht, werden insb. "%0A" für den Zeilenumbruch und "%B3" für die Kubikmeter nicht umgewandelt. Wäre schön, wenn das noch implementiert werden könnte.
Gruß,
Thorsten `
Also Kode:sendTo('telegram', 'test\ntest1 ㎥');
geht nicht?
-
Hallo Bluefox,
Telegram 0.4.1 funktioniert nun soweit schon mal sehr gut bei mir. Hätte da aber noch ein paar Wünsche:
1. Gäbe es eine Möglichkeit, Javaskripte und den text2command-Adapter parallel zu nutzen? Im Grunde genommen funktioniert das ja bereits, aber wenn ich einen im Skript definierten Befehl aufrufe, der logischerweise im text2command-Adapter nicht definiert ist, dann meldet mir text2command jedes Mal "Ich verstehe … nicht". Besser wäre es, wenn zunächst das mit dem Telegram-Adpater verknüpfte Javaskript nach dem Befehl durchsucht wird, und erst, wenn dieser Befehl auch im text2command-Adapter nicht bekannt ist, eine entsprechende Meldung kommt. Sprich, ein vorhandenes Javaskript hat immer Vorrang vor dem text2command-Adapter.
2. Über
sendTo('telegram.0', { text: '/tmp/snap.jpg', caption: 'Snapshot', disable_notification: true });
kann man ja bereits sehr viele Reaktionen steuern. Dabei wird bereits automatisch je nach Inhalt von "text" zwischen Photo, Video, Audio, Dokument, Sticker, Aktion und Ort unterschieden. Was aber wohl im Moment noch nicht geht, sind https://core.telegram.org/bots/api/#replykeyboardmarkup. Wie wär's daher mit folgender Ergänzung?
sendTo('telegram.0', { keybaord: [[Taste 1],[Taste 2],[Taste 3]], resize_keyboard: true, one_time_keyboard: true, selective: no });
Oder habe ich da was übersehen und das geht schon?
3. Die Meldungen "Restarting" und "Restarted" des Telegram-Adapters beim Neustart von ioBroker finde ich etwas wenig aussagend, wenn man in Chats arbeitet. Würde es daher besser finden, wenn man das auf "ioBroker restartung" und "ioBroker restarted" präzisieren könnte. Noch schöner fände ich eine zusätzliche deutsche Version "ioBroker startet neu." und "ioBroker neu gestartet.".
4. Selbst, wenn man mit einer ChatID arbeitet, so kann man Befehle an den ioBroker nicht aus dem Chat heraus absenden. Das funktioniert aktuell nur für den Empfang von Nachrichten. Ein Senden von Befehlen geht dagegen immer nur aus dem jeweiligen Bot heraus. Könnte man ggf. auch eine Option einfügen, die ChatID für den Empfang von Befehlen durch den ioBroker abzufragen?
5. Schließlich fände ich es noch schön, wenn man auch für den text2command-Adapter eine ChatID angeben könnte.
Gruß,
Thorsten
-
@dtp:Hallo Bluefox,
Telegram 0.4.1 funktioniert nun soweit schon mal sehr gut bei mir. Hätte da aber noch ein paar Wünsche:
1. Gäbe es eine Möglichkeit, Javaskripte und den text2command-Adapter parallel zu nutzen? Im Grunde genommen funktioniert das ja bereits, aber wenn ich einen im Skript definierten Befehl aufrufe, der logischerweise im text2command-Adapter nicht definiert ist, dann meldet mir text2command jedes Mal "Ich verstehe … nicht". Besser wäre es, wenn zunächst das mit dem Telegram-Adpater verknüpfte Javaskript nach dem Befehl durchsucht wird, und erst, wenn dieser Befehl auch im text2command-Adapter nicht bekannt ist, eine entsprechende Meldung kommt. Sprich, ein vorhandenes Javaskript hat immer Vorrang vor dem text2command-Adapter.
2. Über
sendTo('telegram.0', { text: '/tmp/snap.jpg', caption: 'Snapshot', disable_notification: true });
kann man ja bereits sehr viele Reaktionen steuern. Dabei wird bereits automatisch je nach Inhalt von "text" zwischen Photo, Video, Audio, Dokument, Sticker, Aktion und Ort unterschieden. Was aber wohl im Moment noch nicht geht, sind https://core.telegram.org/bots/api/#replykeyboardmarkup. Wie wär's daher mit folgender Ergänzung?
sendTo('telegram.0', { keybaord: [[Taste 1],[Taste 2],[Taste 3]], resize_keyboard: true, one_time_keyboard: true, selective: no });
Oder habe ich da was übersehen und das geht schon?
3. Die Meldungen "Restarting" und "Restarted" des Telegram-Adapters beim Neustart von ioBroker finde ich etwas wenig aussagend, wenn man in Chats arbeitet. Würde es daher besser finden, wenn man das auf "ioBroker restartung" und "ioBroker restarted" präzisieren könnte. Noch schöner fände ich eine zusätzliche deutsche Version "ioBroker startet neu." und "ioBroker neu gestartet.".
4. Selbst, wenn man mit einer ChatID arbeitet, so kann man Befehle an den ioBroker nicht aus dem Chat heraus absenden. Das funktioniert aktuell nur für den Empfang von Nachrichten. Ein Senden von Befehlen geht dagegen immer nur aus dem jeweiligen Bot heraus. Könnte man ggf. auch eine Option einfügen, die ChatID für den Empfang von Befehlen durch den ioBroker abzufragen?
5. Schließlich fände ich es noch schön, wenn man auch für den text2command-Adapter eine ChatID angeben könnte.
Gruß,
Thorsten `
Deine Anmerkungen sind schon interessant.1. Man kann die Skripte nicht direkt antriggern. Das mus über States gehen. Aber ich habe noch nicht im Kopf, wie ich die zusammen fügen kann.
Vermutlich wird man eine Variable auswählen und Timeout einstellen.
text2command wird in dieser Variable die Frage schreiben und X Millisekunden warten, bis ein Antwort kommt. Falls eine lehre Antwort kommt (oder nach Timeout), dann werden die Rules abarbeitet, sonst wird Antwort aus Variable zurückgeschickt.
2. Probier mal.
sendTo('telegram.0', { text: 'test', reply_markup: { keyboard: [[Taste 1],[Taste 2],[Taste 3]], resize_keyboard: true, one_time_keyboard: true, selective: no } });
3. Werde ändern und eventuell einstellbar machen.
4. Mit der ChatID muss du mir erklären, wie das funktioniert. habe ich doch neulich mit ChatID was eingebaut.
Oder willst du, dass man ChatID eingeben konnte, woher auch die Befehle akzeptiert werden?
5. Wozu?
-
Hi Bluefox,
na, erholt aus dem Urlaub zurück?
Danke für Deine Anmerkungen. Punkt 2 werde ich mal ausprobieren.
4. Mit der ChatID muss du mir erklären, wie das funktioniert. habe ich doch neulich mit ChatID was eingebaut.
Oder willst du, dass man ChatID eingeben konnte, woher auch die Befehle akzeptiert werden? `
Im Moment ist es so, dass ich eine Push-Nachricht des ioBroker über die ChatID direkt in einen Chat umleiten kann. Soweit, so gut. Wenn ich aber nun in diesem Chat bin, und direkt einen Befehl von der Telegram App an den ioBroker sende, dann wird der nicht umgesetzt, weil er offensichtlich nicht ankommt. Das geht nur, wenn ich den Chat verlasse und den Befehl direkt aus dem entsprechenden Bot heraus sende. Vermutlich, weil die nur die ChatID des Bots "als berechtigt" im Telegram-Adapter hinterlegt ist.
5. Wozu? `
Nun ja, ich würde halt gerne die Antworten des text2command-Adapters im Chat statt im Bot angezeigt bekommen wollen. Oder geht das schon irgendwie?
Gruß,
Thorsten
-
Es gibt neue Version text2command (github)
https://github.com/ioBroker/ioBroker.te … javascript
` > There is a possibility to use javascript engine to process commands in text2command. To do that you must specify some state in "Processor state ID" (Advanced settings) and to listen on this state in some JS or Blockly script. You can create some state manually in admin or in script. Processing script can looks like this one:
createState("textProcessor", '', function () { // text2command writes the value with ack=false. Change "any" is important too, to process repeated commands. on({id: "javascript.0.textProcessor", ack: false, change: 'any'}, function (obj) { var task = JSON.parse(obj.state.val); // value looks like // { // "command": "text to process", // command that was received by text2command // "language": "en", // language in command or system language // "withLanguage": false // indicator if language was defined in command (true) or used default language (false) // } // response to text2command with ack=true if (task.command === 'switch light on') { setState("hm-rpc.0.light", true); setState("javascript.0.textProcessor", 'light is on', true); } else { // let it process with predefined rules setState("javascript.0.textProcessor", '', true); } }); });
Set in settings of text2command Processor state ID as javascript.0.textProcessor to let this example work.
The command will be processed first with your javascript and if javascript will answer with '' or not answer in predefined time (1 second by default) the command will be processed by rules. `
-
Klasse. Mal sehen, ob ich das noch vor meinem Urlaub ausprobiert bekomme.
Gruß,
Thorsten
-
Hi Bluefox,
Keyboard funktioniert nun. Top.
Hier mal ein kleines Beispiel:
on("telegram.0.communicate.request", function (obj) { log (obj.newState.val); if (obj.newState.val == "[Thorsten]Test" || obj.newState.val == "[Thorsten]/Test") { sendTo('telegram.0', { text: 'Testnachricht empfangen.', reply_markup: { keyboard: [['Taste 1','Taste 2'],['Taste 3','Taste 4']], resize_keyboard: true, one_time_keyboard: true } }); } });
Und so sieht's in der App aus:
Gruß,
Thorsten
-
Was passiert wenn du auf der Taste drückst?
-
Dann sagt im Moment text2command noch: "Ich verstehe "taste 1" nicht. Aber da muss man dann ja nur einen entsprechenden Befehl hinterlegen.
Übrigens, mit der chatID geht's natürlich auch:
on("telegram.0.communicate.request", function (obj) { log (obj.newState.val); if (obj.newState.val == "[Thorsten]Test") { sendTo('telegram.0', { text: 'Testnachricht empfangen.', chatId: 'xxxxxxxxxxx', reply_markup: { keyboard: [['Taste 1','Taste 2'],['Taste 3','Taste 4']], resize_keyboard: true, one_time_keyboard: true } }); } });
-
Hallo dtp,
on("telegram.0.communicate.request", function (obj) { log (obj.newState.val); if (obj.newState.val == "[Thorsten]Test" || obj.newState.val == "[Thorsten]/Test") { sendTo('telegram.0', { text: 'Testnachricht empfangen.', reply_markup: { keyboard: [['Taste 1','Taste 2'],['Taste 3','Taste 4']], resize_keyboard: true, one_time_keyboard: true } }); } });
Funktioniert bei mir leider nicht. Die Testnachricht kommt an, es öffnet sich aber kein Keyboard.
Javascript Version: 2.3.1
Telegram: 0.4.1
Auf Android getestet
Müsste ja auch ohne text2command adapter funktionieren
-
Wird bei Dir im Log denn was zum Skript angezeigt? Da sollte nach Empfang von "Test" dann so etwas wie "[xxxxx]Test" stehen. Genau das musst Du dann in die nachfolgende if-Bedingung des Skripts eintragen.
filename="2016-08-17_21h39_08.png" index="0">~~
Falls gar nicht passiert, versuche es mal zunächst mit einem anderen Aufruf, z.B. "Hallo", ohne dass Du was im Skript änderst. Manchmal hängt das Skript etwas, wenn man hintereinander mehrmals denselben Begriff schickt.
-
> To do that you must specify some state in "Processor state ID" (Advanced settings)
Das ist mir irgendwie nicht ganz klar. Wo genau muss ich da diese Einstellung vornehmen?
Gruß,
Thorsten
-
Eine Nachricht mit dem Text bekomme ich ja vom javascript an mein Smartphone, nur öffnet sich kein Custom Keyboard.
> Manchmal hängt das Skript etwas, wenn man hintereinander mehrmals denselben Begriff schickt.
Füge mal````
setState("telegram.0.communicate.request","leer"); -
Füge mal
setState("telegram.0.communicate.request","leer");
unter deinem Script ein…l `Danke für den Tipp.
Was das Keyboard angeht. Erscheint irgend eine Fehlermeldung im Log? Falls nicht, könnte es ggf. noch an der Client App selbst liegen. Nutzt Du Telegram für iOS oder für ein anderes Betriebssystem? Hab's selber noch nicht unter Windows oder Android ausprobiert.
-
Nein keine Fehlermeldung.
Genau, weder unter Windows noch Android kommt ein Keyboard, obwohl Android es eigentlich unterstützen sollte.
Gesendet von meinem Nexus 5X mit Tapatalk
-
@dtp:> To do that you must specify some state in "Processor state ID" (Advanced settings)
Das ist mir irgendwie nicht ganz klar. Wo genau muss ich da diese Einstellung vornehmen?
Gruß,
Thorsten `
48_2016-08-18_20_59_05-iobroker.admin.png -
@ Bluefox, funktioniert bei dir das Custom Keyboard unter Android?
-
Hi coyote,
also unter Android konnte ich es gestern (noch) nicht testen. Aber in der Windows-App wird mir das Keyboard auch angezeigt. Ich gehe daher mal fest davon aus, dass es auch unter Android funktionieren sollte.
Was wird denn bei Dir im Log als Inhalt für obj.newState.val angezeigt, wenn Du eine Nachricht an telegram.0 sendest? Exakt dieser Inhalt muss dann, wie erwähnt, auch in die nachfolgende if-Bedingung des Skripts eingetragen werden.
Gruß,
Thorsten
-
Seltsam, obwohl mir unter iobroker.admin (Version 1.4.0) die installierte Version 1.1.0 des text2command-Adapters angezeigt wird, sehe ich das Zahnrad bei mir nicht im text2command-Adapter. Stattdessen werden bei mir hinter "Testsatz:" weiterhin noch "Sprache:" und "Antwort ins ID:" angezeigt.
Muss ich da irgendwo noch eine andere Einstellung vornehmen?
Gruß,
Thorsten