IPSShadowing - eine Beschattungssteuerung

Hallo Maze,

ok, dann bin ich ja zumindest nicht alleine :slight_smile:

Geh in das Menü das die Fahrzeiten für die einzelnen Schritte berechnet und pass die Berechnung an, in dem du zB für das Schließen von 0 auf 50% So viele Sekunden abziehst, wie der Rollladen von unten bist zu Lamellen zu braucht.

Welches Menü meinst du? Wo kann ich hier Sekunden abziehen? Kannst du mir bitte ein wenig auf die Sprünge helfen. Danke!

Grüße
Stephan

Denke mal dass die Zeiten in der config falsch hinterlegt sind, deswegen passt das nicht.

Gruß
Bruno

@Powerfreddy:
Meine Zeiten sind (auch) korrekt hinterlegt und bei mir fährt er auch auf ca. 75% zu bei 50% Auswahl.

Liegt wie beschrieben daran, das 50% da Zeit die der Rollladen braucht bis er ganz zu ist, auch ca. 75% der Abwärtsbewegung ausmachen, da dass einzelne Glieder zusammenschieben auch dauert.

@Stephan:
Ich kann dir gerade nicht auswendig sagen im welchem Skript das steht. Denke ich komm morgen Abend dazu.

Jetzt erstmal nen gutes Nächtle :slight_smile:
Maze

Hallo,

Denke mal dass die Zeiten in der config falsch hinterlegt sind, deswegen passt das nicht.

Die Zeiten in der Config passen bei mir auch. Sie sind ca. 1 sek. länger eingestellt als nötig. Daran kann es also nicht liegen! Wäre schön wenn es so gewesen wäre.

@Maze
Kein Problem, heute passiert eh nicht mehr viel. Würde mich freuen wenn du mir morgen weiterhelfen könntest. Gutes Nächtle.

Grüße
Stephan

Hi Stephan,

in dem Modul IPSShadowing_Device.class.php wird in der Funktion „private function CalcNextSteps“ die Anzahl der Schritte berechnet.

Da kannst du das für dich modifizieren.

Ich hab es bisher lediglich so angepasst, dass beim herunterfahren und beim herauffahren IMMER +2 Sekunden zur berechneten Fahrzeit addiert werden. Damit erreiche ich, dass der Rollladen bei mir auch wirklich GANZ zu bzw auf fährt. Sonst kam es wegen der Rundungen bei mehrmaligem Richtungswechsel dazu, dass die Endpositionen nicht mehr erreicht wurden.

Hier würde (/werde ich sobald ich Zeit habe) eingreifen und die Fahrzeiten für 25, 50, 75 Prozent anpassen. Wege gibt es mehrere.

  1. Entweder die Zeit für jeden Rollladen und jede Position notieren und auch in der Config als neue Variable ablegen.

  2. die Zeit „von unten bis geschlossen“ und "von geschlossen bis unten"stoppen und die Verrechnen.

Gruß
Maze

Hallo Maze,

danke für die Informationen.

Ich hab es bisher lediglich so angepasst, dass beim herunterfahren und beim herauffahren IMMER +2 Sekunden zur berechneten Fahrzeit addiert werden. Damit erreiche ich, dass der Rollladen bei mir auch wirklich GANZ zu bzw auf fährt. Sonst kam es wegen der Rundungen bei mehrmaligem Richtungswechsel dazu, dass die Endpositionen nicht mehr erreicht wurden.

