Domoticz

Installation sous Debian en utilisant docker compose (source : https://github.com/domoticz/domoticz-docker) :

version: "3.7"
services:
domoticz:
image: domoticz/domoticz
container_name: domoticz
restart: unless-stopped
# Pass devices to container
# devices:
# - "/dev/serial/by-id/usb-0658_0200-if00:/dev/ttyACM0"
ports:
- "8084:8080"
volumes:
- ./config:/opt/domoticz/userdata
environment:
- TZ=Europe/Amsterdam
#- LOG_PATH=/opt/domoticz/userdata/domoticz.log

Serveur MQTT

Installation sous Debian en utilisant docker compose :

version: "3.7"
services:
mosquitto:
image: eclipse-mosquitto
container_name: mosquitto
restart: unless-stopped
ports:
- "1883:1883"
- "9001:9001"
volumes:
- /docker/mosquitto/config:/mosquitto/config/:rw
- /docker/mosquitto/data:/mosquitto/data/:rw
- /docker/mosquitto/log:/mosquitto/log/:rw

Créer les fichiers mosquitto.conf password.txt dans le répertoire config :

Exemple de fichier mosquitto.conf (avec l’authentification activée. Sinon, commenter les lignes) :

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883
## Authentication ##
allow_anonymous false
password_file /mosquitto/config/password.txt

Créer un fichier password.txt vide :

touch config/password.txt

Démarrer le container :

docker-compose up -d

Créer le premier user/password, puis redémarrer le container pour prise en compte :

docker-compose exec mosquitto mosquitto_passwd -c /mosquitto/config/password.txt vanhaelen_Domoticz
docker-compose restart

Ajouter un user/password, puis redémarrer le container pour prise en compte :

docker-compose exec mosquitto mosquitto_passwd -b /mosquitto/config/password.txt vanhaelen_Device AZERTYPASSWORDTOALLOCATE
docker-compose restart

Autres commandes utiles :

docker-compose stop
docker-compose down
docker logs mosquitto
docker logs -f mosquitto
tail -f log/mosquitto.log

Config Domoticz

Relier Domoticz au serveur MQTT

Aller dans le menu Setup/Hardware,
Entrer le nom dans le champ Name: « Mosquitto »,
Puis choisir le type « MQTT Client Gateway with LAN interface »
Dans « Remote Address » mettre l’adresse IP du serveur Mosquitto
Entrer un username et mot de passe précédemment définis dans le serveur Mosquitto.
Voir dans le log du serveur si la connexion est correctement établie (commande tail -f log/mosquitto.log)

Ajout d’un switch Sonoff reflashé Tasmota

Création nouveau matériel pour Sonoff sous Tasmota (source : https://www.lprp.fr/2019/12/sonoff-basic-sous-domoticz-avec-tasmota/ ) :

Aller dans le menu Setup/Hardware,
Entrer le nom dans le champ Name: « Sonoff »,
Puis choisir le type « Dummy (Does nothing, use for virtual switches only) »,
Cliquer sur Add.

Déclarer le serveur MQTT dans le switch Sonoff sous Tasmota :

Dans le menu configuration/configure Domoticz, entrer les id :
– dans le champ « idx 1 » : mettre celui du switch relevé dans Domoticz,
– dans le champ  » Sensor idx 2 Temp,Hum », mettre celui du capteur d’humidité/température.
Voir dans le log du serveur si la connexion est correctement établie (commande tail -f log/mosquitto.log)

Favoris pour le dashboard

Configuration Domoticz

Setup/Settings :
– onglet system: menus réduits et entrer localisation.
– onglet log history : log total de 365 jours, détaillé de 7 jours.
– onglet email : entrer from/to/server et cocher « Sends error ».

logo de VMC en ventilateur

Script de commutation de VMC pour douche

Créer les variables dans Domoticz, à l’adresse http://adresseserveurdomoticz/#/UserVariables. Toutes les variables sont de type integer et à initialiser à la valeur 0 :

TEST_MODE_HUMVAR
fanFollowsProgram
fanMaxTimer
targetFanOffHumidity
humidityTmin10
humidityTmin5
humCounter

Mettre en place le script dans le menu Setup/More Options/Events, cliquer sur le « + », puis Lua, puis « All (commented »). Y coller le script suivant :

--[[
    This script controls the humidity in a typical bathroom setting by detecting
    relative rises in humidity in a short period.
    Of course it requires a humidity sensor and a binary switch controlling a fan/ventilator.
    (there is no provision for variable speed ventilators here!)

    How it works (assuming the default constants as defined below):
    Save the script as time triggered!!

    Every 5 minutes a reading is done.
    Every reading is stored together with the previous reading in two user variables (humidityTmin5 and humidityTmin10).
    So it has two reading stored over the past 10 minutes.
    It then takes the lowest of the two and compares it with the current reading and calculates a delta.
    If the delta is 3 or higher (see constants) then the fan will be turned on, it calculates the target humidity and the 'humidity-decrease program' is started (fanFollowsProgram=1).
    From then on, every 5 minutes the current humidity is compared to the stored target humidity. Basically if that target is reached, the fan is turned off and the 'program' is ended.
    Of course, it is possible that the target is never reached (might start raining outside or whatever).
    Then there is a failsafe (FAN_MAX_TIME) after which the ventilator will be turned off.
 
    Also, it will detect if the ventilator is manually switched off during a program or when it is switched on before the program starts.

    Along the lines it prints to the log and sends notifications but of course you can turn that off by removing those lines.

--]]

commandArray = {}

-- adjust to your specific situation

-- devices
local FAN_NAME = 'VMC-SPEED'              -- exact device name of the switch turning on/off the ventilator
local SENSOR_NAME = 'VMC-HUM-TEMP'        -- exact device name of the humidity sensor
 
-- script constants
local SAMPLE_INTERVAL = 5                 -- time in minutes when a the script logic will happen
local FAN_DELTA_TRIGGER = 3               -- rise in humidity that will trigger the fan
local FAN_MAX_TIME = 15                   -- maximum amount of sample cycles the fan can be on, in case we never reach the target humidity
local TARGET_OFFSET = 5                   -- ventilator goes off if target+offset is reached (maybe it takes too long to reach the true target due to wet towels etc)
local LABEL = 'VMC Bruxelles - '

-- test / debug
local TEST_MODE = false                   -- when true TEST_MODE_HUMVAR is used instead of the real sensor
local TEST_MODE_HUMVAR = 99              -- fake humidity value, give it a test value in domoticz/uservars
local PRINT_MODE = true                  -- Any other value as false or nil will print output to log and send notifications

if PRINT_MODE then
    print(LABEL .. '###### Start' )
end

-- Function added to overcome compatibility problem between Lua version 5.2 an 5.3
local function toInteger(str)
    return math.floor(str)
end

-- get the global variables:
-- this script runs every minute, humCounter is used to create SAMPLE_INTERVAL periods
local current
local humCounter = toInteger(uservariables['humCounter'])
local humidityTmin5 = toInteger(uservariables['humidityTmin5'])                -- youngest reading
local humidityTmin10 = toInteger(uservariables['humidityTmin10'])              -- oldest reading
local targetFanOffHumidity = toInteger(uservariables['targetFanOffHumidity'])  -- target humidity
local fanMaxTimer = toInteger(uservariables['fanMaxTimer'])
local fanFollowsProgram = toInteger(uservariables['fanFollowsProgram'])        -- marker indicating that the decrease program is started

local target = 0 -- will hold the target humidity when the program starts

-- get the current humidity value
if (TEST_MODE) then
    current = toInteger(uservariables['TEST_MODE_HUMVAR'])
else
    current = toInteger(otherdevices_humidity[SENSOR_NAME])
end

-- check if the sensor is on or has some weird reading
if (current == 0 or current == nil) then
    print(LABEL .. 'current is 0 or nil. Skipping this reading')
    if PRINT_MODE then
        print(LABEL .. '###### End' )
    end
    return commandArray
end

if PRINT_MODE then
    print(LABEL .. 'Current humidity:' .. current)
    print(LABEL .. 'targetFanOffHumidity:' .. targetFanOffHumidity)
    print(LABEL .. 'humidityTmin5: ' .. humidityTmin5)
    print(LABEL .. 'humidityTmin10: ' .. humidityTmin10)
    print(LABEL .. 'fanMaxTimer: ' .. fanMaxTimer)
    print(LABEL .. 'humCounter:' .. humCounter)
    print(LABEL .. 'fanFollowsProgram:' .. fanFollowsProgram)
    print(LABEL .. 'Current fan state:' .. otherdevices[FAN_NAME])
end

-- increase cycle counter
humCounter = humCounter + 1

if (humCounter >= SAMPLE_INTERVAL) then

    if (humidityTmin5 == 0) then
        -- initialization, assume this is the first time
        humidityTmin5 = current
        humidityTmin10 = current
    end

    humCounter = 0 -- reset the cycle counter

    -- pick the lowest history value to calculate the delta
    -- this also makes sure that two relative small deltas in the past 2*interval minutes are treated as one larger rise
    -- and therefore will still trigger the ventilator
    -- I don't want to use a longer interval instead because I want the ventilator to start as soon as possible
    -- (so rather after 5 minutes instead of after 15 minutes because the mirrors in the bathroom become kinda useless ;-)
    delta = current - math.min(humidityTmin10, humidityTmin5)

    if PRINT_MODE then
        print(LABEL .. 'Delta: ' .. delta)
    end

    -- pick the lowest history value
    target = math.min(humidityTmin10, humidityTmin5) + TARGET_OFFSET

    -- shift the previous measurements
    humidityTmin10 = humidityTmin5
    -- and store the current
    humidityTmin5 = current

    if (otherdevices[FAN_NAME]=='Off' or (otherdevices[FAN_NAME]=='On' and fanFollowsProgram==0)) then
        -- either the fan is off or it is on but the decrease program has not started
        -- in that latter case we start the program anyway. This could happen if someone turns on the ventilator
        -- manually because he/she is about to take a shower and doesn't like damp mirrors.
        -- I don't do this because the ventilator removes heat from the bathroom and I want this to happen
        -- as late as possible ;-)

        if (fanFollowsProgram == 1 and otherdevices[FAN_NAME]=='Off') then
            -- likely someone turned off the ventilator while the program was running
            fanFollowsProgram = 1
        end

        -- see if we have to turn it on
        if (delta >= FAN_DELTA_TRIGGER) then
            -- time to start the fan
            commandArray[FAN_NAME] = 'On'
            -- commandArray[FAN_NAME] = 'Set Level 99'
            targetFanOffHumidity = target

            if (fanFollowsProgram == 1) then
                print('Ventilator was already on but we start the de-humidifying program')
            end

            fanFollowsProgram = 1

            -- set the safety stop
            fanMaxTimer = FAN_MAX_TIME

            if PRINT_MODE then
                print(LABEL .. 'Rise in humidity. Turning on the vents. Delta: ' .. delta)
                print(LABEL .. 'Target humidity for turning the ventilator: ' ..targetFanOffHumidity)
                commandArray['SendNotification'] = LABEL .. 'VMC rapide#VMC en vitesse rapide, humidité : ' .. current .. '#0'
            end
        end

    else
        if (fanMaxTimer > 0) then
            -- possible that someone started the ventilator manually
            fanMaxTimer = fanMaxTimer - 1
        end


        if (fanFollowsProgram == 1) then -- not manually started

            if (delta >= FAN_DELTA_TRIGGER) then
                -- ok, there is another FAN_DELTA_TRIGGER rise in humidity
                -- when this happen we reset the fanMaxTimer to a new count down
                -- because we have to ventilate a bit longer due to the extra humidity
                if PRINT_MODE then
                    print(LABEL .. 'Another large increase detected, resetting max timer. Delta: ' .. delta)
                end
                fanMaxTimer = FAN_MAX_TIME
            end

            -- first see if it can be turned off
            if (current <= targetFanOffHumidity or fanMaxTimer==0) then
                commandArray[FAN_NAME] = 'Off'

                msg = ''

                if (fanMaxTimer == 0 and current > targetFanOffHumidity) then
                    -- msg = 'Target not reached but safety time-out is triggered.'
                    msg = 'Seuil minimum non atteint, tempo de sécurité expirée.'
                    if PRINT_MODE == true then
                    print(msg)
                    end
                else
                    -- msg = 'Target humidity reached'
                    msg = 'Seuil minimum atteint.'
                    if PRINT_MODE then
                        print(LABEL .. msg)
                    end
                end

                if PRINT_MODE then
                    print(LABEL .. 'Turning off the ventilator')
                    -- msg = msg .. '\nTurning off the ventilator'
                    msg = msg .. '\nPassage VMC en vitesse lente.' .. current
                end

                targetFanOffHumidity = 0
                fanMaxTimer = 0
                fanFollowsProgram = 0
                -- reset history in this case.. we start all over
                -- Tmin10 is still in the 'ventilator=On'-zone
                humidityTmin10 = humidityTmin5
                 if PRINT_MODE == true then
                commandArray['SendNotification'] = LABEL .. 'VMC lente#' .. msg .. '#0'
                end

            else
                -- we haven't reached the target yet
                if PRINT_MODE then
                    print(LABEL .. 'Humidity delta: ' .. delta)
                end
            end
        end
    end

    if PRINT_MODE then
        print(LABEL .. 'New values >>>>>>>>>>>')
        print(LABEL .. 'humidityTmin5: ' .. humidityTmin5)
        print(LABEL .. 'humidityTmin10: ' .. humidityTmin10)
        print(LABEL .. 'fanMaxTimer: ' .. fanMaxTimer)
        print(LABEL .. 'humCounter:' .. humCounter)
        print(LABEL .. 'fanFollowsProgram:' .. fanFollowsProgram)
        print(LABEL .. '------ target: ' .. targetFanOffHumidity)
    end

end

-- save the globals
commandArray['Variable:humCounter'] = tostring(humCounter)
commandArray['Variable:humidityTmin10'] = tostring(humidityTmin10)
commandArray['Variable:humidityTmin5'] = tostring(humidityTmin5)
commandArray['Variable:targetFanOffHumidity'] = tostring(targetFanOffHumidity)
commandArray['Variable:fanMaxTimer'] = tostring(fanMaxTimer)
commandArray['Variable:fanFollowsProgram'] = tostring(fanFollowsProgram)

if PRINT_MODE then
    print(LABEL .. '###### End' )
end

return commandArray

Ajout de périphériques externes (autre maison)

Ouvrir et rediriger le port MQTT dans la box/gateway du réseau hébergeant le serveur Domoticz.

Ajouter le user dans le fichier password du serveur MQTT, puis le redémarer.

Mettre à jour Tasmota avec id Domoticz puis serveur MQTT

Plugins Domoticz

UPS plugin: https://www.domoticz.com/wiki/Plugins/NUT_UPS.html

Suggestion to investigate:

Watermetter via inductive detection:

https://github.com/akamming/domoticz-watermeter

A Kodi link:

https://github.com/dnpwwo/Domoticz-Kodi-Plugin

Lien avec une freebox :

https://github.com/supermat/PluginDomoticzFreebox

Weather information from Buienradar.nl :

https://github.com/ffes/domoticz-buienradar

Lien avec compteur linky :

Theme :

https://github.com/domoticz/Machinon

Sonnette de porte avec camera :

https://www.domoticz.com/forum/viewtopic.php?t=32536

Own dashboard : Dashticz

Leave a Reply

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.