[DzVents] Alerte en fin de programme lave-linge, sèche-linge, lave-vaisselle en un seul script sans modif matérielle
Publié : 18 juil. 2020, 19:12
Recevoir une alerte à l'issue du programme d'une machine qui dure depuis des heures permet d'enchaîner les opérations sans perdre trop de temps.
Cette fonction a déjà été explorée ici avec plusieurs méthodes, et j'ai trouvée que l'idée développée dans ce blog était intéressante car simple à mettre en œuvre et sans modification de l'électro-ménager.
L'idée est de surveiller la consommation électrique en Watts de l'appareil en question et de déclencher une notification lorsque cette consommation passe en dessous d'un seuil et au terme d'une minuterie.
Cette consommation est détectée grâce à un appareil Z-Wave tout simple qu'on trouve facilement du côté de l'est :
NEO COOLCAM z-wave Plus

Certains ici pourront le trouver cher, plus cher que les dispositifs DIO ou Chacon.
Certes, mais par précaution je choisis une technologie un peu sécurisée pour des appareils qui consomment des ressources (eau, électricité, ...) et j'évite ainsi que mes voisins impactent mes consommations
Par contre, le script d'origine a plusieurs inconvénients :
On peut ainsi être averti de la fin du programme du lave-linge, du sèche-linge, du lave-vaisselle, etc... simplement en déclarant quelques variables dans le script.
De plus, j'ai voulu valoriser le coût en électricité de l'opération en allant chercher dans Domoticz le coût du kWh en journée.
Chaque Neo Coolcam doit bien sûr être configuré dans Domoticz.
Lors de l'insertion du dispositif Z-Wave, plusieurs dispositifs sont créés.
Seuls les suivants vont nous intéresser pour ce script :
J’enfreins la règle dzVents qui consiste à donner un nom unique à un dispositif, mais ça fonctionne et ça me semble plus lisible.
Dans mon cas, je n'ai pas souhaité voir les dispositifs sur mes pages domoticz, j'ai donc fait précédé le nom du dispositif d'un signe $ au moment de l'ajout ; de cette manière on peut exploiter le dispositif dans un script sans l'avoir en tant que widget sur les pages.
Il n'y a pas besoin d'initialiser des user variables dans Domoticz, je me sers du système de persistance de dzVents.
Ensuite il faut personnaliser le script avec les noms des dispositifs choisis, les commentaires devraient aider en cela.
La notification envoyée ressemble à ceci :
Le script est en mode debug par défaut, après l’étalonnage consistant à inscrire les noms des appareils à la variable energy_consumption et les seuils convenables pour chacun aux variables consumption_upper, consumption_lower et idle_minutes, on peut mettre en commentaire la ligne level = domoticz.LOG_DEBUG dans la section logging.
Modifiez aussi les valeurs du callback de httpResponses dans le script en corrélation avec les appareils.
Pour gérer moins d'appareils, il suffit de supprimer ceux que vous n'utiliserez pas dans ce script en faisant attention à la syntaxe des déclarations de tables en lua (et le placement des virgules).
Le script à mettre dans domoticz/scripts/dzVents/scripts :
J'au voulu avoir un petit tableau récap du statut de chaque appareil, et pour qu'il soit présenté comme ci-dessous il faut ajouter une ligne dans le css de domoticz.
Si vous voulez le faire, le script détaille la manip.
Sinon, positionner la variable recap à false dans le script élimine ce tableau 
Cette fonction a déjà été explorée ici avec plusieurs méthodes, et j'ai trouvée que l'idée développée dans ce blog était intéressante car simple à mettre en œuvre et sans modification de l'électro-ménager.
L'idée est de surveiller la consommation électrique en Watts de l'appareil en question et de déclencher une notification lorsque cette consommation passe en dessous d'un seuil et au terme d'une minuterie.
Cette consommation est détectée grâce à un appareil Z-Wave tout simple qu'on trouve facilement du côté de l'est :
NEO COOLCAM z-wave Plus

Certains ici pourront le trouver cher, plus cher que les dispositifs DIO ou Chacon.
Certes, mais par précaution je choisis une technologie un peu sécurisée pour des appareils qui consomment des ressources (eau, électricité, ...) et j'évite ainsi que mes voisins impactent mes consommations
Par contre, le script d'origine a plusieurs inconvénients :
- Un seul appareil suivi par script (= autant de scripts presque identiques que d'appareils à surveiller)
- Deux user variables nécessaires dans Domoticz
- Script non dzVents, moins performant et un peu désuet
On peut ainsi être averti de la fin du programme du lave-linge, du sèche-linge, du lave-vaisselle, etc... simplement en déclarant quelques variables dans le script.
De plus, j'ai voulu valoriser le coût en électricité de l'opération en allant chercher dans Domoticz le coût du kWh en journée.
Chaque Neo Coolcam doit bien sûr être configuré dans Domoticz.
Lors de l'insertion du dispositif Z-Wave, plusieurs dispositifs sont créés.
Seuls les suivants vont nous intéresser pour ce script :
Code : Tout sélectionner
Nom Type Sous-type Données
Lave-Linge Usage Electric 0 Watt
Lave-Linge General kWh 6.700 kWhDans mon cas, je n'ai pas souhaité voir les dispositifs sur mes pages domoticz, j'ai donc fait précédé le nom du dispositif d'un signe $ au moment de l'ajout ; de cette manière on peut exploiter le dispositif dans un script sans l'avoir en tant que widget sur les pages.
Il n'y a pas besoin d'initialiser des user variables dans Domoticz, je me sers du système de persistance de dzVents.
Ensuite il faut personnaliser le script avec les noms des dispositifs choisis, les commentaires devraient aider en cela.
La notification envoyée ressemble à ceci :
Libre à vous de le modifier comme bon vous semble.Fin du cycle : Le Lave-Vaisselle a terminé son programme, il est temps de ranger son contenu.
Puissance utilisée aujourd'hui : 2.048 kW, soit un coût de 0.27€.
Le script est en mode debug par défaut, après l’étalonnage consistant à inscrire les noms des appareils à la variable energy_consumption et les seuils convenables pour chacun aux variables consumption_upper, consumption_lower et idle_minutes, on peut mettre en commentaire la ligne level = domoticz.LOG_DEBUG dans la section logging.
Modifiez aussi les valeurs du callback de httpResponses dans le script en corrélation avec les appareils.
Pour gérer moins d'appareils, il suffit de supprimer ceux que vous n'utiliserez pas dans ce script en faisant attention à la syntaxe des déclarations de tables en lua (et le placement des virgules).
Le script à mettre dans domoticz/scripts/dzVents/scripts :
Code : Tout sélectionner
--[[
Machine monitoring
2020-07-12 : Initial version
Author : chrominator@free.fr
Inspiré de https://domo.easter.fr/2018/05/11/avoir-une-notification-lorsque-le-lave-linge-a-termine/
Principe : Surveillance de la consommation d'un appareil
si cette consommation est nulle depuis x minutes
envoi d'une alerte pour signaler la fin du programme
--]]
--[[
Nom des prises Z-Wave qui contiennent la consommation en Watts
Nom Type Sous-type Données
Lave-Linge Usage Electric 0 Watt
Lave-LingekWh General kWh 6.700 kWh
Le device ne peut pas être "non-utilisé".
Si on ne souhaite pas le voir dans Domoticz, préfixer le nom
avec un signe $
--]]
local energy_consumption = {
'$Lave-Linge',
'$Sèche-Linge',
'$Lave-Vaisselle'
}
-- If usage is higher than this value (Watts), the program has started
local consumption_upper = {
['$Lave-Linge'] = 20,
['$Sèche-Linge'] = 210, -- Aux alentours de 200 W c'est le maintien défroissage
['$Lave-Vaisselle'] = 50 -- Aux alentours de 45 W c'est un rinçage
}
-- If usage is lower than this value (Watts), the program is idle for a moment/done washing
local consumption_lower = {
['$Lave-Linge'] = 3.5,
['$Sèche-Linge'] = 2,
['$Lave-Vaisselle'] = 3.5
}
-- The amount of minutes the consumption has to stay below the 'consumption_lower' value
local idle_minutes = {
['$Lave-Linge'] = 5,
['$Sèche-Linge'] = 5,
['$Lave-Vaisselle'] = 5
}
local recap = true -- Si vrai affiche le tableau récap de l'état des machines
return
{
active = true,
on =
{
timer = {
"every minute"
},
httpResponses = { -- Pour recherche du tarif électricité
'$Lave-Linge',
'$Sèche-Linge',
'$Lave-Vaisselle'
}
},
data = {
counter = {initial = {} }, -- Nom du compteur
machine_status = {initial = {} } -- Statut du programme de la machine
},
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 = string.match(debug.getinfo(1, "S").short_src, "([^\\/]-)$")
},
execute = function(domoticz, item)
-- Pour faire joli, supprime le caractère $ de la chaine
local function niceName (name)
return string.gsub(name, "%$", "")
end
-- Centre le libellé de la machine dans le tableau récap
local function format_string (chaine)
local pad = math.floor((20 - string.len(chaine))/2)
chaine = string.rep(" ", pad) .. chaine .. string.rep(" ", pad)
if pad/2 == math.floor(pad/2) then -- nombre pair
chaine = chaine .. " "
end
return chaine
end
-- Surveillance de la consommation électrique de la machine
local function monitor_device(machine)
domoticz.log(niceName(machine) .. ". Début du cycle.", domoticz.LOG_DEBUG)
machine_usage = domoticz.devices(machine)
domoticz.log(niceName(machine) .. ". La puissance actuellement utilisée est de " .. machine_usage.actualWatt .."W.", domoticz.LOG_DEBUG)
domoticz.log(niceName(machine) .. ". Le statut de démarrage du programme est " .. tostring(domoticz.data.machine_status[machine]), domoticz.LOG_DEBUG)
domoticz.log(niceName(machine) .. ". Les watts : " .. tostring(machine_usage.actualWatt), domoticz.LOG_DEBUG)
domoticz.log(niceName(machine) .. ". Seuil supérieur : " .. tostring(consumption_upper[machine]), domoticz.LOG_DEBUG)
domoticz.log(niceName(machine) .. ". Seuil inférieur : " .. tostring(consumption_lower[machine]), domoticz.LOG_DEBUG)
domoticz.log(niceName(machine) .. ". Minuterie : " .. tostring(idle_minutes[machine]), domoticz.LOG_DEBUG)
--Virtual switch is off, but consumption is higher than configured level, so program has started
if tonumber(machine_usage.actualWatt) > consumption_upper[machine] and not domoticz.data.machine_status[machine] then
domoticz.log(niceName(machine) .. ". La puissance utilisée actuelle (" .. machine_usage.actualWatt .. "W) est supérieure à la limite haute (" .. consumption_upper[machine] .. "W), donc le programme a démarré.", domoticz.LOG_DEBUG)
domoticz.data.machine_status[machine] = true
domoticz.data.counter[machine] = idle_minutes[machine]
domoticz.log(niceName(machine) .. ". Le statut de démarrage du programme est " .. tostring(domoticz.data.machine_status[machine]), domoticz.LOG_DEBUG)
end
--program is not using a lot of energy, check the counter
if tonumber(machine_usage.actualWatt) < consumption_lower[machine] and domoticz.data.machine_status[machine] then
domoticz.data.counter[machine] = math.max(domoticz.data.counter[machine] - 1, 0)
domoticz.log(niceName(machine) .. ". La puissance utilisée actuelle (" .. machine_usage.actualWatt .. "W) est inférieure à la limite basse (" .. consumption_lower[machine] .. "W), donc le programme est en pause ou terminé.", domoticz.LOG_DEBUG)
domoticz.log(niceName(machine) .. ". Décrémentation du compteur, nouvelle valeur: " .. domoticz.data.counter[machine] .. " minutes")
elseif domoticz.data.counter[machine] ~= idle_minutes[machine] and domoticz.data.machine_status[machine] then
domoticz.data.counter[machine] = idle_minutes[machine]
domoticz.log(niceName(machine) .. ". Remise en route du timer", domoticz.LOG_DEBUG)
end
--program is done
if domoticz.data.machine_status[machine] and domoticz.data.counter[machine] == 0 then
domoticz.log(niceName(machine) .. ". Le programme est terminé.", domoticz.LOG_DEBUG)
domoticz.log(niceName(machine) .. ". Puissance utilisée actuelle (" .. machine_usage.actualWatt .. "W)", domoticz.LOG_DEBUG)
machine_kWh = domoticz.devices(machine .. "kWh")
domoticz.log(niceName(machine) .. ". Puissance aujourd'hui (" .. machine_kWh.WhToday .. "W)", domoticz.LOG_DEBUG)
if machine_kWh.WhToday ~= nil then
-- Recherche du tarif électricité de jour
if (item.isTimer) then
domoticz.openURL({
url = "http://127.0.0.1:8080/json.htm?param=getcosts&type=command&idx=" .. machine_usage.id,
method = 'GET',
callback = machine,
})
end
end
domoticz.data.initialize('machine_status')
end
end
if (item.isHTTPResponse and item.ok) then
domoticz.log(niceName(item.callback) .. ". On entre dans la boucle", domoticz.LOG_DEBUG)
machine_kWh = domoticz.devices(item.callback .. "kWh")
local CostEnergyT2 = item.json.CostEnergyT2
if CostEnergyT2 ~= 0 and CostEnergyT2 ~= nil then
domoticz.log(niceName(item.callback) .. ". CostEnergyT2=" .. tostring(CostEnergyT2), domoticz.LOG_DEBUG)
domoticz.log(niceName(item.callback) .. ". Puissance utilisée aujourd'hui : " .. tostring(machine_kWh.WhToday/1000) .. " kW, soit un coût de " .. tostring(math.floor(machine_kWh.WhToday * CostEnergyT2 / 10+0.5)/100) .. "€.", domoticz.LOG_INFO)
domoticz.notify(niceName(item.callback), "Fin du cycle : Le " .. niceName(item.callback) .. " a terminé son programme, il est temps de ranger son contenu.\nPuissance utilisée aujourd'hui : " .. tostring(machine_kWh.WhToday/1000) .. " kW, soit un coût de " .. tostring(math.floor(machine_kWh.WhToday * CostEnergyT2 / 10+0.5)/100) .. "€.", domoticz.PRIORITY_LOW)
else
domoticz.notify(niceName(item.callback), "Fin du cycle : Le " .. niceName(item.callback) .. " a terminé son programme, il est temps de ranger son contenu.", domoticz.PRIORITY_LOW)
end
end
-- Début du programme
for i, v in ipairs (energy_consumption) do
domoticz.log(niceName(v) .. ". Monitoring de la machine n° " .. tostring(i), domoticz.LOG_DEBUG)
if domoticz.data.counter[v] == nil then domoticz.data.counter[v] = 0 end
if domoticz.data.machine_status[v] == nil then domoticz.data.machine_status[v] = false end
domoticz.log(niceName(v) .. ". Compteur initialisé à " .. tostring(domoticz.data.counter[v]), domoticz.LOG_DEBUG)
monitor_device(v)
end
--[[ Tableau récap de l'état
+--------------------+---------+----------+---------+
| Machine | Démarré | En pause | Terminé |
+--------------------+---------+----------+---------+
| Lave-Linge | X | | |
+--------------------+---------+----------+---------+
| Lave-Linge | | X | |
+--------------------+---------+----------+---------+
| Lave-Linge | | | X |
+--------------------+---------+----------+---------+
Pour une mailleurs lisibilité dans le log de domoticz,
ajouter ce qui suit dans la section logstatus de
/home/pi/domoticz/www/css/style.css
white-space: pre;
--]]
if recap then
domoticz.log("+--------------------+---------+----------+---------+", domoticz.LOG_INFO)
domoticz.log("| Machine | Démarré | En pause | Terminé |", domoticz.LOG_INFO)
domoticz.log("+--------------------+---------+----------+---------+", domoticz.LOG_INFO)
for i, v in ipairs (energy_consumption) do
if not domoticz.data.machine_status[v] then
domoticz.log("|" .. format_string(niceName(v)) .. "| | | X |", domoticz.LOG_INFO)
elseif domoticz.data.machine_status[v] and domoticz.data.counter[v] < idle_minutes[v] then
domoticz.log("|" .. format_string(niceName(v)) .. "| | X | |", domoticz.LOG_INFO)
else
domoticz.log("|" .. format_string(niceName(v)) .. "| X | | |", domoticz.LOG_INFO)
end
domoticz.log("+--------------------+---------+----------+---------+", domoticz.LOG_INFO)
end
end
end
}
Si vous voulez le faire, le script détaille la manip.
Code : Tout sélectionner
2020-07-18 17:03:00.651 Status: dzVents: Info: monitor_machine.lua: +--------------------+---------+----------+---------+
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: | Machine | Démarré | En pause | Terminé |
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: +--------------------+---------+----------+---------+
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: | Lave-Linge | | | X |
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: +--------------------+---------+----------+---------+
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: | Sèche-Linge | | | X |
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: +--------------------+---------+----------+---------+
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: | Lave-Vaisselle | | X | |
2020-07-18 17:03:00.652 Status: dzVents: Info: monitor_machine.lua: +--------------------+---------+----------+---------+