So ganz verstehe ich das nicht wo du das definiert hast.

			} elseif ($ToBeMoved==c_MovementId_90 or$ToBeMoved==c_MovementId_75 or $ToBeMoved==c_MovementId_50 or $ToBeMoved==c_MovementId_25) {
				$SecTotal      = $DeviceConfig[$DeviceName][c_Property_TimeClosing];
				$ShadowingType = $DeviceConfig[$DeviceName][c_Property_ShadowingType];
				$SecNullToPos  = $SecTotal*$Position/100;
				$SecPosTo100   = $SecTotal-$SecNullToPos;
				if ($ToBeMoved==c_MovementId_90) {
					$SecNullToNew = $SecTotal*65/100;
					$Position     = 90;
				} elseif ($ToBeMoved==c_MovementId_75) {
					$SecNullToNew = $SecTotal*45/100;
					$Position     = 75;
				} elseif ($ToBeMoved==c_MovementId_50) {
					$SecNullToNew = $SecTotal*29/100;
					$Position     = 50;
				} else {
					$SecNullToNew = $SecTotal*25/100;
					$Position     = 25;
				}

Wo genau muss ich denn Änderungen vornehmen? Wenn ich wie oben was ändere, beeinflusst das die Laufzeiten bereits, dass Ergebnis ist allerdings nicht ganz zufriedenstellend.

Kann ich noch andere einfache Änderungen vornehmen?

Danke.

Grüße
Stephan

so sieht das bei mir aus:

			private function CalcNextSteps() {
			$DeviceName   = IPS_GetIdent($this->deviceId);
			$DeviceConfig = get_ShadowingConfiguration();

			$Position     = $this->GetVariableValue(c_Control_Position);
			$ToBeMoved    = $this->GetVariableValue(c_Control_Movement);
			$StepsToDo    = array();
			//BOMMH c_MovementId_Opened und c_MovementId_Up wurden getrennt
			if ($ToBeMoved==c_MovementId_Opened) {
				$SecTotal     = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
				$SecNullToPos = $SecTotal*$Position/100 + 2; // BOMMH Somit wird immer die Gesamte Distanz aufgefahren und es ist sicher gestellt, dass der Rollladen offen ist. Original: $SecNullToPos = $SecTotal*$Position/100;
				$SecPosTo100  = $SecTotal-$SecNullToPos;
				$this->AddNextStep($StepsToDo, c_MovementId_Up, $SecTotal-$SecPosTo100, null,    $SecTotal, $SecPosTo100);
				$this->AddNextStep($StepsToDo, c_MovementId_Stop,   $DeviceConfig[$DeviceName][c_Property_TimePause],  'Offen (Stop)', null, null);
				$this->AddNextStep($StepsToDo, c_MovementId_Opened, 1, null, null , null);
			
			} elseif ($ToBeMoved==c_MovementId_Up) {
			   $SecTotal     = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
				$this->AddNextStep($StepsToDo, c_MovementId_Up, $SecTotal, null,    $SecTotal, 0); //BOMMH $this->AddNextStep($StepsToDo, c_MovementId_Up, $SecTotal-$SecPosTo100, null,    $SecTotal, $SecPosTo100);
				$this->AddNextStep($StepsToDo, c_MovementId_Stop,   $DeviceConfig[$DeviceName][c_Property_TimePause],  'Offen (Stop)', null, null);

			} elseif ($ToBeMoved==c_MovementId_MovedIn or $ToBeMoved==c_MovementId_MovingIn) {
				$SecTotal     = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
				$SecNullToPos = $SecTotal*$Position/100;
				$SecPosTo100  = $SecTotal-$SecNullToPos;
				$this->AddNextStep($StepsToDo, c_MovementId_MovingIn, $SecTotal-$SecPosTo100, null,    $SecTotal, $SecPosTo100);
				$this->AddNextStep($StepsToDo, c_MovementId_Stop,   $DeviceConfig[$DeviceName][c_Property_TimePause],  'Offen (Stop)', null, null);
				$this->AddNextStep($StepsToDo, c_MovementId_MovedIn, 1, null, null , null);

			} elseif ($ToBeMoved==c_MovementId_Shadowing or $ToBeMoved==c_MovementId_Down or $ToBeMoved==c_MovementId_Dimout or $ToBeMoved==c_MovementId_Closed or $ToBeMoved==c_MovementId_MovingOut or $ToBeMoved==c_MovementId_MovedOut) {
				$SecTotal     = $DeviceConfig[$DeviceName][c_Property_TimeClosing];
				$SecNullToPos = $SecTotal*$Position/100;
				if ($ToBeMoved==c_MovementId_Dimout) {
					$this->AddNextStep($StepsToDo, c_MovementId_Down,   $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop,   $DeviceConfig[$DeviceName][c_Property_TimePause],    'Abdunkelung (Pause)', null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Up,     $DeviceConfig[$DeviceName][c_Property_TimeDimoutUp], 'Abdunkelung (Hoch)', null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop,   $DeviceConfig[$DeviceName][c_Property_TimePause],    'Abdunkelung (Pause)', null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Down,   $DeviceConfig[$DeviceName][c_Property_TimeDimoutDown], 'Abdunkelung (Runter)', null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop,   $DeviceConfig[$DeviceName][c_Property_TimePause],    'Abdunkelung (Stop)', null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Dimout, 1,  null, null, null);
				} elseif ($ToBeMoved==c_MovementId_Down) {
					$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal, null, $SecTotal, 0); //BOMMH $this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, null, null, null);
				} elseif ($ToBeMoved==c_MovementId_MovedOut or $ToBeMoved==c_MovementId_MovingOut) {
					$this->AddNextStep($StepsToDo, c_MovementId_MovingOut, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, null, null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_MovedOut, 1, null, null, null);
				} elseif ($ToBeMoved==c_MovementId_Shadowing) {
					$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, "$Position%", null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Up,    $DeviceConfig[$DeviceName][c_Property_TimeDimoutUp], 'Beschattung (Hoch)', null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop, $DeviceConfig[$DeviceName][c_Property_TimePause],  'Beschattung (Stop)', null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Shadowing, 1,  null, null, null);
				} else { // Beinhalted c_MovementId_Closed
					$SecNullToPos = $SecTotal*$Position/100 - 2; //BOMMH Somit wird immer die Gesamte Distanz zugefahren und es ist sicher gestellt, dass der Rollladen zu ist. Original: $SecNullToPos = $SecTotal*$Position/100;
					$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecTotal-$SecNullToPos, null, $SecTotal, $SecNullToPos);
					$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, "$Position%", null, null);
					$this->AddNextStep($StepsToDo, c_MovementId_Closed, 1,  null, null, null);
				}

			} elseif ($ToBeMoved==c_MovementId_90 or $ToBeMoved==c_MovementId_75 or $ToBeMoved==c_MovementId_50 or $ToBeMoved==c_MovementId_25) { //Die Berechnung ist falsch, da sie nur Abwärtszeiten Berücksichtigt!
				// BOMMH Nimmt für Aufwärts und Abwärts unterschiedliche Zeiten für die Berechnung: Original:$SecTotal      = $DeviceConfig[$DeviceName][c_Property_TimeClosing];
				if ($ToBeMoved > $Position) $SecTotal      = $DeviceConfig[$DeviceName][c_Property_TimeClosing];
				if ($ToBeMoved < $Position) $SecTotal      = $DeviceConfig[$DeviceName][c_Property_TimeOpening];
				//EOMMH
				$ShadowingType = $DeviceConfig[$DeviceName][c_Property_ShadowingType];
				$SecNullToPos  = $SecTotal*$Position/100;
				$SecPosTo100   = $SecTotal-$SecNullToPos;
				if ($ToBeMoved==c_MovementId_90) {
					$SecNullToNew = $SecTotal*90/100;
					$Position     = 90;
				} elseif ($ToBeMoved==c_MovementId_75) {
					$SecNullToNew = $SecTotal*75/100;
					$Position     = 75;
				} elseif ($ToBeMoved==c_MovementId_50) {
					$SecNullToNew = $SecTotal*50/100;
					$Position     = 50;
				} else {
					$SecNullToNew = $SecTotal*25/100;
					$Position     = 25;
				}
				if ($SecNullToNew > $SecNullToPos) {
					if ($ShadowingType==c_ShadowingType_Marquees) {
						$this->AddNextStep($StepsToDo, c_MovementId_MovingOut, $SecNullToNew-$SecNullToPos, null, $SecTotal, $SecNullToPos);
					} else {
						$this->AddNextStep($StepsToDo, c_MovementId_Down, $SecNullToNew-$SecNullToPos, null, $SecTotal, $SecNullToPos);
					}
				} elseif ($SecNullToNew < $SecNullToPos) {
					if ($ShadowingType==c_ShadowingType_Marquees) {
						$this->AddNextStep($StepsToDo, c_MovementId_MovingIn, $SecNullToPos-$SecNullToNew, null, $SecTotal, $SecPosTo100);
					} else {
						$this->AddNextStep($StepsToDo, c_MovementId_Up, $SecNullToPos-$SecNullToNew, null, $SecTotal, $SecPosTo100);
					}
				} else {
				}
				$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, "$Position%", null, null);
				$this->AddNextStep($StepsToDo, $ToBeMoved,        1, null, null, null);

			} elseif ($ToBeMoved==c_MovementId_Stop) {
				$this->AddNextStep($StepsToDo, c_MovementId_Stop, 1, null, null, null);

			} else {
				throw new Exception ("Unknown MovementId $ToBeMoved, DeviceId=".$this->deviceId);
				exit;
			}

			$this->SetVariableValue(c_Control_StepsToDo, implode('|', $StepsToDo));
			$this->SetVariableValue(c_Control_Step, -5);
		}

