WAF steht auf dem Spiel !

Hallo Gemeinde und alle mitfühlenden Ehemänner !

Ich bin ja immer noch nicht der Held in PHP aber kann mittlerweile Scripte auf meine (und vor alledem auf meine Frau) Bedürfnisse anpassen.

Momentan fehlt mir aber eine scriptbasis für mein Vorhaben.

Ich versuche es mal zu erklären:

Ich habe die HM Fernbedienung mit 19 Tasten. Reduzieren wir die mal zwecks einfachkeit auf 2 Tasten…

Mit 2 Tasten (unterscheiden sich in short_press und long_press) habe ich also 4 Möglichkeiten.

Idee ist folgende:

Ich habe 6 Lichtstimmungen im Wohnzimmer.

Die beiden Tasten sollen sich mit einem short_press vor UND zurück in den Lichtszenen bewegen und diese im Display der Fernbedienung anzeigen. (Displaymessage bekomme ich hin)

Der rechte Taster soll dann bei long_press die Szene starten, die im Display angezeigt wird.
Der linke Taster soll bei long_press alles Licht ausmachen.

Das Problem ist eben, wie ich mich mit plus und minus durch verschiedene Szenen bewege und bei long_press eben genau diese ausführen lasse…

So ein „mini Beispielscript“ wäre hier der Hammer…meine Frau hat schon nach den Heiratspapieren gefragt :slight_smile:
Die ganze Fernbedienung soll in diesem Stil arbeiten…anhand eines Beispiels könnte ich dann den ganzen Rest alleine umsetzen…

Vielen Lieben Dank für die Mühen und Hilfe !

Sascha & Eve

Also von deiner Fernbedienung habe ich leider keine Ahnung aber das bekommst du ja selbst hin.

ich habe mir mal so etwas für mein Dashboard gebaut.

Ich würde als erstes eine Vab anlegen als integer(11111) und dann noch eine als String(11112)
in der integer würde ich eine Zahl Plazieren 0-anzahl der verschiedenen stufen des Lichtes. Als beispiel machen wir mal 4
Wenn du nur im Webfront darstellen willst kannst du auch einfach den String weglassen und mit Assoziationen arbeiten.
Da du aber eine Fernbedienung hast willst du ja vieleicht einen Text haben den du verarbeiten kannst. Dieser liegt in meinem Beispiel im String.

wenn sich jetzt im IPS der zustand deiner Fernbedienung ändert, läst du ein Skript starten ungefär so…


$a = getvalue (11111/integer variable);
$b = $a+1;
setvalue (11111,$b);
if ($b == 1 ){setvalue (11112 / String variable, "Text fuer eins");}
if ($b == 2 ){setvalue (11112 / String variable, "Text fuer zwei");}
if ($b == 3 ){setvalue (11112 / String variable, "Text fuer drei");}
if ($b == 4 ){setvalue (11112 / String variable, "Text fuer vier");}

Das ist zwar bischen schreib aufwand, aber einfacher als sich am anfang mit array ´s auseinander zu setzen
jetzt liegt es an dir du kannst mit jedem drücken auf die Fernbedienung eine sequenz weiter springen oder du hinterlegst ein Ereignis, das z.b. jede seckunde umspringt.
dieses kann man ja auch ein oder aus schalten mit

IPS_SetEventActive($EreignisID, true);

in dem moment löst du mit dem Druck auf deine Fernbedienung natürlich nur aus, das das event eingeschaltet wird.
du musst dann natürlich sicherstellen das das andere event vorher ausgeschaltet ist, logisch.


IPS_SetEventActive(11125 / ereignis für skript zum hoch tiggern, false);
IPS_SetEventActive(11126 / ereignis für skript zum runter tiggern, true);

Der Einfachheit halber stelle ich mir mal vor es ist ein 3 knopf system bei der Fernbedienung wenn du den durchlauf anhalten möchtest wir beim 3. knopf einfach solch ein skript ausgelöst


IPS_SetEventActive(11125 / ereignis für skript zum hoch tiggern, false);
IPS_SetEventActive(11126 / ereignis für skript zum runter tiggern, false);

