NEWS
[Script] Telegram eingaben
-
Hi,
Ich bin gerade dabei ein Script zu schreiben und bräuchte mal einen Schups in die richtige Richtung.
Vorweg:
Ich verwende bei mir sehr viel den Telegramm Adapter.
Aktuell haben ich folgende Funktionen Implementiert.- Wetter Infos ( keyword: "wetter")
- Sprit preise (keyword: "tanken")
- Schichtplan eintragen (keyword: "arbeit" = Main Menü, "SECEDULE;" = Anfang der Callbacks vom Inline Keyboad)
- Heizung (keyword: "Heizung" = Main Menü, "HEAT" = Anfang der Callbacks vom Inline Keyboad )
Jetzt möchte ich gerne noch eine Möglichkeit haben meine Einkaufsliste (Bring Adapter) zu steuern.
Ich stelle mir das so vor das man zu erst den Befehl "Einkaufsliste" an den Bot schickt der daraufhin die
aktuelle List zurückschickt und als inline Keyboad fragt nach "Eintrag hinzufügen" oder "Eintrag löschen".Bis hier hin ist das alles kein Problem (bzw. läuft auch schon)
Aber jetzt müsste der Benutzer die Möglichkeit haben frei Text einzugeben.
Ich sehe dazu vier Möglichkeiten- Ich überprüfe ob die Eingabe zu einem keyword passt und wenn nicht dann schreibe ich es auf die Liste.
- Der Benutzer muss ein identifier Symbol als Präfix oder Suffix angeben. z.b. "!Kartoffeln" "!Zitronen"
- Durch den callback vom "Eintrag hinzufügen" Knopf wird ein Timer gestartet und ab dann kann man 10 Minuten (oder so)
Einträge hinzufügen. Dafür müsste ich dann die Subscribe von den anderen Scripten (Heizung, Tanken usw.) temporär ausschalten. - Einen Zweiten Bot aufbauen der nur für die Einkaufsliste ist.
Am liebsten wäre es mir wenn es eine Möglichkeit gäbe das ein Präfix automatisch hinzugefügt wird. Leider habe ich in den Doku von dem Telegramm Adapter nichts passendes gefunden.
Aktuell sollte die Variante 1 geht jedoch weiß ich noch nicht was ich mit dem Bot noch so anstelle und damit würde ich mir alle Freitext eingaben verbauen. Zu dem müsste ich die Liste mit Keyword immer gut Pflegen sonst stehen ihrgend wann Keywords auf der Einkaufsliste.
Ein Kombination von 1 und dem Timer aus 3 wäre aktuell die Sinnvollste Lösung.
Seht ihr aktuell noch eine andere Möglichkeit ?Gruß
Arne -
@ignis-draco hi, nette Idee mit der Einkaufsliste, man könnte mein Telegram-Menu zur Eingabe verwenden
man müsste sich bloß :- eine Variable (state) vom Typ string anlegen.
- eine neue Aufzählung erstellen z.b. Einkaufsliste in diese Liste fügt man die neue Variable ein
- anschließen registriert man das Menü auf die Liste und man hat ne Eingabe in telegram
- müsste dein Script sich einfach auf die neue Variable bei Änderungen registrieren (on)
- und dann mit den neuen Werten arbeiten.
hier kurzes Beispiel Video :
StringInput(1).avi
das menü findest du hier : https://github.com/Nahasapeemapetilon/MyTelegramMenu
allerdings muss ich dazu sagen, dass momentan noch keine string eingabe von der version von github unterstützt wird nur number , ich hatte mir die Erweiterung nur temporär eingebaut, falls du das verwenden möchte würde ich es noch mal testen und dann hochladen
Viele Grüße -
@nahasapee sorry die quali vom video ist unterirdisch hier noch mal bisschen bessere Auflösung :
https://1drv.ms/v/s!ApNXnkLEcciklX3Hx_KOOUqnl-Cl?e=PEeYM1 -
@Nahasapee vielen dank für die mühe die du dir gemacht hast.
Wenn ich das richtig sehe läuft das bei dir über einer Art state machine die je nach dem aktiven State die Eingabe auswerte.
So in der Art hatte ich mit meinem Bot auch angefangen leider wurde das bei mir sehr schnell sehr unübersichtlich.
Des wegen habe ich das Umgebaut so das ich aktuell 6 Skripte habe die alle den Telegramm Adapter Subscriben.
Bis jetzt konnte ich alles Stateless bauen so das ich zu jederzeit jede Anweisung Ausführen konnte. Z.B.
Wären ich dabei war den Schichtplan einzutragen konnte ich nach dem Wette Fragen und danach einfach beim Schichtplan weiter zu machen. Mittels einer Präfix Notation ist das einfach. Leider wird das bei der Einkaufsliste nur klappen wenn
man z.b. immer "Kaufe" davor schreibe.
Ich werde das jetzt erstmal so bauen und schauen wohin sich das entwickelt. -
na meine idee für dich wäre ja gewesen du nutzt nur das menü als eingabe, könntest du ja ne separate telegram instanz und bot dazu verwenden und deine 6 scripte reagieren auf die 6 states wo die eingabe desn menüs hingeht
du nutzt quasi nen separaten bot der das menü für die eingabe nimmt. dort hättest du dann z.b. menü (einkaufen, schichtplan ,....)
vg
-
@nahasapee
ich habe mal versucht deine Anweisungen umzusetzten. Das Video war sehr gut gemacht. Wähle ich aber in Telegram nun List1 aus, funktioniert es nicht. Würdest du bitte mir da noch einmal weiterhelfen? -
@jwerlsdf was funktioniert genau nicht?
ich hatte jetzt noch nichts weiter am TelegramMenü geändert, weil ich dachte du brauchst es nicht.
Die aktuelle Version auf Git unterstütz noch keine States vom Typ String.
Wenn du das nutzen willst würde ich es die nächsten Tage einbauen.(ich hatte es mir nur temporär zum Testen eingebaut)Viele Grüße
-
Ich hab die Version vom Menü auf 0.0.17 geupdatet, diese sollte States die vom typ String sind supporten. Falls was nicht gehen sollte bitte ich um feedback ich hatte es nur rudimentär getestet.
Viele Grüße -
@nahasapee
vielen Dank! Es hat geklappt. Ich hätte noch folgende Fragen:- Gibt es eine Möglichkeit, dass durch eine weitere Eingabe, die alten Werte nicht gelöscht werden? Beispiel: Ich schreibe Milch; 10 Min später fällt mir ein, dass ich noch Wasser brauche. Schreibe ich das, geht ja im Moment die vorherhigen Eingaben verloren.
- Gibt es eine Möglichkeit bei dem Menü, das ganze etwas abzukürzen? Im Moment öffne ich das Menü mit "/Einkaufsliste" --> (1) Einkaufsliste --> (1) Liste1 --> (1) Einkaufsliste und hier kann ich erst schreiben. Ich würde gerne das Menü öffnen und dann direkt schreiben bzw. ggf. noch ein Punkt öffnen z.B. "schreibe Einkaufsliste"
Mein Skript:
const MyTelegramMenu = require('mytelegrammenu'); const options = {'enumList': ['einkaufsliste'], 'locale':'de', 'showRootItemsCommand':'/Einkaufsliste'}; const telegramMenu = new MyTelegramMenu(this,options);
-
@jwerlsdf du könntest in deinem anderen Script einfach bei Änderungen deine Liste füllen :
so in etwa ://.... let myShoppingList = []; on({id: 'javascript.0.TestEinkaufsliste' , change: 'any'}, (pMeldung) => { if(pMeldung.state.val) myShoppingList.push(pMeldung.state.val); console.log(["Einkaufsliste :",myShoppingList]); }); //.....
und mit der MyShoppingList kannst du dann machen was immer du machen willst
oder du legst dir gleich noch nen State dafür an anstatt ne lokale Variable und füllst diese
Eine gute Idee wäre wahrscheinlich auch in dem Menü ein zusätzlichen Eintrag zu machen um deine Einkaufsliste zu leeren oder einzelne Elemente zu löschen -
@jwerlsdf ich hab es mal selber zum testen nachgebaut
so sieht es bei mir aus:
folgende States hinzugefügt :Die Auflistung liste sah bei mir so aus :
und dann noch kleines TestScript dazu:
let myShoppingList = []; on({id: 'javascript.0.TestEinkaufsliste' , change: 'any'}, (pMeldung) => { if(pMeldung.state.val) myShoppingList.push(pMeldung.state.val); console.log(["Einkaufsliste :",myShoppingList]); }); on({id: 'javascript.0.TestEinkaufsListeRemoveAll', change: 'any'}, (pMeldung) => { if(myShoppingList.length > 0) myShoppingList = []; console.log(["Einkaufsliste :",myShoppingList]); }); on({id: 'javascript.0.TestEinkausListeRemoveItem'/*Eintrag löschen*/ , change: 'any'}, (pMeldung) => { console.log([pMeldung.state.val,myShoppingList.length]); if(pMeldung.state.val>=0 && pMeldung.state.val <= myShoppingList.length) myShoppingList = myShoppingList.splice(pMeldung.state.val,1); console.log(["Einkaufsliste :",myShoppingList]); });
geht zwar, ich find es aber bisschen "bucklig" vielleicht sollte man nen speziellen Modi "Einkaufsliste" in das TelegramMenü einbauen,
da könnte man mit der Report-Funktion auch die Einkaufsliste vernünftig anzeigen lassen.und zu Punkt 2. das ist die Struktur vom IOBroker und das Menü generiert sich komplett daraus
Viele Grüße