KNX Jalousien mit Automatikbaustein
Einklappen
X
-
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
-
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
SteffenKommentar
-
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
-
Hier noch mein Lösungsansatz um sowohl KNX-seitig eine Ansteuerung zu ermöglichen (über Kurzfahrt/Langfahrt), als auch über Loxone (Positionsfahrt).Kommentar
Kommentar