Skip to content

Commit

Permalink
Improve freezing protection:
Browse files Browse the repository at this point in the history
- Implement hysteresis to avoid unnecessary cycles
- Prefer internal dome sensor over chiller sensor
  • Loading branch information
pchote committed Apr 7, 2024
1 parent 77342fc commit e2c2141
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 4 deletions.
31 changes: 30 additions & 1 deletion chillerd
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,12 @@ class ChillerDaemon:
self._running = True
self._port = None
self._port_error = False
self._temperature_error = False

self._mode = ChillerMode.Automatic
self._request_timestamp = Time('2000-01-01')
self._request_enabled = False
self._antifreeze_enabled = False

self._status = {
'date': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'),
Expand Down Expand Up @@ -142,9 +144,36 @@ class ChillerDaemon:
else:
status = ChillerStatus.Idle

# Prefer dome sensor over chiller sensor (which may be locally warmer due to heat from chiller)
try:
with self._config.temperature_daemon.connect() as daemon:
environment = daemon.last_measurement()

if self._config.temperature_valid_key and self._config.temperature_valid_key in environment:
if not environment[self._config.humidity_valid_key]:
if not self._temperature_error:
self._temperature_error = True
log.error(self._config.log_name, 'Lost contact with temperature sensor')

if self._temperature_error:
self._temperature_error = False
log.info(self._config.log_name, 'Restored contact with temperature sensor')

if not self._temperature_error:
ambient = environment[self._config.temperature_value_key]

except Exception:
self._temperature_error = True
log.error(self._config.log_name, 'Lost contact with temperature sensor')

with self._loop_condition:
if self._mode == ChillerMode.Automatic:
request_enabled = self._request_timestamp > Time.now() - 1 * u.minute or ambient < 5.0
antifreeze_limit = self._config.antifreeze_enable_limit
if self._antifreeze_enabled:
antifreeze_limit = self._config.antifreeze_disable_limit

self._antifreeze_enabled = ambient < antifreeze_limit
request_enabled = self._antifreeze_enabled or self._request_timestamp > Time.now() - 1 * u.minute
else:
request_enabled = self._request_enabled

Expand Down
7 changes: 6 additions & 1 deletion clasp.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,10 @@
"serial_port": "/dev/chiller",
"serial_baud": 9600,
"serial_timeout": 5,
"query_delay": 7
"query_delay": 7,
"temperature_daemon": "clasp_domealert",
"temperature_value_key": "internal_humidity",
"temperature_valid_key": "internal_humidity_valid",
"antifreeze_enable_limit": 5,
"antifreeze_disable_limit": 7
}
32 changes: 30 additions & 2 deletions rockit/chiller/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
'additionalProperties': False,
'required': [
'daemon', 'log_name', 'control_machines', 'camera_machines',
'serial_port', 'serial_baud', 'serial_timeout', 'query_delay'
'serial_port', 'serial_baud', 'serial_timeout', 'query_delay',
'temperature_daemon', 'temperature_valid_key', 'temperature_value_key',
'antifreeze_enable_limit', 'antifreeze_disable_limit'
],
'properties': {
'daemon': {
Expand Down Expand Up @@ -62,10 +64,28 @@
'query_delay': {
'type': 'number',
'min': 0
}
},
'temperature_daemon': {
'daemon_name': True,
'type': 'string',
},
'temperature_value_key': {
'type': 'string',
},
'temperature_valid_key': {
'type': 'string',
},
'antifreeze_enable_limit': {
'type': 'number'
},
'antifreeze_disable_limit': {
'type': 'number'
},

}
}


class Config:
"""Daemon configuration parsed from a json file"""
def __init__(self, config_filename):
Expand All @@ -88,3 +108,11 @@ def __init__(self, config_filename):
self.serial_baud = int(config_json['serial_baud'])
self.serial_timeout = int(config_json['serial_timeout'])
self.query_delay = config_json['query_delay']
self.temperature_daemon = getattr(daemons, config_json['temperature_daemon'])
self.temperature_value_key = config_json['temperature_value_key']
if 'temperature_valid_key' in config_json:
self.temperature_valid_key = config_json['temperature_valid_key']
else:
self.temperature_valid_key = None
self.antifreeze_enable_limit = config_json['antifreeze_enable_limit']
self.antifreeze_disable_limit = config_json['antifreeze_disable_limit']

0 comments on commit e2c2141

Please sign in to comment.