- redefine activate method

- for task introduced open() conext method
This commit is contained in:
jens
2020-12-18 15:58:02 +01:00
parent a3510ffe8f
commit 4e508c86c5
9 changed files with 85 additions and 62 deletions
+9 -11
View File
@@ -7,7 +7,6 @@ class HeaterHendi(AHeater):
AHeater.__init__(self) AHeater.__init__(self)
self.hendi = HendiCtrl(params['port'], params['speed']) self.hendi = HendiCtrl(params['port'], params['speed'])
self.power_set = self.get_power_min() self.power_set = self.get_power_min()
self.is_active = False
self.power_eff = 0 self.power_eff = 0
def get_power_min(self): def get_power_min(self):
@@ -19,21 +18,21 @@ class HeaterHendi(AHeater):
return caps['pwr_watts_max'] return caps['pwr_watts_max']
def activate(self, enable): def activate(self, enable):
self.is_active = enable
if not self.hendi.isRemoteEnable():
self.hendi.remoteEnable(1)
if enable: if enable:
self.hendi.setSwitch(1) self.hendi.remoteEnable(1)
else: else:
self.hendi.setSwitch(0) self.hendi.remoteEnable(0)
def is_activated(self): def is_activated(self):
s = self.hendi.getSwitch() s = self.hendi.isRemoteEnable()
return '1' in s return '1' in s
def process(self): def process(self):
power = self.power_set if self.is_active else 0 power = self.power_set
if power == 0:
self.hendi.setSwitch(0)
else:
self.hendi.setSwitch(1)
self.hendi.setPowerWatts(power) self.hendi.setPowerWatts(power)
self.power_eff = self.hendi.getPowerWatts() self.power_eff = self.hendi.getPowerWatts()
@@ -41,5 +40,4 @@ class HeaterHendi(AHeater):
self.power_set = max(self.get_power_min(), min(self.get_power_max(), power)) self.power_set = max(self.get_power_min(), min(self.get_power_max(), power))
def get_power(self): def get_power(self):
result = self.hendi.getPowerWatts() return self.power_eff
return result
+2 -4
View File
@@ -47,15 +47,13 @@ class StirrerPololu1376(AStirrer):
return self.speed return self.speed
return 0 return 0
def on_activate(self, enable): def activate(self, enable):
print("activate {}".format(enable))
if enable: if enable:
self.ser_send("go") self.ser_send("go")
self.set_speed(self.speed)
else: else:
self.ser_send("X") self.ser_send("X")
print("on_activate {}".format(enable))
def on_set_speed(self, speed): def on_set_speed(self, speed):
self.ser_send("F" + str(int(speed)) + "%") self.ser_send("F" + str(int(speed)) + "%")
print("Set speed to {} %".format(speed)) print("Set speed to {} %".format(speed))
+2 -5
View File
@@ -6,11 +6,8 @@ class StirrerSim(AStirrer):
def __init__(self, params): def __init__(self, params):
AStirrer.__init__(self, params['dt']) AStirrer.__init__(self, params['dt'])
def __del__(self): def activate(self, enable):
self.activate(False) print("activate {}".format(enable))
def on_activate(self, enable):
print("on_activate {}".format(enable))
def get_speed(self): def get_speed(self):
if self.isOn and self.is_activated(): if self.isOn and self.is_activated():
+11
View File
@@ -1,5 +1,6 @@
import abc import abc
from utils.value import AttributeChange from utils.value import AttributeChange
from contextlib import contextmanager
class AHeater(AttributeChange): class AHeater(AttributeChange):
@@ -14,6 +15,16 @@ class AHeater(AttributeChange):
def get_power_max(self): def get_power_max(self):
pass pass
@contextmanager
def open(self):
try:
self.activate(True)
yield None
finally:
self.activate(False)
return None
@abc.abstractmethod @abc.abstractmethod
def activate(self, enable): def activate(self, enable):
return None return None
+15
View File
@@ -1,15 +1,30 @@
import abc import abc
from utils.value import AttributeChange from utils.value import AttributeChange
from contextlib import contextmanager
class APlant(AttributeChange): class APlant(AttributeChange):
def __init__(self): def __init__(self):
AttributeChange.__init__(self) AttributeChange.__init__(self)
@contextmanager
def open(self):
try:
self.activate(True)
yield None
finally:
self.activate(False)
return None
@abc.abstractmethod @abc.abstractmethod
def activate(self, enable): def activate(self, enable):
return None return None
@abc.abstractmethod
def is_activated(self):
return None
@abc.abstractmethod @abc.abstractmethod
def process(self): def process(self):
pass pass
+14 -7
View File
@@ -1,5 +1,6 @@
import abc import abc
from utils.value import AttributeChange from utils.value import AttributeChange
from contextlib import contextmanager
class AStirrer(AttributeChange): class AStirrer(AttributeChange):
@@ -11,7 +12,6 @@ class AStirrer(AttributeChange):
self.dutyCycle = 1 self.dutyCycle = 1
self.cycleCounter = 0 self.cycleCounter = 0
self.isOn = 1 self.isOn = 1
self.is_active = False
def process(self): def process(self):
isOn = self.isOn isOn = self.isOn
@@ -51,14 +51,21 @@ class AStirrer(AttributeChange):
def on_set_speed(self, speed): def on_set_speed(self, speed):
pass pass
@contextmanager
def open(self):
try:
self.activate(True)
yield None
finally:
self.activate(False)
return None
@abc.abstractmethod @abc.abstractmethod
def on_activate(self, enable): def activate(self, enable):
pass pass
def activate(self, enable): @abc.abstractmethod
self.is_active = enable
self.on_activate(enable)
def is_activated(self): def is_activated(self):
return self.is_active pass
+3
View File
@@ -35,6 +35,9 @@ class Pot(APlant):
leak = 1/self.M * self.L * (self.theta_amb - self.temp)/self.theta_amb leak = 1/self.M * self.L * (self.theta_amb - self.temp)/self.theta_amb
self.temp += (self.power_actual / (self.M * self.C) + leak) * self.dt self.temp += (self.power_actual / (self.M * self.C) + leak) * self.dt
def is_activated(self):
return True
def set_power(self, power): def set_power(self, power):
self.power_set = power self.power_set = power
+25 -28
View File
@@ -6,10 +6,10 @@ from utils.value import ChangedInteger
class HeaterTask(ATask): class HeaterTask(ATask):
def __init__(self, heater_device: AHeater, interval, msg_handler: MsgIo): def __init__(self, device: AHeater, interval, msg_handler: MsgIo):
ATask.__init__(self, interval) ATask.__init__(self, interval)
self.heater = heater_device self.device = device
self.interval = interval self.interval = interval
self.msg_handler = msg_handler self.msg_handler = msg_handler
msg_handler.set_recv_handler(self.recv) msg_handler.set_recv_handler(self.recv)
@@ -17,7 +17,7 @@ class HeaterTask(ATask):
self.pulse_counter = 0 self.pulse_counter = 0
def actor(self, y): def actor(self, y):
self.power_soll = max(0, 250 + self.heater.get_power_max() * y) self.power_soll = max(0, 250 + self.device.get_power_max() * y)
def on_changed_active(self, is_activated): def on_changed_active(self, is_activated):
asyncio.create_task(self.send({'Activate': int(is_activated)})) asyncio.create_task(self.send({'Activate': int(is_activated)}))
@@ -29,45 +29,42 @@ class HeaterTask(ATask):
for pair in data.items(): for pair in data.items():
if 'Power' in pair[0]: if 'Power' in pair[0]:
self.power_soll = pair[1] self.power_soll = pair[1]
if 'Activate' in pair[0]:
self.heater.activate(pair[1] == 1)
async def send(self, data): async def send(self, data):
await self.msg_handler.send(data) await self.msg_handler.send(data)
async def on_process(self): async def on_process(self):
print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval)) print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))
await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.heater.get_power_max()}}}) await self.send({'Capabilities': {'Power': {'Min': 0, 'Max': self.device.get_power_max()}}})
self.heater.set_on_changed('is_active', ChangedInteger(self.on_changed_active).set) self.device.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
self.heater.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set)
self.heater.activate(False)
pulse_period_s = 1 pulse_period_s = 1
pulse_period_count = pulse_period_s/self.interval pulse_period_count = pulse_period_s/self.interval
while True: with self.device.open():
if self.power_soll < self.heater.get_power_min(): while True:
self.heater.set_power(self.heater.get_power_min()) if self.power_soll < self.device.get_power_min():
self.heater.activate(False) self.device.set_power(self.device.get_power_min())
else: self.device.activate(False)
self.heater.set_power(self.power_soll) else:
self.heater.activate(True) self.device.set_power(self.power_soll)
self.device.activate(True)
on_count = pulse_period_count on_count = pulse_period_count
if self.heater.get_power_min() > 0: if self.device.get_power_min() > 0:
on_count = pulse_period_count*min(1, self.power_soll/self.heater.get_power_min()) on_count = pulse_period_count*min(1, self.power_soll / self.device.get_power_min())
self.pulse_counter += 1 self.pulse_counter += 1
if self.pulse_counter >= pulse_period_count: if self.pulse_counter >= pulse_period_count:
self.pulse_counter = 0 self.pulse_counter = 0
if self.pulse_counter < on_count: if self.pulse_counter < on_count:
self.heater.activate(True) self.device.activate(True)
else: else:
self.heater.activate(False) self.device.activate(False)
self.heater.process() self.device.process()
await asyncio.sleep(self.interval) await asyncio.sleep(self.interval)
+4 -7
View File
@@ -21,9 +21,6 @@ class StirrerTask(ATask):
def on_cycletime_changed(self, value): def on_cycletime_changed(self, value):
asyncio.create_task(self.send({'CycleTime': value})) asyncio.create_task(self.send({'CycleTime': value}))
def on_changed_active(self, is_activated):
asyncio.create_task(self.send({'Activate': int(is_activated)}))
async def recv(self, data): async def recv(self, data):
for pair in data.items(): for pair in data.items():
if 'Speed' in pair[0]: if 'Speed' in pair[0]:
@@ -39,12 +36,12 @@ class StirrerTask(ATask):
self.device.set_on_changed("speed", self.on_speed_changed) self.device.set_on_changed("speed", self.on_speed_changed)
self.device.set_on_changed("dutyCycle", self.on_dutycycle_changed) self.device.set_on_changed("dutyCycle", self.on_dutycycle_changed)
self.device.set_on_changed("cycleTime", self.on_cycletime_changed) self.device.set_on_changed("cycleTime", self.on_cycletime_changed)
self.device.set_on_changed('is_active', ChangedInteger(self.on_changed_active).set)
self.device.set_speed(50.0) self.device.set_speed(50.0)
self.device.set_cycle_time(10.0) self.device.set_cycle_time(10.0)
self.device.set_duty_cycle(1.0) self.device.set_duty_cycle(1.0)
while True: with self.device.open():
self.device.process() while True:
await asyncio.sleep(self.interval) self.device.process()
await asyncio.sleep(self.interval)