Filtration piscine

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Filtration piscine

Message par nene82 »

Bonjour tout le monde.
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&param=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
}

Dernière modification par nene82 le 03 août 2023, 13:07, modifié 3 fois.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Filtration piscine

Message par Keros »

Est-ce que le script fonctionne sans erreurs ?

Est-ce que le script fait que tu souhaites ?

Si oui, tant mieux, si non, il faut passer par la case débogage et là, pas sur que l'IA puisse te répondre.


Je ne vais pas analyser ce script. Pour moi, ce qui est important :
  • c'est qu'il fasse ce que tu souhaites
  • que tu puisses le comprendre pour faire des ajustements
  • que tu puisses toujours le comprendre et le modifier quand tu reviendras dessus dans 6 mois / 1 an / 2 an ou plus
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Filtration piscine

Message par nene82 »

En fait, je ne sais pas encore.
je vais essayer ce WE sur un banc de test.
Oui je comprends. Cependant même si sur cet exemple cela peut paraître compliqué, pour des plus petits scripts cela peut m'ouvrir quelques horizons...étant entendu que je ne comprends pas grand chose à ces langages...
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Filtration piscine

Message par Keros »

Regarde ma signature, j'ai écrit des petits guides dans ma présentation dont un sur les débuts en programmation.

Le problème que je vois avec l'IA, c'est que ça va te pondre quelque chose que tu ne maitrises pas et quand il va falloir déboguer pour comprendre ce qui ne fonctionne pas comme tu le souhaites, ça risque d'être super compliqué.

Décortiquer un script comme ça pour commencer, c'est rude. Commence petit, découvre, comprend le fonctionnement et assemble des briques au fur et à mesure.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Payou82
Messages : 5
Inscription : 17 juin 2017, 08:28
Localisation : Sud Ouest (82)

Re: Filtration piscine

Message par Payou82 »

Oui merci! J’ai vus les liens dans ta signature et j’ai déjà commencé à gratter!
Merci encore
Répondre