NEWS
Rollladen: automatisches bzw. manuelles Fahren mit Flag
-
Hallo,
ich habe Rollladenaktoren von HmIP und steuere die Rollladen automatisch über Blockly:
- Skript "ROLLLADENAUTOMATIK" morgens/abends in jeweils 2 Stufen (z. B. morgens erst etwas auf und später komplett auf)
- Beschattungsautomatik
- Automatik an heißen Tagen aufgrund der Wettervorhersage
Optional kann ich die Rollläden natürlich manuell fahren, also über Alexa, die Wandtaster oder über AIO Creator Neo (Tablet, Smartphone) bzw. VIS (Laptop).
Einige Informationen für den Betrieb habe ich in einem JSON-Datenpunkt für alle Rollläden hinterlegt, und dort möchte ich auch hinterlegen, aus welchem Grund die einzelnen Rollläden zuletzt gefahren sind. Das ist bei den o. g. Automatiken einfach. Bei den manuellen Gründen ist es egal, worüber ich genau (Alexa, Taster etc.) gesteuert habe. Wichtig ist mir nur, dass ich manuell eingegriffen habe.
Für diesen Zweck habe ich ein Script "MANUELLE BEDIENUNG", dass Änderungen auf Level3 (Level Istzustand, nur lesen) der HmIP-Aktoren reagiert. Und da die genannten Automatiken auch diese Datenpunkte ändern, arbeite ich mit einer Variablen als Flag "flag_AutoRoll", die das steuern soll:
-
Wenn die Steuerung der Rollladen über eine der genannten Automatiken geschieht, steht dieses Flag auf wahr, in dem JSON-DP wird für jeden gefahrenen Rollladen entweder 'Auto', 'Sonne' oder 'Hitze' hinterlegt, und anschließend wird das Flag wieder auf falsch gesetzt.
-
Wenn die Automatiken nicht aktiv sind und das Flag somit auf falsch steht, soll beim Erkennen einer Bewegung 'manuell' in den JSON-DP geschrieben werden.
Mein Problem: wenn ich die JSON-Tabelle beim automatischen Fahren beobachte, wird erwartungsgemäß die letzte Änderung dokumentiert, allerdings kommt kurz danach trotz dem Flag = false ein M für manuell.
Hier ein auf das Wesentliche reduziertes Beispiel mit nur einem Rollladen:
var p_Modus, p_Level, p_Lage, flag_AutoRoll, js_Roll_Status; // Die Funktion fährt die Rollladen. Im Beispiel nur ein // Rollladen, ansonsten als Schleife für 10 Rollladen. Die // Variablen p_Modus und p_Lage haben im Beispiel keine Funktion. async function f_FahreRoll(p_Modus, p_Level, p_Lage) { // JSON laden und in Objekt schreiben js_Roll_Status = (() => { try { return JSON.parse(getState('0_userdata.0.Variablen.Beschattung.DP_Rolladen.v_BS_JSON_Roll_Status').val); } catch (e) { return {}; }})(); // flag auf true setzen flag_AutoRoll = true; console.info(('Funktion f_FahreRoll2 Start: ' + String(flag_AutoRoll))); // Rollladen fahren setStateDelayed((['hm-rpc.1.','00111D899D849F','.4.LEVEL'].join('')), { val: p_Level, ack: false }, parseInt(((0) || '').toString(), 10), false); // Modus in den Roll_Status schreiben ((obj) => { if (typeof obj === 'object') { obj['Modus'] = 'Auto'; } })((js_Roll_Status[2])); // Objekt Roll-Status in DP schreiben setState('0_userdata.0.Variablen.Beschattung.DP_Rolladen.v_BS_JSON_Roll_Status' /* v_BS_JSON_Roll_Status */, JSON.stringify(js_Roll_Status)); // flag auf false setzen flag_AutoRoll = false; console.info(('Funktion f_FahreRoll2 Stop: ' + String(flag_AutoRoll))); } // MANUELLE BEDIENUNG: Tasten, Apps, VIS, Alexa on({ id: [].concat(['hm-rpc.1.00111D899D849F.3.LEVEL']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; // DEBUG: manuell, direkt nach Trigger console.info(('Skript Manuell, direkt nach Trigger ' + String(flag_AutoRoll))); // JSON aus DP lesen und in Variable schreiben js_Roll_Status = (() => { try { return JSON.parse(getState('0_userdata.0.Variablen.Beschattung.DP_Rolladen.v_BS_JSON_Roll_Status').val); } catch (e) { return {}; }})(); // Element in JSON auf M setzen if (flag_AutoRoll != true) { ((obj) => { if (typeof obj === 'object') { obj['Modus'] = 'manuell'; } })((js_Roll_Status[2])); } // JSON aus Variable zurückschreiben in DP setState('0_userdata.0.Variablen.Beschattung.DP_Rolladen.v_BS_JSON_Roll_Status' /* v_BS_JSON_Roll_Status */, JSON.stringify(js_Roll_Status)); }); // ROLLLADENAUTOMATIK flag_AutoRoll = false; // Fahre Rolladen morgens/abends scheduleById('0_userdata.0.Variablen.Beschattung.DP_Rolladen.v_BS_Roll_Morgen1' /* v_BS_Roll_Morgen1 */, async () => { await f_FahreRoll('m_Morgen1', 100, ''); });
Als Screenshots:
Meine Fragen:
- Debug zeigt, dass die Variable funktioniert. Warum funktioniert mein Ansatz nicht?
- Gibt es einen alternativen Ansatz?
-
@mo277 Javascript ist nicht Multithreaded. Da das Schalten des Flags Automatik synchron erfolgt, wird es bereits vor dem Erreichen des Endzustandes wieder gelöscht.
Das Flag Automatik darf erst bei Erreichen des angesteuerten Zielzustandes gelöscht werden. -
@martinp Okay, verstanden.
Dann werde ich das Flag von bool auf num umbauen und als Zähler in meiner Schleife für die 10 Rollladen einsetzen.
Die einzelnen Rollläden laufen nur, wenn bestimmte Bedingungen erfüllt sind, und je angestoßenem Rollladen zähle ich das Flag hoch, und sobald auf Kanal 3 die Istgröße gleich der Sollgröße ist, ziehe ich das Flag wieder runter.
Am Ende muss es wieder auf 0 stehen, und dann geht´s weiter ...
Besten Dank für den Hinweis!