Hallo michaelwsw5,
hier ist mein Skript zum senden der Fahrzeit an die FSBs. Es ist leider noch etwas „dirty“, aber es funktioniert! Ich habe zu jedem Rollladen eine Integer Variable „Postion“ erstellt und das Skript als Aktion hinterlegt, siehe Screenshots.
Im WebFront sieht es dann so aus:
Im Skript müssen noch folgende Dinge definiert werden:
- Laufzeiten der verschiedenen Typen
- Die ID der Register Variable ($regvar)
- In der Funktion „Telegramm“ müssen noch die IDs ($id1-$id3) entsprechend der Gateway Base-ID eingetragen werden
Bei der Variable „$ENOID“ wird zuerst die bestehende Geräte-ID (im Aktor eingelernt als „Richtungstaster“ für normal Auf/Ab) der jeweiligen Instanz ausgelesen und dann mit 128 und 64 addiert. 128 weil meine Gateway Base-ID mit 0x80 endet. Die 64 habe ich mir überlegt um die Vergabe der IDs für „Fahrkommando mit Zeitwertübergabe von GFVS“ zu vereinfachen (also bestehende ID + 64). Ich habe also für jedes Beschattungselement in den Aktoren jeweils zwei IDs eingelernt, einmal normal als „Richtungstaster“ (Instanz Enocean EltakoSwitch) und einmal als „Fahrkommando mit Zeitwertübergabe“. Klingt kompliziert, ich hoffe du verstehst was ich meine.
Hier noch ein Screenshot meiner Instanz:
Außerdem habe ich eine Variable „Typ“, da ich verschiedene Beschattungstypen mit verschiedenen Laufzeiten habe. Die Variable wird vom Skript angelgt, es muss nur noch angepasst und das entsprechende Profil angelegt werden.
Übrigens, das Ganze basiert noch auf ESP2! Werde es irgendwann in ferner Zukunft mal auf ESP3 umstellen.
<?
/*
Skript zum Setzen der Beschattungsposition
Auslöser: Webfront - Integer Variable (Slider)
Bedingung:
19.09.2015 - Roberto Martins
*/
if($IPS_SENDER == "WebFront"){
$regvar = 12345; //Register Variable
$OldPosition = GetValue($IPS_VARIABLE); // Alte Position vor ändern feststellen
SetValue($IPS_VARIABLE, $IPS_VALUE); // Neue Position setzen
$ParentID = IPS_GetParent($IPS_VARIABLE); // Instanz-ID ermitteln
$DeviceID = IPS_GetProperty($ParentID, "DeviceID"); // Device-ID ermitteln
$ENOID = dec2hex02(128+64+$DeviceID); // Enocean Sender-ID der Instanz ermitteln (TCM-ID + 64, nur letzter Byte, für Zeitwertübergabe an FSB14)
$TypeID = CreateVariableByName($ParentID, 'Typ', "Beschattungstypen", 1, true);
$Type = GetValue($TypeID); // Rolladentyp ermitteln
$MovingID = CreateVariableByName($ParentID, 'Moving', "", 0, true);
switch ($Type)
{
case 1:
$SecAuf = '18'; //Zeit Typ 1 auf in Sekunden
$SecAb ='17'; //Zeit Typ 1 zu in Sekunden
break;
case 2:
$SecAuf = '26'; //Zeit Typ 2 auf in Sekunden
$SecAb ='21'; //Zeit Typ 2 zu in Sekunden
break;
case 3:
$SecAuf = '60'; //Zeit Typ 3 auf in Sekunden
$SecAb ='60'; //Zeit Typ 3 zu in Sekunden
break;
}
if ($IPS_VALUE > $OldPosition) // Ab sonst Auf
{
if ($IPS_VALUE == 100)
{
$Fahrzeit = dec2hex02(($SecAb/100)*($IPS_VALUE - $OldPosition)+5);
}
else
{
$Fahrzeit = dec2hex02(($SecAb/100)*($IPS_VALUE - $OldPosition));
}
$Bewegung = "02"; //Ab
}
else
{
if ($OldPosition < 100)
{
$Fahrzeit = dec2hex02(($SecAuf/100)*($OldPosition - $IPS_VALUE));
}
else
{
$Fahrzeit = dec2hex02(($SecAuf/100)*($OldPosition - $IPS_VALUE)+5);
}
$Bewegung = "01"; //Auf
}
$telegram = Telegramm($Fahrzeit, $Bewegung, $ENOID);
SetValue($MovingID, true); //Moving-Variable auf true setzen wegen Positionsauswertung mit Statustelegramm
IPS_Sleep(200);
RegVar_SendText($regvar , $telegram);
IPS_Sleep((hexdec($Fahrzeit)*1000)+2000);
SetValue($MovingID, false); //Moving-Variable wieder auf false setzen
}
// ######################### FUNKTIONEN #########################
function Telegramm($data2, $data1, $id4)
{
// Telegrammaufbau definieren
$sync = "A55A";
$header = "6B";
$org = "07";
$data3 = "02";
//$data2 = "00";
//$data1 = "00";
$data0 = "08";
$id1 = "FF";
$id2 = "FF";
$id3 = "FF";
//$id4 = "B7";
$status = "00";
$checksumcalc = dec2hex04(hexdec($header) + hexdec($org) + hexdec($data3) + hexdec($data2) + hexdec($data1) + hexdec($data0) + hexdec($id1) + hexdec($id2) + hexdec($id3) + hexdec($id4) + hexdec($status));
$checksumbytes = str_split($checksumcalc, 2);
$checksum = $checksumbytes[1];
// Telegramm zusammenstellen
$telegram = Hex2Str($sync.$header.$org.$data3.$data2.$data1.$data0.$id1.$id2.$id3.$id4.$status.$checksum);
return $telegram;
}
function Hex2Str($hex)
{
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
function dec2hex04($dec)
{
return sprintf("%04X", $dec);
}
function dec2hex02($dec)
{
return sprintf("%02X", $dec);
}
function CreateVariableByName($id, $name, $profile, $type, $hidden)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid===false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "This Variable was created by Script #".$_IPS['SELF']);
IPS_SetHidden($vid, $hidden);
if($profile !== "")
{
IPS_SetVariableCustomProfile($vid, $profile);
}
}
return $vid;
}
?>
Grüße
Roberto