Vigicrue v3 beta

12 janvier 2018

Voici une nouvelle version pour le script Vigicrue.

Suite à une demande de balajol sur le forum d’easydomoticz, j’ai rajouter la possibilité d’être notifié.

J’ai fait le test de mettre une notification sur le sensor Domoticz et ça ne semble pas fonctionner.

Du coup je l’ai ajouté dans le script, j’ai modifié la façon de le configurer aussi.

Dans un premier temps, il faut construire le fichier de configuration au format json.

J’ai mis sur github trois fichiers de conf différents pour le moment, un pour une station, un pour deux stations et pour trois stations.

Si vous voulez une exemple de fichier de conf pour plus de deux stations, je peux vous le faire, demandez moi.

 

Voici à quoi un fichier de configuration ressemble (je pars sur le deux stations comme c’est celui que j’utilise) :

{
  "station": [
    "L800001020",
    "W141001001"
  ],
  "idx": {
    "height": {
      "L800001020": "218",
      "W141001001": "215"
    },
    "speed": {
      "L800001020": "217",
      "W141001001": "216"
    }
  },
  "notifications": {
    "height": {
      "W141001001": {
        "channel": "telegram",
        "value": "2",
        "active": "true"
      },
      "L800001020": {
        "channel": "telegram",
        "value": "1",
        "active": "true"
      }
    },
    "speed": {
      "W141001001": {
        "channel": "telegram",
        "value": "100",
        "active": "true"
      },
      "L800001020": {
        "channel": "telegram",
        "value": "140",
        "active": "true"
      }
    }
  }
}

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.

12 commentaires

  • Laurent.C 23 janvier 2018 à10 h 18 min

    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.

    • simon 23 janvier 2018 à10 h 39 min

      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.

  • Laurent.C 24 janvier 2018 à10 h 18 min

    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,

    • simon 25 janvier 2018 à9 h 29 min

      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 »
      }
      },

  • Laurent.C 25 janvier 2018 à9 h 48 min

    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.

  • Laurent.C 25 janvier 2018 à9 h 49 min

    Et oui, il s’agit d’un Linux debian.

  • laurent C 25 janvier 2018 à20 h 04 min

    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!

    • simon 25 janvier 2018 à21 h 41 min

      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.

  • Choisy 15 décembre 2018 à22 h 33 min

    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

    • simon 15 décembre 2018 à22 h 47 min

      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.

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.