Page 1 sur 1

[DzVents] Notification fenêtres ouvertes sur risques météorologiques

Publié : 16 juin 2018, 09:33
par papoo
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 <code>local SubSystem</code> 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 :<code>{domoticz.NSS_TELEGRAM, domoticz.NSS_HTTP}</code>

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

Code : Tout sélectionner

-- 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/
-- 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',
        closeRule = function(device)
        return device.color > 2  -- vert = 0, jaune = 1, orange = 2, rouge = 3
        end
        },
    alerte_pluie = {
        active = true,
        device = 'Alerte Pluie',
        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
}

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

Publié : 09 mai 2020, 21:36
par aspro
Bonjour et tout d'abord merci pour tes scripts, très impressionnants!

J'ai tenté d'installer ton script de prév météo meteofrance, qui marche très bien, j'ai bien les alertes qui remontent dans Domoticz.

Mais, car il y a un mais.. j'ai voulu faire une simple notif par telegram si l'alerte meteo passait en "précipitations fortes'".
Et c'est là que ça se gâte car j'imaginais un simple :
if (devicechanged['Alerte Pluie'] == 'Précipitations fortes') then

objet = 'il va flotter grave' -- Objet du Mail
message = 'come on la grenouille' -- Corps du Mail
notification_Mail(objet, message) -- Appel de la fonction

end
Mais non, ça marche pas ;-/

Ma fonction mail marche bien mais j'ai le sentiment que c'est le test devicechanged qui marche pas.
Snif.
Aurais-tu une idée?

merci !

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

Publié : 09 mai 2020, 21:39
par papoo
un autre petit script qui te permet de ne plus modifier les scripts pour ajouter les notifications, juste modifier le parametrage des devices depuis le dashboard?
je te propose : https://easydomoticz.com/forum/viewtopi ... =17&t=8167

Exemple 11 : être averti si un périphérique Alert dépasse un seuil prédéfini (1,2,3 ou 4)
avec fréquence de notifications en minutes et notification des heures calmes
{
"high_threshold_color": 4,
"frequency_notifications": 60,
"quiet_hours":"23:00-07:15"
}

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

Publié : 09 mai 2020, 22:15
par denis_brasseur
Le script universel de papoo a ma préférence.
Si tu fais :

Code : Tout sélectionner

if devicechanged['Alerte Pluie'] then
 	print(otherdevices['Alerte Pluie'])
end
tu obtiens quoi dans les logs ?

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

Publié : 09 mai 2020, 22:26
par aspro
papoo a écrit : 09 mai 2020, 21:39 un autre petit script qui te permet de ne plus modifier les scripts pour ajouter les notifications, juste modifier le parametrage des devices depuis le dashboard?
je te propose : https://easydomoticz.com/forum/viewtopi ... =17&t=8167

Exemple 11 : être averti si un périphérique Alert dépasse un seuil prédéfini (1,2,3 ou 4)
avec fréquence de notifications en minutes et notification des heures calmes
{
"high_threshold_color": 4,
"frequency_notifications": 60,
"quiet_hours":"23:00-07:15"
}

J'ai regardé, ça a l'air top mais j'ai pas encore le niveau de faire ça ;-)
Je vais étudier le tout pour voir si c'est jouable (pour moi).
Mais là je vois pas trop ce qui coince ;-/
merci en tout cas !

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

Publié : 09 mai 2020, 22:29
par aspro
denis_brasseur a écrit : 09 mai 2020, 22:15 Le script universel de papoo a ma préférence.
Si tu fais :

Code : Tout sélectionner

if devicechanged['Alerte Pluie'] then
 	print(otherdevices['Alerte Pluie'])
end
tu obtiens quoi dans les logs ?
Hum je vais regarder.. Mais pour l'instant je ne trouve pas les logs (je ne m'en suis jamais servi) ; en explorant avec putty le répertoire de domoticz je ne vois rien qui ressemble à des logs.. Et dans l'interface de domoticz je n'ai que les logs des devices, ça ne doit pas être ça dont tu parles ;-/

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

Publié : 10 mai 2020, 16:35
par denis_brasseur
Les logs sont accessible depuis l’interface domoticz via Configuration => Log.
Dans l'onglet Statut, tu auras les résultats de tes print.
Il s'agit bien des logs de tes devices...
Le but est de tester la valeur du device 'Alerte Pluie'

Code : Tout sélectionner

print(otherdevices['Alerte Pluie'])
te permettra de vérifier ta condition ci dessous

Code : Tout sélectionner

if (devicechanged['Alerte Pluie'] == 'Précipitations fortes') then

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

Publié : 10 mai 2020, 17:07
par aspro
denis_brasseur a écrit : 10 mai 2020, 16:35 Les logs sont accessible depuis l’interface domoticz via Configuration => Log.
Dans l'onglet Statut, tu auras les résultats de tes print.
Il s'agit bien des logs de tes devices...
Le but est de tester la valeur du device 'Alerte Pluie'

Code : Tout sélectionner

print(otherdevices['Alerte Pluie'])
te permettra de vérifier ta condition ci dessous

Code : Tout sélectionner

if (devicechanged['Alerte Pluie'] == 'Précipitations fortes') then

Pffff, non mais je vais arrêter de boire moi. Je cherchais bien alambiqué ! ;-/
merci pour cette info à la limite de la révélation depuis le temps que je cherchais.
Je vais juste me mettre la terre sous terre un moment...

Sinon pour le log du coup cela me donne :
2020-05-10 17:04:43.904 Status: LUA: Précipitations faibles
J'ai donc bien le "Précipitations faibles" mais avec un "LUA :" devant.

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

Publié : 10 mai 2020, 17:14
par denis_brasseur
Le LUA devant est normal.
Ta condition sera respectée quand ton device changera de valeur et passera en 'Précipitations fortes'

Code : Tout sélectionner

if (devicechanged['Alerte Pluie'] == 'Précipitations fortes') then

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

Publié : 10 mai 2020, 17:16
par aspro
denis_brasseur a écrit : 10 mai 2020, 17:14 Le LUA devant est normal.
Ta condition sera respectée quand ton device changera de valeur et passera en 'Précipitations fortes'

Code : Tout sélectionner

if (devicechanged['Alerte Pluie'] == 'Précipitations fortes') then
Je vais regarder mais du coup c'est plus clair (en attendant de voir la question du script dans la description du device).
Merci encore !!