Gerätenamen dynamisch im Script benutzen?

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

Antworten
ah966
Beiträge: 8
Registriert: 31.10.2017, 18:56

Gerätenamen dynamisch im Script benutzen?

Beitrag von ah966 » 31.10.2017, 19:28

Hallo!

Ich heiße Andreas, bin neu hier und beschäftige mich seit einigen Tagen mit der CCU2 und dem Steuern von Sonos-Lautsprechern.

Bisher hatte ich eine Lösung mittels .cgi- und .php-Scripten, mittels denen ich eine 8-Tasten-Fernbedienung zum Steuern der Lautsprecher nutzen konnte.
Nun versuche ich das Ganze in HomeGear mit dem Sonos-Modul abzubilden.

Meine Anforderung sieht so aus:
Ich möchte über zwei Tasten (je kurzer und langer TDruck) der Fernbedienung einen der vier Sonos auswählen. Der Name des Sonos wird in der Systemvariablen Sonosplayer gespeichert. Funktioniert auch.

Jetzt will ich aber im Script nicht direkt den Namen eines Sonos reinschreiben, sondern mich auf den Wert der SysVar Sonosplayer beziehen. Sie enthält den Namen des zu steuernden Lautsprechers.

Zuvor mit den PHP-Scripten hat das funktioniert, da ich mittels SystemExec dann die Variable im Aufruf einbauen konnte:

Code: Alles auswählen

string stdout;
string stderr;
string  mySysVar = dom.GetObject("Sonosplayer");
var sonos = mySysVar.ValueList() .StrValueByIndex(";",mySysVar.Value());
string url = "http://server/sonos2.php?zonen=" # sonos # "&action=clearqueue";
system.Exec("wget -q -O - " # url # "", &stdout, &stderr);
string url = "http://server/sonos2.php?zonen=" # sonos # "&action=serverlist&serverfile=server/music/playlists/Andreas.m3u";
system.Exec("wget -q -O - " # url # "", &stdout, &stderr);
system.Exec("/usr/local/etc/config/addons/www/sonos2/sonos2.cgi " # sonos # " shuffle true next", &stdout,&stderr);
system.Exec("/usr/local/etc/config/addons/www/sonos2/sonos2.cgi " # sonos # " volume 10", &stdout,&stderr);
system.Exec("/usr/local/etc/config/addons/www/sonos2/sonos2.cgi " # sonos # " play", &stdout,&stderr);
Mit der jetzigen Lösung (Homegear + Sonos-Modul) sieht der Aufruf etwa so aus:

Code: Alles auswählen

string  mySysVar = dom.GetObject("Sonosplayer");
var SPlayer = mySysVar.ValueList() .StrValueByIndex(";",mySysVar.Value());
WriteLine("Inhalt SPlayer ist: " # SPlayer # ".");
SPlayer.DPByHssDP("ADD_URI_TO_QUEUE").State("x-file-cifs://server/music/playlists/Andreas.m3u");
SPlayer.DPByHssDP("VOLUME").State(5);
Die WriteLine-Zeile gibt den korrekten Wert aus, aber der Aufruf funktioniert nicht.
Setze ich den Namen des Gerätes direkt ein, funktioniert es:

Code: Alles auswählen

string  mySysVar = dom.GetObject("Sonosplayer");
! var SPlayer = mySysVar.ValueList() .StrValueByIndex(";",mySysVar.Value());

var SPlayer = dom.GetObject("Play1Flur:1");

WriteLine("Inhalt SPlayer ist: " # SPlayer # ".");
SPlayer.DPByHssDP("ADD_URI_TO_QUEUE").State("x-file-cifs://server/music/playlists/Andreas.m3u");
SPlayer.DPByHssDP("VOLUME").State(5);
Die Ausgabe von WriteLine ist in beiden Fällen gleich.

Wo habe ich hier den Denkfehler? Wie muß ich die Variable bzw. deren Wert umsetzen, damit ich das wie gewünscht steuern kann?

Viele Grüße,
Andreas

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Gerätenamen dynamisch im Script benutzen?

Beitrag von anli » 05.11.2017, 12:13

Hallo Andreas,

der Unterschied ist, dass das eine mal SPlayer ein Object ist, während er das andere mal ein String ist. So in etwa sollte es funktionieren:

Code: Alles auswählen

string  mySysVar = dom.GetObject("Sonosplayer");
var stringSPlayer = mySysVar.ValueList() .StrValueByIndex(";",mySysVar.Value());
var SPlayer = dom.GetObject(stringSPlayer);
WriteLine("Inhalt SPlayer ist: " # SPlayer # ".");
SPlayer.DPByHssDP("ADD_URI_TO_QUEUE").State("x-file-cifs://server/music/playlists/Andreas.m3u");
SPlayer.DPByHssDP("VOLUME").State(5);
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

ah966
Beiträge: 8
Registriert: 31.10.2017, 18:56

Re: Gerätenamen dynamisch im Script benutzen?

Beitrag von ah966 » 05.11.2017, 12:26

Hallo anli,

danke für die Nachricht.

Es funktioniert sogar so:

Code: Alles auswählen

var mySysVar = dom.GetObject("Sonosplayer").Value();
var SPlayer = dom.GetObject(Sonosplayer);
Und läuft!

Womit ich jetzt noch ein Problem habe, ist das Setzen eines Radiosenders aus den Favoriten, das auch Bild und Name korrekt anzeigt.

Ein AV_TRANSPORT_URI funktioniert gut mit x-file-cifs, aber mit x-sonosapi-stream nicht.

Ich lade Radiosender über PLAY_RADIO_FAVORITE - bekomme aber dann nur die Stream.mp3 angezeigt.
Hat da noch jemand eine Idee dazu?

Viele Grüße,
Andreas

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“