LUA : récupération informations Livebox TV

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
papoo
Messages : 1541
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : récupération informations Livebox TV

Message par papoo » 10 mars 2018, 17:47

il va falloir mettre un peu les mains dans le camboui
j'ai adapté un fichier bash pour récupérer les devices connectés

Code : Tout sélectionner

#!/opt/bin/bash

###########################################
    # Firmware Livebox 4 = 2.22.8 g0-f-sip-fr #
#     Script mis a jour le 03/06/2017     #
###########################################

#script source https://blog.tetsumaki.net/articles/2015/10/recuperation-dinformations-livebox-play.html

#############################
# Déclaration des variables #
#############################
myLivebox=192.168.1.1
myPassword=

#myBashDir=/home/pi/domoticz/scripts/sh/livebox/
myBashDir=/home/pi/domoticz/Trend/

myOutput=$myBashDir/myOutput.txt
myCookies=$myBashDir/myCookies.txt

########################################
# Connexion et recuperation du cookies #
########################################
curl -s -o "$myOutput" -X POST -c "$myCookies" -H 'Content-Type: application/x-sah-ws-4-call+json' -H 'Authorization: X-Sah-Login' -d "{\"service\":\"sah.Device.Information\",\"method\":\"createContext\",\"parameters\":{\"applicationName\":\"so_sdkut\",\"username\":\"admin\",\"password\":\"$myPassword\"}}" http://$myLivebox/ws > /dev/null

##################################################
# Lecture du cookies pour utilisation ultérieure #
##################################################
myContextID=$(tail -n1 "$myOutput" | sed 's/{"status":0,"data":{"contextID":"//1'| sed 's/",//1' | sed 's/"groups":"http,admin//1' | sed 's/"}}//1')

###############################################################################################
# Envoi des commandes pour récupérer les informations et écriture dans un fichier TXT séparé #
###############################################################################################
getDSLStats=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.dsl0\",\"method\":\"getDSLStats\",\"parameters\":{}}" http://$myLivebox/ws`
getMIBs=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NeMo.Intf.data\",\"method\":\"getMIBs\",\"parameters\":{}}" http://$myLivebox/ws`
getWanStatus=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"NMC\",\"method\":\"getWANStatus\",\"parameters\":{}}" http://$myLivebox/ws`
getDeviceInfo=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"DeviceInfo\",\"method\":\"get\",\"parameters\":{}}" http://$myLivebox/ws`
getDevices=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/x-sah-ws-4-call+json' -H "X-Context: $myContextID" -d "{\"service\":\"Devices\",\"method\":\"get\",\"parameters\":{}}" http://$myLivebox/ws`
#getDevices=`curl -s -b "$myCookies" -X POST -H 'Content-Type: application/json\' -H "X-Context: $myContextID" -d "{\"service\":\"Devices\",\"method\":\"get\",\"parameters\":{}}" http://$myLivebox/ws`

echo $getDSLStats > $myBashDir/DSLStats.txt
echo $getMIBs > $myBashDir/MIBs.txt
echo $getWanStatus > $myBashDir/WanStatus.txt
echo $getDeviceInfo > $myBashDir/DeviceInfo.txt
echo $getDevices > $myBashDir/Devices.txt
#######################################################
# Deconnexion et suppression des fichiers temporaires #
#######################################################
curl -s -b "$myCookies" -X POST http://$myLivebox/logout
rm "$myCookies" "$myOutput"

et j'ai ensuite adapté le script lua précédent pour lancer le script bash et extraire les données.
attention à personnaliser le mdp dans le bash ainsi que les chemins d'accès aux fichiers

Code : Tout sélectionner

--[[
    
source : https://github.com/vzwingma/domotique/blob/master/domoticz/scripts/lua/script_time_network_status.lua
https://blog.tetsumaki.net/articles/2015/10/recuperation-dinformations-livebox-play.html
https://easydomoticz.com/forum/viewtopic.php?f=10&t=3825&start=10#p35974
http://pon.fr/network-status-via-Livebox-en-lua/

MAJ : 23/12/2017
]]--
--------------------------------------------
------------ Variables à éditer ------------
-------------------------------------------- 
local nom_script = "Livebox Network Status"
local version = "1.4"
local debugging = false  	    -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local script_actif = true       -- active (true) ou désactive (false) ce script simplement

