Page 9 sur 11

Re: LUA : vacances scolaires

Publié : 24 oct. 2019, 08:13
par denis_brasseur
Si tu édites ton script avec nano ou vi, a quoi ressemble t il ?

Code : Tout sélectionner

cd /domoticz/scripts/lua
sudo nano script_time_vacancesscolaire2.lua

Re: LUA : vacances scolaires

Publié : 24 oct. 2019, 10:19
par vr6man
voici le contenu du script

Code : Tout sélectionner


--Variables nécessaires au script
local tmpIdLibelle   --Pour stocker temporairement l'id du libellé des vacances
local tmpFichierXml

local libelleVac   --Libelle des vacances si vacances
local debutVac      --Début des vacances scolaires
local finVac      --Fin des vacances scolaires
local timenow = os.date("%H:%M")
local startClock = os.clock()
local flgdzVacancesScolaires = false
local flgdzVacancesScolairesDemain = false

--Variables a éditer
local debug = true  --Permet d afficher des messages pour voir l'exécution du script
local forceExecution = false  --Permet de forcer l'exécution sans tenir compte de l heure 
-- Liste des jours pour récupérer le fichier xml
-- pour éviter de le télécharger tous les jours
--Mot clé possible : 
-- /j = tous les jours
-- /m = toute les minutes

local listeJourTelechargementXml={}
listeJourTelechargementXml['30/03'] = '12:20'
listeJourTelechargementXml['30/06'] = '12:20'
listeJourTelechargementXml['30/09'] = '12:20'
listeJourTelechargementXml['30/12'] = '12:20'
--listeJourTelechargementXml['/j'] = '/m'   --Pour test éventuel



local heureExecution  = "00:03" --Format = HH:MM  ex 02:04 ou 12:36, C'est l'heure à laquelle vous voulez que le switch domoticz soit mis a jour
local fname = "/home/pi/domoticz/scripts/lua/vacances.xml"  --Renseigner ici le répertoire destination du téléchargement
local fichierSource = "https://www.data.gouv.fr/fr/datasets/r/000ae493-9fa8-4088-9f53-76d375204036"
local DateDuJour = os.date("%Y-%m-%d")
local DateDemain = os.date("%Y-%m-%d",tonumber(os.time(t))+24*60*60)


local academie = "B" --Indiquer ici l'académie
--Nom des dispositifs dans domoticz
local dzVacancesScolaires = "VacancesScolaires"  --Renseigner ici le nom du switch a mettre a jour dans domoticz 
local dzVacancesScolairesDemain = "VacancesScolaires+1" --Renseigner ici le nom du switch a mettre a jour dans domoticz 

json = (loadfile "/home/cd/domoticz/scripts/lua/JSON.lua")()  -- For Linux

--Télécharge le fichier json
function telechargeFile (url,dest)
   retour=os.execute("wget -O "..dest.." "..url)
      --Si erreur de téléchargement
      if (debug) then print("Retour telechargement = "..tostring(retour)) end
      if ( retour == false ) then
         print("Impossible de télécharger le fichier "..url)
      end
end

--Pour tester si le fichier est présent sur le disque
function ExisteFile (chemin)
   if ( debug ) then print ('Fonction ExisteXML parametre = '..chemin) end
   --Ouvre le fichier en lecture
   local tmpExiste = false
   local tmpFichier = io.open(chemin, "r")
   --Verifie l'ouverture du fichier sur le disque
   if ( tmpFichier == nil ) then
      print("Erreur d'ouverture du fichier '" .. fname .. "'.")
   else 
      tmpExiste = true
     tmpFichier:close()
   end
   

   return tmpExiste
end


function rangeDate (Date,DateMin,DateMax)
	--if ( debug ) then print('Appel fonction rangeDate '..Date..' '..DateMin..' '..DateMax) end
	return ( Date >= DateMin and Date < DateMax)
end				

commandArray = {}




if ( debug ) then print('Timenow = '..tostring(timenow) ) end

