Cela fait quelque temps déjà que je souhaite piloter la filtration de ma piscine depuis mon Domoticz. J'ai donc fait ce que je sais faire de mieux au travers d'une séquence Blockly. Cette dernière étant imparfaite au regard de ce que je voulais faire, j'ai cherché ici et là sans trouver de solution. J'ai donc eu récemment l’idée de soumettre ce problème à ChatGTPT.
Je vous partage donc le résultat en espérant que quelqu'un puisse me dire si ça tient la route et peut être des idées à d'autres!
Données d'entrées pour la gestion de la Piscine :
- La température de l'eau est lue sur une sonde positionnée dans le bassin.
- La température de l'air est lue sur une sonde positionnée au nord.
- D’une manière générale le temps de filtration est égal à la température de l'eau de piscine divisée par 2. Cependant je veux aussi tenir compte des équations ci-dessous
T°C de l’eau < 10°C, le temps de filtration sera de 1 heure réparti en 2 ½ heures le matin à 10h00 et l’après-midi à 15h00
T°C de l’eau < 10°C temps de filtration de 4 heures
T°C de l’eau comprise 10°C < T° < 30°C temps de filtration = T°C de l’eau du bassin / 2
T° de l’eau > 30°C temps de filtration pendant 20 heures.
- La Pompe fonctionne en priorité pendant les heures creuses
- Si le temps de fonctionnement de la pompe est supérieur au temps des heures creuses, alors le temps de fonctionnement restant devra être réparti pendant les heures Pleines à moitié par 1/2 journées de 8h à 12h et de 14 à 18h.
- Les heures creuses sont les suivantes, le lundi, mardi, jeudi et vendredi de 2h30 à 8h00 et de 13h00 à 15h00, le mercredi, samedi et dimanche de 00h00 à 24h00.
- En hiver, une surveillance hors gel devra être effective. Si la température de l'air est inférieure ou égale à 5°C, alors la pompe de filtration devra relancer 60s toutes les 10 minutes.
- A chaque démarrage de la pompe, un rapport devra être notifié par email sur l'adresse xxxx@xxxx. Ce rapport intègrera les éléments suivants,
La T°C d’air extérieure,
La T°C de l’eau de la piscine,
Le temps de fonctionnement en heures creuses
Le temps de fonctionnement en heures pleines,
Le passage en mode hors Gel
L’heure de démarrage de la séquence hors Gel
Réponse de chatGPT:
Assurez-vous de remplacer temperatureSensorIDPiscine, temperatureSensorIDAir et emailAddress par les ID de vos sondes de température et votre adresse email dans les lignes correspondantes.
Le script utilisera alors les valeurs de température de la piscine et de l'air pour calculer le temps de filtration et contrôler le mode hors gel.
Code : Tout sélectionner
local pompeID = 2121 -- Remplacez 2121 par l'ID de l'appareil de la pompe de filtration
local temperatureSensorIDPiscine = 2323 -- Remplacez 2323 par l'ID de la sonde de température de l'eau de la piscine
local temperatureSensorIDAir = 2222 -- Remplacez 2222 par l'ID de la sonde de température de l'air
local emailAddress = "jp@jp-xxx.fr" -- Remplacez par votre adresse email
local function sendEmail(subject, message)
-- Fonction pour envoyer un email via Domoticz
local command = 'curl -s "http://192.168.xx.xx:80/json.htm?type=command¶m=sendemail&subject=' ..
subject .. '&body=' .. message .. '&to=' .. emailAddress .. '"'
os.execute(command)
end
local function isHeureCreuse(heure, jour)
if jour == 2 or jour == 3 or jour == 5 or jour == 6 then -- Lundi, Mardi, Jeudi, Vendredi
return (heure >= '02:30' and heure <= '08:00') or (heure >= '13:00' and heure <= '15:00')
else -- Mercredi, Samedi, Dimanche
return true -- Toute la journée est en heure creuse
end
end
return {
on = {
timer = { 'every 1 minute' },
},
execute = function(domoticz)
local currentTime = os.time()
local pump = domoticz.devices(pompeID)
local temperaturePiscine = domoticz.devices(temperatureSensorIDPiscine).temperature
local temperatureAir = domoticz.devices(temperatureSensorIDAir).temperature
local timeInHeuresCreuses = 0
local timeInHeuresPleines = 0
local heure = os.date('%H:%M', currentTime)
local jour = os.date('%w', currentTime)
local tempsDeFiltration
if temperaturePiscine < 10 then
tempsDeFiltration = 4 * 60 * 60 -- 4 heures de fonctionnement
elseif temperaturePiscine >= 10 and temperaturePiscine < 30 then
tempsDeFiltration = temperaturePiscine / 2 * 60 * 60
elseif temperaturePiscine >= 30 then
tempsDeFiltration = 20 * 60 * 60 -- 20 heures de fonctionnement
end
if isHeureCreuse(heure, jour) then
timeInHeuresCreuses = timeInHeuresCreuses + 1
else
timeInHeuresPleines = timeInHeuresPleines + 1
end
local lastRunTime = domoticz.variables('LastPumpRunTime').value or 0
if pump.state == 'On' then
if currentTime - lastRunTime >= tempsDeFiltration then
pump.switchOff()
domoticz.variables('LastPumpRunTime').set(currentTime)
local message = 'La pompe de filtration a été éteinte.\n' ..
'T°C d’air extérieure: ' .. temperatureAir .. '°C\n' ..
'T°C de l’eau de la piscine: ' .. temperaturePiscine .. '°C\n' ..
'Le temps de fonctionnement en heures creuses: ' .. timeInHeuresCreuses .. ' heure(s)\n' ..
'Le temps de fonctionnement en heures pleines: ' .. timeInHeuresPleines .. ' heure(s)\n' ..
'Le passage en mode hors Gel: ' .. (pump.state == 'Off' and 'Oui' or 'Non') .. '\n' ..
'L’heure de démarrage de la séquence hors Gel: ' .. os.date('%H:%M', currentTime)
sendEmail('Rapport de la pompe de filtration', message)
end
else
local remainingTime = tempsDeFiltration - (currentTime - lastRunTime)
if remainingTime > 0 then
local timePerHalfDay = remainingTime / (2 * timeInHeuresPleines)
if isHeureCreuse(heure, jour) then
pump.switchOn()
domoticz.variables('LastPumpRunTime').set(currentTime)
local message = 'La pompe de filtration a été allumée.\n' ..
'T°C d’air extérieure: ' .. temperatureAir .. '°C\n' ..
'T°C de l’eau de la piscine: ' .. temperaturePiscine .. '°C\n' ..
'Le temps de fonctionnement en heures creuses: ' .. timeInHeuresCreuses .. ' heure(s)\n' ..
'Le temps de fonctionnement en heures pleines: ' .. timeInHeuresPleines .. ' heure(s)\n' ..
'Le passage en mode hors Gel: ' .. (pump.state == 'Off' and 'Oui' or 'Non') .. '\n' ..
'L’heure de démarrage de la séquence hors Gel: ' .. os.date('%H:%M', currentTime)
sendEmail('Rapport de la pompe de filtration', message)
elseif heure >= '08:00' and heure <= '12:00' then
pump.switchOn()
domoticz.variables('LastPumpRunTime').set(currentTime - (timeInHeuresCreuses * 60 * 60))
elseif heure >= '14:00' and heure <= '18:00' then
pump.switchOn()
domoticz.variables('LastPumpRunTime').set(currentTime - (timeInHeuresCreuses * 60 * 60) - (timePerHalfDay * 2))
end
end
end
-- Mode hors gel
local lastHorsGelTime = domoticz.variables('LastHorsGelTime').value or 0
local horsGelInterval = 10 * 60 -- 10 minutes en secondes
if temperatureAir <= 5 and currentTime - lastHorsGelTime >= horsGelInterval then
pump.switchOn()
domoticz.variables('LastHorsGelTime').set(currentTime)
local message = 'La pompe de filtration est en mode hors gel.\n' ..
'T°C d’air extérieure: ' .. temperatureAir .. '°C\n' ..
'T°C de l’eau de la piscine: ' .. temperaturePiscine .. '°C\n' ..
'Le temps de fonctionnement en heures creuses: ' .. timeInHeuresCreuses .. ' heure(s)\n' ..
'Le temps de fonctionnement en heures pleines: ' .. timeInHeuresPleines .. ' heure(s)\n' ..
'Le passage en mode hors Gel: ' .. (pump.state == 'Off' and 'Oui' or 'Non') .. '\n' ..
'L’heure de démarrage de la séquence hors Gel: ' .. os.date('%H:%M', currentTime)
sendEmail('Rapport de la pompe de filtration', message)
end
end
}