-- Créer une variable "Livebox_mac_adress_smartphones" avec les MAC ADDRESS des smartphones. Le séparateur est ";"
livebox_mac_adress_smartphones = uservariables["livebox_mac_adress_smartphones"]

livebox_mac_adress_surveillance = uservariables["livebox_mac_adress_surveillance"]
livebox_mac_adress_smartphones = livebox_mac_adress_smartphones .. livebox_mac_adress_surveillance

-- Créer une variable "Livebox_mac_adress_surveillance" avec les MAC ADDRESS des Smartphones N' entrant PAS en compte pour l'alarme. Le séparateur est ";"

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local patternMacAdresses = string.format("([^%s]+)", ";")
local chemin_tmp = "/home/pi/domoticz/Trend/"
--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------   
package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua"
require('fonctions_perso')

function readAll(file)
    local f = io.open(file, "rb")
	if(f == nil) then
		return ""
	else
		local content = f:read("*all")
		f:close()
		return content
	end
end

function getPeripheriquesConnectes() -- liste les périphériques utilisés pour l'activation/désactivation automatique de l'alarme
	--local TMP_PERIPHERIQUES = "/home/pi/domoticz/Trend/peripheriques.tmp"
    
    
	--local TMP_PERIPHERIQUES = "/home/pi/domoticz/scripts/sh/livebox/Devices.txt"
    local TMP_PERIPHERIQUES = chemin_tmp .."Devices.txt"

	--  Appel sur la liste des périphériques
	voir_les_logs("Recherche des peripheriques connus de la Livebox",debugging)

	local json_peripheriques = JSON:decode(readAll(TMP_PERIPHERIQUES))
	local etatSmartphone = false
	-- Liste des périphériques
	for index, peripherique in pairs(json_peripheriques.status) do
        --voir_les_logs("--- --- --- [Livebox] Statut du peripherique surveillance " .. index .. " :: " .. peripherique.Key,debugging)
		for mac in string.gmatch(livebox_mac_adress_smartphones, patternMacAdresses) do
			if(mac == peripherique.Key) then
			    if(peripherique.Active) then
					-- local lastChanged = os.time() - convertStringUTCTimeToSeconds(peripherique.LastChanged)
					-- local lastConnect = os.time() - convertStringUTCTimeToSeconds(peripherique.LastConnection)
					-- if(lastChanged < 0) then
						-- lastChanged = 0
                    -- end                
				voir_les_logs("Statut du peripherique en surveillance ".. peripherique.Name.." [" .. mac .. "]  =>  actif:" .. tostring((peripherique.Active)),debugging)
                --voir_les_logs("--- --- --- [" .. peripherique.Name .. "] actif; Dernière activite = " .. peripherique.LastChanged .. " :: " .. lastChanged .. "s / Dernière connexion = " .. peripherique.LastConnection .. " :: " .. lastConnect .. "s",debugging)
                    
					etatSmartphone = true
                        if otherdevices[peripherique.Name] == 'Off' then
							commandArray [peripherique.Name]='On'
                            voir_les_logs("--- --- --- [Livebox] Activation de : " .. peripherique.Name .."  --- --- --- ",debugging)
						
                        end
							else
                        if otherdevices[peripherique.Name] == 'On' then    
							commandArray [peripherique.Name]='Off'
                            voir_les_logs("--- --- --- [Livebox] DesActivation de : " .. peripherique.Name .."  --- --- --- ",debugging)
						
                        end   
				end		
			end
		end
	end
return etatSmartphone
end
	
