Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Rollladen: automatisches bzw. manuelles Fahren mit Flag

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Rollladen: automatisches bzw. manuelles Fahren mit Flag

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      mo277 last edited by

      73589e86-36ba-4038-9e06-30af4574ba0c-grafik.png 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:

      Skript ROLLLADENAUTOMATIK.jpg

      Funktion.jpg

      Skript MANUELL.jpg

      Meine Fragen:

      • Debug zeigt, dass die Variable funktioniert. Warum funktioniert mein Ansatz nicht?

      Debug.jpg

      JSON.jpg

      • Gibt es einen alternativen Ansatz?
      MartinP 1 Reply Last reply Reply Quote 0
      • MartinP
        MartinP @mo277 last edited by

        @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.

        M 1 Reply Last reply Reply Quote 0
        • M
          mo277 @MartinP last edited by

          @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!

          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          380
          Online

          31.9k
          Users

          80.2k
          Topics

          1.3m
          Posts

          2
          3
          165
          Loading More Posts
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes
          Reply
          • Reply as topic
          Log in to reply
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
          The ioBroker Community 2014-2023
          logo