Aller au contenu

Ofwood

Membres confirmés
  • Compteur de contenus

    20
  • Inscription

  • Dernière visite

Messages posté(e)s par Ofwood


  1. @cyssou, merci pour ton retour. Tu as raison 'intérogation" ça pique un peu les yeux!  :P


     


    au moins ta livebox renvoie une IP publique. C'est déjà  un bon début et ne devrait pas présenter de difficultés pour adapter le VD à  la fibre


    Par contre il va falloir creuser un peu pour trouver la fonction ou les paramètres pour taper dans les info MIBs.


    n'ayant pas de livebox fibre sous la main (c'est bien dommage) Il va falloir que tu m'aides et que tu me dises ce que tu vois quand tu manages ta livebox au travers de son interface web. On va jouer avec les dev tools de ton navigateur internet.


    tu utilises  firefox, internet Explorer, chrome ou safari?


     


    en gros il va falloir se connecter à  la livebox, aller dans l’onglet Assistance > Information Systeme et regarder le contenu des échanges pour les tab pages "general" et "dsl" (ou son équivalent avec la fibre). Les dev tools des navigateurs s'activent avec la touche F12


    Rechercher dans la liste les appels API et la réponse de la livebox. 


    Par exemple, pour les stats de connexion adsl, c'est  l'appel API  /sysbus/NeMo/intf/data:getMIBs. Voici une capture d'écran faite sous Google Chrome:


     


    gallery_2306_192_355.png


     


    J'aurais besoin du contenu de la page Headers et de la page Response pour adapter le VD. 


    merci


  2. @MrGoose, je ne crois pas qu'il soit possible d'effacer l'icone d'origine pour les VD (le  carré 3D bleu). 

    Le code du VD se charge de  changer la miniature en fonction du retour de l'état Livebox, il faut juste que tu ajustes les variables icon_ok, icon_nok et icon_unknown avec les IDs de tes icones

    En revanche, lorsque tu cliques sur un bouton dans un VD,  l'icone carré bleu 3D apparait par défaut. Pour éviter ça, il faut que tu affectes aussi une icone pour chacun des boutons car ce n'est pas géré par le code de mon VD.

    Perso j'ai mis la miniature correspondant à  l'état 'unknown' sur tous les boutons, comme ça quand je cliques, la miniature passe en 'grisé' le temps de l'execution de la commande.


  3. regardes aussi le tuto de Steven sur la gestion du chauffage avec des sondes oregon, netatmo...

    http://www.domotique-fibaro.fr/index.php/topic/841-gestion-chauffage-avec-sondes-oregon-netatmo-json-etc/?view=findpost&p=11865&hl=%2Bsteven+%2Bpellet

     

    son module virtuel utilise les données json du panneau de chauffage fibaro. Ca te fait déjà  la moitié du boulot si j'ai bien compris ce que tu cherches à  faire.


  4. PITP2, json.decode() retourne une table. Tu ne peux pas passer une table comme ça telle quelle à  une fonction qui s'attend à  une chaîne de char comme fibaro:debug().

    il va falloir que tu navigues dans la table en utilisant des index ou bien avec des boucles récursives.

     

    voici un petit exemple qui reprend ton code et  'dump' le contenu de la table json. Peut toujours servir pour du debuguer du code

    
    function table.val_to_str ( v )
      if "string" == type( v ) then
        v = string.gsub( v, "\n", "\\n" )
        if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then
          return "'" .. v .. "'"
        end
        return '"' .. string.gsub(v,'"', '\\"' ) .. '"'
      else
        return "table" == type( v ) and table.tostring( v ) or
          tostring( v )
      end
    end
    
    function table.key_to_str ( k )
      if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
        return k
      else
        return "[" .. table.val_to_str( k ) .. "]"
      end
    end
    
    function table.tostring( tbl )
      local result, done = {}, {}
      for k, v in ipairs( tbl ) do
        table.insert( result, table.val_to_str( v ) )
        done[ k ] = true
      end
      for k, v in pairs( tbl ) do
        if not done[ k ] then
          table.insert( result,
            table.key_to_str( k ) .. "=" .. table.val_to_str( v ) )
        end
      end
      return "{" .. table.concat( result, "," ) .. "}"
    end
    
    -- 
    HC2 = Net.FHttp("192.168.0.6",80)
    HC2:setBasicAuthentication("admin", "admin")
    
    
    response, status, errorcode = HC2:GET("/api/panels/heating/402")
    monTableau = json.decode(response)
    fibaro:debug(table.tostring(monTableau))
    
    

  5. il doit y avoir un moyen plus académique mais un truc tout simple que j'utilise :

     

    - Télécharger les icones (avec le boutton change icon) sur la page de config du VD

    - quand tes icones sont visibles dans la liste:

      MS IE: click-droit sur l'icone> Propriété. regarde à  la ligne (URL). tu devrais voir un truc dans le genre: http://192.168.1.21/fibaro/n_vicons/User1011.png

      Google Chrome: click-droit sur l'icone> inspecter element : l'url de l'icon devrait être surlignée. un truc genre: <img class="ChooseIcon" src="/fibaro/n_vicons/User1011.png">

     

      il est facile d'en déduire l'id. Dans mon example il s'agit de l'iD 1011.


  6. Bonjour

     

    Pour mon premier tuto, je vous propose un Module Virtuel pour interfacer la Livebox d'Orange et je vais vous détailler la mise en Å“uvre de l'intégration avec la HC2.
    Le module rassemble les informations importantes sur l'état des interfaces, le débit, les statistiques et les différents compteurs d'erreurs. Il permet aussi d'exécuter des commandes simples comme l'activation du Wifi ou le redémarrage de la Livebox.
     
    gallery_2306_192_5544.png
     
    gallery_2306_192_12243.png
     
     
    Prérequis
    1. Une Livebox 2 (Sagem) DSL note: pas pu tester la fibre. J'aimerais bien mais dans moin coin c'est pas avant 2022  ;)  ).
    2. Une HC2 (code lua testé avec v3.600 et v4.031)
     
    Installation
    • Télécharger et ajouter le VD (lien en bas de post)
    • Sur la page de configuration du module, saisir l'adresse ip et le port (80) de la Livebox
    • Ensuite, il faut paramtètrer le VD, editez le code en debut de page (pour chaque bouttons):
      -- Nom d'utilisateur et mot de passe de la livebox
      local USER ="admin"
      local PASSWORD = "admin"
      
    • Le VD retourne trois états possibles: Inconnu, OK et Not OK. Editez les variables pour adapter l'ID des icones:
      -- ID des icônes
      icon_ok = 1004
      icon_nok = 1005
      icon_unknown = 1006
      
    • Par défault, l'execution du module toutes les 5 minutes est confié à  la mainloop du VD qui simule un appui sur le bouton Rafraichir. Simple, mais pour plus de fléxibilité et surtout de plus stabilté je recommande d'utiliser l'excellent GEA avec la ligne ci-dessous (à  adapter). Dans ce cas, noubliez pas de supprimer le code dans le mainloop du VD.
      -- Mise à  jour état connexion Internet
      GEA.add(true , 5*60, "",{{"VirtualDevice", id["VD_LIVEBOX"], "1"},{"VirtualDevice", id["VD_LIVEBOX"], "7"},{"Repeat"}})
      
    • Le VD n'utilise pas de Variable Globale car je n'ai pas de scénario qui necessite un retour sur l'état de la connexion internet mais c'est juste une ligne de code à  ajouter:
      fibaro:setGlobal('test', Livebox.WANStatus.LinkState)
      

     

     

     

    Comment ca marche ?

    c'est la section pour les geeks. Je partage ici le resultat de mes bidouilles (et saut d'humeur) à  propos de l'API Livebox

     

    Fonctionnement de l'API Orange/Sagem:

    En regardant d'un peu plus près les paquets échangés dans une session d'admin avec la livebox on peut voir des réponses de POST en json . à‡a commence plutôt pas mal, la livebox a donc une API !  

    Comme souvent avec Orange, ça commence bien, c'est après que les choses se gâtent !  :rolleyes:

    Impossible de mettre la main sur une doc publique de l'API. En fouillant un peu sur les forums d'Orange j'ai trouvé quelques pistes mais mes vrais amis ont été Wireshark et les dev tools InternetExplorer ou Chrome (F12) pour comprendre un peu comment l'appli mobile d'Orange (version IOS) utilisait l'API…
     
    En inspectant le déroulé d'un login, je manque de m'étrangler en constatant que le nom d'utilisateur et le mot de passe sont balancés en clair; ben voyons les gars faut pas se gêner hein…
    la requête login retourne un "ContextID" qui est utilisé comme identifiant pour les appels aux fonctions de l'API (X-Context dans les headers).
    Donc au menu nous avons des custom headers et une authentification super basique, fastoche! où est le problème? Bah ça marche pô! - > "permission denied" le voilà  le problème  :angry:
     
    Bah surement qu'ils ont été pris de remords chez Orange avec cette authentification de mickey avec password en clair et histoire de faire bonne figure (et pas se faire défoncer tous les mercredi par des pré-ados qui voudraient passer outre le contrôle parental) ils ont semble-t-il cherché à  compliquer un peu les choses… mais en faisant du gros n'importe quoi! Pour aller à  l'enssentiel, en plus d'un ContextID, le Login renvoie une autre clé mais planquée dans un cookie cette fois. La sécurité n'y a pas gagné grand chose mais en revanche c'est une vraie prise de tête à  intégrer sur la hc2. Hmm.. Net.FHttp avec des custom headers et un cookie, ça va pas le faire…
     
    Pour contourner le problème et récupérer le cookie, je me suis servi du génialissime ToolKit v1.0.4 de Krikroff. :60:
    Une toute petite modif de 4 lignes dans httpClient:request et nous voila prêts à  nous goinfrer de cookies.
     
    J'ai modifié (à  l'arrache, sorry Krikroff) la fonction request(...) dans le fichier Toolkit.net.lua (commence ligne 165).
    on cherche la chaine "cookie" dans les response headers renvoyés par le serveur et le cas échéant on extrait avec un string.sub() en partant du douzième char. la fonction retourne le cookie en plus des classiques response, status et err.
    request = (function(self, method, uri, headers, body)
    ...
    for k, v in pairs(__headers) do
    	--Toolkit.Net.__trace("raw #"..k..":"..v)
    	if (string.find(string.lower( v or ""), "chunked")) then
    	  self.__isChunked = true;
    	  Toolkit.Net.__trace("%s.%s::receive > Transfer-Encoding: chunked", 
    		Toolkit.Net.__header, Toolkit.Net.__Http.__header, string.len(result));
       
    	-- Modification pour récupérer le cookie. Ofwood Janvier 2015	
    	elseif (string.find(string.lower( v or ""), "cookie")) then				
    	cookie = string.sub(v, 12)
    	   Toolkit.Net.__trace("%s.%s::receive > Cookie: %s", 
    	Toolkit.Net.__header, Toolkit.Net.__Http.__header, cookie);                
    	end
    end
    ...
    -- return budy response & cookie
     return response, status, err, cookie;
    
    Voyons maintenant avec un exemple comment tirer profit de cette modification et mangeons des cookies!
     
    La fonction login() authentifie l'utilisateur et retourne le contextID (dans la réponse json) et le cookie associé.
    function login()
    	local httpClient = Toolkit.Net.HttpRequest(ip, port)
    	httpClient:setReadTimeout(Livebox.commandTimeOut)
    	
    	local uri = string.format("/authenticate?username=%s&password=%s", utilisateur, mot_de_passe)	
    	local response, status, errorCode, cookie = httpClient:request("POST", uri, 
    		{"User-Agent: FibaroHC2/1.0", "Content-Type: application/json"}, "" )
    		
    	if (errorCode == 0) and tonumber(status) == 200  then
    		 local jsonTable = json.decode(response);
    		 ContextID = jsonTable.data.contextID;
    		return ContextID, cookie
    	end
    end
    

    l'exemple suivant utilise le contextID et notre cookie pour une requête (l'état de l'interface WAN sur la LiveBox)

    function getWANStatus(contextID, cookie)
    	local httpClient = Toolkit.Net.HttpRequest(ip, port)
    	httpClient:setReadTimeout(Livebox.commandTimeOut)
    	
    	local uri = "/sysbus/NMC:getWANStatus"  
    	local params = [[
    		{"parameters":{}} 
    	]];
    
    	-- Injection de X-Context et du Cookie dans les headers	
    	local response, status, errorCode, cookie = httpClient:request("POST", uri, 
    	{"User-Agent: FibaroHC2/1.0",  	
    	  "Content-Type: application/json",
    	  "X-Context: "..contextID,
    	  "Cookie: "..cookie },
    	 params);   
    	
    	if (errorCode == 0) and (status == 200) then
    		local jsonTable = json.decode(response)		
    		Return jsonTable.result.data
    	end
    end
    
     
    Voici la liste des fonctions implémentées dans la version 1.0 du module. Il en existe d'autres, je n'ai pas encore tout recensé.

     

    Livebox.login()              Authentification session utilisateur
    Livebox.logout()             Fermeture session
    Livebox.listTrunks()         Information téléphonie IP
    Livebox.getIPTVStatus()      Etat IP TV
    Livebox.getDSLStats()        Stats DSL (Erreurs)
    Livebox.getMIBs()            Information lien dsl
    Livebox.getWifiMIBs()        Information Wifi
    Livebox.getWANStatus()       Etat de la connexion WAN
    Livebox.reboot()             Redémarrage la livebox
    Livebox.setwifi(mode)        Active/désactive le Wifi
    Livebox.filtreMAC(flag)      Active/Désactive filtrage MAC address
    Livebox.getWificomStatus()   Information Wifi public Orange

     

     

    Voilà , ça donne l'idée générale et Orange n'ayant pas le monopole sur les APIs bien pourries,  je me suis dit que ça pourrait peut-être en aider d'autres qui se prennent la tête sur des intégrations nécessitant le support des cookies.
     
    Enjoy!
    merci pour vos retours (et votre indulgence)
     
     
    Historique
    13/01/2015 - v1.0 : version initiale

    Livebox_VD.zip

    • Like 1
    • Upvote 13

  7. histoire de mettre du baume au coeur à  ceux d'entre nous qui desespèrent devant le 0%; waooohoo chez moi ça vient enfin de passer.

    2 heures à  0% et de 1 a 100% en moins de deux minutes. en tout cas c'est sur, ils ont embauchés les gars de Microsoft qui avait codé les progress bars de Windows 95.... ou bien je suis tombé dans une faille spacio temporelle :3:


  8. Idem - pas moyen de la faire marcher tant que j'étais en v4024. Elle était aussi reconnue comme un switch mais impossible de la faire sonner ou d'activer le switch.  Aujourd'hui je suis descendu en v3.6 et ca à  l'air de mieux marcher.

    du coup je me suis acharné un peu et suis tombé sur la data sheet. Il n'y avait plus qu'à  bricoler une mini template ...

     

    Pour changer le type de sonnerie et son volume:

    edit du module puis Ajouter un paramètre

     

    gallery_2306_192_1319.png

     

    Par defaut je pense que le volume est réglé sur 88db. Le paramètre 37 est un double word et permet de gerer à  la fois le type de sonnerie et le volume. les valeurs (dec) possibles sont (volume à  88db / 100db / 105db)

    • Sonnerie 1:    257 / 258 / 259 
    • Sonnerie 2:    513 / 514 / 515
    • Sonnerie 3:    769 / 770 / 771 
    • Sonnerie 4:  1025 / 1026 / 1027
    • Sonnerie 5:  1281 / 1282 / 1283

     

    je n'ai pas joué avec les autres param.gallery_2306_192_157842.png


  9. Salut a tous,

     

     

    Je me prénomme Christophe, j'ai la quarantaine passée et réside dans les environs de Nice

     

    Après des années de galère domotique, de bricolage en bidouille (X10 principalement) pour arriver à  un machin bancale;  j'ai jeté l'éponge il y a quelque années (2005)... Fini la domotique j'avais dit !

    bref les années passent et puis un jour je tombe sur vous, enfin sur le forum. Je commence à  lire et voila que le démon domotique se réveille en moi. Il serait donc possible de faire de la domotique fun et qui marche ?! des exemples à  foison, une communauté solide bref tout ce qui m'avait manqué une décennie auparavant. Pouvait pas rater ça quand même...alors oui j'ai craqué

    et passé commande d'un HC2 et d'un chouette assortiment de modules pour commencer à  me faire un peu la main. D'après Colissimo c'est pour demain - l'impatience me dévore; pire qu'un gosse une veille de noà«l.

     

    Projets :

     

    - Contrôle chauffage électrique (obligé, c'est comme ça que je l'ai vendu à  mon épouse.... ;-)

    - Portage de mes bidouilles Arduino:  PH, Hygro et EC pour mes plantes et puis surveillance de la boite à  lettre qui est trop loin pour qu'on y aille pour rien :-)

    - Domotiser le portail

     

    voila pour le début d'une nouvelle aventure!

     

    a+

×