ShutterControl und externe Bedienung

Ich bin gerade dabei, meine bestehende LCN Anlage in IPS zu integrieren.
ShutterControl läuft so weit ganz ordentlich, besonders das Einmessen ist klasse. Nur darf man eben so einen Rollladen anschließend nicht mehr von Hand bedienen, sonst macht ShutterControl einfach Mist.
Meine Rollläden hängen alle an Ausgängen, somit bekomme ich nach Handbedienung in Endstellung 2% Motor-Intensity angezeigt, einen Wert, den ich auswerten könnte und damit die ShutterControl-Position nachfahren könnte. Der passende Event wird auch ausgelöst, aber die Variable ist als Statusvariable schreibgeschützt. Gibt es eine Möglichkeit, diese Position zu setzen?

Für meine alte Steuerung mit dem Domiq-Base hatte ich ein LUA Script geschrieben, dass folgende Funktionen ermöglicht.

[ul]
[li]Positionierung auf beliebigen Prozentwert direkt
[/li][li]Positionierung auf beliebigen Prozentwert über die nächstgelegene Endlage (maximale Fahrzeit + 2 Sekunden)
[/li][li]Erkennung von Fremdfahrten und setzen der Position als unbekannt - Anschließende Positionierung wird immer über die entsprechene Endlage gefahren
[/li][li]Erkennen von Endlagen bei Rollläden an Motoren (2% Motorwert) und Synchronisation des Scriptes
[/li][li]Erkennen von Endlagen bei Rollläden an Relais, wenn das Netzrelais länger als die maximale Fahrtzeit angezogen hat mit Auswertung des Richtungsrelais.
[/li][/ul]
Hat jemand einen Tipp für mich, wie ich die Position ins ShutterControl beamen kann? Oder sollte ich lieber gleich mein eigenes Script nach php umschreiben (ich bin kein php Freak!)?

Hat IPSShadowing das Problem der Fremdsteuerung gelöst?

Gruß
Florian

Moin Florian,

das Uraltscript, das bei mir immer noch klaglos läuft, bekommt bei manueller Bedienung in einer Hilfsvariablen die Position 999 gesetzt. Das Script wertet die LCN Tasten aus, die manuell gedrückt werden könnten.
Wenn der Wert so ist wird die nächste Fahrt über Position 0 durchgeführt.

Hallo Ralf,

ich knüpfe hier nochmals an. Mir geht es wie Florian - ich möchte die LCN-Rollos (am Relais) auch manuell bedienen und die Position angezeigt bekommen. Könnst Du mal das Uralt-script veröffentlichen?
Gäbe es denn die Möglichkeit, das Shuttermodul um die Fähigkeit der Handbedienung zu ergänzen?

Grüße, Gerhard

Hallo Gerhard,

mit „dem Script“ ist das schon etwas Aufwand beim Einrichten und die Position hast du nur, wenn sie scriptgesteuert angefahren wird. Das ganze läuft noch in meiner V3.4 Umgebung.

Als Basis Info der Objektbaum Teil zu einer Jalusie:


Die LCN Instanzen haben bei mir immer noch Segment, Modul und Relais/Ausgang mit im Namen, damit sollte sich das auch erklären. Für die Handsteuerung sind das virtuelle Relais. Die Tasten wurden das letzte Mal in 2014 betätigt :eek:.

[ul]
[li]JalusiePositionierung
[/li][/ul]

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : JalusiePositionierung.ips.php
Trigger  :
Interval :
*/


//Dieses Script positioniert eine Rolladen an einem Relaisblock über die eingelernte Zeit.
//Die Sollpos kann von 0 (offen) bis 100 (geschlossen) eingestellt werden.
//Es muessen pro Rolladen zwei Integer Variable (hier "JalusieAktuellePosition" und "JalusieSollPosition") angelegt werden.
//Jeder Befehl an diesen Rolladen der aus dem LCN Bus direkt kommt (z.B. Handbetrieb), muss parallel die Variable des Rolladens auf 999 setzen.
//Somit weiss das Script beim nächsten Aufruf, dass der Rolladen manuell verstellt wurde und die gespeicherte Pos in IPS nicht der tatsächlichen entspricht.
//Dann wird die nächste gewünschte Position über die obere Endlage angefahren.


