senml — Sensor Markup Language#

Acest modul implementează un mic encoder/decoder pentru Sensor Markup Language (SenML, RFC 8428). SenML este un tip media pentru măsurători de la senzori și parametri ai dispozitivelor: fiecare „pack” este o listă de „records”, unde fiecare înregistrare conține un nume, o unitate, o valoare, un marcaj temporal și o sumă opțională.

Implementarea acceptă atât reprezentarea JSON, cât și CBOR și permite ca pachetele să fie imbricate, astfel încât un singur pachet rădăcină să poată descrie un gateway care deservește mai multe dispozitive. Sarcinile utile primite pot declanșa funcții de retroapelare (callback) pentru actuatori pe înregistrările existente.

Exemplu de utilizare:

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())

Clase#

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

Reprezintă un pachet SenML – o colecție de instanțe SenmlRecord și, opțional, alte obiecte SenmlPack copil. Atunci când un pachet conține doar înregistrări, reprezintă un singur dispozitiv; atunci când conține alte pachete, acționează ca un gateway.

name este numele de bază SenML (bn) folosit pentru fiecare înregistrare conținută în acest pachet.

callback este apelat din from_json / from_cbor ori de câte ori o înregistrare primită numește un senzor necunoscut anterior; noul SenmlRecord este transmis ca prim argument, iar (pentru pachetele imbricate) pachetul dispozitivului de origine este transmis ca device=.... De obicei este folosit pentru a gestiona comenzile către actuatori.

Instanțele SenmlPack sunt iterabile – iterarea returnează fiecare înregistrare în ordinea inserării – și pot fi folosite ca manager de context, astfel încât la ieșire pachetul se elimină singur din părintele său.

name: str#

Numele de bază al pachetului (bn).

base_value: int | float | None#

Valoarea de bază opțională (bv) adăugată la valoarea numerică a fiecărei înregistrări la codificare și scăzută la decodificare. Setarea unei valori nenumerice generează Exception.

base_time: int | float | None#

Timpul de bază opțional (bt) adăugat la marcajul temporal al fiecărei înregistrări.

base_sum: int | float | None#

Suma de bază opțională (bs) adăugată la câmpul sumă al fiecărei înregistrări.

base_unit: str | None#

Unitatea de bază opțională (bu) – de obicei o valoare din SenmlUnits.

actuate#

Funcția de retroapelare (callback) furnizată la momentul construcției. Poate fi reatribuită în timpul execuției.

add(item: SenmlRecord | SenmlPack) None#

Adaugă item la acest pachet. item trebuie să fie un SenmlRecord sau un alt SenmlPack și nu trebuie să aparțină deja unui alt părinte; în caz contrar se generează Exception.

remove(item: SenmlRecord | SenmlPack) None#

Elimină item din acest pachet. Exception este generat dacă item nu este copil al acestui pachet.

clear() None#

Elimină fiecare înregistrare/sub-pachet din acest pachet și le detașează de referința lor către părinte.

from_json(data: str) None#

Analizează un document SenML/JSON și îmbină înregistrările în acest pachet. Înregistrările care există deja (potrivite după nume) declanșează SenmlRecord.do_actuate(); înregistrările noi sunt adăugate, iar funcția callback la nivel de pachet este apelată.

to_json() str#

Redă pachetul și copiii săi într-un șir SenML/JSON.

from_cbor(data: bytes) None#

Analizează un șir de octeți SenML/CBOR și îmbină înregistrările în acest pachet.

to_cbor() bytes#

Redă pachetul și copiii săi într-un șir de octeți SenML/CBOR.

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

Funcție ajutătoare internă apelată în timpul analizării datelor primite atunci când nicio înregistrare existentă nu se potrivește cu o intrare. Adaugă un nou SenmlRecord la device (sau la acest pachet) și îl transmite mai departe către callback.

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

Reprezintă o singură măsurătoare în interiorul unui SenmlPack.

name este numele înregistrării SenML (n).

Sunt acceptate următoarele argumente cheie:

  • valuebool, int, float, str sau bytearray. Alte tipuri generează Exception.

  • time – marcaj temporal numeric (t).

  • unit – un șir de unitate, de obicei un membru al SenmlUnits.

  • sum – sumă integrată numerică (s).

  • update_time – timpul maxim înainte ca senzorul să furnizeze o citire nouă (ut).

  • callback – funcție apelată atunci când o sarcină utilă primită actualizează această înregistrare. Primește SenmlRecord ca unic argument.

