database prepared

This commit is contained in:
Wolfgang Hottgenroth 2023-01-29 15:19:01 +01:00
parent a9d9597e62
commit b6b40d1d4c
Signed by: wn
GPG Key ID: 836E9E1192A6B132

View File

@ -14,22 +14,22 @@ DEVICES = {
'sensors': [ 'sensors': [
{ {
'address': 0xb8012062f611c728, 'address': 0xb8012062f611c728,
'label': '0,5m:', 'label': '0,5m ',
'index': 0 'index': 0
}, },
{ {
'address': 0xb400000d0ac31928, 'address': 0xb400000d0ac31928,
'label': '2,0m:', 'label': '2,0m ',
'index': 1 'index': 1
}, },
{ {
'address': 0x9400000d6a4f8c28, 'address': 0x9400000d6a4f8c28,
'label': '3,0m:', 'label': '3,0m ',
'index': 2 'index': 2
}, },
{ {
'address': 0xd400000d6a863528, 'address': 0xd400000d6a863528,
'label': '4,0m:', 'label': '4,0m ',
'index': 3 'index': 3
} }
@ -37,6 +37,8 @@ DEVICES = {
} }
} }
oldDevice = {}
class DeviceNotFoundException (Exception): class DeviceNotFoundException (Exception):
def __init__(self, deviceId): def __init__(self, deviceId):
self.deviceId = deviceId self.deviceId = deviceId
@ -51,6 +53,9 @@ def getDevice(deviceId):
except KeyError: except KeyError:
raise DeviceNotFoundException(deviceId) raise DeviceNotFoundException(deviceId)
def storeMeasurement(measurement):
logger.info(f"Store: {measurement=}")
def mqttOnConnectCallback(client, userdata, flags, rc): def mqttOnConnectCallback(client, userdata, flags, rc):
logger.info("mqtt connected") logger.info("mqtt connected")
@ -65,8 +70,14 @@ def mqttOnMessageCallback(client, userdata, message):
logger.debug(f"mqtt message received: {topic} -> {payload}") logger.debug(f"mqtt message received: {topic} -> {payload}")
parse_payload = json.loads(payload) parse_payload = json.loads(payload)
sendSetupMessage = False
device_id = parse_payload['end_device_ids']['device_id'] device_id = parse_payload['end_device_ids']['device_id']
device = getDevice(device_id) device = getDevice(device_id)
global oldDevice
if (device != oldDevice):
logger.info("device configuration in database has changed")
oldDevice = device
sendSetupMessage = True
num_of_sensors = len(device['sensors']) num_of_sensors = len(device['sensors'])
sensors = { x['address']:[x['index'], x['label']] for x in device['sensors']} sensors = { x['address']:[x['index'], x['label']] for x in device['sensors']}
@ -85,6 +96,33 @@ def mqttOnMessageCallback(client, userdata, message):
logger.debug(f"sensor {i}: 0x{received_sensor_address:016x}") logger.debug(f"sensor {i}: 0x{received_sensor_address:016x}")
if (received_sensor_address not in sensors): if (received_sensor_address not in sensors):
raise UnknownSensorException(received_sensor_address) raise UnknownSensorException(received_sensor_address)
sendSetupMessage = True
else:
logger.info(f"Regular message received from {device_id}")
# continue to parse and process message
measurement = []
# sensor_addrs = []
# sensor_values = []
for i in range(0, num_of_sensors):
addr_start_index = 2 + (i * (8 + 4))
addr_end_index = addr_start_index + 8
received_sensor_address = struct.unpack('<Q', frame[addr_start_index:addr_end_index])[0]
if (received_sensor_address not in sensors):
raise UnknownSensorException(received_sensor_address)
# sensor_addrs.append(received_sensor_address)
value_start_index = addr_end_index
value_end_index = value_start_index + 4
value = struct.unpack('<i', frame[value_start_index:value_end_index])[0] / 128
logger.debug(f"sensor {i}: 0x{received_sensor_address:016x} = {value:.2f} °C")
measurement.append({
"address": received_sensor_address,
"value": value,
"label": sensors[received_sensor_address][1]
})
storeMeasurement(measurement)
if (sendSetupMessage):
sendSetupMessage = False
setupMessage = bytes() setupMessage = bytes()
null = 0 null = 0
null = null.to_bytes(1, byteorder='big') null = null.to_bytes(1, byteorder='big')
@ -104,22 +142,6 @@ def mqttOnMessageCallback(client, userdata, message):
] ]
})) }))
else:
logger.info(f"Regular message received from {device_id}")
# continue to parse and process message
sensor_addrs = []
sensor_values = []
for i in range(0, num_of_sensors):
addr_start_index = 2 + (i * (8 + 4))
addr_end_index = addr_start_index + 8
received_sensor_address = struct.unpack('<Q', frame[addr_start_index:addr_end_index])[0]
if (received_sensor_address not in sensors):
raise UnknownSensorException(received_sensor_address)
sensor_addrs.append(received_sensor_address)
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 UnknownSensorException as e: except UnknownSensorException as e:
logger.error(f"unknown sensor in message {e.sensorAddress}") logger.error(f"unknown sensor in message {e.sensorAddress}")