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