Gazous Posté(e) le 9 avril 2015 Signaler Posté(e) le 9 avril 2015 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 4
nasp Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 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...
Gazous Posté(e) le 10 avril 2015 Auteur Signaler Posté(e) le 10 avril 2015 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.
nasp Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 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.
nasp Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Je n'ai pas eu le temps de faire d'autres tests pour l'instant. Ça sera pour lundi.
Gazous Posté(e) le 10 avril 2015 Auteur Signaler Posté(e) le 10 avril 2015 OK tiens moi au courant. Bon WE.
Kana-chan Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 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à .
Gazous Posté(e) le 10 avril 2015 Auteur Signaler Posté(e) le 10 avril 2015 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)
Kana-chan Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 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 !
Gazous Posté(e) le 10 avril 2015 Auteur Signaler Posté(e) le 10 avril 2015 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
erdremy Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Merci beaucoup, j'attends un module comme celui là depuis un moment
Gazous Posté(e) le 10 avril 2015 Auteur Signaler Posté(e) le 10 avril 2015 Content de satisfaire tes attentes Je viens de publier une v0.2 à l'instant
nasp Posté(e) le 11 avril 2015 Signaler Posté(e) le 11 avril 2015 Avec la 0.2 et le port 8080 ça marche nickel.
Nicolas P Posté(e) le 13 avril 2015 Signaler Posté(e) le 13 avril 2015 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 ?
Gazous Posté(e) le 13 avril 2015 Auteur Signaler Posté(e) le 13 avril 2015 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.
bateaujfp Posté(e) le 14 avril 2015 Signaler Posté(e) le 14 avril 2015 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
Gazous Posté(e) le 15 avril 2015 Auteur Signaler Posté(e) le 15 avril 2015 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.
erdremy Posté(e) le 16 avril 2015 Signaler Posté(e) le 16 avril 2015 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)
Gazous Posté(e) le 16 avril 2015 Auteur Signaler Posté(e) le 16 avril 2015 Ha bizarre. Peux tu me coller le code que tu as dans le bouton en question ?
Invité Posté(e) le 21 avril 2015 Signaler Posté(e) le 21 avril 2015 Wouaa, merci beaucoup Gazous, ça me simplifie la vie ton module ! bravo, super boulot :-)
Gazous Posté(e) le 21 avril 2015 Auteur Signaler Posté(e) le 21 avril 2015 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.
YopYopYop Posté(e) le 12 septembre 2015 Signaler Posté(e) le 12 septembre 2015 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.
Messages recommandés