Zu nächst habe ich „Offen“ und „Hoch“ getrennt. Hoch fährt IMMER die maximale Zeit. Bei Hoch werden 2 Sekunden auf die Fahrzeit addiert.

Gleiches gilt andersrum für „Geschlossen“ und „Runter“.

Für die % Fahrten habe ich eine Fallunterscheidung für „nach oben“ „nach unten“ eingebaut, damit die korrekte Zeit bestimmt wird. Das hat den Grund, dass bei mir die Zeiten für Öffnen und Schließen unterschiedlich sind.

Hier fählt noch ein herausrechnen der zeit von unten–>zu und zu–>unten.

Gru
Maze

Hallo Maze,

danke für deine erneute Antwort.

So peinlich es mir auch wieder einmal ist. Ich erkenne nicht genau, wo ich am besten ansetze um die Laufzeit z.B. für die 50% Stellung anzupassen.

Bei mir ist es wirklich so, dass bei 50% der Rolladen eher zu 75% geschlossen ist. Das nervt mich ein wenig.

Vielleicht hat hier ja jemand noch einen Tipp, Danke!

Grüße
Stephan

Such mal nach c_MovementId_50 in dem Code. Das sollte hoffentlich weiterhelfen.

Du wirst aber schon ein wenig programmiert Kenntnisse brauchen um das umzusetzen.

Gruß
Maze

Hi Maze,

danke nochmal für den Tipp. Leider weiß ich nicht wirklich was damit anzufangen.
Werde das Ganze erst einmal verwerfen. Benutze das Skript mal so wie es ist. Meine Kenntnisse sind einfach zu schlecht um das umzusetzen :confused:

Vielleicht wird ja mal eine Möglichkeit integriert die Laufzeiten für die einzelnen Positionen zu hinterlegen. Wäre schön!

Danke für die Hilfe und noch einen schönen Abend.

Grüße
Stephan

Leg Dir doch einfach eigene Skripte für die verschiedenen Positionen an, z.B. bei Homematic

HM_WriteValueFloat(12345, "LEVEL", .4);  //  ID :1-Instanz, .4 je nach gewünschter Stellung anpassen

Im Prinzip müsste bei der Beschattungssteuerung noch mind. eine Zeit (z.B. alle Lamellen geöffnet) für jede Richtung mit rein (siehe Shutter-Modul), dann würden die Zeiten besser passen. Helfe mir aber momentan auch mit eigenen Skripten.

Gruß
Bruno

Hallo Bruno,

aber das ist dann nicht in das IPSShadowing integriert, oder?

Als Übergangslösung aber vielleicht ganz gut, danke!

Grüße
Stephan

Ist nicht integriert, nein … wenn ich das könnte wäre das Programm schon angepasst. :wink:

Hallo zusammen,
ich habe gestern Abend ein wenig, aus meiner Sicht unkritische, Systempflege betrieben.

Nun wird seit gestern, bei jeder Betätigung eines Rolladenaktors, eine Boolean Variable „IsRunning“ im IPS Baum angelegt.
Da ich IPSShadowing im Einsatz habe und der Suchbegriff „IsRunning“ hier den einzigen Treffer in der Community ergeben hat, hier mal meine Frage:

Weiss jemand, was dieses anlegen der Variablen auslöst und wie man dies wieder beenden kann ?
Ich habe am IPSShadowing nichts geändert, jedoch meine FS20 AMS Markisensteuerung durch eine Kombination aus Homematic mit Somfy Motor ersetzt. Das kann es doch eigentlich aber nicht sein, dass dieser Effekt eintritt, oder ? zumal es bei JEDER Rolladenansteuerung jedes Raumes auftritt.

Würde ungern jetzt IPS Shadowing eliminieren und dann feststellen, dass ich woanders suchen muss.
Hat jemand einen Tip ?

Gruss
B71

Hi,

die Variable IsRunning wird von der Komponente IPSShadowingShutter_FS20 angelegt, um die Information zwischenzuspeichern, dass der „Aktor“ gerade aktiv ist.
Normalerweise wird die Variable direkt unter der Instanz angelegt, ich vermute mal, dass Du da irgendwo bei IPSShadowing eine ungültige Instanz eingetragen hast.

