senml — Sensor Markup Language#

Denna modul implementerar en liten kodare/avkodare för Sensor Markup Language (SenML, RFC 8428). SenML är en medietyp för sensormätningar och enhetsparametrar: varje ”pack” är en lista av ”records”, där varje record bär ett namn, en enhet, ett värde, en tidsstämpel och en valfri summa.

Implementeringen stöder både JSON- och CBOR-representationerna och tillåter att pack nästlas så att ett enda rotpack kan beskriva en gateway som fronter flera enheter. Inkommande nyttolaster kan driva aktuatoråteranrop på befintliga records.

Exempel på användning:

from senml import SenmlPack, SenmlRecord, SenmlUnits

# A pack collects readings for one device, identified by URN.
pack = SenmlPack("urn:dev:mac:0024befffe804ff1")

# Add a temperature reading in degrees Celsius.
pack.add(SenmlRecord(
    "temperature",
    unit=SenmlUnits.SENML_UNIT_DEGREES_CELSIUS,
    value=23.4,
))

# Add a humidity reading in %RH.
pack.add(SenmlRecord(
    "humidity",
    unit=SenmlUnits.SENML_UNIT_RELATIVE_HUMIDITY,
    value=51.2,
))

# Render the pack as a SenML/JSON document.
print(pack.to_json())

Klasser#

class senml.SenmlPack(name: str, callback=None)#

Representerar ett SenML-pack – en samling av SenmlRecord-instanser och eventuellt andra underordnade SenmlPack-objekt. När ett pack endast innehåller records representerar det en enskild enhet; när det innehåller andra pack fungerar det som en gateway.

name är SenML-basnamnet (bn) som används för varje record i detta pack.

callback anropas från from_json / from_cbor närhelst ett inkommande record namnger en tidigare okänd sensor; det nya SenmlRecord skickas som det första argumentet och (för nästlade pack) skickas det ursprungliga enhetspacket som device=.... Det används vanligtvis för att hantera aktuatorkommandon.

SenmlPack-instanser är itererbara – iteration ger varje record i insättningsordning – och kan användas som en kontexthanterare så att packet vid utträde tar bort sig självt från sin förälder.

name: str#

Packets basnamn (bn).

base_value: int | float | None#

Valfritt basvärde (bv) som läggs till varje records numeriska värde vid kodning och subtraheras vid avkodning. Att ange ett icke-numeriskt värde ger upphov till Exception.

base_time: int | float | None#

Valfri bastid (bt) som läggs till varje records tidsstämpel.

base_sum: int | float | None#

Valfri bassumma (bs) som läggs till varje records summafält.

base_unit: str | None#

Valfri basenhet (bu) – vanligtvis ett värde från SenmlUnits.

actuate#

Det återanrop som angavs vid konstruktionstillfället. Kan tilldelas på nytt under körning.

add(item: SenmlRecord | SenmlPack) None#

Lägg till item i detta pack. item måste vara ett SenmlRecord eller ett annat SenmlPack och får inte redan tillhöra en annan förälder; annars ges Exception upphov.

remove(item: SenmlRecord | SenmlPack) None#

Ta bort item från detta pack. Exception ges upphov om item inte är ett barn till detta pack.

clear() None#

Ta bort varje record/under-pack från detta pack och koppla loss dem från deras förälderreferens.

from_json(data: str) None#

Tolka ett SenML/JSON-dokument och slå samman dess records med detta pack. Records som redan finns (matchade på namn) utlöser SenmlRecord.do_actuate(); nya records läggs till och packets callback anropas.

to_json() str#

Rendera packet och dess barn till en SenML/JSON-sträng.

from_cbor(data: bytes) None#

Tolka en SenML/CBOR-bytesträng och slå samman dess records med detta pack.

to_cbor() bytes#

Rendera packet och dess barn till en SenML/CBOR-bytesträng.

do_actuate(raw: dict, naming_map: dict, device: SenmlPack | None = None) None#

Internt hjälpmedel som anropas vid tolkning av inkommande data när inget befintligt record matchar en post. Lägger till ett nytt SenmlRecord i device (eller i detta pack) och vidarebefordrar det till callback.

class senml.SenmlRecord(name: str, **kwargs)#

Representerar en enskild mätning inuti ett SenmlPack.

name är SenML-recordnamnet (n).

Följande nyckelordsargument accepteras:

  • valuebool, int, float, str eller bytearray. Andra typer ger upphov till Exception.

  • time – numerisk tidsstämpel (t).

  • unit – en enhetssträng, vanligtvis en medlem av SenmlUnits.

  • sum – numerisk integrerad summa (s).

  • update_time – maximal tid innan sensorn kommer att ge en ny avläsning (ut).

  • callback – funktion som anropas när en inkommande nyttolast uppdaterar detta record. Den tar emot SenmlRecord som sitt enda argument.

SenmlRecord kan användas som en kontexthanterare så att det vid utträde tar bort sig självt från sitt förälderpack.

name: str#

Recordnamn (n).

value#

Det aktuella värdet. Vid omtilldelning kontrolleras typen; endast bool, tal, str och bytearray accepteras. För att styra den renderade precisionen för ett flyttalsvärde, avrunda före tilldelningen, t.ex. record.value = round(x, 2).

unit: str | None#

Enhetssträng (u).

