Home of the Squeezebox™ & Transporter® network music players.
Results 1 to 5 of 5
  1. #1
    Senior Member
    Join Date
    Jan 2011
    Location
    Germany
    Posts
    226

    Frage zur Parameterrückgabe von einer Funktion.

    Hallo zusammen,

    im Rahmen eines Plugin muss ich ein Netzwerkgerät nach einem Usernamen bitten. Das Ganze funktioniert derart, dass am Gerät ein Kopf gedrückt wird und dann innerhalb von 30 Sekunden vom User eine HTTP-Anfrage kommen muss, die vom Gerätmit einem HHTP-Response beantwortet wird.
    Die Kommunikation, das Drücken des Knopfes, schlicht und einfach die Routine, um an den Usernamen zu kommen, funktioniert.

    Das Problem: Ich muss den Namen noch in XML speichern.

    Normalerweise würde ich so vorhgehen, wie Michael mir das schonmal beschrieben hat: eine Funktion schreiben, die den Wert zurückgibt. Das hat auch in anderen Fällen schon geklappt.

    Hier ist es nun so, dass die Funktion, welche den Namen abfragt ja noch gar nicht weiß, ob ein neuer da ist!

    Konkret: In der Settings.pm wird die UserName-Abhol-Routine ausgeführt und irgendwann innerhalb der Zeitspanne von 30 Sekunden ist der Name dann bei der HueCom.pm abholbereit...
    Letztlich schwierig, da den Namen abzuholen, zumal dieser noch einem Gerät zugewiesen werden muss...

    Umgesetzt habe ich das nun folgendermaßen:
    Ich übergebe derHueCom.pm die UDN des Geräts sowie eine XMLConfig-hashref (mit XML::Simple aus eine xml-Datei in der Settings.pm gelesen). In der HueCom.pm wird dann über die IP-Adresse etc. der UserName generiert.
    Was ich mir nun denke: Da die XMLConfig ein hashref ist, sollte es doch möglich sein, in der HueCom.pm die hasref zu ändern, so dass die Änderung in der Settings.pm ebenfalls eintritt. Somit hätte ich das oben beschrieben Problem, dass ich nicht weiß, wann der Wert abholbereit ist, umgangen. Ich müsste nur zyklisch den hashref XMLConfig lesen und hätte immer den aktuellsten Stand.

    Allerdings scheint der Trick mit der Hashref nicht zu funktionieren.
    Ich weiß nur nicht, wo der Denkfehler dabei liegt, ob ich einfach die Syntax in Perl falsch habe oder generell etwas missverstehe...
    Vielleicht manipuliere ich auch einfach den XML-Hash falsch?

    Bevor ich nun einen anderen, evtl. komplizierteren Weg einschlage wollte ich fragen, ob mal jemand drüber schauen könnte und mir nen Tipp geben kann, was ich falsch mache bzw. worauf ich achten muss.
    Laut Perl-Tutorials sollte die Idee, in einer anderen Funktion die Hashref zu ändern funktionieren sollte...

    Hier die entsprechenden Code Zeilen:
    Auslesen der XMLConfig aus der XML Datei (funkioniert): https://github.com/chincheta0815/LMS...ettings.pm#L65
    Zyklisches Anzeigen in einem eigenen Handler (funktioniert): https://github.com/chincheta0815/LMS...ttings.pm#L212
    Übergabe der UDN und der XMLConfig an die UserNameRoutine (funktioniert): https://github.com/chincheta0815/LMS...ttings.pm#L139
    Schreiben des UserNames in den heshref (ist da was falsch?): https://github.com/chincheta0815/LMS...HueCom.pm#L168
    Abholen bzw. zyklisches Lesen zeigt keine Änderung (es steht immernoch der initiale Wert drin): https://github.com/chincheta0815/LMS...ttings.pm#L156
    LMS-7.9@solaris. 2x Radio, 2x Duet, 1x Chromecast v1, ShairTunes, 1x Philips Hue System

  2. #2
    Babelfish's Best Boy mherger's Avatar
    Join Date
    Apr 2005
    Location
    Switzerland
    Posts
    19,698

    =?utf-8?q?Frage_zur_Parameterr=EF=BF=BDckgabe_von?==?utf-8?q?_einer_Funktion=2E?=

    Versuche bitte mal, das Problem unabhängig von deinem Code zu erklären.
    Beschreibe, was du machen _willst_, nicht, was du tust. Ich verstehe schon gar
    nicht, wann denn der Request zu deinem Gerät ausgeführt wird, was das auslöst etc.

    --

    Michael
    Last edited by mherger; 2017-05-18 at 23:55.

  3. #3
    Senior Member
    Join Date
    Jan 2011
    Location
    Germany
    Posts
    226
    Quote Originally Posted by mherger View Post
    Versuche bitte mal, das Problem unabhängig von deinem Code zu erklären.
    Beschreibe, was du machen _willst_, nicht, was du tust.
    Okay. Ich versuch's ohne Code, allerdings mit "Namen", das hilft mir beim Beschreiben.

    Hintergrund:
    Es soll eine HueBridge über einen Binary Helper, der in C geschrieben ist, gesteuert werden. Dieser verfolgt das gleiche Konzept wie die Plugins von philippe44.
    Die Kommunikation mit der HueBridge erfolgt über HTTP-Requests und HTTP-Responses.

    Ein wichtiger Unterschied zu den Plugins von pilippe44: Um die HueBridge ansprechen zu können, ist ein UserName notwendig ist, den die Bridge auf Anfrage durch einen HTTP-Request liefert.
    Dieser muss dann bei allen zukünftigen Steuerbefehlen in der URI des HTTP-Requests mitgeliefert werden. Sonst kann man die Lampen nicht einstellen.

    Den UserName bekommt man folgendermaßen: 1. Knopf an Bridge drücken, 2. innerhalb von 30 Sekunden entsprechenden Request schicken. 3. Response auslesen

    In der LMS-GUI soll ein Button rein, mit dem eine Routine ausgelöst wird, die den UserName anfragt und abholt.
    Danach soll der Username in einer XML Datei gespeichert werden, auf die auch das binary zugreift.
    Das ist wegen der Implementierung und dem Aufbau von philippe44's Vorlage der einfachste Weg, da das binary selbst die XML braucht.

    Die Routinen zum Abrufen des Usernames sollen der Übersichtlichkeit wegen in eine eigene Datei genannt "HueCom.pm".
    Die "Settings.pm" soll die Hanlder von der GUI enthalten.

    Was ich nun machen will:
    -> Den UserName von der HueBridge möglichst einfach in die XMLDatei schreiben.
    Die Idee, die ich dabei verfolge:
    1. In der "Settings.pm" den Vorgang durch Aufrufen einer Funktion "HueCom::connect($deviceUDN, $XMLConfig)" starten. Der string "$deviceUDN" besagt, von welcher Bridge der UserName kommen soll, die heashref "$XMLConfig" enthält den Inhalt der XMLDatei (über XML::Simple).
    2. In der "HueCom.pm" soll dann der Name abgefragt werden.
    3. Der Name muss nun zurück in die "Settings.pm" um über eine Checkbox zu zeigen, dass ein Name gesetzt ist und der UserName soll in der XMLDatei gespeichert werden.
    Wichtig: Der Username ist einer UDN zugeordnet. Sollten 2 Bridges da sein, muss die Zuordnung ebenfalls klappen.

    Idee zur Umsetzung:
    Da in der XMLDatei für jede Bridge getrennt die Daten gespeichert sind, kann ich dort auch ganz gut den Username der Bridge zuordnen. Warum also nicht direkt mit der Datei bzw. deren Inhalt arbeiten.
    XML::Simple liefert den xml-Dateinhalt angeblich als hashref. weshalb ich gedacht habe:
    In der "Settings.pm" den hasref durch Auslesen der XML-Datei erzeugen, dann an die "HueCom.pm" übergeben und in der "HueCom.pm" den Inhalt des hashrefs an der entsprechenden Stelle (Bridge + deren UserName) ändern.
    Um die Änderungen in der "Settings.pm" angezeigt zu bekommen, einfach alle 2 Sekunden den hashref neu laden, dann wir der UserName irgendwann auftauchen, so umgehe ich die Wartezeit von 30 Sekunden und brauche keine weiteren Timer.
    Das würde mir auch eine weitere "Abholfunktion" ersparen, der ich beibringen muss die UDN und den Namen zurückzuliefern, ich könnte auf Checks verzichten und würde einfach die eh schon vorhanden hashref verwenden können...

    War das ungefähr, die Info, die Du losgelöst vom Code gebraucht hast?
    LMS-7.9@solaris. 2x Radio, 2x Duet, 1x Chromecast v1, ShairTunes, 1x Philips Hue System

  4. #4
    Senior Member
    Join Date
    Jan 2011
    Location
    Germany
    Posts
    226
    Hat geklappt.
    Die Referenz wurde immer wieder mit den Standards überschrieben, weswegen der Wert nie angezeigt wurde...
    LMS-7.9@solaris. 2x Radio, 2x Duet, 1x Chromecast v1, ShairTunes, 1x Philips Hue System

  5. #5
    Babelfish's Best Boy mherger's Avatar
    Join Date
    Apr 2005
    Location
    Switzerland
    Posts
    19,698

    Zugriff auf Prefs in eigenem Handler.

    > sub pushPrefsToParams {
    > my $prefsPrefix = shift;
    > my @prefsList = shift;


    Du musst die Liste als Referenz übergeben. In obiger Anweisung wird nur
    das erste Element der @prefsList übernommen.

    --

    Michael

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •