Régulation d'une chaudière Frisquet ECO radio System

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre
et {/Quote]

allezlelosc
Messages : 49
Enregistré le : 21 oct. 2015, 21:34

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par allezlelosc »

Tuto partie 5 : les scripts

J'ai deux scripts python qui tournent :
- régulateur.py : le PID
- PWM.py : celui qui pilote la chaudière

je vais chercher dans un fichier *.cfg les différentes constantes dont j'ai besoin
j'importe un module nommé modules_SSO qui regroupe des fonctions pour parser du JSON depuis l'API Domoticz ou pour piloter mon relais.

nota : du fait de mon installation d'origine basée sur la techno SCS myhome de Legrand/Bticino, j'utilise Domoticz plutôt comme une IHM.

Régulatuer.py

Code : Tout sélectionner

!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
******************* Créé le 16/01/2016 par SSO *************************
Description :
-------------
Régule la chaudière selon les conditions intérieures.
il faut également executer PWM.py

Conditions d'éxécution:
-----------------------
Crontab au boot
@reboot /home/pi/domoticz/scripts/python/Chauffage/regulateur.py
************************************************************************
'''

'''
**************************** Modifications *****************************
25/01/2016
----------
- ajustement pour faire démarrer le script depuis crontab
- PWM.py est démarrer par le crontab et non par regulateur.py
- Calcul de la dérivée sur la mesure + deltaT réel
26/01/2016
----------
- l'action dérivée est active également dans la Bm (pas P ni I)
- Ajout de la Relance soutenue: si la commande est à zéro pendant plus d'un temps DelayStandby (minutes) alors on relance (100%) pour TRelance (minutes).
************************************************************************
'''


  import ConfigParser,time
  from modules_SSO import *


  #Initialisation des paramètres du régulateur
  IdxInter='112'
  IdxConsigne='111'
  IdxMesure='16'
  IdxCommande='113'
  CfgPID=ConfigParser.ConfigParser()
  Integral=0.0
  Derivee=0.0
  Puissance=50.0
  Mesure0=float(domo_json_read(IdxMesure,'Temp'))
  T0=DomoJsonReadLastUpdate(IdxMesure)
  TStandby=0.0
  Standby=True
  Relance=False
  #*********************************************

  ChauffCommand=domo_json_read(IdxInter,'Status')
  while True:
    ChauffCommand=domo_json_read(IdxInter,'Status')
    if ChauffCommand=='On':
      CfgPID.read('/home/pi/domoticz/scripts/python/Chauffage/PID.cfg')
      Kp=CfgPID.getfloat('CoeffPID','Kp')
      Ki=CfgPID.getfloat('CoeffPID','Ki')
      Kd=CfgPID.getfloat('CoeffPID','Kd')
      Bm=CfgPID.getfloat('CoeffPID','Bm')
      DelayRelance=CfgPID.getfloat('CoeffPID','DelayRelance')
      DelayStandby=CfgPID.getfloat('CoeffPID','DelayStandby')
      Periode=CfgPID.getint('CoeffPID','Periode')
      Consigne=float(domo_json_read(IdxConsigne,'SetPoint'))
      Mesure=float(domo_json_read(IdxMesure,'Temp'))
      Erreur=Consigne-Mesure
      #On ne met à jour la Puissance que si :
      #    |Erreur| > Bande Morte Bm
      if abs(Erreur)>Bm:
        if Mesure!=Mesure0:
          T=DomoJsonReadLastUpdate(IdxMesure)
          Derivee=Derivee+(Mesure0-Mesure)/(T-T0)
          Mesure0=Mesure
          T0=T
        if Erreur<0 and Puissance==0:
          Integral=Integral
        elif Erreur>0 and Puissance==100:
          Integral=Integral
        else:
          Integral=Integral+Erreur
        Puissance=Kp*Erreur+Ki*Integral+Kd*Derivee
        print Puissance
      else:
        if Mesure!=Mesure0:
          T=DomoJsonReadLastUpdate(IdxMesure)
          Derivee=Derivee+(Mesure0-Mesure)/(T-T0)
          Mesure0=Mesure
          T0=T
        Puissance=Ki*Integral+Kd*Derivee
      if Puissance>100:
        Puissance=100
      if Puissance<=0:
        Puissance=0
        if Standby==False:
          TStandby=time.time()
          Standby==True
      if Puissance>0 and Standby==True:
        if (time.time()-TStandby)>(DelayStandby*60):
          Puissance=100
          Relance=True
        Standby=False
      DomoJsonWritePercent(IdxCommande,str(Puissance))
      if Relance==True:
        time.sleep(DelayRelance*60)
        Relance=False
      else:
        time.sleep(Periode)
      ChauffCommand=domo_json_read(IdxInter,'Status')
    else:
      DomoJsonWritePercent(IdxCommande,'0')

PWM.py

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import ConfigParser,time
from modules_SSO import *


#Initialisation des paramètres du régulateur
Cfg=ConfigParser.ConfigParser()
Commande0=50.0
Puissance0=0.0
T0=DomoJsonReadLastUpdate('113')

#Initialisation des paramètres du socket
cfg=ConfigParser.ConfigParser()
cfg.read("/home/pi/domoticz/scripts/python/parametres.cfg")
buffer_size=cfg.getint('Param_F455','buffer_size')
ip_F455=cfg.get('Param_F455','ip') # IP passerelle F455
port_F455=cfg.getint('Param_F455','port') # port pour commande opennwebnet


ChauffCommand=domo_json_read('112','Status')

while ChauffCommand=='On':
    #on récupère l'ensemble des données
    #**********une fois le PID réglé il faudra sortir la mise à jour des Coeff ****************
    Cfg.read('/home/pi/domoticz/scripts/python/Chauffage/PID.cfg')
    Kc=Cfg.getfloat('CoeffPWM','Kc')
    PeriodePWM=Cfg.getfloat('CoeffPWM','Periode')
    PeriodePID=Cfg.getfloat('CoeffPID','Periode')
    #*******************************
    
    Puissance=float(DomoJsonReadPercent('113','Data'))
    T=DomoJsonReadLastUpdate('113')
    if Puissance==100:
      Commande=100
    elif Puissance==0:
      Commande=0
    else:
      DeltaPuissance=Puissance-Puissance0
      DeltaT=T-T0
      try:
        DPsurDT=DeltaPuissance/DeltaT
      except ZeroDivisionError:
        DPsurDT=0
      Commande=int(50+(50*DPsurDT)/Kc)
      if Commande>100:
        Commande=100
      elif Commande<0:
        Commande=0
    DomoJsonWritePercent('116',Commande)
    T0=T
    Puissance0=Puissance
    #Envoie de la période de commande
    TOn=Commande*PeriodePWM/100
    TOff=PeriodePWM-TOn
    if TOn!=0:
      LightCommandOwn('11','34') #11 --> ON pendant 1 minute (chien de garde!!)
      time.sleep(TOn)
    if TOff!=0:
      LightCommandOwn('0','34')
      time.sleep(TOff)
    ChauffCommand=domo_json_read('112','Status')   
#Avant de quitter on met la valeur de Domoticz à zéro
DomoJsonWritePercent('116','0')
LightCommandOwn('0','34')
  
il faut m'excuser pour le manque de commentaires dans les scripts mais je suis entrain de les éditer dans ce sens.

bruch05
Messages : 43
Enregistré le : 27 févr. 2016, 21:06

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par bruch05 »

Bonsoir,

Je viens de trouver ton article qui est fort intéressant.
Je me suis replongé dans mes cours de math sur le traitement du signal :D
J'ai une chaudière frisquet prestige dont je viens de changer la carte mère... Maintenant elle fonctionne. :shock:

Peux tu publier le fichier de paramètre afin que je puisse affiner ma compréhension ?
Quel est ton retour d'expérience sur cette mise en oeuvre ?
As tu complété cette implémentation avec la prise en compte des évolutions de la température extérieure pour anticiper les baisses/hausses à l'intérieur à l'instar du RIF5000 ?

Est ce plus performant que la régulation Eco Radio System ?

Merci par avance.

allezlelosc
Messages : 49
Enregistré le : 21 oct. 2015, 21:34

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par allezlelosc »

Bonjour Bruch05 et à tous ceux qui lisent ces lignes,

avant de poster les différents fichiers je vais commencer par le retour d'expérience sur le pilotage de la chaudière :

#les plus:
- premier point et non des moindres je n'ai eu aucune remarque de la part de ma femme sur la qualité de la régulation. :D
- la possibilité d'agir sur la consigne à distance et d'envisager toute sorte de scénarios

#les moins :
- je n'en vois pas

#les défauts :
- en maintenant le rapport cyclique à 50%, la valeur moyenne de la température de départ de la chaudière dérive en diminuant, ce qui entraine que la sortie du fichier PID dérive elle vers 100% et donc un rapport cyclique de 100% --> le système se met à pomper et dans des proportions non compatibles avec le confort et les performances énergétiques. :x
- une régulation à 0.2°C près ce qui en intégrant la bande morte de 0.1°C me fait varier la température entre -0.3°C et + 0.3°C quand les influences externes sont limitées (la nuit).
- De temps en temps je constate également un décrochage de la température de départ : elle chute de manière inexpliquée.

#les axes d'amélioration :
- l'analyse des défauts me fait conclure qu'il faut contrôler la température de départ. Ce que j'avais déjà envisagé dans mon premier post.

Avant de vous montrer le nouveau script je fais une parenthèse sur la position de la sonde d'ambiance



#la position de la sonde d'ambiance

Mon métier m'a amené à positionner des milliers de sonde d'ambiance. Les contraintes liées aux chantiers ne permettent pas toujours d'opter pour une position optimale des sondes. Mais chez vous, surtout avec les sondes sans fils basse consommation, vous pouvez trouver "la" position qui vous donnera les meilleurs résultats.
Pour ma part, voici la réflexion qui m'a conduit à positionner la sonde dans le couloir reliant la partie "jour" à la partie "nuit" de mon habitation.

Consigne confort : 19.5°C

Voici la liste des pièces :
- cuisine
-buanderie
-séjour
-bureau
-chambre1
-chambre2
-chambre3
-WC
-SdB
-Entrée + circulation

- Cuisine :
pièce positionnée sur un coin de la maison avec 2 fenêtres, une orientée sud et l'autre ouest; elle est bien sûr équipée de tout l'électroménager nécessaire et dissipant quelques calories (four, plaques, réfrigérateur....).
Température envisagée : confort.
-->Les apports internes et externes (ensoleillement) sont trop variés et difficilement maîtrisables/prédictibles donc impossible de les intégrer dans un algo.
la cuisine n'est pas la bonne pièce

-buanderie :
pièce positionnée sur un coin de la maison avec une fenêtre orientée nord. on y trouve la chaudière, le lave linge, le sèche linge, un réfrigérateur, un congélateur, on y fait le repassage
Température envisagée : 18°C
--> Pièce bien orientée mais trop d'apports non maîtrisés (sèche linge, centrale vapeur) et de plus la pièce n'est pas chauffée à la température de confort donc impossible d'en faire la référence
la buanderie n'est pas la bonne pièce

- le Séjour
Pièce de référence dans beaucoup de foyers seulement le choix n'est pas judicieux et pour plusieurs raisons:
1°/ souvent orienté pour profiter du soleil : le mien a une fenêtre orientée sud et une porte fenêtre 3 vantaux orientés Sud-Est : donc on profite et c'est tant mieux des apports solaires gratuits.
2°/Pour ceux qui en ont la chance d'en avoir une, la cheminée est souvent, voire toujours, positionnée dans cette pièce.
3°/ c'est la pièce dans laquelle on reçoit. Pour info il est commun de prendre comme apport sensible en hiver 83 Watts/Pers pour un employé de bureau. Vous imaginez les apports quand on reçoit 10 personnes qui sont là pour s'amuser !
--> trop d'apports non maitrisés
le séjour n'est absolument pas la bonne pièce

- le bureau:
pièce orientée plein sud avec un grnade baie vitrée de 4m50 de long
le bureau n'est pas la bonne pièce

-les chambres :
Température souhaitée : 17/18°C
les chambres ne sont pas les bonnes pièces

- les WC
il n'y a pas de radiateurs donc ce n'est pas la bonne pièce.

-la SdB
pièce la moins occupée de la maison et pour laquelle on souhaite des températures plus élevées
la SdB n'est pas la bonne pièce

il ne me reste que l'entrée prolongée du couloir :
pas de fenêtre, profitant de "manière lissée" et réduite des apports des autres pièces (à l'image de la partie nuit de la maison)
Dans mon cas c'est la pièce idéale : surface limitée donc je peux maintenir la température de confort sans trop dépenser d’énergie, j'ai le bénéfice des apports du séjour sans en avoir les inconvénients (le régime de la chaudière va diminuer sans tomber à zéro).


CONCLUSION : Prenez le temps de positionner votre sonde de référence c'est le point de départ d'une régulation performante.

par contre dans toutes les pièces où l'on veut contrôler la température il faut mettre des régulateurs terminaux : des têtes thermostatiques, sinon comment éviter que les chambres montent à la température de confort ou que le chauffage par radiateurs du séjour se coupent quand on fait une flambée ?
Modifié en dernier par allezlelosc le 28 févr. 2016, 15:46, modifié 2 fois.

allezlelosc
Messages : 49
Enregistré le : 21 oct. 2015, 21:34

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par allezlelosc »

Voici les paramètres relatifs aux deux scritps déjà postés :

[CoeffPID]
Kp=0.25
Ki=0.30
Kd=2500
Bm=0.11
Periode=30
DelayRelance=5
DelayStandby=5
TempRelance=33

[CoeffPWM]
Periode=30
Kc=0.05

allezlelosc
Messages : 49
Enregistré le : 21 oct. 2015, 21:34

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par allezlelosc »

Et voici mon nouveau script qui fait suite aux axes d'amélioration et à une refonte de l'ensemble de mes scripts !

les paramètres contenus dans NewPid.cfg

Code : Tout sélectionner

[ParamGlobal]
Periode=30
ScsAdress=34

[ParamPID1]
Kp=10
Ki=0.25
Kd=10
Bm=0.11
LimitBas=24
ErrMaxTempAmb=1
SetPointStepTempDepart=64

[ParamPID2]
K1=1
K2=0
K3=0
Bm=1
ErrMaxTempDepart=10
RapCyc0=50
RapCycMax=100

[ParamBoost]
Delay=240

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""RegulChauff.py : Script pour la régulation de chauffage"""

__namescript__='RegulChauff.py'
__author__= 'SSO'
__version__= '2.0'
__status__= 'Exploitation'
__created__='13/2/16'
__modified__='20/2/16'

import ConfigParser
import DomoJson
import time
import DbError
import SCS

#------Paramètres généraux ----------
CfgPID=ConfigParser.ConfigParser()
CfgPID.read('/home/pi/domoticz/scripts/python/Chauffage/NewPID.cfg')
Periode=CfgPID.getint('ParamGlobal','Periode')
ScsAdress=CfgPID.get('ParamGlobal','ScsAdress')
#----------------------------------

#--------------Idx-------------------
IdxSwitchRegul='112'
IdxSetPointTempAmb='111'
IdxTempAmb='16'
IdxCommande='116'
IdxTempDepart='130'
IdxBoilerFault='132'
IdxSetPointTempDepart='168'
#----------------------------------

#------Paramètres PID1--------------
ErrPreviousTempAmb=0.0
T0=DomoJson.Read(IdxTempAmb,0)
Integral1=0.0
Derivee1=0.0
SetPointTempDepart=0.0
StepTempDepart=False
ReleaseSetPointTempDepart=False
#----------------------------------

#------Paramètres PID2--------------
ErrPreviousTempDepart=0.0
ErrPrevious0TempDepart=0.0
RapCyc=0.0
#----------------------------------

#------Paramètres Relance----------
BoostMode=True
BoostDemand=False
ExitFromBm=False
#----------------------------------

#*********************************************



while True:
  try:
    SwitchRegul=DomoJson.Read(IdxSwitchRegul,3)
    BoilerFault=DomoJson.Read(IdxBoilerFault,3)
    if SwitchRegul=='On' and BoilerFault=='Off':
      StandBy=False
      CfgPID.read('/home/pi/domoticz/scripts/python/Chauffage/NewPID.cfg')

      #------Paramètres PID1--------------
      Kp=CfgPID.getfloat('ParamPID1','Kp')
      Ki=CfgPID.getfloat('ParamPID1','Ki')
      Kd=CfgPID.getfloat('ParamPID1','Kd')
      Bm1=CfgPID.getfloat('ParamPID1','Bm')
      ErrMaxTempAmb=CfgPID.getfloat('ParamPID1','ErrMaxTempAmb')
      LimitBasTempDepart=CfgPID.getfloat('ParamPID1','LimitBas')
      SetPointStepTempDepart=CfgPID.getfloat('ParamPID1','SetPointStepTempDepart')
      #----------------------------------

      #------Paramètres PID2--------------
      K1=CfgPID.getfloat('ParamPID2','K1')
      K2=CfgPID.getfloat('ParamPID2','K2')
      K3=CfgPID.getfloat('ParamPID2','K3')
      Bm2=CfgPID.getfloat('ParamPID2','Bm')
      ErrMaxTempDepart=CfgPID.getfloat('ParamPID2','ErrMaxTempDepart')
      RapCyc0=CfgPID.getfloat('ParamPID2','RapCyc0')
      RapCycMax=CfgPID.getfloat('ParamPID2','RapCycMax')
      #----------------------------------

      #------Paramètres Relance----------
      BoostDelay=CfgPID.getfloat('ParamBoost','Delay')
      #----------------------------------

      SetPointTempAmb=float(DomoJson.Read(IdxSetPointTempAmb,3))
      TempAmb=DomoJson.Read(IdxTempAmb,1)
      ErrNowTempAmb=SetPointTempAmb-TempAmb

      if BoostMode==True:
        if ErrNowTempAmb>Bm1:
          RapCyc=100.0
          Status=DomoJson.WritePercent(IdxCommande,RapCyc)
          if Status!='OK':
            DbError.Write(__namescript__,"Erreur d'écriture dans Domoticz du rapport cyclique")
          Status=SCS.LightCommand(16,ScsAdress)
          if Status!='CommandSucceeded':
            DbError.Write(__namescript__,Status)
          time.sleep(BoostDelay)
          Status=SCS.LightCommand(0,ScsAdress)
          if Status!='CommandSucceeded':
            DbError.Write(__namescript__,Status)
          BoostMode=False
          FirstCycle=True
          Integral1=0.0
        else:
          Status=DomoJson.WriteTemp(IdxSetPointTempDepart,0.0)
          if Status!='OK':
            DbError.Write(__namescript__,"Erreur d'écriture dans Domoticz de la consigne de température de déaprt")
          Status=DomoJson.WritePercent(IdxCommande,0.0)
          if Status!='OK':
            DbError.Write(__namescript__,"Erreur d'écriture dans Domoticz du rapport cyclique")
      else:
        #----------------PID 1-------------------------
        if ErrNowTempAmb>ErrMaxTempAmb:
          BoostMode=True
        elif abs(ErrNowTempAmb)>Bm1:
          if FirstCycle==True:
            SetPointInitTempDepart=DomoJson.Read(IdxTempDepart,1)
            SetPointTempDepart=SetPointInitTempDepart
            FirstCycle=False
          else:
            if ErrNowTempAmb!=ErrPreviousTempAmb:
              T=DomoJson.Read(IdxTempAmb,0)
              try:
                Derivee1=(ErrNowTempAmb-ErrPreviousTempAmb)/(T-T0)
              except ZeroDivisionError:
                Derivee1=0.0
              ErrPreviousTempAmb=ErrNowTempAmb
              T0=T
            if ExitFromBm==True:
              SetPointInitTempDepart=SetPointTempDepart-Kp*ErrNowTempAmb
              Integral1=0.0
              ExitFromBm=False
            SetPointTempDepart=SetPointInitTempDepart+Kp*ErrNowTempAmb+Ki*(Integral1+ErrNowTempAmb)+Kd*Derivee1
          if SetPointTempDepart<LimitBasTempDepart:
            if ErrNowTempAmb>Bm1:
              SetPointTempDepart=LimitBasTempDepart
            else:
              SetPointTempDepart=0.0
              if BoostDemand==False:
                BoostDemand=True
                StartTimeBoostDemand=time.time()
              else:
                if StartTimeBoostDemand>DelayTimeBoostDemand:
                  BoostMode=True
                  BoostDemand=False
          elif SetPointTempDepart>=SetPointStepTempDepart:
            if StepTempDepart==False:
              StepTempDepart=True
              StartTimeStepTempDepart=time.time()
            else:
              if (time.time()-StartTimeStepTempDepart)>3600 and ReleaseSetPointTempDepart==False:
                ReleaseSetPointTempDepart=True
            if ReleaseSetpointTempDepart==False:
              SetPointTempDepart=SetPointStepTempDepart
            else:
              Integral1=Integral1+ErrNowTempAmb
          else:
            Integral1=Integral1+ErrNowTempAmb
            StepTempDepart=False
            ReleaseSetPointTempDepart=False
        else:
          ExitFromBm=True
        Status=DomoJson.WriteTemp(IdxSetPointTempDepart,round(SetPointTempDepart,1))
        if Status!='OK':
            DbError.Write(__namescript__,"Erreur d'écriture dans Domoticz de la consigne de température de départ")
        #----------------------------------------------

        #----------------PID 2-------------------------
        TempDepart=DomoJson.Read(IdxTempDepart,1)
        ErrNowTempDepart=SetPointTempDepart-TempDepart
        if ErrNowTempDepart>ErrMaxTempDepart:
          BoostMode=True
        else:
          if SetPointTempDepart==0.0:
            RapCyc=0.0
          else:
            if abs(ErrNowTempDepart)>Bm2:
              RapCyc=RapCyc0+K1*ErrNowTempDepart+K2*(ErrNowTempDepart-ErrPreviousTempDepart)+K3*(ErrNowTempDepart+ErrPrevious0TempDepart-2*ErrPreviousTempDepart)
            else:
              RapCyc=RapCyc0
          if RapCyc>RapCycMax:
            RapCyc=RapCycMax
          elif RapCyc<0.0:
            RapCyc=0.0
          ErrPrevious0TempDepart=ErrPreviousTempDepart
          ErrPreviousTempDepart=ErrNowTempDepart
        #----------------------------------------------

        #------------Pilotage chaudière---------------
        Status=DomoJson.WritePercent(IdxCommande,RapCyc)
        if Status!='OK':
          DbError.Write(__namescript__,"Erreur d'écriture dans Domoticz du rapport cyclique")
        TOn=RapCyc*Periode/100
        TOff=Periode-TOn
        if TOn!=0.0:
          Status=SCS.LightCommand(11,ScsAdress)
          if Status!='CommandSucceeded':
            DbError.Write(__namescript__,Status)
          else:
            time.sleep(TOn)
        if TOff!=0.0:
          Status=SCS.LightCommand(0,ScsAdress)
          if Status!='CommandSucceeded':
            DbError.Write(__namescript__,Status)
          else:
            time.sleep(TOff)
        #----------------------------------------------

    else:
      #-------- Mise à zéro de la commande------------
      Status=DomoJson.WritePercent(IdxCommande,RapCyc)
      if Status!='OK':
        DbError.Write(__namescript__,"Erreur d'écriture dans Domoticz du rapport cyclique")
      #----------------------------------------------

      if StandBy==False:
        #-------- Mise au repos du relais--------------
        Status=SCS.LightCommand(0,ScsAdress)
        if Status!='CommandSucceeded':
          DbError.Write(__namescript__,Status)
        #----------------------------------------------

        #------Paramètres PID1--------------
        ErrPreviousTempAmb=0.0
        T0=DomoJson.Read(IdxTempAmb,0)
        Integral1=0.0
        Derivee1=0.0
        SetPointTempDepart=0.0
        #----------------------------------

        #------Paramètres PID2--------------
        ErrPreviousTempDepart=0.0
        ErrPrevious0TempDepart=0.0
        #----------------------------------

        #------Paramètres Relance----------
        BoostMode=True
        #----------------------------------
        StandBy=True
      time.sleep(Periode)
  except Exception, e:
    try:
      DbError.Write(__namescript__,str(e))
    except Exception, e:
      pass
    time.sleep(Periode)


allezlelosc
Messages : 49
Enregistré le : 21 oct. 2015, 21:34

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par allezlelosc »

Avec ce nouveau scirpt :

- je régule à 0.1°C quand les apports sont limités (la nuit)
- les dépassements sont limités à 0.3°C quand les apports sont importants : ensoleillement, flambée

Voici la courbe de tendance pour la température couloir.
la consigne est à 19.5°C et la bande morte à 0.1°C ce qui veut dire que ma consigne de température calculée ne varie pas quand la température du couloir vaut 19.4 ou 19.5 ou 19.6.

nb: pour l'instant je suis en période de test et je ne fais pas de période de réduit la nuit
temp couloir.png
temp couloir.png (81.58 Kio) Vu 10430 fois
la période repérée 1 correspond à la fin de la période d'ensoleillement d'hier, on voit la température chuter jusqu'à 19.2°C pour remonter dans la zone morte

vers 18h, période 2, j'ai allumé la cheminée, on voit les apports, la température monte jusqu'à 19.9 pour retomber après et se stabiliser à 19.5.

vers 23h période 3 je suis allé au lit donc les effets de la cheminée se sont progressivement éteints.

entre 3 et 4 : c'est la nuit et le début de la matinée, la température extérieure a progressivement chuté et on constate quelques périodes de relance quand la température "tombe" à 19.3

en 4 : c'est le soleil qui revient et on baisse le régime de la chaudière

Voici sur la même période la température de départ chaudière et la consigne calculée pour maintenir la température du couloir à 19.5. la Bm est de +/-1°C sur la température de départ.
temp départ.png
temp départ.png (270.6 Kio) Vu 10430 fois

deennoo
Messages : 4020
Enregistré le : 25 janv. 2015, 02:00

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par deennoo »

Ah bah voilà ! Super ! De la régulation, avec PID et prise en compte de la vrai température extérieur et non une estimation.

Chapeau ! Je n'aurait pas déjà la bonne regul de ma chaudière je partirais avec la tienne.

Un petit chipototement : ta sonde de température servant a tes relevés est dans la pire pièces d'une maison : le couloir qui est par définition une pièce a courant d'air
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr

bruch05
Messages : 43
Enregistré le : 27 févr. 2016, 21:06

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par bruch05 »

Bonjour,

Merci infiniment pour ce retour d'expérience très précis.

Concernant le pilotage de la chaudière en PWM, est ce que le module d'interface que tu utilises pilote un relais avec contact sec ?
Si oui, est ce que la fermeture / ouverture sur une base moyenne de 30 secondes ne risquent pas de le "cramer" à la longue ?

Merci
Tof

allezlelosc
Messages : 49
Enregistré le : 21 oct. 2015, 21:34

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par allezlelosc »

bruch05 a écrit :Bonjour,

Merci infiniment pour ce retour d'expérience très précis.

Concernant le pilotage de la chaudière en PWM, est ce que le module d'interface que tu utilises pilote un relais avec contact sec ?
Si oui, est ce que la fermeture / ouverture sur une base moyenne de 30 secondes ne risquent pas de le "cramer" à la longue ?

Merci
Tof
effectivement le module legrand utilise des relais mécaniques dont je ne connais pas la durée de vie. J'interface la chaudière au module avec un relais 2RT finder 46.52.8.230.0054 dont la durée de vie de 10 000 000 cycles ce qui donne avec une période de 30s : une durée de vie de 300 000 000s soit 3500 jours .

il faut dire qu'un changement d'état toutes les 30s c'est pas trop contraignant pour un relais car la charge c'est une bricole : on commute pas 8A à 230V mais quelques mA à 10V


Toutefois je serais preneur d'un relais statique compatible avec les protocoles que j'utilise
Modifié en dernier par allezlelosc le 01 mars 2016, 13:34, modifié 1 fois.

allezlelosc
Messages : 49
Enregistré le : 21 oct. 2015, 21:34

Re: Régulation d'une chaudière Frisquet ECO radio System

Message par allezlelosc »

deennoo a écrit :Ah bah voilà ! Super ! De la régulation, avec PID et prise en compte de la vrai température extérieur et non une estimation.

Chapeau ! Je n'aurait pas déjà la bonne regul de ma chaudière je partirais avec la tienne.

Un petit chipototement : ta sonde de température servant a tes relevés est dans la pire pièces d'une maison : le couloir qui est par définition une pièce a courant d'air

Bonjour et merci pour les encouragements.

par contre ma régulation ne fait pas (encore) intervenir la température extérieure mais je fais une cascade ambiance/départ, c'est à dire que je maitrise la température en ambiance en contrôlant la température de départ.

cependant le script est tout à fait adaptable à une régulation en fonction de l'extérieur, il "suffit" de remplacer la partie #*****PID1***** par un algorithme reliant la température extérieure à une consigne de température de départ (une loi d'eau par exemple).

je trouve ta remarque sur la position de la sonde tout à fait pertinente et je vais donc en profiter pour parler d'une notion en automatisme qui intervient dans tous les systèmes : les perturbations. et oui s'il n'y en avait pas, il n'y aurait pas à se creuser la tête pour trouver les bons algos !

Les perturbations sont les choses qui nous embêtent mais dont il faut contenir les effets afin d'obtenir des systèmes robustes. La robustesse d'un automatisme est d'ailleurs une autre notion très importante.
C'est parce que je ne trouvais pas mon système assez robuste que j'ai fait évoluer mon algorithme !

il existe 3 types de perturbations :
- les perturbations sur la mesure
- les perturbations sur la commande
- les perturbations sur la grandeur à réguler

prenons les perturbations sur la commande, quand j'expliquais dans mon retour d’expérience que la température de départ décrochait sans explication c'était justement une perturbation sur la commande. Mon système de commande (la chaudière) répond de manière non souhaitée.

les perturbations sur la mesure relèvent du système de mesure : sonde de température, pression, niveau etc...

et enfin les perturbations sur la grandeur à réguler, pour l'exemple de la température chez moi les perturbations sont :
- la température extérieure qui influe sur la température intérieure
- toutes celles évoquées dans ma réflexion sur la position de la sonde : ensoleillement, flambée, amis, ..., une porte restée ouverte !! ah les enfants
- les courants d'air dont parle Deenoo

une fois qu'on a identifié tout ou partie des perturbations, on essaye de quantifier leurs impacts sur le système. Si ces impacts sont importants on réfléchit à comment supprimer les perturbations (on ferme à clé les portes pour les enfants :) ), les réduire ou à les contourner. Cette réflexion c'est justement celle qui consiste à définir l'emplacement des capteurs, leur type et à concevoir un correcteur ou un algorithme de commande : l'automatisme en fait
Et oui le PID ne fait pas tout, c'est juste un outil mis à la disposition des automaticiens qui sur certains cas se suffit à lui même.
prenons l'exemple d'un tournevis (le PID) parfois il suffit pour visser la vis mais parfois il faut lui adjoindre un renvoi d'angle, un prolongateur car à lui seul il ne permet pas de visser la vis.

Pour mon cas et concernant les courants d'air dans le couloir, cette perturbation n'a pas d'impact négatif sur la robustesse du système.
plusieurs hypothèses peuvent expliquer cette situation :
- le courant d'air est continu. Ce qui est tout à fait possible : VMC en marche continue, gradiant de température entre la partie nuit et jour toujours "dans le même sens". Du coup comme les lois de la physique tendent à homogénéiser les milieux et que les transferts de chaleur se font des milieux chauds vers les milieux froids", la température du couloir est l'image "filtrée" de celle du séjour et donc je profite des bienfaits de ces courants d'air (comme je le disais dans ma réflexion sur la position de la sonde dans le couloir).
-le courant d'air est discontinu. le temps de réponse de la sonde de température est, par chance, suffisamment grand pour lisser/atténuer les effets du courant d'air sur le système.

Pour conclure, je dirai qu'à chaque problème sa solution. et que ce qui est vrai chez moi ne l'est pas forcément chez vous.

Bonne réflexion à tous !!

Répondre