DAS ist die Reaktion auf die ich gewartet hatte - so kann ich auch besser einschätzen auf welchem Level Du bist und gezielter antworten
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).