J'avance , manque de temps surtout;.
J'ai fait un script complet en python qui permet de récupérer les valeurs sur le bus Opentherm, et qui permet d'envoyer les commandes que l'on veut.
J'appelle ce script depuis SSH commander.
exemples :
LECTURE
/usr/bin/python /usr/bin/opentherm.py r ALL ==> récupére la totalité des infos
réponse : 00000011/00000000,0.00,00000001/00000001,0.00,0/0,0.00,0.00,0.50,0.00,38.50,0.00,0.08,37.50,60/45,0/0,0.00,0.00,0,0,0,0,0,0,0,0
/usr/bin/python /usr/bin/opentherm.py r 28 ==> Va lire (r) le MsgID 28 (Return water temperature)
réponse : 30.00
/usr/bin/python /usr/bin/opentherm.py r 48 ==> Va lire (r) le MsgID 48 (DHW setpoint boundaries)
réponse : 60/45
Pour récuperer de manière plus utile directement dans Jeedom :
/usr/bin/python /usr/bin/opentherm.py r L48
réponse : 60
/usr/bin/python /usr/bin/opentherm.py r H48
réponse : 45
ECRITURE :
/usr/bin/python /usr/bin/opentherm.py w HW=0 (HotWater = 0 : coupure chauffage de l'eau sanitaire)
Reponse: HW: 0
On peut en fait envoyer toutes les commandes supportées par la gateway. Apres c'est selon sa chaudiere et son thermostat.
- 08-10-2018 14-45-37.jpg (78.12 Kio) Consulté 9935 fois
Perso, ma chaudiere n'est pas terrible et je récupère peu d'infos et j'ai peu d'actions qui fonctionnent, mais j'ai l'essentiel :
Lecture :
T° d'eau chauffage dans la chaudiere
T° de retour d'eau chauffage à la chaudiere
Pression circuit chauffage
Pourcentage de modulation de la flamme
Limite de T° d'eau de chauffage
Ecriture :
HW à 0 ou 1 : Eau sanitaire ou pas
CH à 0 ou 1 : chauffage actif ou pas
CS = T° : Température de chauffe de l'eau pour le circuit de chauffage
Coté thermostat Opentherm, et bien je n'en ai pas donc...
J'avais l'impression que le thermostat d'origine en ebus de ma chaudiere (+ sonde externe T°) entrait en conflit avec l'opentherm, donc c'est débranché totalement pour l'instant. Je retesterais plus tard.
Code : Tout sélectionner
#!/usr/bin/env python
import time
import serial
import sys
import os.path
import logging
from logging.handlers import RotatingFileHandler
# Constants
StatusCommand = "PS=1" + chr(13) # Status Command on Serial
ReadCache = 90 # Time in sec for cache on opentherm bus (only for reading values, no cache for writing)
cachefile = "/tmp/opentherm.values"
logfile ="/home/pi/opentherm.log"
MaxLogFileSize = 5*1024*1024 # max size for log file in Bytes x*1024*1024 ==> x MB max
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
file_handler = RotatingFileHandler(logfile, 'a', MaxLogFileSize, 1)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
#Parameters
Operation = sys.argv[1].lower() # Read or write (r or R or w or W)
if Operation =='r':
MsgID=sys.argv[2] # MsgID concerned
logger.info('Reading Requested on MsgID ' + MsgID)
#Dictionnaries
equivalence={} # MsgID requested to Array position
equivalence['0']=0 # Status Full field
equivalence['1']=1 # Control setpoint
equivalence['6']=2 # Remote parameter flags
equivalence['14']=3 # Maximum relative modulation level
equivalence['15']=4 # Boiler capacity and modulation limits
equivalence['16']=5 # Room Setpoint
equivalence['17']=6 # Relative modulation level
equivalence['18']=7 # CH water pressure
equivalence['24']=8 # Room temperature
equivalence['25']=9 # Boiler water temperature
equivalence['26']=10 # DHW temperature
equivalence['27']=11 # Outside temperature
equivalence['28']=12 # Return water temperature
equivalence['48']=13 # DHW setpoint boundaries
equivalence['49']=14 # Max CH setpoint boundaries
equivalence['56']=15 # DHW setpoint
equivalence['57']=16 # Max CH water setpoint
equivalence['116']=17 # Burner starts
equivalence['117']=18 # CH pump starts
equivalence['118']=19 # DHW pump/valve starts
equivalence['119']=20 # DHW burner starts
equivalence['120']=21 # Burner operation hours
equivalence['121']=22 # CH pump operation hours
equivalence['122']=23 # DHW pump/valve operation hours
equivalence['123']=24 # DHW burner operation hours
##### #Read from Opentherm Bus or from file depending cache value
if (not os.path.exists(cachefile)) or int(time.time() - os.path.getctime(cachefile)) > ReadCache:
logger.info('Reading from Bus, cache too old')
# Open serial port
serialport = serial.Serial(
port='/dev/ttyUSB0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
serialport.write(StatusCommand) # Send command
ACK = serialport.readline() # Get Aknowledge
logger.info('Acknowledge on command ' + ACK.replace("\n",""))
StatusValueRead = serialport.readline() # Get all values
file = open(cachefile,"w")
file.write(StatusValueRead)
file.close()
else:
logger.info('Using cache file')
file = open(cachefile,"r")
StatusValueRead = file.read()
file.close()
values=StatusValueRead.split(",") # Store values in an Array
##### Send result from read
try:
if MsgID[0]=='L':
answer = values[equivalence[MsgID[1:]]].split('/')[0]
print answer
logger.info('Answer sent (1st Byte) : ' + answer)
elif MsgID[0]=='H':
answer = values[equivalence[MsgID[1:]]].split('/')[1]
print answer
logger.info('Answer sent (2nd Byte) : ' + answer)
elif MsgID=='ALL' or MsgID=='all':
answer = StatusValueRead
print answer
logger.info('ALL: Raw Answer sent : ' + answer)
else:
answer = values[equivalence[MsgID]]
print answer
logger.info('Answer sent : ' + answer)
except: # If MsgID is not valid, answer with Error with '-1'
print '-1'
logger.warning('MsgID not valid, "-1" Error code Sent')
elif Operation =='w':
Command=sys.argv[2] + chr(13)# Command to send
logger.info('Write Requested with command ' + Command)
# Open serial port
serialport = serial.Serial(
port='/dev/ttyUSB0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
serialport.write(Command) # Send command
ACK = serialport.readline() # Get Aknowledge
print ACK
logger.info('Acknowledge on command ' + ACK.replace("\n",""))
else:
print -1
logger.error('Unknown Command : ' + Operation)