Vigicrue V2

11 décembre 2017

Une v3 viens de sortir, ici.

Le site de Vigicrue a changé. Maintenant il utilise du json pour les données.

Un changement qui permet de simplifier tout ça en un seul script lua directement dans Domoticz :

-- Parameters to change according to you needs
debug=false
-- Station ID, from one to many
Station = {'W141001001', 'L800001020'}
-- IDX of sensor for height value | STATION_ID='IDX_SENSOR'
SIDXHeight = {W141001001='215', L800001020='218'}
-- IDX of sensor for speed value | STATION_ID='IDX_SENSOR'
SIDXSpeed = {W141001001='216', L800001020='217'}
-- JSON.lua path
json = (loadfile "/opt/domoticz/scripts/lua/JSON.lua")()
-- Curl path
curl = '/usr/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
-- 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 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
end
commandArray = {}
if (time.min == 0 or time.min == 30) then
    for k,v in pairs(Station) do
        local IDStation = v
        local IDXHeight = SIDXHeight[v]
        local IDXSpeed = SIDXSpeed[v]
        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=getdata(urlHeight,urlSpeed)
 
        if (#ResultHeight ~= 0) then
                if (debug) then print("ResultHeight: "..ResultHeight[#ResultHeight][2]) end
                update(IDXHeight, ResultHeight[#ResultHeight][2])
        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])
        else
                if (debug) then print('Speed is empty.') end
        end

    end
end

return commandArray

Il suffit de modifier le début du script pour ajouter les ID des stations (je vous renvoi sur cette article pour trouver les IDs).

Les variables SIDXHeight et SIDXSpeed permettent de définir les IDX des sensors Domoticz et sont des tableaux.

La clé correspond à l’ID de la station et la valeur à l’IDX Domoticz.

Il faut aussi vérifier l’emplacement de votre fichier JSON.lua qui n’est pas forcement dans /opt/domoticz/scripts/lua.

Amusez-vous bien.

[EDIT] J’ai rajouté une vérification dans le cas ou Vigicrue ne retourne pas de données pour ne pas sortir une erreur dans les logs.

Merci à lamouette sur le forum d’easydomoticz de m’avoir remonter ce cas.

5 commentaires

  • seb vivier 18 avril 2018 à20 h 52 min

    hello, je suis tombé presque par hasard sur votre site.
    je trouve ce script tres interressant, etant à proximité d’une riviere 🙂
    le probleme c’est que je suis un noob absolu en script et bienb sur ça ne fonctionne pas.
    en plus je n’ai pas de remonter d’erreur dans les log, du coup je ne vois pas ou est le probleme.
    voici mon script modifié, pouvez vous me dire le probleme ?

    — Parameters to change according to you needs
    debug=false
    — Station ID, from one to many
    Station = {‘F466000101′}
    — IDX of sensor for height value | STATION_ID=4061
    SIDXHeight = {F466000101=’215′}
    — IDX of sensor for speed value | STATION_ID=4060
    SIDXSpeed = {W141001001=’216’}
    — JSON.lua path
    json = (loadfile « /home/pi/domoticz/scripts/lua/JSON.lua »)()
    — Curl path
    curl = ‘/usr/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
    — 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 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
    end
    commandArray = {}
    if (time.min == 0 or time.min == 30) then
    for k,v in pairs(Station) do
    local IDStation = F466000101
    local IDXHeight = 4061
    local IDXSpeed = 4060
    local urlHeight = ‘https://www.vigicrues.gouv.fr/services/observations.json/index.php?CdStationHydro=F466000101&GrdSerie=H&FormatSortie=simple’
    local urlSpeed = ‘https://www.vigicrues.gouv.fr/services/observations.json/index.php?CdStationHydro=F466000101&GrdSerie=Q&FormatSortie=simple’
    ResultHeight,ResultSpeed=getdata(urlHeight,urlSpeed)

    if (#ResultHeight ~= 0) then
    if (debug) then print(« ResultHeight: « ..ResultHeight[#ResultHeight][2]) end
    update(IDXHeight, ResultHeight[#ResultHeight][2])
    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])
    else
    if (debug) then print(‘Speed is empty.’) end
    end

    end
    end

    return commandArray

    merci par avance de votre aide 🙂

  • seb vivier 18 avril 2018 à20 h 53 min

    quel est la commande pour acceder au crontab et quoi mettre dedans ?

  • seb vivier 18 avril 2018 à22 h 11 min

    de nouveau moi,
    ça fonctionne parfaitement, j’ai un peu chercher mais j’ai fini par trouver 🙂
    maintenant je m’attaque au miflora 🙂

    • simon 18 avril 2018 à22 h 23 min

      Du coup je n’ai pas eu le temps de répondre 🙂
      Parfait du coup.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.