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 obiecteSenmlPackcopil. 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_cborori de câte ori o înregistrare primită numește un senzor necunoscut anterior; noulSenmlRecordeste transmis ca prim argument, iar (pentru pachetele imbricate) pachetul dispozitivului de origine este transmis cadevice=.... De obicei este folosit pentru a gestiona comenzile către actuatori.Instanțele
SenmlPacksunt 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.- 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 dinSenmlUnits.
- 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
SenmlRecordsau un altSenmlPackș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.
Exceptioneste 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ă.
- from_cbor(data: bytes) None¶
Analizează un șir de octeți SenML/CBOR și îmbină înregistrările în acest pachet.
- 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
SenmlRecordladevice(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:
value –
bool,int,float,strsaubytearray. 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
SenmlRecordca unic argument.
SenmlRecordpoate fi folosit ca manager de context, astfel încât la ieșire se elimină singur din pachetul său părinte.- value¶
Valoarea curentă. Reatribuirea verifică tipul; sunt acceptate doar
bool, numere,strșibytearray. Pentru a controla precizia redată a unei valori float, rotunjiți înainte de atribuire, de ex.record.value = round(x, 2).
- update_time: int | float | None¶
Timpul maxim înainte ca senzorul să furnizeze o citire actualizată (
ut).
- actuate¶
Funcția de retroapelare (callback) furnizată la momentul construcției. Poate fi reatribuită în timpul execuției.
- class senml.SenmlBase¶
Clasă de bază comună partajată de
SenmlPackșiSenmlRecord. Nu expune niciun API public propriu; există pentru caSenmlPack.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.unitsauSenmlPack.base_unit.