Il faut mettre le fichier de conf a un endroit accessible par Domoticz, je l’ai mis dans /opt/domoticz/scripts mais vous pouvez le mettre ailleurs du moment que Domoticz a les droits pour le lire.
Une précision, dans la partie notification, la valeur test ne sert à rien pour l’instant mais je compte l’utiliser pour choisir le mode de test, plus grand que, plus grand ou equal, plus petit, etc …
Dites moi si c’est pertinant ou si le plus grand que suffit.
Dans notification, value permet de définir le seuil, par exemple si le niveau d’eau dépasse 2 métres ou 500 m3/s et active pour activer ou non la notification (true ou false).
Voici le script lua, catégorie lua -> time :
-- Parameters to change according to you needs
debug=false
-- Json config loadfile
config = '/opt/domoticz/scripts/vigicrue.json'
-- for Windows
-- config = 'C:\\Program Files (x86)\\Domoticz\\scripts\\vigicrue.json'
-- JSON.lua path
json = (loadfile "/opt/domoticz/scripts/lua/JSON.lua")()
-- for Windows
--json = (loadfile "C:\\Program Files (x86)\\Domoticz\\scripts\\lua\\JSON.lua")()
-- Curl path
curl = '/usr/bin/curl'
-- for Windows
-- curl = 'C:\\cygwin\\bin\\curl'
-- End of parameters
time = os.date("*t")
-- Function to update sensor
local function update(idx, value1)
local cmd = idx..'|0|'..value1
--print(cmd)
table.insert (commandArray, { ['UpdateDevice'] = cmd } )
end
local function sendnotif(station, result, type, channel)
if (type == "height") then
local cmd = 'Water level is high for station '..station..'#Current level is '..result..'m for'..station..'#0#sound#extradata#'..channel
if (debug) then print("NotifHeight: "..cmd) end
elseif (type == "speed") then
local cmd = 'Water speed level is high for station '..station..'#Current speed level: '..result..'m3/s for '..station..'#0#sound#extradata#'..channel
if (debug) then print("NotifSpeed: "..cmd) end
end
table.insert (commandArray, { ['SendNotification'] = "cmd" } )
if (debug) then print("Notif: Sent") end
end
-- function to get data from url
local function getdata(urlh,urls)
local DataHeight = assert(io.popen(curl..' -s "'..urlh..'"'))
local BlocJsonHeight = DataHeight:read('*all')
DataHeight:close()
local JsonHeight = json:decode(BlocJsonHeight)
local Height = JsonHeight.Serie.ObssHydro
local Name = JsonHeight.Serie.LbStationHydro
local DataSpeed = assert(io.popen(curl..' -s "'..urls..'"'))
local BlocJsonSpeed = DataSpeed:read('*all')
DataSpeed:close()
local JsonSpeed = json:decode(BlocJsonSpeed)
local Speed = JsonSpeed.Serie.ObssHydro
return Height, Speed, Name
end
commandArray = {}
if (time.min == 0 or time.min == 30) then
local file = assert(io.open(config, "r"))
local json_text = file:read("*all")
file:close()
local Conf = json:decode(json_text)
Station = Conf.station
for k,v in pairs(Station) do
local IDStation = v
local IDXHeight = Conf.idx.height[v]
local IDXSpeed = Conf.idx.speed[v]
local NotifHeightV = Conf.notifications.height[v].value
local NotifHeightA = Conf.notifications.height[v].active
local NotifSpeedV = Conf.notifications.speed[v].value
local NotifSpeedA = Conf.notifications.speed[v].active
local urlHeight = 'https://www.vigicrues.gouv.fr/services/observations.json/index.php?CdStationHydro='..IDStation..'&GrdSerie=H&FormatSortie=simple'
local urlSpeed = 'https://www.vigicrues.gouv.fr/services/observations.json/index.php?CdStationHydro='..IDStation..'&GrdSerie=Q&FormatSortie=simple'
ResultHeight,ResultSpeed,StationName=getdata(urlHeight,urlSpeed)
if (#ResultHeight ~= 0) then
if (debug) then print("ResultHeight: "..ResultHeight[#ResultHeight][2]) end
update(IDXHeight, ResultHeight[#ResultHeight][2])
if (NotifHeightA == "true") then
if (tostring(ResultHeight[#ResultHeight][2]) > NotifHeightV) then
sendnotif(StationName, ResultHeight[#ResultHeight][2], "height", NotifHeightC)
end
end
else
if (debug) then print('Height level is empty.') end
end
if (#ResultSpeed ~= 0) then
if (debug) then print("ResultSpeed: "..ResultSpeed[#ResultSpeed][2]) end
update(IDXSpeed, ResultSpeed[#ResultSpeed][2])
if (NotifSpeedA == "true") then
if (tostring(ResultSpeed[#ResultSpeed][2]) > NotifSpeedV) then
sendnotif(StationName, ResultSpeed[#ResultSpeed][2], "speed", NotifSpeedC)
end
end
else
if (debug) then print('Speed is empty.') end
end
end
end
return commandArray
Les modifications a apporter au script sont les quatre premières variables, à savoir :
debug : Pour activer le mode debug qui affiche plus d’info (pas encore optimisé pour la v3)
config : Emplacement de votre fichier json de configuration
json : Emplacement de votre fichier JSON.lua
curl : Chemin complet vers votre binaire curl
Pour le moment il faut modifier les commandes de notification manuellement :
commandArray['SendNotification']='Water level is high for station '..StationName..'#Current level is '..ResultHeight[#ResultHeight][2]..'m for '..StationName..'#0#sound#extradata#telegram'
commandArray['SendNotification']='Water speed level is high for station '..StationName..'#Current speed level: '..ResultSpeed[#ResultSpeed][2]..'m3/s for '..StationName..'#0#sound#extradata#telegram'
Pour définir le type de notification, ici j’utilise telegram.
Mais je compte rajouter ça dans le fichier de conf prochainement.
Etant donné les temps qui courent j’ai trouvé ce script lua très intéressant pour mon domioticZ!
j’ai implémenter le V3beta (pour une station). Aucun soucis avec les dummy, Le JSON.lua les IDX ainsi que les stations (très bien expliqué)
Cependant les information ne remonte pas, et pour cause, j’ai cette erreur dans mes logs:
Error: EventSystem: in …domoticz/scripts/lua/script_time_vigicrue.lua: …domoticz/scripts/lua/script_time_vigicrue.lua:64: attempt to index field ‘?’ (a nil value)
impossible de me dépatouiller, une idée?
la ligne 64 est la suivante:
local NotifHeightV = Conf.notifications.height[v].value
Il peut être intéressant de passer la variable debug à true au début du script qui va afficher les valeurs des variables.
Pouvez-vous me donner les ids de votre/vos stations ? Histoire que je regarde de mon coté aussi.
Très bien je vais faire l’essais de passer le param a true.
néanmoins l’execution du script comme ceci: lua vigicrue.lua ne remonte aucune erreur. Etrange, meme avec debug=true je ne vois mon erreur que dans les log domoticZ.
la station choisie est testée est: F447000101 même probleme avec : F447000302 et même probleme avec vos propre station.
Est-ce que Domoticz tourne sur un Windows ?
Car il semblerait que cette version du script ai quelques soucis sous Windows.
Sinon concernant la ligne 64, elle récupère la valeur stocké dans le fichier json vigicrue.lua.
Est-ce que le fichier json est complet ?
Il s’agit de ce bloc là :
« notifications »: {
« height »: {
« W141001001 »: {
« channel »: « telegram »,
« value »: « 2 »,
« active »: « true »
},
« L800001020 »: {
« channel »: « telegram »,
« value »: « 1 »,
« active »: « true »
}
},
Merci pour votre indication au sujet du fichier Json, ceci m’a permis de m’y attarder un peu plus. Et en effet j’ai comis une erreur.
une incohérence dans les ID des station, c’est maintenant resolu!
Débutant avec les scripts sous domoticz j’ai essayé d’implémenter votre script sur ma machine (Windows), mais j’ai l’erreur suivante dans la log domoticz :
2018-12-15 22:24:00.141 Error: EventSystem: in C:\Program Files (x86)\Domoticz\scripts\lua\script_time_vigicrue.lua: …iles (x86)\Domoticz\scripts\lua\script_time_vigicrue.lua:69: attempt to call global ‘O919001001’ (a nil value)
O919001001 est la station que je souhaite pister
Avez vous une idée de ce qui se passe, sachant que j’ai activé debug à true et que je ne vois rien de plus
Pouvez-vous coller en commentaire le début du script ou se trouve les variables a éditer.
Il me semble qu’il y a une erreur a ce niveau là. Comme si le numéro de la station est une variable.
J’utilise depuis un moment ce script, mais je n’arrive pas à récupérer la valeur dans un Blockly.
En regardant les logs, je m’aperçois que le retour du script me donne :
– State = X.XX (ex. : 3.91 en ce moment pour la Seine)
– Value = X/X.XX (ex. : 0/3.91 en ce moment pour la Seine)
Du coup, je n’arrive pas à récupérer la valeur dans un Blockly car celle-ci se trouve en réalité dans le State.
Bonjour, alors là, je n’en ai aucune idée, je n’utilise pas blocky.
Je peux essayer de regarder ça. Sinon passer par un script lua ?
Que souhaitez-vous faire ?
Tout d’abord merci pour votre réponse. J’ai essayé de passer par un script LUA mais j’avoue que je ne suis pas très doué !
Je cherche simplement à récupérer la valeur de la hauteur de la Seine dans une variable utilisateur.
J’ai créé une variable utilisateur TEST et dans le script vigicrue.lua je sais que je dois ajouter l’instruction suivante :
commandArray[‘Variable:TEST’]= ???
Mais je ne sais pas comment récupérer la bonne valeur. A priori elle doit se trouver dans « ResultHeight » mais ceci n’a rien donné :
commandArray[‘Variable:TEST’]= ResultHeight
ça devrait fonctionner, tout dépend du type de ta variable.
A placer au niveau de la ligne 73, avant où après pour la V3 et au niveau de la ligne 62 pour la V2.
Bonjour,
Etant donné les temps qui courent j’ai trouvé ce script lua très intéressant pour mon domioticZ!
j’ai implémenter le V3beta (pour une station). Aucun soucis avec les dummy, Le JSON.lua les IDX ainsi que les stations (très bien expliqué)
Cependant les information ne remonte pas, et pour cause, j’ai cette erreur dans mes logs:
Error: EventSystem: in …domoticz/scripts/lua/script_time_vigicrue.lua: …domoticz/scripts/lua/script_time_vigicrue.lua:64: attempt to index field ‘?’ (a nil value)
impossible de me dépatouiller, une idée?
la ligne 64 est la suivante:
local NotifHeightV = Conf.notifications.height[v].value
Merci de votre aide.
Il peut être intéressant de passer la variable debug à true au début du script qui va afficher les valeurs des variables.
Pouvez-vous me donner les ids de votre/vos stations ? Histoire que je regarde de mon coté aussi.
Très bien je vais faire l’essais de passer le param a true.
néanmoins l’execution du script comme ceci: lua vigicrue.lua ne remonte aucune erreur. Etrange, meme avec debug=true je ne vois mon erreur que dans les log domoticZ.
la station choisie est testée est: F447000101 même probleme avec : F447000302 et même probleme avec vos propre station.
Je reviens vers vous avec la log debug=true
Cordialement,
Est-ce que Domoticz tourne sur un Windows ?
Car il semblerait que cette version du script ai quelques soucis sous Windows.
Sinon concernant la ligne 64, elle récupère la valeur stocké dans le fichier json vigicrue.lua.
Est-ce que le fichier json est complet ?
Il s’agit de ce bloc là :
« notifications »: {
« height »: {
« W141001001 »: {
« channel »: « telegram »,
« value »: « 2 »,
« active »: « true »
},
« L800001020 »: {
« channel »: « telegram »,
« value »: « 1 »,
« active »: « true »
}
},
Bonjour Simon,
Vous êtes très réactif, mais je n’ai malheureusement pas eu le temps de passer ma variable a true pour le debug. Ce soir sans fautes!
Le fichier est identique a celui que vous fournissez, seule et unique modif, j’ai désactiver les nutofications
« active »: « false »
et bien entendu, les valeurs des id station.
Et oui, il s’agit d’un Linux debian.
Bonsoir,
Merci pour votre indication au sujet du fichier Json, ceci m’a permis de m’y attarder un peu plus. Et en effet j’ai comis une erreur.
une incohérence dans les ID des station, c’est maintenant resolu!
Parfait, du coup je pense peut-être revoir la configuration du script car c’est vrai qu’un fichier json n’est pas des plus pratique.
Bonsoir,
Débutant avec les scripts sous domoticz j’ai essayé d’implémenter votre script sur ma machine (Windows), mais j’ai l’erreur suivante dans la log domoticz :
2018-12-15 22:24:00.141 Error: EventSystem: in C:\Program Files (x86)\Domoticz\scripts\lua\script_time_vigicrue.lua: …iles (x86)\Domoticz\scripts\lua\script_time_vigicrue.lua:69: attempt to call global ‘O919001001’ (a nil value)
O919001001 est la station que je souhaite pister
Avez vous une idée de ce qui se passe, sachant que j’ai activé debug à true et que je ne vois rien de plus
Merci de votre réponse
Pouvez-vous coller en commentaire le début du script ou se trouve les variables a éditer.
Il me semble qu’il y a une erreur a ce niveau là. Comme si le numéro de la station est une variable.
Bonjour,
J’utilise depuis un moment ce script, mais je n’arrive pas à récupérer la valeur dans un Blockly.
En regardant les logs, je m’aperçois que le retour du script me donne :
– State = X.XX (ex. : 3.91 en ce moment pour la Seine)
– Value = X/X.XX (ex. : 0/3.91 en ce moment pour la Seine)
Du coup, je n’arrive pas à récupérer la valeur dans un Blockly car celle-ci se trouve en réalité dans le State.
Avez-vous une idée pour m’aider ?
Bonjour, alors là, je n’en ai aucune idée, je n’utilise pas blocky.
Je peux essayer de regarder ça. Sinon passer par un script lua ?
Que souhaitez-vous faire ?
Bonjour,
Tout d’abord merci pour votre réponse. J’ai essayé de passer par un script LUA mais j’avoue que je ne suis pas très doué !
Je cherche simplement à récupérer la valeur de la hauteur de la Seine dans une variable utilisateur.
J’ai créé une variable utilisateur TEST et dans le script vigicrue.lua je sais que je dois ajouter l’instruction suivante :
commandArray[‘Variable:TEST’]= ???
Mais je ne sais pas comment récupérer la bonne valeur. A priori elle doit se trouver dans « ResultHeight » mais ceci n’a rien donné :
commandArray[‘Variable:TEST’]= ResultHeight
Je dois sûrement mal m’y prendre 😊
Il faut faire :
commandArray[‘Variable:TEST’]=ResultHeight[#ResultHeight][2]
ça devrait fonctionner, tout dépend du type de ta variable.
A placer au niveau de la ligne 73, avant où après pour la V3 et au niveau de la ligne 62 pour la V2.
Dit moi si ça fonctionne.
Ca marche !! Excellent, merci beaucoup, au top 🙂