summaryrefslogtreecommitdiff
path: root/src/home/mqtt/payload/relay.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/home/mqtt/payload/relay.py')
-rw-r--r--src/home/mqtt/payload/relay.py45
1 files changed, 40 insertions, 5 deletions
diff --git a/src/home/mqtt/payload/relay.py b/src/home/mqtt/payload/relay.py
index 2a327ba..debc2c8 100644
--- a/src/home/mqtt/payload/relay.py
+++ b/src/home/mqtt/payload/relay.py
@@ -1,6 +1,10 @@
+import hashlib
+
from .base_payload import MQTTPayload, MQTTPayloadCustomField
+# _logger = logging.getLogger(__name__)
+
class StatFlags(MQTTPayloadCustomField):
state: bool
config_changed_value_present: bool
@@ -8,9 +12,11 @@ class StatFlags(MQTTPayloadCustomField):
@staticmethod
def unpack(flags: int):
+ # _logger.debug(f'StatFlags.unpack: flags={flags}')
state = flags & 0x1
ccvp = (flags >> 1) & 0x1
cc = (flags >> 2) & 0x1
+ # _logger.debug(f'StatFlags.unpack: state={state}')
return StatFlags(state=(state == 1),
config_changed_value_present=(ccvp == 1),
config_changed=(cc == 1))
@@ -24,7 +30,7 @@ class StatFlags(MQTTPayloadCustomField):
class InitialStatPayload(MQTTPayload):
- FORMAT = 'IBbIB'
+ FORMAT = '=IBbIB'
ip: int
fw_version: int
@@ -34,7 +40,7 @@ class InitialStatPayload(MQTTPayload):
class StatPayload(MQTTPayload):
- FORMAT = 'bIB'
+ FORMAT = '=bIB'
rssi: int
free_heap: int
@@ -42,13 +48,42 @@ class StatPayload(MQTTPayload):
class PowerPayload(MQTTPayload):
- FORMAT = '12sB'
+ FORMAT = '=12sB'
PACKER = {
- 'state': lambda n: int(n)
+ 'state': lambda n: int(n),
+ 'secret': lambda s: s.encode('utf-8')
}
UNPACKER = {
- 'state': lambda n: bool(n)
+ 'state': lambda n: bool(n),
+ 'secret': lambda s: s.decode('utf-8')
}
secret: str
state: bool
+
+
+class OTAPayload(MQTTPayload):
+ secret: str
+ filename: str
+
+ # structure of returned data:
+ #
+ # uint8_t[len(secret)] secret;
+ # uint8_t[16] md5;
+ # *uint8_t data
+
+ def pack(self):
+ buf = bytearray(self.secret.encode())
+ m = hashlib.md5()
+ with open(self.filename, 'rb') as fd:
+ content = fd.read()
+ m.update(content)
+ buf.extend(m.digest())
+ buf.extend(content)
+ return buf
+
+ def unpack(cls, buf: bytes):
+ raise RuntimeError(f'{cls.__class__.__name__}.unpack: not implemented')
+ # secret = buf[:12].decode()
+ # filename = buf[12:].decode()
+ # return OTAPayload(secret=secret, filename=filename)