Prévision de pluie en lua

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 <\>.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Prévision de pluie en lua

Message par vil1driver »

Probablement car tu n'as pas installé curl.
De plus dans le script il manque le chemin vers curl qu'il faudra ajouter comme ceci

Code : Tout sélectionner

local curl = 'chemin\vers\curl '-- ne pas oublier l'espace à la fin du chemin  
Et modifier cette ligne

Code : Tout sélectionner

local config=assert(io.popen('curl http://www.meteofrance.com/mf3-rpc-portlet/rest/pluie/'..CityCode..'.json'))
En ceci

Code : Tout sélectionner

local config=assert(io.popen(curl.. 'http://www.meteofrance.com/mf3-rpc-portlet/rest/pluie/'..CityCode..'.json'))
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Prévision de pluie en lua

Message par stephdes »

OK merci

J'ai mis ceci :

local debugging = true -- true pour voir les logs dans la console log Dz ou false pour ne pas les voir
local CityCode = 71xxx
local text_idx = 15 -- renseigner l'id du device text associé si souhaité, sinon nil
local rain_alert_idx = nil -- renseigner l'id du device alert associé si souhaité, sinon nil
local send_notification = 1 -- 0: aucune notification, 1: toutes, 2: précipitations faibles, modérées et fortes, 3: modérées et fortes, 4: seulement fortes
local curl = 'G:\\curl\\ ' -- ne pas oublier l'espace à la fin du chemin

et ceci :

now=os.date("*t")
if now.min % 1 == 0 then
print('script_time_meteofrance_pluie.lua')
json = (loadfile "G:\\Program Files (x86)\\Domoticz\\scripts\\lua\\JSON.lua")() -- For Linux
--json = (loadfile "D:\\Domoticz\\scripts\\lua\\json.lua")() -- For Windows


local indexArray=0


local config=assert(io.popen(curl.. 'http://www.meteofrance.com/mf3-rpc-port ... de..'.json'))
local location = config:read('*all')
config:close()
local jsonLocation = json:decode(location)


local niveauPluieText={}
niveauPluieText = jsonLocation.niveauPluieText
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Prévision de pluie en lua

Message par stephdes »

et j'obtiens ceci :

2016-10-11 10:16:00.133 Error: EventSystem: in G:\Program Files (x86)\Domoticz\scripts\lua\script_time_meteofrance_pluie.lua: ...)\Domoticz\scripts\lua\script_time_meteofrance_pluie.lua:50: attempt to index local 'jsonLocation' (a nil value)




Je me demande si ce n'est pas la version du JSON.lua qui pose problème

(c'est la dernière du 16/09)
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Prévision de pluie en lua

Message par vil1driver »

ça devrait selon moi plutôt ressembler à ceci

Code : Tout sélectionner

local curl = 'G:\\curl-7.50.3-win32-mingw\\bin\\curl.exe '
https://bintray.com/artifact/download/v ... 2-mingw.7z
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: Prévision de pluie en lua

Message par stephdes »

Oh punaise Vil1driver tu es trop fort !!!

J'ai passé beaucoup de temps dessus sans succès !!!

Je n'avais pas télécharger le bon curl... Nickel ! je te remercie vivement !!!

En même temps, l'histoire du curl je ne l'avais lu nulle part...
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
jml
Messages : 24
Inscription : 08 janv. 2016, 22:18

Re: Prévision de pluie en lua

Message par jml »

Bonjour,

Voici ma version de ce script.

La nouveauté est qu'il calcule dans combien de minutes il va pleuvoir et qu'il l'annonce par synthèse vocale. Pour cela, il s'exécute toutes les 5 minutes.

Et le script est là : https://github.com/jmleglise/mylittle-d ... nPluie.lua

et utilise la librairie : https://github.com/jmleglise/mylittle-d ... My_Library

Code : Tout sélectionner

--[[   
~/domoticz/scripts/lua/script_time_PrevisionPluie.lua

OBJET :
Annonce dans combien de minutes il va pleuvoir, basé sur l'API de prévision pluie dans l'heure de météofrance :
- sur un device Alert : "Pluie forte dans 15 minutes"
- par mail
- par pushNotification
- par annonce Vocale : Je vous dérange pour vous prévenir qu'une pluie 'forte' est annoncée par météo france dans '35' minutes.

REQUIS :
device type : Alert , Nom :"Alerte Pluie dans l'heure"

ORIGIN  :
https://easydomoticz.com/prvision-pluie/
https://easydomoticz.com/forum/viewtopic.php?f=10&t=1991

API :
http://www.meteofrance.com/mf3-rpc-portlet/rest/pluie/920630
http://www.meteofrance.com/mf3-rpc-portlet/rest/lieu/facet/pluie/search/rueil-malmaison

FONCTIONNEMENT :
Toutes les 5 minutes , interroge l'API meteoFrance de prévision de pluie dans l'heure

Parcours les 12 cadrans :
Trouve l'heure de la 1er pluie
Trouve l'intensité la plus forte de l'heure 
Avec   jsonPrevision.dataCadran[n].niveauPluie
    1 = Pas de précipitation
    2=faible
    3=modéré
    4=forte

met à jour le device : "Alerte Pluie dans l'heure"
alerte par :  mail, push notif, synthese vocale
Annonce vocale : seulement une annonce vocale , toutes les 3heures.

]]--
-- --------------------------------
------ Paramètres à éditer ------
--------------------------------
local CITY_CODE = 920630  -- Le code de votre ville est l'ID retourné par cette URL : http://www.meteofrance.com/mf3-rpc-portlet/rest/lieu/facet/pluie/search/nom de votre ville
local RAIN_ALERT_IDX = 137  -- renseigner l'id du device alert associé si souhaité, sinon nil
local NOTIFICATION_PUSH = true
local NOTIFICATION_MAIL = true
local NOTIFICATION_VOCAL = true
local EMAIL = 'leglise@xxxx.com'  -- adresse mail, séparées par ; si plusieurs

---------------------------------------------------------------------------
--Fonctions
---------------------------------------------------------------------------
package.path = package.path .. ';' .. '/home/pi/domoticz/scripts/lua/?.lua'
My = require('My_Library')

---------------------------------------------------------------------------
commandArray = {}
now = os.date("*t")
if now.min % 5 == 0 then
    print('--- --- --- script_time_meteofrance_pluie.lua ---')
    json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()

    local config = assert(io.popen('curl http://www.meteofrance.com/mf3-rpc-portlet/rest/pluie/' .. CITY_CODE .. '.json'))
    local fileContent = config:read('*all')
    config:close()
    local jsonPrevision = json:decode(fileContent)

    rainLevel = 0
    when = 0
    data = jsonPrevision.dataCadran
    for i = 1, 12 do
        if data[i].niveauPluie > 1 and when == 0 then
            -- Find the first time that the rain is announced
            when = i
        end
        if data[i].niveauPluie > rainLevel then
            -- Find the maximum level of rain announced
            rainLevel = data[i].niveauPluie
        end
    end
    
    if rainLevel == 0 then
        commandArray[#commandArray + 1] = { ['SendEmail'] = 'Domoticz Anomalie#' .. os.date("%H:%M") .. ' -- Anomalie dans le script : script_time_PrevisionPluie.lua<br> L\'Api de meteoFrance renvoie un JSON inattendu. niveauPluie n\'est pas correct (devrait être de 1 à 4)<br>Contenu du Json : -------------<br>' .. fileContent .. '#' .. EMAIL }
    elseif rainLevel == 1 then
        if otherdevices_svalues["Alerte Pluie dans l\'heure"] ~= "Pas de pluie dans l\'heure" then
            -- Don't update the device if there is no change. (so that don't change the timestamp of the devie)
            commandArray[#commandArray + 1] = { ['UpdateDevice'] = RAIN_ALERT_IDX .. "|1|Pas de pluie dans l\'heure" }
        end
    else
        if when == 1 then
            whenText = " maintenant"
        else
            whenText = " dans " .. tostring(when * 5) .. " minutes"
        end

        if rainLevel == 2 then
            rainLevelText = "légère"
        elseif rainLevel == 3 then
            rainLevelText = "modérée"
        elseif rainLevel == 4 then
            rainLevelText = "forte"
        end

        commandArray[#commandArray + 1] = { ['UpdateDevice'] = RAIN_ALERT_IDX .. '|' .. rainLevel .. '|Pluie ' .. rainLevelText .. whenText }
        if My.Time_Difference(otherdevices_lastupdate["Alerte Pluie dans l\'heure"]) > 3 * 60 * 60 then
            if NOTIFICATION_VOCAL == true and now.hour > 8 and now.hour <= 20 then
                My.Speak("Je vous dérange pour vous prévenir qu\'une pluie " .. rainLevelText .. " est annoncée par méteo france" .. whenText, "normal")
            end
            if NOTIFICATION_PUSH == true then
                commandArray[#commandArray + 1] = { ['SendNotification'] = 'Alerte Pluie#Pluie ' .. rainLevelText .. whenText }
            end
            if (DEBUG_MODE) then
                commandArray[#commandArray + 1] = { ['SendEmail'] = 'JSON Alerte Pluie#' .. os.date("%H:%M") .. ' -- Api de meteoFrance <br>Contenu du Json : -------------<br>' .. fileContent .. '#' .. EMAIL }
            end
        end
    end
end --if now.min
return commandArray
Mes scripts: github.com/jmleglise
Mon équipement: RFXTRX433E Volet et portail Somfy RTS, chacon IO, Oregon, PIR PT2262 / KMTronic USB relay/Z-WAVE Chinese Neo CoolCam
Mon dernier projet: ma maison location de vacances à Ouistreham sur la plage
Répondre