DZVents : Notification fenêtres ouvertes sur risques météorologiques

Lors de cette période d’aussi forts que soudains orages laisser une fenêtre ouverte, surtout si c’est une fenêtre de toit, peut s’avérer catastrophique.
Pour tenter d’éviter ce problème je vous propose un script DZvents pour domoticz.


Son principe :
vous définissez des seuils pour chacune des sondes que vous souhaitez utiliser. Si vous ne disposez pas de sondes physiques pour remplir cette mission, vous pouvez utiliser les sondes virtuelles de Forecast.io par exemple.
Cinq devices sont utilisable et définissable dans le tableau local sensors : le vent (vitesse et rafale), la pluie, les prévisions de pluie, Alerte météo et alerte pluie.
Trois paramètres sont personnalisable :

  • active => true (pour prendre en compte le capteur) ou false (pour l’ignorer)
  • device => Le nom du device tels qu’il est déclaré dans domoticz
  • closeRule => le ou les seuils à prendre en compte
  • Ensuite déclarez le(s) nom(s) des devices surveillant l’ouverture de vos fenêtres, pour ma part, des contacts xiaomi
    Ce script utilise les données persistantes de DZvents, pour « mémoriser » si le script à déjà envoyé une notification pour le risque en cours, afin de ne pas vous envoyer une notification par minute. Merci à waaren pour cela.
    pour une notification via un ou plusieurs sous système de notification, personnalisez la variable local SubSystem Les Systèmes de notification disponibles sont :

  • domoticz.NSS_GOOGLE_CLOUD_MESSAGING
  • domoticz.NSS_HTTP
  • domoticz.NSS_KODI
  • domoticz.NSS_LOGITECH_MEDIASERVER
  • domoticz.NSS_NMA
  • domoticz.NSS_PROWL
  • domoticz.NSS_PUSHALOT
  • domoticz.NSS_PUSHBULLET
  • domoticz.NSS_PUSHOVER
  • domoticz.NSS_PUSHSAFER
  • Pour une notification sur plusieurs systèmes, séparez les systèmes par une virgule et entourez l’ensemble par des {}. Exemple :{domoticz.NSS_TELEGRAM, domoticz.NSS_HTTP}

    Quatre niveaux de logging sont définissable : (Seulement un niveau peut être actif; commenter les autres)
    domoticz.LOG_INFO
    domoticz.LOG_ERROR
    domoticz.LOG_DEBUG
    domoticz.LOG_MODULE_EXEC_INFO

    le script complet

    -- v1.00 Auteur papoo 
    -- https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/fenetres_ouvertes.lua
    -- https://pon.fr/dzvents-notification-fenetres-ouvertes-sur-risques-meteorologiques/
    -- https://easydomoticz.com/forum/viewtopic.php?f=17&t=6649
    
    -- Définir tous les capteurs et les seuils qui doivent être pris en compte pour la notification des fenêtres restées ouvertes 
    local sensors = {
    
        vent = {
            active = true,
            device = 'Anémomètre',
            closeRule = function(device)
            return device.speed >= 50 or device.gust >= 100   -- vitesse et rafale
            end
            },
        pluie = {
            active = true,
            device = 'Pluviometre',
            closeRule = function(device)
            return device.rainRate > 0
            end
            },
        probabilite_pluie = {
            active = true,
            device = 'Proba Pluie 1h', -- Ce doit être un capteur virtuel de type "pourcentage"
            closeRule = function(device)
            return device.percentage > 30
            end
            },
        alerte_meteo = {
            active = false,
            device = 'Vigilance Météo', -- Ce doit être un capteur virtuel de type "Alerte"
            closeRule = function(device)
            return device.color > 2  -- vert = 0, jaune = 1, orange = 2, rouge = 3
            end
            },
        alerte_pluie = {
            active = true,
            device = 'Alerte Pluie', -- Ce doit être un capteur virtuel de type "Alerte"
            closeRule = function(device)
            return device.color > 1
            end
            }
     
    }
    local FENETRES = { 'fenetre douche', 'fenetre 1'} 
    --local FENETRES = { 'fenetre*'} 
    local SubSystem =   nil --domoticz.NSS_TELEGRAM --domoticz.NSS_PUSHBULLET 
                        --[[ Systèmes de notification disponibles :
                            NSS_GOOGLE_CLOUD_MESSAGING NSS_HTTP NSS_KODI NSS_LOGITECH_MEDIASERVER NSS_NMA NSS_PROWL NSS_PUSHALOT NSS_PUSHBULLET NSS_PUSHOVER NSS_PUSHSAFER
                            Pour une notification sur plusieurs systèmes, séparez les systèmes par une virgule et entourez l'ensemble par des {}.
                            Exemple :{domoticz.NSS_TELEGRAM, domoticz.NSS_HTTP}
                        --]]
    local message = '.'
    
    return {
        active = true,
        on = {
        timer = {'every minute'}
        },
        logging = {
            level = domoticz.LOG_INFO,                                             -- Seulement un niveau peut être actif; commenter les autres
            -- level = domoticz.LOG_ERROR,
            -- level = domoticz.LOG_DEBUG,
            -- level = domoticz.LOG_MODULE_EXEC_INFO,
        marker = 'NOTIFICATION FENETRES OUVERTES  '
        },
        data    =   {   state                 = { initial = ""                  }},    -- thanks waaren for persistent data notification
                            
        execute = function(domoticz, _)
        local conditionDeviceState              = "Off"        
        -- FUNCTIONS
        local function notification(fenetre, message)
    
                domoticz.log("État state avant notif : "  .. domoticz.data.state,domoticz.LOG_DEBUG)
                domoticz.log("État condition avant notif : "  .. conditionDeviceState,domoticz.LOG_DEBUG)
                if conditionDeviceState ~= domoticz.data.state then
                    domoticz.log("Envoi de la notification ",domoticz.LOG_INFO)
                    if SubSystem == nil then 
                        domoticz.notify(fenetre, message)
                    else
                        domoticz.notify(fenetre, message, '', '', '', SubSystem)
                    end 
                    domoticz.log(message, domoticz.LOG_INFO)
                    domoticz.data.notificationSent = domoticz.time.raw      -- Store time of notification 
                    domoticz.data.state = "On"
                else
                    domoticz.log("Aucune notification à envoyer pour le moment",domoticz.LOG_INFO)        
                end
        end
        -- démarrage programme
    
    local fenetres = domoticz.devices().filter(FENETRES)
    fenetres.forEach(function(fenetre)
    domoticz.log('état '.. fenetre.name ..' : ' .. fenetre.state, domoticz.LOG_DEBUG)
    if fenetre.state == "On" or fenetre.state == "Open" then  
    
        for sensorType, sensor in pairs(sensors) do
            if (sensor['active'] == true) then
                local device = domoticz.devices(sensor['device'])
                local closeRule = sensor['closeRule']
                domoticz.log('Checking sensor: ' .. sensorType, domoticz.LOG_DEBUG)
                if (closeRule(device)) then
                    domoticz.log(sensorType .. ' seuil dépassé', domoticz.LOG_INFO)
                    domoticz.log('attention '.. fenetre.name ..' est resté ouverte', domoticz.LOG_INFO)
                    conditionDeviceState = "On"
                    notification('attention ',fenetre.name..' est resté ouverte ' .. sensorType .. ' seuil dépassé') 
    
                    -- Retour anticipé au script en cas de seuil dépassé
                    return
                end
            else
                domoticz.log('Sonde non active ignorée : ' .. sensorType, domoticz.LOG_DEBUG)
            end
        end
    end    
    end)-- forEach
    
                if domoticz.data.state ~= conditionDeviceState then   -- il y a changement d'état?
                   domoticz.data.state = conditionDeviceState
                else
                domoticz.log("Reset state non nécessaire",domoticz.LOG_DEBUG)
                end
                domoticz.log("État state: "  .. domoticz.data.state,domoticz.LOG_DEBUG)
                domoticz.log("État condition: "  .. conditionDeviceState,domoticz.LOG_DEBUG)    
    
    end
    }
    

    retrouver la dernière version de ce script sur



     Site Officiel :   github.com

    Laisser un commentaire