Sonos mit VD Command ansteuern

Hey, habe mir auch den Sonos Comander von Doonic auf meiner HC2 installiert. Doch leider bekomme ich es einfach nicht zum laufen. Alles soweit gemacht wie beschrieben.Dank Doonik doch leider bekomme ich kein Ton aus meiner Play1. Würde mich sehr über Hilfe freuen!!

VG
Matze

Habe heute gelesen, dass seit einiger Zeit der VD Command von Doonik nicht mehr funktioniert. Hätte jemand vielleicht einen funktionierenden VD Command Sonos, den er mit mir teilen könnte??
Vielen Dank im Voraus!!!

Sonos Vb

Hi hier mein VD .

Hallo Tilo, ’
besten Dank! Ich bekomme bei dem Button Radio wenn ich diesen Debug ausführe eine Fehlermeldung, kannst Du mir da weiterhelfen. Bin ein Anfänger!!!
StartStopLöschen[ERROR] 11:42:35: line 238: attempt to concatenate local ‘station’ (a nil value)
[ERROR] 11:42:37: line 238: attempt to concatenate local ‘station’ (a nil value)
[ERROR] 11:42:38: line 238: attempt to concatenate local ‘station’ (a nil value)
[ERROR] 11:42:38: line 238: attempt to concatenate local ‘station’ (a nil value)
[ERROR] 11:42:38: line 238: attempt to concatenate local ‘station’ (a nil value)

Also die Button PlaySound, StopSound, Laut,-Leiser funktionieren alle. wenn ich den Button Radio drücke = Status: Radio läuft , sollte ja eigentlich der Sream aus der Variable spielen oder? Leider gibt er diesen Befehl nicht weiter. Ich bräuchte deine Hilfe! Bitte!

Hallo zusammen,
ich hatte den Commander vor Jahren mal raufgebracht, aber leider auch nie zum Laufen bekommen. Nun möchte ich das doch mal wieder neu angehen.
Auch ich bekomme da nichts raus. Nur das Original-Plugin von Fibaro läuft.
Der Commander zeigt mir auch an das das Radio oder die Musik laufen würde, macht er aber trotz aller Variablen, etc. nicht.

Hallo zusammen
Bei mir läuft Radio nach wie vor über Commander

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
-- SONOS Text To Speech (TTS) - Give voice to your HC2 with SONOS wireless speakers
-- Version 0.0.4 pre-release
-- Copyright (C) 2014 Jean-Christophe Vermandé
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------

selfId = fibaro:getSelfId();    
ip = fibaro:get(selfId, 'IPAddress');
port = fibaro:get(selfId, 'TCPPort');
currentTransportState = "";
lastTransportState = "";
currentVolume = 0;
lastVolume = 0;
ttsVolumeIsDifferent = false;

urlencode = function(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n");
    str = string.gsub (str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end);
    str = string.gsub (str, " ", "+");
  end
  return str;
end

createRequestBody = function(action, schema, data)
  return string.format("<u:%s xmlns:u=\"%s\">%s</u:%s>", action, schema, data, action);
end

reponseCallback = function(fnc, args)
  if (fnc == nil) then
    return nil;
  end
  return fnc(args);
end

createSocket = function()
    -- Check IP and PORT before
  if (ip == nil or port == nil) then
    fibaro:debug("You must configure IPAddress and TCPPort first");
    return;
  end
  local socket;
  local status, err = pcall(function() 
      socket = Net.FTcpSocket(ip, port);
      socket:setReadTimeout(1000);
    end);  
  if (status ~= nil and status ~= true) then
    fibaro:debug("socket status: " .. tostring(status or ''));
  end  
  if (err ~= nil) then
    fibaro:debug("socket err: " .. tostring(err or ''));
    return;
  end
  return socket;
end

disposeSocket = function(socket)
  if (socket ~= nil) then
    socket:disconnect();
    socket = nil;
    return true;
  end
  return false;
end

sendSoapMessage = function(url, service, action, args, callback, retry)
  
  local socket = createSocket();
  if (socket == nil) then
    return;
  end
  retry = retry or 0
  -- prepare data
  local url = "POST " .. url .. " HTTP/1.1";
  fibaro:debug(ip)
  local so1="HOST: ".. ip ..":1400"
  local soapaction = "SOAPACTION: \"" .. service .. "#" .. action.name .. "\"";
  local body = createRequestBody(action.name, action.service, tostring(args or ""));
  local envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body>" .. body .. "</s:Body></s:Envelope>";
  local ctl = "Content-Length: " .. string.len(envelope);
  local payload = url .. "\r\n" .. so1 .. "\r\n" .. ctl .. "\r\n" .. soapaction .. "\r\n" .. "\r\n" .. envelope;
  -- write data
  local bytes, errorcode = socket:write(payload);
  if (errorcode == 0) then
    local state, errorcode = socket:read();
    if (errorcode == 0) then
      if (string.len(state or "") > 0) then
        -- callback
        if (callback ~= nil) then
          reponseCallback(callback, state);
        end
        -- dispose ...
        disposeSocket(socket);
        return true;
      else
        fibaro:debug("Error: Invalid response. response length: " .. string.len(state or ""));
      end
    else
      if (retry < 5) then
        fibaro:debug("retry #"..retry.." action: " .. action.name);
        return sendSoapMessage(url, service, action, args, callback, (retry + 1));
      else
        fibaro:debug("Error: Code returned "..tostring(errorcode or ""));
      end
    end
  elseif (errorcode == 2) then
    fibaro:debug("Error: You must check your IP and PORT settings.");
  else
    if (retry < 5) then
      fibaro:debug("retry #"..retry.." action: " .. action.name);
      return sendSoapMessage(url, service, action, args, callback, (retry + 1));
    else
      fibaro:debug("Error: Code returned "..tostring(errorcode or ""));
    end
  end
  -- dispose ...
  disposeSocket(socket);
  -- default response
  return false;
end

stop = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Stop", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Speed>1</Speed>",
      -- callback (options)
    function(response)
      fibaro:debug("stop sent");
    end);    
