NEWS
(GELÖST) Blockly Inhalt wird immer doppelt ausgeführt.
-
Hallo zusammen,
ich habe ein bestimmtes Problem mit Blockly bzw einem Script in dem ich halt Blockly verwende.
Das Script tut grundsätzlich genau das was es soll. Beobachten ob sich ein Objekt ändert und wenn ja dann bei Änderung etwas tun.
Allerdings läuft der Inhalt immer zwei Mal ab. Und ich weiß einfach nicht warum.
Bilder sagen mehr als 1000 Worte.
Hier wurde der Wert auf 4 geändert
Hier wurde der Wert auf -10 geändert
Hier wurde der Wert auf 3 geändert
Immer wird der Inhalt zwei Mal ausgeführt.
Was wird gemacht. Es wird ein API Call auf einen Webserver ausgeführt der dann ein Infrarotsignal an meinen Subwoofer sendet. Der Subwoofer ändert dann entsprechend das Volume um jeweils +1 oder -1.
Klappt immer, aber halt doppelt
Was habe ich erfolglos versucht:
- Ich kann das Objekt (eigene-objekte.0.Keller.Kino.Subwoofer.Nubert.vol_value) das abgegriffen wird per Alexa, per App oder direkt im ioBroker ändern
- Objekttrigger umgestellt auf "wurde geändert" wurde aktualisiert"
- Habe bei "Falls wert von Objekt ist gleich" einfach mal von ungleich null auf eine fixe Zahl gestellt
- Habe alles an Logik in der Schleife "Falls Wert von Objekt..." gelöscht un nur eine Telegram Nachricht verschickt
- javascript.0 Instanz neu gestartet
- Habe den Entrpeller mal eingebaut (https://forum.iobroker.net/assets/uploads/files/1551202808102-entpreller.jpg)
- Server rebootet
Habe am Ende sogar alles neu gemacht....
Jemand eine Idee?
Update:
Habe das Script nach Javascript umgewandelt und einen Freund drüber schauen lassen:
var volValue, volValueOrig, volVariable, timeout; on({id: 'eigene-objekte.0.Keller.Kino.Subwoofer.Nubert.vol_value', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("eigene-objekte.0.Keller.Kino.Subwoofer.Nubert.vol_value").val != 0) { volValue = getState("eigene-objekte.0.Keller.Kino.Subwoofer.Nubert.vol_value").val; volValueOrig = getState("eigene-objekte.0.Keller.Kino.Subwoofer.Nubert.vol_value").val; if (volValue > 0) { volVariable = 'vol_up'; } if (volValue < 0) { volVariable = 'vol_down'; volValue = volValue * -1; } sendTo("telegram.1", "send", { text: (['Wert von Objekt','\n',volValueOrig,'\n','Anzahl Aktionen:','\n',volValue,'\n','Ausführen:','\n',volVariable].join('')) }); console.log("telegram: " + (['Wert von Objekt','\n',volValueOrig,'\n','Anzahl Aktionen:','\n',volValue,'\n','Ausführen:','\n',volVariable].join(''))); for (var count = 0; count < volValue; count++) { timeout = setTimeout(function () { try { require("request")((['http://',getState("eigene-objekte.0.Server.Pi.pisubwoofer.fqdn").val,'/irctl?remote=nubertsubwoofer&function=',volVariable,'&action=SEND_ONCE'].join(''))).on("error", function (e) {console.error(e);}); } catch (e) { console.error(e); } console.log("request: " + (['http://',getState("eigene-objekte.0.Server.Pi.pisubwoofer.fqdn").val,'/irctl?remote=nubertsubwoofer&function=',volVariable,'&action=SEND_ONCE'].join(''))); }, 100); } setState("eigene-objekte.0.Keller.Kino.Subwoofer.Nubert.vol_value"/*Nubert.Subwoofer.vol.value*/, 0, true); } });
Update 2:
Eine weitere Idee -> ps -A | grep io hat leider auch nicht geholfen. Java läuft nur ein Mal.
-
@rayman Zum Schluss wird der Triggerdatenpunkt auf 0 gesetzt, wodurch wieder getriggert wird.
Außerdem: Anstelle von wiederhole und Ausführen timeout verwende Ausführen Intervall und zähle im Intervall die Variable volValue runter, bei 0 stoppe das Intervall. -
@paul53 sagte in Blockly Inhalt wird immer doppelt ausgeführt.:
@rayman Zum Schluss wird der Triggerdatenpunkt auf 0 gesetzt, wodurch wieder getriggert wird.
Außerdem: Anstelle von wiederhole und Ausführen timeout verwende Ausführen Intervall und zähle im Intervall die Variable volValue runter, bei 0 stoppe das Intervall.Danke dir Paul. Ich habe den Eintrag nun wie folgt angepasst:
Klappt:
Danke dir für die rasche und gute Hilfe!
Ich markiere den Thread nun als ERLEDIGT