Aller au contenu

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


Shyrka973

Messages recommandés

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();

Lien vers le commentaire
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.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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.

Lien vers le commentaire
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 !

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...