KNX Jalousien mit Automatikbaustein

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Gast

    #31
    Kann ich es auch so einstellen das der Ausgang AQ1 keine Zahlen hinter dem komma anzeigt? Also nur 14 % Jetzt habe ich 14,18%

    Kommentar

    • gwieser
      Smart Home'r
      • 26.08.2015
      • 37

      #32
      Zitat von spacecowboy.21
      Kann ich es auch so einstellen das der Ausgang AQ1 keine Zahlen hinter dem komma anzeigt? Also nur 14 % Jetzt habe ich 14,18%
      Verstehe nicht ganz was Du erreichen willst. AQ1 kannst Du ja so oder so nicht direkt anzeigen, Du musst also entweder über einen Merker oder ähnliches gehen um den aktuellen Wert in der Visu anzuzeigen, und wie das geht ist eh gut beschrieben ("Anzeige - Einheiten" beim Merker).

      Kommentar

      • pioneersteffen
        Smart Home'r
        • 10.12.2016
        • 57

        #33
        Hallo,

        gibt es es zu dem Thema Automatikjalousie mit Pico Skript Steuerung etwas Neues? Ist das von gwieser gepostete Skript noch aktuell oder gibt es eine Weiterentwicklung?

        Wie sind sind eure Erfahrungen mit MDT Aktoren?

        gwieser : Vielen Dank das du uns dein Skript zur Verfügung stellst!

        Vielen Dank für Hilfe.

        Viele Grüße
        Steffen

        Kommentar

        • gwieser
          Smart Home'r
          • 26.08.2015
          • 37

          #34
          Hi,

          ich hänge hier mal die aktuelle Version an. Für die Automatikbeschattung funktioniert es perfekt. Bei manuell verwirrt es mich selbst manchmal weil:
          1) die MDT-Aktoren bei kleinen Änderungen der Lamellenstellungen eine vollständige Öffnung oder Schließung der Lamellen machen und von dort aus dann den Winkel neu einstellen (dient wohl dazu, zu kurze Impulse am Jalousiemotor zu verhindern)
          2) es manchmal vorkommt, dass nach einer Schließfahrt am Ende die Lamellen aufblenden, und man glaubt dass da was nicht stimmt. Tatsächlich ist es aber so, dass Loxone bei einer Schließfahrt IMMER die komplette Fahrzeit vergehen lässt bis der Jalousiebaustein das Signal für ZU beendet, selbst wenn nur mehr wenige Zentimeter nach unten zu fahren waren. Mein Code schickte aber erst bei Statusänderung des Bausteins ein "Lamellen schließen", was dann durchaus eine Minute später sein konnte. Sprich, die Lamellen wurden schlussendlich eh richtig gestellt, aber man hat halt geglaubt da stimmt was nicht weil die Jalousie ganz unten war aber nicht die Lamellen richtig standen. Das habe ich, glaube ich, gelöst. Wenn nicht bitte melden.

          Hier mal der aktuelle Code:
          Code:
          // this PicoC code allows for managing KNX blind actors with absolute positioning
          // capabilities (e.b. MDT Universalaktor, MDT Jalousieaktor) with Loxone's own
          // automatic blinds function blocks (German "Automatikjalousie")
          //
          // This code block can deal with 3 automatic blinds blocks in Loxone Config - you can use just 1,
          // any 2 of the three or all of them at once.
          //
          // Inputs:
          // AI1, AI5, AI9: connect to Q(up) of the automatic blinds block - Up command
          // AI2, AI6, AI10: connect to Q(down) of the automatic blinds block - Down command
          // AI3, AI7, AI11: connect to AQp of the automatic blinds block - absolute position of the blinds (Jalousie)
          // AI4, AI8, AI12: connect to AQl of the automatic blinds block - absolute position of the blends (Lamellen)
          // AI13: "enable" - set this to constat 1 in normal mode, or attach to a toggle switch to 
          // allow for testing on/off
          
          
          // we use an array of values for the variables to loop through the possibly 3 logic input blocks
          float lastPos[3], curPos[3], curBlendPos[3], lastBlendPos[3], curDn[3], curUp[3], lastDeltaPos[3];
          // curStatus: 0..no movements, 1..start moving (long movement), 2..still moving (long movement),
          // 3..stop moving (long movement)
          int curStatus[3];// = 0; 
          int beforePreviousCycleMoving[3];// = 0;
          int previousCycleMoving[3];// = 0;
          int firstLoop = 1;
          int lastCurDn[3];// = 0;
          int lastCurUp[3];// = 0;
          int dirUp[3];// = 0;
          int dirDn[3];// = 0;
          int inDelta[3];// =0;
          //float enabled = getinput(12);
          int specialUpCase[3];
          int i = 0;
          float debug = getinput(12);
          while (TRUE) {
          //    if (enabled) {
                  i = 0;
                  while (i<3) {
                      // get the current position
                      curPos[i] = getinput(i*4+2);
                      curBlendPos[i] = getinput(i*4+3);
                      curDn[i] = getinput(i*4+1);
                      curUp[i] = getinput(i*4+0);
                      // Loxone tends to use not 100% when the position of the lamella
                      // is less then 1.0, so we round it up
                      if (curPos[i]>0.95) {
                          curPos[i] = 1;
                      }
                      if (firstLoop==1) {
                          // this is the first run, so make sure that the blends
                          // are aligned with Loxone
                          if (debug!=0) printf("%d: 0-firstLoop", i);
                          if (debug!=0) printf("%d: 0-setoutput(%d, %f)", i, (i*4+0), (curPos[i]*100));
                          setoutput(i*4+0, curPos[i]*100);
                          if (debug!=0) printf("%d: 0-setoutput(%d, %f)", i, (i*4+1), (curBlendPos[i]*100));
                          setoutput(i*4+1, curBlendPos[i]*100);
                          lastPos[i] = curPos[i];
                          lastDeltaPos[i] = curPos[i];
                          lastBlendPos[i] = curBlendPos[i];
                      }
          
          
          //            if (curPos[i] != lastPos[i]) {
          //                curMoving[i] = 1;
          //            } else {
          //                curMoving[i] = 0;
          //            }
                      // detect in which state we are
                      if (curDn[i]==1) {
                          if (lastCurDn[i]==0) {
                              // go down
                              curStatus[i] = 1;
                              dirDn[i] = 1;
                              lastCurDn[i] = 1;
                          } else {
                              curStatus[i] = 2;
                          }
                      } else {
                          if (lastCurDn[i]==1) {
                              lastCurDn[i]=0;
                              curStatus[i] = 3;
                          } else {
                              // do nothing
                          }
                      }
                      if (curUp[i]==1) {
                          if (lastCurUp[i]==0) {
                              // go up
                              curStatus[i] = 1;
                              dirUp[i] = 1;
                              lastCurUp[i] = 1;        
                          } else {
                              // adding a correction for "Up"
                              if (curPos[i]==0) {
                                  if (specialUpCase[i]==0) {
                                      curBlendPos[i] = 0;
                                      curPos[i] = 0;
                                      curStatus[i]=3;
                                      specialUpCase[i]=1;
                                  }
                                  //setoutput(0,0);
                                  //setOutput(1, 0);
                              } else {
                                  curStatus[i] = 2;
                              }
                          }
                      } else {
                          if(lastCurUp[i]==1) {
                              if (specialUpCase[i]==1) {
                                  lastCurUp[i]=0;
                                  specialUpCase[i]=0;
                              } else {
                                  lastCurUp[i]=0;
                                  curStatus[i] = 3;
                              }
                          } else {
                              // do nothing
                          }
                      }
          
                      switch(curStatus[i]) {
                          case 1: 
                              if (debug!=0) printf("%d: 1-starting moving, down is %d, up is %d", i , dirDn[i] , dirUp[i]);
                              // in case we started moving, we need to identify the direction
                              if (dirUp[i]==1) {
                                  // we go up, so we send a full up first
                                  //direction=0;
          //                        setoutput(i*4+1, 0);
                                  if (debug!=0) printf("%d: 1-setoutput(%d, %f)", i, (i*4+0), 0);
                                  setoutput(i*4+0, 0);
                              }
                              if (dirDn[i]==1) {
                                  // we go down, so we send a full down first
                                  //direction=1;
          //                        setoutput(i*4+1, 100);
                                  if (debug!=0) printf("%d: 1-setoutput(%d, %f)", i, (i*4+0), 100);
                                  setoutput(i*4+0, 100);
                              }
                              inDelta[i]=1;
                              break;
                          case 2: 
                              if (debug!=0) printf("%d: 2-still moving, delta is %f", i, lastDeltaPos[i] - curPos[i]);
                              if (inDelta[i]==1) {
                                  float curDelta = lastDeltaPos[i] - curPos[i];
          
                                  if (curDelta < -0.1) {
                                      if (debug!=0) printf("%d: 2-setoutput(%d, %f)", i, (i*4+1), 100);
                                      setoutput(i*4+1, 100);
                                      inDelta[i]=0;
                                  }
                                  if (curDelta > 0.1) {
                                      if (debug!=0) printf("%d: 2-setoutput(%d, %f)", i, (i*4+1), 0);
                                      setoutput(i*4+1, 0);
                                      inDelta[i]=0;
                                  }
                              }
                              break;
                          case 3: 
                              if (debug!=0) printf("%d: 3-stopping", i);
                              // stop moving, send final positions
                              // Loxone tends to use not 100% when the position of the lamella
                              // is less then 1.0, so we round it up
                              if (curPos[i]>0.95) {
                                  curPos[i] = 1;
                              }
                              if (dirDn[i]==1) {
                                  if (debug!=0) printf("%d: 3-setoutput(%df, %f)", i, (i*4+0), (curPos[i]*100));
                                  setoutput(i*4+0, curPos[i]*100);
                                  if (debug!=0) printf("%d: 3-setoutput(%d, %f)", i, (i*4+1), (curBlendPos[i]*100));
                                  setoutput(i*4+1, curBlendPos[i]*100);
                              }
                              if (dirUp[i]==1) {
                                  if (debug!=0) printf("%d: 3-setoutput(%df, %f)", i, (i*4+0), (curPos[i]*100));
                                  setoutput(i*4+0, curPos[i]*100);
                                  if (debug!=0) printf("%d: 3-setoutput(%d, %f)", i, (i*4+1), (curBlendPos[i]*100));
                                  setoutput(i*4+1, curBlendPos[i]*100);
                              }
          
                              lastBlendPos[i] = curBlendPos[i];
                              lastPos[i] = curPos[i];
                              lastDeltaPos[i] = curPos[i];
          
                              curStatus[i] = 0;
                              dirUp[i] = 0;
                              dirDn[i] = 0;
                              break;
                          default: 
                              if (curBlendPos[i] != lastBlendPos[i]) {
                                  if (debug!=0) printf("%d: DEFAULT-setoutput(%d, %f)", i, (i*4+1), (curBlendPos[i]*100));
                                  setoutput(i*4+1, curBlendPos[i] * 100);
                              }
                      }
                      lastPos[i] = curPos[i];
                      lastBlendPos[i] = curBlendPos[i];
                      i++;
                  }
                  if (firstLoop==1) {
                      firstLoop = 0;
                  }
          //    }
          //    enabled = getinput(12);
              sleep(100);
          }

          Kommentar

          • gwieser
            Smart Home'r
            • 26.08.2015
            • 37

            #35
            PS: gegen die MDT-Aktoren könnte ich nichts sagen, und hab auch nichts gehört was negativ wäre. Probleme macht in diesem Setup immer nur Loxone (KNX-Timing, Bus-Anbindung für ETS geht oft nur mit Trick, etc.).

            Kommentar

            • AndyH
              Smart Home'r
              • 11.11.2016
              • 35

              #36
              Hier noch mein Lösungsansatz um sowohl KNX-seitig eine Ansteuerung zu ermöglichen (über Kurzfahrt/Langfahrt), als auch über Loxone (Positionsfahrt).

              Kommentar

              Lädt...