--Mise à jour du fichier vacances.xml
for jour, heure in pairs(listeJourTelechargementXml) do
   tmpDate = os.date("%d/%m")
   if ( debug ) then print('listeJourTelechargementXml = '..tostring(jour).." "..tostring(heure).." date du jour = "..tostring(tmpDate) ) end
   if ( (tostring(jour) == tostring(tmpDate) or tostring(jour) == '/j') and 
       (tostring(heure) == timenow or tostring(heure) == '/m') ) then
      if (debug) then print("C est le moment de telecharger = "..tostring(retour)) end
      --Supprime le fichier apres le traitement
      retour=os.execute("rm "..fname)
      if ( retour == false ) then
         print("Impossible de supprimer le fichier "..fname)
      end
      telechargeFile(fichierSource,fname)
   end
end


if ( debug ) then print('heureExecution = '..tostring(heureExecution) ) end

if ( tostring(timenow) == tostring(heureExecution) or forceExecution) then
	if ( debug ) then print(' DEBUT SCRIPT VACANCES SCOLAIRES') end
   --Test si le fichier est présent sur le disque
   if ( ExisteFile (fname ) ) then
      if ( debug ) then print('Le fichier json est présent') end
   else
      --Si le fichier n'existe pas on le telecharge
      if ( debug ) then print('Le fichier xml non présent') end
      telechargeFile(fichierSource,fname)
   end
    
   

	local f = io.open(fname, "r")
	--Verifie l'ouverture du fichier sur le disque
	if ( f == nil ) then
	  print("Erreur d'ouverture du fichier '" .. fname .. "'.")
	  
	  os.exit(1)
	end
	if ( debug ) then print('Ouverture du fichier json') end
	

	local json_block = f:read('*all')
	print('json_block = '..json_block)
	
	local json_valeur = json:decode(json_block)
	--Fermeture du fichier
	f:close()
   
   if ( debug ) then print("Date de mise a jour = ") end
   if ( debug ) then print(tostring(DateDuJour)) end


	
	

	if ( debug ) then print('Académie sélectionnée = '..academie) end
	for i in pairs(json_valeur) do
		
		if ( json_valeur[i].fields.location == academie and json_valeur[i].fields.end_date ~= nil ) then
			--Test la date du jour
			if ( rangeDate(DateDuJour,json_valeur[i].fields.start_date,json_valeur[i].fields.end_date) ) then
				flgdzVacancesScolaires = true
				if ( debug ) then print('i= '..tostring(i)..' '..json_valeur[i].fields.description) end
				if ( debug ) then print('Début '..json_valeur[i].fields.start_date..' '..'Fin '..json_valeur[i].fields.end_date..' ') end
				if ( debug ) then print('Date du jour : '..DateDuJour..' en vacances') end
			end	
			
			--Test le lendemain 
			if ( rangeDate(DateDemain,json_valeur[i].fields.start_date,json_valeur[i].fields.end_date) ) then
				flgdzVacancesScolairesDemain = true
				if ( debug ) then print('i= '..tostring(i)..' '..json_valeur[i].fields.description) end
				if ( debug ) then print('Début '..json_valeur[i].fields.start_date..' '..'Fin '..json_valeur[i].fields.end_date..' ') end
				if ( debug ) then print('Date du jour : '..DateDemain..' en vacances') end
			end	
			
		
		
		end	
	end   
	

	if ( flgdzVacancesScolaires ) then 
		print( tostring(DateDuJour)..' en vacances' )
		commandArray[dzVacancesScolaires] = 'On'
	else
		print( tostring(DateDuJour)..' pas en vacances' )
		commandArray[dzVacancesScolaires] = 'Off'
	end	

	if ( flgdzVacancesScolairesDemain ) then 
		print( tostring(DateDemain)..' en vacances' )
		commandArray[dzVacancesScolairesDemain] = 'On'
	else
		commandArray[dzVacancesScolairesDemain] = 'Off'
		print( tostring(DateDemain)..' pas en vacances' )
	end	

	
	
end 
if ( debug ) then print(' FIN SCRIPT VACANCES SCOLAIRES '..string.format('elapsed time: %.4f\n', os.clock() - startClock)..' seconde') end

return commandArray





Re: LUA : vacances scolaires