$actpos = GetValueInteger(38830 /* [Flur/Windfang/GästeWC\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/);   //holt den aktuellen Positionswert
$laufzeit = 14;                 // Fahrzeit für eine Komplettfahrt in Sekunden (individuell zu messen und einzugeben)
$laufzeit2 = $laufzeit*1000;    // Definiert die Laufzeit für eine komplette Fahrt in Millisekunden
$step = $laufzeit/100;          // gibt die Laufzeit je Prozentstep an
$step2 = ($laufzeit+2)/100;     // "+2" Korrekturfaktor für Aufwärtsfahrt
$sollpos = GetValueInteger(20139 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieSollPosition]*/);
$debug = true;

$relpos=$sollpos-$actpos;

switch($actpos){

case 999:
  $TX_BUF = ">M000137.RL------10".chr(10);     // Relais des Rolladens für Fahrt nach oben
  $result = CSCK_SendText(23073 /*[PCHK produktiv]*/, $TX_BUF);
  SetValueInteger(38830 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/ , 0);
  ips_sleep($laufzeit2);
  IPS_RunScript($_IPS['SELF']);
  break;

default:
  if($relpos>0)   //Gewünschte Position ist größer wie die aktuelle
  {
    $richtung=0;
    $fahrzeit=$relpos*$step*1000;
  }
  elseif($relpos<0)
  {
    $richtung=1 ;
    $fahrzeit=$relpos*$step2*-1000;
  }
  else               //Gewünschte Position ist gleich wie die aktuelle
  {
    $richtung=2 ;
    $fahrzeit=$relpos*$step*-1000;
  }
//  if ($debug)
//    IPS_LogMessage(IPS_GetName($_IPS['SELF']), "relpos: " . $relpos . " sollpos: " . $sollpos . " step: " . $step . " step2: " . $step2 . " fahrzeit: " . intval($fahrzeit));

  switch($richtung)  {
  case 0:
    if ($debug)
      IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Position ändern -> runter für " . $fahrzeit . " millisekunden.");
    SetValueInteger(38830 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/, $sollpos);
    $TX_BUF = ">M000137.RL------01".chr(10);
    $result = CSCK_SendText(23073 /*[PCHK produktiv]*/, $TX_BUF);
    ips_sleep(intval($fahrzeit));
    break;
  case 1:
    if ($debug)
      IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Position ändern -> rauf für " . $fahrzeit . " millisekunden.");
    SetValueInteger(38830 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/, $sollpos);
    $TX_BUF = ">M000137.RL------10".chr(10);
    $result = CSCK_SendText(23073 /*[PCHK produktiv]*/, $TX_BUF);
    ips_sleep(intval($fahrzeit));
    break;
  case 2:
    if ($debug)
      IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Position erreicht -> STOP");
    SetValueInteger(38830 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/ , $sollpos);
    break;
  }

  $TX_BUF = ">M000137.RL------00".chr(10);
  $result = CSCK_SendText(23073 /*[PCHK produktiv]*/, $TX_BUF);
  if ($debug)
    IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Wartezeit ". $fahrzeit . " ms beendet, STOP senden, Result: " . $result );
  break;
}

?>

[ul]
[li]JalusieTasterAnsteuerung
[/li][/ul]

<?
$debug = true; 

function boolStringEinAus($bValue = false) {                      // returns string
  return ($bValue ? 'ein' : 'aus');
}
$hoch = GetValueBoolean(32453 /*[Flur_Windfang\Jalusie\Jalusie Handsteuerung hoch (0, 51, R1)\Status]*/);
$runter = GetValueBoolean(10118 /*[Flur_Windfang\Jalusie\Jalusie Handsteuerung runter  (0, 51, R2)\Status]*/);
$manuell = GetValueBoolean(16233 /*[Flur_Windfang\Jalusie\Jalusie Handsteuerung manuell  (0, 51, R3)\Status]*/);

if ($hoch) {
  SetValueInteger(20139 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieSollPosition]*/, 0 );
  $TX_BUF = '>M000051.RL0-------'.chr(10);
  $result = CSCK_SendText(23073 /*[PCHK produktiv]*/, $TX_BUF);
}

if ($runter) {
  SetValueInteger(20139 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieSollPosition]*/, 100 );
  $TX_BUF = '>M000051.RL-0------'.chr(10);
  $result = CSCK_SendText(23073 /*[PCHK produktiv]*/, $TX_BUF);
}

if ($manuell) {
  SetValueInteger(38830 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/, 999 );
  $TX_BUF = '>M000051.RL--0-----'.chr(10);
  $result = CSCK_SendText(23073 /*[PCHK produktiv]*/, $TX_BUF);
}

if ($debug)
  IPS_LogMessage(IPS_GetName($_IPS['SELF']), "MANUELL - hoch = " . boolStringEinAus($hoch) . " :: runter = " . boolStringEinAus($runter) . " :: manuell = " . boolStringEinAus($manuell) . " :: Result: " . $result );
?>

[ul]
[li]JalusieKomplettÖffnen
[/li][/ul]

<?
$debug=true;

function boolStringEinAus($bValue = false) {                      // returns string
  return ($bValue ? 'ein         ' : 'aus         ');
}

$RolloPosition = GetValueInteger(38830 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/);
$InnenLichtGesperrt = GetValueBoolean(44431 /*[Steuerung\Beleuchtung\Innenbeleuchtung frei\Status]*/);
$HaustuerGeschlossen = GetValueBoolean(57727 /*[Flur_Windfang\Haustür Schloss\Haustür Status]*/);

if ($debug)
	IPS_LogMessage(IPS_GetName($_IPS['SELF']), "(GESTARTET) " . $_IPS['SENDER'] . ", Akt. Pos. " . $RolloPosition . ", Innenlicht " . boolStringEinAus($InnenLichtGesperrt) . ", HaustuerGeschlossen " . boolStringEinAus($HaustuerGeschlossen));

if ($_IPS['SENDER'] == "TimerEvent") {
	if (!$InnenLichtGesperrt AND ($RolloPosition == 80 OR $RolloPosition == 100) AND !$HaustuerGeschlossen) {
		if ($debug)
			IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Rollo öffnen (TIMER)" );
   // Velux Rollo Flur 0% ==> öffnen
	SetValueInteger(20139 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieSollPosition]*/, 0);
	SetValueBoolean(24471 /*[Steuerung\Zirkulationspumpe\FirstMoveFlur]*/, FALSE );
  }
}

?>

Und für die Ansteuerung aus dem Dashboard sind die Positionen im Dashboard hinterlegt.
LCN_Rollo_Dashboard.png

[ul]
[li]Jalusie fahren (Dashboard)
[/li][/ul]

<?

SetValueInteger(20139 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieSollPosition]*/, (int)$_IPS['COMPONENT']);

?>

[ul]
[li]JalusieKomplttÖffnen
[/li][/ul]

<?

$debug=true;

function boolStringEinAus($bValue = false) {                      // returns string
  return ($bValue ? 'ein         ' : 'aus         ');
}

$RolloPosition = GetValueInteger(38830 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieAktuellePosition]*/);
$InnenLichtGesperrt = GetValueBoolean(44431 /*[Steuerung\Beleuchtung\Innenbeleuchtung frei\Status]*/);
$HaustuerGeschlossen = GetValueBoolean(57727 /*[Flur_Windfang\Haustür Schloss\Haustür Status]*/);

if ($debug)
	IPS_LogMessage(IPS_GetName($_IPS['SELF']), "(GESTARTET) " . $_IPS['SENDER'] . ", Akt. Pos. " . $RolloPosition . ", Innenlicht " . boolStringEinAus($InnenLichtGesperrt) . ", HaustuerGeschlossen " . boolStringEinAus($HaustuerGeschlossen));

if ($_IPS['SENDER'] == "TimerEvent") {
	if (!$InnenLichtGesperrt AND ($RolloPosition == 80 OR $RolloPosition == 100) AND !$HaustuerGeschlossen) {
		if ($debug)
			IPS_LogMessage(IPS_GetName($_IPS['SELF']), "Rollo öffnen (TIMER)" );
   // Velux Rollo Flur 0% ==> öffnen
	SetValueInteger(20139 /*[Flur_Windfang\Jalusie\JalusiePositionierung\JalusieSollPosition]*/, 0);
	SetValueBoolean(24471 /*[Steuerung\Zirkulationspumpe\FirstMoveFlur]*/, FALSE );
  }
}

?>

Ich hoffe, ich habe nichts vergessen.

Danke, Ralf.

Ich werde mir das mal in Ruhe ansehen.

Grüße, Gerhard