Slider nachbauen

DAS ist die Reaktion auf die ich gewartet hatte - so kann ich auch besser einschätzen auf welchem Level Du bist und gezielter antworten :wink:

da wird nix verglichen: der Funktion „VolumeFade“ werden 2 Parameter übergeben: 1. über $id die IP des anzusteuernden Gerätes (was ausserhalb der Funktion definiert wurde und nicht im Beispielscript zu sehen ist) sowie der Wert der Volume-Änderung($VolumeDelta). Den Wert der Volume-Änderung errechnest Du vorher und übergibst in dann der Funktion.Die Funktion kümmert sich dann selbstständig darum, wie sie den AVR auf den gewünschten Lautstärke-Pegel bringt.

Zur Veranschaulichung mal mein komplettes Script, ist sicher nicht einfach für Asussenstehende (den Block „Denon Functions include“ kannste mal ignorieren, der tut hier nichts zur Sache):


<?

// +++++++++++++++++++ Konfig ++++++++++++++++++++++++++++++++++++++++++++++++++
$MasterVolume_val = round(getValueFloat(46501 /*[DENON\Main Zone\MasterVolume]*/ ),0);
$last_MasterVolume_ID = 52850 /*[Denon externe Steuerscripte\Last MasterVolume]*/ ;
$last_MasterVolume_val = round(getValueFloat($last_MasterVolume_ID),0);
$flur_bm_unten_event_id = 26084 /*[Denon externe Steuerscripte\DENON Auto Volume\]*/ ;
$flur_bm_oben_event_id = 49547 /*[Denon externe Steuerscripte\DENON Auto Volume\]*/ ;
$bad_belegung_event_id = 23615 /*[Denon externe Steuerscripte\DENON Auto Volume\]*/  ;
$sz_tuer_event_id = 55493 /*[Denon externe Steuerscripte\DENON Auto Volume\]*/  ;
$sz_bm_event_id = 29365 /*[Denon externe Steuerscripte\DENON Auto Volume\]*/  ;
$wz_praesenz_event_id = 57503 /*[Denon externe Steuerscripte\DENON Auto Volume\]*/ ;
$DENON_QS_Status = getValueInteger(56859 /*[DENON\Main Zone\QuickSelect]*/ );
// ++++++++++++++++++++ Konfig Ende ++++++++++++++++++++++++++++++++++++++++++++

// DENON Functions include
$Denon_KatID = IPS_GetCategoryIDByName("DENON", 0);
$DENON_Scripts_ID = IPS_GetCategoryIDByName("DENON Scripts", $Denon_KatID);
if (IPS_GetObjectIDByName("DENON.Functions", $DENON_Scripts_ID) >0)
{
	include "DENON.Functions.ips.php";
}
else
{
	echo "Script DENON.Functions kann nicht gefunden werden!";
}


// Code ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if (((@$IPS_EVENT == $flur_bm_oben_event_id)) && ($DENON_QS_Status == 1) && ($MasterVolume_val > (-60)))
{ // Fade down

    $VolumeDelta = (($MasterVolume_val - $last_MasterVolume_val));
   VolumeFade($id, $VolumeDelta);
   echo "DENON Auto Volume Fade down MasterVolume $MasterVolume_val to -20;
";
}
elseif((@$IPS_EVENT == $flur_bm_unten_event_id) && ($DENON_QS_Status == 1))
{
	// Fade up
   $VolumeDelta = (($MasterVolume_val - $last_MasterVolume_val)*-1);
   VolumeFade($id, $VolumeDelta);
   echo "DENON Auto Volume Fade UP, VolumeDelta = $VolumeDelta
";
}


// Function Volume Fade Up/Down +++++++++++++++++++++++++++++++++++++++++++++++
function VolumeFade($id, $VolumeDelta)
{

	if ($VolumeDelta > 0) // Volume Fade up
	{
		$VolumeDelta = $VolumeDelta*2;
		for ($count = 1; $count <= ($VolumeDelta); $count++)
		{
	      DENON_MasterVolume($id, "UP");
			IPS_sleep(30);
			echo "DENON Function Volume UP
";
		}
	}
	if ($VolumeDelta < 0) // Volume Fade down
	{
		$VolumeDelta = ($VolumeDelta * -1)*2;
		for ($count = 1; $count <= ($VolumeDelta); $count++)
		{
	      DENON_MasterVolume($id, "DOWN");
			IPS_sleep(50);
			echo "DENON Function Volume DOWN
";
		}
	}
	//IPS_RunScript(15183 /*[SONOS\Schlafzimmer\SZ Status refresh]*/ );
}

der Code liest sich kurz und knapp so (ab „// Code…“)

wenn Bedingung xy oder zx … erfüllt ist [if (irgendwas muss hier zutreffen) ]
dann ermittle das Volume-Delta zwischen letztem Volume-Wert [$last_MasterVolume_val] und dem Ziel-Volume-Wert [$MasterVolume_val ],
sende die Parameter „$id und $VolumeDelta“ an die Funktion „VolumeFade()“

die Funktion „VolumeFade()“ prüft zunächst, ob das übergebene Volume-Delta größer als 0 ist [if ($VolumeDelta > 0)] - denn sie muss ja wissen ob sie den Volume-Regler des AVR aufreißen (bei Delta = >0) oder zumachen soll, wenn die Funktion rausgefunden hat ob rauf oder runter schickt sie einen „UP“ oder „Down“ -Befehl so oft an den AVR bis der Ziel-Volume-Wert erreicht ist. wie oft sie das machen mus weis sie durch den übergebenen Parameter „$VolumeDelta“. Zwischen jedem Schleifendurchlauf wartet sie allerdings eine Weile [IPS_sleep(50);] bis sich der AVR von dem dusseligen Volume-Up/Down-Gefasel erholt hat und dem IPS bereit ist zuzuhören (eigentlich soll das dem menschlichem Ohr eine angenehme, weiche Lautstärke-Erhöhung gewährleisten, vor allem den Horchlöffeln unter den Anwesenden die länger als 40 Jahre am selben Hirnstamm angetackert sind wie meine - dem AVR ist ziemlich egal ob er das in 1ms oder 1000000 ms umsetzen soll).

So habs nochmal geändert wegen den % Werten die Stimmten noch nicht:

DB % Slider
0 100,00%
-10 90,00%
-20 80,00%
-30 70,00%
-40 60,00%
-50 50,00%
-60 40,00%
-70 30,00%
-80 20,00%
-90 10,00%
-100 0,00%

Hier das Scrippt

<?
$yamaha=GetValue(47515 /*[IR Fernbedienung\Yamaha\Yamaha\Power]*/ );
$lsa=GetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/);
$id = 24344 /*[IR Fernbedienung\WinLIRC]*/ ;
if ($yamaha==false)
{
print "Geht net, Gerät erstmal einschalten !";
}


else
{

SetValue($IPS_VARIABLE, $IPS_VALUE);
$v=GetValue(18097 /*[IR Fernbedienung\Yamaha\Yamaha\Volume]*/);

$wert1 = ($v-50);
$wert2 = ($v-($wert1*2));
$wert3 = ($wert2 * -1);


while (($lsa < $wert3) & ($lsa < "1"))
{

if (($lsa < $wert3) & ($lsa < "1"));
{
ips_sleep (200);
WinLIRC_SendOnce($id, "yamaha", "volume+");
$ls1=$lsa++;
SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , $ls1);
}
}

while ($lsa > $wert3)
{

if ($lsa > $wert3);
{
ips_sleep (200); //IR Signale brauchen halt kurz Zeit
WinLIRC_SendOnce($id, "yamaha", "volume-"); //IR Signal Senden
$ls1=$lsa--; //Variable hochzählen
SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , $ls1);
}
}
}
?>

Hab nur noch ein micro Fehler, das er immer 1 zuwenig hochzählt ;-(

@Raketenschnecke

Danke dir nochmals.

Jetzt weis wie ich Fragen muss und wie du es gerne hättest.

Ich habe nur Basicwissen beim programmieren.

Mir Fehlt es sehr schwer aus solchen Scrippt was abzuleiten.

Verstehen kann ich das Scrippt nur nie auf meine Bedürfnisse anpassen wenn ich die Funktionen nicht verstehe ;-(

Hm also hab mir dein komplettes script durchgelesen, doll wenn ich das so von anfang an gehabt hätte, hätte ich damit gelöst.

Viele Wege führen zum Ziel :wink: