Erreur de script - aide

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
frugonn
Messages : 15
Inscription : 22 janv. 2016, 14:28

Erreur de script - aide

Message par frugonn »

bonjour,

Je suis en train d'élaborer un script pour détecter de la présence dans la maison.
le but est d'élaborer une boucle pour identifier la dernière mise à jour des détecteurs de présence.
en d'alimenter une var bolean en true / false et une autre avec la date et heure de la derniere apparition

voici le script :

Code : Tout sélectionner

--[[ 

Type:          time
Name:          Presence
 
Description:   Ce script permet de savoir si il y a du monde a la maison par l'intermediaire 
				des détecteurs de mouvements ou activation de l'alarme
Usage:         Une variable creation de deux variables: 
				presence (date et heure de la dernière detection de présence dans la maison)
				absence (temps d'absence de la maison) 

--]]
 
--------------------------------
------ Variables à éditer ------
--------------------------------

-- nom de zone
local zone = 'maison'                  -- nom de la zone pour affichage dans les logs et alerte mail


-- capteurs présence
local mv_presence_1 = 'Motion Salon'             -- Nom du capteur de mouvement
local mv_presence_2 = 'Detecteur veranda'
local mv_presence_3 = 'Motion salle sport'

local nb_detecteur = 3						  -- nombre de detecteur dans la maison
-- alarme


-- local = 

local presence = uservariables["presence_maison"]

-- domoticz
local url = '192.168.1.84:8080'         -- user:pass@ip:port de domoticz, pour la création des variables

 


function timedifference(d)
   print (d)
   local s = d
   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

-- quelle date et heure ?
local heure = string.sub(os.date("%X"), 1, 5)
local date = os.date("%x")
-- on regarde depuis combien de temps on est absent
--local absence = string.sub(os.date("!%X", timedifference(presence)), 1, 5)  - en heure


presence = false
for i = 1, nb_detecteur, 1 do 
	local tmp = 'mv_presence_'..tostring(i)
	print (tmp) 
    local absence = string.sub(os.date("!%X", timedifference(otherdevices_lastupdate['mv_presence_'..tostring(i)], 1, 5)))
	if absence < '00:10' then 
		presence = true	
	end
end	


commandArray = {}

return commandArray
   

dans le log j'ai un

Code : Tout sélectionner

 2016-02-22 15:06:00.373 Error: EventSystem: /home/pi/domoticz/scripts/lua/script_time_presence.lua:44: bad argument #1 to 'sub' (string expected, got nil) 
et le print (tmp) renvoit bien : 2016-02-22 15:07:00.466 LUA: mv_presence_1
Je n'arrive pas à trouver la solution, une idée ?

merci d'avance;

à bientôt
ganq
Messages : 385
Inscription : 01 avr. 2015, 14:20

Re: Erreur de script - aide

Message par ganq »

C'est quoi la ligne 44 ?
domoticien amateur option bidouille
patrice
Messages : 1720
Inscription : 22 sept. 2014, 21:51

Re: Erreur de script - aide

Message par patrice »

bsr
En 44 c'est le year=

le povre on lui sucre juste au dessus sa belle variable s pour ça : local s = d
que contient s -> d.
et que contient d ?
une date ? pour que year = puisse bosser ?

le bug vient de la : local s = d
Raspberry pi 3, Dongle RfxCom et Zigate +, plugin de pipiche, Volets Roulants profalux, contrôle d'éclairage, détecteurs de présence, alarme incendie, pilotage livebox ...
Objectif : WAF > 1
frugonn
Messages : 15
Inscription : 22 janv. 2016, 14:28

Re: Erreur de script - aide

Message par frugonn »

Hello merci pour votre aide,

j'ai finalement trouver une autre solution

Code : Tout sélectionner

--[[ 

Type:          time
Name:          Presence
 
Description:   Ce script permet de savoir si il y a du monde a la maison par l'intermediaire 
				des détecteurs de mouvements ou activation de l'alarme
Usage:         Une variable creation de deux variables: 
				presence (date et heure de la dernière detection de présence dans la maison)
				absence (temps d'absence de la maison) 

--]]
 
--------------------------------
------ Variables à éditer ------
--------------------------------

-- nom de zone
local zone = 'maison'                  -- nom de la zone pour affichage dans les logs et alerte mail


-- capteurs présence
local mv_presence = {};
mv_presence[1] = {nom= 'Motion Salon'}
mv_presence[2] = {nom= 'Detecteur veranda'}
mv_presence[3] = {nom= 'Motion salle sport'}

--[[
local mv_presence_1 = 'Motion Salon'             -- Nom du capteur de mouvement
local mv_presence_2 = 'Detecteur veranda'
local mv_presence_3 = 'Motion salle sport'
--]]
 
 nb_detecteur = 3						  -- nombre de detecteur dans la maison
-- alarme


-- local = 

local presence = uservariables["presence_maison"]

-- domoticz
local url = '192.168.1.84:8080'         -- user:pass@ip:port de domoticz, pour la création des variables

 


function timedifference(d)
   print (d)
   local s = d
   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

-- quelle date et heure ?
local heure = string.sub(os.date("%X"), 1, 5)
local date = os.date("%x")
-- on regarde depuis combien de temps on est absent
--local absence = string.sub(os.date("!%X", timedifference(presence)), 1, 5)  - en heure
commandArray = {}


presence = false
for i, v in pairs (mv_presence) do 
--	local tmp = 'mv_presence_'..tostring(i)
	print (v.nom) 
 local absence = string.sub(os.date("!%X", timedifference(otherdevices_lastupdate[v.nom])), 1, 5)
print ('---------> ' *** ' <--------------') 
 if absence < '00:10' then 
		presence = true	
		commandArray['Variable:presence_maison'] = true
		print('present') 
 end
end	



return commandArray
J'ai du utiliser un tableau car LUA n'arrivait pas a comprendre que 'mv_presence_'..tostring(i) était une variable....
L'avantage est que je pourrait associée des information au capteur de présence...
a priori le bug ne vient pas de local s = d car je ne l'ai pas bougé et le script le plante pas avec la déclaration de tableau ...

merci pour votre aide :)
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Erreur de script - aide

Message par rimram31 »

frugonn a écrit :..J'ai du utiliser un tableau car LUA n'arrivait pas a comprendre que 'mv_presence_'..tostring(i) était une variable....
Hum hum ... LUA n'y est pas pour grand chose dans cette histoire ;) C'est la 2eme fois que je vois ce type d'erreur sur le forum, vous confondez nom de variable au sens du langage et contenu de cette variable, la syntaxe que tu utilisais n'a pas de sens: 'mv_presence_'..tostring(i) en voulant indexer un tableau avec un nom de variable "calculé".

Tu as eu la bonne réaction, en langage de programmation quand on veut utiliser un tableau, on créé un tableau :mrgreen:
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
Répondre