- generalized heaters
This commit is contained in:
+28
-10
@@ -34,6 +34,20 @@ class HeaterTask(ATask):
|
||||
async def send(self, data):
|
||||
await self.msg_handler.send(data)
|
||||
|
||||
def get_next_smaller_power(self, power):
|
||||
result = self.device.get_power_min()
|
||||
p_list = [p for p in self.device.get_powers() if p <= power]
|
||||
if len(p_list) > 0:
|
||||
result = p_list[-1]
|
||||
return result
|
||||
|
||||
def get_next_greater_power(self, power):
|
||||
result = self.device.get_power_min()
|
||||
p_list = [p for p in self.device.get_powers() if p > power]
|
||||
if len(p_list) > 0:
|
||||
result = p_list[0]
|
||||
return result
|
||||
|
||||
async def on_process(self):
|
||||
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
|
||||
await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.device.get_power_max()}}})
|
||||
@@ -45,22 +59,26 @@ class HeaterTask(ATask):
|
||||
|
||||
with self.device.open():
|
||||
while True:
|
||||
# Combine power set from different sources
|
||||
power_soll = max(self.power_soll, self.power_actor)
|
||||
on_count = pulse_period_count
|
||||
if self.device.get_power_min() > 0:
|
||||
on_count = pulse_period_count*min(1, power_soll / self.device.get_power_min())
|
||||
|
||||
# Calculate duty cycle
|
||||
power_low = self.get_next_smaller_power(power_soll)
|
||||
power_high = self.get_next_greater_power(power_soll)
|
||||
power_step = power_high - power_low
|
||||
power_diff = power_soll - power_low
|
||||
duty = power_diff / power_step
|
||||
|
||||
on_count = pulse_period_count*duty
|
||||
|
||||
self.pulse_counter += 1
|
||||
if self.pulse_counter >= pulse_period_count:
|
||||
self.pulse_counter = 0
|
||||
|
||||
if power_soll < self.device.get_power_min():
|
||||
if power_soll == 0 or self.pulse_counter >= on_count:
|
||||
self.device.set_power(0)
|
||||
elif self.pulse_counter < on_count:
|
||||
self.device.set_power(self.device.get_power_min())
|
||||
else:
|
||||
self.device.set_power(power_soll)
|
||||
if power_soll == 0 or self.pulse_counter >= on_count:
|
||||
self.device.set_power(power_low)
|
||||
elif self.pulse_counter < on_count:
|
||||
self.device.set_power(power_high)
|
||||
|
||||
self.device.process()
|
||||
await asyncio.sleep(self.interval)
|
||||
|
||||
Reference in New Issue
Block a user