senml — Sensor Markup Language

Questo modulo implementa un piccolo encoder/decoder per il Sensor Markup Language (SenML, RFC 8428). SenML è un tipo di media per le misurazioni dei sensori e i parametri dei dispositivi: ogni «pack» è un elenco di «record», dove ogni record contiene un nome, un’unità, un valore, un timestamp e una somma opzionale.

L’implementazione supporta sia la rappresentazione JSON che quella CBOR e consente di annidare i pack in modo che un singolo pack radice possa descrivere un gateway che fa da front-end a più dispositivi. I payload in ingresso possono attivare callback degli attuatori sui record esistenti.

Esempio di utilizzo:

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

Classi

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

Rappresenta un pack SenML, ovvero una raccolta di istanze SenmlRecord ed eventualmente altri oggetti SenmlPack figli. Quando un pack contiene solo record, rappresenta un singolo dispositivo; quando contiene altri pack, funge da gateway.

name è il nome base SenML (bn) usato per ogni record contenuto in questo pack.

callback viene invocata da from_json / from_cbor ogni volta che un record in ingresso nomina un sensore precedentemente sconosciuto; il nuovo SenmlRecord viene passato come primo argomento e (per i pack annidati) il pack del dispositivo di origine viene passato come device=.... Viene tipicamente usata per gestire i comandi degli attuatori.

Le istanze SenmlPack sono iterabili – l’iterazione restituisce ogni record nell’ordine di inserimento – e possono essere usate come context manager in modo che all’uscita il pack si rimuova dal proprio genitore.

name: str

Il nome base del pack (bn).

base_value: int | float | None

Valore base opzionale (bv) aggiunto al valore numerico di ogni record durante la codifica e sottratto durante la decodifica. L’impostazione di un valore non numerico solleva Exception.

base_time: int | float | None

Tempo base opzionale (bt) aggiunto al timestamp di ogni record.

base_sum: int | float | None

Somma base opzionale (bs) aggiunta al campo somma di ogni record.

base_unit: str | None

Unità base opzionale (bu) – tipicamente un valore di SenmlUnits.

actuate

La callback fornita al momento della costruzione. Può essere riassegnata a runtime.

add(item: SenmlRecord | SenmlPack) None

Aggiunge item a questo pack. item deve essere un SenmlRecord o un altro SenmlPack e non deve già appartenere a un genitore diverso; in caso contrario viene sollevata Exception.

remove(item: SenmlRecord | SenmlPack) None

Rimuove item da questo pack. Viene sollevata Exception se item non è un figlio di questo pack.

clear() None

Rimuove ogni record/sub-pack da questo pack e li scollega dal loro riferimento al genitore.

from_json(data: str) None

Analizza un documento SenML/JSON e unisce i record in questo pack. I record che esistono già (corrispondenti per nome) attivano SenmlRecord.do_actuate(); i nuovi record vengono aggiunti e viene invocata la callback a livello di pack.

to_json() str

Esegue il rendering del pack e dei suoi figli in una stringa SenML/JSON.

from_cbor(data: bytes) None

Analizza una stringa di byte SenML/CBOR e unisce i record in questo pack.

to_cbor() bytes

Esegue il rendering del pack e dei suoi figli in una stringa di byte SenML/CBOR.

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

Helper interno invocato durante l’analisi dei dati in ingresso quando nessun record esistente corrisponde a una voce. Aggiunge un nuovo SenmlRecord a device (o a questo pack) e lo inoltra alla callback.

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

Rappresenta una singola misurazione all’interno di un SenmlPack.

name è il nome del record SenML (n).

Sono accettati i seguenti argomenti keyword:

  • valuebool, int, float, str o bytearray. Altri tipi sollevano Exception.

  • time – timestamp numerico (t).

  • unit – una stringa di unità, tipicamente un membro di SenmlUnits.

  • sum – somma integrata numerica (s).

  • update_time – tempo massimo prima che il sensore fornisca una nuova lettura (ut).

  • callback – funzione invocata quando un payload in ingresso aggiorna questo record. Riceve il SenmlRecord come unico argomento.

SenmlRecord può essere usato come context manager in modo che all’uscita si rimuova dal pack genitore.

