Rückkanal bei Rolläden

Ich möchte hier meine Umsetzung des Rückkanals für Rollläden vorstellen. Die Qualität dieses Rückkanals ist leider nicht zu vergleichen mit dem der Lampen, wo ich zuerst einen ganzen Scan einer Klemme durchführe und dann mit einem Skript einen php-Code automatisch generiere. Für mich hat es jedoch bis jetzt immer funktioniert. Ich publiziere hier einmal die Situation mit zwei Rolläden und zwei Bereichen. Für 3 Bereiche geht es analog. Für nur Raum Stimmungen und einen einzige Rollladen ist es natürlich wesentlich einfacher.

Für Lamellen Storren könnte man das Skript übernehmen mit entsprechender Anpassung.

Der dS Configurator wurde durchgeführt und die entsprechenden grauen Klemmen sind generiert.

  1. Im Skript unten übergibt man der Variable $R1Po die Positions Variable der vom Configurator generierten Variable, welche im Bereich 1 ist. Ebenso setzt man die Variable $R1R die dS Shutter Instanz, welche der Configurator geniert hatte.

  2. Man kreiert eine Integer Variable mit dem Profil 0 für Stop, 1 für Oeffnen, 2 für Schliessen. Diese ID schreibt man in die Variable $R1. Man kreiert eine Integer Variable mit Werten von 0 bis 255. Diese (positions) Variable ID schreibt man in die Variable $R1Pn.

  3. Man kreiert eine dS Zone Instanz mit diesem Raum in der Farbe Beschattung. Die Scene ID schreibt man in die Variable $Scene.

  4. Kreierte eine Integer Variable. Schreibe die ID in die Variable $Bereich.

Wiederhole 1)-2) für Bereich 2.

Untiges Skript wird ausgelöst, sobald die Variable Scene der dS Zone Instanz aktualisiert wird (es genügt nicht, das Skript nur zu starten, wenn die Variable verändert wird.)


/* *********************************************************************************** Programm Kopf*/
$R1=56015;
$R1R=58895;
$R1Po=18599;
$R1Pn=32400;

$R2=21019;
$R2R=37521;
$R2Po=16452;
$R2Pn=47135;

$Scene=46868;
$Bereich=47381;

$a=GetValue($Scene);
$b=GetValue($Bereich);

/* *********************************************************************************** */
    
 switch (TRUE)
 	{

        case (in_array($a, array(0,19))) : //0=Raum ab;19=Szene 4
			SetValue($R1, 2);
			SetValue($R1Pn, 0);
			SetValue($R2, 2);
			SetValue($R2Pn, 0);
        break;

        case ($a==1): //Bereich 1 ab;
			SetValue($R1, 2);
			SetValue($R1Pn, 0);
        break;
		case ($a==2): //Bereich 2 ab;
			SetValue($R2, 2);
			SetValue($R2Pn, 0);
        break;

    	case (in_array($a, array(5,17,18,65,76))): //5=Raum auf, 17=Szene 2, 18=Szene3, 65=Panik, 76=Feuer;
            SetValue($R1, 1);
			SetValue($R1Pn, 255);
			SetValue($R2, 1);
			SetValue($R2Pn, 255);
        break;
		
    	case ($a==6): //Bereich 1 auf;
            SetValue($R1, 1);
			SetValue($R1Pn, 255);
        break;
		
		case ($a==7): //Bereich 2 auf;
            SetValue($R2, 1);
			SetValue($R2Pn, 255);
        break;

		case ($a==15): //Raum stoppen;
			DS_RequestStatus($R1R);
			SetValue($R1Pn, GetValue($R1Po));
			
			if (GetValue($R1Po) == 0){
				SetValue($R1, 2);
			}
			elseif (GetValue($R1Po) == 255){
				SetValue($R1, 1);
			}
			else {SetValue($R1, 0);
			}	
			
			DS_RequestStatus($R2R);
			SetValue($R2Pn, GetValue($R2Po));
			
			if (GetValue($R2Po) == 0){
				SetValue($R2, 2);
			}
			elseif (GetValue($R2Po) == 255){
				SetValue($R2, 1);
			}
			else {SetValue($R2, 0);
			}	
        break;	
		

		case (in_array($a, array(42,43,52)) or ($a==10 and $b==1) ): //42=Bereich 1 eine Stufe hinunter, 43=Bereich 1 eine Stufe hinunter, 52=Bereich 1 stoppen;
			SetValue($Bereich,1);
			if ($a==10) {IPS_Sleep(10000); }
			elseif (in_array($a, array(11,12,42,43,44,45,46,47,48,49)) ) {IPS_Sleep(4000);}
			DS_RequestStatus($R1R);
			SetValue($R1Pn, GetValue($R1Po));
			
			if (GetValue($R1Po) == 0){
				SetValue($R1, 2);
			}
			elseif (GetValue($R1Po) == 255){
				SetValue($R1, 1);
			}
			else {SetValue($R1, 0);
			}	
		break;	
				
		case (in_array($a, array(44,45,53)) or ($a==10 and $b==2) ): //Bereich 2 stoppen;
			SetValue($Bereich,2);
			if ($a==10) {IPS_Sleep(10000); }
			elseif (in_array($a, array(11,12,42,43,44,45,46,47,48,49)) ) {IPS_Sleep(4000);}
			DS_RequestStatus($R2R);
			SetValue($R2Pn, GetValue($R2Po));
			
			if (GetValue($R2Po) == 0){
				SetValue($R2, 2);
			}
			elseif (GetValue($R2Po) == 255){
				SetValue($R2, 1);
			}
			else {SetValue($R2, 0);
			}		
		break;
		
                 // case kannst soviele anlegen wie Du magst. Wichtig ist immer das break am Ende bzw. vor dem nächsten case.
    }