papo-o / domoticz_scripts

DZvents, LUA, Python and Shell scripts for Domoticz
https://pon.fr
38 stars 36 forks source link

Amelioration Script Store automatique #8

Open deennoo opened 4 years ago

deennoo commented 4 years ago

Bon boulot ce script !

https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/store.lua

Je te propose de l'améliorer.

En effet tu peux avoir le store baisser mais le soleil n'est pas encore a un niveau genant, et tu attends que ce soit la nuit pour le fermer, alors que pour un store orienté SUD l azimute du soleil est entre 80° et 270°

On peut aussi prendre en compte la tendance donnée par un baromètre et le couverture nuageuse

Enfin dans un mode automatique il peut être intéressant de programmer une tempo qui arrete le store a un certain niveau d ouverture

ci joint mon script LUA qui peu servir d'exemple

store auto.zip

papo-o commented 4 years ago

Bonjour deenoo merci pour ces voies de progrès. je vais y réfléchir Tes devices couverture nuageuse et position du soleil sont de type custom?

papo-o commented 4 years ago

je ne sais pas faire des prédictions sur la base d'une pression atmosphérique, je te laisse m'indiquer tes règles de remontée ou interdiction descente. Pour le reste je te propose de tester le script suivant dans lequel j'ai ajouter le timer de descente et 3 devices :

-- v1.00 Auteur Remb0 https://gadget-freakz.com/2018/04/make-you-sunscreen-smart-with-dzvents-scripting/ -- v1.1 papoo traduction, suppression log csv, ajout notifications subsystem... --v1.21 papoo, ajout devices et timer

-- Définir tous les capteurs qui doivent être pris en compte pour la fermeture du store local sensors = { temperature = { active = true, device = 'Temperature exterieure', closeRule = function(device) return device.temperature <= 22 end }, deltaT = { active = false, device = 'Delta T interieur Exterieur', closeRule = function(device) return device.temperature < 2 end }, asimut = { active = false, device = 'Azimut Soleil', closeRule = function(device) return device.data <= 80 and device.data >= 270 end }, cloudCover ={ active = false, device = 'Couverture nuageuse', closeRule = function(device) return device.data >= 50 end },

wind = {
    active = true,
    device = 'Anémomètre',
    closeRule = function(device)
    return device.speed >= 50 or device.gust >= 150
    end
    },
rain = {
    active = true,
    device = 'Pluviomètre',
    closeRule = function(device)
    return device.rainRate > 0
    end
    },
rainExpected = {
    active = false,
    device = 'IsItGonnaRain', -- Ce doit être un capteur virtuel de type "pourcentage"
    closeRule = function(device)
    return device.percentage > 15
    end
    },
uv = {
    active = true,
    device = 'UV Index',
    closeRule = function(device)
    return device.uv <= 2
    end
    },
lux = {
    active = false,
    device = 'Lux',
    closeRule = function(device)
    return device.lux <= 500
    end

    }

}

local sunscreenDevice = 'Store' -- Définissez le nom de votre périphérique d'écran solaire (type on/off ou blind) local dryRun = 'Y' -- Activer ce mode de fonctionnement (Y) pour tester le script de protection solaire sans activer réellement le store local timeDown = 40 local manualOverrideSwitch = 'presences'-- Définissez le nom d'un commutateur virtuel que vous pouvez utiliser pour désactiver le script d'automatisation du store. -- Définir sur false pour désactiver cette fonctionnalité local timeBetweenOpens = 30 -- Minutes à attendre après la fermeture du store avant de l'ouvrir à nouveau. local notification = "Y" -- (Y) Active les notifications, (N) les désactive local SubSystem = domoticz.NSS_TELEGRAM--[[ 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 = 'STORE v1.21 ' }, execute = function(domoticz)

-- FUNCTIONS

local function switchOn(sunscreen, message)
    if (sunscreen.state == 'Closed' or sunscreen.state == 'Off') then
        if dryRun == 'N' then
            sunscreen.switchOn().forSec(timeDown)
            if notification == "Y" then
                if SubSystem == nil then 
                    domoticz.notify('Store', message)
                else
                    domoticz.notify('Store', message, '', '', '', SubSystem)
                end 
            end
        end
        domoticz.log(message, domoticz.LOG_INFO)
    else
        domoticz.log('Le store est déjà baissé' , domoticz.LOG_INFO)
    end
end

local function switchOff(sunscreen, message)
    if (sunscreen.state == 'Open' or sunscreen.state == 'On') then
        if dryRun == 'N' then
            sunscreen.switchOff()
            if notification == "Y" then
                if SubSystem == nil then 
                    domoticz.notify('Store', message)
                else
                    domoticz.notify('Store', message, '', '', '', SubSystem)
                end 
            end
        end
        domoticz.log(message, domoticz.LOG_INFO)
    end
end

-- PROGRAM STARTS

if (manualOverrideSwitch and domoticz.devices(manualOverrideSwitch).state == 'On') then
    domoticz.log('Le script store automatique est désactivé manuellement', domoticz.LOG_DEBUG)
    return
end

local sunscreen = domoticz.devices(sunscreenDevice)
-- Le store doit toujours être remonté pendant la nuit
if (domoticz.time.isNightTime) then
    switchOff(sunscreen, 'Fermeture du store, c\'est la nuit')
    message = 'Fermeture du store, c\'est la nuit'
    return
end
-- Check all sensor tresholds and if any exeeded close sunscreen
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
            switchOff(sunscreen, sensorType .. ' seuil dépassé, remontée du store')
            domoticz.log(sensorType .. ' seuil dépassé', domoticz.LOG_DEBUG)
            message = (sensorType .. ' seuil dépassé')
            -- Return early when we exeed any tresholds
            return
        end
    else
        domoticz.log('Sonde non active ignorée : ' .. sensorType, domoticz.LOG_DEBUG)
    end
end

-- Tous les seuils sont corrects, le store peut être abaissé
domoticz.log('Dernière action du store (en minutes) : ' .. sunscreen.lastUpdate.minutesAgo, domoticz.LOG_DEBUG)
domoticz.log('Minutes à attendre après la fermeture du store avant de l\'ouvrir à nouveau : ' .. timeBetweenOpens, domoticz.LOG_DEBUG)
if (sunscreen.lastUpdate.minutesAgo > timeBetweenOpens) then
    message = 'Le soleil brille, tous les seuils sont corrects, abaissement du store'
    switchOn(sunscreen, message)
end

end }

