67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
import asyncio
|
|
from tasks import ATask
|
|
from components import AHeater
|
|
from ws.message import MsgIo
|
|
from utils.value import ChangedInteger
|
|
|
|
|
|
class HeaterTask(ATask):
|
|
def __init__(self, device: AHeater, interval, msg_handler: MsgIo):
|
|
ATask.__init__(self, interval)
|
|
|
|
self.device = device
|
|
self.interval = interval
|
|
self.msg_handler = msg_handler
|
|
msg_handler.set_recv_handler(self.recv)
|
|
self.power_soll = 0
|
|
self.pulse_counter = 0
|
|
|
|
def actor(self, y):
|
|
self.power_soll = max(0, 250 + self.device.get_power_max() * y)
|
|
|
|
def on_changed_active(self, is_activated):
|
|
asyncio.create_task(self.send({'Activate': int(is_activated)}))
|
|
|
|
def on_changed_power(self, power):
|
|
asyncio.create_task(self.send({'Power': power}))
|
|
|
|
async def recv(self, data):
|
|
for pair in data.items():
|
|
if 'Power' in pair[0]:
|
|
self.power_soll = pair[1]
|
|
|
|
async def send(self, data):
|
|
await self.msg_handler.send(data)
|
|
|
|
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()}}})
|
|
|
|
self.device.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
|
|
|
|
pulse_period_s = 10
|
|
pulse_period_count = pulse_period_s/self.interval
|
|
|
|
with self.device.open():
|
|
while True:
|
|
on_count = pulse_period_count
|
|
if self.device.get_power_min() > 0:
|
|
on_count = pulse_period_count*min(1, self.power_soll / self.device.get_power_min())
|
|
|
|
self.pulse_counter += 1
|
|
if self.pulse_counter >= pulse_period_count:
|
|
self.pulse_counter = 0
|
|
|
|
if self.power_soll < self.device.get_power_min():
|
|
if self.pulse_counter < on_count:
|
|
self.device.set_power(self.device.get_power_min())
|
|
else:
|
|
self.device.set_power(0)
|
|
else:
|
|
self.device.set_power(self.power_soll)
|
|
|
|
self.device.process()
|
|
await asyncio.sleep(self.interval)
|
|
|
|
|