relay_mqtt_*: add monitoring util, improve overall support
This commit is contained in:
parent
ebdedacf2f
commit
d2a5d8c6c2
@ -3,7 +3,7 @@ import re
|
|||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from .mqtt import MQTTBase
|
from .mqtt import MQTTBase
|
||||||
from typing import Optional, Union, List
|
from typing import Optional, Union
|
||||||
from .payload.relay import (
|
from .payload.relay import (
|
||||||
InitialStatPayload,
|
InitialStatPayload,
|
||||||
StatPayload,
|
StatPayload,
|
||||||
@ -13,11 +13,11 @@ from .payload.relay import (
|
|||||||
|
|
||||||
|
|
||||||
class MQTTRelayDevice:
|
class MQTTRelayDevice:
|
||||||
home_id: str
|
id: str
|
||||||
secret: str
|
secret: Optional[str]
|
||||||
|
|
||||||
def __init__(self, home_id: str, secret: str):
|
def __init__(self, id: str, secret: Optional[str] = None):
|
||||||
self.home_id = home_id
|
self.id = id
|
||||||
self.secret = secret
|
self.secret = secret
|
||||||
|
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ class MQTTRelay(MQTTBase):
|
|||||||
|
|
||||||
if self._subscribe_to_updates:
|
if self._subscribe_to_updates:
|
||||||
for device in self._devices:
|
for device in self._devices:
|
||||||
topic = f'hk/{device.home_id}/relay/#'
|
topic = f'hk/{device.id}/relay/#'
|
||||||
self._logger.info(f"subscribing to {topic}")
|
self._logger.info(f"subscribing to {topic}")
|
||||||
client.subscribe(topic, qos=1)
|
client.subscribe(topic, qos=1)
|
||||||
|
|
||||||
@ -61,10 +61,12 @@ class MQTTRelay(MQTTBase):
|
|||||||
if not match:
|
if not match:
|
||||||
return
|
return
|
||||||
|
|
||||||
name = match.group(1)
|
device_id = match.group(1)
|
||||||
subtopic = match.group(2)
|
subtopic = match.group(2)
|
||||||
|
|
||||||
if name not in self._devices:
|
try:
|
||||||
|
next(d for d in self._devices if d.id == device_id)
|
||||||
|
except StopIteration:
|
||||||
return
|
return
|
||||||
|
|
||||||
message = None
|
message = None
|
||||||
@ -76,17 +78,18 @@ class MQTTRelay(MQTTBase):
|
|||||||
message = PowerPayload.unpack(msg.payload)
|
message = PowerPayload.unpack(msg.payload)
|
||||||
|
|
||||||
if message and self._message_callback:
|
if message and self._message_callback:
|
||||||
self._message_callback(name, message)
|
self._message_callback(device_id, message)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.exception(str(e))
|
self._logger.exception(str(e))
|
||||||
|
|
||||||
def set_power(self, home_id, enable: bool):
|
def set_power(self, home_id, enable: bool):
|
||||||
device = next(d for d in self._devices if d.home_id == home_id)
|
device = next(d for d in self._devices if d.id == home_id)
|
||||||
|
assert device.secret is not None, 'device secret not specified'
|
||||||
|
|
||||||
payload = PowerPayload(secret=device.secret,
|
payload = PowerPayload(secret=device.secret,
|
||||||
state=enable)
|
state=enable)
|
||||||
self._client.publish(f'hk/{device.home_id}/relay/power',
|
self._client.publish(f'hk/{device.id}/relay/power',
|
||||||
payload=payload.pack(),
|
payload=payload.pack(),
|
||||||
qos=1)
|
qos=1)
|
||||||
self._client.loop_write()
|
self._client.loop_write()
|
||||||
@ -96,11 +99,12 @@ class MQTTRelay(MQTTBase):
|
|||||||
filename: str,
|
filename: str,
|
||||||
publish_callback: callable,
|
publish_callback: callable,
|
||||||
qos: int):
|
qos: int):
|
||||||
device = next(d for d in self._devices if d.home_id == home_id)
|
device = next(d for d in self._devices if d.id == home_id)
|
||||||
|
assert device.secret is not None, 'device secret not specified'
|
||||||
|
|
||||||
self._ota_publish_callback = publish_callback
|
self._ota_publish_callback = publish_callback
|
||||||
payload = OTAPayload(secret=device.secret, filename=filename)
|
payload = OTAPayload(secret=device.secret, filename=filename)
|
||||||
publish_result = self._client.publish(f'hk/{device.home_id}/relay/admin/ota',
|
publish_result = self._client.publish(f'hk/{device.id}/relay/admin/ota',
|
||||||
payload=payload.pack(),
|
payload=payload.pack(),
|
||||||
qos=qos)
|
qos=qos)
|
||||||
self._ota_mid = publish_result.mid
|
self._ota_mid = publish_result.mid
|
||||||
|
@ -157,7 +157,7 @@ def markup(ctx: Optional[bot.Context]) -> Optional[ReplyKeyboardMarkup]:
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
mqtt_relay = MQTTRelay(devices=MQTTRelayDevice(home_id=config['mqtt']['home_id'],
|
mqtt_relay = MQTTRelay(devices=MQTTRelayDevice(id=config['mqtt']['home_id'],
|
||||||
secret=config['mqtt']['home_secret']))
|
secret=config['mqtt']['home_secret']))
|
||||||
mqtt_relay.set_message_callback(on_mqtt_message)
|
mqtt_relay.set_message_callback(on_mqtt_message)
|
||||||
mqtt_relay.configure_tls()
|
mqtt_relay.configure_tls()
|
||||||
|
@ -87,7 +87,7 @@ def markup(ctx: Optional[bot.Context]) -> Optional[ReplyKeyboardMarkup]:
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
devices = []
|
devices = []
|
||||||
for device_id, data in config['relays'].items():
|
for device_id, data in config['relays'].items():
|
||||||
devices.append(MQTTRelayDevice(home_id=device_id,
|
devices.append(MQTTRelayDevice(id=device_id,
|
||||||
secret=data['secret']))
|
secret=data['secret']))
|
||||||
labels = data['labels']
|
labels = data['labels']
|
||||||
bot.lang.ru(**{device_id: labels['ru']})
|
bot.lang.ru(**{device_id: labels['ru']})
|
||||||
|
31
src/relay_mqtt_util.py
Executable file
31
src/relay_mqtt_util.py
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
from typing import Optional
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from home.config import config
|
||||||
|
from home.mqtt import MQTTRelay, MQTTRelayDevice
|
||||||
|
from home.mqtt.payload import MQTTPayload
|
||||||
|
from home.mqtt.payload.relay import InitialStatPayload, StatPayload
|
||||||
|
|
||||||
|
mqtt_relay: Optional[MQTTRelay] = None
|
||||||
|
|
||||||
|
|
||||||
|
def on_mqtt_message(device_id, message: MQTTPayload):
|
||||||
|
if isinstance(message, InitialStatPayload) or isinstance(message, StatPayload):
|
||||||
|
message = f'[{device_id}] state={message.flags.state} rssi={message.rssi}'
|
||||||
|
if isinstance(message, InitialStatPayload):
|
||||||
|
message += f' fw={message.fw_version}'
|
||||||
|
print(message)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = ArgumentParser()
|
||||||
|
parser.add_argument('--device-id', type=str, required=True)
|
||||||
|
|
||||||
|
config.load('relay_mqtt_util', parser=parser)
|
||||||
|
arg = parser.parse_args()
|
||||||
|
|
||||||
|
mqtt_relay = MQTTRelay(devices=MQTTRelayDevice(id=arg.device_id))
|
||||||
|
mqtt_relay.set_message_callback(on_mqtt_message)
|
||||||
|
mqtt_relay.configure_tls()
|
||||||
|
mqtt_relay.connect_and_loop()
|
@ -34,7 +34,7 @@ def relayctl_publish_ota(filename: str,
|
|||||||
global stop
|
global stop
|
||||||
stop = True
|
stop = True
|
||||||
|
|
||||||
mqtt_relay = MQTTRelay(devices=MQTTRelayDevice(home_id=home_id, secret=home_secret))
|
mqtt_relay = MQTTRelay(devices=MQTTRelayDevice(id=home_id, secret=home_secret))
|
||||||
mqtt_relay.configure_tls()
|
mqtt_relay.configure_tls()
|
||||||
mqtt_relay.connect_and_loop(loop_forever=False)
|
mqtt_relay.connect_and_loop(loop_forever=False)
|
||||||
mqtt_relay.push_ota(home_id, filename, published, qos)
|
mqtt_relay.push_ota(home_id, filename, published, qos)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user