mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-19 11:56:11 +02:00
Include raw data and some more metadata in .json
This commit is contained in:
parent
f41386d326
commit
abd0629072
1 changed files with 41 additions and 5 deletions
|
@ -22,6 +22,7 @@ mqtt_port = cfg.getint('mqtt', 'port', fallback=1883)
|
|||
radio = RF24(22, 0, 1000000)
|
||||
mqtt_client = paho.mqtt.client.Client()
|
||||
mqtt_client.connect(mqtt_host, mqtt_port)
|
||||
mqtt_client.loop_start()
|
||||
|
||||
# Master Address ('DTU')
|
||||
dtu_ser = 99978563412 # identical to fc22's
|
||||
|
@ -101,8 +102,10 @@ def print_addr(a):
|
|||
print(f" -> HM {' '.join([f'{x:02x}' for x in ser_to_hm_addr(a)])}", end='')
|
||||
print(f" -> ESB {' '.join([f'{x:02x}' for x in ser_to_esb_addr(a)])}")
|
||||
|
||||
# time of last transmission - to calculcate response time
|
||||
t_last_tx = 0
|
||||
|
||||
def on_receive(p):
|
||||
def on_receive(p, ch_rx=None, ch_tx=None):
|
||||
"""
|
||||
Callback: get's invoked whenever a packet has been received.
|
||||
:param p: Payload of the received packet.
|
||||
|
@ -110,14 +113,25 @@ def on_receive(p):
|
|||
|
||||
d = {}
|
||||
|
||||
t_now_ns = time.monotonic_ns()
|
||||
ts = datetime.utcnow()
|
||||
ts_unixtime = ts.timestamp()
|
||||
d['ts_unixtime'] = ts_unixtime
|
||||
d['isodate'] = ts.isoformat()
|
||||
d['rawdata'] = " ".join([f"{b:02x}" for b in p])
|
||||
print(ts.isoformat(), end='Z ')
|
||||
|
||||
# check crc8
|
||||
crc8 = f_crc8(p[:-1])
|
||||
d['crc8_valid'] = True if crc8==p[-1] else False
|
||||
|
||||
# interpret content
|
||||
mid = p[0]
|
||||
d['mid'] = mid
|
||||
name = 'unknowndata'
|
||||
d['response_time_ns'] = t_now_ns-t_last_tx
|
||||
d['ch_rx'] = ch_rx
|
||||
d['ch_tx'] = ch_tx
|
||||
|
||||
if mid == 0x95:
|
||||
src, dst, cmd = struct.unpack('>LLB', p[1:10])
|
||||
|
@ -163,11 +177,27 @@ def on_receive(p):
|
|||
d['wday2_Wh'] = uk5
|
||||
d['uk2'] = uk2
|
||||
|
||||
elif cmd==0x83:
|
||||
name = 'misc1'
|
||||
uk1, uk2, uk3, uk4, uk5, uk6 = struct.unpack(
|
||||
'>HHHHHH', p[10:22])
|
||||
print('')
|
||||
d['uk1'] = uk1
|
||||
d['uk2'] = uk2
|
||||
d['uk3'] = uk3
|
||||
d['uk4'] = uk4
|
||||
d['uk5'] = uk5
|
||||
d['uk6'] = uk6
|
||||
|
||||
else:
|
||||
print(f'unknown cmd {cmd}')
|
||||
else:
|
||||
print(f'unknown frame id {p[0]}')
|
||||
|
||||
# output to stdout
|
||||
if d:
|
||||
print(json.dumps(d))
|
||||
|
||||
# output to MQTT
|
||||
if d:
|
||||
j = json.dumps(d)
|
||||
|
@ -186,15 +216,19 @@ def main_loop():
|
|||
to one of our inverters on channel 40.
|
||||
"""
|
||||
|
||||
global t_last_tx
|
||||
|
||||
print_addr(inv_ser)
|
||||
print_addr(dtu_ser)
|
||||
|
||||
ctr = 1
|
||||
|
||||
ts = int(time.time()) # see what happens if we always send one and the same (constant) time!
|
||||
ch_tx = 40
|
||||
ch_rx = 3
|
||||
|
||||
while True:
|
||||
radio.setChannel(3)
|
||||
radio.setChannel(ch_rx)
|
||||
radio.enableDynamicPayloads()
|
||||
radio.setAutoAck(False)
|
||||
radio.setPALevel(RF24_PA_MAX)
|
||||
|
@ -218,12 +252,13 @@ def main_loop():
|
|||
payload = radio.read(size)
|
||||
print(f"Received {size} bytes on pipe {pipe_number}: " +
|
||||
" ".join([f"{b:02x}" for b in payload]))
|
||||
on_receive(payload)
|
||||
on_receive(payload, ch_rx=ch_rx, ch_tx=ch_tx)
|
||||
else:
|
||||
time.sleep(0.01)
|
||||
pass
|
||||
# time.sleep(0.01)
|
||||
|
||||
radio.stopListening() # put radio in TX mode
|
||||
radio.setChannel(40)
|
||||
radio.setChannel(ch_tx)
|
||||
radio.openWritingPipe(ser_to_esb_addr(inv_ser))
|
||||
|
||||
if ctr<3:
|
||||
|
@ -235,6 +270,7 @@ def main_loop():
|
|||
print(f"{ctr:5d}: len={len(payload)} | " + " ".join([f"{b:02x}" for b in payload]),
|
||||
flush=True)
|
||||
radio.write(payload) # will always yield 'True' because auto-ack is disabled
|
||||
t_last_tx = time.monotonic_ns()
|
||||
ctr = ctr + 1
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue