mirror of
https://github.com/PiBrewing/craftbeerpi4.git
synced 2024-11-09 17:07:43 +01:00
!!! DONT USE !!! - feasibility test to add output parameter to actor
This commit is contained in:
parent
90289ef949
commit
1c6dae875c
10 changed files with 233 additions and 13 deletions
|
@ -21,6 +21,7 @@ class CBPiActor(metaclass=ABCMeta):
|
||||||
self.state = False
|
self.state = False
|
||||||
self.running = False
|
self.running = False
|
||||||
self.power = 100
|
self.power = 100
|
||||||
|
self.output = 100
|
||||||
self.timer = 0
|
self.timer = 0
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
|
@ -71,7 +72,7 @@ class CBPiActor(metaclass=ABCMeta):
|
||||||
async def add_config_value(self, name, value, type: ConfigType, description, options=None):
|
async def add_config_value(self, name, value, type: ConfigType, description, options=None):
|
||||||
await self.cbpi.add(name, value, type, description, options=None)
|
await self.cbpi.add(name, value, type, description, options=None)
|
||||||
|
|
||||||
async def on(self, power):
|
async def on(self, power, output):
|
||||||
'''
|
'''
|
||||||
Code to switch the actor on. Power is provided as integer value
|
Code to switch the actor on. Power is provided as integer value
|
||||||
|
|
||||||
|
@ -98,3 +99,11 @@ class CBPiActor(metaclass=ABCMeta):
|
||||||
return dict(power=self.power)
|
return dict(power=self.power)
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
async def set_output(self,output):
|
||||||
|
'''
|
||||||
|
Code to set power for actor
|
||||||
|
|
||||||
|
:return: dict power
|
||||||
|
'''
|
||||||
|
return dict(output=self.output)
|
||||||
|
pass
|
||||||
|
|
|
@ -65,10 +65,10 @@ class CBPiBase(metaclass=ABCMeta):
|
||||||
logging.error("Failed to read actor state in step - actor {}".format(id))
|
logging.error("Failed to read actor state in step - actor {}".format(id))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def actor_on(self,id,power=100):
|
async def actor_on(self,id,power=100, output=100):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await self.cbpi.actor.on(id,power)
|
await self.cbpi.actor.on(id,power, output)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -83,3 +83,9 @@ class CBPiBase(metaclass=ABCMeta):
|
||||||
await self.cbpi.actor.set_power(id,power)
|
await self.cbpi.actor.set_power(id,power)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
async def actor_set_output(self,id,output):
|
||||||
|
try:
|
||||||
|
await self.cbpi.actor.set_output(id,output)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
|
@ -56,14 +56,15 @@ class Actor:
|
||||||
props: Props = Props()
|
props: Props = Props()
|
||||||
state: bool = False
|
state: bool = False
|
||||||
power: int = 100
|
power: int = 100
|
||||||
|
output: int = 100
|
||||||
timer: int = 0
|
timer: int = 0
|
||||||
type: str = None
|
type: str = None
|
||||||
instance: str = None
|
instance: str = None
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "name={} props={}, state={}, type={}, power={}, timer={}".format(self.name, self.props, self.state, self.type, self.power, self.timer)
|
return "name={} props={}, state={}, type={}, power={}, output={}, timer={}".format(self.name, self.props, self.state, self.type, self.power, self.output, self.timer)
|
||||||
def to_dict(self):
|
def to_dict(self):
|
||||||
return dict(id=self.id, name=self.name, type=self.type, props=self.props.to_dict(), state=self.instance.get_state(), power=self.power, timer=self.timer)
|
return dict(id=self.id, name=self.name, type=self.type, props=self.props.to_dict(), state=self.instance.get_state(), power=self.power, output=self.output, timer=self.timer)
|
||||||
|
|
||||||
class DataType(Enum):
|
class DataType(Enum):
|
||||||
VALUE="value"
|
VALUE="value"
|
||||||
|
|
|
@ -9,7 +9,7 @@ class ActorController(BasicController):
|
||||||
self.update_key = "actorupdate"
|
self.update_key = "actorupdate"
|
||||||
self.sorting=True
|
self.sorting=True
|
||||||
|
|
||||||
async def on(self, id, power=None):
|
async def on(self, id, power=None, output=None):
|
||||||
try:
|
try:
|
||||||
item = self.find_by_id(id)
|
item = self.find_by_id(id)
|
||||||
if power is None:
|
if power is None:
|
||||||
|
@ -18,13 +18,21 @@ class ActorController(BasicController):
|
||||||
power = item.power
|
power = item.power
|
||||||
else:
|
else:
|
||||||
power = 100
|
power = 100
|
||||||
|
|
||||||
|
if output is None:
|
||||||
|
logging.info("Output is none")
|
||||||
|
if item.output:
|
||||||
|
output = item.output
|
||||||
|
else:
|
||||||
|
output = 100
|
||||||
if item.instance.state is False:
|
if item.instance.state is False:
|
||||||
await item.instance.on(power)
|
await item.instance.on(power,output)
|
||||||
#await self.push_udpate()
|
#await self.push_udpate()
|
||||||
self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data))),self.sorting)
|
self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data))),self.sorting)
|
||||||
self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict(), True)
|
self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict(), True)
|
||||||
else:
|
else:
|
||||||
await self.set_power(id, power)
|
await self.set_power(id, power)
|
||||||
|
await self.set_output(id, output)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error("Failed to switch on Actor {} {}".format(id, e))
|
logging.error("Failed to switch on Actor {} {}".format(id, e))
|
||||||
|
@ -57,10 +65,18 @@ class ActorController(BasicController):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error("Failed to set power {} {}".format(id, e))
|
logging.error("Failed to set power {} {}".format(id, e))
|
||||||
|
|
||||||
async def actor_update(self, id, power):
|
async def set_output(self, id, output):
|
||||||
|
try:
|
||||||
|
item = self.find_by_id(id)
|
||||||
|
await item.instance.set_output(output)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Failed to set output {} {}".format(id, e))
|
||||||
|
|
||||||
|
async def actor_update(self, id, power, output):
|
||||||
try:
|
try:
|
||||||
item = self.find_by_id(id)
|
item = self.find_by_id(id)
|
||||||
item.power = round(power)
|
item.power = round(power)
|
||||||
|
item.output = round(output)
|
||||||
#await self.push_udpate()
|
#await self.push_udpate()
|
||||||
self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data))),self.sorting)
|
self.cbpi.ws.send(dict(topic=self.update_key, data=list(map(lambda item: item.to_dict(), self.data))),self.sorting)
|
||||||
self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict())
|
self.cbpi.push_update("cbpi/actorupdate/{}".format(id), item.to_dict())
|
||||||
|
|
|
@ -27,6 +27,7 @@ class SatelliteController:
|
||||||
("cbpi/actor/+/on", self._actor_on),
|
("cbpi/actor/+/on", self._actor_on),
|
||||||
("cbpi/actor/+/off", self._actor_off),
|
("cbpi/actor/+/off", self._actor_off),
|
||||||
("cbpi/actor/+/power", self._actor_power),
|
("cbpi/actor/+/power", self._actor_power),
|
||||||
|
("cbpi/actor/+/output", self._actor_output),
|
||||||
("cbpi/updateactor", self._actorupdate),
|
("cbpi/updateactor", self._actorupdate),
|
||||||
("cbpi/updatekettle", self._kettleupdate),
|
("cbpi/updatekettle", self._kettleupdate),
|
||||||
("cbpi/updatesensor", self._sensorupdate),
|
("cbpi/updatesensor", self._sensorupdate),
|
||||||
|
@ -124,6 +125,21 @@ class SatelliteController:
|
||||||
except:
|
except:
|
||||||
self.logger.warning("Failed to set actor power via mqtt")
|
self.logger.warning("Failed to set actor power via mqtt")
|
||||||
|
|
||||||
|
async def _actor_output(self, message):
|
||||||
|
try:
|
||||||
|
topic_key = str(message.topic).split("/")
|
||||||
|
try:
|
||||||
|
output=int(message.payload.decode())
|
||||||
|
#if power > 100:
|
||||||
|
# power = 100
|
||||||
|
#if power < 0:
|
||||||
|
# power = 0
|
||||||
|
await self.cbpi.actor.set_output(topic_key[2],output)
|
||||||
|
except:
|
||||||
|
self.logger.warning("Failed to set actor output via mqtt. No valid output in message")
|
||||||
|
except:
|
||||||
|
self.logger.warning("Failed to set actor output via mqtt")
|
||||||
|
|
||||||
async def _kettleupdate(self, message):
|
async def _kettleupdate(self, message):
|
||||||
try:
|
try:
|
||||||
self.kettle=self.kettlecontroller.get_state()
|
self.kettle=self.kettlecontroller.get_state()
|
||||||
|
|
|
@ -61,6 +61,8 @@ class FermenterHysteresis(CBPiFermenterLogic):
|
||||||
self.cooler_offset_max = float(self.props.get("CoolerOffsetOff", 0))
|
self.cooler_offset_max = float(self.props.get("CoolerOffsetOff", 0))
|
||||||
self.heater_max_power = int(self.props.get("HeaterMaxPower", 100))
|
self.heater_max_power = int(self.props.get("HeaterMaxPower", 100))
|
||||||
self.cooler_max_power = int(self.props.get("CoolerMaxPower", 100))
|
self.cooler_max_power = int(self.props.get("CoolerMaxPower", 100))
|
||||||
|
self.heater_max_output=self.heater_max_power
|
||||||
|
self.cooler_max_output=self.cooler_max_power
|
||||||
|
|
||||||
self.fermenter = self.get_fermenter(self.id)
|
self.fermenter = self.get_fermenter(self.id)
|
||||||
self.heater = self.fermenter.heater
|
self.heater = self.fermenter.heater
|
||||||
|
@ -85,7 +87,7 @@ class FermenterHysteresis(CBPiFermenterLogic):
|
||||||
|
|
||||||
if sensor_value + self.heater_offset_min <= target_temp:
|
if sensor_value + self.heater_offset_min <= target_temp:
|
||||||
if self.heater and (heater_state == False):
|
if self.heater and (heater_state == False):
|
||||||
await self.actor_on(self.heater, self.heater_max_power)
|
await self.actor_on(self.heater, self.heater_max_power, self.heater_max_output)
|
||||||
|
|
||||||
if sensor_value + self.heater_offset_max >= target_temp:
|
if sensor_value + self.heater_offset_max >= target_temp:
|
||||||
if self.heater and (heater_state == True):
|
if self.heater and (heater_state == True):
|
||||||
|
@ -93,7 +95,7 @@ class FermenterHysteresis(CBPiFermenterLogic):
|
||||||
|
|
||||||
if sensor_value >= self.cooler_offset_min + target_temp:
|
if sensor_value >= self.cooler_offset_min + target_temp:
|
||||||
if self.cooler and (cooler_state == False):
|
if self.cooler and (cooler_state == False):
|
||||||
await self.actor_on(self.cooler, self.cooler_max_power)
|
await self.actor_on(self.cooler, self.cooler_max_power, self.cooler_max_output)
|
||||||
|
|
||||||
if sensor_value <= self.cooler_offset_max + target_temp:
|
if sensor_value <= self.cooler_offset_max + target_temp:
|
||||||
if self.cooler and (cooler_state == True):
|
if self.cooler and (cooler_state == True):
|
||||||
|
|
|
@ -24,7 +24,7 @@ class DummyActor(CBPiActor):
|
||||||
async def start(self):
|
async def start(self):
|
||||||
await super().start()
|
await super().start()
|
||||||
|
|
||||||
async def on(self, power=0):
|
async def on(self, power=0, output=0):
|
||||||
logger.info("ACTOR %s ON " % self.id)
|
logger.info("ACTOR %s ON " % self.id)
|
||||||
self.state = True
|
self.state = True
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,11 @@
|
||||||
{
|
{
|
||||||
"id": "3CUJte4bkxDMFCtLX8eqsX",
|
"id": "3CUJte4bkxDMFCtLX8eqsX",
|
||||||
"name": "SomeActor",
|
"name": "SomeActor",
|
||||||
|
"output": 100,
|
||||||
"power": 100,
|
"power": 100,
|
||||||
"props": {},
|
"props": {},
|
||||||
"state": false,
|
"state": false,
|
||||||
|
"timer": 0,
|
||||||
"type": "DummyActor"
|
"type": "DummyActor"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -41,6 +41,128 @@
|
||||||
"type": "select",
|
"type": "select",
|
||||||
"value": "Yes"
|
"value": "Yes"
|
||||||
},
|
},
|
||||||
|
"AutoReboot": {
|
||||||
|
"description": "Reboot Pi once a day at selected time",
|
||||||
|
"name": "AutoReboot",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"label": "Yes",
|
||||||
|
"value": "Yes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "No",
|
||||||
|
"value": "No"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": "cbpi4-system",
|
||||||
|
"type": "select",
|
||||||
|
"value": "No"
|
||||||
|
},
|
||||||
|
"AutoRebootTime": {
|
||||||
|
"description": "Time for daily reboot",
|
||||||
|
"name": "AutoRebootTime",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"label": "0",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "1",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "2",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "3",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "4",
|
||||||
|
"value": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "5",
|
||||||
|
"value": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "6",
|
||||||
|
"value": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "7",
|
||||||
|
"value": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "8",
|
||||||
|
"value": 8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "9",
|
||||||
|
"value": 9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "10",
|
||||||
|
"value": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "11",
|
||||||
|
"value": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "12",
|
||||||
|
"value": 12
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "13",
|
||||||
|
"value": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "14",
|
||||||
|
"value": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "15",
|
||||||
|
"value": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "16",
|
||||||
|
"value": 16
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "17",
|
||||||
|
"value": 17
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "18",
|
||||||
|
"value": 18
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "19",
|
||||||
|
"value": 19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "20",
|
||||||
|
"value": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "21",
|
||||||
|
"value": 21
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "22",
|
||||||
|
"value": 22
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "23",
|
||||||
|
"value": 23
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": "cbpi4-system",
|
||||||
|
"type": "select",
|
||||||
|
"value": "0"
|
||||||
|
},
|
||||||
"BREWERY_NAME": {
|
"BREWERY_NAME": {
|
||||||
"description": "Brewery Name",
|
"description": "Brewery Name",
|
||||||
"name": "BREWERY_NAME",
|
"name": "BREWERY_NAME",
|
||||||
|
@ -80,7 +202,7 @@
|
||||||
"options": null,
|
"options": null,
|
||||||
"source": "hidden",
|
"source": "hidden",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": "4.3.2.a6"
|
"value": "4.4.3"
|
||||||
},
|
},
|
||||||
"CSVLOGFILES": {
|
"CSVLOGFILES": {
|
||||||
"description": "Write sensor data to csv logfiles (enabling requires restart)",
|
"description": "Write sensor data to csv logfiles (enabling requires restart)",
|
||||||
|
@ -302,6 +424,14 @@
|
||||||
"type": "select",
|
"type": "select",
|
||||||
"value": "C"
|
"value": "C"
|
||||||
},
|
},
|
||||||
|
"TasmotaTopic": {
|
||||||
|
"description": "Tasmota MQTT Topic",
|
||||||
|
"name": "TasmotaTopic",
|
||||||
|
"options": null,
|
||||||
|
"source": "craftbeerpi",
|
||||||
|
"type": "string",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
"brewfather_api_key": {
|
"brewfather_api_key": {
|
||||||
"description": "Brewfather API Key",
|
"description": "Brewfather API Key",
|
||||||
"name": "brewfather_api_key",
|
"name": "brewfather_api_key",
|
||||||
|
@ -310,6 +440,35 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": ""
|
"value": ""
|
||||||
},
|
},
|
||||||
|
"brewfather_list_length": {
|
||||||
|
"description": "Brewfather Recipe List length",
|
||||||
|
"name": "brewfather_list_length",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"label": "5",
|
||||||
|
"value": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "10",
|
||||||
|
"value": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "25",
|
||||||
|
"value": 25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "50",
|
||||||
|
"value": 50
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "100",
|
||||||
|
"value": 100
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": "craftbeerpi",
|
||||||
|
"type": "select",
|
||||||
|
"value": 50
|
||||||
|
},
|
||||||
"brewfather_user_id": {
|
"brewfather_user_id": {
|
||||||
"description": "Brewfather User ID",
|
"description": "Brewfather User ID",
|
||||||
"name": "brewfather_user_id",
|
"name": "brewfather_user_id",
|
||||||
|
@ -318,6 +477,14 @@
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"value": ""
|
"value": ""
|
||||||
},
|
},
|
||||||
|
"cbpi4-system_update": {
|
||||||
|
"description": "cbpi4 system version update",
|
||||||
|
"name": "cbpi4-system_update",
|
||||||
|
"options": null,
|
||||||
|
"source": "hidden",
|
||||||
|
"type": "string",
|
||||||
|
"value": "0.0.9a6"
|
||||||
|
},
|
||||||
"current_dashboard_number": {
|
"current_dashboard_number": {
|
||||||
"description": "Number of current Dashboard",
|
"description": "Number of current Dashboard",
|
||||||
"name": "current_dashboard_number",
|
"name": "current_dashboard_number",
|
||||||
|
|
|
@ -18,3 +18,4 @@ password: 123
|
||||||
plugins:
|
plugins:
|
||||||
- cbpi4ui
|
- cbpi4ui
|
||||||
|
|
||||||
|
mqtt_offset: false
|
||||||
|
|
Loading…
Reference in a new issue