function getPeripheriquesConnectes2() -- liste les périphériques utilisés pour
	--local TMP_PERIPHERIQUESHORSALARME = "/home/pi/domoticz/Trend/peripheriques_hors_alarme.tmp"
	--  Appel sur la liste des périphériques
	voir_les_logs("Recherche des peripheriques connus de la Livebox (hors alarme)",debugging)
	-- local commandeurl="curl -s -H \"Content-Type: application/json\" -H \"X-Fbx-App-Auth: " .. session_token .. "\" -X GET " .. apiLiveboxv4 .. "/lan/browser/pub/"
	-- os.execute(commandeurl .. " > " .. TMP_PERIPHERIQUESHORSALARME)
   
    
	local TMP_PERIPHERIQUESHORSALARME = chemin_tmp .."Devices.txt"
	local other_json_peripheriques = JSON:decode(readAll(TMP_PERIPHERIQUESHORSALARME))
	other_etatPeripheriques = false
    -- Liste des périphériques HORS ALARME
	for index, peripherique in pairs(other_json_peripheriques.status) do
        voir_les_logs("--- --- --- [Livebox] Statut du peripherique hors surveillance " .. index .. " :: " .. peripherique.Key,debugging)
		for mac in string.gmatch(livebox_mac_adress_smartphones, patternMacAdresses) do
			if(mac == peripherique.Key)
			then
				voir_les_logs("Statut du peripherique hors surveillance".. peripherique.Name.." [" .. mac .. "]  =>  actif:" .. tostring((peripherique.Active)),debugging)
				if(peripherique.Active) then
                other_etatPeripheriques = true
                    if otherdevices[peripherique.Name] == 'Off' then
                        commandArray [peripherique.Name]='On'
                        voir_les_logs("--- --- --- [Livebox] Activation de : " .. peripherique.Name .."  --- --- --- ",debugging)
                    end
				else
                    if otherdevices[peripherique.Name] == 'On' then    
                        commandArray [peripherique.Name]='Off'
                        voir_les_logs("--- --- --- [Livebox] DesActivation de : " .. peripherique.Name .."  --- --- --- ",debugging)
                    end
				end		
			end
		end
	end	