name: str

Nome del record (n).

value

Il valore corrente. La riassegnazione verifica il tipo; sono accettati solo bool, numeri, str e bytearray. Per controllare la precisione del rendering di un valore float, arrotondalo prima dell’assegnazione, ad esempio record.value = round(x, 2).

unit: str | None

Stringa di unità (u).

time: int | float | None

Timestamp associato a questa misurazione (t).

update_time: int | float | None

Tempo massimo prima che il sensore fornisca una lettura aggiornata (ut).

sum: int | float | None

Campo somma integrata (s).

actuate

La callback fornita al momento della costruzione. Può essere riassegnata a runtime.

do_actuate(raw: dict, naming_map: dict) None

Aggiorna questo record da un dizionario SenML grezzo in ingresso e, se presente, invoca la callback di attuazione.

class senml.SenmlBase

Classe base comune condivisa da SenmlPack e SenmlRecord. Non espone alcuna API pubblica propria; esiste affinché SenmlPack.add() possa verificare che un elemento appartenga alla gerarchia SenML.

class senml.SenmlUnits

Classe namespace i cui attributi di classe sono i simboli delle unità SenML definiti da RFC 8428. Ogni attributo si risolve nel codice stringa dell’unità, adatto all’assegnazione a SenmlRecord.unit o SenmlPack.base_unit.

SENML_UNIT_METER: str

"m" – metro.

SENML_UNIT_KILOGRAM: str

"kg" – chilogrammo.

SENML_UNIT_GRAM: str

"g" – grammo.

SENML_UNIT_SECOND: str

"s" – secondo.

SENML_UNIT_AMPERE: str

"A" – ampere.

SENML_UNIT_KELVIN: str

"K" – kelvin.

SENML_UNIT_CANDELA: str

"cd" – candela.

SENML_UNIT_MOLE: str

"mol" – mole.

SENML_UNIT_HERTZ: str

"Hz" – hertz.

SENML_UNIT_RADIAN: str

"rad" – radiante.

SENML_UNIT_STERADIAN: str

"sr" – steradiante.

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" – gradi 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" – metro quadrato.

SENML_UNIT_CUBIC_METER: str

"m3" – metro cubo.

SENML_UNIT_LITER: str

"l" – litro.

SENML_UNIT_VELOCITY: str

"m/s" – velocità.

SENML_UNIT_ACCELERATION: str

"m/s2" – accelerazione.

SENML_UNIT_CUBIC_METER_PER_SECOND: str

"m3/s" – portata volumetrica.

SENML_UNIT_LITER_PER_SECOND: str

"l/s" – litri al secondo.

SENML_UNIT_WATT_PER_SQUARE_METER: str

"W/m2" – irradianza.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str

"cd/m2" – luminanza.

SENML_UNIT_BIT: str

"bit" – bit.

SENML_UNIT_BIT_PER_SECOND: str

"bit/s" – bit al secondo.

SENML_UNIT_DEGREES_LATITUDE: str

"lat" – gradi di latitudine.

SENML_UNIT_DEGREES_LONGITUDE: str

"lon" – gradi di longitudine.

SENML_UNIT_PH: str

"pH" – acidità (pH).

SENML_UNIT_DECIBEL: str

"db" – decibel.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str

"dBW" – decibel rispetto a 1 W.

SENML_UNIT_BEL: str

"Bspl" – bel (livello di pressione sonora).

SENML_UNIT_COUNTER: str

"count" – contatore.

SENML_UNIT_RATIO: str

"//" – rapporto (adimensionale).

SENML_UNIT_RELATIVE_HUMIDITY: str

"%RH" – umidità relativa.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str

"%EL" – livello residuo della batteria in percentuale.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str

"EL" – livello residuo della batteria in secondi.

SENML_UNIT_EVENT_RATE_PER_SECOND: str

"1/s" – frequenza degli eventi al secondo.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str

"1/min" – frequenza degli eventi al minuto.

SENML_UNIT_BPM: str

"beat/min" – battiti al minuto.

SENML_UNIT_BEATS: str

"beats" – battiti.

SENML_UNIT_SIEMENS_PER_METER: str

"S/m" – siemens al metro (conducibilità elettrica).