Aller au contenu

Fibaro Hc2 Vd Sonos Remote: Télécommande Pour Diffuseur Sonos


Krikroff

Messages recommandés

Exact, je l'avais fait un jour malencontreusement, si tu saves le Panneau de variables, ca met NaN comme valeur, et evidemment, plus rien ne fonctionne lol

 

Ne jamais touche au panneau autrement que pour créer, JAMAIS de SAVE

Depuis, moi des que je peux, je passe par des labels ;-). Maintenant j'ai les 2 lol

Lien vers le commentaire
Partager sur d’autres sites

C'est Page 40

Moi j'ai fait un bouton par playlist dédié dans le VD de Krikroff. Pour mon besoin je reset la Liste à chaque changement de playList en fin de code.

Voici le code du bouton

Juste à changer :

list_nbr = 6 -- playlist number on jffs system of SONOS, You need test it for find interesting list, (j'ai fait au pif en incrémentant de 1 à chaque essai, je pense que j'avais mis les radios avant c'est pour cela que je suis à 6 pour la première liste) 
uid = "RINCON_B8EXXXXXXXXXX1400" -- find by http://SONOS_IP:1400/status/upnp : clicker Incoming Subscriptions et copier coller l'uid.

 

-- SONOS Play playlist, v.0.1  
-------------------------------------------------------------------------------------------
---made on source of:-----------------------------------------------------------------------
-- SONOS Play stream...
-- Copyright © 2014 Jean-Christophe Vermandé
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
----------------------------------
-- User Settings
----------------------------------

selfId = fibaro:getSelfId();    
ip = fibaro:get(selfId, 'IPAddress');
port = fibaro:get(selfId, 'TCPPort') or 1400;
list_name = "Sonos Playlist Vanessa" --not implemented
list_nbr = 6 -- playlist number on jffs system of SONOS, You need test it for find interesting list
uid = "RINCON_B8EXXXXXXXXXX1400" -- find by http://SONOS_IP:1400/status/upnp
FileVol = 40
PlayUnlimited = "Yes" -- si <> Yes, arrêt après 30s environ
--duration =
----------------------------------
-- DO not change bellow this line
---------------------------------- 
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

clear_last_que = function() -- without this album is added after play song/query
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/Queue/Control",
    -- service type
    "urn:schemas-sonos-com:service:Queue:1",
    -- action
    { name = "RemoveAllTracks", service = "urn:schemas-sonos-com:service:Queue:1" },
    -- soap body data (options)
"<QueueID>0</QueueID>,<UpdateID>0</UpdateID>",
      -- callback (options)
    function(response)   
 fibaro:debug("Remove");
 end);
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";
  --local udn = "X-SONOS-TARGET-UDN: uuid:RINCON_B8E937B01D4E01400" -- udn of my SONOS (not need)
  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" .. ctl .. "\r\n" .. udn .. "\r\n" .. soapaction .. "\r\n" .. "\r\n" .. envelope; -- with UDN
  local payload = url .. "\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)   
      if (duration ~= nil) then
        fibaro:debug("play sent for " .. duration .. " seconds");
        fibaro:sleep(duration);
        stop();
      else
        fibaro:debug("play sent");
        local n = 0;
        currentTransportState = "TRANSITIONING";
        while (currentTransportState == "TRANSITIONING") do
          if (n > 10) then break end;
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(5000);
          n = n + 1;
        end        
        local i = 0;
        currentTransportState = "PLAYING";
        while (currentTransportState == "PLAYING") do
         if (i > 10 and PlayUnlimited ~= "Yes") then break end;
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(2000);
          i = i + 1;
        end
        fibaro:sleep(1000);
        stop();
      end
      -- update volume with value before tts if different
      if (ttsVolumeIsDifferent == true) then
      	setVolume(lastVolume);
        ttsVolumeIsDifferent = false;
      end
    end);    