return other_etatPeripheriques
end
-- Mise à jour de l'alarme suivant le statut des périphériques
-- @param : état des périphériques
function updateAlarmeStatus(etat_peripheriques)
	local etatActuelAlarme=otherdevices['Security Panel']
    voir_les_logs("  > Etat du panneau de securite = " .. etatActuelAlarme ,debugging)
	local SEUIL_ALARME = 1 -- temps en minute avant activation de l'alarme
	local TMPDIR_COMPTEUR_OUT = "/home/pi/domoticz/Trend/compteur_smartphone_out.tmp"
	-- Activation de l'alarme au bout de X min
	if(not etat_peripheriques and etatActuelAlarme == "Normal") then
    --if(not etat_peripheriques) then
		compteurOff=readAll(TMPDIR_COMPTEUR_OUT)
		if(compteurOff == "") then
			compteurOff = 0
		end
		compteurOff = compteurOff + 1
		voir_les_logs("  > Compteur de mise en alarme = " .. compteurOff .. " / " .. SEUIL_ALARME,debugging)
		if(compteurOff >= SEUIL_ALARME) then
			voir_les_logs("Activation de l'alarme",debugging)
            commandArray[#commandArray+1] = {['Alarme Out']="On"}
            commandArray[#commandArray+1] = {['test presences']="Off"}          
			compteurOff = 0
		end
		os.execute("echo " .. compteurOff .. " > " .. TMPDIR_COMPTEUR_OUT)
	elseif(etat_peripheriques and etatActuelAlarme == "Arm Away") then
    -- Désactivation immédiate
		
        commandArray[#commandArray+1] = {['Alarme Out']="On"}
        commandArray[#commandArray+1] = {['test presences']="On"}
		voir_les_logs("Desactivation de l'alarme",debugging)

		os.execute("echo 0 > " .. TMPDIR_COMPTEUR_OUT)
	
	elseif(etat_peripheriques) then
		os.execute("echo 0 > " .. TMPDIR_COMPTEUR_OUT)
        commandArray[#commandArray+1] = {['test presences']="On"}
        voir_les_logs("Remise a zero du compte de l'alarme",debugging)
		
	end	
end
--------------------------------------------
-------------- Fin Fonctions ---------------
--------------------------------------------
commandArray = {}
time=os.date("*t")
if time.min ~= 0 and script_actif == true then -- execution toutes les minutes sauf à xx:00
		voir_les_logs("[Livebox] Statuts des peripheriques reseau Livebox",debugging)
	-- Boucle principale
 	if ( livebox_mac_adress_surveillance == nil or livebox_mac_adress_surveillance == nil ) then
		--error("[Livebox] {livebox_mac_adress_smartphones}, {livebox_mac_adress_surveillance} ne sont pas definies dans Domoticz")
		--return 512
        print("erreur")
	else
		voir_les_logs("Test de presence des appareils d'adresses MAC (" .. livebox_mac_adress_smartphones .. ")",debugging)
        voir_les_logs("Test de presence des appareils d'adresses MAC (" .. livebox_mac_adress_surveillance .. ")",debugging)
		JSON = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- one-time load of the routines
		-- Connexion à la Livebox
		--connectToLivebox()
		-- Recherche des périphériques connectés
        os.execute('sudo bash /home/pi/domoticz/scripts/sh/livebox/livebox.sh') 
		peripheriques_up = getPeripheriquesConnectes()
		-- Recherche des périphériques connectés  (HORS ALARME)
		--getPeripheriquesConnectes2()
		--updateAlarmeStatus(peripheriques_up)
		-- Déconnexion à la Livebox
		--disconnectToLivebox()
	end
end --if time	
return commandArray
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Seb13
Messages : 242
Enregistré le : 07 janv. 2016, 23:46

Re: LUA : récupération informations Livebox TV

Message par Seb13 » 11 mars 2018, 00:03

Super Merci...

Le premier script fonctionne, j'ai des data dans les fichiers dans le répertoire. Perfect !

Cependant, pour le 2ème, je dois faire pas mal de modification.

Code : Tout sélectionner

--------------------------------------------
---------------- Fonctions -----------------
--------------------------------------------   
package.path = package.path..";/home/pi/domoticz/scripts/lua/fonctions/?.lua"
require('fonctions_perso')
Je n'ai pas fonctions_perso, je pense qu'il permet aussi d'utiliser voir_les_logs() ?
Si je comprends le principe, il suffit de mettre un fichier avec les fonctions dans lua/fonctions qui permet d'utiliser pour tous scripts ?

De plus, si j'ai bien compris, le 2ème script utilise le résultat du premier, donc, il faut faire jouer dans la CRON tab le premier toutes les x minutes, sinon on a toujours le même résultat.

J'ai essayé avec 2 mac address, cela fonctionne.

Code : Tout sélectionner

2018-03-10 23:59:00.258 dzVents: livebox_mac_adress_smartphones : xx:27:xx:00:xx:EC
2018-03-10 23:59:00.638 dzVents: Statut du peripherique en surveillance Smartphone_xxxx [xx:27:xx:00:xx:EC] => actif:true
Maintenant, je dois l'adapter avec les scripts perso pour qu'il fonctionne pour mon alarme Somfy et mon script de supervision.

Merci de ton aide !!! j'ai une BONNE base de travail pour continuer!!!

papoo
Messages : 1541
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : récupération informations Livebox TV

Message par papoo » 11 mars 2018, 08:38

pas besoin de crontab, le script lua lance le fichier bash avant t’interpréter les données.
il te faut effectivement changer les chemins vers tes fichiers et éventuellement remplacer l'appel à mon fichier perso (que tu peux trouver sur mon github) par les fonctions utilisées directement dans le script.
je n'ai pas nettoyé/optimisé le script, pensant qu'il serait temporaire. j'attendais que l'auteur initial travaille sur l’intégration du login à son script, mais il n'a pas l'air de vouloir bouger.
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Seb13
Messages : 242
Enregistré le : 07 janv. 2016, 23:46

Re: LUA : récupération informations Livebox TV

Message par Seb13 » 11 mars 2018, 12:03

Salut,

Merci pour ton retour.

Le script n'est pas exécuté dans le script LUA, je vois ceci

Code : Tout sélectionner

 local TMP_PERIPHERIQUES = chemin_tmp .."Devices.txt"
Mais je ne vois rien qui lance ton script shell pour fournir Devices.txt qui est utilisé par la liste pour avoir la liste des devices présents.

Sauf erreur de ma part, sinon, tu peux me donner la ligne où tu l'exécute ?

Sinon, possible de ne pas mettre le password en clair ? c'est un peu chaud :lol:

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


papoo
Messages : 1541
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : récupération informations Livebox TV

Message par papoo » 11 mars 2018, 12:10

Seb13 a écrit :S je ne vois rien qui lance ton script shell pour fournir Devices.txt qui est utilisé par la liste pour avoir la liste des devices présents.

Sauf erreur de ma part, sinon, tu peux me donner la ligne où tu l'exécute ?
ligne 186

Code : Tout sélectionner

os.execute('sudo bash /home/pi/domoticz/scripts/sh/livebox/livebox.sh')
Seb13 a écrit :Sinon, possible de ne pas mettre le password en clair ? c'est un peu chaud
tu parles du mdp de la livebox?
tu peux toujours le mettre dans une variable utilisateur et l'appeler avec
uservariables["le_nom_de_la_variable_utilisateur_contenant_le_MDP_livebox"]
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Seb13
Messages : 242
Enregistré le : 07 janv. 2016, 23:46

Re: LUA : récupération informations Livebox TV

Message par Seb13 » 11 mars 2018, 12:29

Kool... merci...
En effet, comme j'ai indiqué au début du script le chemin, je pensais que si une commande était lancée, il trouverait par lui même l'info, donc, le chemin n'était pas bon car il ne fait pas appel à la variable du début, juste un chemin en dur, donc, il ne lançait pas le script.

Fonctionne très bien maintenant.

Cela me change la vie car avec le ping ce n'est pas super efficace.

Il reste le cas, où les enfants n'activent pas le WIFI et sont à la maison :lol:

Encore MERCI

Seb13
Messages : 242
Enregistré le : 07 janv. 2016, 23:46

Re: LUA : récupération informations Livebox TV

Message par Seb13 » 13 mars 2018, 22:06

Salut papoo

Une question, ton script qui recup les infos de la box toutes les minutes pour en faire des fichiers TXT... ce n'est pas un peu trop ?

J'ai retrouvé ma box KO ce soir, en fait, impossible d’accéder à l'interface d'admin, j'ai du relancer la box en hard reset.

C'est bon maintenant.

Peut-être faire un test toutes les 5mn ? non ?

Avec cette fonction

Code : Tout sélectionner

--Cette fonction calcule la différence de temps (en secondes) entre maintenant
--et la date passée en paramètre.
function timedifference (s)
  year = string.sub(s, 1, 4)
  month = string.sub(s, 6, 7)
  day = string.sub(s, 9, 10)
  hour = string.sub(s, 12, 13)
  minutes = string.sub(s, 15, 16)
  seconds = string.sub(s, 18, 19)
  t1 = os.time()
  t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
  difference = os.difftime (t1, t2)
  return difference
end
J'ai un interrupteurs 'Presence_All' cela donnerai

Code : Tout sélectionner

if timedifference(otherdevices_lastupdate['Presence_All']) > 600 then
...
Si demain, elle est encore KO...
Je pense qu'une connexion toutes les minutes, elle n'aime pas trop :lol:

papoo
Messages : 1541
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : récupération informations Livebox TV

Message par papoo » 13 mars 2018, 22:13

tu peux effectivement augmenter le délai entre deux lancements sans pb.
pour l'instant ma box encaisse sans problème le delai d'une minute
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Seb13
Messages : 242
Enregistré le : 07 janv. 2016, 23:46

Re: LUA : récupération informations Livebox TV

Message par Seb13 » 17 mars 2018, 10:48

Hello,

Un petit retour, j'ai laissé à 1mn et rien depuis la dernière fois... je ne sais pas ce qu'il y a eu :shock:

Wait and see...

Séb

papoo
Messages : 1541
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

Re: LUA : récupération informations Livebox TV

Message par papoo » 17 mars 2018, 10:59

cool
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre