IPSShadowing - eine Beschattungssteuerung

Das war eine Verzweiflungstat… :stuck_out_tongue:

@1007:
Vielen Dank für deinen Workaround!
Könntest du den Codeschnippsel bitte posten?

In der Konfiguration „IPSShadowing_Custom“ gibt es die function

function IPSShadowing_ProgramCustom($DeviceId, $isDay)

da gehoert alle Sonderfaelle rein. Wird bei Updates nicht ueberschrieben.
Hier hab ich zB fuer meine Device8 folgendes stehen

		if ( IPS_GetName($DeviceId) == "Device8" )
		   {
			$profilsun = GetValue(IPS_GetVariableIDByName("ProfileSun",$DeviceId));
			$profilinfosun = GetValue(IPS_GetVariableIDByName("ProfileInfo",$profilsun));

			$pos = strpos($profilinfosun, "Profil inaktiv");

			if ( $pos === false )
			   $profilaktivsun = true;
			else
			   $profilaktivsun = false;

			$profiltemp = GetValue(IPS_GetVariableIDByName("ProfileTemp",$DeviceId));

			$parentID = IPS_GetParent($profiltemp);

         if ( $profilaktivsun )
            {
				$profilname = "Treppe";    	// Profilname wenn Sun aktiv
				$id = IPS_GetObjectIDByName($profilname,$parentID);
				Setvalue(IPS_GetVariableIDByName("ProfileTemp",$DeviceId),$id);
				}
			else
			   {
				$profilname = "keine Aktion"; // Profilname wenn Sun nicht aktiv
				$id = IPS_GetObjectIDByName($profilname,$parentID);
				Setvalue(IPS_GetVariableIDByName("ProfileTemp",$DeviceId),$id);
			   }

			}

Namen entsprechend anpassen.

Das Problem ist, dass z.b. bei der Innentemperaturregelung die Raumtemperatur immer noch höher als die Wunschtemperatur ist.

In deinem Setup also, wenn die Aussentemperatur noch höher als die Wunschtemperatur wäre und das Sonnenstandsprofil nicht mehr aktiv ist.

d.h. beim Öffnen zieht auch die UND Verknüpfung, also wenn die Wunschtemp nicht unterschritten wird, obwohl das Sonnenstandsprofil nicht mehr aktiv ist, bleiben die Rolläden unten.

Dieses Szenario ist grad am Abend eher nachteilig…da scheint bei mir keine Sonne mehr, innen ists immer noch über der Wunschtemperatur, aber die Rolläden bleiben unten und man sitzt im Dunklen, obwohl man die Rolläden lieber offen hätte, da ohnehin kein Wärmeertrag mehr zu erwarten ist.

Aber wenn ich bei den Temperaturgrenzen „Ignorieren“ einstelle, dann bleibt immer noch der Helligkeitswert übrig.
Hast du dort einfach das Maximum eingestellt?

Ich habe hierfür den Maximalwert des Variablen-Profils „IPSShadowing_Brightness“ von 50000 auf 100000 angepasst und für mein inaktives Temperaturprofil ausgewählt.

P.S.: Vielen Dank für dein Codeschnippsel!

Hab ich nicht in Benutzung, steht bei mir auf 0 Lux.

Das heißt du hast keinen Helligkeitssensor?
Ich habe einen Helligkeitssensor und wenn ich den Wert auf 0 Lux habe, dann leuchtet das Temperaturprofil immer rot. Was auch logisch ist, da die gemessene Helligkeit meist höher ist.

