Aller au contenu
Shyrka973

Squeezebox: Récupérer Son État Dans Un Main Loop

Recommended Posts

Bonjour à  tous,


 


J'ai créé un module virtuel pour accéder à  mon squeezebox. Je n'ai pas réinventé la roue. Je me suis basé sur le travail déjà  fait par d'autres.


Dans mon cas, j'ai juste besoin de quelques boutons: On, Off, Volume et TTS car j'utilise le squeezebox uniquement pour m'alerter d'événements. Je ne gère pas la musique à  travers ce module virtuel.


 


Je vous propose un "Main Loop" qui récupère toutes les minutes l'état du squeezebox (On ou Off) en mettant à  jour l'icône du module virtuel et aussi le niveau du volume pour ajuster le slider correspondant.


 


Ainsi, si vous touchez au volume du squeezebox à  partir d'une application ("iPeng" par exemple), le slider du module virtuel se mettra à  jour. Si vous allumez ou éteignez le squeezebox à  partir d'une application, l'icône du module virtuel se mettra à  jour.


 


Voici donc ce code qu'il faudra adapter à  votre module virtuel squeezebox.



-- the LMS serverlocal ipadd = fibaro:get(fibaro:getSelfId(), "IPAddress")
-- the cli plugin port
local portno = fibaro:get(fibaro:getSelfId(), "TCPPort")
-- the MAC of the player
local player = "00:04:20:xx:xx:xx "
local playername = "Squeezebox Radio "


local refresh = 60
local SliderVolumeID = 1
local poweronIcon = 1000
local poweroffIcon = 1002


-- Main object
if (not Check) then
  Check = {}
-- System variables
  Check.debug = false
-- Main code
  Check.get = function(cmnd)
  -- construct the sting to send
    local stringtosend = player .. cmnd .. string.char(10)
--open the socket
local tcpSocket = Net.FTcpSocket(ipadd, portno)
--set the read timeout
tcpSocket:setReadTimeout(2*1000)
--send the command
local bytes, errorCode = tcpSocket:write(stringtosend)
-- Transforme "result" en chaine de caractere
return tcpSocket:read() or string.char()
  end
  
Check.main = function(self)
  local data = Check.get("mixer volume ? ")
    -- Recupere le volume...
local cmd = data:match("mixer volume %d+")
local cmd_value = cmd:match("%d+") or "NaN"
    if (Check.debug) then fibaro:debug("Volume: " .. cmd_value) end
    -- On ajuste le slider au volume
    if (cmd_value ~= "NaN") then
    if (fibaro:getValue(fibaro:getSelfId(), "ui.SliderVolume.value") ~= cmd_value) then
      fibaro:call(fibaro:getSelfId(), "setSlider", SliderVolumeID, cmd_value)
      end
    end
    local data = Check.get("power ? ")
    -- On ou Off
local cmd = data:match("power %d")
local cmd_value = cmd:match("%d") or "NaN"
    if (Check.debug) then fibaro:debug("Power: " .. cmd_value) end
    if (cmd_value ~= "NaN") then
  local currentIcon = fibaro:getValue(fibaro:getSelfId(), "currentIcon")
if (cmd_value == "1") then
      -- Power On
if tonumber(currentIcon) ~= poweronIcon then
if (Check.debug) then fibaro:debug(playername .. "is power on") end
fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", poweronIcon)
end
else
      -- Power Off
if tonumber(currentIcon) ~= poweroffIcon then
if (Check.debug) then fibaro:debug(playername .. "is power off") end
fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", poweroffIcon)
end
end
    end
    -- Wait
fibaro:sleep(refresh*1000)
  end
fibaro:debug("Function successfully loaded in memory")
end

-- Start
Check.debug = true
Check:main();

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello, sympa ton tuto.

 

Est dans la même optique, tu sais si c'est possible de récupérer l'heure de l'alarme programmée ?

 

Merci d'avance.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

 

Voici le code pour récupérer l'heure de l'alarme 0:

     local data = Check.get("alarms 0 ")
     local cmd = data:match("time%%3A%d+")
     local cmd = cmd:sub(8)
     local cmd_value = cmd:match("%d+") or "NaN"
     local heure = math.floor(cmd_value / 3600)
     local min = math.mod(cmd_value, 3600) / 60
     fibaro:debug("Alarm: " .. heure .. ":" .. min)

Ce bout de code est à  insérer dans le code du premier post.

 

Dis-moi si ça te va.

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello, merci beaucoup, je vais tester :)

 

Enfin une solution squeezbox pour la fonction alarme :)

 

Merci, bonne journée.

Partager ce message


Lien à poster
Partager sur d’autres sites

Est-ce que c'est possible de récupérer les informations sur le morceau en cours de lecture? Genre Artiste - Titre et album par exemple ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, c'est possible sur le même principe.

 

J'ai créé un module virtuel pour Squeezebox Radio uniquement pour sa fonction TTS que j'utilise pour l'alarme.

J'ai donc juste quelques fonctions: On/Off, volume et TTS.

J'ai fait ensuite des modifications pour tester le concept de retour d'info: récupérer l'état On/Off, volume, ...

 

Mais c'est toujours le même problème avec le Main Loop des modules virtuels: ce n'est pas très stable. En moins de 24h, il plante à  cause du "FTcpSocket", je suppose.

 

L'idéal serait de passer par une scène qui met à  jour un module virtuel. Et cette scène serait lancée au changement d'état d'une variable globale.

Cette variable serait mise à  jour par un plugin installé sur le serveur SqueezeBox. Ainsi, il n'aurait pas de plantage et la mise à  jours des infos serait instantanée.

 

Ce post sur le forum de Fibaro semble proposer quelque chose qui s'y rapproche.

 

Je vais tester cette solution cette semaine. Il remplacera peut être mon module virtuel SqueezeBox en lui ajoutant la fonction TTS s'il n'y est pas.

Partager ce message


Lien à poster
Partager sur d’autres sites

Je vais regarder ce post de prêt, top comme il y a tout

razowski

Partager ce message


Lien à poster
Partager sur d’autres sites
 

J'ai résolu le problème du main look comme ça en mettant tout dans le module virtuel.

J'ai créé un bouton mà j que je n'utiliserai jamais manuellement mais qui est appelé toutes les 30 secondes par la main look du module virtuel lui-même :

Main loop du module virtuel 114 (la squeeze de mon salon) :

fibaro:call(114, "pressButton", "13");
fibaro:sleep(60*1000)

et ton code légèrement modifié que j'ai collé dans le bouton mà j (ID 13) :

-- the LMS serverlocal ipadd = fibaro:get(fibaro:getSelfId(), "IPAddress")
local ipadd = "192.168.0.46"
-- the cli plugin port
local portno = 9090
-- the MAC of the player
local player = "00:04:xx:xx:xx "
local playername = "Squeezebox Radio "
 
local SliderVolumeID = 3
local poweronIcon = 1037
local poweroffIcon = 1032
 
 
-- Main object
if (not Check) then
  Check = {}
  -- System variables
  Check.debug = false
  -- Main code
  Check.get = function(cmnd)
    -- construct the sting to send
    local stringtosend = player .. cmnd .. string.char(10)
    --open the socket
    local tcpSocket = Net.FTcpSocket(ipadd, portno)
    --set the read timeout
    tcpSocket:setReadTimeout(2*1000)
    --send the command
    local bytes, errorCode = tcpSocket:write(stringtosend)
    -- Transforme "result" en chaine de caractere
    return tcpSocket:read() or string.char()
  end
  
  Check.main = function(self)
    local data = Check.get("mixer volume ? ")
    -- Recupere le volume...
    local cmd = data:match("mixer volume %d+")
    local cmd_value = cmd:match("%d+") or "NaN"
    if (Check.debug) then fibaro:debug("Volume: " .. cmd_value) end
    -- On ajuste le slider au volume
    if (cmd_value ~= "NaN") then
      if (fibaro:getValue(fibaro:getSelfId(), "ui.SliderVolume.value") ~= cmd_value) then
        fibaro:call(fibaro:getSelfId(), "setSlider", SliderVolumeID, cmd_value)
      end
    end
    local data = Check.get("power ? ")
    -- On ou Off
    local cmd = data:match("power %d")
    local cmd_value = cmd:match("%d") or "NaN"
    if (Check.debug) then fibaro:debug("Power: " .. cmd_value) end
    if (cmd_value ~= "NaN") then
      local currentIcon = fibaro:getValue(fibaro:getSelfId(), "currentIcon")
      if (cmd_value == "1") then
        -- Power On
        if tonumber(currentIcon) ~= poweronIcon then
          if (Check.debug) then fibaro:debug(playername .. "is power on") end
          fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", poweronIcon)
        end
      else
        -- Power Off
        if tonumber(currentIcon) ~= poweroffIcon then
          if (Check.debug) then fibaro:debug(playername .. "is power off") end
          fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", poweroffIcon)
        end
      end
    end
  end
end
 
-- Start
Check.debug = false
Check:main();

Et plus de problème de main loop qui plante !

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci.

 

Je n'y avais pas pensé. :13:

 

Ce "Main Loop" ne peut pas planter :60:

Partager ce message


Lien à poster
Partager sur d’autres sites

Par-contre pas trop capté la mise en place du plugin de synchro pour le HC2 depuis le LMS, j'arrive déjàpas àinstaller le plugin sur mon Synology... C'est mal parti.

Partager ce message


Lien à poster
Partager sur d’autres sites

×