SenmlRecord poate fi folosit ca manager de context, astfel încât la ieșire se elimină singur din pachetul său părinte.

name: str#

Numele înregistrării (n).

value#

Valoarea curentă. Reatribuirea verifică tipul; sunt acceptate doar bool, numere, str și bytearray. Pentru a controla precizia redată a unei valori float, rotunjiți înainte de atribuire, de ex. record.value = round(x, 2).

unit: str | None#

Șirul de unitate (u).

time: int | float | None#

Marcajul temporal asociat cu această măsurătoare (t).

update_time: int | float | None#

Timpul maxim înainte ca senzorul să furnizeze o citire actualizată (ut).

sum: int | float | None#

Câmpul sumă integrată (s).

actuate#

Funcția de retroapelare (callback) furnizată la momentul construcției. Poate fi reatribuită în timpul execuției.

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

Actualizează această înregistrare dintr-un dicționar SenML brut primit și, dacă este prezent, apelează funcția de retroapelare pentru actuator.

class senml.SenmlBase#

Clasă de bază comună partajată de SenmlPack și SenmlRecord. Nu expune niciun API public propriu; există pentru ca SenmlPack.add() să poată valida faptul că un element aparține ierarhiei SenML.

class senml.SenmlUnits#

Clasă spațiu de nume ale cărei atribute de clasă sunt simbolurile de unitate SenML definite de RFC 8428. Fiecare atribut se rezolvă la codul de tip șir al unității, potrivit pentru atribuire la SenmlRecord.unit sau SenmlPack.base_unit.

SENML_UNIT_METER: str#

"m" – metru.

SENML_UNIT_KILOGRAM: str#

"kg" – kilogram.

SENML_UNIT_GRAM: str#

"g" – gram.

SENML_UNIT_SECOND: str#

"s" – secundă.

SENML_UNIT_AMPERE: str#

"A" – amper.

SENML_UNIT_KELVIN: str#

"K" – kelvin.

SENML_UNIT_CANDELA: str#

"cd" – candelă.

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" – grade 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" – metru pătrat.

SENML_UNIT_CUBIC_METER: str#

"m3" – metru cub.

SENML_UNIT_LITER: str#

"l" – litru.

SENML_UNIT_VELOCITY: str#

"m/s" – viteză.

SENML_UNIT_ACCELERATION: str#

"m/s2" – accelerație.

SENML_UNIT_CUBIC_METER_PER_SECOND: str#

"m3/s" – debit volumetric.

SENML_UNIT_LITER_PER_SECOND: str#

"l/s" – litru pe secundă.

SENML_UNIT_WATT_PER_SQUARE_METER: str#

"W/m2" – iradianță.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str#

"cd/m2" – luminanță.

SENML_UNIT_BIT: str#

"bit" – bit.

SENML_UNIT_BIT_PER_SECOND: str#

"bit/s" – bit pe secundă.

SENML_UNIT_DEGREES_LATITUDE: str#

"lat" – grade de latitudine.

SENML_UNIT_DEGREES_LONGITUDE: str#

"lon" – grade de longitudine.

SENML_UNIT_PH: str#

"pH" – aciditate (pH).

SENML_UNIT_DECIBEL: str#

"db" – decibel.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str#

"dBW" – decibel raportat la 1 W.

SENML_UNIT_BEL: str#

"Bspl" – bel (nivel de presiune acustică).

SENML_UNIT_COUNTER: str#

"count" – contor.

SENML_UNIT_RATIO: str#

"//" – raport (adimensional).

SENML_UNIT_RELATIVE_HUMIDITY: str#

"%RH" – umiditate relativă.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str#

"%EL" – nivel rămas al bateriei ca procent.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str#

"EL" – nivel rămas al bateriei în secunde.

SENML_UNIT_EVENT_RATE_PER_SECOND: str#

"1/s" – rată de evenimente pe secundă.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str#

"1/min" – rată de evenimente pe minut.

SENML_UNIT_BPM: str#

"beat/min" – bătăi pe minut.

SENML_UNIT_BEATS: str#

"beats" – bătăi.

SENML_UNIT_SIEMENS_PER_METER: str#

"S/m" – siemens pe metru (conductivitate electrică).