Zurück   IP-Symcon Community Forum > IP-Symcon 1.0 > Archiv > Ideen & Anregungen

Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
  #1 (permalink)  
Alt 22.08.05, 21:09
Senior Member
 
Registriert seit: Aug 2005
Beiträge: 923
Standard 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
Mit Zitat antworten
  #2 (permalink)  
Alt 22.08.05, 22:16
Benutzerbild von GGGss
Senior Member
 
Registriert seit: Jul 2005
Ort: Roeselare - Belgium
Beiträge: 1,359
Standard

Olli,

Mir hats die on-off funktion uber 2 tasten auch nicht gefallen..
Deshalb habe ich dies hier geschrieben :
PHP-Code:
<?
/*
*******************************
 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(=> oliv_bureel_lamp=> ""=> ""=> ""=> ""=> "");

   
//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\r\n";
$junk $myfuncts[substr($IPS_VARIABLE, -11)."$thisstatus"."0"];
$temp GetValueBoolean("s$thisname"substr($IPS_VARIABLE, -11)."$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, -11)."$thisstatus"."0",!$temp);
      
$result "locallight -> $temp";
      break;
   case 
"toggle":
      
$result "toggle choosen";
      
SetValueBoolean("s$thisname"substr($IPS_VARIABLE, -11)."$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 (
$ldebugfwrite($handledate("d.m.y")."\t"date("H:i:s")."\t"."$IPS_VARIABLE-$thisstatus"."\t"."$junk"."\t"."$result"."\r\n");
if (
$ldebugfclose($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

Geändert von GGGss (22.08.05 um 22:20 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 23.08.05, 00:47
Senior Member
 
Registriert seit: Aug 2005
Beiträge: 923
Standard

@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):


PHP-Code:
<?
/*
*******************************
 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>$mode=0;
   
SetValueInteger$remote_name.".Mode"$mode);
   switch(
$mode)
   {
      case 
0SpeakVoice_Klara_ID"Modus. Lichtszenen");       break;
      case 
1SpeakVoice_Klara_ID"Modus. Klimakontrolle?");   break;
      case 
2SpeakVoice_Klara_ID"Modus. Informationen.");    break;
      case 
3SpeakVoice_Klara_ID"Modus. System Steuerung?"); break;
   }
   die;
}
// Mode-Control: help for aktual mode...
if( $key=='9b' )
{
   switch( 
$mode )
   {
      case 
0SpeakVoice_Klara_ID"Lichtszenen");        break;
      case 
1SpeakVoice_Klara_ID"Klimakontrolle?");    break;
      case 
2SpeakVoice_Klara_ID"Informationen.");     break;
      case 
3SpeakVoice_Klara_ID"System Steuerung.");  break;
   }
   die;
}
// dispatch the regular keys...
switch( $mode )
{
   case 
0Dispatch_LightScene$key );      break;
   case 
1Dispatch_KlimaControl$key );    break;
   case 
2SpeakVoice_Klara_ID"Steuerung nicht vorhanden? Informationen.");     break;
   case 
3SpeakVoice_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:   
SpeakVoice_Klara_ID"Taste ".strtoupper($key)."; ist in Lichtszenen nicht, belegt." );
               break;
  }
}
 
function 
Dispatch_KlimaControl$key )
{
  switch( 
$key )
  {
    case 
'1a'SpeakVoice_Klara_ID"Temperaturen; ");
               
IPS_RunScript("Speech.Temperaturen");
               break;
    default:   
SpeakVoice_Klara_ID"Taste ".strtoupper($key)."; ist in Klimakontrolle nicht, belegt." );
               break;
  }
}

?>

Geändert von Olli (23.08.05 um 00:58 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 23.08.05, 10:12
Benutzerbild von paresy
Administrator
 
Registriert seit: Feb 2005
Ort: Sarkwitz
Beiträge: 6,370
Lightbulb

Anbei was zum spielen -> Data Variable

Mögliche Werte:

Code:
0-16 => 0% - 100%
17 => an, alter wert
18 => swap
Einfache Kanalzahl

Code:
19 => dim up
20 => dim down
Doppelte Kanalzahl

Code:
21 => dim up/down
Grüße, paresy
Mit Zitat antworten
  #5 (permalink)  
Alt 23.08.05, 12:11
Senior Member
 
Registriert seit: Aug 2005
Beiträge: 923
Thumbs up

@Parsey

das dürfte genau das sein was ich brauche :-)

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

Danke!!
Mit Zitat antworten
  #6 (permalink)  
Alt 23.08.05, 12:34
Benutzerbild von Torro
Senior Member
 
Registriert seit: May 2005
Ort: Leipzig
Beiträge: 3,963
Standard

Hallo Olli,

Zitat:
Zitat von Olli
@Parsey

das dürfte genau das sein was ich brauche :-)

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

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

Gruss Torro
Mit Zitat antworten
  #7 (permalink)  
Alt 23.08.05, 13:48
Senior Member
 
Registriert seit: Aug 2005
Beiträge: 923
Standard

Zitat:
Zitat von Torro
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 :-)

Allerdings gibt es Benamungsregeln für die Variablen damit die regulären Ausdrücke funktionieren (siehe meinen oberen Code).
Mit Zitat antworten
  #8 (permalink)  
Alt 23.08.05, 18:23
Benutzerbild von Torro
Senior Member
 
Registriert seit: May 2005
Ort: Leipzig
Beiträge: 3,963
Standard

Hallo Oli,

Zitat:
Zitat von Olli
Das sollte kein Problem sein :-)

Allerdings gibt es Benamungsregeln für die Variablen damit die regulären Ausdrücke funktionieren (siehe meinen oberen Code).
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
Mit Zitat antworten
  #9 (permalink)  
Alt 25.08.05, 12:49
Senior Member
 
Registriert seit: Aug 2005
Beiträge: 923
Standard

@paresy

die neue Data-Variable funktioniert einwandfrei :-) 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
Mit Zitat antworten
  #10 (permalink)  
Alt 25.08.05, 13:52
Senior Member
 
Registriert seit: Aug 2005
Beiträge: 923
Standard Beispiel für das Festhalten einer Fernbedienungstaste

@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'
PHP-Code:
<?
/*
*******************************
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_SpeakVoice_Klara_ID"Taste 1a wurde gedrückt." );
             break;
 
    case 
'1a HALTEN'
             
TTS_SpeakVoice_Klara_ID"Taste 1a wird gehalten." );
             break;
 
    case 
'1b HALTEN'
             
TTS_SpeakVoice_Klara_ID"Taste 1b wird gehalten." );
             break;
 
    default: 
TTS_SpeakVoice_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-Code:
<?php
 
define
"RC_OFF"        ); // =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"     ); 
define"RC_HOLD"        ); 
define"RC_HOLD_REPEAT" ); 
 
/***********************************************************
$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$h0$p);
 
    if( !
$p=strrpos$h'_')) 
        return( 
false );        // ERROR: no '_' as keyname separator
    
$key_name    substr$h$p+1);
    
$remote_name substr$h0$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...
}
 
?>
Mit Zitat antworten
Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an



Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.


Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.6.0