So, das Skript läuft nun seit ein paar Tagen zuverlässig mit folgendem Code:

	function IPSShadowing_ProgramCustom($deviceId, $isDay)
	{
	   /* ************************* Config Start ****************************
		 *		Dieses Skript schaltet zwischen den Temperaturprofilen Standard
		 *    und Inaktiv abhängig vom Sonnenstand für das jeweilige Element um.
		 *    Elemente mit anderen Temperaturprofilen werden nicht verändert!
		 *    Einstellungen für "Inaktiv"-Temperaturprofil:
		 *		- alle Temperaturgrenzen auf "Ignorieren"
		 *		- ohne Helligkeitssensor ist der Helligkeitswert egal
		 *		- mit Helligkeitssensor muss ein Maximalwert eingestellt werden,
		 *		  welcher bei Verlassen des Sonnenprofils normalerweise nicht
		 *		  überschritten wird. (ggf. den Maximalwert des Variablen-Profils
		 *		  "IPSShadowing_Brightness" von 50000 auf einen höheren Wert
		 *		  anpassen und diesen für inaktives Temperaturprofil auswählen.)
		 * ******************************************************************* */
		$tempProfileActive = "Standard";
		$tempProfileInactive = "Inaktiv";
	   /* ************************** Config End ***************************** */

	   // ID des aktuellen Sonnenprofils ermitteln
		$sunProfileId = GetValue(IPS_GetVariableIDByName("ProfileSun", $deviceId));

		// ID des aktuellen Temperaturprofils ermitteln
      $tempProfileLastId = GetValue(IPS_GetVariableIDByName("ProfileTemp", $deviceId));

		// ID der aktiv/inaktiv Temperaturprofile ermitteln
		$tempProfileActiveId = IPS_GetObjectIDByName($tempProfileActive, IPS_GetParent($tempProfileLastId));
		$tempProfileInactiveId = IPS_GetObjectIDByName($tempProfileInactive, IPS_GetParent($tempProfileLastId));

		// Sonnenprofil aktiv?
		if(false === strpos(GetValue(IPS_GetVariableIDByName("ProfileInfo", $sunProfileId)), "Profil inaktiv"))
		{
			// --> aktiv
			$tempProfileCurrentId = $tempProfileActiveId;
		}
		else
		{
			// --> inaktiv
			$tempProfileCurrentId = $tempProfileInactiveId;
		}

		// Temperaturprofil ändern, sofern nötig und aktuelles Temperaturprofil ist Standard oder Inaktiv
		if($tempProfileLastId != $tempProfileCurrentId
			&& ($tempProfileLastId == $tempProfileActiveId || $tempProfileLastId == $tempProfileInactiveId)
		)
		{
			Setvalue(IPS_GetVariableIDByName("ProfileTemp", $deviceId), $tempProfileCurrentId);
		}

		return false;
	}

Hoffe das hilft dem Ein oder Anderen. :cool:

Danke, werde es auch mal einsetzten.

Also wo kein Sonnenstand ist, macht er auf inaktiv und wo Sonne ist, macht er wieder auf Standard … richtig ?

Richtig.
Fenster denen andere Temperaturprofile zugewiesen wurden, werden nicht verändert.

SUPER, das läuft PERFEKT ! Klasse, vielen Dank.

Hallo,
habe jetzt seit Monaten erfolgreich IPSShadowing am laufen. Seit drei Tagen funktioniert allerdings nichts mehr und ich habe alle 5 Minuten eine Fehlermeldung:

Ich steuere meine Rollläden mit Homematic Funk Rollladenaktor 1-fach für Markenschalter. Die Steuerung über die Homematic WebGUI und über Script funktioniert.
Hier sieht man auch, dass die Programmeinstellungen nicht aktualisiert werden:

Habe auch schon das Programm neu installiert; jedoch ohne vorher zu deinstallieren.

Grüße,
immergut

Hallo
Hab selber kein Homematic aber der Fehler kommt aus der Datei
IPSLibrary\app\core\IPSComponent\IPSComponentShutter\IPSComponentShutter_Homematic.class.php
Zeile 82.

HM_WriteValueFloat($this->instanceId , 'LEVEL', 1);

Gibt es die InstanceID ?
EInfach mal vor diese Zeile ein

IPS_LogMessage('MoveUp',$this->instanceId);

schreiben und im Log nachsehen.
Irgendwas in der Konfiguration geaendert ?

