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