Vigicrue v3 beta

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.