Een goede avond.
Ik ben alweer even bezig met het verwezenlijken van een simpele LoRa tempratuur sensor. Nu heb ik het zover dat ik via LoRa een cbor ThingsML verstuur en deze data netjes decoded in mijn MQTT server binnen krijg. Nu wil ik deze data met behulp van een python script vertalen naar bruikbare data die ik in een InfluxDB kan stoppen.
Door gebruik te maken van deze libarry wil ik de senML string om zetten naar iets bruikbaars. Dit probeer ik in eerste instantie met het voorbeeld script vanuit de GitHub actuator.py.
Maar zo snel ik mijn eigen json_data invoeg krijg ik de error:
Traceback (most recent call last):
File "d:/Users/Sander/Documents/projecten/Ruud/LoRa tempratuur meter/van things naar mqtt/senMLtest.py", line 32, in <module>
pack.from_json(json_data)
File "d:\Users\Sander\Documents\projecten\Ruud\LoRa tempratuur meter\van things naar mqtt\kpn_senml\senml_pack.py", line 149, in from_json
self._process_incomming_data(records, SenmlPack.json_mappings)
File "d:\Users\Sander\Documents\projecten\Ruud\LoRa tempratuur meter\van things naar mqtt\kpn_senml\senml_pack.py", line 183, in _process_incomming_data
self.do_actuate(item, naming_map, cur_pack_el)
File "d:\Users\Sander\Documents\projecten\Ruud\LoRa tempratuur meter\van things naar mqtt\kpn_senml\senml_pack.py", line 205, in do_actuate
rec = SenmlRecord(raw[naming_map['n']])
KeyError: 'n'
Ook heb ik de voorbeeld string uit de docs geprobeerd. Deze geeft de zelfde error
'[{"bn": "urn:dev:DEVEUI:0123456789ABCDEF:","bt": 1.58565075E9},{"n": "temperature", "v": 20.5, "u": "Cel"},{"n": "batteryVoltage", "v": 3.6, "u": "V", "t": 10},{"n": "active", "vb": true},{"n": "modus", "vs": "Active"},{"n": "image", "vd": "aGFsbG9vb29vISE="}]'
https://docs.kpnthings.com/dm/concepts/senml#:~:text=1-,%5B,-2
Dit is het script dat ik gebruik.
from kpn_senml import *
import binascii
def do_actuate(record):
'''
called when actuate_me receives a value.
:return: None
'''
print(record.value)
def generic_callback(record, **kwargs):
"""
a generic callback, attached to the device. Called when a record is found that has not yet been registered
in the pack. When this callback is called, the record will already be added to the pack.
:param record: the newly found record.
:return: None
"""
print("found record: " + record.name)
print("with value: " + str(record.value))
pack = SenmlPack("device_name", generic_callback)
actuate_me = SenmlRecord("actuator", callback=do_actuate)
pack.add(actuate_me)
json_data = '[{"bn": "device_name", "n":"actuator", "v": 20 }, {"n": "another_actuator", "vs": "a value"}]'
json_own = '[{"bn": "urn:dev:DEVEUI:0123456789ABCDEF:","bt": 1.58565075E9},{"n": "temperature", "v": 20.5, "u": "Cel"},{"n": "batteryVoltage", "v": 3.6, "u": "V", "t": 10},{"n": "active", "vb": true},{"n": "modus", "vs": "Active"},{"n": "image", "vd": "aGFsbG9vb29vISE="}]'
print(json_data)
pack.from_json(json_data)
print(json_own)
pack.from_json(json_own)
Kan iemand vertellen wat er mis gaat?
Alvast bedankt,
Sander
Beste antwoord door Leroy
Bekijk origineel