Bonsoir,   Je vous propose un petit module virtuel que j'ai développé hier soir pour bien gérer le décodeur Orange LiveBox Play. J'ai en ce qui me concerne développé ce module pour pas mal de raisons dont voici les principales :      1) Pouvoir piloter la LiveBox bien sà»r      2) Gérer son état (ON, OFF, SLEEPING, STARTING) en temps réel      3) Trouver une solution de contournement à  son absence de HDMI CEC, très ennuyeux      4) Pouvoir la couper durant l'absence prolongée, la nuit et surtout la redémarrer proprement chaque jour au bon moment et ainsi éviter de devoir la rebooter manuellement lorsqu'on en a vraiment besoin      5) Faire des économies car même en veille elle consomme quand même 17W à  moins d'activer la veille profonde qui désactive les enregistrements programmés.   Voici donc le code du module virtuel.     Et 4 icônes que je propose pour les 4 états :     Une fois le module importé, il faudra renseigner l'adresse IP de votre décodeur LiveBox (réservation DHCP recommandée) ainsi que le port qui est 8080.   A noter : une des partie chiante de ce développement est liée à  un bug de la version actuelle de l'API JSON de la LiveBox qui retourne une erreur lorsque l'ont souhaite récupérer son état courant. Or j'en ai besoin pour initialiser mon Virtual Device... La solution de contournement que j'ai trouvé repose sur l'utilisation de la Long Polling API qui permet d'être notifié d'un changement de contexte sur la LiveBox. Ainsi au démarrage de la MainLoop, afin de connaître l'état courant de la bête :       1) Je simule un appui sur un bouton (le dernier du Virtual Device) qui va simplement me permettre de faire un appel asynchrone temporisé simulant un appui sur Menu puis CH+       2) Je lance immédiatement un appel de cette fameuse Long Polling API (notifyEvent) qui est bloquante 55s si rien ne se passe ou répond instantanément si un événement survient       3) Je peux ainsi initialiser mon état et être notifié des futurs changements en appellant en permanence la méthode notifyEvent qui au pire partira en timeOut au bout de 55s   Pour ne rater aucun événement, je suis obligé de faire un while true dans la MainLoop sinon je prend le risque de perdre un événement qui pourrait survenir durant les 3s de sleep de celle-ci...   Je teste ce module depuis hier et tout fonctionne très bien, c'est hyper réactif, vous pouvez faire des essais avec la télécommande physique de la LiveBox ou tout autre moyen de pilotage. Je suis même étonné de ne pas rencontrer de souci.   Si vous n'avez pas de module relais en amont de l'alimentation de votre LiveBox, mettez simplement nil comme valeur pour la variable powerSwitchId (MainLoop, button âŽ‹ ON/VEILLE et button âŽ‹ POWER OFF. Vous n'aurez pas de gestion de l'état OFF mais ne supprimez pas le bouton  âŽ‹ POWER OFF car cela décalera les ID des boutons. Si vous souhaitez le faire il faudra aller modifier en conséquence du dernier bouton de la MainLoop ligne 54 (32->31) -- Si je ne connais pas l'état, je déclenche un appui temporisé sur le bouton menu if (lbCurrentStatus == "NA") then fibaro:call(deviceId, "pressButton", 32) end Pensez également à  mettre à  jour les ID de vos icônes dans la fonction updateLiveBoxIcon() ​Il est fort probable qu'il y ait quelques bugs que je n'ai pas encore vus donc n'hésitez pas à  me les signaler.  Aussi, je viendrais mettre à  jour le Device si j'apporte des améliorations.   Voici enfin le code complet de la MainLoop ------------------------------------------------------ -- TV Commande v0.2 -- ------------------------------------------------------ -- Auteur : Brice Cassagnabère -- ------------------------------------------------------ -- Changelog : -- -- v0.2 : Ajout d'un test port et IP au démarrage -- -- Amélioration du code -- -- v0.1 : Version initiale -- ------------------------------------------------------ -- Plus d'infos : http://is.gd/RcK1xZ -- ------------------------------------------------------ -- Variables globales de la MainLoop lbCurrentStatus = "NA" lbNewStatus = "NA" -- ID du module relais de l'alimentation (FGS, WallPLug, Greenwave...) nil si pas présent powerSwitchId = 235 deviceId = fibaro:getSelfId() -- Functions utiles function debug(text, color) color = color or "white" fibaro:debug("<font color='"..color.."'>"..text.."</font>") end function updateLiveBoxUIStatus() if (lbCurrentStatus == lbNewStatus) then return end lbCurrentStatus = lbNewStatus fibaro:log("Status : "..lbCurrentStatus) debug("LiveBox status : "..lbCurrentStatus, "green") fibaro:call(deviceId, "setProperty", "ui.labelStatus.value", lbCurrentStatus) end function updateLiveBoxIcon() if lbCurrentStatus == "ON" then iconId = 1035 elseif lbCurrentStatus == "SLEEPING" then iconId = 1033 elseif lbCurrentStatus == "OFF" then iconId = 1034 elseif lbCurrentStatus == "STARTING" then iconId = 1032 end fibaro:call(deviceId, "setProperty", "currentIcon", iconId) end function liveBoxEventPolling() if (tonumber(powerSwitchId ~= nil and fibaro:getValue(powerSwitchId, 'value')) == 0) then lbNewStatus = "OFF" debug("LiveBox à  l'arrêt complet", "red") else -- Detection de l'état de la livebox debug("En attente d'événement de la LiveBox...") LBox = Net.FHttp(tostring(fibaro:get(deviceId, 'IPAddress')), tostring(fibaro:get(deviceId, 'TCPPort'))) -- Si je ne connais pas l'état, je déclenche un appui temporisé sur le bouton menu if (lbCurrentStatus == "NA") then fibaro:call(deviceId, "pressButton", 32) end -- Je lance une commande long polling response = LBox:GET("/remoteControl/notifyEvent") -- Un événement est survenu, je traite l'événement if (response ~= nil and response ~= "") then debug(response, "yellow") jsonResponse = json.decode(response) if jsonResponse.result.message == "request timeout" then if lbCurrentStatus == "NA" then lbNewStatus = "SLEEPING" else debug("Pas d'événement durant 55s, LiveBox toujours en état : "..lbCurrentStatus, "orange") end elseif jsonResponse.result.message == "event notification" then if jsonResponse.result.data.eventType == "OSD_CONTEXT_CHANGED" then debug(jsonResponse.result.data.service, "orange") -- Dans ce cas, la LiveBox est allumée donc je peux mettre à  jour son statut if (jsonResponse.result.data.service == "HOMEPAGE") then lbNewStatus = "ON" elseif (jsonResponse.result.data.service == "MAIN_PROCESS") then lbNewStatus = "SLEEPING" end elseif jsonResponse.result.data.eventType == "MEDIA_STATE_CHANGED" then lbNewStatus = "ON" debug("ZAPPING", "orange") fibaro:log("ZAPPING") end end elseif lbCurrentStatus == "OFF" or lbCurrentStatus == "NA" then lbNewStatus = "STARTING" end end end local error = false if (fibaro:get(deviceId, 'IPAddress') == "") then debug("Vous devez renseigner l'Adresse IP du décodeur dans le champs dédié du Virtual Device", "red") debug("Vous pouvez retrouver cette adresse dans l'interface d'administration de la LiveBox") debug("Il est recommandé de faire une réservation DHCP pour être sà»r que l'IP ne change jamais") error = true end if (fibaro:get(deviceId, 'TCPPort') == "0") then debug("Vous devez renseigner le Port dans le champs dédié du Virtual Device", "red") debug("Le port par défaut est 8080 sur le décodeur LiveBox Play (noir)") error = true end if (error) then return end while true do pcall(liveBoxEventPolling) pcall(updateLiveBoxUIStatus) pcall(updateLiveBoxIcon) if (lbCurrentStatus == "OFF" or lbCurrentStatus == "STARTING") then fibaro:sleep(5000) end end J'espère que cela vous sera utile ! TV_Commande v0.2.vfib