initial
This commit is contained in:
commit
ad21e10686
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
ENV
|
||||||
|
*.pyc
|
||||||
|
src/.venv/*
|
||||||
|
|
4
docs/notes.txt
Normal file
4
docs/notes.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Sending messages downlink via MQTT: https://www.thethingsindustries.com/docs/integrations/mqtt/#publishing-downlink-traffic
|
||||||
|
|
||||||
|
Topics for messages at TTN: https://www.thethingsindustries.com/docs/integrations/mqtt/#publishing-downlink-traffic
|
||||||
|
|
94
src/preprocess.py
Normal file
94
src/preprocess.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
from loguru import logger
|
||||||
|
import paho.mqtt.client as mqtt
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import ssl
|
||||||
|
import json
|
||||||
|
import base64
|
||||||
|
import struct
|
||||||
|
|
||||||
|
def mqttOnConnectCallback(client, userdata, flags, rc):
|
||||||
|
logger.info("mqtt connected")
|
||||||
|
client.subscribe(config['MQTT_IN_TOPIC'])
|
||||||
|
logger.info(f"subscribed to {config['MQTT_IN_TOPIC']}")
|
||||||
|
|
||||||
|
def mqttOnMessageCallback(client, userdata, message):
|
||||||
|
try:
|
||||||
|
topic = message.topic
|
||||||
|
payload = message.payload
|
||||||
|
logger.debug(f"mqtt message received: {topic} -> {payload}")
|
||||||
|
parse_payload = json.loads(payload)
|
||||||
|
frame = base64.b64decode(parse_payload['uplink_message']['frm_payload'])
|
||||||
|
logger.info(f"{frame=}")
|
||||||
|
status = struct.unpack('<H', frame[0:2])[0]
|
||||||
|
logger.info(f"{status=}")
|
||||||
|
|
||||||
|
if (status == 4):
|
||||||
|
logger.info("Start up message received")
|
||||||
|
# send downlink message with labels
|
||||||
|
sensor_addrs = []
|
||||||
|
for i in range(0, 4):
|
||||||
|
start_index = 2 + (i * 8)
|
||||||
|
end_index = start_index + 8
|
||||||
|
sensor_addrs.append(struct.unpack('<Q', frame[start_index:end_index])[0])
|
||||||
|
logger.debug(f"sensor {i}: 0x{sensor_addrs[i]:016x}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.info("Regular message received")
|
||||||
|
# continue to parse and process message
|
||||||
|
sensor_addrs = []
|
||||||
|
sensor_values = []
|
||||||
|
for i in range(0, 4):
|
||||||
|
addr_start_index = 2 + (i * (8 + 4))
|
||||||
|
addr_end_index = addr_start_index + 8
|
||||||
|
sensor_addrs.append(struct.unpack('<Q', frame[addr_start_index:addr_end_index])[0])
|
||||||
|
value_start_index = addr_end_index
|
||||||
|
value_end_index = value_start_index + 4
|
||||||
|
sensor_values.append(struct.unpack('<i', frame[value_start_index:value_end_index])[0] / 128)
|
||||||
|
logger.debug(f"sensor {i}: 0x{sensor_addrs[i]:016x} = {sensor_values[i]:.2f} °C")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"unable to parse message {payload}, {e}")
|
||||||
|
|
||||||
|
def mqttOnDisconnectCallback(client, userdata, rc):
|
||||||
|
pass
|
||||||
|
|
||||||
|
logger.info("preprocess starting")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
REQUIRED_CONFIG_OPTIONS = [
|
||||||
|
'MQTT_LOGIN',
|
||||||
|
'MQTT_PASSWORD',
|
||||||
|
'MQTT_BROKER',
|
||||||
|
'MQTT_PORT',
|
||||||
|
'MQTT_CA',
|
||||||
|
'MQTT_IN_TOPIC'
|
||||||
|
]
|
||||||
|
|
||||||
|
config = {}
|
||||||
|
for rco in REQUIRED_CONFIG_OPTIONS:
|
||||||
|
try:
|
||||||
|
config[rco] = os.environ[rco]
|
||||||
|
except KeyError:
|
||||||
|
logger.error(f"{rco} is a required config option, not available in environment")
|
||||||
|
sys.exit(-1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
client = mqtt.Client()
|
||||||
|
client.on_message = mqttOnMessageCallback
|
||||||
|
client.on_connect = mqttOnConnectCallback
|
||||||
|
client.on_disconnect = mqttOnDisconnectCallback
|
||||||
|
client.username_pw_set(config['MQTT_LOGIN'], config['MQTT_PASSWORD'])
|
||||||
|
client.tls_set(
|
||||||
|
cert_reqs=ssl.CERT_REQUIRED,
|
||||||
|
ciphers=None
|
||||||
|
)
|
||||||
|
client.connect(config["MQTT_BROKER"], int(config["MQTT_PORT"]))
|
||||||
|
logger.info("mqtt loop starting")
|
||||||
|
client.loop_forever()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
2
src/requirements.txt
Normal file
2
src/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
loguru==0.6.0
|
||||||
|
paho-mqtt==1.6.1
|
Loading…
x
Reference in New Issue
Block a user