weitere Unterstützung von FS20TX (dim up/down)

Um die FS20 Fernbedienungen besser ausnutzen zu können, würde ich gerne die Funktion nutzen eine Taste lange halten zu können. Der FS20 Tester meldet dabei ‚Status: dim up/down‘ (Modus doppelte Kanalzahl) - somit ist diese Funktion vom Protokoll her bekannt.

Das lange drücken einer Fernbedienungstaste kann z.B. dazu dienen einen Hilfstext vorzusprechen oder sonstige Zusatzfunktionen zu übernehmen. Ich versuche gerade die Fernbedienungen mit eigenen Key-Dispatcher Funktionen möglichst komfortabel (teilweise mit Sprachfeedback) in das Gesamtsystem zu integrieren.

Gruß,
Oliver

Olli,

Mir hats die on-off funktion uber 2 tasten auch nicht gefallen…
Deshalb habe ich dies hier geschrieben :

<?
/*
*******************************
 IP-SYNCOM Event Scripting
*******************************
*/
//File: tliv_bur.ips.php
//
if (!defined(sdefined)){
   include_once("scripts/GlobalDefines.ips.php");
}
//                        (tliv_bur) -> DEVICE NAME
//                ---------------------------
//                |  Lights    |   IAmHome  |
//    tliv_bur1   |    100     |    110     |
//                |            |            |
//                |------------|------------|
//                |IAmOuttaHere|  DoThese   |
//    tliv_bur2   |    200     |    210     |
//                |            |            | Matrix of switches
//                ---------------------------
//
// ********** USER SETTINGS *******************************************
      // status variables used : (rows)  !! SET IN CONFIG !!
      // "t" . "$thisname" . "1"            // =  tliv_bur1
      // "t" . "$thisname" . "2"            // =  tliv_bur2
      //        |||||||||
   $thisname =  "liv_bur";                  //fi. liv_bur
   $thisswitch = "t"."$thisname";           // =  tlivbur
      //create these var's : (to keep toggle statuses)
      // "s" . "$thisname"."100"            // =  sliv_bur100
      // "s" . "$thisname"."110"
      // "s" . "$thisname"."200"
      // "s" . "$thisname"."210"

   // give the switches their functions : locallight, toggle, dothese, [fntionname]
   // dothese -> see in code for //** DOTHESE **
   // [fntionname] give name of function that has to be run
   $myfuncts = array("100" => "locallight", "110" => "IAmHome", "200" => "IAmOuttaHere", "210" => "dothese");
   //                 |||      ||||||||||- function
   //                 |||- See Matrix above

   //define their parameters
   $locallight = array(0 => oliv_bureel_lamp, 1 => "", 2 => "", 3 => "", 4 => "", 5 => "");

   //logfilepath
   $logfilepath=__myhome."running.txt";
// ********** END OF USER SETTINGS ************************************

//debug
//$IPS_VARIABLE = "tliv_bur1";

// MODIFIE BEYOND THESE LINE ON OWN RISK
// EXCEPT **DOTHESE**
//
$ldebug = GetValueBoolean("__debug");
if ($ldebug) $handle=fopen("$logfilepath", "a");
//END DEBUG

$thisstatus = GetValueBoolean("$IPS_VARIABLE");
if (!$thisstatus) $thisstatus = "0";
echo "trigger : $IPS_VARIABLE = $thisstatus
";
$junk = $myfuncts[substr($IPS_VARIABLE, -1, 1)."$thisstatus"."0"];
$temp = GetValueBoolean("s$thisname". substr($IPS_VARIABLE, -1, 1)."$thisstatus"."0");
switch ($junk) {
   case "locallight":
      for ($teller=0; $teller < 5; $teller++) {
         if ($locallight[$teller] != "") FS20_SwitchMode($locallight[$teller],$temp);
      }
      SetValueBoolean("s$thisname". substr($IPS_VARIABLE, -1, 1)."$thisstatus"."0",!$temp);
      $result = "locallight -> $temp";
      break;
   case "toggle":
      $result = "toggle choosen";
      SetValueBoolean("s$thisname". substr($IPS_VARIABLE, -1, 1)."$thisstatus"."0",!$temp);
      break;
   case "dothese":
//** DOTHESE **
      $result = "2 switches activated";
      FS20_SwitchMode(oliv_mains_ID,true);
      FS20_SwitchMode(oliv_bureel_sw1,true);
//** END DOTHESE **
      break;
   default:
      $result = "action '$junk' choosen";
      IPS_RunScript($junk);
}
if ($ldebug) fwrite($handle, date("d.m.y")."	". date("H:i:s")."	"."$IPS_VARIABLE-$thisstatus"."	"."$junk"."	"."$result"."
");
if ($ldebug) fclose($handle);

?>

hinweiss : hier-und-da anpassen bitte

dieser script hiess also : jeder knopf bekommt eine (programierbare) on-off function mit latch-schaltung 1x drucken = ‚on‘; noch mals drucken ist ‚off‘

Vieleicht möchtest du dieser script änderen mit HOLD-funktion ? (8 funktionen uber 4 tasten :cool: :cool: :cool:

@GGGss

ja, es geht prinzipiell darum die Tastenanzahl zu erweitern. Mit den mitgelieferten IPS-Bordmitteln ist eine Erweiterung der Tastenfunktionen bei einer Fernbedienung fast grenzenlos möglich.

Beispiel: ich habe eine Fernbedienung FS20 S20 - diese hat 20 Tasten.
Vier dieser Tasten reserviere ich für die Systemsteuerung (9a, 9b, 10a, 10b) mit ‚9a‘ als ‚Mode Switcher‘ - diese Taste verändert die Bedeutung der Tasten 1a bis 8b (=16 Tasten).
Derzeit sind sind 4 Modes bei mir vorgesehen: 0=LightScenes, 1=KlimaControl, 2=Information, 3=System.

Damit komme ich auf: 4+4*16 = 68 Funktionen (für EINE! Fernbedienung)

Dummerweise wird sich keiner 68 (oder mehr) Funktionen merken können - also experimentiere ich mit verschiedenen Möglichkeiten diese Tasten anzuordnen und einen Help-Guide (per Sprachausgabe) zu erstellen. U.a. brauche ich dafür die hardwareseitige Erkennung für das lange drücken einer Taste (z.B. Help-Guide aufrufen)…

Als Beispiel hier der Code des Key-Dispatchers meiner Development-Fernbedienung (noch nicht fertig belegt):


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
*/
//File: FB_FS20_Rot_Dispatcher.ips.php

/****************************************************************
dispatcher for multilevel remote control
  
remote control: FS20 S20 - 20 key's (in double channels mode)
status vars's: FB_FS20_Rot_1a.Status  (boolean)
			   FB_FS20_Rot_1b.Status  (boolean)
			   FB_FS20_Rot_2a.Status  (boolean)
			   ect....
			   
mode var	 : FB_FS20_Rot.Mode (integer)
key layout:
			  [9a] 9 [9b]	 [10a] 10 [10b]
					 [1a]  1  [1b]
					 [2a]  2  [2b]
					 [3a]  3  [3b]
					 [4a]  4  [4b]
					 [5a]  5  [5b]
					 [6a]  6  [6b]
					 [7a]  7  [7b]
					 [8a]  8  [8b]
					 
special keys:
[9a]   -> mode switch
[9b]   -> mode information
[10..] -> help or other things (todo)
****************************************************************/
include_once "scripts/globals.php";
// initialize dispatcher variables by the trigger-variable name
$key = "";
if( $IPS_SENDER == "Variable" )
{
   // extract the pressed key from variable name
   preg_match( "/.*_(.*)\.Status/", $IPS_VARIABLE, $a);
   $key = $a[1];
   
   // extract the remote name from variable name
   preg_match( "/(.*)_.*\.Status/", $IPS_VARIABLE, $a);
   $remote_name = $a[1];
}
else die("Error: Fernbedienung muss über eine Variable getriggert werden!");

//-----------------------------------------------------------------------
// $mode: 0 = Lightscenes
//		1 = Klima-Control
//		2 = Information (Mails, TV, Events, ect.)
//		3 = System-Control
$mode = GetValueInteger( "FB_FS20_Rot.Mode");
//-----------------------------------------------------------------------
// Mode-Control: switch through the remote modes...
if( $key=='9a' )
{
   if( ++$mode>3 ) $mode=0;
   SetValueInteger( $remote_name.".Mode", $mode);
   switch($mode)
   {
	  case 0: Speak( Voice_Klara_ID, "Modus. Lichtszenen");	   break;
	  case 1: Speak( Voice_Klara_ID, "Modus. Klimakontrolle?");   break;
	  case 2: Speak( Voice_Klara_ID, "Modus. Informationen.");	break;
	  case 3: Speak( Voice_Klara_ID, "Modus. System Steuerung?"); break;
   }
   die;
}
// Mode-Control: help for aktual mode...
if( $key=='9b' )
{
   switch( $mode )
   {
	  case 0: Speak( Voice_Klara_ID, "Lichtszenen");		break;
	  case 1: Speak( Voice_Klara_ID, "Klimakontrolle?");	break;
	  case 2: Speak( Voice_Klara_ID, "Informationen.");	 break;
	  case 3: Speak( Voice_Klara_ID, "System Steuerung.");  break;
   }
   die;
}
// dispatch the regular keys...
switch( $mode )
{
   case 0: Dispatch_LightScene( $key );	  break;
   case 1: Dispatch_KlimaControl( $key );	break;
   case 2: Speak( Voice_Klara_ID, "Steuerung nicht vorhanden? Informationen.");	 break;
   case 3: Speak( Voice_Klara_ID, "Steuerung nicht vorhanden: System Steuerung.");  break;
}
// --- END Main Dispatcher ---
 
function Dispatch_LightScene( $key )
{
  switch( $key )
  {
	case '1a': if( !GetValueBoolean("WZ_LightScene_Flutlicht.Status") )
				  IPS_RunScript("WZ_LightScene_Flutlicht");
			   else
				  IPS_RunScript("WZ_LightScene_Flutlicht_AUS");
			   break;
	case '2a': IPS_RunScript("WZ_LightScene_Warm1");
			   break;
	case '2b': IPS_RunScript("WZ_LightScene_MidCold1");
			   break;
	case '3a': IPS_RunScript("WZ_LightScene_Cold1");
			   break;
	case '8b': IPS_RunScript("WZ_ALLES_AUS");
			   break;
	default:   Speak( Voice_Klara_ID, "Taste ".strtoupper($key)."; ist in Lichtszenen nicht, belegt." );
			   break;
  }
}
 
function Dispatch_KlimaControl( $key )
{
  switch( $key )
  {
	case '1a': Speak( Voice_Klara_ID, "Temperaturen; ");
			   IPS_RunScript("Speech.Temperaturen");
			   break;
	default:   Speak( Voice_Klara_ID, "Taste ".strtoupper($key)."; ist in Klimakontrolle nicht, belegt." );
			   break;
  }
}

?>

Anbei was zum spielen -> Data Variable

Mögliche Werte:


0-16 => 0% - 100%
17 => an, alter wert
18 => swap

Einfache Kanalzahl


19 => dim up
20 => dim down

Doppelte Kanalzahl


21 => dim up/down

Grüße, paresy :slight_smile:

@Parsey

das dürfte genau das sein was ich brauche :slight_smile:

Ich werde es heute Abend ausprobieren und die 40 Data-Variablen ergänzen :wink:
Über die Update-Time der Variablen können unnötige Repeats unterbunden werden.

Danke!!

Hallo Olli,

ich hoffe, dass Du dann Dein Script hier komplett veroeffentlichst, damit wir auch davon profitieren koennen.

Gruss Torro

Das sollte kein Problem sein :slight_smile:

Allerdings gibt es Benamungsregeln für die Variablen damit die regulären Ausdrücke funktionieren (siehe meinen oberen Code).

Hallo Oli,

das ist schon klar und stellt ja kein Problem dar, solange es auch gut dokumentiert ist, dass jeder was damit anfangen kann. Aber Du machst das schon!

Gruss Torro

@paresy

die neue Data-Variable funktioniert einwandfrei :slight_smile: was mir dabei noch auffällt: im Kernel-Log wird noch ‚Received Unsupported Command: #…‘ hineingeschrieben.

Habt ihr Intern die Update-Time auch in Millisekunden? Damit könnte ich die Repeated-Hold Erkennung noch verfeinern - ich schätze ein Delta von ca. 0.8 Sekunden wäre optimal bei der Repeat-Erkennung (derzeit liegt der Wert bei einer Sekunde).

Gruss,
Oliver

@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?

  • Fernbedienung in den Modus doppelte Kanalzahl stellen

  • für jede Taste eine FS20RX Instanz anlegen und die
    Data-Variable anlegen (die Variable Status wird nicht gebraucht)

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...
}
 
?>

Du meinst die Funktion GetUpdateTime? Theoretisch ja. Nur das UNIX Time Format gibt das nicht her…

Du musst auch aufpassen, dass dir bei den Timing Sachen keine anderen Scripte dazwischen funken…

>Received Unsupported Command

Habe ich rausgenommen.

Grüße, paresy

Und eine neue Funktion wie GetUpdateTimeMS() die float zurückgibt? Die Nachkommastellen könnten dann für die Millisekunden verwendet werden. Muss auch nicht unbedingt in den settings gespeichert werden.

Ich gehe davon aus, dass ihr für die ankommenden Daten einen separaten, von der Scriptingengine unabhängigen Thread am laufen habt, der u.a. auch die UpdateTime ermittelt. Solange ich in meinen Skripten keine eigenen Zeitfunktionen verwende, sollte es eigentlich keine Timingprobleme für das Erkennen des wiederholten festhaltens einer Taste geben.

ist das schon im Live-Update?

Grüsse,
Oliver