Ich habe ein Skript geschrieben, das eine String-Variable auswertet und das Display einer HomeMatic-Fernbedienung entsprechend setzt. Um das ganze komfortabler zu machen, werden alle Informationen aus einem einzigen String gezogen. Das Skript tut dann einige mehr oder minder „kluge“ Dinge:
-Falls im String eine unterstützte Einheit gefunden wird (z.B. °C) wird automatisch das entsprechende Einheitssymbol im Display verwendet.
-Falls der String ansonsten numerisch ist, wird er automatisch rechtsbündig angezeigt.
-vor dem String lassen sich, separiert durch ein Pipe-Zeichen | Sonderfunktionen und Symbole angeben, z.B. blink für ein blinkendes Display, beep für einen Piepton oder bulb für das Glühlampen-Symbol. Die Bezeichner der Sonderfunktionen finden ich im Code.
Das Skript kann als Event-Handler auf Variablenaktualisierungen reagieren. Zum Test kann es per Execute aufgerufen werden und zeigt dann einen Test-Text.
Einige beispiele für gültige Strings:
bulb|DIM50%
21.5°C
HALLO
blink beep3 bell|ALARM
switch light|850W
<?
// diese Zeilen bitte entsprechend ändern.
$displayId = 10182 /*[Hardware\HomeMatic\Fernbedienung Kino\DISPLAY]*/;
$testText = '21,5°C';
if($_IPS['SENDER'] == 'Execute')
$text = $testText;
else if($_IPS['SENDER'] == 'Variable')
$text = $_IPS['VALUE'];
$unit = '0';
if(substr($text, -2) == '°C')
{
$unit = '3';
$text = substr($text, 0, strlen($text) - 2);
}
else if(substr($text, -2) == '°F')
{
$unit = '4';
$text = substr($text, 0, strlen($text) - 2);
}
else if(substr($text, -1) == '%')
{
$unit = '1';
$text = substr($text, 0, strlen($text) - 1);
}
else if((strtolower(substr($text, -1)) == 'w') &&
(is_numeric(substr($text, -2, 1)) || (substr($text, -2, 1) == ' ')))
{
$unit = '2';
$text = substr($text, 0, strlen($text) - 1);
}
if(strpos($text, '|') !== FALSE)
{
$symbols = substr($text, 0, strpos($text, '|'));
$symbols = explode(' ', $symbols);
$text = substr($text, strpos($text, '|') + 1);
}
$text = trim($text);
$hasDot = (strpos($text, '.') !== FALSE);
$hasComma = (strpos($text, ',') !== FALSE);
if($hasDot || $hasComma)
{
if($hasDot)
$text = substr($text, 0, strpos($text, '.') + 2);
else if($hasComma)
$text = substr($text, 0, strpos($text, ',') + 2);
if(strlen($text) > 6) $text = substr($text, 0, 6);
}
else
{
if(strlen($text) > 5) $text = substr($text, 0, 5);
if(is_numeric($text)) $text = str_pad($text, 5, ' ', STR_PAD_LEFT);
}
echo $text;
HM_WriteValueString($displayId, "TEXT", $text);
HM_WriteValueString($displayId, "UNIT", $unit);
foreach($symbols as $thisSymbol)
{
switch(strtolower($thisSymbol))
{
case 'beep':
case 'beep1':
HM_WriteValueString($displayId, "BEEP", '1');
break;
case 'beep2':
HM_WriteValueString($displayId, "BEEP", '2');
break;
case 'beep3':
HM_WriteValueString($displayId, "BEEP", '3');
break;
case 'light':
HM_WriteValueString($displayId, "BACKLIGHT", '1');
break;
case 'blink':
HM_WriteValueString($displayId, "BACKLIGHT", '2');
break;
case 'up':
HM_WriteValueBoolean($displayId, "ARROW_UP", TRUE);
break;
case 'down':
HM_WriteValueBoolean($displayId, "ARROW_DOWN", TRUE);
break;
case 'bell':
HM_WriteValueBoolean($displayId, "BELL", TRUE);
break;
case 'blind':
HM_WriteValueBoolean($displayId, "BLIND", TRUE);
break;
case 'bulb':
HM_WriteValueBoolean($displayId, "BULB", TRUE);
break;
case 'clock':
HM_WriteValueBoolean($displayId, "CLOCK", TRUE);
break;
case 'door':
HM_WriteValueBoolean($displayId, "DOOR", TRUE);
break;
case 'phone':
HM_WriteValueBoolean($displayId, "PHONE", TRUE);
break;
case 'scene':
HM_WriteValueBoolean($displayId, "SCENE", TRUE);
break;
case 'switch':
HM_WriteValueBoolean($displayId, "SWITCH", TRUE);
break;
case 'window':
HM_WriteValueBoolean($displayId, "WINDOW", TRUE);
break;
}
}
HM_WriteValueBoolean($displayId, "SUBMIT", True);
?>