Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
109e8cf25f
|
|||
d88c6f7d7b
|
|||
926a71e6a8
|
|||
20a064dc1f
|
|||
8417454f5b
|
|||
ee0efb6c19
|
@ -30,63 +30,71 @@ data:
|
|||||||
"patty": {
|
"patty": {
|
||||||
"label": "patty",
|
"label": "patty",
|
||||||
"windows": [
|
"windows": [
|
||||||
{ "topic": "homegear/instance1/plain/18/1/STATE", "label": "Garten rechts" },
|
{ "topic": "homegear/instance1/plain/18/1/STATE", "label": "Garten rechts", "converter": "max" },
|
||||||
{ "topic": "homegear/instance1/plain/22/1/STATE", "label": "Garten links" }
|
{ "topic": "homegear/instance1/plain/22/1/STATE", "label": "Garten links", "converter": "max" }
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/39/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/39/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
},
|
},
|
||||||
"kueche": {
|
"kueche": {
|
||||||
"label": "kueche",
|
"label": "kueche",
|
||||||
"windows": [
|
"windows": [
|
||||||
{ "topic": "homegear/instance1/plain/37/1/STATE", "label": "Garten Fenster" },
|
{ "topic": "homegear/instance1/plain/37/1/STATE", "label": "Garten Fenster", "converter": "max" },
|
||||||
{ "topic": "homegear/instance1/plain/36/1/STATE", "label": "Garten Tuer" },
|
{ "topic": "homegear/instance1/plain/36/1/STATE", "label": "Garten Tuer", "converter": "max" },
|
||||||
{ "topic": "homegear/instance1/plain/38/1/STATE", "label": "Strasse rechts" },
|
{ "topic": "homegear/instance1/plain/38/1/STATE", "label": "Strasse rechts", "converter": "max" },
|
||||||
{ "topic": "homegear/instance1/plain/13/1/STATE", "label": "Strasse links" }
|
{ "topic": "homegear/instance1/plain/13/1/STATE", "label": "Strasse links", "converter": "max" }
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/40/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/40/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
},
|
},
|
||||||
"bad_oben": {
|
"bad_oben": {
|
||||||
"label": "bad_oben",
|
"label": "bad_oben",
|
||||||
"windows": [
|
"windows": [
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/41/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/41/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
},
|
},
|
||||||
"schlafzimmer": {
|
"schlafzimmer": {
|
||||||
"label": "schlafzimmer",
|
"label": "schlafzimmer",
|
||||||
"windows": [
|
"windows": [
|
||||||
{ "topic": "homegear/instance1/plain/52/1/STATE", "label": "Strasse" }
|
{ "topic": "homegear/instance1/plain/52/1/STATE", "label": "Strasse", "converter": "max" }
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/42/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/42/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
},
|
},
|
||||||
"wolfgang": {
|
"wolfgang": {
|
||||||
"label": "wolfgang",
|
"label": "wolfgang",
|
||||||
"windows": [
|
"windows": [
|
||||||
{ "topic": "homegear/instance1/plain/24/1/STATE", "label": "Garten" }
|
{ "topic": "homegear/instance1/plain/24/1/STATE", "label": "Garten", "converter": "aqara" }
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/43/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/43/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
},
|
},
|
||||||
"esszimmer": {
|
"esszimmer": {
|
||||||
"label": "esszimmer",
|
"label": "esszimmer",
|
||||||
"windows": [
|
"windows": [
|
||||||
{ "topic": "homegear/instance1/plain/26/1/STATE", "label": "Strasse rechts" },
|
{ "topic": "homegear/instance1/plain/26/1/STATE", "label": "Strasse rechts", "converter": "max" },
|
||||||
{ "topic": "homegear/instance1/plain/27/1/STATE", "label": "Strasse links" }
|
{ "topic": "homegear/instance1/plain/27/1/STATE", "label": "Strasse links", "converter": "max" }
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/45/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/45/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
},
|
},
|
||||||
"wohnzimmer": {
|
"wohnzimmer": {
|
||||||
"label": "wohnzimmer",
|
"label": "wohnzimmer",
|
||||||
"windows": [
|
"windows": [
|
||||||
{ "topic": "homegear/instance1/plain/28/1/STATE", "label": "Garten rechts" },
|
{ "topic": "homegear/instance1/plain/28/1/STATE", "label": "Garten rechts", "converter": "max" },
|
||||||
{ "topic": "homegear/instance1/plain/29/1/STATE", "label": "Garten links" }
|
{ "topic": "homegear/instance1/plain/29/1/STATE", "label": "Garten links", "converter": "max" }
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/46/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/46/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
},
|
},
|
||||||
"bad_unten": {
|
"bad_unten": {
|
||||||
"label": "bad_unten",
|
"label": "bad_unten",
|
||||||
"windows": [
|
"windows": [
|
||||||
{ "topic": "homegear/instance1/plain/44/1/STATE", "label": "Strasse" }
|
{ "topic": "homegear/instance1/plain/44/1/STATE", "label": "Strasse", "converter": "max" }
|
||||||
],
|
],
|
||||||
"output_topic": "heating/homegear/instance1/set/48/1/SET_TEMPERATURE"
|
"output_topic": "heating/homegear/instance1/set/48/1/SET_TEMPERATURE",
|
||||||
|
"output_converter": "max"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,17 @@ from loguru import logger
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CONVERTERS = {
|
||||||
|
"target_temperature_output": {
|
||||||
|
"max": lambda x: x["output_temperature"],
|
||||||
|
},
|
||||||
|
"window_contact_input": {
|
||||||
|
"max": lambda x: 'closed' if (x.lower() in ('false', 'close', 'closed')) else 'open',
|
||||||
|
"aqara": lambda x: 'closed' if json.loads(x)["contact"] else 'open'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# context
|
# context
|
||||||
# boxes: structure of boxes
|
# boxes: structure of boxes
|
||||||
# client: MQTT client
|
# client: MQTT client
|
||||||
@ -59,10 +70,10 @@ def process_message(box_name, topic_key, payload, context):
|
|||||||
raise Error(f"Unexcepted topic_key: {topic_key}, {payload}")
|
raise Error(f"Unexcepted topic_key: {topic_key}, {payload}")
|
||||||
|
|
||||||
if result:
|
if result:
|
||||||
(result_message, status) = result
|
result_message = CONVERTERS["target_temperature_output"][box["output_converter"]](local_context)
|
||||||
publish_topic = box["output_topic"] if not status else context['status_topic']
|
publish_topic = box["output_topic"]
|
||||||
context['client'].publish(publish_topic, result_message)
|
context['client'].publish(publish_topic, result_message)
|
||||||
logger.info(f"[{box_name}] Result published on '{publish_topic}': {status} {result_message}")
|
logger.info(f"[{box_name}] Result published on '{publish_topic}': {result_message}")
|
||||||
|
|
||||||
context_topic = f"{context['context_topic_prefix']}{box['label']}"
|
context_topic = f"{context['context_topic_prefix']}{box['label']}"
|
||||||
context['client'].publish(context_topic, json.dumps(local_context))
|
context['client'].publish(context_topic, json.dumps(local_context))
|
||||||
@ -101,17 +112,17 @@ def _calculate_output_temperature(local_context):
|
|||||||
return
|
return
|
||||||
|
|
||||||
def process_status(box_name, context, local_context, payload):
|
def process_status(box_name, context, local_context, payload):
|
||||||
return (f"{local_context}", True)
|
return False
|
||||||
|
|
||||||
def process_general_off(box_name, context, local_context, payload):
|
def process_general_off(box_name, context, local_context, payload):
|
||||||
local_context['general_off'] = (payload.lower() in ('true'))
|
local_context['general_off'] = (payload.lower() in ('true'))
|
||||||
_calculate_output_temperature(local_context)
|
_calculate_output_temperature(local_context)
|
||||||
return (local_context['output_temperature'], False)
|
return True
|
||||||
|
|
||||||
def process_maintenance_mode(box_name, context, local_context, payload):
|
def process_maintenance_mode(box_name, context, local_context, payload):
|
||||||
local_context['maintenance_mode'] = (payload.lower() in ('true'))
|
local_context['maintenance_mode'] = (payload.lower() in ('true'))
|
||||||
_calculate_output_temperature(local_context)
|
_calculate_output_temperature(local_context)
|
||||||
return (local_context['output_temperature'], False)
|
return True
|
||||||
|
|
||||||
def process_cmd(box_name, context, local_context, payload):
|
def process_cmd(box_name, context, local_context, payload):
|
||||||
if payload.lower() in ('high', 'low', 'off'):
|
if payload.lower() in ('high', 'low', 'off'):
|
||||||
@ -119,20 +130,26 @@ def process_cmd(box_name, context, local_context, payload):
|
|||||||
_calculate_output_temperature(local_context)
|
_calculate_output_temperature(local_context)
|
||||||
else:
|
else:
|
||||||
logger.error(f"Invalid cmd for {box_name} received: {payload}")
|
logger.error(f"Invalid cmd for {box_name} received: {payload}")
|
||||||
return (local_context['output_temperature'], False)
|
return True
|
||||||
|
|
||||||
def process_overwrite_window(box_name, context, local_context, payload):
|
def process_overwrite_window(box_name, context, local_context, payload):
|
||||||
local_context['overwrite_window'] = (payload.lower() in ('true'))
|
local_context['overwrite_window'] = (payload.lower() in ('true'))
|
||||||
_calculate_output_temperature(local_context)
|
_calculate_output_temperature(local_context)
|
||||||
return (local_context['output_temperature'], False)
|
return True
|
||||||
|
|
||||||
def process_high_temp(box_name, context, local_context, payload):
|
def process_high_temp(box_name, context, local_context, payload):
|
||||||
local_context['high_temperature'] = payload
|
local_context['high_temperature'] = payload
|
||||||
_calculate_output_temperature(local_context)
|
_calculate_output_temperature(local_context)
|
||||||
return (local_context['output_temperature'], False)
|
return True
|
||||||
|
|
||||||
def process_window(box_name, context, local_context, sub_key, payload):
|
def process_window(box_name, context, local_context, sub_key, payload):
|
||||||
local_context['window_state'][sub_key] = 'closed' if (payload.lower() in ('false', 'close', 'closed')) else 'open'
|
# default converter
|
||||||
|
converter = lambda x:x
|
||||||
|
for sk in context["boxes"][box_name]["windows"]:
|
||||||
|
if sk["label"] == sub_key:
|
||||||
|
converter = CONVERTERS["window_contact_input"][sk["converter"]]
|
||||||
|
break
|
||||||
|
local_context['window_state'][sub_key] = converter(payload)
|
||||||
_calculate_output_temperature(local_context)
|
_calculate_output_temperature(local_context)
|
||||||
return (local_context['output_temperature'], False)
|
return True
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user