done so far

This commit is contained in:
Wolfgang Hottgenroth 2023-01-30 10:53:53 +01:00
parent ef52969d81
commit fd4de170a0
Signed by: wn
GPG Key ID: 836E9E1192A6B132

View File

@ -9,34 +9,6 @@ import struct
import psycopg2 import psycopg2
import psycopg2.extras import psycopg2.extras
#DEVICES = {
# 'eui-43fa12f400006c88': {
# 'label': 'Badesee',
# 'sensors': [
# {
# 'address': 0xb8012062f611c728,
# 'label': '0,5m ',
# 'index': 0
# },
# {
# 'address': 0xb400000d0ac31928,
# 'label': '2,0m ',
# 'index': 1
# },
# {
# 'address': 0x9400000d6a4f8c28,
# 'label': '3,0m ',
# 'index': 2
# },
# {
# 'address': 0xd400000d6a863528,
# 'label': '4,0m ',
# 'index': 3
# }
#
# ]
# }
#}
oldDevice = {} oldDevice = {}
@ -63,7 +35,6 @@ class DbOp(object):
def getDevice(self, deviceId): def getDevice(self, deviceId):
try: try:
logger.debug("1")
conn = self.__getConn() conn = self.__getConn()
with conn: with conn:
with conn.cursor() as cur: with conn.cursor() as cur:
@ -89,19 +60,27 @@ class DbOp(object):
'index': sensor[2] 'index': sensor[2]
}) })
return device return device
except Exception as e:
logger.error(f"Error getting device: {e}")
raise DeviceNotFoundException(deviceId)
finally: finally:
if conn: if conn:
conn.close() conn.close()
#def getDevice(deviceId): def storeMeasurement(self, measurement):
# try: try:
# return DEVICES[deviceId] logger.info(f"About to store {measurement}")
# except KeyError: conn = self.__getConn()
# raise DeviceNotFoundException(deviceId) with conn:
with conn.cursor() as cur:
def storeMeasurement(measurement): for entry in measurement['measurements']:
logger.info(f"Store: {measurement=}") cur.execute("insert into measurement_t (time, device_name, sensor_name, temperature) values (%(time)s, %(dname)s, %(sname)s, %(tempc)s)",
{ 'time': measurement['time'], 'dname': measurement['label'], 'sname': entry['label'], 'tempc': entry['value'] })
except Exception as e:
logger.error(f"Error storing measurement: {e}")
finally:
if conn:
conn.close()
def mqttOnConnectCallback(client, userdata, flags, rc): def mqttOnConnectCallback(client, userdata, flags, rc):
logger.info("mqtt connected") logger.info("mqtt connected")
@ -118,11 +97,9 @@ def mqttOnMessageCallback(client, userdata, message):
sendSetupMessage = False sendSetupMessage = False
device_id = parse_payload['end_device_ids']['device_id'] device_id = parse_payload['end_device_ids']['device_id']
# device = getDevice(device_id)
dbh = DbOp(config) dbh = DbOp(config)
device = dbh.getDevice(device_id) device = dbh.getDevice(device_id)
logger.debug(f"{device=}")
global oldDevice global oldDevice
if (device != oldDevice): if (device != oldDevice):
@ -133,13 +110,11 @@ def mqttOnMessageCallback(client, userdata, message):
sensors = { x['address']:[x['index'], x['label']] for x in device['sensors']} sensors = { x['address']:[x['index'], x['label']] for x in device['sensors']}
frame = base64.b64decode(parse_payload['uplink_message']['frm_payload']) frame = base64.b64decode(parse_payload['uplink_message']['frm_payload'])
logger.info(f"{frame=}")
status = struct.unpack('<H', frame[0:2])[0] status = struct.unpack('<H', frame[0:2])[0]
logger.info(f"{status=}") logger.debug(f"{frame=}, {status=}")
if (status == 4): if (status == 4):
logger.info(f"Start up message received from {device_id}, {device['label']}") logger.info(f"Start up message received from {device_id}, {device['label']}")
# send downlink message with labels
for i in range(0, num_of_sensors): for i in range(0, num_of_sensors):
start_index = 2 + (i * 8) start_index = 2 + (i * 8)
end_index = start_index + 8 end_index = start_index + 8
@ -149,28 +124,28 @@ def mqttOnMessageCallback(client, userdata, message):
raise UnknownSensorException(received_sensor_address) raise UnknownSensorException(received_sensor_address)
sendSetupMessage = True sendSetupMessage = True
else: else:
logger.info(f"Regular message received from {device_id}") logger.info(f"Regular message received from {device_id}, {device['label']}")
# continue to parse and process message measurement = {
measurement = [] 'label': device['label'],
# sensor_addrs = [] 'time': parse_payload['received_at'],
# sensor_values = [] 'measurements': []
}
for i in range(0, num_of_sensors): for i in range(0, num_of_sensors):
addr_start_index = 2 + (i * (8 + 4)) addr_start_index = 2 + (i * (8 + 4))
addr_end_index = addr_start_index + 8 addr_end_index = addr_start_index + 8
received_sensor_address = struct.unpack('<Q', frame[addr_start_index:addr_end_index])[0] received_sensor_address = struct.unpack('<Q', frame[addr_start_index:addr_end_index])[0]
if (received_sensor_address not in sensors): if (received_sensor_address not in sensors):
raise UnknownSensorException(received_sensor_address) raise UnknownSensorException(received_sensor_address)
# sensor_addrs.append(received_sensor_address)
value_start_index = addr_end_index value_start_index = addr_end_index
value_end_index = value_start_index + 4 value_end_index = value_start_index + 4
value = struct.unpack('<i', frame[value_start_index:value_end_index])[0] / 128 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") logger.debug(f"sensor {i}: 0x{received_sensor_address:016x} = {value:.2f} °C")
measurement.append({ measurement['measurements'].append({
"address": received_sensor_address, "address": received_sensor_address,
"value": value, "value": value,
"label": sensors[received_sensor_address][1] "label": sensors[received_sensor_address][1]
}) })
storeMeasurement(measurement) dbh.storeMeasurement(measurement)
if (sendSetupMessage): if (sendSetupMessage):
sendSetupMessage = False sendSetupMessage = False
@ -193,7 +168,6 @@ def mqttOnMessageCallback(client, userdata, message):
] ]
})) }))
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}")
except DeviceNotFoundException as e: except DeviceNotFoundException as e: