Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Markisen Steuerung

    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

    Markisen Steuerung

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

      Hallo habe meine Tahoma Markisen über Iobroker gesteuert, leider klappt das mit dieser Version nur Suboptimal.

      /*****Steuerung Markisen Wintergarten *****************************************
      **    März 2022
      **    TAHOMA
      **    (0 = OBEN), (100 = UNTEN)
      **    erstellt: 23.03.22
      **    geändert: 21.04.22
      ********************************************************************************/
      
      var logging = true;
      const idAdapt = "tahoma.0.info.connection"
      const idRolloL = 'tahoma.0.devices.Markisse_Links.states.core:DeploymentState'
      const idRolloR = 'tahoma.0.devices.Markisse_Rechts.states.core:DeploymentState'
      const idTemp = 'hm-rpc.0.OEQ0128317.1.TEMPERATURE' //Sensor Wintergarten
      const idLichtsensor = 'hm-rpc.2.00185BE98B3FCA.1.ILLUMINATION' //Wetterstation
      const idStd = "javascript.0.Garten.Markisse.R_stunde"
      const idMin = "javascript.0.Garten.Markisse.R_minute"
      const idSW_Temp = 'javascript.0.Garten.Markisse.SW_Temp'; // Auslösewert Temp
      const idLux = 'javascript.0.Garten.Markisse.SW_Lux'; // Auslösewert Lux
      const idLuxEinf = "javascript.0.Garten.Markisse.SW_LuxEinF"
      const id_Auslöser = "0_userdata.0.Garten.Tahoma.Markise.Auslöser"
      
      const idRegen = 'hm-rpc.2.00185BE98B3FCA.1.RAINING'  //Wetterstation
      const id_Anw = "0_userdata.0.Haus.AW.AW"
      const idWind = 'hm-rpc.2.00185BE98B3FCA.1.WIND_SPEED';  //Wetterstation
      const idHand = 'javascript.0.Garten.Markisse.Hand'
      
      const idMLStatus = "0_userdata.0.Garten.Tahoma.Markise.StatusL";
      const idMRStatus = "0_userdata.0.Garten.Tahoma.Markise.StatusR";
      
      const id_MarkisseEXEEinf = "tahoma.0.actionGroups.Markisse_Einfahren.commands.execute"
      const id_MarkisseEXEAusf = "tahoma.0.actionGroups.Markisse_Ausfahren.commands.execute"
      const idEinf = "0_userdata.0.Garten.Tahoma.Markise.Einf"
      const idAusf = "0_userdata.0.Garten.Tahoma.Markise.Ausf"
      
      const js = 'system.adapter.javascript.3'
      var Std = getState(idStd).val
      var Min = getState(idMin).val
      var SW_Lux = getState(idLux).val;
      var SW_LuxEinf = getState(idLuxEinf).val;
      var grund;
      var text;
      
      
      //******EINFAHREN***************************************************************************
      //Uhrzeit
      schedule({ hour: Std, minute: Min }, RunDailyEinf);
      function RunDailyEinf() {
          if (getState(idHand).val == false) {
              setState(id_Auslöser, "Uhrzeit");
              setState(idEinf, true);
              setState(idAusf, false);
          }
      };
      //Regen
      on({ id: idRegen, val: true }, function (dp) {
          if (getState(id_Auslöser).val != "Regen") {
              setState(id_Auslöser, "Regen");
              setState(idEinf, true);
              setState(idAusf, false);
          }
      });
      //LUX
      on({ id: idLichtsensor, valLe: SW_LuxEinf, oldValGt: SW_LuxEinf }, function (dp) {
          log("1.Trigger gesetzt");
          if (getState(id_Auslöser).val != "Bewölkung/Helligkeit") {
              log("2.Kommando Einfahren gesendet");
              setState(id_Auslöser, "Bewölkung/Helligkeit");
              setState(idEinf, true); //-->Zeile 109
              setState(idAusf, false); //-->Zeile 113
          }
      
      });
      
      //******AUSFAHREN**************************************************************************** 
      on({ id: idLichtsensor, valGt: SW_Lux, oldValLe: SW_Lux }, function (dp) {
          log("1.Trigger gesetzt");
          if ((getState(id_Anw).val == true) && (getState(idTemp).val >= (getState(idSW_Temp).val))) {
              log("2.Bedingung Licht/Temp erfüllt");
              //if (compareTime('08:45', '16:00', 'between') && (getState(idRegen).val == false) && (getState(idHand).val == false)) {
              if (compareTime('08:45', '16:00', 'between') && (getState(idRegen).val == false)) {
                  log("3.Ausfahrbedingungen OK");
                  if (getState(id_Auslöser).val != "Sonnenschutz") {
                      log("4.Kommando Ausfahren gesendet");
                      setState(id_Auslöser, "Sonnenschutz");
                      setState(idEinf, false) //-->Zeile 109
                      setState(idAusf, true) //-->Zeile 113
                  }
              }
          }
      });
      //******************************************************************************************
      //Änderung feststellen
      
      schedule("* * * * *", function () {
          if (getState(idRolloL).val > 0) {
              setState(idMLStatus, "Ausgef.")
          } else {
              if (getState(idRolloL).val == 0) {
                  setState(idMLStatus, "Eingef.")
              }
          }
          if (getState(idRolloR).val > 0) {
              setState(idMRStatus, "Ausgef.")
          } else {
              if (getState(idRolloR).val == 0) {
                  setState(idMRStatus, "Eingef.")
              }
          }
      });
      
      on({ id: idEinf, val: true }, function (dp) {  //<--Zeile 68
          setState(id_MarkisseEXEEinf, true);
          setStateDelayed(id_MarkisseEXEEinf, false, 52000);
      });
      on({ id: idAusf, val: true }, function (dp) {  //<--Zeile 84
          setState(id_MarkisseEXEAusf, true);
          setStateDelayed(id_MarkisseEXEAusf, false, 52000);
      });
      var timer = null;
      var triggermarkB = [id_MarkisseEXEEinf, id_MarkisseEXEAusf];
      on({ id: triggermarkB, change: 'ne' }, function (dp) {
          if ((getState(id_MarkisseEXEEinf).val == true) || (getState(id_MarkisseEXEAusf).val == true)) {
              if (logging && !timer) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253938149' });
              timer = setTimeout(function () {
                  timer = null;
                  text = '\ud83c\udf1e *Markisse Status:*\n  Links: ' + getState(idRolloL).val + '\n' + "  Rechts: " + getState(idRolloR).val + '\n' + getState(id_Auslöser).val
                  createEventlog("Markisse Bewegung", text)
                  log(text);
              }, 60000);
          }
      });
      
      on({ time: { hour: 23, minute: 59 } }, function () {
          setState(id_Auslöser, "");
          setState(idHand, false);
          setState(idEinf, "");
          setState(idAusf, "");
      });
      

      Würde mich über Verbesserungsvorschläge freuen.
      Michael

      arteck paul53 2 Replies Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @michihorn last edited by

        @michihorn sagte in Markisen Steuerung:

        leider klappt das mit dieser Version nur Suboptimal

        soll heissen.. was geht den nicht ??

        M 1 Reply Last reply Reply Quote 0
        • M
          michihorn @arteck last edited by

          @arteck Ab Zeile 119 ist ein Fehler, dass Script sendet mir die Zustände der Markisen per Whatsapp, beim Einfahren werden offenbar die Zustände zu früh abgegriffen so das 46% angezeigt wird. Endzustand sollte 0% sein
          einfahren.png
          Beim Ausfahren sollte die Whatsapp 100% melden
          ausfahren.png

          Irgendwie komme ich gerade nicht weiter
          Michael

          paul53 2 Replies Last reply Reply Quote 0
          • paul53
            paul53 @michihorn last edited by paul53

            @michihorn
            Was die Warnungen betrifft: Im Tab "Protokolle" finden sich weitere Informationen zu den Warnungen um 12:19 Uhr und 12:23 Uhr.
            Sind die Statusdatenpunkte vom Typ "string"?

            @michihorn sagte in Markisen Steuerung:
            Ganz unten:

            setState(idEinf, ""); 
            setState(idAusf, "");
            

            Man sollte keinen String in Datenpunkte vom Typ "boolean" schreiben!
            Würde dafür nicht ein Datenpunkt "Ausfahren" genügen (false bedeutet "einfahren")?

            @michihorn sagte in Markisen Steuerung:

            46% angezeigt wird. Endzustand sollte 0% sein

            Eine Minute nach Start der Bewegung kann der Endzustand noch nicht erreicht sein.

            Die Uhrzeit für das Einfahren kann während des laufenden Skripts nicht verändert werden.

            M 2 Replies Last reply Reply Quote 0
            • M
              michihorn @paul53 last edited by

              @paul53 Den Fehler bzgl. der Warnmeldungen habe ich gefunden, danke für den Tip.
              Zum Thema Endstand der Markise habe ich 52 Sekunden ermittelt

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @michihorn last edited by paul53

                @michihorn sagte: Zum Thema Endstand der Markise habe ich 52 Sekunden ermittelt

                Dann solltest Du Zeile 129 entsprechend ändern oder besser in Zeile 122 auf false prüfen, wobei dann die Verzögerung überflüssig ist.

                EDIT:

                const triggermarkB = [id_MarkisseEXEEinf, id_MarkisseEXEAusf];
                on({id: triggermarkB, change: 'ne', val: false}, function() {
                    if(logging) {
                        let text = '\ud83c\udf1e *Markisse Status:*\n  Links: ' + getState(idRolloL).val + '\n' + "  Rechts: " + getState(idRolloR).val + '\n' + getState(id_Auslöser).val;
                        sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253938149' });
                        createEventlog("Markisse Bewegung", text);
                        log(text);
                    }
                });
                
                M 1 Reply Last reply Reply Quote 0
                • M
                  michihorn @paul53 last edited by

                  Die Uhrzeit für das Einfahren kann während des laufenden Skripts nicht verändert werden.
                  Ok das habe ich jetzt mal so gelöst:

                  //Uhrzeit
                  const OffTime = { hour: getState(idStd).val, minute: getState(idMin).val };
                  schedule(OffTime, RunDailyEinf);
                  function RunDailyEinf() {
                      if (getState(idHand).val == false) {
                          setState(id_Auslöser, "Uhrzeit");
                          setState(idEinf, true);
                          setState(idAusf, false);
                      }
                  };
                  
                  paul53 1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 @michihorn last edited by paul53

                    @michihorn sagte: das habe ich jetzt mal so gelöst:

                    Damit bleibt es dabei, dass die Uhrzeit konstant bleibt. So funktioniert es mit Änderung der Uhrzeit:

                    function RunDailyEinf() {
                        if (!getState(idHand).val) {
                            setState(id_Auslöser, "Uhrzeit");
                            setState(idEinf, true);
                            setState(idAusf, false);
                        }
                    }
                    //Uhrzeit
                    var OffTime = schedule(getState(idMin).val + ' ' + getState(idStd).val + ' * * *', RunDailyEinf);
                    on([idMin, idStd], function() {
                        clearSchedule(OffTime);
                        OffTime = schedule(getState(idMin).val + ' ' + getState(idStd).val + ' * * *', RunDailyEinf);
                    });
                    
                    M 1 Reply Last reply Reply Quote 0
                    • M
                      michihorn @paul53 last edited by

                      @paul53 Wie kann ich das ändern?

                      paul53 1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @michihorn last edited by

                        @michihorn sagte: Wie kann ich das ändern?

                        Was ändern?

                        M 1 Reply Last reply Reply Quote 0
                        • M
                          michihorn @paul53 last edited by

                          @paul53 das die Uhrzeit auch im laufenden Programm geändert werden kann

                          paul53 1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 @michihorn last edited by

                            @michihorn sagte: die Uhrzeit auch im laufenden Programm geändert werden kann

                            Das habe ich hier gezeigt.

                            1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @michihorn last edited by paul53

                              @michihorn sagte: Würde mich über Verbesserungsvorschläge freuen.

                              /*****Steuerung Markisen Wintergarten *****************************************/
                              
                               
                              const logging = true;
                              const idAdapt = "tahoma.0.info.connection"
                              const idRolloL = 'tahoma.0.devices.Markisse_Links.states.core:DeploymentState'
                              const idRolloR = 'tahoma.0.devices.Markisse_Rechts.states.core:DeploymentState'
                              const idTemp = 'hm-rpc.0.OEQ0128317.1.TEMPERATURE' //Sensor Wintergarten
                              const idLichtsensor = 'hm-rpc.2.00185BE98B3FCA.1.ILLUMINATION' //Wetterstation
                              const idStd = "javascript.0.Garten.Markisse.R_stunde"
                              const idMin = "javascript.0.Garten.Markisse.R_minute"
                              const idSW_Temp = 'javascript.0.Garten.Markisse.SW_Temp'; // Auslösewert Temp
                              const idLux = 'javascript.0.Garten.Markisse.SW_Lux'; // Auslösewert Lux
                              const idLuxEinf = "javascript.0.Garten.Markisse.SW_LuxEinF"
                              const id_Auslöser = "0_userdata.0.Garten.Tahoma.Markise.Auslöser"
                               
                              const idRegen = 'hm-rpc.2.00185BE98B3FCA.1.RAINING'  //Wetterstation
                              const id_Anw = "0_userdata.0.Haus.AW.AW"
                              const idWind = 'hm-rpc.2.00185BE98B3FCA.1.WIND_SPEED';  //Wetterstation
                              const idHand = 'javascript.0.Garten.Markisse.Hand'
                               
                              const idMLStatus = "0_userdata.0.Garten.Tahoma.Markise.StatusL";
                              const idMRStatus = "0_userdata.0.Garten.Tahoma.Markise.StatusR";
                               
                              const id_MarkisseEXEEinf = "tahoma.0.actionGroups.Markisse_Einfahren.commands.execute"
                              const id_MarkisseEXEAusf = "tahoma.0.actionGroups.Markisse_Ausfahren.commands.execute"
                              // const idEinf = "0_userdata.0.Garten.Tahoma.Markise.Einf"
                              const idAusf = "0_userdata.0.Garten.Tahoma.Markise.Ausf"
                               
                              // const js = 'system.adapter.javascript.3'
                              var SW_Lux = getState(idLux).val;
                              var SW_LuxEinf = getState(idLuxEinf).val;
                              // var grund;
                               
                              //******EINFAHREN***************************************************************************
                              
                              function RunDailyEinf() {
                                  if (!getState(idHand).val) {
                                      setState(id_Auslöser, "Uhrzeit", true);
                                      setState(idAusf, false, true);
                                  }
                              }
                              //Uhrzeit
                              var OffTime = schedule(getState(idMin).val + ' ' + getState(idStd).val + ' * * *', RunDailyEinf);
                              on([idMin, idStd], function() {
                                  clearSchedule(OffTime);
                                  OffTime = schedule(getState(idMin).val + ' ' + getState(idStd).val + ' * * *', RunDailyEinf);
                              });
                              
                              //Regen
                              on({id: idRegen, val: true}, function() {
                                  if (getState(id_Auslöser).val != "Regen") {
                                      setState(id_Auslöser, "Regen", true);
                                      setState(idAusf, false, true);
                                  }
                              });
                              //LUX
                              on({ id: idLichtsensor, valLe: SW_LuxEinf, oldValGt: SW_LuxEinf }, function() {
                                  log("1.Trigger gesetzt");
                                  if (getState(id_Auslöser).val != "Bewölkung/Helligkeit") {
                                      log("2.Kommando Einfahren gesendet");
                                      setState(id_Auslöser, "Bewölkung/Helligkeit", true);
                                      setState(idAusf, false, true); //-->Zeile 90
                                  }
                              });
                               
                              //******AUSFAHREN**************************************************************************** 
                              on({id: idLichtsensor, valGt: SW_Lux, oldValLe: SW_Lux}, function() {
                                  log("1.Trigger gesetzt");
                                  if (getState(id_Anw).val && getState(idTemp).val >= getState(idSW_Temp).val) {
                                      log("2.Bedingung Licht/Temp erfüllt");
                                      //if (compareTime('08:45', '16:00', 'between') && (getState(idRegen).val == false) && (getState(idHand).val == false)) {
                                      if (compareTime('08:45', '16:00', 'between') && !getState(idRegen).val) {
                                          log("3.Ausfahrbedingungen OK");
                                          if (getState(id_Auslöser).val != "Sonnenschutz") {
                                              log("4.Kommando Ausfahren gesendet");
                                              setState(id_Auslöser, "Sonnenschutz", true);
                                              setState(idAusf, true, true) //-->Zeile 90
                                          }
                                      }
                                  }
                              });
                              
                              //Änderung feststellen
                              schedule("* * * * *", function () {
                                  setState(idMLStatus, getState(idRolloL).val > 0 ? 'Ausgef.' : 'Eingef.', true);
                                  setState(idMRStatus, getState(idRolloR).val > 0 ? 'Ausgef.' : 'Eingef.', true);
                              });
                               
                              on(idAusf, function (dp) {
                                  if(dp.state.val) {
                                      setState(id_MarkisseEXEAusf, true);
                                      setStateDelayed(id_MarkisseEXEAusf, false, 52000);
                                  } else {
                                      setState(id_MarkisseEXEEinf, true);
                                      setStateDelayed(id_MarkisseEXEEinf, false, 52000);
                                  }
                              });
                              
                              const triggermarkB = [id_MarkisseEXEEinf, id_MarkisseEXEAusf];
                              on({id: triggermarkB, change: 'ne', val: false}, function() {
                                  setTimeout(function() {
                                      let text = '\ud83c\udf1e *Markise Status:*\n  Links: ' + getState(idRolloL).val + '\n' + "  Rechts: " + getState(idRolloR).val + '\n' + getState(id_Auslöser).val;
                                      if(logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253938149' });
                                      createEventlog("Markise Status", text);
                                      log(text);
                                  }, 20000); // 20 s Abfrageintervall
                              });
                               
                              schedule('0 0 * * *', function() {
                                  setState(id_Auslöser, "", true);
                                  setState(idHand, false, true);
                              });
                              

                              createEventlog() ist eine globale Funktion?

                              M 1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 @michihorn last edited by paul53

                                @michihorn sagte: die Zustände zu früh abgegriffen so das 46% angezeigt wird.

                                Der Adapter arbeitet mit Polling: Wenn als Abfrageintervall 20000 ms eingestellt sind, kann sich die Rückmeldung um bis zu 20 s verzögern.

                                1 Reply Last reply Reply Quote 0
                                • M
                                  michihorn @paul53 last edited by

                                  @paul53 JA

                                  1 Reply Last reply Reply Quote 0
                                  • M
                                    michihorn @paul53 last edited by

                                    @paul53 sagte in Markisen Steuerung:

                                    @michihorn sagte: Zum Thema Endstand der Markise habe ich 52 Sekunden ermittelt

                                    Dann solltest Du Zeile 129 entsprechend ändern oder besser in Zeile 122 auf false prüfen, wobei dann die Verzögerung überflüssig ist.

                                    EDIT:

                                    const triggermarkB = [id_MarkisseEXEEinf, id_MarkisseEXEAusf];
                                    on({id: triggermarkB, change: 'ne', val: false}, function() {
                                        if(logging) {
                                            let text = '\ud83c\udf1e *Markisse Status:*\n  Links: ' + getState(idRolloL).val + '\n' + "  Rechts: " + getState(idRolloR).val + '\n' + getState(id_Auslöser).val;
                                            sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253938149' });
                                            createEventlog("Markisse Bewegung", text);
                                            log(text);
                                        }
                                    });
                                    

                                    Bei dieser Änderung wird sofort ohne Wartezeit der Status aus Tahoma abgegriffen. Gerade ist die Markise eingefahren sollte dann 0% anzeigen, Anzeige war aber 100%

                                    paul53 1 Reply Last reply Reply Quote 0
                                    • paul53
                                      paul53 @michihorn last edited by paul53

                                      @michihorn sagte: Bei dieser Änderung wird sofort ohne Wartezeit der Status aus Tahoma abgegriffen.

                                      Ich habe im Skript oben noch eine Verzögerung von 20 s ergänzt, um das Polling zu berücksichtigen. Außerdem wird jetzt auf false, also erst 52 s später als ursprünglich getriggert.

                                      const triggermarkB = [id_MarkisseEXEEinf, id_MarkisseEXEAusf];
                                      on({id: triggermarkB, change: 'ne', val: false}, function() {
                                          setTimeout(function() {
                                              let text = '\ud83c\udf1e *Markise Status:*\n  Links: ' + getState(idRolloL).val + '\n' + "  Rechts: " + getState(idRolloR).val + '\n' + getState(id_Auslöser).val;
                                              if(logging) sendTo('whatsapp-cmb.0', 'send', { text, phone: '+4915253938149' });
                                              createEventlog("Markise Status", text);
                                              log(text);
                                          }, 20000); // 20 s Abfrageintervall
                                      });
                                      

                                      Übrigens: Markise schreibt man mit einem "s".

                                      M 1 Reply Last reply Reply Quote 0
                                      • M
                                        michihorn @paul53 last edited by

                                        Übrigens: Markise schreibt man mit einem "s".
                                        Danke du hast natürlich Recht. 👍

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        929
                                        Online

                                        31.9k
                                        Users

                                        80.2k
                                        Topics

                                        1.3m
                                        Posts

                                        javascript
                                        3
                                        18
                                        467
                                        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