IPSShadowing - eine Beschattungssteuerung

Hallo gdfde,

ich kämpfe mich auch noch durch die Profile.

Aber mal ehrlich, wenn ich dir sage Du sollst wenn es innen 22°C sind den Rolladen schliessen und wenn es innen 22°C sind den Rolladen aufmachen.

Was machst Du bei erreichen der 22°C, schliesst Du oder öffnest Du?

das stimmt schon, dass es nicht optimal ist, wenn beide Trigger auf 22 Grad eingestellt sind.

Ich nehm aber an, dass IPS die Werte entsprechend auf- und abrundet.

Ist aber egal, es funktioniert auch nicht, wenn der Schliessen Trigger auf 25 Grad ist und der Öffnen Trigger auf 24.

Hallo gdfde,

also bei mir funktioniert es, ich weiss blöder Spruch und hilft nicht wirklich :wink:

Hast Du bedacht das der Sonnenstand auch eine Rolle spielt. Wenn der Ausserhalb der definierten Werte ist, fährt der Rolladen auch nicht runter.

Du hast natürlich recht, ich habs grad gecheckt und jetzt funktionierts auch.
Ich hab gestern die Sonnenstandsprofile richtig konfiguriert :slight_smile:
Ich blick mich da aber noch nicht so richtig durch, was man mit Azimuth, elevation usw einstellen kann.

Ist vielleicht nicht auf den ersten Blick ersichtlich, dass das auch passen muß.
Ev. wäre eine Option, wo man die Sonnenstandsfunktion komplett deaktivieren kann, sinnvoll.

Ich hätte noch einen Verbesserungsvorschlag.

Ich hab ja als Interface den Somfy RTS 485, der über eine virtuelle serielle Schnittstelle ans IPS angebunden ist.

Bei mir ist momentan das Problem, wenn alle Rolläden gleichzeitig angesteuert werden, dass meistens 1 oder 2 Rolläden die Befehle nicht erhalten.

Das liegt daran, dass die Somfy Box zwischen den einzelnen Fahrbefehlen eine 500 ms Pause benötigt.

Ich weiss nicht, wie das mit den anderen Devices (Homematic, enocean, KNX usw.) ist, wenn man zeitgleich die Befehle auf das Interface schickt.

@gdfde

implementiere doch einfach ein Wait von 500 ms in Deiner IPSComponent für Somfy.

@wladi

Durch das Blank wurde die Instanze ID nicht mehr als Integer erkannt und es wurde der zugehörige Pfad gesucht.

Hallo,
Nachdem alles ganz hervorragend mit kleinen individuellen Veränderungen läuft, würde ich gerne noch die Dachfensterrollos und -motoren einbinden. Die Antriebe laufen mit 24V Gleichstrom und werden über je 2 HomeMaticWired Instanzen angesteuert: zum Öffnen schaltet ein Relaisausgang den Strom an. Zum Schließen schaltet zusätzlich die 2. Instanz ein Polwenderelais.
Wie lege ich nun eine eigene Komponente dafür an?
Mit so einer Ansteuerung werden bei mir je 4 Aussenrollos und 4 Fensterantriebe gesteuert. Die Fensterantriebe selbst wären im Shadowing eigentlich auch optimal untergebracht.
Nette Grüsse und vielen Dank für die tolle Steuerung
Sven

Hab ich schon versucht, hilft aber auch rel. wenig.
Ich glaub, IPS startet da mehrere Threats gleichzeitig (z.b. wenn alle Rolläden gleichzeitig zu schliessen sind).
Wenn man jetzt ein Wait in die components reingibt, verbessert das zwar die Situation, löst es aber nicht, weil dann z.b. 6 Threads gleichzeitig starten.

@swooper

Sieh Dir mal IPSComponentShutter_LCN an, dort ist bereits eine Relaisansteuerung für LCN implementiert.

Analog kannst Du das auch für Homematic machen (einfach 2 Instanzen, eine für Richtung eine für Antrieb).

@gdfde

Eventuell kann man das durch einen Mutex in der Refresh Funktion lösen, werd mir das mal durch den Kopf gehen lassen.

Hallo,

ich hab das Problem, wenn ich mehrere Rolläden gleichzeitig ansprechen will (z.b. durch Szenarien wie „alles zu“ oder am Abend oder morgen), dass mir IPS Shadowing folgende Fehlermeldungen wirft:

Ausserdem verstehe ich nicht wirklich, warum im IPS Logger die div. Meldungen mehrfach drinnen stehen.

Hier ist auch noch meine IPS Components Shutter:

<?
	/**@addtogroup ipscomponent
	 * @{
	 *
 	 *
	 * @file          IPSComponentShutter_gdfde.class.php
	 * @author        Andreas Brauneis
	 *
	 *
	 */
   /**
    * @class IPSComponentShutter_gdfde
    *
    * Definiert ein IPSComponentShutter_gdfde Object, das ein IPSComponentShutter Object gdfde implementiert.
    *
    * @author Andreas Brauneis
    * @version
    * Version 2.50.1, 31.01.2012<br/>
    */
	IPSUtils_Include ('IPSComponentShutter.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentShutter');
	class IPSComponentShutter_gdfde extends IPSComponentShutter {
		private $instanceId;
		private $port;
		/**
		 * @public
		 *
		 * Initialisierung eines IPSComponentShutter_gdfde Objektes
		 *
		 * @param integer $instanceId InstanceId des gdfde Devices
		 */
		public function __construct($instanceId) {
			$this->instanceId = IPSUtil_ObjectIDByPath($instanceId);
			$this->port		= 15437;
		}
		/**
		 * @public
		 *
		 * Funktion liefert String IPSComponent Constructor String.
		 * String kann dazu ben¸tzt werden, das Object mit der IPSComponent::CreateObjectByParams
		 * wieder neu zu erzeugen.
		 *
		 * @return string Parameter String des IPSComponent Object
		 */
		public function GetComponentParams() {
			return get_class($this).','.$this->instanceId;
		}
		/**
		 * @public
		 *
		 * Function um Events zu behandeln, diese Funktion wird vom IPSMessageHandler aufgerufen, um ein aufgetretenes Event 
		 * an das entsprechende Module zu leiten.
		 *
		 * @param integer $variable ID der auslˆsenden Variable
		 * @param string $value Wert der Variable
		 * @param IPSModuleShutter $module Module Object an das das aufgetretene Event weitergeleitet werden soll
		 */
		public function HandleEvent($variable, $value, IPSModuleShutter $module){
			$name = IPS_GetName($variable);
			throw new IPSComponentException('Event Handling NOT supported for Variable '.$variable.'('.$name.')');
		}
		/**
		 * @public
		 *
		 * Hinauffahren der Beschattung
		 */
		public function MoveUp(){
			switch ($this->instanceId) {
				case 1: /*Küche*/
					
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFE).chr(0x05).chr(0xDA));
					
					IPS_Sleep(1000);
					
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFE).chr(0x05).chr(0xDA));
					IPS_Sleep(1000);
					
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFE).chr(0x05).chr(0xDA));
					break;
				case 2: /*Wintergarten oben*/
				   	IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFE).chr(0x05).chr(0xDC));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFE).chr(0x05).chr(0xDC));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFE).chr(0x05).chr(0xDC));
					break;
				case 3: /*Wintergarten unten*/
					IPS_Sleep(1000);
					
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFE).chr(0x05).chr(0xDD));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFE).chr(0x05).chr(0xDD));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFE).chr(0x05).chr(0xDD));
					break;
				case 4: /*Wohnzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFE).chr(0x05).chr(0xE2));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFE).chr(0x05).chr(0xE2));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFE).chr(0x05).chr(0xE2));
					break;
				case 5: /*Gästezimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFE).chr(0x05).chr(0xDB));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFE).chr(0x05).chr(0xDB));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFE).chr(0x05).chr(0xDB));
					break;
				case 6: /*WC EG*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFE).chr(0x05).chr(0xD7));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFE).chr(0x05).chr(0xD7));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFE).chr(0x05).chr(0xD7));
					break;
				case 7: /*Stiegenaufgang*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFE).chr(0x05).chr(0xD9));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFE).chr(0x05).chr(0xD9));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFE).chr(0x05).chr(0xD9));
					break;
				case 8: /*Bad OG*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFE).chr(0x05).chr(0xD5));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFE).chr(0x05).chr(0xD5));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFE).chr(0x05).chr(0xD5));
					break;
				case 9: /*Schlafzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFE).chr(0x05).chr(0xD8));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFE).chr(0x05).chr(0xD8));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFE).chr(0x05).chr(0xD8));
					break;
				case 10: /*Kinderzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFE).chr(0x05).chr(0xD6));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFE).chr(0x05).chr(0xD6));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFE).chr(0x05).chr(0xD6));
					break;
				case 11: /*Schrankraum*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFE).chr(0x05).chr(0xE0));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFE).chr(0x05).chr(0xE0));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFE).chr(0x05).chr(0xE0));
					break;
				case 12: /*Büro*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFE).chr(0x05).chr(0xE3));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFE).chr(0x05).chr(0xE3));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFE).chr(0x05).chr(0xE3));
					break;
				default:
			}
		}	
		/**
		 * @public
		 *
		 * Hinunterfahren der Beschattung
		 */
		public function MoveDown(){
			switch ($this->instanceId) {
				case 1: /*Küche*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFD).chr(0x05).chr(0xD9));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFD).chr(0x05).chr(0xD9));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFD).chr(0x05).chr(0xD9));
					break;
				case 2: /*Wintergarten oben*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFD).chr(0x05).chr(0xDB));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFD).chr(0x05).chr(0xDB));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFD).chr(0x05).chr(0xDB));
					break;
				case 3: /*Wintergarten unten*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFD).chr(0x05).chr(0xDC));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFD).chr(0x05).chr(0xDC));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFD).chr(0x05).chr(0xDC));
					break;
				case 4: /*Wohnzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFD).chr(0x05).chr(0xE1));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFD).chr(0x05).chr(0xE1));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFD).chr(0x05).chr(0xE1));
					break;
				case 5: /*Gästezimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFD).chr(0x05).chr(0xDA));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFD).chr(0x05).chr(0xDA));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFD).chr(0x05).chr(0xDA));
					break;
				case 6: /*WC EG*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFD).chr(0x05).chr(0xD6));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFD).chr(0x05).chr(0xD6));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFD).chr(0x05).chr(0xD6));
					break;
				case 7: /*Stiegenaufgang*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFD).chr(0x05).chr(0xD8));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFD).chr(0x05).chr(0xD8));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFD).chr(0x05).chr(0xD8));
					break;
				case 8: /*Bad OG*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFD).chr(0x05).chr(0xD4));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFD).chr(0x05).chr(0xD4));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFD).chr(0x05).chr(0xD4));
					break;
				case 9: /*Schlafzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFD).chr(0x05).chr(0xD7));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFD).chr(0x05).chr(0xD7));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFD).chr(0x05).chr(0xD7));
					break;
				case 10: /*Kinderzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFD).chr(0x05).chr(0xD5));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFD).chr(0x05).chr(0xD5));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFD).chr(0x05).chr(0xD5));
					break;
				case 11: /*Schrankraum*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFD).chr(0x05).chr(0xDF));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFD).chr(0x05).chr(0xDF));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFD).chr(0x05).chr(0xDF));
					break;
				case 12: /*Büro*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFD).chr(0x05).chr(0xE2));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFD).chr(0x05).chr(0xE2));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFD).chr(0x05).chr(0xE2));
					break;
				default:
			}
		}
		/**
		 * @public
		 *
		 * Stop
		 */
		public function Stop() {
			switch ($this->instanceId) {
				case 1: /*Küche*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFC).chr(0x05).chr(0xD8));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFC).chr(0x05).chr(0xD8));
					break;
				case 2: /*Wintergarten oben*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFC).chr(0x05).chr(0xDA));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF8).chr(0xFC).chr(0x05).chr(0xDA));
					break;
				case 3: /*Wintergarten unten*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFC).chr(0x05).chr(0xDB));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF9).chr(0xFC).chr(0x05).chr(0xDB));
					break;
				case 4: /*Wohnzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFC).chr(0x05).chr(0xE0));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFE).chr(0xFC).chr(0x05).chr(0xE0));
					break;
				case 5: /*Gästezimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFC).chr(0x05).chr(0xD9));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF7).chr(0xFC).chr(0x05).chr(0xD9));
					break;
				case 6: /*WC EG*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFC).chr(0x05).chr(0xD5));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF3).chr(0xFC).chr(0x05).chr(0xD5));
					break;
				case 7: /*Stiegenaufgang*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFC).chr(0x05).chr(0xD7));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF5).chr(0xFC).chr(0x05).chr(0xD7));
					break;
				case 8: /*Bad OG*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFC).chr(0x05).chr(0xD3));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF1).chr(0xFC).chr(0x05).chr(0xD3));
					break;
				case 9: /*Schlafzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFC).chr(0x05).chr(0xD6));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF4).chr(0xFC).chr(0x05).chr(0xD6));
					break;
				case 10: /*Kinderzimmer*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFC).chr(0x05).chr(0xD4));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xF2).chr(0xFC).chr(0x05).chr(0xD4));
					break;
				case 11: /*Schrankraum*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFC).chr(0x05).chr(0xDE));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFC).chr(0xFC).chr(0x05).chr(0xDE));
					break;
				case 12: /*Büro*/
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFC).chr(0x05).chr(0xE1));
					IPS_Sleep(1000);
					COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA).chr(0x00).chr(0x00).chr(0x00).chr(0xFF).chr(0xFC).chr(0x05).chr(0xE1));
					break;
				default:
			}
		}
	}
	/** @}*/
?>

Ich steuere meine Rolläden über das Somfy RS485 Interface und dieses über Funk an, deshalb hab ich die Fahrbefehle mit einem Abstand von 1000 ms doppelt und dreifach drinnen, weil ab und an mal ein Befehl verloren geht.
Danke für eure Hilfe :slight_smile:

@gdfe

Deine Problemchen (zumindest das mit den doppelten Log Einträgen) könnten von Überschneidungen der Refresh Timer kommen. Hab jetzt mal einen Mutex implementiert, der das verhindern sollte.

Die eigentliche Fehlermeldung „Write File Function failed“ kommt ja beim Schreiben auf das COM Port zustande, für die hab ich auch nicht wirklich eine Erklärung, ist aber gut möglich, dass die auch durch die mehrfache Ansteuerung zustande gekommen sind - probiers einfach mal aus (eventuell kannst Du dann auch die mehrfachen Steuersignale wieder entfernen)…

Was bedeuten eigentlich die ganzen Bytes in der Ansteuerung?

 
COMPort_SendText($this->port, chr(0x7F).chr(0xF2).chr(0xFA).chr(0x0E).chr(0x73).chr(0xFA)
                         .chr(0x00).chr(0x00).chr(0x00).chr(0xF6).chr(0xFE).chr(0x05).chr(0xDA));

Hintergrund - eventuell könnten wir ja eine allgemeine Klasse zur Ansteuerung von Somfy schreiben.

Hallo,

ich versuch gerade die Beschattung in Betrieb zu nehmen, dabei ist mir aufgefallen, dass plötzlich Elemente im Webfront fehlen.
„Meldungen“ und „Einstellungen“ sind komplett leer und bei „Profil“ und „Szenarien“ fehlen die Elemente zu erstellen und löschen, sowie zum auswählen.
Es passiert auf IE und Firefox. Ich hatte es aber auch schon, dass der Firefox ging aber der IE nichts anzeigte.

Irgend eine Idee. Kann jemand weiterhelfen? Ich komm momentan nicht weiter.

Gruß
hullygully

Ich habe das Problem mit Chrome.Hat mir viel Zeit und wiederholende Installationen gekostet. In CHrome habe ich die gleiche Ansicht wie du. In Firefox funktioniert es. Ich habe das Problem nur bei der Anzeige von Informationen aus Modulen der IPSLibrary. Komisch.

Grüße
Heiko

Hallo Leute,

da gabs mal einen Bug, bin mir jetzt nicht sicher ab welcher Version dieses Problem behoben wurde.

Mit einem Update auf die Version auf die Version 2.6 ist das Problem auf jeden Fall behoben (läuft bei mir bereits seit Wochen sehr absolut stabil).

Hab das Problem jetzt lösen können.

Tragt einfach die Seite als „vertrauenswürdige Seit“ ein. Danach passt wieder alles.

Hoffentlich hilft’s auch bei euch.

Gruß
hullygully

Hi,

diese Option gibt es aber bei Chrome nicht. Oder habe ich da was übersehen? :confused:

Gruß
Heiko

Hallo Andreas,

Nachdem ich schon seit vielen Monaten Deine tolle Steuerung nutze, sind mir Kleinigkeiten aufgefallen, die sich vielleicht verbessern ließen:

  • sobald ein Homematic-Aktor aus welchen Gründen auch immer nicht erreichbar ist, bricht die Automatik bei der betreffenden Device-Nummer komplett ab, und die in der Liste folgenden Devices werden nicht mehr angesteuert

  • im Overview ist es bei vielen Devices (bei mir 32) sehr schwierig, Top1 und Top2 synchron zu scrollen. Um ohne allzugoßen Aktionen die Übersicht zu behalten, könnte man vielleicht Gruppen zu 10 Devices in irgendeiner Form zusammenfassen

  • sind Shutter und Markisen abwechselnd aufgelistet, dann ist in der Übersicht der Block „Runter - Stop - Hoch“ deutlich breiter als „Aus - Stop - Ein“. Ganz penibel hätte ich am liebsten die „Stop“ alle schön säuberlich untereinander ausgerichtet… (irgendwas zu mekern gibt´s ja immer)

nette Grüße
Sven

Hallo Sven,

@1: Werd ich mir bei nächster Gelegenheit mal ansehen, war bis jetzt der Meinung, dass die Steuerung bei „normalen“ Fehlern weitermacht.

@2:Schwierieges Thema, hier ist es nicht leicht es jedem Recht zu machen. Ich würde Dir an dieser Stelle empfehlen die automatische Generierung des WebFronts über die INI Datei abzuschalten und Deine Wünsche manuell umzusetzen.

@3 Auch hier könntest Du die Profile verändern, nur diese werden Dir bei der nächsten Installation auf jeden Fall wieder überschrieben

Hi Andreas,
könntest Du mir beim Anlegen einer neuen component behilflich sein? Für einen Velux-Shutter hab ich eine Dummy-Instanz angelegt, darunter zwei Instanzen für die HomeMatic Relaisausgänge (Movement und Direction). Als Component habe ich versucht, den LCN-Shutter anzupassen, aber leider fehlt mir da etwas der Überblick.

nette Grüße
Sven

	IPSUtils_Include ('IPSComponentShutter.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentShutter');

	class IPSComponentShutter_VeluxHomematic extends IPSComponentShutter {

		private $instanceId1;
		private $instanceId2;
		private $directionSwitch;


		/**
		 * @public
		 *
		 * Initialisierung eines IPSComponentShutter_VeluxHomematic Objektes
		 *
		 * @param integer $instanceId1 InstanceId 1 des HM Devices (Movement)
		 * @param integer $instanceId2 InstanceId 2 des HM Devices (Direction)
		 * @param boolean $directionSwitch Richtungs Schalter (default=false)
		 */
		public function __construct($instanceId1, $instanceId2, $directionSwitch=false) {
			$this->instanceId1     = IPSUtil_ObjectIDByPath($instanceId1);
			$this->instanceId2     = IPSUtil_ObjectIDByPath($instanceId2);
			$this->directionSwitch = $directionSwitch;
			}

		/**
		 * @public
		 *
		 * Funktion liefert String IPSComponent Constructor String.
		 * String kann dazu benützt werden, das Object mit der IPSComponent::CreateObjectByParams
		 * wieder neu zu erzeugen.
		 *
		 * @return string Parameter String des IPSComponent Object
		 */
		public function GetComponentParams() {
			return get_class($this).','.$this->instanceId1.','.$this->instanceId2;
		}

		/**
		 * @public
		 *
		 * Function um Events zu behandeln, diese Funktion wird vom IPSMessageHandler aufgerufen, um ein aufgetretenes Event
		 * an das entsprechende Module zu leiten.
		 *
		 * @param integer $variable ID der auslösenden Variable
		 * @param string $value Wert der Variable
		 * @param IPSModuleShutter $module Module Object an das das aufgetretene Event weitergeleitet werden soll
		 */
		public function HandleEvent($variable, $value, IPSModuleShutter $module){
			$name = IPS_GetName($variable);
			throw new IPSComponentException('Event Handling NOT supported for Variable '.$variable.'('.$name.')');
		}

		/**
		 * @public
		 *
		 * Hinauffahren der Beschattung
		 */
		public function MoveUp(){
					HM_WriteValueBoolean($this->instanceId1,  'State', 1);
					HM_WriteValueBoolean($this->instanceId2, 'State', $this->directionSwitch);
					}
		}

		/**
		 * @public
		 *
		 * Hinunterfahren der Beschattung
		 */
		public function MoveDown(){
			HM_WriteValueBoolean($this->instanceId1,  'State', 1);
			HM_WriteValueBoolean($this->instanceId2, 'State', !$this->directionSwitch);
			}
		}

		/**
		 * @public
		 *
		 * Stop
		 */
		public function Stop() {
			HM_WriteValueBoolean($this->instanceId1,  'State', 0);
			}
		}

	}

	/** @}*/
?>