[LUA] Vacances scolaires

Vous avez créé 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.
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: LUA : vacances scolaires

Message 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
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
vr6man
Messages : 627
Inscription : 18 juil. 2017, 12:15

Re: LUA : vacances scolaires

Message 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




DreamL
Messages : 76
Inscription : 20 janv. 2017, 20:03

Re: LUA : vacances scolaires

Message 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
Domoticz 3.7115, raspberry pi3, (raspbian jessie).
rfx433 (Rfxcom) : sonde innovaley, 1wire (DS9490R) : DS2406 & DS18B20, Zwave (Stick G5) : fgms-001,fgsd-002,zw080.
vr6man
Messages : 627
Inscription : 18 juil. 2017, 12:15

Re: LUA : vacances scolaires

Message 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?
DreamL
Messages : 76
Inscription : 20 janv. 2017, 20:03

Re: LUA : vacances scolaires

Message 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
Domoticz 3.7115, raspberry pi3, (raspbian jessie).
rfx433 (Rfxcom) : sonde innovaley, 1wire (DS9490R) : DS2406 & DS18B20, Zwave (Stick G5) : fgms-001,fgsd-002,zw080.
vr6man
Messages : 627
Inscription : 18 juil. 2017, 12:15

Re: LUA : vacances scolaires

Message 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'
vr6man
Messages : 627
Inscription : 18 juil. 2017, 12:15

Re: LUA : vacances scolaires

Message par vr6man »

une idée car j'ai toujours le problème ?

Merci
DreamL
Messages : 76
Inscription : 20 janv. 2017, 20:03

Re: LUA : vacances scolaires

Message 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
Domoticz 3.7115, raspberry pi3, (raspbian jessie).
rfx433 (Rfxcom) : sonde innovaley, 1wire (DS9490R) : DS2406 & DS18B20, Zwave (Stick G5) : fgms-001,fgsd-002,zw080.
vr6man
Messages : 627
Inscription : 18 juil. 2017, 12:15

Re: LUA : vacances scolaires

Message 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'
thier
Messages : 807
Inscription : 26 sept. 2015, 10:32
Localisation : charente

Re: LUA : vacances scolaires

Message par thier »

ça ne doit pas être des simples tirets mais des doubles tirets du 6 -- pour commenter des lignes.
PI3+, Buster, Domoticz V2020.2, rflink, zwave, chauffage piloté par qubino, sondes oregon et Vil1d, boite aux lettres détection passage facteur, volets roulants qubino fibaro.
Répondre