end
 
 sseek = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Seek", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID>,<Unit>TRACK_NR</Unit>,<Target>1</Target>",
      -- callback (options)
    function(response)   
 fibaro:debug("Seek");
 end);
end
 
 
  que = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "AddURIToQueue", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
        "<InstanceID>0</InstanceID>,<EnqueuedURI>file:///jffs/settings/savedqueues.rsq#".. list_nbr.."</EnqueuedURI>,<EnqueuedURIMetaData>&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;SQ:1&quot; parentID=&quot;SQ:&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;".. list_name .."&lt;/dc:title&gt;&lt;upnp:class&gt;object.container.playlistContainer&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;RINCON_AssociatedZPUDN&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</EnqueuedURIMetaData>,<DesiredFirstTrackNumberEnqueued>1</DesiredFirstTrackNumberEnqueued>,<EnqueueAsNext>1</EnqueueAsNext>",
      -- callback (options)
    function(response)   
 fibaro:debug("que");
 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
 
playFile= function(volume)
return sendSoapMessage(

-- control url  SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
"/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-queue:"..uid.."#0</CurrentURI>,<CurrentURIMetaData></CurrentURIMetaData>",



-- zestawienie playlist
-- control url
--"/MediaServer/ContentDirectory/Control",
-- service type
--"urn:schemas-upnp-org:service:ContentDirectory:1",
-- action
--{ name = "Browse", service = "urn:schemas-upnp-org:service:ContentDirectory:1" },
-- soap body data (options)
--"<ObjectID>Q:0</ObjectID>,<BrowseFlag>BrowseDirectChildren</BrowseFlag>,<Filter>dc:title,res,dc:creator,upnp:artist,upnp:album,upnp:albumArtURI</Filter>,<StartingIndex>0</StartingIndex>,<RequestedCount>100</RequestedCount>,<SortCriteria></SortCriteria></u:Browse>",
-- 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
sseek();
play();
 
end);
end
 
clear_last_que();
que();
-- en paramètres: le fichier, puis le volume...
playFile(FileVol);

 

 

Lien vers le commentaire
Partager sur d’autres sites

Merci @Titof_44 ;-)

Désolé pour le retard de la réponse..le boulet. 

Excellent, on peut aussi pour Spotify, juste la grande classe

very good, very good @drboss thanks a lot. 

 

Quelqu'un a trouvé le moyen simple de récupérer le list_nbr ? 

 

Plus qu'à tester ;-)

Lien vers le commentaire
Partager sur d’autres sites

You need to the test, for ex. I have list of 9 playlist (see image bellow). The Sonos sort in application list by alphabet, but for the list give number by sequence of addition.

In my example last added list is playlist SAUNA and they have number 9

 

I haven't the time for write the request for retrieve the list with number and name for for display in debug window.

 

But is more simple when you use spotify with sonos.

spotify_user - your spotify login used in sonos

spotify_playlist - the id of playlist in spotify retrived like album id from spotify www - see first post.

 

que = function() --playlist from Spotify
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "AddURIToQueue", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
 "<InstanceID>0</InstanceID>,<EnqueuedURI>x-rincon-cpcontainer:10062a6cspotify%3auser%3a"..spotify_user.."%3aplaylist%3a"..spotify_playlist.."</EnqueuedURI>,<EnqueuedURIMetaData>&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;10062a6cspotify%3auser%3a"..spotify_user.."%3aplaylist%3a"..spotify_playlist.."&quot; parentID=&quot;10082664playlists&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;Fibaro from Spotify&lt;/dc:title&gt;&lt;upnp:class&gt;object.container.playlistContainer&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;SA_RINCON2311_X_#Svc2311-0-Token&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</EnqueuedURIMetaData>,<DesiredFirstTrackNumberEnqueued>2</DesiredFirstTrackNumberEnqueued>,<EnqueueAsNext>1</EnqueueAsNext>",
      -- callback (options)
    function(response)   
 fibaro:debug("que");
 end);
end



----

 

sonos-l1.PNG

Lien vers le commentaire
Partager sur d’autres sites

Thanks @drboss

 

I try but nothing, i have only one playlist in sonos, and i don't find the list_nbr, i try until 11, i have 6 favorite radios. 

I do something wrong, but what. 

 

I don't use Spotify yet :-(

 

@Titof_44

Comme toi, j'ai rajoute un bouton dans le Sonos Remote pour tester ;-) ..oui oui, je plagie lol

Je vous le code peut-être que je rate qqch ;-) 

-- SONOS Play playlist, v.0.1  
-------------------------------------------------------------------------------------------
---made on source of:-----------------------------------------------------------------------
-- SONOS Play stream...
-- Copyright © 2014 Jean-Christophe Vermandé
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
----------------------------------
-- User Settings
----------------------------------
selfId = fibaro:getSelfId();    
ip = fibaro:get(selfId, 'IPAddress');
port = fibaro:get(selfId, 'TCPPort') or 1400;
list_name = "pepite" --not implemented
list_nbr = 11 -- playlist number on jffs system of SONOS, You need test it for find interesting list
uid = "RINCON_5CAAFD239EE601400" -- find by http://SONOS_IP:1400/status/upnp
FileVol = 40
PlayUnlimited = "Yes" -- si <> Yes, arrêt après 30s environ
--duration =
----------------------------------
-- DO not change bellow this line
---------------------------------- 
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
clear_last_que = function() -- without this album is added after play song/query
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/Queue/Control",
    -- service type
    "urn:schemas-sonos-com:service:Queue:1",
    -- action
    { name = "RemoveAllTracks", service = "urn:schemas-sonos-com:service:Queue:1" },
    -- soap body data (options)
"<QueueID>0</QueueID>,<UpdateID>0</UpdateID>",
      -- callback (options)
    function(response)   
 fibaro:debug("Remove");
 end);
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";
  --local udn = "X-SONOS-TARGET-UDN: uuid:RINCON_B8E937B01D4E01400" -- udn of my SONOS (not need)
  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" .. ctl .. "\r\n" .. udn .. "\r\n" .. soapaction .. "\r\n" .. "\r\n" .. envelope; -- with UDN
  local payload = url .. "\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)   
      if (duration ~= nil) then
        fibaro:debug("play sent for " .. duration .. " seconds");
        fibaro:sleep(duration);
        stop();
      else
        fibaro:debug("play sent");
        local n = 0;
        currentTransportState = "TRANSITIONING";
        while (currentTransportState == "TRANSITIONING") do
          if (n > 10) then break end;
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(5000);
          n = n + 1;
        end        
        local i = 0;
        currentTransportState = "PLAYING";
        while (currentTransportState == "PLAYING") do
         if (i > 10 and PlayUnlimited ~= "Yes") then break end;
          getTransportState();
          fibaro:debug(currentTransportState);
          fibaro:sleep(2000);
          i = i + 1;
        end
        fibaro:sleep(1000);
        stop();
      end
      -- update volume with value before tts if different
      if (ttsVolumeIsDifferent == true) then
        setVolume(lastVolume);
        ttsVolumeIsDifferent = false;
      end
    end);    
end
 
 sseek = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "Seek", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID>,<Unit>TRACK_NR</Unit>,<Target>1</Target>",
      -- callback (options)
    function(response)   
 fibaro:debug("Seek");
 end);
end
 
 
  que = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "AddURIToQueue", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
        "<InstanceID>0</InstanceID>,<EnqueuedURI>file:///jffs/settings/savedqueues.rsq#".. list_nbr.."</EnqueuedURI>,<EnqueuedURIMetaData><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="SQ:1" parentID="SQ:" restricted="true"><dc:title>".. list_name .."</dc:title><upnp:class>object.container.playlistContainer</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">RINCON_AssociatedZPUDN</desc></item></DIDL-Lite></EnqueuedURIMetaData>,<DesiredFirstTrackNumberEnqueued>1</DesiredFirstTrackNumberEnqueued>,<EnqueueAsNext>1</EnqueueAsNext>",
      -- callback (options)
    function(response)   
 fibaro:debug("que");
 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
 
playFile= function(volume)
return sendSoapMessage(
-- control url  SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
"/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-queue:"..uid.."#0</CurrentURI>,<CurrentURIMetaData></CurrentURIMetaData>",

-- zestawienie playlist
-- control url
--"/MediaServer/ContentDirectory/Control",
-- service type
--"urn:schemas-upnp-org:service:ContentDirectory:1",
-- action
--{ name = "Browse", service = "urn:schemas-upnp-org:service:ContentDirectory:1" },
-- soap body data (options)
--"<ObjectID>Q:0</ObjectID>,<BrowseFlag>BrowseDirectChildren</BrowseFlag>,<Filter>dc:title,res,dc:creator,upnp:artist,upnp:album,upnp:albumArtURI</Filter>,<StartingIndex>0</StartingIndex>,<RequestedCount>100</RequestedCount>,<SortCriteria></SortCriteria></u:Browse>",
-- 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
sseek();
play();
 
end);
end
 
clear_last_que();
que();
-- en paramètres: le fichier, puis le volume...
playFile(FileVol);

 

Lien vers le commentaire
Partager sur d’autres sites

Check if in Your code exist many ", because You need use it only on begin & end of string on LUA level. In string (html) You need use &quot for " &lt for < etc...

I have this problem when I past code first time to forum. The forum convert html &... to normal character when You not change typ of source.

I doing concretion on 28.03, please check this in Your VD

or paste this que:

  que = function()
  return sendSoapMessage(
    -- control url
    "/MediaRenderer/AVTransport/Control",
    -- service type
    "urn:schemas-upnp-org:service:AVTransport:1",
    -- action
    { name = "AddURIToQueue", service = "urn:schemas-upnp-org:service:AVTransport:1" },
    -- soap body data (options)
    "<InstanceID>0</InstanceID>,<EnqueuedURI>file:///jffs/settings/savedqueues.rsq#"..list_nbr.."</EnqueuedURI>,<EnqueuedURIMetaData>&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;SQ:1&quot; parentID=&quot;SQ:&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;"..list_name.."&lt;/dc:title&gt;&lt;upnp:class&gt;object.container.playlistContainer&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;RINCON_AssociatedZPUDN&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;</EnqueuedURIMetaData>,<DesiredFirstTrackNumberEnqueued>1</DesiredFirstTrackNumberEnqueued>,<EnqueueAsNext>1</EnqueueAsNext>",
      -- callback (options)
    function(response)   
 fibaro:debug("que");
 end);
end

 

 

Lien vers le commentaire
Partager sur d’autres sites

Le 09/03/2017 à 00:46, drboss a dit :

The forum editor when i paste code replace the special character coding by character ex. &lt with <, &quot with " etc.

 I think it's ok for the quote. i search &quot and @lt ;-) in all code

 

I don't understand what happens

 

Look the debug

 

[DEBUG] 19:05:17: Remove
[DEBUG] 19:05:17: que
[DEBUG] 19:05:17: unMute sent
[DEBUG] 19:05:17: Volume set: 40
[DEBUG] 19:05:17: Seek
[DEBUG] 19:05:17: play sent
[DEBUG] 19:05:17: STOPPED
[DEBUG] 19:05:22: STOPPED

Thanks a lot of answering. 

 

I feel i will pay spotify ;-)

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Bon bah moi mon Sonos Connect:AMP vient de me faire un truc super bizarre ce soir..... mon réseau ne fonctionnait plus, que ça soit en Ethernet ou Wifi, une vraie catastrophe, 99% de paquets perdus !

Je vais voir les switchs et je vois que tout clignote de partout... hum pas bon

Je débranche les switchs un par un pour isoler le problème, en partant de la Freebox.

Je fini par isoler le switch qui pose problème. Au début j'ai cru que c'était la HC2 de test branché dessus, mais non ! Je finis donc par débrancher le Sonos, et là tout rentre dans l'ordre. Ensuite je le rebranche, et rebelotte. Alors je reboote le Sonos, et maintenant ça refonctionne.

 

Très étrange, avant de le rebooter j'ai eu le temps de voir qu'il envoyait des broadcast en pagaille sur tout le réseau.

C'était le premier bug que j'ai vu sur Sonos, mais par contre il était particulièrement méchant. Heureusement que ça n'est pas arrivé en mon absence, j'aurais été bien incapable d'aider Madame à distance !

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Je pense que je avais des  la même situation il y a un mois. J'ai perdu beaucoup de temps pour trouver une erreur.Comme je l'ai regardé le journal le problème était dans la table arp. Je ne sais pas pourquoi SONOS parfois mal et stocke l'adresse IP avec  l'ARP. Il enregistrer l'adresse MAC de l'appareil normalement et aussi avec le début de 9a: de: d0.

ex. 

192.168.1.232  b8:e9:37:dd:ab:56 et deziem deuxième 9a: de: d0:dd:ab:56

Je ne l'ai pas eu le temps d'analyser, parce que le réseau entier est bloqué, et a la fin  je suis retourné au réseau indépendant SONOS de mon WiFi.

Lien vers le commentaire
Partager sur d’autres sites

Mon Connect AMP m'a refait le coup hier.

En fait je crois que c'est lié au Play 1 qui est en garage, qui bien que connecté en filaire, n'arrive pas à joindre le Play1 de la chambre, qui lui est en Wifi only.

Bref, c'est  à double tranchant Sonos, les produits sont supers, mais dès qu'on sort de l'usage prévu par le fabricant, on se rend compte des limitations et c'est la cata..... tient, ça me rappelle une marque pommée....:rolleyes:

Lien vers le commentaire
Partager sur d’autres sites

Et tu as une VM Windows pour faire tourner les (nombreux) programmes qui ne tournent pas sur Mac, afin de contourner ses limitations, comme 99% des utilisateurs de Mac que je connais.

Bref, je ne voulais pas relancer l'éternel débat, mais les faits sont là : ces produits (Sonos, Apple, et plein d'autres) sont géniaux, simples à utiliser, ergonomiques, performantes, bref tous les qualificatifs que tu veux, tant que tu restes dans les limitations prévues par le fabricant. Dès que tu en sors, ça devient vite très très compliqué.

 

Mon contournement à moi, ça va finir que mes Sonos vont se retrouver en vente si ils ne sont pas capables de fonctionner dans une maison de taille pourtant modeste, parce qu'ils ont besoin de communiquer en Wifi, tout ensemble, si seulement l'un d'entre eux est en Wifi. C'est un peu aberrant.

Quand je changerai mon appli, normalement cette année, pour un Yamaha, si la fonctionnalité multiroom Musicast me convient, je basculerai tout dessus, car ça semble aussi complet que Sonos, mais avec un choix de matériel très largement plus grand que chez Sonos. Au lieu de 4 ou 5 références, ils ont des dizaines de produits chez Yamaha. (tient, ça me rappelle encore Apple, quand j'avais tenté de basculer sur Mac, au final ce qui m'avait bloqué c'était le choix limité de matériel, je n'avais rien trouvé qui me convenait, moi qui était habitué au choix infini des PC)

Lien vers le commentaire
Partager sur d’autres sites

C'est surtout le fireconnect qui est intéressant pour le multiroom... Yamaha ou pas :) Moi j'avais commencé à tirer du câble audio pour du multiroom filaire depuis l'ampli du salon et finalement je m'aperçois que c'est plus galère qu'autre chose (pas du tout WAF de gérer du multiroom sur un ampli HC).

Lien vers le commentaire
Partager sur d’autres sites

Fireconnect, c'est chez Onkyo ?

