Slider nachbauen

Hi ich wurde gerne einen % Slider bauen um die Lautstärke meines Dolby Receiver schöner zu steuern.

Den Slider habe ich schon mit einer Variable hinbekommen, aber wie programmiere ich jetzt was er bei welchen % machen soll ?

Danke für eure Hilfe.

schwer zu erkennen wo du know-how technisch gerade stehst. Prinzipiell brauchst du ein Actionscript, welches auf Eingaben vom WFE reagiert und den neuen Wert an den Receiver schickt.

Da stellen sich auch Fragen zu folgenden Voraussetzungen (sind die erfüllt?):

  1. ist die Kommunikation von IPS zum Receiver etabliert?
  2. ist der Steuerbefehl des Receivers bekannt?

PS: Sorry ja den Receiver steuere ich per Winlirc an, klappt auch alles perfekt.

Ich wollte nur schöner machen und wollte es mal mit einem % SLider versuchen.

… ja wie denn nu: aus IPS via WinLirc an Receiver - oder was…?

also nehme ich mal an das die Steuerung aus IPS funktioniert und es nur um die Schnittstelle WFE <-> User via Volume-Slider geht?!

Nähern wir uns mal an: die Variable hast Du ja schon, das Profil ist scheinbar (%) auch angelegt.
Nun benötigst Du ein Script, welches den vom WFE an IPS gesendeten Wert aufnimmt und an den Receiver schickt (imk Variablenprofil als Actionscript eingetragen):


if ($IPS_SENDER == "WebFront") 
{ 
    // hier Befehl für "neuen Volume-Wert" an Receiver eintragen
}

Hier stellt sich nun die Frage: wie bekommst Du den neuen Wert in die IPS-Variable?

2 Möglichkeiten:
a) Du schreibst mit dem selben Script auch gleichzeitig den neuen Wert in die IPS-Variable (Nachteil: das entspricht nicht zwingend dem Wert im Receiver → mögliche Fehlerquelle)


if ($IPS_SENDER == "WebFront") 
{ 
    // hier Befehl für "neuen Volume-Wert" an Receiver eintragen
    SetValue($IPS_VARIABLE, $IPS_VALUE); 
}

b) der Reveiver quittiert dem empfangenen Wert/gibt den neu eingestellten Wert an IPS zurück. Dieser Wert wird per Register-variable empfangen, aufbereitet und an ein weiteres Script weitergeleitet welches diesen Wert dann in die variable einträgt.

Das Vorgehen funktioniert grundsätzlich (ich bevorzuge Variante b)), hat aber den unschönen Effekt das die Lautstärke digital vom Ausgangswert auch den neu eingegebenen Wert springt. Daher baue ich mir mittlerweile eine Funktion mit ein welche weich vomn Ausgangswert auf den neuen Wert „fadet“.

Das mal zur ersten Näherung. Jetzt Du!
:wink:

Hi dake für klasse Hilfe.

Ja Winlirc ist in IPS eingebunden.

Von dir:

also nehme ich mal an das die Steuerung aus IPS funktioniert und es nur um die Schnittstelle WFE <-> User via Volume-Slider geht?

Ja genau ich will es z.B. aus der IOS App schöner steuern.

die Variable hast Du ja schon, das Profil ist scheinbar (%) auch angelegt.
Nun benötigst Du ein Script, welches den vom WFE an IPS gesendeten Wert aufnimmt und an den Receiver schickt (imk Variablenprofil als Actionscript eingetragen):

Ja

Also ich habe einfach eine Variable als Interger angelegt.

Leider gibt der Receiver keine Rückmeldung ob der Befehl verarbeitet worden ist.

Ich dachte das man eher die % vom Slider auswertet ?

z.B. :

01% = Befehl

10% = Befehl

usw.

dann bleibt Dir nur Variante b), das würde solch ein Code tun:


if ($IPS_SENDER == "WebFront") 
{ 
    // hier Befehl für "neuen Volume-Wert" an Receiver eintragen
    SetValue($IPS_VARIABLE, $IPS_VALUE); 
}

Ergänzung: poste mal deinen IPS-Befehl, mit dem Du die Volume des Receivers steuerst. In diesen Befehl setzt du dann als zu übergebenden Wert „$IPS_VALUE“ ein. Vorausgesetzt Dein Receiver kann mit dem Integer-Wert 1:1 was anfangen. Wenn nicht muß „$IPS_VALUE“ zunächst umgerechnet werden)

Das wird nicht gehen will ich ja nur immer +1 oder -1 per IR sende.

Hier mein Befehl für +

WinLIRC_SendOnce(&id, „yamaha“, „volume+“);

und hier für -

WinLIRC_SendOnce(&id, „yamaha“, „volume+“);

und warum schreibst du das nicht gleich in die Anfrage?

dann hätte ich mir das geschreibsel und Rätselraten sparen können:mad:

für die Rahmenbedingungen ist eine Funktion ähnlich meiner oben angedeuteten hilfreich, ich kram die gleich mal raus. Pronzipiell ist das eine for-Schleife, die ermittelt das Delta zwischen Ausgangslautstärke und Ziel-Lautstärke, das Delta entspricht dann der Anzahl an „volume+“/„volume-“ Befehlen, die dann einer nach dem anderen an den receiver gesendet werden. Code folgt.

hier mal ein Versuchs-Code den ich bei mir geklaut habe:

Du rechnest über ein Script aus, wie groß das Delta zwischen vorherigem Lautstärke-Wert und dem neu zu setzendem Wert ist und übergibst den per

VolumeFade($id, $VolumeDelta);
an die unten stehende Funktion, die $id ist bei mir die IP des AVR, sowas ähnliches müsste bei Dir auch passieren (warum steht dann in deinem Befehl „&id“ ? -> wie ist dein AVR mit IPS verbunden?)

Ist das übergebene Delta negativ wird n Mal der Befehl „volume-“ gesendet, ist er positiv wird n Mal „volume+“ gesendet.



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

    if ($VolumeDelta > 0) // Volume Fade up
    {
        for ($count = 1; $count <= ($VolumeDelta); $count++)
        {
          WinLIRC_SendOnce(&id, "yamaha", "volume+");
            IPS_sleep(30);
            //echo "Yammi Function Volume UP
";
        }
    }
    if ($VolumeDelta < 0) // Volume Fade down
    {
        for ($count = 1; $count <= ($VolumeDelta); $count++)
        {
            $VolumeDelta = ($VolumeDelta * "-1");
            WinLIRC_SendOnce(&id, "yamaha", "volume-");
            IPS_sleep(50);
            echo "Yammi Function Volume DOWN
";
        }
    }
}

Was mich stutzig macht: wenn Dein AVR keinen aktuellen Volume-Wert zurück gibt (was mich arg wundert) -> woher weiß IPS dann welchen Volume-Wert der AVR aktuell hat? Wenn das tatsächlich so sein sollte (dass der Yammi nix sendet) kannst Du das gleich vergessen, das wird nicht steuerbar sein.

Das ist ganz einfach.

Ein und ausschlaten, lauter leiser usw. mache nur über ips.

Die Lautstärke habe ich auf einen Wert eingestellt und habe eine Variable wo reingeschrieben wird auf welchen Wert der Receiver ist.

Beim Ein und ausschlaten wird kontrolliert auf welchem Wert der Receiver ist und wird auf einem Bestimmt gesetzt.

Sorry das ich zu wenig Infos dir gegeben habe.

PS: Wie soll den der Receiver mir einen Wert zurückgeben wenn ich doch per IR (Infrarot) ansteuere ?

Eine Fernbedienung bekommt doch auch keinen Wert zurück (im Normalfall).

na ja, das dürfte spannend werden. Aber Du hast Recht: wenn der Receiver nur eine IR-Schnittstelle hat gehts nicht anders. Dann sollstest Du Dich mit oben stehender Funktion auseinandersetzten, damit sollte es klappen.

Hi danke dir habe einen neuen Anzusatz.

Aber habe erstmal eine Grundfrage:

Wenn ich den Slider auf einen % Wert einstelle passiert nichts in Variable.

Wie funktioniert der den ?

Ich dachte wenn ich im WF den Slider auf einen % Wert stelle das dieser Wert in die Variable geschrieben wird ?

Profil ist Volume

Wie bekomme es hin, das wenn ich den Slider auf einen Wert einstelle im WF oder IOS App das dieser Wert in Variable geschrieben wird.

Den Rest ist dann einfach für mich.

Das hat Raketenschnecke doch schon zig mal geschrieben, wie es funktioniert. :confused:

Das ganze dann als Aktion(im Profil) dem Script übergeben. Dann klappt es auch mit dem Slider.

…der arme Kerl, ich denke das er jetzt schweißgebadet den Thread rauf und runter liest, die Anleitung studiert, Scripte ausprobiert…ich denke morgen früh gegen 03:48 Uhr präsentiert er uns ein perfekt funktionierendes Script.

warum soll es ihm anders gehen als uns zu Anfang?
:wink:

… und immer locker bleiben :cool:

Haha ne so schlimm ist es auch net :wink:

Ich hasse Schleifen :frowning:

Habe es schonmal hinbekommen das der Slider funzt.

Zur Info :

