Lautstärke mit Langem Tastendruck regeln.

Guten Tag,

Ich würde gerne mit Hilfe meinen HomeMatic Tastern die Lautstärke meiner Sonos Player über einen Langen Tastendruck langsam hoch und runter drehen, ähnlich wie ein Dimmer.

An manchen stellen habe ich zwei getrennte Tasten zur Verfügung an manchen nur eine gemeinsame Taste für Laut/Leise.
Ich habe das ganze mal versucht zuerst an einer Philips Hue leuchte leider funktioniert mein Skript nicht wirklich…

Hier mal das Skript mit dem ich es mal Versuchen wollte.


<?

$Long=GetValueBoolean(58153 /*[Wohnzimmer\Taster\Oben Taste 5\PRESS_LONG]*/);
$Short=GetValueBoolean(26379 /*[Wohnzimmer\Taster\Oben Taste 5\PRESS_SHORT]*/);
$Long_release=GetValueBoolean(36347 /*[Wohnzimmer\Taster\Oben Taste 5\PRESS_LONG_RELEASE]*/);
$Helligkeit=GetValueInteger(21829 /*[Wohnzimmer\Beleuchtung\Segel Wohnzimmer\Helligkeit]*/);
$Zustand=GetValueBoolean(54047 /*[Wohnzimmer\Beleuchtung\Segel Wohnzimmer\Zustand]*/);


if($Long == true)
{
while($Helligkeit < 255)
{
$Helligkeit + 1;
if($Long_release == true)
{
break;
}
}
}
?>

Eventuell kann mir hierbei jemand helfen?
Mache ich etwas falsch mit dem erkennen des Tastenzustandes?

Das funktioniert so nicht.
Da die Variablen immer auf true stehen und nur aktualisiert werden.
Such einfach hier im Bereich. Das Thema gab es schon häufiger.
Wichtig ist die Auslöser des Scriptes zu erkennen und darauf zu reagieren.
Das wäre $_IPS[‚VARIABLE‘].
Systemvariablen — IP-Symcon :: Automatisierungssoftware

Dann kannst du erkennen ob Long_Press beginnt und wenn Release aktualisiert wird, es endet.
Michael

Ich kann leider nichts zu meinem Anwendungsfall oder einem ähnlichen übertragbaren finden…

Dein Wünsch die Lautstärke bei gedrückter Taste zu ändern ist so nicht umsetzbar.
HM liefert erst wenn die Taste losgelassen wird ein entsprechendes Event.

Somit kannst du in IPS erst nach dem Loslassen der Taste darauf reagieren.

An der Aktualisierung der HM Variablen erkennst du, ob es sich dabei um einen Kurzen oder langen Tastendruck gehandelt hat. Und könntest dann die Lautstärke etwas oder etwas mehr erhöhen.

Ich habe soetwas ähnliches mal umgesetzt. Leider kann ich micht nichtmehr vollständig daran erinnern, aber ich glaube ich habe es so ähnlich gelöst:

Habe nicht auf den PRESS_LONG getriggered, sondern auf INSTALL_TEST. Die Variable wird ständig aktualisiert, wenn man lange drückt. Ich habe dann abgefragt ob zeitgleich (+/- einige Sekunden) ein PRESS_SHORT getriggered wurde. Wenn nicht gehe ich davon aus, dass es ein langer Tastendruck ist und lasse zyklisch eine Variable hochzählen, bis letztlich beim loslassen die PRESS_LONG Variable getriggered wird.

Es gibt ja ein Modul Virtueller Dimmer damit lässt sich das bei Hue leuchten perfekt umsetzen, so würde ich das gerne auch mit den Sonos lösen.
Jedoch geht das mit dem Modul auch nur mit einer Taste… wobei ich gerne 2 getrennte nutzen würde.

Guten Abend,

Hat jemand eventuell ein Beispiel dazu wie ich so etwas realisieren könnte ?

Gruß,

Guten Abend zusammen,

Ich komme hier irgendwie nicht wirklich weiter, ich weis nicht mal recht wo ich anfangen soll…
Ist das denn so überhaupt möglich mit IP Symcon ? Ich gehe mal davon aus da ich ja mit dem Modul VirtualDimmer von Trxanos ja auch über einen Langen Tastendruck dimmen kann?

Kann mir hier eventuell jemand weiter helfen ?

Gruß,
Adrian

Hallo Michael,

Ich habe mal deinen Ansatz versucht, die Variable Press LONG wird einmal zu beginn des Tastendrucks aktualisiert, die Variable Release wird ebenfalls nur beim loslassen aktualisiert.
Mein Skript wird als Fehlerhaft markiert, jedoch bekomme ich keinerlei Meldungen im Meldungsfenster.
An der Lautstärke ändert sich ebenfalls nichts.
Anbei mein Skript, vielleicht kann mir jemand sagen was ich falsch mache:

<?
$volume = GetValue(IPS_GetObjectIDByIdent("Volume", 23402)); // Auslesen der Variable Volume 


if($_IPS['VARIABLE'] == 38385) // Auslöser ist PressLong
{
    while ($_IPS['VALUE'] <= 255)
{
     SNS_ChangeVolume(51198, +2);

if($_IPS['VARIABLE'] == 32904) // Auslöser ist PressLongRelease
{
    break;
}
}
}



?>

Gruß, Adrian

Habe kein Sonos.
Keine Ahnung ob der Befehl korrekt ist (ändert der die Lautstärke relativ oder absolut?).
Und wie lange ein Durchlauf ist; eventuell musst du da eine Pause in die while Schleife einbauen.
Wann wird es als Fehlerhaft markiert?
Wenn du die Taste betätigst?
Michael

Ich glaube ich habe den Fehler soweit gefunden, mein Problem momentan jedoch ich bin in ca. 2 Sekunden auf 100%, kann ich im Skript definieren in welchen Abständen er die Schritte ausführen soll ?

Das Break durch Long Release konnte ich leider noch nicht testen, da ja die 100% so schnell erreicht sind.

Danke für deine Hilfe.

Gruß, Adrian

usleep oder IPS_Sleep
Michael

So, das sieht schonmal besser aus, jedoch reagiert das Skript nicht auf break, die Schleife läuft durch bis das Maximum erreicht ist.

<?
$volume = GetValue(IPS_GetObjectIDByIdent("Volume", 23402)); // Auslesen der Variable Volume 


if($_IPS['VARIABLE'] == 38385) // Auslöser ist PressLong
{
    while ($volume <= 100)
{
     SNS_ChangeVolume(23402, 2);
     IPS_Sleep(500);

if($_IPS['VARIABLE'] == 32904) // Auslöser ist PressLongRelease
{
    break;
}
}
}



?>

Woran könnte das liegen?
Das Skript müsste doch auf das break reagieren oder?

Nö, du startest die Schleife und die läuft durch.
Das If in der Schleife funktioniert so nicht.
Da sich die Variable $_IPS[‚VARIABLE‘] ja niemals ändert wenn das Script läuft.
Du kannst nur versuchen mit IPS_GetVariable und dem Feld ‚VariableUpdated‘ zu prüfen ob die Taste inzwischen losgelassen wurde.
https://www.symcon.de/service/dokumentation/befehlsreferenz/variablenverwaltung/ips-getvariable/
Dazu musst du die am Anfang den timestamp ( http://php.net/manual/de/function.time.php ) merken und dann immer mit den Wert in VariableUpdated vergleichen.
Michael

Was meinst du mit Feld „VariableUpdated“, sorry ich bin noch nicht so tief in der Materie :confused:
Wie baue ich das am besten in mein Skript ein, bzw. wo?


$updatetime = IPS_GetVariable(12345 /*[PRESS_LONG_RELEASE]*/)["VariableUpdated"];

Dazu nimmst Du am Anfang die Zeit


$current_time = time();

dann kannst du in der Schleife jedes mal die $updatetime auslesen. Sollte diese kleiner sein als $current_time, das Du zu Beginn des Skripts geholt hast, ist die Variable auch noch nicht upgedated worden. Sollte die Varibale aktualisiert worden sein sich der Zeitwert ändern und sollte dann größer als die Startzeit sein, dann kannst Du die Schleife verlassen bzw. Anhand der Differenzzeit festlegen was passieren soll.

Hallo Fonzo,

Danke für den tipp, ich setzte das glaube ich falsch ein.
Das Skript läuft immer noch durch bis 100%

<?
$volume = GetValue(IPS_GetObjectIDByIdent("Volume", 23402)); // Auslesen der Variable Volume 
$updatetime = IPS_GetVariable(32904 /*[PRESS_LONG_RELEASE]*/)["VariableUpdated"]; 
$current_time = time(); 

if($_IPS['VARIABLE'] == 38385) // Auslöser ist PressLong
{
    while ($volume <= 100)
{
     SNS_ChangeVolume(23402, 2);
     $updatetime = IPS_GetVariable(32904 /*[PRESS_LONG_RELEASE]*/)["VariableUpdated"];
     IPS_Sleep(500);

if($updatetime < $currenttime) // Auslöser ist PressLongRelease
{
    break;
}
}
}



?>

Funktioniert das If hier garnicht?

Kann es nicht testen, aber Versuch es so:

<?
$volume = GetValue(IPS_GetObjectIDByIdent("Volume", 23402)); // Auslesen der Variable Volume 
$currenttime= time(); 

if($_IPS['VARIABLE'] == 38385) // Auslöser ist PressLong
{
    while ($volume <= 100)
{
     SNS_ChangeVolume(23402, 2);
     $updatetime = IPS_GetVariable(32904 /*[PRESS_LONG_RELEASE]*/)["VariableUpdated"];
     IPS_Sleep(500);

if($updatetime >= $currenttime) // Auslöser ist PressLongRelease
{
    break;
}
}
}



?>

Michael

Jetzt macht die Schleife nur einen Durchlauf und bricht dann ab [emoji849]

Gesendet von iPhone mit Tapatalk

Habe es oben korrigiert.
Wenn da einmal currenttime und einmal current_time steht, dann geht das nicht.
Michael