summaryrefslogtreecommitdiff
path: root/src/relay_mqtt_http_proxy.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/relay_mqtt_http_proxy.py')
-rwxr-xr-xsrc/relay_mqtt_http_proxy.py43
1 files changed, 29 insertions, 14 deletions
diff --git a/src/relay_mqtt_http_proxy.py b/src/relay_mqtt_http_proxy.py
index 60d2963..05cc88d 100755
--- a/src/relay_mqtt_http_proxy.py
+++ b/src/relay_mqtt_http_proxy.py
@@ -1,16 +1,19 @@
#!/usr/bin/env python3
from home import http
from home.config import config
-from home.mqtt import MqttRelay, MqttRelayState
-from home.mqtt import MqttPayload
+from home.mqtt import MqttPayload, MqttWrapper, MqttNode
+from home.mqtt.module.relay import MqttRelayState, MqttRelayModule
from home.mqtt.module.diagnostics import InitialDiagnosticsPayload, DiagnosticsPayload
from typing import Optional
-mqtt_relay: Optional[MqttRelay] = None
+mqtt: Optional[MqttWrapper] = None
+mqtt_nodes: dict[str, MqttNode] = {}
+relay_modules: dict[str, MqttRelayModule] = {}
relay_states: dict[str, MqttRelayState] = {}
-def on_mqtt_message(device_id, message: MqttPayload):
+def on_mqtt_message(node: MqttNode,
+ message: MqttPayload):
if isinstance(message, InitialDiagnosticsPayload) or isinstance(message, DiagnosticsPayload):
kwargs = dict(rssi=message.rssi, enabled=message.flags.state)
if device_id not in relay_states:
@@ -28,17 +31,22 @@ class RelayMqttHttpProxy(http.HTTPServer):
async def _relay_on_off(self,
enable: Optional[bool],
req: http.Request):
- device_id = req.match_info['id']
- device_secret = req.query['secret']
+ node_id = req.match_info['id']
+ node_secret = req.query['secret']
+
+ node = mqtt_nodes[node_id]
+ relay_module = relay_modules[node_id]
if enable is None:
- if device_id in relay_states and relay_states[device_id].ever_updated:
- cur_state = relay_states[device_id].enabled
+ if node_id in relay_states and relay_states[node_id].ever_updated:
+ cur_state = relay_states[node_id].enabled
else:
cur_state = False
enable = not cur_state
- mqtt_relay.set_power(device_id, enable, device_secret)
+ if not node.secret:
+ node.secret = node_secret
+ relay_module.switchpower(enable)
return self.ok()
async def relay_on(self, req: http.Request):
@@ -54,13 +62,20 @@ class RelayMqttHttpProxy(http.HTTPServer):
if __name__ == '__main__':
config.load('relay_mqtt_http_proxy')
- mqtt_relay = MqttRelay(devices=[MqttEspDevice(id=device_id) for device_id in config.get('relay.devices')])
- mqtt_relay.configure_tls()
- mqtt_relay.set_message_callback(on_mqtt_message)
- mqtt_relay.connect_and_loop(loop_forever=False)
+ mqtt = MqttWrapper()
+ for device_id, data in config['relays'].items():
+ mqtt_node = MqttNode(node_id=device_id)
+ relay_modules[device_id] = mqtt_node.load_module('relay')
+ mqtt_nodes[device_id] = mqtt_node
+ mqtt_node.add_payload_callback(on_mqtt_message)
+ mqtt.add_node(mqtt_node)
+ mqtt_node.add_payload_callback(on_mqtt_message)
+
+ mqtt.configure_tls()
+ mqtt.connect_and_loop(loop_forever=False)
proxy = RelayMqttHttpProxy(config.get_addr('server.listen'))
try:
proxy.run()
except KeyboardInterrupt:
- mqtt_relay.disconnect()
+ mqtt.disconnect()