Und hier ist das Java-Skript, das mir angezeigt wird:
var Ist, Diff, value, Delta_ist, Count_hoch, Count_runter, Verzoegerung;
on({id: '0_userdata.0.Rolladen.Rolladen-Esszimmer.Soll-Position', change: "any"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
Ist = getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Ist-Position").val;
Diff = value - Ist;
console.log(Ist);
console.log(Diff);
if (value < 3 || value > 97) {
Diff = (typeof Diff == 'number' ? Diff : 0) + 2;
}
console.log(Diff);
if (value > Ist) {
Verzoegerung = getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Laufzeit_runter").val * Diff;
if (Verzoegerung <= 0) {
Verzoegerung = Verzoegerung * -1;
}
console.log(('Verzögerung ' + String(Verzoegerung)));
setStateDelayed('0_userdata.0.Rolladen.Rolladen-Esszimmer.runter', true, false, parseInt(0, 10), true);
setStateDelayed('0_userdata.0.Rolladen.Rolladen-Esszimmer.runter', false, false, parseInt(Verzoegerung, 10), false);
} else if (value < Ist) {
Verzoegerung = getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Laufzeit_hoch").val * Diff;
console.log(('Verzögerung ' + String(Verzoegerung)));
setStateDelayed('0_userdata.0.Rolladen.Rolladen-Esszimmer.hoch', true, false, parseInt(0, 10), true);
setStateDelayed('0_userdata.0.Rolladen.Rolladen-Esszimmer.hoch', false, false, parseInt(Verzoegerung, 10), false);
}
});
on({id: new RegExp('0_userdata\\.0\\.Rolladen\\.Rolladen-Esszimmer\\.hoch' + "|" + '0_userdata\\.0\\.Rolladen\\.Rolladen-Esszimmer\\.runter'), change: "any"}, function (obj) {
if (getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.hoch").val) {
if (getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.enable").val) {
setState("alias.0.Rollladen.Esszimmer.Fenster.oeffnen"/*Rollladen.Esszimmer.Fenster.oeffnen*/, true);
}
} else if (getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.runter").val) {
if (getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.enable").val) {
setState("alias.0.Rollladen.Esszimmer.Fenster.schliessen"/*Rollladen.Esszimmer.Fenster.schliessen*/, true);
}
} else {
(function () {if (Count_hoch) {clearInterval(Count_hoch); Count_hoch = null;}})();
setState("alias.0.Rollladen.Esszimmer.Fenster.oeffnen"/*Rollladen.Esszimmer.Fenster.oeffnen*/, false);
(function () {if (Count_runter) {clearInterval(Count_runter); Count_runter = null;}})();
setState("alias.0.Rollladen.Esszimmer.Fenster.schliessen"/*Rollladen.Esszimmer.Fenster.schliessen*/, false);
}
});
on({id: 'alias.0.Rollladen.Esszimmer.Fenster.oeffnen', change: "ne"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
if (value) {
Ist = getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Ist-Position").val;
Delta_ist = -100 / getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Laufzeit_hoch").val;
Count_hoch = setInterval(function () {
Ist = (typeof Ist == 'number' ? Ist : 0) + Delta_ist;
setState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Ist-Position"/*Rolladen-Esszimmer.Ist-Position*/, (Math.round(Ist)), true);
if (Ist <= 0) {
setState("0_userdata.0.Rolladen.Rolladen-Esszimmer.hoch"/*Rolladen-Esszimmer.hoch*/, false, true);
}
}, 100);
} else {
(function () {if (Count_hoch) {clearInterval(Count_hoch); Count_hoch = null;}})();
if (getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.hoch").val) {
setState("0_userdata.0.Rolladen.Rolladen-Esszimmer.hoch"/*Rolladen-Esszimmer.hoch*/, false, true);
}
}
});
on({id: 'alias.0.Rollladen.Esszimmer.Fenster.schliessen', change: "ne"}, function (obj) {
var value = obj.state.val;
var oldValue = obj.oldState.val;
if (value) {
Ist = getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Ist-Position").val;
Delta_ist = 100 / getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Laufzeit_runter").val;
Count_runter = setInterval(function () {
Ist = (typeof Ist == 'number' ? Ist : 0) + Delta_ist;
setState("0_userdata.0.Rolladen.Rolladen-Esszimmer.Ist-Position"/*Rolladen-Esszimmer.Ist-Position*/, (Math.round(Ist)), true);
if (Ist >= 100) {
setState("0_userdata.0.Rolladen.Rolladen-Esszimmer.runter"/*Rolladen-Esszimmer.runter*/, false, true);
}
}, 100);
} else {
(function () {if (Count_runter) {clearInterval(Count_runter); Count_runter = null;}})();
if (getState("0_userdata.0.Rolladen.Rolladen-Esszimmer.runter").val) {
setState("0_userdata.0.Rolladen.Rolladen-Esszimmer.runter"/*Rolladen-Esszimmer.runter*/, false, true);
}
}
});
Zu dem Skript gehören diese Variablen:
Das Skript ist mit Alexa verknüpft und ich kann z.B. sagen:
"Alexa, stell das Esszimmer-Rollo auf 100%".
In dem Fall wäre z.B. der DP "Ist-Position": 0%, somit offen. Der Befehl stellt die Variable "Soll-Position" auf 100%.
Das Skript soll dann den T2-Schalter für Rollladen schließen anschalten.
Das Rollo läuft "Laufzeit-runter": 320 Zehntelsekunden. Solange benötigt das Rollo zum kompletten Schließen.
Die Variable "Ist-Position" soll dabei von 0 auf 100% hochzählen, in Abhängigkeit von der Laufzeit. Also 0% ist offen, 100% komplett geschlossen.
Beim Erreichen der Soll-Position soll das Skript dann den Schalter des T2 ausmachen.
Alternativ kann ich den Schalter für Schließen betätigen und das Skript zählt entsprechend der Laufzeit die "Ist-Position".
Bislang hat das seit fast einem Jahr problemlos mit 8 Rollos funktioniert. Jetzt auf einmal bleibt "Ist-Position" z.B. bei 84% oder bei 24% oder auch mal bei 100% stehen, während das Rollo weiter läuft und der Schalter dann nicht ausgeht. Es betrifft alle Rollos.
Es passiert auch, dass das Rollo einfach abschaltet und bei 24% stehen bleibt. Dabei ist es egal ob es öffnen oder schließen soll. Die angezeigten Werte sind immer anders.
Ich habe das Skript wegen des eigenartigen Verhaltens in einer weiteren Javaskript-Instanz noch einmal händisch eingegeben, um damit einen Fehler auszuschließen. Das Verhalten ist vollkommen gleich.
Ich habe keine Idee mehr, was da los sein könnte. Könnte es tatsächlich an der neuen Tasmota liegen? Ich möchte kein Downgrade auf 7.1.2 machen, da ich die Schalter dazu auseinander nehmen müsste. Und dummerweise haben die Schalter keine Pins für Rx und Tx. Und ich glaube, ein OTA Downgrade funktioniert nicht...
Kann mir jemand einen Hinweis geben? Eine Idee, wo ich noch schauen könnte. Bin fast soweit, den Broker neu zu installieren. Aber alles andere läuft eben normal.
Kann mir jemand sagen wie ich feststellen kann, ob das Skript in irgendeine Schleife läuft, also vielleicht noch läuft während ich es neu starten will...
@XxJooO
ich bin gerade nur am Handy und kann Dein Blockly nicht importieren.
Schau mal ob Deine stop timeout jeweils so heißen wie sie sollen.
Beim js-adapter Update gab es damit ein "Problem"
Also mal alle stop timeout und stop interval überprüfen.
Edit: das hier meine ich, vielleicht auch Dein Problem ?
Grüß Dich und danke für den Hinweis. Der Ausschnitt aus dem Blockly zeigt, dass die stop-Befehle richtig gesetzt sind. Und ja, leider hatte ich dazu keinen Hinweis gelesen, aber den Fehler schon selber gefunden und korrigiert. Da stand "stop zyklische Ausführung Ist".
Ok, den Link auf github hatte ich interessanterweise auch gelesen. Hatte aber verpennt, meine Skripte danach zu durchsuchen. Und was mich wundert ist, dass die Skripte erst seit zwei Tagen streiken, das issue und die Lösung aber bereits 3 Wochen alt ist... Aber der Hinweis ist schon wichtig, muss tatsächlich noch andere Skripte prüfen...
Leute, mir raucht der Kopf und ich finde den Fehler nicht. Es wird auch immer undurchschaubarer. Z.B. damit, dass während das Skript gar nicht getriggert wurde und zeitlich schon abgelaufen ist, die Variable für die Ist-Position auf einmal weiter zählt. So als würde das Skript im Hintergrund noch weiter laufen. Deshalb auch meine Frage wie ich sehen kann, ob das Skript, obwohl zeitlich beendet, doch noch läuft...
Also, nach meinem Verständnis schläft das Skript, bis es getriggert wird. Hier soll eine Zeitlang ein Schalter an und dann wieder ausgeschaltet werden. Während der An-Phase soll ein DP gezählt werden. Ich erkenne aber, dass die Zeit des laufenden Skripts abgelaufen ist, nach z.B. 30 Sekunden später läuft plötzlich der DP weiter. Das darf er aber ja nur, während das Skript läuft, und dafür muss es getriggert werden. Wurde es aber nicht!!!
nach z.B. 30 Sekunden später läuft plötzlich der DP weiter.
Dann wurde das Intervall wieder gestartet, was nur durch einen Trigger erfolgen kann oder das Intervall war durch Überlastung der CPU unterbrochen und läuft nun weiter. Logge mal alle Trigger-Ereignisse (debug output)
Ok, es lebt... es arbeitet... es hat ein Bewusstsein entwickelt und will mich um den Verstand bringen...
javascript.0 2020-06-14 13:55:28.832 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.oeffnen getriggert: false
javascript.0 2020-06-14 13:55:28.778 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.oeffnen getriggert: true
javascript.0 2020-06-14 13:54:53.836 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.oeffnen getriggert: false
javascript.0 2020-06-14 13:54:53.788 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.oeffnen getriggert: true
javascript.0 2020-06-14 13:54:45.809 info (2413) script.js.Rolladen.Rollladen_Test2: hoch oder runter geändert: undefined
javascript.0 2020-06-14 13:54:31.447 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.schliessen getriggert: false
javascript.0 2020-06-14 13:54:30.336 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.schliessen getriggert: true
javascript.0 2020-06-14 13:54:29.058 info (2413) script.js.Rolladen.Rollladen_Test2: hoch oder runter geändert: undefined
javascript.0 2020-06-14 13:54:29.008 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.schliessen getriggert: false
javascript.0 2020-06-14 13:54:25.059 info (2413) script.js.Rolladen.Rollladen_Test2: Fenster vorne.schliessen getriggert: true
javascript.0 2020-06-14 13:54:25.008 info (2413) script.js.Rolladen.Rollladen_Test2: hoch oder runter geändert: undefined
javascript.0 2020-06-14 13:54:25.002 info (2413) script.js.Rolladen.Rollladen_Test2: Soll-Position geändert: 100
Um 13:54:25.002 wird der Soll Wert von 0 auf 100 gestellt, die Laufzeit müsste 32 Sekunden sein.
Um 13:54:25.059 wird schliessen korrekt getriggert, aber bereits
um 13:54:29.008, also nur nach 4 Sekunden auf false getriggert und das Rollo stoppt.
Die nachfolgenden Trigger kommen, obwohl ich nichts aktiviert, sondern nur beobachtet habe...
Instanz und ioBroker habe ich unterwegs schon zigfach neu gestartet. Habe auch schon neue Instanzen angelegt und versucht, das in einer weiteren auszuführen. Immer gleiches Verhalten...