Files
brewpi/components/sud.py
T
jensandClaude Sonnet 4.6 19dc7a95bb Fix Sud hold duration units: seconds, not minutes
_advance() multiplied "duration" by 60, treating it as minutes;
stirrer_speed (percent) and stirrer_time_on/off (seconds) were already
handled correctly with no conversion. Also fix the README's "duration
minutes" wording to match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 19:17:42 +02:00

73 lines
1.5 KiB
Python

import json
from enum import Enum
from utils.value import AttributeChange
class SudState(Enum):
IDLE = 0
RAMPING = 1
HOLDING = 2
WAIT_USER = 3
DONE = 4
class Sud(AttributeChange):
def __init__(self, path):
AttributeChange.__init__(self)
with open(path) as f:
data = json.load(f)
self.name = data.get('Name', '')
self.description = data.get('Description', '')
self.schedule = data['schedule']
self.index = -1
self.hold_remaining = 0.0
self.state = SudState.IDLE
self.step = None
self.user_message = None
def start(self):
if self.state != SudState.IDLE:
return
self.index = -1
self._advance()
def confirm(self):
if self.state == SudState.WAIT_USER:
self._advance()
def temp_reached(self):
if self.state == SudState.RAMPING:
self._finish_step()
def tick(self, dt):
if self.state == SudState.HOLDING:
self.hold_remaining -= dt
if self.hold_remaining <= 0:
self._finish_step()
def _advance(self):
self.index += 1
if self.index >= len(self.schedule):
self.state = SudState.DONE
self.user_message = None
self.step = None
return
next_step = self.schedule[self.index]
if next_step['type'] == 'heat':
self.state = SudState.RAMPING
else:
self.hold_remaining = next_step.get('duration', 0)
self.state = SudState.HOLDING
self.user_message = next_step.get('user_message')
self.step = next_step
def _finish_step(self):
if self.step.get('user_wait_for_continue', False):
self.state = SudState.WAIT_USER
else:
self._advance()