Je n'ai pas la même approche : le but n'est pas de gérer le multiroom depuis l'ampli.

Mais puisque je vais basculer sur Yamaha, je vais pouvoir tester leur système Multiroom (appelé Musicast). La gamme d'ampli que je vise gère 2 zones, donc j'aurais déjà de quoi tester un minimum.

Si ça fonctionne bien (et ça a l'air d'après les quelques tests sur Internet, leur techno a bien évolué depuis que ça a été lancé il y a 2 ans), alors je pourrais décider de remplacer mes 3 Sonos par des appareils identiques de chez Yamaha... donc pas des amplis HC.

Mais au final, ça pourrais me faire une solution unifiée, avec 1 seule appli, ce qui est plus sympa que de multiplier les applis.

Et le bonus, c'est que le choix d'appareils chez Yamaha est très largement plus large que chez Sonos (et je ne parle pas des amplis HC, sinon la liste serait presque infinie). En plus, à produit équivalent, Yamaha est moins cher que Sonos (c'est pas difficile, Sonos ce sont les plus chers du marché à ma connaissance, hors produits de luxe)

Lien vers le commentaire
Partager sur d’autres sites

Ah oui, ca pourrait etre sympa ca, tout derrière un seul ampli pour le multiroom.

La seule contraine je trouve, c'est le filaire et la gestion des zones des amplis. Mais me suis jamais penché dessus, juste un questionnement ;-)

Lien vers le commentaire
Partager sur d’autres sites

Ah non, justement, c'est tout l'inverse ce que je dis : le multiroom ne peut pas, et ne doit pas dépendre, QUE de l'ampli.

Il vaut mieux avec des éléments séparés, je ne suis pas fan des gros amplis à 2k€ qui savent gérer 4 zones, parce que problème de câblage dans toute la maison, l'ampli doit être alimenté pour écouter juste un peu de zik dans la SDB, donc ça consomme un max, l'ampli est énorme et ne rentre pas dans la plupart des meubles de salon, etc

Par contre, l'ampli EN PLUS, en complément d'une installation multiroom, et qui s'intègre nativement dedans, là ça commence à être sympa.

De ce coté là, Yamaha est le plus avancé grâce à leur large catalogue, Denon n'est pas en reste avec une gamme qui commence à s'étoffer (les enceintes HEOS), mais Onkyo est largement à la traine (je crois qu'ils ont prévu de sortir des enceintes aussi, donc ils s'y mettent).

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

C'est galère à gérer @pepite le mutiroom sur ampli...enfin pour nous pas vraiment mais pour le WAF c'est pas bon du tout.

Pour le fireconnect il ne me semble pas que ce soit une techno d'Onkyo, c'est de Blackfire je crois et Pioneer et Onkyo ont des enceintes multiroom pour ça. Je sais pas si Yamaha gère les fichiers HD mais c'est le cas pour le fireconnect avec du 24bits/192kHz. Je reconnais que je connais pas bien Yamaha (je suis plutôt Onkyo/Pioneer - méa culpa ;)

Lien vers le commentaire
Partager sur d’autres sites

Yamaha gère les fichiers Hi-Res, mais perso ce n'est pas un critère de choix, je n'ai quasiment que des MP3.

Là où ils étaient en retard, c'était sur les services de streaming, mais ils viennent d'annoncer l'ajout de Deezer et quelques autres, donc maintenant je pense qu'ils sont au même point que Sonos (qui reste la référence)

Le Musicast de Yamaha a d'autres avantages, par ex tu peux re-streamer en Bluetooth un flux qu'un élément est en train de lire, donc en fait ça revient à dire que le Bluetooth est bidirectionnel. Et ça, Sonos ne sais pas le faire (de toute façon Sonos ne fait pas de BLuetooth du tout alors comme ça c'est réglé).

Mais tu peux aussi restreamer n'importe quel flux vers n'importe quel appareil, ça a l'air assez souple.

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...