@Torro
hier mal ein wenig Code für die neue Data-Variable eines FS20RX…
Erkennen des Festhaltens einer Fernbedienungstaste
Durch das Halten einer Fernbedienungstaste kann die
Anzahl von Tastenfunktionen einer Fernbedienung
verdoppelt werden. So kann z.B. eine 20-Tasten
Fernbedienung mit 40 Funktionen belegt werden.
Was ist zu tun?
Die Data-Variablen haben folgendes Benamungsschema:
{NameDerFernbedienung}_{NameDerTaste}.Data
Beispiel:
Fernbedienung1_1a.Data
Fernbedienung1_1b.Data
Fernbedienung1_2a.Data
Fernbedienung1_2b.Data
usw…
Hinweis:
{NameDerTaste} darf kein ‚_‘ enthalten!
- zwei weitere Variablen für die Fernbedienung anlegen
a) {NameDerFernbedienung}.HoldTimer (Typ: integer)
b) {NameDerFernbedienung}.HoldVarName (Typ: string)
Beispiel:
Fernbedienung1.HoldTimer (integer)
Fernbedienung1.HoldVarName (string)
-
die Datei ‚globals.php‘ (Code siehe unten) im Skript-Verzeichnis
anlegen. Dazu nicht den IPS-Skripteditor verwenden (der würde
‚globals.ips.php‘ erzeugen) sondern einen herkömmlichen Texteditor
benutzen.
-
mit dem IPS-Skripteditor ein Dispatcher-Skript für die
Fernbedienung erstellen (z.B. Fernbedienung1_Dispatcher)
(Beispielcode sie unten)
-
jede Data-Variable mit dem Dispatcher-Skript verbinden
Beispiel:
Fernbedienung1_1a.Data -> Fernbedienung1_Dispatcher
Fernbedienung1_1b.Data -> Fernbedienung1_Dispatcher
usw.
Bei mir heisst die Fernbedienung ‚FB_FS20_Rot‘ und hat die
Tasten ‚1a‘ bis ‚10b‘ (=20 Tasten).
Beispielcode für ‚FB_FS20_Rot_Dispatcher.ips.php‘
<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
*/
//File: FB_FS20_Rot_Dispatcher.ips.php
include_once "scripts/globals.php";
define( "Voice_Klara_ID" , 15646 ); // change this to your TTS-Instance
// $remote_name, $key, $hold per Reference! (see function-declaration)
GetRemoteKey( $IPS_VARIABLE, $remote_name, $key, $hold )
|| die("ERROR: GetRemoteKey() - invalid variable");
// repeated-hold wird in diesem Beispiel nicht gebraucht...
if( $hold == RC_HOLD_REPEAT ) exit;
if( $hold == RC_HOLD ) $key = $key." HALTEN";
switch( $key )
{
case '1a': TTS_Speak( Voice_Klara_ID, "Taste 1a wurde gedrückt." );
break;
case '1a HALTEN':
TTS_Speak( Voice_Klara_ID, "Taste 1a wird gehalten." );
break;
case '1b HALTEN':
TTS_Speak( Voice_Klara_ID, "Taste 1b wird gehalten." );
break;
default: TTS_Speak( Voice_Klara_ID, "Taste ".strtoupper($key)."; ist nicht, belegt." );
break;
}
?>
Der allgemeine Code, der für jede Fernbedieung verwendet
werden kann, ist in der Datei ‚globals.php‘:
<?php
define( "RC_OFF" , 0 ); // =SWITCH A (single channel mode - left key)
define( "RC_ON" , 17 ); // =SWITCH B (single channel mode - right key)
define( "RC_SWAP" , 18 ); // =SWITCH (double channel mode)
define( "RC_DIMUP" , 19 ); // =HOLD B (single channel mode - right key)
define( "RC_DIMDOWN" , 20 ); // =HOLD A (single channel mode - left key)
define( "RC_DIMUPDOWN" , 21 ); // =HOLD (double channel mode)
define( "RC_NOHOLD" , 0 );
define( "RC_HOLD" , 1 );
define( "RC_HOLD_REPEAT" , 2 );
/***********************************************************
$ok = GetRemoteKey( $ipsvariable, &$remote_name, &$key_name, &$hold )
IN $ipsvariable (string) :
OUT &$remote_name (string) :
OUT &$key_name (string) :
OUT &$hold (integer): RC_NOHOLD (=0)
RC_HOLD (=1)
RC_HOLD_REPEAT (=2)
RETURN:
true = ok
false = error
Aufbau der uebergebenen Variablen '$ipsvariable':
[remotename]_[keyname].Data (integer)
-> [remotename] = beliebige Zeichenfolge
-> [keyname] = [1..10][a|b]
Achtung! keyname darf KEINEN Underscore '_' enthalten!
Zusaetzlich anzulegende Variablen:
1) [remotename].HoldTimer (Typ: integer)
2) [remotename].HoldVarName (Typ: string)
***********************************************************/
function GetRemoteKey( $ipsvariable,
&$remote_name="",
&$key_name="",
&$hold=RC_NOHOLD )
{
$h = $ipsvariable;
if( !$p=strrpos( $h, '.Data'))
return( false ); // ERROR: no Data-Variable ('.Data' at the end)
$h = substr( $h, 0, $p);
if( !$p=strrpos( $h, '_'))
return( false ); // ERROR: no '_' as keyname separator
$key_name = substr( $h, $p+1);
$remote_name = substr( $h, 0, $p);
$data = GetValueInteger( $ipsvariable );
if( $data == RC_DIMUPDOWN ) // key hold? (in double channel mode)
{
$hold = RC_HOLD;
$new_time = GetUpdateTime( $ipsvariable );
if( GetValueString( $remote_name.'.HoldVarName') == $ipsvariable)
{
$old_time = GetValueInteger( $remote_name.".HoldTimer" );
if( $new_time-$old_time <= 1)
$hold = RC_HOLD_REPEAT; // hold continued
}
SetValueInteger( $remote_name.'.HoldTimer', $new_time);
SetValueString( $remote_name.'.HoldVarName', $ipsvariable );
}
return( true ); // ok - no errors...
}
?>