NEWS
SOLVED JavaScript restart, Telegram Output wird überflutet
-
Hallo
ich hab mir über Telegram ein recht einfaches Menü aufgebaut um gewisse Sachen ohne Probleme von der Ferne zu steuern.
Allerdings bei jedem neustart von ioBroker, JavaScript Instanz oder beim Anlegen eines neuen globalen Skripts (wird die JavaScript Instanz restartet), werden alle Skripts gestoppt und neu gestartet und dadurch erhalte ich sinnlos viele Nachricht mit 'Bitte wähle einen Button:'. Könnte ich das irgendwie umgehen?sendTo('telegram.0', { user: 'Christian', text: 'Bitte wähle einen Button', reply_markup: { keyboard: [ ['Hauptmenü'], ['Bewässerung-Info'], ['Brunnenpumpe-On', 'Brunnenpumpe-Off'], ['Vorgarten', 'Garten', 'Oben'], ], resize_keyboard: true, one_time_keyboard: true } });
-
@Dutchman said in JavaScript restart, Telegram Output wird überflutet:
obj.state.val
DANKE
der Ansatz mit dem Trigger war gut, hat mir aber nicht so super gefallen, vor allem nachdem du erwähnt hast, dass es bei Telegram eh schon quasi einen Trigger gibt.
Habs nun so gelöst:on({id: "telegram.0.communicate.requestRaw", change: "ne"}, function (obj) { var value = JSON.parse(obj.state.val); if (value.text === 'Bewässerung') { sendTo('telegram.0', { user: 'Christian', text: 'Bitte wähle einen Button', reply_markup: { keyboard: [ ['Hauptmenü'], ['Bewässerung-Info'], ['Brunnenpumpe-On', 'Brunnenpumpe-Off'], ['Vorgarten', 'Garten', 'Oben'], ], resize_keyboard: true, one_time_keyboard: true } }); } });
-
das problem hier ist, wie leider durch vielen so übernommen, das du deine action mit einem script start ausloest das ist grundlegend "not best practise" !
Dadurch das du keinen trigger hast, startet der Inhalt des scriptes bei jedem script start.
Also baue es bitte um zu einem trigger, also ein object erstellen und dieses Sender wen du die Nachricht schicken möchtest.Brauchst du ein Beispiel ?
-
@Dutchman said in JavaScript restart, Telegram Output wird überflutet:
Also baue es bitte um zu einem trigger,
Danke vorerst mal für die Hilfe.
Wenn du ein gutes hast, wäre ich natürlich nicht abgeneigt, denn ich bin mit sicherheit nicht der einzige der danach fragen wird.
BITTESCHÖN -
@homecineplexx said in JavaScript restart, Telegram Output wird überflutet:
@Dutchman said in JavaScript restart, Telegram Output wird überflutet:
Also baue es bitte um zu einem trigger,
Danke vorerst mal für die Hilfe.
Wenn du ein gutes hast, wäre ich natürlich nicht abgeneigt, denn ich bin mit sicherheit nicht der einzige der danach fragen wird.
BITTESCHÖNgutes weis ich nicht aber lass es uns probieren ok !
also dein code senden eine message wen das script gestartet wird :
sendTo('telegram.0', { user: 'Christian', text: 'Bitte wähle einen Button', reply_markup: { keyboard: [ ['Hauptmenü'], ['Bewässerung-Info'], ['Brunnenpumpe-On', 'Brunnenpumpe-Off'], ['Vorgarten', 'Garten', 'Oben'], ], resize_keyboard: true, one_time_keyboard: true } });
jetzt erstellen wir uns ein object (ich mache es hier im script, geht auch Manuel !
createState("mein_trigger", function () { });
jetzt mochten ich einen event auslösen wen dieser state sich ändert :
on({id: "javascript.0.mein_trigger"/*mein_trigger*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; });
so und jetzt mal der code wo ich den trigger kombinieren mit deinem code um die Nachricht zu schicken.
Ich :- erstelle erst den state
- warte dan auf ein event (Änderung des states)
- schicke die Nachricht
createState("mein_trigger", function () { }); on({id: "javascript.0.mein_trigger"/*mein_trigger*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; sendTo('telegram.0', { user: 'Christian', text: 'Bitte wähle einen Button', reply_markup: { keyboard: [ ['Hauptmenü'], ['Bewässerung-Info'], ['Brunnenpumpe-On', 'Brunnenpumpe-Off'], ['Vorgarten', 'Garten', 'Oben'], ], resize_keyboard: true, one_time_keyboard: true } }); });
so hoffe das hilft dem Verständnis, ab jetzt kann das script nämlich immer an bleiben und nur wen der state sich ändert wird der Inhalt ausgeufert. Ein restart, script start usw wird es nicht mehr auslosen !
Tip : ich sehe das dies ein telegram menu ist, du kannst auch den state "request" von telegram umerwachten, da kommt nämlich die nachreicht rein die du zum bot schickst, und diese dan auswerten
-
@Dutchman said in JavaScript restart, Telegram Output wird überflutet:
obj.state.val
DANKE
der Ansatz mit dem Trigger war gut, hat mir aber nicht so super gefallen, vor allem nachdem du erwähnt hast, dass es bei Telegram eh schon quasi einen Trigger gibt.
Habs nun so gelöst:on({id: "telegram.0.communicate.requestRaw", change: "ne"}, function (obj) { var value = JSON.parse(obj.state.val); if (value.text === 'Bewässerung') { sendTo('telegram.0', { user: 'Christian', text: 'Bitte wähle einen Button', reply_markup: { keyboard: [ ['Hauptmenü'], ['Bewässerung-Info'], ['Brunnenpumpe-On', 'Brunnenpumpe-Off'], ['Vorgarten', 'Garten', 'Oben'], ], resize_keyboard: true, one_time_keyboard: true } }); } });
-
darf ich dir feedback geben ?
Sehr gut !!!! Du hast mein "Allgemeines" Beispiel und tips darin direkt umgesetzt auf deine persönliche situation.
Chapeau, schnell verstanden und gemacht.... alles jetzt nach wünsch ? -
natürlich darfst du und danke...ich arbeite ja auch schon etwas länger damit. nur oft fehlt einem einfach die idee, was es eventuell wo geben könnte.
also bitte.....Verbesserungen sind jederzeit gern willkommen
-
@homecineplexx said in JavaScript restart, Telegram Output wird überflutet:
also bitte.....Verbesserungen sind jederzeit gern willkommen
Gibt nix zu verbessern hast alles richtig gemacht
-
hatte gerade wieder ein problem...obwohl ichs jetzt so gemacht habe, kommen die "bitte button wählen" dennoch doppelt. hab ich dann das jeweilige skript gestoppt und gestartet hat es gepaßt.
irgendwie kommts mir so vor wie wenn die skripte dann teilweise dennoch doppelt laufen -
@Dutchman said in JavaScript restart, Telegram Output wird überflutet:
gutes weis ich nicht aber lass es uns probieren ok !
Hallo Dutchman!
Sehe ich das richtig, dass dieser Code eigentlich in jedes Script sollte, das eine ausführbare Funktion hat?
createState("mein_trigger", function () { }); on({id: "javascript.0.mein_trigger"/*mein_trigger*/, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val;
und dies gehört dann bei jedem Script angepasst?
createState("mein_trigger", function () { });
mein_trigger nenn ich dann zB Pelletsofen
Für jedes Script also ein eigenes Objekt erstellen?
-
@Negalein said in JavaScript restart, Telegram Output wird überflutet:
Sehe ich das richtig, dass dieser Code eigentlich in jedes Script sollte, das eine ausführbare Funktion hat?
ja, also damit erstellt man sich einen state (wie gesagt geht auch Manuel) und löst das script aus wen sich der state ändert
das hier nicht vergessen zu ändern :
id: "javascript.0.mein_trigger"/*mein_trigger*/
@Negalein said in JavaScript restart, Telegram Output wird überflutet:
Für jedes Script also ein eigenes Objekt erstellen?
jup, Vorteil du kannst es von alles aus auslösen (script, Alexa, yahka, was du möchtest)
-
Hey,
hab das selbe Problem, das mich Telegram mit Meldungen überflutetBin dadurch auf diesen Tread gestoßen und hab versucht meine Scripte damit anzupassen, leider ohne Erfolgt.
Ich habe die Scripte wie folgt angepasst (Beispiel):
createState("Hue Lampen", function () {
});on({id: "javascript.0.Hue Lampen", change: "ne"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
sendTo('telegram.0', {
text: 'Bitte Hue Lampe wählen',
reply_markup: {
keyboard: [
['Hue Küche An', 'Hue Küche Aus'],
['Hue Esszimmer An', 'Hue Esszimmer Aus'],
['Hue Wohnzimmer An', 'Hue Wohnzimmer Aus'],
['Hue Haustür An', 'Hue Haustür Aus'],
['Hue Erker An', 'Hue Erker Aus'],
['Stehlampe An', 'Stehlampe Aus'],
['Übersicht', ''],
],
resize_keyboard: true,
one_time_keyboard: false
}
});
});Leider wird nur einmal Hue Lampen vom Telegram akzeptiert und komme ins Menü, danach komme ich nicht mehr in das Sub-Menü, sobald ich auf Übersicht wieder gewechselt bin.
Kann es sein, dass ich in text2command etwas anderes einstellen muss damit der State von Hue Lampe bei jedem drücken auf den Button wechselt?
Hab aktuell als Objekt-ID den erzeugten State von Hue Lampe mit "Schreibe Text in Zustand" ausgewählt. Vorher hatte ich das Javascript von der Lampe drin mit "Schalte irgendwas ein oder aus".Vielleicht kann mir jemand sagen was ich noch ändern muss ausser dem Script.
Danke schonmal im VorausGrüße
Freaknet