Hallo 1007,
die InstanceID`s müssten eigentlich richtig sein. Wenn ich im ShutterControl die Rollos manuell fahre, funktioniert es ja auch.
Habe jetzt mal ein

IPS_LogMessage('MoveUp',$this->instanceId);

vor die Zeile gesetzt und werde mal beobachten.

Danke

Zu den Temperatur-Profilen:

Vorab:
Ich habe bei mir nur Rollläden verbaut.

Zu der Problematik, dass die Rollläden nicht hoch fahren, wenn das Sonnenprofil nicht mehr aktiv ist:

Ich habe bei mir für das Verschatten bei Temperatur Profil NUR Schließen INNEN gesetzt. Dadurch werden die Rollläden bei überschreiten der Temperatur UND aktivem Sonnenprofil geschlossen. Wird das Sonnenprofil inaktiv, dann fahren die Rollläden auch wieder hoch. Genauso, wenn die Temperatur unter den Schwellwert fällt. Man muss als NICHT Öffnen INNEN definieren.

Als ich es mit Öffnen INNEN zusätzlich probiert habe, da hat das öffnen bei deaktiviertem Sonnenstandprofil nicht mehr funktioniert. Das liegt an den if, elsif schleifen in der CheckPrograms funktion.

Da es aber ohne die Öffnen INNEN (auf Inaktiv gesetzt) Einstellung funktioniert wie angedacht, sehe ich keine Notwendigkeit hier etwas zu ändern oder gar die Profile umzusetzen.

Gruß
Matthias

Hier ist das Problem genauer beschrieben:
http://www.ip-symcon.de/forum/threads/14438-IPSShadowing-eine-Beschattungssteuerung?p=227359#post227359

Ah ok, danke für den Hinweis, den Punkt mit dem Temp-Sprung hatte ich übersehen.

Gruß
Maze

Moin,

ich hab mich jetzt mal was näher mit den Ausnahmen beschäftigt, und wie man sie implemntieren kann. Das funktioniert auch super. Wenn ich den Drehgriff auf „Geöffnet“ stelle wenn der Rolladen wegen z.B. Nacht unten ist dann fährt er hoch und bleibt auch oben. Wenn ich den Griff zurück auf „Geschlossen“ stelle fährt er beim nächsten Timer runter. Soweit so gut.

Aber wenn ich den Griff auf „Geöffnet“ stehen habe während das Ereignis „Nacht“ kommt fährt der Rolladen zwar nicht runter (er bekommt ja ein False aus der Custom Funktion), im Webfront sehe ich aber dass er angeblich runter fährt (das Element „Runter“ ist aktiv) bis er auf „Geschlossen“ steht. Danach fährt er auch nicht, wenn ich den Griff wieder auf „Geschlossen“ stelle, klar IPS denkt ja er sei schon unten. Das kann ich mir nicht erklären.

Hier mal meine Codeabschnitte.

Der Teil der dafür sorgt, dass der Rolladen hoch fährt bzw. auf Automatik zurück geschaltet wird wenn der Griff betätigt wird ist in einem eigenen Skript und reagiert auf die Variablenänderung des Drehgriffkontaktes:

<? 
    IPSUtils_Include('IPSShadowing.inc.php', 'IPSLibrary::app::modules::IPSShadowing'); 
  
   $deviceID = 22569 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device1]*/; 
   $automatik = 49505 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device1\Automatic]*/; 
   $manual = 57703 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device1\ManualChange]*/; 
    $zustand = GetValueInteger(15134 /*[Geräte\Erdgeschoss\Wirtschaftsraum\EG Tür Wirt.-Raum\Status\STATE]*/); 
     
    IPS_Sleep(1000); //Warten 
     
    switch($zustand){ 
        case 0 /*Geschlossen*/: 
              $profileManager = new IPSShadowing_ProfileManager(); 
              $profileManager->UpdateProfileInfos(); 

              $device = new IPSShadowing_Device($deviceID); 
              $device->ChangeSetting($manual, false); 
              $device->ChangeSetting($automatik, true); 
              $device->CheckPrograms($profileManager); 
          break; 
           
        case 1 /*Gekippt*/: 
           break; 
        
        case 2 /*Geöffnet*/: 
            $device = new IPSShadowing_Device($deviceID); 
            $device = $device->MoveByControl(c_MovementId_Opened); 
           break; 
    } 
?>

Und dann noch der Teil, der dafür sorgen soll, dass nichts passiert, wenn der Griff auf „Geöffnet“ steht:

function IPSShadowing_BeforeActivateShutter($deviceId, $command) { 

        $zustand = GetValueInteger(15134 /*[Geräte\Erdgeschoss\Wirtschaftsraum\EG Tür Wirt.-Raum\Status\STATE]*/); 
         
        if(($deviceId == 22569 /*[Program\IPSLibrary\data\modules\IPSShadowing\Devices\Device1]*/ and $zustand == 2 /*Geöffnet*/)) return false; 
        return true; 
    }  

Hat vielleicht jemand eine Idee, was das Problem sein könnte?

Das ist letztendlich ein Bug, in dem Fall müßte ich die komplette Ansteuerung zurücksetzen, muß mir mal ansehen, wie aufwändig das ist.
Eigentlich könntest Du Deinen Code auch in der Programm Callback platzieren, sodass es erst gar nicht zu einer Ansteuerung kommt.

Hallo Andreas!
Das hatte ich auch (wir hatten das über PN diskutiert). Ebenfalls bei Verwendung mit Türgriff.
Das Problem ist das der Inhalt von $command (Automatikfahrt) auch nach Abbruch über IPSShadowing_BeforeActivateShutter erhalten bleibt. Das Webfront läuft dann über den RefreshTimer (Variablen STARTTIME, STEPSTODO und STEP) einfach weiter.

Meine (oder besser Deine Lösung): Function reference auf $command setzen und den Inhalt nach Bedarf ändern.

Bei meinem Fall (Auszug):


function IPSShadowing_BeforeActivateShutter($deviceId, &$command) {
     SetValue(IPS_GetObjectIDByIdent(c_Control_StartTime, $deviceId),-1);
     SetValue(IPS_GetObjectIDByIdent(c_Control_StepsToDo, $deviceId),"");
      SetValue(IPS_GetObjectIDByIdent(c_Control_Step, $deviceId),-1);
      $command=c_MovementId_Stop;
}

[ul]
[li]Die Zeilen mit SetValue setzen den RefreshTimer wieder zurück. (Das Umschalten auf Manuell bleibt.)[/li][li]$command=xxx; x=Sollzustand nach Abbruch[/li][/ul]

Vielleicht hilft der Ansatz

Gruß
Günter

ah ja, mir dämmert es schön langsam wieder :D:D
könnten wir eventuell gleich in das Modul übernehmen …