Hallo und Danke für das feedback,
hatte dann vorher schon alles neu installiert und somit den Fehler auch gefunden.
Der Verdacht lag ja nahe, jedoch war ich über die Auswirkungen im Root Baum sehr verwundert.

Allgemein ist bei mir in der IPS Library inzwischen wohl nicht mehr alles so sauber wie es sein sollte, was aber sicher mit der Installation vor all den neuen Installern usw. zusammenhängt und jetzt bekomme ich halt die Quittung.

Gestern flog mir nach der Reparatur von IPSShadowing das IPS Plugwise um die Ohren und wurde dann auch gleich auf die Version.77 neu installiert.

Jetzt heisst es wieder tote Variablen bereinigen usw…aber zumindest läuft alles wieder ohne Probleme.

Gruss
B71

Moin Brownson,

danke erst mal für dieses tolle Skript!

Ich habe noch einige Probleme gefunden von denen ich hoffe sie nicht in diesem „Endlos-Thread“ übersehen zu haben :slight_smile:

Habe heute eine neue „Beschattungkomponente“ hinzugefügt. In meinem Fall ist es ein HM Rolladenaktor, der ein motorisch betriebenes Fenster (Oberlicht) ansteuert. Diesen wollte ich auch gerne in IPSShadowing haben. Habe ihn als c_ShadowingType_Shutter angelegt und die Installation über den ModuleManagerGui gestartet. Soweit alles perfekt. Aber Shutter haben ja keine Auswahl für das Wetter-Profil (ich möchte das das Fenster bei Regen geschlossen wird). Also in der Config den Typ auf c_ShadowingType_Jalousie geändert und erneut die Installation gestartet. Es wird aber immer noch keine Verknüpfung zum Wetter-Profil erstellt.

Wollte daraufhin das gesamte IPSShadowing deinstallieren und von vorne beginnen. Leider gibt es wohl in IPS 3.1 eine Änderung am Befehl IPS_DeleteScript. Skripte mit Unterobjekten können nicht mehr gelöscht werden. Damit schlägt die ganze Deinstallation via ModuleManagerGui fehl, der Status bleibt bei „removing module“. Habe dann alles was IPSShadowning im IPS betrifft gelöscht und die Installation neu gestartet. Und meine „alte“ Installation inkl. aller Einstellungen ist wieder da! Wie kann das sein?

Danke Dir für Deine Aufklärung!

Das mit der Deinstallation seh ich mir an, Regen Profil gibt es zur Zeit nur bei Markisen.

Wenn Deine alte Konfiguration nach dem Löschen wieder da war, hast Du vermutlich doch nicht alles gelöscht :smiley:

…kann ich bestätigen…
War bei mir vor 2 Tagen auch so und war bei dem Plugwise Modul von 1007 ebenso nicht möglich.

Gruss
B71

Hallo zusammen,

ich komm mit den Callback Möglichkeiten nicht klar.

Ich möchte bei Anwesenheit die Raffstores im Wintergarten nicht schliessen, sondern waagrecht stellen.
Das kann bei meinem Somfy Funkzeugs über einen eigenen Befehl gemacht werden.

d.h. wenn die Raffstores aufgrund der Shadowing Einstellungen runterfahren, sollte einfach nur ein zusätzlicher Befehl nachgeschickt werden…zb so:

if (
	 $deviceID==22495 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device3]*/ and
 	 GetValue(35997 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device3\TemperatureChange]*/) == TRUE and
	 GetValue(30844 /*[Program\Anwesenheit\Anwesenheit]*/) == TRUE and
	 GetValue(15903 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device3\Automatic]*/ == TRUE and
	 GetValue(57275 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device3\Movement]*/ == 0
		)
	{
   COMPort_SendText(22075 /*[Serial Port rollo com5]*/, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFB).chr(0x05).chr(0xDA));
	}

Ich hab bis jetzt in den Callback Funktionen nur Beispiele gefunden, die das Fahren komplett verhindern, aber nix, wo ich zusätzliche Befehle nachschicken kann, nachdem die „Raffstore runterfahren“ Aktion abgeschlossen ist.

Habt ihr einen Denkanstoß für mich?
Danke.