IPSShadowing - eine Beschattungssteuerung

Ich habe die Rademacher Duofern, nutze allerdings IPSSchadowing nicht, habe es selbst implementiert. Aber möglich sollte es sein. Du musst halt für Rademacher Anpassungen vornehmen. Ich hatte dir dazu ja im Rademacher Thread schon erste hinweise gegeben.

Gruß Basti

Ich versuche IPSShadowing unter IP-Symcon 4 zu installieren. Dabei bleibt mir aber die Anzeige im Webfront bei Modul Status auf Installing stehen.

Als Fehler steht im Log

Eingetragen in der IPSShadowing_Configuration ist


	define ("IPSSHADOWING_TEMPSENSOROUTDOOR",	"37422");

In IPS sieht das so aus


die Variable ist also vorhanden.

Kann mir jemand sagen was ich falsch mache bzw. wie man den Fehler eventuell beheben kann?

MEA CULPA

S:banghead:
Schreibfehler

Einfach mal die beiden Zahlen ganz genau vergleichen … :cool:

Gruß
Bruno

Jeep habe ich dann auch festgestellt, war meine Schuld. (siehe oben). Manchmal sind es zum Glück Kleinigkeiten.

Hatte ich natürlich übersehen, so weit unten … :wink: :o

Hallo zusammen
ich setze schon länger das IPS Shadowing Modul ein und bin wirklich total zufrieden damit. Nun ist es so, das ich auf unserem Grundstück ein zweites Haus damit steuern möchte was eine eigene An/Abwesendsteuerung hat sowie eigene Innentemp. Gibt es die Möglichkeit das Modul mehrfach zu installieren oder kann ich das überhaupt so nutzen?

Für einen kleinen Tip würde ich mich freuen, im Forum habe ich leider nichts passendes dazu gefunden.

Besten Dank schonmal.

Torsten

Hallo,

ich bin gerade dabei IPSShadowing zu verstehen. Aktuell habe ich mir ein neues DeviceModul „IPSComponentShutter_ModBus“ geschrieben. Das funktioniert soweit ganz gut.

Leider komme ich mit dem SyncPosition nicht klar. Damit es etwas verständlicher wird, was ich meine, hier meine Modbuslösung:

Ich nutze eine Wago 750-881 in Verbindung mit OSCAT. Arbeitsteilung zwischen WAGO und IPS ist generell: Sicherheitsrelevant und Schnell -> WAGO; Komfort -> IPS.

Hier ein Bild meiner Rollladenansteuerung:
Coreltrace.png

Das Rollladenmodul im Detail:

Rot umrandet ist mein IPS zu ShadowingWrapper:
Variablendeklaration:

FUNCTION_BLOCK IPS_ShadowingInterface
VAR_INPUT
	MB_IN: WORD;
	Pos_IN:BYTE;
END_VAR
VAR_OUTPUT
	Move_Up: BOOL;
	Move_Down: BOOL;

	MB_OUT: WORD;
END_VAR
VAR
	tmp: WORD;
	Move_Stop: BOOL;
	pos: WORD;
END_VAR

ST-Rumpf

(*Regelt die Kommunikation zwischen IPS und Rollladensteuerung via Modbus*)

Move_Up:=(MB_IN AND 32768)>0;
Move_Down:=(MB_IN AND 16384)>0;
Move_Stop:=NOT (Move_Up XOR Move_Down);
(*Sicherheitsfunktion bei up=down=true*)
IF Move_stop=TRUE THEN
	Move_Up:=FALSE;
	Move_Down:=FALSE;
END_IF

tmp:=0;
IF Move_Up 		THEN tmp:=16#8000; END_IF
IF Move_Down 	THEN tmp:=16#4000; END_IF

(*Positionsumrechnung*)
pos:=255-Pos_IN;
MB_OUT:=pos+tmp;

Das heißt, das IPSShadowingInterface regelt die Kommunikation zu meiner vorhandenen Rollladensteuerung.
Konkret habe ich dazu im IPS eine normale ModBusVariable mit je einem Schreib- und LeseWord.