Publié : 24 oct. 2019, 14:08
par DreamL
Bonjour
Je viens de voir votre discussions

Est-ce que ce chemin dans ton script est correct

json = (loadfile "/home/cd/domoticz/scripts/lua/JSON.lua")() -- For Linux

sur raspberry, on devrait avoir en général
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux

Tu dois avoir le nom de ton utilisateur après /home/nom de ton utilisateur/domoticz/scripts/lua/JSON.lua

Re: LUA : vacances scolaires

Publié : 24 oct. 2019, 14:44
par vr6man
ok je vais tester ce soir

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux

plutot que

json = (loadfile "/home/cd/domoticz/scripts/lua/JSON.lua")() -- For Linux

Par contre cela n'explique pas les autres problèmes

as tu une idée de l'utf 8?

Re: LUA : vacances scolaires

Publié : 24 oct. 2019, 18:19
par DreamL
Il y'a aussi un problème avec l'académie

Dans mon script
local academie = "Nancy-Metz" --Indiquer ici l'académie

Dans ton script
local academie = "B" --Indiquer ici l'académie

Il ne fonctionne plus par zone mais par académie.
Il faut regarder dans le fichier json qu'elle est ton académie.

Je suis pas sur pour l'utf8,
tu aurais sans doute des caractères incorrects

Re: LUA : vacances scolaires

Publié : 24 oct. 2019, 21:37
par vr6man
bon j'ai modifié

l'acamedy en mettant Nantes mais sans etre sur

j'ai modifié le chemin

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux

J'ai rajouté

local u = require("utf8")

voici le code

Code : Tout sélectionner

local u = require("utf8")

--Variables nécessaires au script
local tmpIdLibelle   --Pour stocker temporairement l'id du libellé des vacances
local tmpFichierXml

local libelleVac   --Libelle des vacances si vacances
local debutVac      --Début des vacances scolaires
local finVac      --Fin des vacances scolaires
local timenow = os.date("%H:%M")
local startClock = os.clock()
local flgdzVacancesScolaires = false
local flgdzVacancesScolairesDemain = false

--Variables a éditer
local debug = true  --Permet d afficher des messages pour voir l'exécution du script
local forceExecution = false  --Permet de forcer l'exécution sans tenir compte de l heure 
-- Liste des jours pour récupérer le fichier xml
-- pour éviter de le télécharger tous les jours
--Mot clé possible : 
-- /j = tous les jours
-- /m = toute les minutes

local listeJourTelechargementXml={}
listeJourTelechargementXml['30/03'] = '12:20'
listeJourTelechargementXml['30/06'] = '12:20'
listeJourTelechargementXml['30/09'] = '12:20'
listeJourTelechargementXml['30/12'] = '12:20'
--listeJourTelechargementXml['/j'] = '/m'   --Pour test éventuel



local heureExecution  = "00:03" --Format = HH:MM  ex 02:04 ou 12:36, C'est l'heure à laquelle vous voulez que le switch domoticz soit mis a jour
local fname = "/home/pi/domoticz/scripts/lua/vacances.xml"  --Renseigner ici le répertoire destination du téléchargement
local fichierSource = "https://www.data.gouv.fr/fr/datasets/r/000ae493-9fa8-4088-9f53-76d375204036"
local DateDuJour = os.date("%Y-%m-%d")
local DateDemain = os.date("%Y-%m-%d",tonumber(os.time(t))+24*60*60)


local academie = "Nantes" --Indiquer ici l'académie
--Nom des dispositifs dans domoticz
local dzVacancesScolaires = "VacancesScolaires"  --Renseigner ici le nom du switch a mettre a jour dans domoticz 
local dzVacancesScolairesDemain = "VacancesScolaires+1" --Renseigner ici le nom du switch a mettre a jour dans domoticz 

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux

--Télécharge le fichier json
function telechargeFile (url,dest)
   retour=os.execute("wget -O "..dest.." "..url)
      --Si erreur de téléchargement
      if (debug) then print("Retour telechargement = "..tostring(retour)) end
      if ( retour == false ) then
         print("Impossible de télécharger le fichier "..url)
      end
end

--Pour tester si le fichier est présent sur le disque
function ExisteFile (chemin)
   if ( debug ) then print ('Fonction ExisteXML parametre = '..chemin) end
   --Ouvre le fichier en lecture
   local tmpExiste = false
   local tmpFichier = io.open(chemin, "r")
   --Verifie l'ouverture du fichier sur le disque
   if ( tmpFichier == nil ) then
      print("Erreur d'ouverture du fichier '" .. fname .. "'.")
   else 
      tmpExiste = true
     tmpFichier:close()
   end
   

   return tmpExiste
end


function rangeDate (Date,DateMin,DateMax)
	--if ( debug ) then print('Appel fonction rangeDate '..Date..' '..DateMin..' '..DateMax) end
	return ( Date >= DateMin and Date < DateMax)
end				

commandArray = {}




if ( debug ) then print('Timenow = '..tostring(timenow) ) end

--Mise à jour du fichier vacances.xml
for jour, heure in pairs(listeJourTelechargementXml) do
   tmpDate = os.date("%d/%m")
   if ( debug ) then print('listeJourTelechargementXml = '..tostring(jour).." "..tostring(heure).." date du jour = "..tostring(tmpDate) ) end
   if ( (tostring(jour) == tostring(tmpDate) or tostring(jour) == '/j') and 
       (tostring(heure) == timenow or tostring(heure) == '/m') ) then
      if (debug) then print("C est le moment de telecharger = "..tostring(retour)) end
      --Supprime le fichier apres le traitement
      retour=os.execute("rm "..fname)
      if ( retour == false ) then
         print("Impossible de supprimer le fichier "..fname)
      end
      telechargeFile(fichierSource,fname)
   end
end


if ( debug ) then print('heureExecution = '..tostring(heureExecution) ) end

if ( tostring(timenow) == tostring(heureExecution) or forceExecution) then
	if ( debug ) then print(' DEBUT SCRIPT VACANCES SCOLAIRES') end
   --Test si le fichier est présent sur le disque
   if ( ExisteFile (fname ) ) then
      if ( debug ) then print('Le fichier json est présent') end
   else
      --Si le fichier n'existe pas on le telecharge
      if ( debug ) then print('Le fichier xml non présent') end
      telechargeFile(fichierSource,fname)
   end
    
   

	local f = io.open(fname, "r")
	--Verifie l'ouverture du fichier sur le disque
	if ( f == nil ) then
	  print("Erreur d'ouverture du fichier '" .. fname .. "'.")
	  
	  os.exit(1)
	end
	if ( debug ) then print('Ouverture du fichier json') end
	

	local json_block = f:read('*all')
	print('json_block = '..json_block)
	
	local json_valeur = json:decode(json_block)
	--Fermeture du fichier
	f:close()
   
   if ( debug ) then print("Date de mise a jour = ") end
   if ( debug ) then print(tostring(DateDuJour)) end


	
	

	if ( debug ) then print('Académie sélectionnée = '..academie) end
	for i in pairs(json_valeur) do
		
		if ( json_valeur[i].fields.location == academie and json_valeur[i].fields.end_date ~= nil ) then
			--Test la date du jour
			if ( rangeDate(DateDuJour,json_valeur[i].fields.start_date,json_valeur[i].fields.end_date) ) then
				flgdzVacancesScolaires = true
				if ( debug ) then print('i= '..tostring(i)..' '..json_valeur[i].fields.description) end
				if ( debug ) then print('Début '..json_valeur[i].fields.start_date..' '..'Fin '..json_valeur[i].fields.end_date..' ') end
				if ( debug ) then print('Date du jour : '..DateDuJour..' en vacances') end
			end	
			
			--Test le lendemain 
			if ( rangeDate(DateDemain,json_valeur[i].fields.start_date,json_valeur[i].fields.end_date) ) then
				flgdzVacancesScolairesDemain = true
				if ( debug ) then print('i= '..tostring(i)..' '..json_valeur[i].fields.description) end
				if ( debug ) then print('Début '..json_valeur[i].fields.start_date..' '..'Fin '..json_valeur[i].fields.end_date..' ') end
				if ( debug ) then print('Date du jour : '..DateDemain..' en vacances') end
			end	
			
		
		
		end	
	end   
	

	if ( flgdzVacancesScolaires ) then 
		print( tostring(DateDuJour)..' en vacances' )
		commandArray[dzVacancesScolaires] = 'On'
	else
		print( tostring(DateDuJour)..' pas en vacances' )
		commandArray[dzVacancesScolaires] = 'Off'
	end	

	if ( flgdzVacancesScolairesDemain ) then 
		print( tostring(DateDemain)..' en vacances' )
		commandArray[dzVacancesScolairesDemain] = 'On'
	else
		commandArray[dzVacancesScolairesDemain] = 'Off'
		print( tostring(DateDemain)..' pas en vacances' )
	end	

	
	