time: int | float | None#

Tidsstämpel kopplad till denna mätning (t).

update_time: int | float | None#

Maximal tid innan sensorn kommer att ge en uppdaterad avläsning (ut).

sum: int | float | None#

Integrerat summafält (s).

actuate#

Det återanrop som angavs vid konstruktionstillfället. Kan tilldelas på nytt under körning.

do_actuate(raw: dict, naming_map: dict) None#

Uppdatera detta record från en rå inkommande SenML-ordbok och, om det finns, anropa aktueringsåteranropet.

class senml.SenmlBase#

Gemensam basklass som delas av SenmlPack och SenmlRecord. Den exponerar inget eget publikt API; den existerar så att SenmlPack.add() kan validera att ett objekt tillhör SenML-hierarkin.

class senml.SenmlUnits#

Namnrymdsklass vars klassattribut är de SenML-enhetssymboler som definieras av RFC 8428. Varje attribut motsvarar enhetens strängkod, lämplig för tilldelning till SenmlRecord.unit eller SenmlPack.base_unit.

SENML_UNIT_METER: str#

"m" – meter.

SENML_UNIT_KILOGRAM: str#

"kg" – kilogram.

SENML_UNIT_GRAM: str#

"g" – gram.

SENML_UNIT_SECOND: str#

"s" – sekund.

SENML_UNIT_AMPERE: str#

"A" – ampere.

SENML_UNIT_KELVIN: str#

"K" – kelvin.

SENML_UNIT_CANDELA: str#

"cd" – candela.

SENML_UNIT_MOLE: str#

"mol" – mol.

SENML_UNIT_HERTZ: str#

"Hz" – hertz.

SENML_UNIT_RADIAN: str#

"rad" – radian.

SENML_UNIT_STERADIAN: str#

"sr" – steradian.

SENML_UNIT_NEWTON: str#

"N" – newton.

SENML_UNIT_PASCAL: str#

"Pa" – pascal.

SENML_UNIT_JOULE: str#

"J" – joule.

SENML_UNIT_WATT: str#

"W" – watt.

SENML_UNIT_COULOMB: str#

"C" – coulomb.

SENML_UNIT_VOLT: str#

"V" – volt.

SENML_UNIT_FARAD: str#

"F" – farad.

SENML_UNIT_OHM: str#

"Ohm" – ohm.

SENML_UNIT_SIEMENS: str#

"S" – siemens.

SENML_UNIT_WEBER: str#

"Wb" – weber.

SENML_UNIT_TESLA: str#

"T" – tesla.

SENML_UNIT_HENRY: str#

"H" – henry.

SENML_UNIT_DEGREES_CELSIUS: str#

"Cel" – grader Celsius.

SENML_UNIT_LUMEN: str#

"lm" – lumen.

SENML_UNIT_LUX: str#

"lx" – lux.

SENML_UNIT_BECQUEREL: str#

"Bq" – becquerel.

SENML_UNIT_GRAY: str#

"Gy" – gray.

SENML_UNIT_SIEVERT: str#

"Sv" – sievert.

SENML_UNIT_KATAL: str#

"kat" – katal.

SENML_UNIT_SQUARE_METER: str#

"m2" – kvadratmeter.

SENML_UNIT_CUBIC_METER: str#

"m3" – kubikmeter.

SENML_UNIT_LITER: str#

"l" – liter.

SENML_UNIT_VELOCITY: str#

"m/s" – hastighet.

SENML_UNIT_ACCELERATION: str#

"m/s2" – acceleration.

SENML_UNIT_CUBIC_METER_PER_SECOND: str#

"m3/s" – volymetriskt flöde.

SENML_UNIT_LITER_PER_SECOND: str#

"l/s" – liter per sekund.

SENML_UNIT_WATT_PER_SQUARE_METER: str#

"W/m2" – irradians.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str#

"cd/m2" – luminans.

SENML_UNIT_BIT: str#

"bit" – bit.

SENML_UNIT_BIT_PER_SECOND: str#

"bit/s" – bit per sekund.

SENML_UNIT_DEGREES_LATITUDE: str#

"lat" – grader latitud.

SENML_UNIT_DEGREES_LONGITUDE: str#

"lon" – grader longitud.

SENML_UNIT_PH: str#

"pH" – surhet (pH).

SENML_UNIT_DECIBEL: str#

"db" – decibel.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str#

"dBW" – decibel relativt 1 W.

SENML_UNIT_BEL: str#

"Bspl" – bel (ljudtrycksnivå).

SENML_UNIT_COUNTER: str#

"count" – räknare.

SENML_UNIT_RATIO: str#

"//" – förhållande (dimensionslöst).

SENML_UNIT_RELATIVE_HUMIDITY: str#

"%RH" – relativ luftfuktighet.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str#

"%EL" – återstående batterinivå i procent.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str#

"EL" – återstående batterinivå i sekunder.

SENML_UNIT_EVENT_RATE_PER_SECOND: str#

"1/s" – händelsefrekvens per sekund.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str#

"1/min" – händelsefrekvens per minut.

SENML_UNIT_BPM: str#

"beat/min" – slag per minut.

SENML_UNIT_BEATS: str#

"beats" – slag.

SENML_UNIT_SIEMENS_PER_METER: str#

"S/m" – siemens per meter (elektrisk konduktivitet).