Aller au contenu
Gazous

Tv Commande Decodeur Livebox Play Et Gestion D'état Temps Réel

Recommended Posts

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.

 

post-1466-0-83551200-1428615033_thumb.jpg

 

Et 4 icônes que je propose pour les 4 états :

 

post-1466-0-68377400-1428613626_thumb.pngpost-1466-0-26874600-1428613627_thumb.pngpost-1466-0-60586300-1428613627_thumb.pngpost-1466-0-93351000-1428613627_thumb.png

 

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 OFFVous 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

  • Upvote 4

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai installé le virtual device et ça ne marche pas.

 

Tu fais référence à  LBox:GET pour les boutons mais nulle part il y a le code de cet appel...

Partager ce message


Lien à poster
Partager sur d’autres sites

As-tu bien renseigné l'adresse IP de ta LiveBox dans les paramètres du composant ?

J'ai oublié de le précisé mais il va de soit que pour que le module fonctionne, il faut réserver une IP pour le décodeur LiveBox. Par défaut, elle est sensée conserver la même mais c'est plus sà»r de la réserver.

Pour cela, il faut se connecter sur l'interface du boitier LiveBox Modem/Routeur, identifier le décodeur qui sera normalement listé dans le "réseau local filaire".

Ensuite il faut aller dans "configuration avancée" -> "DHCP" pour lui réserver une adresse IP. Si l'adresse que tu réserves est différente de celle que le décodeur a actuellement, tu devras le redémarrer pour qu'il renouvelle son bail DHCP.

Une fois que c'est fait, tu renseignes l'adresse IP en question dans les settings du Virtual Device et ça devrait rouler.

 

Il n'y a aucun souci dans le code de mes boutons regardes :

deviceId = fibaro:getSelfId()
LBox = Net.FHttp(tostring(fibaro:get(deviceId, 'IPAddress')), tostring(fibaro:get(deviceId, 'TCPPort')))
LBox:GET("/remoteControl/cmd?operation=01&key=139&mode=0")

LBox est bien défini la ligne au dessus.

Partager ce message


Lien à poster
Partager sur d’autres sites

La livebox a une adresse réservée par dhcp. Oula je n'avais pas bien lu. Voilàce que c'est de faire des choses au saut du lit.

Partager ce message


Lien à poster
Partager sur d’autres sites

Je n'ai pas eu le temps de faire d'autres tests pour l'instant. Ça sera pour lundi.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir,

 

J'ai installé le virtual device.

J'ai réglé les images comme il faut.

J'ai mis l'adresse IP de mon décodeur Livebox Play (le noir c'est çà ?) et pour le port, j'ai laissé 0.

 

Le virtual device reste toujours sur la position "STARTING" et n'en sort jamais.

 

Voilà .

Partager ce message


Lien à poster
Partager sur d’autres sites

OK, en fait le port est 8080 ça devrait aller mieux.

Je pensais qu'il était conservé lors d'un export.

Je vais ajouter l'information dans le post original.

Logiquement si ta LiveBox est allumée, elle va tout de suite passer dans le bon état.

Par contre si elle est en veille au démarrage de ton module il faudra 55s pour qu'elle passe dans l'état "SLEEPING".

Ensuite les mises à  jours seront instantanées tant que tu de modifie pas le VD ou que tu ne reboote pas ta HC2.

Au pire ça prendra 55s. Le jour où Orange corrigera le bug dans l'API (si cela arrive un jour) j'en tiendrais compte et je publierais une version améliorée.

 

Tu n'as peut-être pas de module relais donc penses aussi à  mettre nil partout où tu vois la variable powerSwitchId â€‹(2 boutons + MainLoop)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir,

 

Oui je n'ai pas de module relais, j'ai donc suivi le tuto pour mettre "nil" où il faut.

C'est bon avec le port "8080", ca fonctionne très bien.

 

Merci ! :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Cool, merci àtoi pour le retour, je vais améliorer le Virtual device et le tuto en conséquence pour éviter que d'autres personnes rencontrent le même souci

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup,

 

j'attends un module comme celui là  depuis un moment

Partager ce message


Lien à poster
Partager sur d’autres sites

Content de satisfaire tes attentes  :)

Je viens de publier une v0.2 à  l'instant

Partager ce message


Lien à poster
Partager sur d’autres sites

Avec la 0.2 et le port 8080 ça marche nickel.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Merci pour ton VD il est vraiment très bien :)

 

J'ai une petite question :) j'aimerais en GEA faire une action qui met en sleeping (donc en vérifiant qu'elle n'y est pas déjà ) le décodeur si ta TV est éteinte, est-ce que tu croit que cela est faisable ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci,bien sûr que tu peux mais je ne fais passa avec GEA en ce qui me concerne.

J'ai un Virtual Device qui surveille ma TV et qui lorsqu'elle est éteinte, vérifie si la LiveBox est allumée puis fait un "pressButton" làoù il faut pour passer la LiveBox en veille.

Partager ce message


Lien à poster
Partager sur d’autres sites

bonsoir, 

 

merci pour ton virtual device il est top je voudrais savoir ce que tu entend par module relais, et si tu en as d'autre comme ça je suis preneur car je ne sais pas codé en LUA.

 

Merci encore

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut, par module relais, j'entends un module en amont de ta LiveBox qui te permettrait de lui couper le jus. Une WallPlug, une Multiplies GreenWave ou encore un FGS.

J'ai pas mal de VD en cours de développement ou dans la tête mais je manque de temps.

Je les partagerais bien sûr en temps voulu.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut Gazous,

 

j'ai un problème avec la commande ON. J'ai bien indiqué mon module relais et cela éteint bien qu'en j'appui sur off mais quand je mets sur ON on dirais que le module relais n'est pas bien pris en compte (le relais reste à  OFF)

Partager ce message


Lien à poster
Partager sur d’autres sites

Ha bizarre. Peux tu me coller le code que tu as dans le bouton en question ?

Partager ce message


Lien à poster
Partager sur d’autres sites
Invité

Wouaa, merci beaucoup Gazous, ça me simplifie la vie ton module ! bravo, super boulot :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

De rien et tant mieux si ça fonctionne bien chez toi.

En ce qui me concerne, j'ai pour l'instant expérimenté un blocage de la MainLoop qui est restée bloquée sur l'appel GET à  la long polling API de la LiveBox.

J'ai du éditer et sauvegarder le module pour que ça reparte.

Il y a donc peut-être une faille sur la librairie HTTP ou alors un blocage côté LiveBox, je ne sais pas.

Il faudrait pour éviter cela que je trouves un moyen de pouvoir limiter la durée d'un appel car Net.FHttp n'a pas à  priori de ReadTimeout.

Si quelqu'un observe ce même blocage, merci de me le signaler.

Partager ce message


Lien à poster
Partager sur d’autres sites

Visiblement la commande http://ip:800/remoteControl/cmd?operation=10 qui ne fonctionnait plus depuis le début de l'année semble refonctionner chez moi.

 

On peut donc avoir l'état courant de la livebox (et d'autres infos) et supprimer l'utilisation du long polling en ajoutant d'autres infos.

Gazous tu as une version de ton VD avec cette commande ? Sinon je veux bien m'y coller si tu n'as pas le temps, j'avais fait un VD l'année dernière avec pas mal d'info en + (chaine regardée ...).

 

L'ajout de la touche mute (113) serait bien aussi.

Partager ce message


Lien à poster
Partager sur d’autres sites

×