Shyrka973 Posté(e) le 12 juin 2014 Signaler Posté(e) le 12 juin 2014 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();
oufman Posté(e) le 12 juin 2014 Signaler Posté(e) le 12 juin 2014 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.
Shyrka973 Posté(e) le 13 juin 2014 Auteur Signaler Posté(e) le 13 juin 2014 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.
oufman Posté(e) le 13 juin 2014 Signaler Posté(e) le 13 juin 2014 Hello, merci beaucoup, je vais tester Enfin une solution squeezbox pour la fonction alarme Merci, bonne journée.
razowski Posté(e) le 25 juin 2014 Signaler Posté(e) le 25 juin 2014 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 ?
Shyrka973 Posté(e) le 25 juin 2014 Auteur Signaler Posté(e) le 25 juin 2014 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.
razowski Posté(e) le 25 juin 2014 Signaler Posté(e) le 25 juin 2014 Je vais regarder ce post de prêt, top comme il y a tout razowski
JossAlf Posté(e) le 25 juin 2014 Signaler Posté(e) le 25 juin 2014 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 !
Shyrka973 Posté(e) le 25 juin 2014 Auteur Signaler Posté(e) le 25 juin 2014 Merci. Je n'y avais pas pensé. Ce "Main Loop" ne peut pas planter
razowski Posté(e) le 25 juin 2014 Signaler Posté(e) le 25 juin 2014 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.
Messages recommandés