In das Schreibword kann ich jetzt per Script die Zustände Auf/Ab/Stop setzen und im LeseWord wird zusätzlich die Positionsangabe hineincodiert.
Zum verdeutlichen: das IPSComponentShutter_ModBus - Script:

<?
	/**@addtogroup ipscomponent
	 * @{
	 *
 	 *
	 * @file          IPSComponentShutter_ModBus.class.php
	 * @author        Andreas Brauneis
	 * @modifiedby    tommes
	 *
	 *
	 */

   /**
    * @class IPSComponentShutter_ModBus
    *
    * Definiert ein IPSComponentShutter_ModBus Object, das ein IPSComponentShutter Object für ModBus implementiert.
    *
    * @author Andreas Brauneis @mod by tommes
    * @version
    * Version 2.xx.x, 30.03.2016<br/>
    */

	//Steuerungs Konstanten
	define('MUP','32768');
	define('MDN','16384');


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

	class IPSComponentShutter_ModBus extends IPSComponentShutter {

		private $instanceId;
		private $reverseControl;

		/**
		 * @public
		 *
		 * Initialisierung eines IPSComponentShutter_ModBus Objektes
		 *
		 * @param integer $instanceId InstanceId des ModBus Devices
		 * @param boolean $reverseControl Reverse Ansteuerung des Devices
		 */
		public function __construct($instanceId, $reverseControl=false) {
			$this->instanceId     = IPSUtil_ObjectIDByPath($instanceId);
			$this->reverseControl = $reverseControl;
		}

		/**
		 * @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){
		   
				$module->SyncPosition(((255-$value)*100/255), $this);
			
		}

		/**
		 * @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
		 *
		 * Hinauffahren der Beschattung
		 */
		public function MoveUp(){
				ModBus_WriteRegisterWord($this->instanceId, MUP);
		}

		/**
		 * @public
		 *
		 * Hinunterfahren der Beschattung
		 */
		public function MoveDown(){
				ModBus_WriteRegisterWord($this->instanceId, MDN);
		}

		/**
		 * @public
		 *
		 * Stop
		 */
		public function Stop() {
				ModBus_WriteRegisterWord($this->instanceId, 0);
		}

	}

	/** @}*/
?>

Soweit funktioniert das ganz gut.
Jetzt zu meinem Problem: Wie bekomme ich den Sync hin?

Ich habe mir ein EventInstallerScript gebastelt, welches auch den Event anlegt:

    IPSUtils_Include ('IPSMessageHandler.class.php', 'IPSLibrary::app::core::IPSMessageHandler');
   $messageHandler = new IPSMessageHandler();
   $messageHandler->RegisterOnChangeEvent(40530 /*[Testbereich\ShutterTest\TestShutter\Wert]*/, 'IPSComponentShutter_ModBus,16577', 'IPSModuleShutter_ModBus')

siehe:


Im Log steht:

Die Datei ist im Verzeichnis. Zunächst hatte ich sie als symbolischen Link, jetzt aber direkt reinkopiert.

Was kann ich noch probieren:confused:, bzw. wer hat ModBus erfolgreich im Shutter eingesetzt?

Viele Grüße
tommes

Ist das File im Filesystem korrekt benannt?
also IPSComponentShutter_ModBus.class.php

… die Suche läuft alleine über das Filesystem, der Name in IPS spielt keine Rolle …

Hi, ohne jetzt genau Dein Problem verstanden zu haben, glaube ich, dass Du lediglich Deinen „neuen“ Elementen die dazugehörigen Tempsensoren zuweisen muss (das geht sowieso separat für jedes Element) und ein paar neue Profile usw. einrichten musst.

tommes

Ich hab’s mehrfach geprüft, aber manchmal sieht man den Wald vor lauter Bäumen nicht:

Der 3. Parameter definiert das „Zielmodul“, richtig sollte also folgender Aufruf sein:


$messageHandler->RegisterOnChangeEvent(40530, 'IPSComponentShutter_ModBus,16577', 'IPSModuleShutter_IPSShadowing')  

Hi,

vielen Dank für Deine Antwort, kam erst heute dazu sie zu probieren. Funktioniert leider auch nicht. D.h. es kommt keine Fehlermeldung mehr, bzw. kein Eintrag im Log, jedoch aber auch keine Änderung der Positionsvariable.
Ich habe spaßenshalber die HandleEvent Funktion durchdebuggt, ohne nennenswerte Erkenntnisse:

<?
	/**@addtogroup ipsmessagehandler 
	 * @{
	 *
	 * @file          IPSMessageHandler_Event.ips.php
	 * @author        Andreas Brauneis
	 * @version
	 * Version 2.50.1, 31.01.2012<br/>
	 *
	 * Script dient als EventScript um den IPSMessageHandler über Variablen Änderungen der Componenten zu informieren
	 *
	 */

/*	$variable = $_IPS['VARIABLE'];
	$value    = $_IPS['VALUE'];
*/
	$variable = 40530;
	$value    = 155;

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

	$messageHandler = new IPSMessageHandler();
	IPSLogger_Dbg (__file__, 'call HandleEvent Variable='.$variable.' with val='.$value);
	$messageHandler->HandleEvent($variable, $value);

	/** @}*/
?>
		/**
		 * @public
		 *
		 * Methode um autretende Events zu processen
		 *
		 * @param integer $variable ID der auslösenden Variable
		 * @param string $value Wert der Variable
		 */
		public function HandleEvent($variable, $value) {
			$configurationAuto = self::Get_EventConfigurationAuto();
			$configurationCust = self::Get_EventConfigurationCust();

	IPSLogger_Dbg (__file__, 'HandleEvent Step1');
			if (array_key_exists($variable, $configurationCust)) {
				$params = $configurationCust[$variable];
	IPSLogger_Dbg (__file__, 'HandleEvent Step1.1');
			} elseif (array_key_exists($variable, $configurationAuto)) {
				$params = $configurationAuto[$variable];
	IPSLogger_Dbg (__file__, 'HandleEvent Step1.2: ');
	var_dump($params);
			//} elseif ($variable==IPSMH_IRTRANS_BUTTON_VARIABLE_ID) {
				//$params = '';
				//$this->HandleIREvent($variable, $value);
			} else {
				$params = '';
				IPSLogger_Wrn(__file__, 'Variable '.$variable.' NOT found in IPSMessageHandler Configuration!');
			}
	IPSLogger_Dbg (__file__, 'HandleEvent Step2');

			if ($params<>'') {
	IPSLogger_Dbg (__file__, 'HandleEvent Step2.1');

				if (count($params) < 3) {
					throw new IPSMessageHandlerException('Invalid IPSMessageHandler Configuration, Event Defintion needs 3 parameters');
	IPSLogger_Dbg (__file__, 'HandleEvent Step2.2');
				}
				$component = IPSComponent::CreateObjectByParams($params[1]);
				$module    = IPSModule::CreateObjectByParams($params[2]);

				if (function_exists('IPSMessageHandler_BeforeHandleEvent')) {
	IPSLogger_Dbg (__file__, 'HandleEvent Step2.3');
					if (IPSMessageHandler_BeforeHandleEvent($variable, $value, $component, $module)) {
						$component->HandleEvent($variable, $value, $module);
						if (function_exists('IPSMessageHandler_AfterHandleEvent')) {
							IPSMessageHandler_AfterHandleEvent($variable, $value, $component, $module);
						}
					}
				} else {
	IPSLogger_Dbg (__file__, 'HandleEvent Step2.4');
					$component->HandleEvent($variable, $value, $module);
					if (function_exists('IPSMessageHandler_AfterHandleEvent')) {
						IPSMessageHandler_AfterHandleEvent($variable, $value, $component, $module);
					}
				}
			}
	IPSLogger_Dbg (__file__, 'HandleEvent Step3');

		}
	}

Ich bin ratlos. Wenn ich einen Eventscriptschreiben würde, welche Variable muss denn dann befüttert werden? Nur die Positionsvariable?

Übrigens: nur damit hier nicht ein falscher Eindruck entsteht: Das gesamte Modulkonzept und die einzelnen Module sind absolut spitze. Du hast meinen größten Respekt, leider für mich so hoch, dass ich mit meinen beschränkten Fähigkeiten nicht mehr oder hoffentlich eher noch nicht durchblicke.

Viele Grüße
tommes

sieht doch gar nicht so schlecht aus:

Diese Zeile sollte die HandleEvent Funktion in Deiner Modus Component aufrufen.


          $component->HandleEvent($variable, $value, $module);

Bau doch mal dort einige Log Meldungen in Deiner HandleEvent Funktion ein, und lass mal die Params ausgeben …

Juhuu, ich hab’s.

Beim tieferen debuggen bin ich in der eigentlichen Syncroutine gelandet im IPSModuleShutter_IPSShadowing. Und dort habe ich gesehen, dass beim Vergleich der Konfigurationen nach der falschen ID gesucht wurde. Der Grund war, ich habe beim Installieren des Handlers den falschen Testshutter verwendet, d.h. die Einträge in der Messagehandler konfiguration und der IPSShadowing_Configuration haben sich unterschieden.
(‚IPSComponentShutter_ModBus,36357‘ <–> ‚IPSComponentShutter_ModBus,16577‘)
Das Ganze ist beim ausprobieren mit verschiedenen Elementen passiert, als ich noch überhaupt keine Ahnung hatte, naja, jetzt weiß ich wenigstens wie das Handling funktioniert.

Vielen Dank für Deine Denkanstöße.

Viele Grüße
tommes

In dem Zusammenhang hätte ich noch einen Gestaltungsvorschlag:

Wenn im Konfigurationsarray noch die Eigenschaften c_Property_SyncValueID und c_Property_SyncDimOutValueID (nur Jalousie) ergänzt würden, könnte die Syncinstallroutine gleich mit in die Installroutine integriert werden und es wäre vom Handling her einfacher. Und es kommen keine blöden Fragen auf :smiley: „Bei mir funktioniert das Sync nicht…“.


		return array(
			c_ShadowingDevice_1 =>	array(
				c_Property_ShadowingType		=> 	c_ShadowingType_Shutter,
				c_Property_Name					=> 	'Testzimmer',
				c_Property_Component				=> 	'IPSComponentShutter_ModBus,36357',
				c_Property_TimeOpening			=> 	10.5,
				c_Property_TimeClosing			=> 	10.5,
				c_Property_TimePause				=> 	1,
				c_Property_TempSensorIndoor	=> '27211',
   c_Property_SyncValueID => '12345'
 //  c_Property_SyncDimOutValueID => '12346'

…nur als Vorschlag…

Viele Grüße
tommes

ich habe mal einen Installerscript zusammengebastelt (Verzeihung für den Spaghetticode)

Er liest aus der Konfiguration:


        /*
	 *
	 * @return string Liefert Array mit Beschattungs Elementen
	 */
	function get_ShadowingConfiguration() {
if (!defined("c_Property_SyncValueID")){define("c_Property_SyncValueID",'c_Property_SyncValueID');} //Konstantendefinition solange "nicht offiziell"
		return array(
			c_ShadowingDevice_1 =>	array(
				c_Property_ShadowingType		=> 	c_ShadowingType_Shutter,
				c_Property_Name					=> 	'Testzimmer',
				c_Property_Component				=> 	'IPSComponentShutter_ModBus,36357',
				c_Property_TimeOpening			=> 	10.5,
				c_Property_TimeClosing			=> 	10.5,
				c_Property_TimePause				=> 	1,
				c_Property_TempSensorIndoor	=> '27211',
				c_Property_SyncValueID        => 'defaultValueID',
				),
			c_ShadowingDevice_2 =>	array(
				c_Property_ShadowingType		=> 	c_ShadowingType_Shutter,
				c_Property_Name					=> 	'Arbeit_Fenster',
				c_Property_Component				=> 	'IPSComponentShutter_ModBus,51901',
				c_Property_TimeOpening			=> 	17.5,
				c_Property_TimeClosing			=> 	17.5,
				c_Property_TimePause				=> 	1,
				c_Property_TempSensorIndoor	=> '30668',
				c_Property_SyncValueID        => 'defaultValueID',
				),

die Eigenschaften c_Property_SyncValueID heraus. Wenn in der Eigenschaft der Wert „defaultValueID“ angegeben wurde, sucht IPS nach dem Standartvariablenwert und registriert diesen.

Hier noch der Installerscript selbst „Create_IPSShadowing_SyncRegistration“:


<?
IPSUtils_Include ('IPSMessageHandler.class.php', 'IPSLibrary::app::core::IPSMessageHandler');
IPSUtils_Include ('IPSShadowing.inc.php', 'IPSLibrary::app::modules::IPSShadowing');
define ("c_Property_SyncValueID","c_Property_SyncValueID"); //nicht ganz sauber, aber ...



$arr=get_ShadowingConfiguration();        									//Konfiguration aller Shadowingelemente ermitteln
//var_dump($arr);


while ($element = current($arr))                                      //Für jedes Element...
{
	
	//Shutter,Jalousie, oder Markise
	switch ($element[c_Property_ShadowingType])
	{

	   case c_ShadowingType_Shutter:
			//echo key($arr);
		   echo "	Shutter
";
		   if (isset($element[c_Property_SyncValueID]))
		   {
				CreateEventTrigger($element[c_Property_Component],$element[c_Property_SyncValueID]);   //SyncEvent registrieren
			}
	   break;


	   case c_ShadowingType_Jalousie:
		   echo "	Jalousie ...noch zu implementieren
";
	   break;


	   case c_ShadowingType_Marquees:
		   echo "	Markise ...noch zu implementieren
";
	   break;

	}
next($arr);
}

//ermittelt aus dem Konfigstring die VariableID
function Get_IPSID($modulstring)
{
	return explode(',',$modulstring)[1];
}

function CreateEventTrigger($element, $syncvalID)
{
	$varid = Get_IPSID($element);                  //Die Modul ID ermitteln
	//falls die $syncvalID auf DEfault steht, die Standartdefaultvariable ("Wert") suchen
	if ($syncvalID=="defaultValueID")
	{
		$valueid=IPS_GetVariableIDByName('Wert',$varid);
	}
	else
	{
	   $valueid=$syncvalID;
	}
	echo ($valueid.",".$element."
");
	$messageHandler = new IPSMessageHandler();
	$messageHandler->RegisterOnChangeEvent($valueid ,$element, 'IPSModuleShutter_IPSShadowing');
}
   
?>

Er ist noch nicht allgemein gültig, wenn aber Interesse besteht, könnte man dies ja noch vollenden.

Viele Grüße
tommes

Ist der zusätzliche Konfigurationsparameter überhaupt notwendig, die ID der zugehörigen Instanz ist ja bereits über die Component definiert.

Im Falle von Homematic wird bereits jetzt die zugehörige Variable ermittelt und beim MessageHander registriert:


	// Register Events for Device Synchronization
	// ------------------------------------------
	IPSUtils_Include ('IPSMessageHandler.class.php', 'IPSLibrary::app::core::IPSMessageHandler');
	$messageHandler = new IPSMessageHandler();
	foreach ($DeviceConfig as $DeviceName=>$DeviceData) {
		$component = $DeviceConfig[$DeviceName][c_Property_Component];
		$componentParams = explode(',', $component);
		$componentClass = $componentParams[0];

		// Homematic
		if ($componentClass=='IPSComponentShutter_Homematic') {
			$instanceId = IPSUtil_ObjectIDByPath($componentParams[1]);
			$variableId = @IPS_GetObjectIDByName('LEVEL', $instanceId);
			if ($variableId===false) {
				$moduleManager->LogHandler()->Log('Variable with Name LEVEL could NOT be found for Homematic Instance='.$instanceId);
			} else {
				$moduleManager->LogHandler()->Log('Register OnChangeEvent vor Homematic Instance='.$instanceId);
				$messageHandler->RegisterOnChangeEvent($variableId, $component, 'IPSModuleShutter_IPSShadowing,');
			}
		} else {
			$moduleManager->LogHandler()->Log('Found Component '.$componentClass);
		}
	}

Sollte doch analog auch für Deine Modbus Installation möglich sein …

Hi,

Danke für den Tip, ja klar das wäre eine Möglichkeit, wo befindet sich die Funktion, ich finde sie nicht?

Nun zu Deiner Frage, ob man den Parameter überhaupt angeben muss. In meinem Fall kann man ihn sicherlich weglassen, da ich alle Lesewerte in die Standardvariable zurückschreibe, was ist aber, wenn der up/down Befehl in einer anderen Variable verarbeitet werden soll, als der Positionswert?

Viele Grüße
tommes

Ich habe IP-Symcon 4 auf einem Raspberry laufen und IPSShadowing installiert. Die Rollläden werden über Homematic gesteuert.

Wenn IPS Shadowing versucht die Rolläden automatisch zu fahren kommt folgende Fehlermeldung:

Die Zeile 95 auf die verwiesen wird ist diese


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

Hat jemand einen Tipp wie ich den Fehler beseitigen kann bzw. was die Ursache des Fehlers ist?

Wenn ich manuell im Webfront auf hochfahren drücke dann fährt der Rolladen einen kurzen Augenblick hört dann aber wieder auf.

Die Homematic Instanzen auf die ich in der Config verweise sehen so aus:

in der Config steht das dann so drinnen:


c_ShadowingDevice_6 =>	array(
				c_Property_ShadowingType	=> 	c_ShadowingType_Shutter,
				c_Property_Name				=> 'Schlafzimmer Links',
				c_Property_Component		=> 'IPSComponentShutter_Homematic,51720',
				c_Property_TimeOpening		=> 	22,
				c_Property_TimeClosing		=> 	21,
				c_Property_TimePause		=> 	1,
				c_Property_TempSensorIndoor	=> '19470',
				),
			c_ShadowingDevice_7 =>	array(
				c_Property_ShadowingType	=> 	c_ShadowingType_Shutter,
				c_Property_Name				=> 'Schlafzimmer Rechts',
				c_Property_Component		=> 'IPSComponentShutter_Homematic,54343',
				c_Property_TimeOpening		=> 	25,
				c_Property_TimeClosing		=> 	24,
				c_Property_TimePause		=> 	1,
				c_Property_TempSensorIndoor	=> '19470',
				),

Was muss ich eigentlich einstellen damit die Position die IP Symcon anfährt mit der der CCU identisch ist?

Ich habe die Fahrzeiten exakt so eingestellt wie in der CCU.


c_ShadowingDevice_6 =>	array(
				c_Property_ShadowingType	=> 	c_ShadowingType_Shutter,
				c_Property_Name				=> 'Schlafzimmer Links',
				c_Property_Component		=> 'IPSComponentShutter_Homematic,51720',
				c_Property_TimeOpening		=> 	21.7,
				c_Property_TimeClosing		=> 	20.7,
				c_Property_TimePause		=> 	1,
				c_Property_TempSensorIndoor	=> '19470',
				)

Wenn ich auf Offen drücke im Webfront von IP Symcon über IPSShadowing fährt er auf 97.5%
IPSShadowing


IPS Console

CCU

Ich hätte aber gerne das er auf 100% fährt bzw. die Werte die ich in IP-Symcon im Webfront auswähle mit der Position die die CCU anfährt und anzeigt übereinstimmt. Was muss ich denn dafür machen?