Beantwoord

KeyError: 'n' - met KPN senML library

  • 11 January 2022
  • 8 reacties
  • 113 keer bekeken

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

icon

Beste antwoord door Leroy 13 January 2022, 14:54

Bekijk origineel

8 reacties

Reputatie 5
Badge +3

Hey @SanderV ! Vraag staat uit bij de specialisten. Kom er op terug!

Bedankt voor uw snelle reactie.

Ik was wat dingen aan het proberen en ik kwam er achter dat de data die ik vanuit mijn LoRa device krijg wel werkt:

[
{
"bn": "urn:dev:DEVEUI:xxxxxxxxxx:",
"bt": 1565729764,
"n": "temperature",
"u": "Cel",
"v": 14.4866037
},
{
"v": 1569,
"n": "power",
"u": "W"
}
]

Daar ben ik dus erg blij mee.

 

Nu heb ik mijn LoRa device niet bij de hand en gebruikte ik dus de Device simulator app, Maar deze geeft wel de eerder genoemde error:

[
{
"bn": "urn:dev:DVNUUID:da35e636-de76-xxxxxxxx:",
"bt": 1641990196
},
{
"n": "battery",
"u": "%",
"vs": "91.0"
},
{
"n": "accelerationX",
"u": "m/s2",
"v": 0.51
}
]

Ik zie waar het verschil zit en begin te begrijpen waar het probleem zit. Maar hoe wordt je anders verwacht de app te gebruiken?

 

Met vriendelijke groeten,
Sander

Reputatie 5
Badge +3

@SanderV daar ben ik weer met een antwoord van onze devs.

 

Oorzaak van de fout ligt in het feit dat de SenML opbouw voor sommige decoders niet 100% correct is. En dat heeft zijn oorsprong in het prille begin/ontstaan van de dienstverlening.

 

De gepubliceerde en gebruikte library zou aangepast moeten worden om ook de incorrecte SenML(Device simulator app) goed te kunnen verwerken. Elk record verwacht een “name” value. In de opbouw van de tweede SenML is een splitsing aanwezig, waardoor het tweede deel geen “name” value bevat.

Het advies is daarom dus ook om de schrijver van de library(Jan Bogaerts) benaderen via Github met het verzoek om de library aan te passen zodat ook de niet 100% correcte SenML verwerkt kan worden. Stuur hierbij ook het voorbeeld mee.

Dat is duidelijk.

Bedankt voor jullie snelle reacties.


Ik zou dat binnenkort een bericht doen op de Github pagina. Kijken of de auteur dit wilt aanpassen.
 

Nu had ik nog wel een andere vraag,
Jullie hebben de Device simulator app deze maand uitgebracht. Hoe wordt je anders verwacht de data hieruit te gebruiken zonder een werkende SenML library?

Met vriendelijke groeten,
Sander Versteegh

Reputatie 5
Badge +3

Dat is duidelijk.

Bedankt voor jullie snelle reacties.


Ik zou dat binnenkort een bericht doen op de Github pagina. Kijken of de auteur dit wilt aanpassen.
 

Nu had ik nog wel een andere vraag,
Jullie hebben de Device simulator app deze maand uitgebracht. Hoe wordt je anders verwacht de data hieruit te gebruiken zonder een werkende SenML library?

Met vriendelijke groeten,
Sander Versteegh

 

Ik heb de vraag uitstaan, kom er zsm op terug.

Reputatie 5
Badge +3

Dat is duidelijk.

Bedankt voor jullie snelle reacties.


Ik zou dat binnenkort een bericht doen op de Github pagina. Kijken of de auteur dit wilt aanpassen.
 

Nu had ik nog wel een andere vraag,
Jullie hebben de Device simulator app deze maand uitgebracht. Hoe wordt je anders verwacht de data hieruit te gebruiken zonder een werkende SenML library?

Met vriendelijke groeten,
Sander Versteegh

 

Ik heb toch een enigszins bijgesteld antwoord ontvangen. Het IoT team gaat hier toch zelf achter aan omdat de library ook deels onder KPN verantwoordelijkheid valt. Zodra er meer bekend is meld ik dat hier. 

Badge

de senml berichten die ja van KPN krijgt zijn niet conform de RFC. Er moet een waarde zitten in een element, maar dat ontbreekt in de eerste (alleen bn en bt, dat is onvoldoende). Ik corrigeer dat bij elk binnenkomend pakket, opdat de processing verderop OK is:

 b.v.: {"bn": "urn:dev:DEVEUI:E94141A86382B195:", "bt": 1621517065} arriveert, maar dat is niet juist. er moet een ‘value’: (v, vb, vd, vs) of sum (s)  in zitten. 

Na ontvangst plak ik er een "s":0 aan.

 

De rfc: https://www.rfc-editor.org/rfc/rfc8428.txt

@Leroy Deze Senml library is in der tijd in opdracht geschreven voor kpn en is toen ook over gedragen. Ik kan deze library niet gratis onderhouden voor KPN, dat is voor hen.

Reageer