Ich muss die Werte umrechnen die ich vom Receiver habe.

z.b. :

41 % = -41 db
40% = -40 db

41% = -39 db

$v=Volumeregler
$lsa=Lautstärke in db

Rechnung:
$wert1 = ($v-40);
$wert2 = (($v)-($wert12));
$wert3 = ($wert2
-1);

So bekomme ich den Richtigen Wert raus.

[b]Aber wie stelle ich es an, wenn ich per Slider 41% (in db sind das -39) einstelle, solange ein Befehl immer wieder ausführt werden soll, bis er in der Variable $lsa gleich mit dem $wert3 ist ?

Ich versuche es mit schleifen aber ich bekomme es nicht hin.[/b]

Hab das mal fürs ein und ausschalten gemacht:

ON:

$id = 24344 /*[IR Fernbedienung\WinLIRC]*/ ;
$lsa=GetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/);
$id = 24344 /*[IR Fernbedienung\WinLIRC]*/ ;

WinLIRC_SendOnce($id, "yamaha", "power");
ips_sleep (2000);



while ($lsa < "-40")
{
if ($lsa < "-40");
{

ips_sleep (200);
WinLIRC_SendOnce($id, "yamaha", "volume+");
$ls1=$lsa++;

SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , $ls1);
}
}

while ($lsa > "-40")
{
if ($lsa > "-40");
{

ips_sleep (200);
WinLIRC_SendOnce($id, "yamaha", "volume-");
$ls1=$lsa--;

SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , $ls1);
}
}

if ($lsa > "-40") SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , "-40");

SetValueBoolean(  47515 /*[IR Fernbedienung\Yamaha\Yamaha\Power]*/ ,true );

off:

<?
$id = 24344 /*[IR Fernbedienung\WinLIRC]*/ ;
$lsa=GetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/);
$id = 24344 /*[IR Fernbedienung\WinLIRC]*/ ;

while ($lsa < "-40")
{
if ($lsa < "-40");
{

ips_sleep (200);
WinLIRC_SendOnce($id, "yamaha", "volume+");
$ls1=$lsa++;

SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , $ls1);
}
}

while ($lsa > "-40")
{
if ($lsa > "-40");
{

ips_sleep (200);
WinLIRC_SendOnce($id, "yamaha", "volume-");
$ls1=$lsa--;

SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , $ls1);
}
}


if ($lsa == "-40");
{
WinLIRC_SendOnce($id, "yamaha", "standby");
SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , "-40");
}

SetValueBoolean(  47515 /*[IR Fernbedienung\Yamaha\Yamaha\Power]*/ ,false );
?>

Mit diesen Scripten schalte ich an und aus und kontrolliere die Laustärke, wenn die nicht auf -40 ist dann macht er so lange rum bis sie auf -40 ist.

ich glaub, ich steig hier aus …irgendwie scheint er meine posts nicht zu lesen/zu ignorieren oder sonstwas. Stichwort: bilaterale Monologe.

:rolleyes:

Nein ich lese deine Scripts und bin dir sher dankbar das du so viel gedult hast.

Nur ich raffe es net :slight_smile:

nicht raffen ist nicht schlimm, das geht jedem irgendwann so. Nur ich weis nicht wie ich noch helfen soll. M.E. hab ich dir den Lösungsweg zu deiner Frage ausfühlich erklärt und einen Beispielcode gepostet. Da wäre schon meine Empfehlung und Hoffnung das Du Dich damit auseinandersetzt. Aber wenn Du erst gar nicht drauf eingehst (man kan ja auch mal nachfragen)…schulterzuck

ich wollte dich auch nicht ständig belästigen, ich dachte mit den schleifen bin ich sofort fertig weil ich da schon hatte.

Ich verstehe nicht in deinem Script:

Die $id ist bei mir die IP des AVR, warum vergleichst du die IP mit einem Volumenwert ?

Wo kommt der Volumen-Wert her ?

Ich glaube das ist zu abstrakt was ich hier versuche und ohne das Ganze hintergrundwissen wird das nix ;-(

1000000x danke für deine Geduld und Hilfe :slight_smile:

Ich habs hinbekomme:

<?
$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]*/);
//print "$v _";
$wert1 = ($v-40);
$wert2 = ($v-($wert1*2));
$wert3 = ($wert2 * -1);
//print "$wert3";

while ($lsa < $wert3)
{
if ($lsa < $wert3);
{

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);
WinLIRC_SendOnce($id, "yamaha", "volume-");
$ls1=$lsa--;

SetValueString(46665 /*[IR Fernbedienung\Yamaha\Yamaha\Lautstärke in db]*/ , $ls1);
}
}
}
?>