end 
if ( debug ) then print(' FIN SCRIPT VACANCES SCOLAIRES '..string.format('elapsed time: %.4f\n', os.clock() - startClock)..' seconde') end

return commandArray


Maintenant j'ai le message d'erreur suivant

pi@rasp_home:~/domoticz/scripts/lua $ ./script_time_vacancesscolaire2.lua
./script_time_vacancesscolaire2.lua: ligne 1: erreur de syntaxe près du symbole inattendu « ( »
./script_time_vacancesscolaire2.lua: ligne 1: `local u = require("utf8")'
pi@rasp_home:~/domoticz/scripts/lua $


et dans les logs:

2019-10-25 06:55:00.211 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_vacancesscolaire2.lua: ...i/domoticz/scripts/lua/script_time_vacancesscolaire2.lua:3: module 'utf8' not found:
2019-10-25 06:55:00.211 no field package.preload['utf8']
2019-10-25 06:55:00.211 no file '/usr/local/share/lua/5.2/utf8.lua'
2019-10-25 06:55:00.211 no file '/usr/local/share/lua/5.2/utf8/init.lua'
2019-10-25 06:55:00.211 no file '/usr/local/lib/lua/5.2/utf8.lua'
2019-10-25 06:55:00.211 no file '/usr/local/lib/lua/5.2/utf8/init.lua'
2019-10-25 06:55:00.211 no file './utf8.lua'
2019-10-25 06:55:00.211 no file '/usr/local/lib/lua/5.2/utf8.so'
2019-10-25 06:55:00.211 no file '/usr/local/lib/lua/5.2/loadall.so'
2019-10-25 06:55:00.211 no file './utf8.so'

Re: LUA : vacances scolaires

Publié : 27 oct. 2019, 17:29
par vr6man
une idée car j'ai toujours le problème ?

Merci

Re: LUA : vacances scolaires

Publié : 28 oct. 2019, 09:38
par DreamL
Bonjour
Retire la ligne "local u = require("utf8")"

Elle n'est pas nécessaire.
Toutes les erreurs semblent venir de cette ligne que tu as ajoutés

Re: LUA : vacances scolaires

Publié : 28 oct. 2019, 09:47
par vr6man
Ligne retiré

"local u = require("utf8")"

et j'ai le message suivant


./script_time_vacancesscolaire2.lua: ligne 2: --Variables : commande introuvable
./script_time_vacancesscolaire2.lua: ligne 3 : local: utilisable seulement dans une fonction
./script_time_vacancesscolaire2.lua: ligne 16 : local: utilisable seulement dans une fonction
./script_time_vacancesscolaire2.lua: ligne 40: --Nom : commande introuvable
./script_time_vacancesscolaire2.lua: ligne 41 : local: utilisable seulement dans une fonction
./script_time_vacancesscolaire2.lua: ligne 42 : local: utilisable seulement dans une fonction
./script_time_vacancesscolaire2.lua: ligne 44: erreur de syntaxe près du symbole inattendu « ( »
./script_time_vacancesscolaire2.lua: ligne 44: `json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux'

Re: LUA : vacances scolaires

Publié : 28 oct. 2019, 10:49
par thier
ça ne doit pas être des simples tirets mais des doubles tirets du 6 -- pour commenter des lignes.