Ansteuerung von BTicino Bussystem

Liebe Experten!

Leider habe ich ein Bussystem im Einsatz, für das es im IPS kein Modul gibt (BTicino). Auf dem Bus hängen 15 Rollos. Der Bus ist über ein Converter-Device an das LAN angschlossen das OpenWebNet spricht.
Ich habe nun ein kleines Konsolenprogramm geschrieben, das ich per IPS_Execute aufrufe und so problemlos alle Rollos steuern kann.

Das Problem ist allerdings, dass IPS nicht mitkriegt, wenn ein Rollo über einen Taster bewegt wird. Ich habe schon daran gedacht, einen Listener-Service zu schreiben der den Bus monitort, weiss aber nicht, wie ich das in IPS kriege.

Wahrscheinlich kann IPS das sogar von Haus aus und ich mache es viel zu kompliziert.

Ich bin sehr auf eure Tipps gespannt und danke schon jetzt für eure Hilfe!

LG
Hugo

Du könntest es mal mit einem ClientSocket probieren. IP und Port eintragen und mal debuggen.

Hallo Hugo,
wenn Du überlegst einen Listener zu schreiben, kannst Du das Gateway dazu bewegen dir aktiv an eine IP und einen Port Nachrichten zu senden?

Falls ja, solltest Du dir die Register Variablen bzw Client Sockets ansehen (das wäre der IPS-Weg von Haus aus). Jwka hat ein lesenswertes Tutorial dazu geschrieben:
http://www.ip-symcon.de/forum/f52/newbie-fuer-newbies-register-variablen-10754/

Viele Grüße, Benjamin

[Da war der Rainer wohl schneller… :D]

Hallo!

Danke für die Tipps. Ich habe es nun nach der Anleitung von Jwka probiert und es funktioniert soweit, dass ich den Bus auslesen kann.

Das bringt mich aber zu einer weiteren Frage; Wie bringe ich IPS nun den Status der einzelnen Rollos bei? Wenn ich über IPS schalte ist es klar. Nun betätigt aber einer den Taster, über den Bus bekommt IPS dank dem Script mit was abgeht. Jetzt sollte ich den Status aber noch den Rollos zuordnen - stehe da etwas auf dem Schlauch…

Dafür musst Du den Rollos Variablen zuweisen, die entsprechenden Daten auslesen und den Variablen zuweisen.

Die Instanzen über die ich die Rollos steuere haben Statusvariablen. Diese kann ich aber lt. Doku nicht setzen oder verstehe ich da was falsch?

Noch ein Problem an dieser Stelle: Ich habe ein Script geschrieben, in der ich mit einer simplen For-Schleife x-mal mein Consolenprogramm aufrufe um mehrere Rollos gleichzeitig zu steuern. Da ich dann das gleiche Problem mit den Status habe, bin ich auf die Suche nach einer Möglichkeit gegangen wie ich die Instanzen direkt ansprechen kann und bin auf den Befehl „SC_MOVE“ gestossen. Dieser funktioniert einwandfrei, die Position der Rollos werden auch richtig gesetzt - solange der Befehl nicht in einer Schleife verwendet wird. Der Befehl wartet offenbar, bis die definierte Zeit die in der Instanz definiert wurde verstrichen ist und macht erst dann weiter, was zur Folge hat, dass nach dem dritten Rollanden das Script in einen Timeout läuft.

Gibt es eine elegantere Methode das zu lösen? Oder gibts eventuell einen Parameter für SC_MOVE dass das Script weiter abgearbeitet wird?

Vielen Dank nochmals für eure Hilfe und verzeiht mir bitte, falls ich doofe Fragen stelle.

LG
Hugo

Hat niemand eine Antwort auf meine Fragen?

Meine Antwort hat dir ja anscheinend nicht gefallen und alles andere ist rumgerate und darauf hat keiner Lust.

Stell Code ein das man sich überhaupt mal ein Bild davon machen kann was Du willst. Du wirfst hier Brocken in den Raum, womit kein Mensch was anfangen kann.

In bin froh, wenn mir jemand hilft, da ich mit dem Thema noch ziemlich am Anfang stehe, also von „nicht gefallen“ kann keine Rede sein - ich wusste nur nicht genau was du damit meinst.

Ich versuche mal alles so genau zu beschreiben wie es geht und hoffe, dass dann klar ist was ich zu tun versuche:

Problem 1: Wie kann ich der Statusvariable die aktuelle Position der Rolläden zuweisen (Objekt ID 52961 im Anhang „Objektbaum.jpg“ wenn jemand einen Taster des BTicino-Systems betätigt?

Ich erhalte die einzelnen Status der Rolläden über folgendes PHP-Script

<?

$RegVarID = $IPS_INSTANCE;
$newdata = $IPS_VALUE;
$myID = $IPS_SELF;
$SocketID = IPS_GetParent($myID);


$data = RegVar_GetBuffer ( $RegVarID );

if ($data = "*#*1##") { //sende Monitorkomanndo wenn der Empfangsstring ankommt
	CSCK_SendText(23985 /*[BTicino Socket Client]*/ ,'*99*1##');
}

$data .= $newdata;
// Parsen
$suchmuster = '/^\*\#\*1\#\#\*2\*([0-2])\*([0-9]+)\#\#/';
if (preg_match($suchmuster, $data, $treffer) > 0) {

//CODE ZUM SETZEN DES ROLLOSTATUS HIER
//TREFFER[1] = 0..2 (stop/auf/ab)
//TREFFER[2] = RolloID

IPS_LogMessage("BTicono-Listener",$treffer [1]." " . $treffer[2]);
}
// wrte back data to variable for use in other scripts
RegVar_SetBuffer($RegVarID, $data);

?>

Die Statusvariable (ID52961) ist schreibgeschützt; es steht auch dabei "Variable kann nicht von PHP-Scripts geändert werden. Ich habe auch schon versucht eine eigene Variable anzulegen, weiss aber nicht wie ich die mit der Instanz verknüpfen kann.

Problem 2: Wie ändere ich die Position von mehreren Rollos gleichzeitig und stelle sicher, dass IPS den Status der Rollos kennt?

Folgendes Script funktioniert, allerdings weiss ich wie auch beim Problem 1 nicht, wie ich den Status der Rollos an IPS weitergebe:

<?
 $s = IPS_GetScript(39076 /*[Rolläden\Script\B-Ticino Control]*/);
 include($s['ScriptFile']); //Funktion, die ein Commandlinetool für das Steuern der Rollos aufruft
//Variables provided by ShutterControl Module
//IPS_LogMessage("InstanceID", $SC_INSTANCE); /* InstanceID */
//IPS_LogMessage("Direction", $SC_DIRECTION); /* {0..2} Stop, Up, Down */
//IPS_LogMessage("Duration", $SC_DURATION); /* ms */


if($IPS_SENDER != "ShutterControl") die("This script can only be started by the ShutterControl Module");

$i2f[1] = 52953 /*[Rolläden\Erdgeschoss\Büro Nord]*/; //Büro Nord
$i2f[2] = 32712 /*[Rolläden\Erdgeschoss\Küche West]*/; //Küche West
$i2f[3] = 49033 /*[Rolläden\Erdgeschoss\Mehrzweckraum]*/; //Mehrzweckraum
$i2f[4] = 55561 /*[Rolläden\Erdgeschoss\Wohnzimmer Ost]*/; //Wohnzimmer Ost
$i2f[5] = 44322 /*[Rolläden\Erdgeschoss\Wohnzimmer Süd]*/; //Wohnzimmer Süd
$i2f[6] = 38225 /*[Rolläden\Erdgeschoss\Wohnzimmer West Mitte]*/; //Wohnzimmer West 1
$i2f[7] = 45193 /*[Rolläden\Erdgeschoss\Wohnzimmer West]*/; //Wohnzimmer West 2
$i2f[8] = 19865 /*[Rolläden\Erdgeschoss\Stiegenhaus Nord]*/; //Stiegenhaus Nord
$i2f[9] = 41347 /*[Rolläden\Obergeschoss\KiZi Süd]*/; //KiZi Süd
$i2f[10] = 35282 /*[Rolläden\Obergeschoss\KiZi West]*/; //KiZi West
$i2f[11] = 22609 /*[Rolläden\Obergeschoss\Zi1]*/; //Zi1
$i2f[12] = 36194 /*[Rolläden\Obergeschoss\KiZi1]*/; //KiZi1
$i2f[13] = 54769 /*[Rolläden\Obergeschoss\Bad]*/; //Bad
$i2f[14] = 43266 /*[Rolläden\Obergeschoss\SZ1]*/; //SZ1
$i2f[15] = 12076 /*[Rolläden\Obergeschoss\SZ2]*/; //SZ2
$i2f[16] = 19865 /*[Rolläden\Erdgeschoss\Stiegenhaus Nord]*/; //Stiegenhaus Nord

switch($SC_INSTANCE){
	case "57491": //Alles gewählt
	$sca=1;
	$sce=16;
break;
	case "12994": //Alles EG gewählt
	$sca=1;
	$sce=8;
break;
	case "31290": //Alles OG gewählt
	$sca=9;
	$sce=16;
break;
}
      switch($SC_DIRECTION)
         {
         case SC_DIRECTION_STOP:
         	for ($i = $sca; $i <= $sce; $i++) {
          		ExecuteShutter(0,$i2f[$i]);

				}
          break;
         case SC_DIRECTION_UP:
            for ($i = $sca; $i <= $sce; $i++) {
          		ExecuteShutter(1,$i2f[$i]);
			   }
          if($SC_DURATION > 0)
         {
                IPS_Sleep($SC_DURATION);
            for ($i = $sca; $i <= $sce; $i++) {
          		ExecuteShutter(0,$i2f[$i]);
				}
         }
         break;
         case SC_DIRECTION_DOWN:
           	for ($i = $sca; $i <= $sce; $i++) {
          		ExecuteShutter(2,$i2f[$i]);

//SC_Move($i2f[$i], 100);
			   }
 			if($SC_DURATION > 0)
         {
              IPS_Sleep($SC_DURATION);
         	for ($i = $sca; $i <= $sce; $i++) {
          		ExecuteShutter(0,$i2f[$i]);
			   }
         }
          break;
      }

Wenn ich den Befehl SC_Move (im Script auskommentiert) statt ExecuteShutter verwende, dann werden die Rollos hintereinander geschaltet, d.h. erst wenn der erste Rollo vollständig auf- oder zu ist kommt der nächste dran - und das verursacht nach einiger Zeit auch ein TimeOut. Allerdings werden mit dieser Methode die Status der Variable POSITION richtig gesetzt.

Ich hoffe, dass ich nun alle Informationen die ihr Experten braucht angeführt habe und meine Beschreibung halbwegs klar ist. Wie gesagt - ich bin noch ein Anfänger und am Lernen, also entschuldigt bitte, wenns eine blöde Frage ist. Ich danke im Voraus für eure Hilfe

Hugo

Was Du als mit deinen blöde Fragen hast, es gibt keine blöde Fragen. :confused:

Du kannst grundsätzlich keine Variablen von automatisch angelegten Instanzen setzen. Dieses geht nur über ein Script mit Aufruf der InstanzID und dem entsprechendem Befehl.

Wenn Du diese Variable unbedingt benötigst, musst Du dir eine Hilfsvariable anlegen, welche Du dann auch beschreiben kannst und müsstest die Orginal auswerten im Script auf Variablenänderung.

Ich habe heute weiter experimentiert und ich glaube ich habe es jetzt kapiert. Ich habe eine integer Variable angelegt und überwache sie bei der darüberliegenden Instanz auf Variablenänderung. Die Variable ändere ich über mein Script das den BTicino Bus abhört.

Die Rollos bewegen sich zwar noch nicht so wie ich will (laufen 5x an und stoppen wieder) aber das liegt wohl an einem Scriptfehler. Ich probiere mal weiter und wenn ich nicht vorwärts komme werde ich euch wieder löchern :slight_smile:

Danke nochmals,
Hugo