wenn es ein 2 knopft system ist muss die sequenz bei jedem wechsel angehalten werden. Hierfür musst du natürlich auslesen ob ein event läuft. da müsste ich später selbst in der doku schauen.

ich hoffe das hilft, ich habe das ganze jetzt ohne zu Prüfen aus dem Kopf dahin geklatscht könnte also noch der ein oder ander fehler drin sein

mfg

Peter

Ich habe es jetzt mal selbst in IPS geschrieben so klappt es mit 2Tasten Fernbedienung wunderbar

Man benötigt 2 Vabs / 4 Skripte / 2 Ereignisse (siehe Bild)

Rauf Starter

<?
$a = 35430 /*[Beispiel\Raufzähler\]*/ ;
$b = IPS_GetEvent($a);
$c = $b["EventActive"];

$d = 52223 /*[Beispiel\Runter Zähler\]*/;
$e = IPS_GetEvent($d);
$f = $e["EventActive"];



If ($f == 1)
{IPS_SetEventActive($d, false);}

If ($c == 1)
{IPS_SetEventActive($a, false);}
else
{IPS_SetEventActive($a, true);}
?>

Runter Starter


<?
$a = 52223 /*[Beispiel\Runter Zähler\]*/;
$b = IPS_GetEvent($a);
$c = $b["EventActive"];

$d = 35430 /*[Beispiel\Raufzähler\]*/ ;
$e = IPS_GetEvent($d);
$f = $e["EventActive"];



If ($f == 1)
{IPS_SetEventActive($d, false);}

If ($c == 1)
{IPS_SetEventActive($a, false);}
else
{IPS_SetEventActive($a, true);}
?>

Rauf Zähler

<?

$a = getvalue (29366 /*[Beispiel\Zähler]*/);//zähler integer
If ($a < 4)
{
$b = $a+1;
setvalue (29366 /*[Beispiel\Zähler]*/,$b);
if ($b == 1 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer eins");}//nenner String
if ($b == 2 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer zwei");}
if ($b == 3 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer drei");}
if ($b == 4 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer vier");}
}
?>

Runter Zähler

<?

$a = getvalue (29366 /*[Beispiel\Zähler]*/);//zähler integer
If ($a >1)
{
$b = $a-1;
setvalue (29366 /*[Beispiel\Zähler]*/,$b);
if ($b == 1 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer eins");}//nenner String
if ($b == 2 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer zwei");}
if ($b == 3 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer drei");}
if ($b == 4 ){setvalue (39014 /*[Beispiel\Nenner]*/, "Text fuer vier");}
}
?>

Ich hoffe das war´s

würde mich freuen über ein feed back


// Integer Variable für die Lichtszenen (1 - 6)
$IDFunktion		=	20017;

// HomeMatic Variablen als Ereignis Bei Variablenaktualisierung im Skript zugewiesen
$IDLinks		=	34037 /*[HM-Wandtaster\Taster Links\PRESS_SHORT]*/ ;
$IDLinksLong	=	31702 /*[HM-Wandtaster\Taster Links\PRESS_LONG]*/ ;
$IDRechts		=	16647 /*[HM-Wandtaster\Taster Rechts\PRESS_SHORT]*/ ;
$IDRechtsLong	=	27589 /*[HM-Wandtaster\Taster Rechts\PRESS_LONG]*/ ;

if($_IPS['SENDER'] == 'Variable')
{
	if($_IPS['VARIABLE'] == $IDLinks)
	{
		$i=GetValue($IDFunktion)-1;
		if($i == 0){ $i=6; }
		SetValue($IDFunktion,$i);
	}
	if($_IPS['VARIABLE'] == $IDRechts)
	{
		$i=GetValue($IDFunktion)+1;
		if($i == 7){$i=1;}
		SetValue($IDFunktion,$i);
	}
	if($_IPS['VARIABLE'] == $IDLinks or $_IPS['VARIABLE'] == $IDRechts)
	{
		switch (GetValueInteger($IDFunktion)) 
		{
			case 1:
				// Display Anzeigen Text 1
			break;
			case 2:
				// Display Anzeigen Text 2
			break;
			case 3:
				// Display Anzeigen Text 3
			break;
			case 4:
				// Display Anzeigen Text 4
			break;
			case 5:
				// Display Anzeigen Text 5
			break;
			case 6:
				// Display Anzeigen Text 6
			break;			
		}	
	}
		
	if($_IPS['VARIABLE'] == $IDLinksLong)
	{
		// Licht AUS ...
	
	}
	if($_IPS['VARIABLE'] == $IDRechtsLong)
	{
		switch (GetValueInteger($IDFunktion)) 
		{
			case 1:
				// Lichtszene 1
			break;
			case 2:
				// Lichtszene 2
			break;
			case 3:
				// Lichtszene 3
			break;
			case 4:
				// Lichtszene 4
			break;
			case 5:
				// Lichtszene 5
			break;
			case 6:
				// Lichtszene 6
			break;			
		}	
	}
}




Jetzt kommt wieder der Spielverderber…

Ich habe einiges mit der 19-Tasten-Fernbedienung durchgespielt und ich vermute, dass die ganze Sache zwar an sich funktionieren aber in der Bedienung zu träge werden wird.

Bis Du Dich da durch Deine Szenenlandschaft durchgeklickt hast - immer mit der Wartezeit bis die Fernbedienung die Rückmeldung für das Display erhalten und umgesetzt hat - ist Deine Frau wahrscheinlich schon aufgestanden und hat das Licht manuell angeschaltet. :rolleyes:

Ich bin dann wegen anhaltender Kritik bei einer simplen Toogle-Funktion der Tasten gelandet (Short/Long) und gebe über das Display nur noch Dinge wie die Aussentemperatur aus . Aus jetziger Sicht würde ich eher einen kleinen Androiden anschaffen und da ein schickes Webfront oder iFront drauf bauen.

Hallo zusammen und vielen Dank für die ganzen Anregungen und Tips !!!

Peters Beispiele sind sehr anschaulich und ich werde damit mal einige tests machen…
Kronos bedenken mußte ich leider auch schon feststellen, da momentan ein Schaltaktor ohne displaymeldung schaltet, und auf ein anderes Tastenpaar MIT Displaymeldung…die verzögerung ist hier wirklich enorm.

Tatsächlich werden später Scripte für die Multimediasteuerung ausgegeben…so wie : Alles für TV einschalten, alles für DVD einschalten, das hier die verzögerung zu verschmerzen wäre, da es im normalfall nur 1-2 mal am Abend benutzt wird…

Charykuns Script sieht für mich im moment so aus, als ob es GENAU das sein könnte, was ich mir vorgestellt habe.
Vielen Dank hierfür!

Auf jeden Fall ist es super, soviele Möglichkeiten nun zu sehen, und mir daraus mein eigenes Script zu bauen.
Leider ist es mir immer noch nicht möglich ein Script von null heraus zu bauen…

Vielen Dank an Peter und Charykun für die mühen…ich werde hier berrichten und auch mein script einstellen, wenn es fertig ist…ihr werdet sicher euren quellcode entdecken :slight_smile:

Und danke auch an Kronos für die einschätzung der hardware…das kann ich soweit auch leider bestätigen…

Ipad gibt es natürlich bei uns zuhause…aber die holde hätte so gerne eine ECHTE Plastikfernbedienung, die häßlich aussieht, schlecht in der Hand liegt und ein viel zu kleines Display hat…also diese Wünsche habe ich schonmal alle umgesetzt :slight_smile:

LG
Sascha

Sooooo,

charykuns script war auf jeden Fall GENAU das, nachdem ich gesucht habe…aber auch Peter bin ich sehr dankbar, da ich seinen weg sehr gut „nachverfolgen“ kann und damit einige tests noch machen will.

Eine kleine Änderung, die ich in charykuns script vorgenommen habe:

Ich lasse nach der Aktion der lang gedrückten Tasten die Variable auf 6 setzen…so lande ich immer auf Szene 1 nachdem ich die rechte Taste wieder kurz drücke.

Sehr schön gefällt mir auch, daß die Szenen von der letzten (Szene 6) wieder auf die erste (Szene 1) springt…ich bleibe also nicht vorne oder hinten „hängen“.

Vielen Dank euch allen :slight_smile: Die Scheidung wurde verschoben :slight_smile:

Hier mal das Script, mit dem ich hier in meiner kleinen Entwicklungsumgebung herumspiele.

LG
Sascha

<?
function setDisplay($text, $beep, $backlight, $unit) {
$id = 45294 /*[DISPLAY]*/;
HM_WriteValueString($id, "TEXT", $text);
HM_WriteValueString($id, "BEEP", $beep);
HM_WriteValueString($id, "BACKLIGHT", $backlight);
HM_WriteValueString($id, "UNIT", $unit);
HM_WriteValueBoolean($id, "SUBMIT", True);
}


// Integer Variable für die Lichtszenen (1 - 6)
$IDFunktion        =    23023 /*[Fernbedienung\Menu\Lichtszenen 1-6]*/;

// HomeMatic Variablen als Ereignis Bei Variablenaktualisierung im Skript zugewiesen
$IDLinks        =    32619 /*[KEY 15\PRESS_SHORT]*/;
$IDLinksLong    =    35873 /*[KEY 15\PRESS_LONG]*/;
$IDRechts        =   27929 /*[KEY 16\PRESS_SHORT]*/;
$IDRechtsLong    =   39566 /*[KEY 16\PRESS_LONG]*/;

if($_IPS['SENDER'] == 'Variable')
{
    if($_IPS['VARIABLE'] == $IDLinks)
    {
        $i=GetValue($IDFunktion)-1;
        if($i == 0){ $i=6; }
        SetValue($IDFunktion,$i);
    }
    if($_IPS['VARIABLE'] == $IDRechts)
    {
        $i=GetValue($IDFunktion)+1;
        if($i == 7){$i=1;}
        SetValue($IDFunktion,$i);
    }
    if($_IPS['VARIABLE'] == $IDLinks or $_IPS['VARIABLE'] == $IDRechts)
    {
        switch (GetValueInteger($IDFunktion))
        {
            case 1:
                setDisplay("Scn.1", 1, 1, 0); // Display Anzeigen Text 1
            break;
            case 2:
                setDisplay("Scn.2", 1, 1, 0); // Display Anzeigen Text 2
            break;
            case 3:
                setDisplay("Scn.3", 1, 1, 0); // Display Anzeigen Text 3
            break;
            case 4:
                setDisplay("Scn.4", 1, 1, 0); // Display Anzeigen Text 4
            break;
            case 5:
                setDisplay("Scn.5", 1, 1, 0); // Display Anzeigen Text 5
            break;
            case 6:
                setDisplay("Scn.6", 1, 1, 0); // Display Anzeigen Text 6
            break;
        }
    }

    if($_IPS['VARIABLE'] == $IDLinksLong) // Alles aus
    {
        HM_WriteValueBoolean(18804 /*[Lichtsäule]*/, "STATE", false);
        HM_WriteValueBoolean(27385 /*[Schreibtischlampe]*/, "STATE", false);
        SetValueInteger(23023 /*[Fernbedienung\Menu\Lichtszenen 1-6]*/,6);

    }
    if($_IPS['VARIABLE'] == $IDRechtsLong)
    {
        switch (GetValueInteger($IDFunktion))
        {
            case 1:
               HM_WriteValueBoolean(27385 /*[Schreibtischlampe]*/, "STATE", true); // Lichtszene 1
               SetValueInteger(23023 /*[Fernbedienung\Menu\Lichtszenen 1-6]*/,6);
            break;
            case 2:
               HM_WriteValueBoolean(18804 /*[Lichtsäule]*/, "STATE", true); // Lichtszene 2
               SetValueInteger(23023 /*[Fernbedienung\Menu\Lichtszenen 1-6]*/,6);
            break;
            case 3:
               HM_WriteValueBoolean(27385 /*[Schreibtischlampe]*/, "STATE", true); // Lichtszene 3
					HM_WriteValueBoolean(18804 /*[Lichtsäule]*/, "STATE", true);
					SetValueInteger(23023 /*[Fernbedienung\Menu\Lichtszenen 1-6]*/,6);
            break;
            case 4:
                // Lichtszene 4
            break;
            case 5:
                // Lichtszene 5
            break;
            case 6:
                // Lichtszene 6
            break;
        }
    }
}

?>