Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Rollladen: automatisches bzw. manuelles Fahren mit Flag

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.0k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.2k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Rollladen: automatisches bzw. manuelles Fahren mit Flag

Geplant Angeheftet Gesperrt Verschoben Blockly
3 Beiträge 2 Kommentatoren 269 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    mo277
    schrieb am zuletzt editiert von
    #1

    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?
    MartinPM 1 Antwort Letzte Antwort
    0
    • M mo277

      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?
      MartinPM Online
      MartinPM Online
      MartinP
      schrieb am zuletzt editiert von
      #2

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

      Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
      Virtualization : unprivileged lxc container (debian 13) on Proxmox 9.1.5)
      Linux pve 6.17.9-1-pve
      6 GByte RAM für den Container
      Fritzbox 6591 FW 8.20 (Vodafone Leih-Box)
      Remote-Access über Wireguard der Fritzbox

      M 1 Antwort Letzte Antwort
      0
      • MartinPM MartinP

        @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 Offline
        M Offline
        mo277
        schrieb am zuletzt editiert von
        #3

        @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 Antwort Letzte Antwort
        0
        Antworten
        • In einem neuen Thema antworten
        Anmelden zum Antworten
        • Älteste zuerst
        • Neuste zuerst
        • Meiste Stimmen


        Support us

        ioBroker
        Community Adapters
        Donate

        642

        Online

        32.7k

        Benutzer

        82.4k

        Themen

        1.3m

        Beiträge
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
        ioBroker Community 2014-2025
        logo
        • Anmelden

        • Du hast noch kein Konto? Registrieren

        • Anmelden oder registrieren, um zu suchen
        • Erster Beitrag
          Letzter Beitrag
        0
        • Home
        • Aktuell
        • Tags
        • Ungelesen 0
        • Kategorien
        • Unreplied
        • Beliebt
        • GitHub
        • Docu
        • Hilfe