deennoo commented 4 years ago

Bonjour deenoo merci pour ces voies de progrès. je vais y réfléchir Tes devices couverture nuageuse et position du soleil sont de type custom?

Position du soleil : azimute et elevation : du custom effectivement Couverture Nuageuse : %

deennoo commented 4 years ago

je ne sais pas faire des prédictions sur la base d'une pression atmosphérique, je te laisse m'indiquer tes règles de remontée ou interdiction descente.

Pour cela je check un barometre et les valeurs vennant de l api :

https://www.domoticz.com/wiki/Domoticz_API/JSON_URL's#Barometer

`The above sets the parameters for a Barometer device from hardware type 'General' IDX = id of your device (This number can be found in the devices tab in the column "IDX") BAR = Barometric pressure BAR_FOR = Barometer forecast

Barometer forecast can be one of: 0 = Stable 1 = Sunny 2 = Cloudy 3 = Unstable 4 = Thunderstorm`

ce que je viens regarder dans mon script avec ces lignes commençant en 64

`--tendance nuageuse --print("---") --print("aujourd hui") Temp, Hum, conf, baro, tendance = otherdevices_svalues['Prevision Meteo']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") Temp = tonumber(Temp) Hum = tonumber(Hum) conf = tonumber(conf) baro = tonumber(baro)

tendance = tonumber(tendance) print("Tendance : " ..tendance)`

papo-o commented 4 years ago

Nous ne nous sommes pas compris. ok pour utiliser les données d'un baromètre, ça ne pose aucun problème. ma question était plutôt : quels est(sont) le(s) seuil(s) pertinent pour empêcher le store de descendre et/ou le faire remonter. cloudy ou unstable étant un peu trop vague pour faire un automatisme pertinent.

deennoo commented 4 years ago

Pour le Baro : dans mon script j'utilise : (tendance < 3) Combiné a une couverture Nuageuse : (nuage <= 50 )

Cela fait un moment que j'utilise ce script avec ce type de valeur seuil, ensuite cela peut etre des variable perso a chacun (comme la position du soleil).

Enfin j'utilise un override : Store Auto (de type on/off) afin de prendre la main sur le store (plus facile que presence qui est lier a des telephones sur le wifi, ou des badges en ble).

Quand store auto : On alors le script s'execute, si je le passe a Off, je pilote le store comme je le souhaite (utile la nuit tombé si le store a un eclairage integrer pour la terrasse) Ce switch passe également a Off si il n y a plus de presence detecté via un script lié a l alarme.

deennoo commented 4 years ago

Presque nickel cette version du script mais :

Lorsque l'on passe un STOP sur un volet ou store, domoticz ensuite le passé en fermé et donc le script de fermeture auto ne fonctionne pas.

C'était déjà le cas en lua.

J'avais donc ajouter un détecteur d'ouverture sur les bras et dans le script je me sert de ce détecteur pour savoir si le store est ouvert ou fermer (alors que ton script utilise l'etat du store).

Je vais essayer de rajouter cette variable dans le script, l'autre solution étant : après avoir dit stop After 40 de faire un device update : on pour remettre le store en mode ouvert