NEWS
JS automatisch beim Start des Dockers ausgeführt? Warum?
-
Hallo zusammen,
ich bin relativ neu beim ioBroker und hab jetzt mal folgendes gemacht:
- ioBroker als Docker Container auf dem Server deployed (Network = host wegen Wake on LAN)
- ein paar Adapter eingebunden, u.A. Alexa, ioBroker IOT, KODI Steuerung oder Samsung-tizen
(https://github.com/dahuby/iobroker.samsung_tizen) - zwei Java Skripte, die jeweils den Fernseher und und den KODI-PC mit Wake on LAN aufwecken können
- ein paar Blockly Skripte, die dann als Alexa Szenen mit Routinen aufgerufen werden können.
Soweit funktioniert das alles wunderbar. Bis ein Problem:
Jedesmal wenn ich den Docker Container neu starte, werden scheinbar diese beiden Java Scripte irgendwie automatisch ausgeführt. Sowohl der Fernseher als auch KODI schalten sich an. Habt ihr eine Idee warum das so ist? Oder wie ich mich der Sache nähern kann?
Danke für eure Tips!
-
@pipsen Wenn ioBroker startet, werden alle Skripte ausgeführt. Wenn du in Skripten nun einfach etwas machst ohne auf einen Trigger zu hören (z.B. State Änderung), dann wird das logischerweise beim Start von ioBroker ausgeführt.
Ohne deine Skripte zu sehen ist es aber sehr schwierig, abzuschätzen, was genau das Problem ist. Könntest du zumindest eines der beiden hier posten (bitte in Code Tags </>).
-
Also die "Hauptskripte", die ich als Alexa Szene zur Verfügung stelle, sind Blockly. Da ich aber in Blockly kein Wake on LAN machen kann, hab ich mir zwei "Hilfs-Java-Skripte" gebaut, die einfach nur zwei-Zweiler sind:
var wol = require('wake_on_lan'); wol.wake('20:DE:20:DE:20:DE');
Diese Skripte führe ich dann im Blockly Skript an der richtigen Stelle aus.
Die beiden gelben JS werden scheinbar automatisch gestartet, die Blocklys alle nicht.
Wie kann ich jetzt für diese beiden JavaSkripte den Autostart abschalten, so dass sie nur innerhalb der Blockly Skripte "on demand" ausgeführt werden. wenn durch die Alexa Szene der Trigger kommt?
Danke!
btw.... falls ein Admin das sieht: Das Topic gehört aus Blockly raus und in JS rein.. kann das jemand verschieben? Sorry und Danke!
-
@pipsen Ich würde grundsätzlich nicht mit Skript Ein/Ausschalten arbeiten. Das macht (wie du jetzt siehst) nur Probleme.
Erstelle einen Datenpunkt, den du dann im Skript "abfragst" (mit
subscribe()
). Das ist dann dein Trigger.Die Blocklys werden übrigens auch alle automatisch gestartet (sieh das grüne Icon hinter dem Skript-Name), aber jedes Blockly reagiert wohl nur auf einen Trigger und führt nicht einfach etwas aus.
-
@pipsen sagte in JS automatisch beim Start des Dockers ausgeführt? Warum?:
Also die "Hauptskripte", die ich als Alexa Szene zur Verfügung stelle, sind Blockly. Da ich aber in Blockly kein Wake on LAN machen kann, hab ich mir zwei "Hilfs-Java-Skripte" gebaut, die einfach nur zwei-Zweiler sind:
Es gibt in Blockly einen Baustein "JS Funktion aufrufen". In diesen kannst du den 2-Zeiler als JS Code einfügen, dann sollte es gehen.
A.
-
Danke für die Tipps. Zum Thema Datenpunkte kann ich nix sagen, damit kenn ich mich leider noch nicht aus.
Aber was mir auf jeden Fall geholfen hat: Ich hab einfach alle Skripte von Play auf Pause umgeschaltet. Die Alexa Trigger gehen damit immer noch, und der Autostart Effekt beim Docker restart sind weg@Asgothian: Deinen Tipp setz ich zusätzlich noch um, das Java Script direkt in Blockly mit einzubauen, ohne es extra auszulagern. Ist dann auch aufgeräumter und integrierter.
-
@pipsen sagte in JS automatisch beim Start des Dockers ausgeführt? Warum?:
Zum Thema Datenpunkte kann ich nix sagen, damit kenn ich mich leider noch nicht aus.
Schau dir das auf jeden Fall mal an. Skripte sollten (wie meine Vorredner schon gesagt haben) immer "laufen" und auf Datenpunkte triggern. Viele Skripte, die hier im Umlauf sind, legen ihre Trigger-Datenpunkte auch gleich mit an, das kannst du dir abschauen.
Sie ständig zu starten und zu stoppen sorgt immer wieder für seltsame Probleme und hat das von dir beschriebene Problem, dass sie beim Systemstart auch ausgeführt werden.
-
@alcalzone said in JS automatisch beim Start des Dockers ausgeführt? Warum?:
@pipsen sagte in JS automatisch beim Start des Dockers ausgeführt? Warum?:
Zum Thema Datenpunkte kann ich nix sagen, damit kenn ich mich leider noch nicht aus.
Schau dir das auf jeden Fall mal an. Skripte sollten (wie meine Vorredner schon gesagt haben) immer "laufen" und auf Datenpunkte triggern. Viele Skripte, die hier im Umlauf sind, legen ihre Trigger-Datenpunkte auch gleich mit an, das kannst du dir abschauen.
Sie ständig zu starten und zu stoppen sorgt immer wieder für seltsame Probleme und hat das von dir beschriebene Problem, dass sie beim Systemstart auch ausgeführt werden.
Okay hab ich verstanden. Ich hab jetzt einen boolschen Datenpunkt erstellt und in den Skripten gesagt: Sobald sich der Wert ändert: Löse aus - soweit, sogut.
Jetzt hätte ich noch ein paar weitere Fragen:
- Wenn ich zwei Skriptabläufe schreibe, die quasi gegenläufig sind z.B.:
- fahre alles im Wohnzimmer geregelt hoch
- fahre alles im Wohnzimmer geregelt runter
=> Ist es dann besser, zwei Datenpunkte zu erstellen und die zwei quasi bei jedem "toggeln" zu triggern, oder ist es eleganter, nur einen Datenpunkt dafür zu erstellen und dann zu sagen: bei true => Skript1, bei false => Skript2
-
Was ist jetzt der eleganteste Weg, das mit einem Alexa Sprachbefehl zu verkoppeln? Als welchen Typ lege ich das in IOT an?
Switch? Activity Trigger? Szene Trigger? Oder "Kein Typ"? Ein Switch könnte das mit dem true / false ganz gut abbilden oder? -
Ich hab einerseits Skripte, die eine an- und eine aus-Prozedur haben. Da bieten sich Schalter an. Gibts auch eine Möglichkeit, eine Prozedur direkt aufzurufen? Quasi wie ein "Button", der keinen Zustand hat? z.B. "Alexa, spiel mein Lieblingslied"... und dann spielt er das ab. Welche Art Datenpunkt nimmt man da? Bool/Schalter/Zahl/etc.. macht keinen Sinn, aber Button frisst IOT nicht
-
Ich hab ein Problem mit dem einbinden von JavaScript ins Blockly. Das ist jetzt so ein losgelöster Block, der sich nicht "andocken" lässt. Was mach ich da falsch? Ich hätte das gern unter die Stehlampe an eingefügt.
Danke für eure Hilfe!
-
@pipsen Du hast mit dem Block die Funktion erzeugt.. es gibt auch noch diesen Block, aber erst nachdem du die Funktion definiert hast
Das hängst du an die Stehlampe an
-
@asgothian
Super danke... zufällig hab ich das vor ein paar Minuten selbst entdeckt. Nachdem ich den Namen vergeben hab, hab ich nicht mehr rechts ins Menü geschaut.Mittlerweile kann ich mir selbst zu den vier Fragen schon einige Antworten geben (falls jemand noch ähnliche Probleme hat):
-
Ja, bei zwei gegenläufigen Skripten macht ein Schalter mit zwei Zuständen Sinn (true/false), der dann mit Sprachsteuern an/aus jeweils ein anderes Skript triggert. => Passt
-
Ich hab jetzt immer den Datenpunkt Typ "Logikwert" genommen und dann als Rolle "Switch" gewählt (wichtig, sonst nimmt IOT den Datenpunkt nicht!). Als Alexa Typ hab ich jetzt immer Schalter gewählt, so kann man auch mal in der Alexa App schnell hin und her schalten, wenn man will.
-
Dafür hab ich leider keine wirklich gute Lösung, nur einen Workaround. Wenn ich einen Ablauf habe, der nur einen "true" trigger hat, aber false keinen Sinn macht, hab ichs das so gelöst:
- Skript startet, wenn Wert auf true gesetzt wird
- Letzer Schritt im Skript: Setze den Wert wieder auf false
=> Somit kann man das Skript immer wieder anstoßen. - In Alexa dann für den Schalter eine Routine erstellen "Alexa, leg los!" und damit Schalter = an setzen
=> Find ich nicht so elegant, aber funktioniert. Schalter manuell ausschalten bewirkt dann einfach nix
- Wurde schon beantwortet. Skript reinziehen, Namen vergeben und dann im zweiten Schritt aus dem Menü den neuen Namen finden und reinziehen
Hat noch jemand Anmerkungen / Ideen / Verbesserungsvorschläge?
Danke für eure Hilfe!
-
-
@pipsen sagte in JS automatisch beim Start des Dockers ausgeführt? Warum?:
Dafür hab ich leider keine wirklich gute Lösung, nur einen Workaround. Wenn ich einen Ablauf habe, der nur einen "true" trigger hat, aber false keinen Sinn macht, hab ichs das so gelöst:
Du könntest einen Button dafür nehmen/erstellen und dann für den Trigger wurde aktualisiert, dann brauchst Du nicht wieder auf false zurück stellen.
Das geht dann genau so mit der Routine in der Alexa App. Im iot ist es dann trotzdem ein SmartGerät als Switch.