Page 1 sur 1

[Python] Piscine Filtration fonction de la température, multiples plages de fonctionnement

Publié : 23 nov. 2021, 09:47
par pascal.soler
Ici un script en PYTHON de temps de Filtration Piscine , fonction de la température de l'eau
Les plages de températures et les plages de Filtrations associées sont maintenues dans un fichier texte.
Autant de plages de températures, que de plages de filtration possibles

ici le fichier s'appelle planning.txt

Le script est lancé à intervalles réguliers (time)
Par SECURITE, Il faut pouvoir arrêter la Filtration manuellement (soit au tableau physiquement avec un disjoncteur (c'est le mieux), soit en testant un device ON/OFF et empêcher le script de se lancer (moins secure), pour les opérations de maintenance ou en cas de danger.


Mon script PYTHON

Code : Tout sélectionner

"""
FILTRATION fonction de la température stockée dans une variable utilisateur
Ici 
la pompe de Filtration s'appelle FILTRATION (R1)
Le DEVICE contenant la température mesurée s'appelle "TEMP_EAU"
Le fichier contenant le planning de filtration 
Le script est déclenché sur OnTime (dans Events)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Fichier planning
Structure du fichier est en résumé: => plage de température; 1 à x plages de filtration

TEMPMINI;TEMPMAXI;H_DEBUT_FILTRATION;H_FIN_FILTRATION;H_DEBUT_FILTRATION;H_FIN_FILTRATION;... etc....

TEMPMINI exemple 12, 18, 15.15
TEMPMAXI exemple 12, 18, 15.15 (TEMPMAXI > TEMPMINI)
Plage de température >= TEMPMINI et < TEMPMAXI

H_DEBUT_FILTRATION exemple 12:00, 08:00; 21:00 (HH:MM)
H_FIN_FILTRATION exemple 12:00, 08:00; 21:00 (HH:MM) (H_FIN_FILTRATION > H_DEBUT_FILTRATION)
Plage de filtration Heure courante >= H_DEBUT_FILTRATION et > H_FIN_FILTRATION

Le nb de ligne est indifférent
pas de ligne vide (ou prévoir un traitement)
l'ordre des lignes est indifférent
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Fonctionnement résumé
    - Le script est déclenché à intervalle régulier
    - En fonction du device TEMP_EAU
    - On lit de fichier ligne à ligne et on compare la plage de températures du fichier à la température mesurée
        - Si dans une plage de température valide
        - On compare les plages de de filtration issues du fichier à l'heure courante
        - On démarre ou arrête la filtration uniquement si changement d’état pour éviter de générer un évènement inutile.

"""

import DomoticzEvents as DE
import domoticz
import random
import datetime

DE.Log("========== TRAITEMENT TEMPERATURE ==========")

# On positionne l'état de la filtration a Off
etat_filtration ="Off"
#etat_filtration=DE.Devices["Pompe"].n_value_string

# Température mesurée (variable temperature_eau)
#consigne = float(DE.user_variables["temperature_eau"])
consigne=float(DE.Devices["Temp_Eau"].s_value)
DE.Log(DE.Devices["Temp_Eau"].s_value)
# Lecture du fichier "planning de filtration 
FichierAlire = '/home/pi/domoticz/scripts/python/planning.txt'
fichier = open(FichierAlire,'r')
#chier = open("/home/pi/domoticz/scripts/python/planning.txt")
ligne = fichier.readline()

while ligne:
    # Supression caractère fin de ligne /n
    ligne = ligne[0:-1]
    #DE.Log(ligne)
    ligne_splitted = ligne.split(";") # Split en X variables
    tmp_min = float(ligne_splitted[0])
    tmp_max = float(ligne_splitted[1])
    
    if consigne>=tmp_min and consigne<tmp_max:
        DE.Log("========== Dans la plage de température ==========")
        # Traitement des heures de filtration
        for i in range(2,len(ligne_splitted)-1,2):
            
            # Heure + format // Au moins une plage horraire doit être 
            # entrée dans le fichier
            hdebtxt = ligne_splitted[i]
            hfintxt = ligne_splitted[i+1]
            
            current_time = datetime.datetime.now().time() # Heure en cours
            hdeb = datetime.time.fromisoformat(hdebtxt)
            hfin = datetime.time.fromisoformat(hfintxt)
            
            DE.Log("Consigne = "+str(consigne))
            DE.Log("tmp_min:"+str(tmp_min)+",tmp_max:"+str(tmp_max))
            DE.Log("hdeb:"+hdebtxt+",hfin:"+hfintxt)
            
            
            # Si dans la plage horraire de filtration
            if current_time>=hdeb and current_time <=hfin:
                DE.Log(" Dans la plage horaire -> ON")
                etat_filtration = "On" # Changement état filtration
                
    ligne = fichier.readline()
if etat_filtration != DE.Devices["FILTRATION (R1)"].n_value_string:
    DE.Command("FILTRATION (R1)",etat_filtration)
    DE.Log("Filtration passe à =>"+etat_filtration)
fichier.close()


A AMELIORER:

- Traitement des jours de la semaine par exemple plages spéciales ou modifiées le ouikend
- Gestion du volet, si volet autres plages
- Page personnalisée dans Domoticz pour implémenter modifier le fichier planning.txt (c'est du javascript et là j'ai la flemme)

Bon courage

Pascal