end

unMute = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:RenderingControl:1",
    -- action
    { name = "SetMute", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>0</DesiredMute>",
      -- callback (options)
    function(response)
      fibaro:debug("unMute sent");
    end); 
end

play = function(duration)
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Play", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Speed>1</Speed>",
      -- callback (options)
    function(response)   
      fibaro:debug("Play");
    end);    
end

setVolume = function(value)
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:RenderingControl:1",
    -- action
    { name = "SetVolume", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>" .. tostring(value) .. "</DesiredVolume>",
    -- callback (options)
    function(response)      
      fibaro:debug("Volume set: " .. value);
    end);
end

getVolume = function()
  fibaro:log("Get volume, please wait...");
  return sendSoapMessage(
    -- control url
  	"/MediaRenderer/RenderingControl/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "GetVolume", service = "urn:schemas-upnp-org:service:RenderingControl:1" },
    -- soap body data (options)    
    "<InstanceID>0</InstanceID><Channel>Master</Channel>",
    -- callback (options)
    function(response)
      currentVolume = tonumber(response:match("<CurrentVolume>(.+)</CurrentVolume>") or 0);
    end);
end

getTransportState = function()
  return sendSoapMessage(
    -- control url
  	"/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "GetTransportInfo", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID>",
    -- callback (options)
    function(response)      
      currentTransportState = response:match("<CurrentTransportState>(.+)</CurrentTransportState>") or "";
    end);
end

-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
-- SONOS Radio
-- Version 0.0.1 pre-release
-- Copyright (C) 2015 Nicolas Dörig
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------

playRadio= function(station, volume)
  return sendSoapMessage(
  -- control url
  "/MediaRenderer/AVTransport/Control",
  -- service type
  "urn:schemas-upnp-org:service:AVTransport:1",
  -- action
  { name = "SetAVTransportURI", service = "urn:schemas-upnp-org:service:AVTransport:1" },
  -- soap body data (options)
  "<InstanceID>0</InstanceID>,<CurrentURI>x-rincon-mp3radio://" .. station .. "</CurrentURI>,<CurrentURIMetaData></CurrentURIMetaData>",
  -- callback (options)
  function(response)
  -- retrieve current transport state
  getTransportState();
  lastTransportState = currentTransportState;
  -- unmute before
  unMute();
  -- retrieve volume
  getVolume();
  lastVolume = currentVolume;
  -- set tts volume if <> with current
  if (volume ~= nil and volume ~= currentVolume) then
    setVolume(volume);
    ttsVolumeIsDifferent = true; 
  end
 
  play();
 
  end);
end

-- Globale Variabel abfragen & verwenden
if fibaro:getGlobalValue("SONOS_RADIO") == "" then
  playRadio("radiopilatus.ice.infomaniak.ch/pilatus64.mp3", nil);
else
  playRadio(fibaro:getGlobalValue("SONOS_RADIO"), nil);
end

fibaro:call(selfId, "setProperty", "ui.Label1.value", "Radio läuft..."); --Status Anzeige im VD Interface
--fibaro:call(selfId, "setProperty", "ui.Volume.value", lastVolume); --Volume Anzeige im VD Interface  
--fibaro:call(selfId, "setSlider", "ui.Volume.value", lastVolume)

OK, habe eben mal beide nebeneinander gepackt und auf die Schnelle nur das hier als Unterschied feststellen können.

fibaro:debug(ip)
local so1=“HOST: “… ip …”:1400”

Müsst bei Dir Zeile 77 und 78 sein.
Bei mir ist Zeile 77:
local soapaction = “SOAPACTION: “” … service … “#” … action.name … “””;
Was bei Dir ja scheinbar die Zeile 79 ist…
Ich versuche mal… Obwohl…

Hab nun doch alles kopiert.
Danke Dir. War wohl doch noch was an einer anderen Stelle.
Was nicht klappt ist Music, was aber am meinen Netzwerkeinstellungen beim NAS liegen kann, weil ich kein WebDAV darauf aktiviert habe.
Was auch noch das Problem ist, ist das TTS. Irgendwann hatte ich das auch mal, zumindest rudimentär…

Sorry, da kann ich Dir leider nicht weiterhelfen.
Hab das nie gebraucht. Soviel ich weiss geht TTS nur noch zusammen mit einem Raspi.
Und Music hab ich auch nie gebraucht…

Ja, TTS funktioniert mit dem Commander nicht mehr.

Ah, OK. Danke Euch. Meine Sonos startet jetzt auch wieder morgens per Motion. Eben der Test erfolgreich verlaufen. Das TTS war nur ganz witzig wegen der Wetteransage. Aber dann brauch ich ja nicht länger zu suchen…
Was aber auch noch nicht sauber funktioniert ist der Stopp.

Hättest Du, wenn das bei Dir auch klappt nochmals den Code vom Button 4, also den Stopp-Button.
Oder Event. gleich das ganze Device, virtuelles Gerät exportieren…?
In meinem Commander steht immer drin „Stopp Music…“ Macht er aber nicht…