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
SenmlRecorded eventualmente altri oggettiSenmlPackfigli. 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_cborogni volta che un record in ingresso nomina un sensore precedentemente sconosciuto; il nuovoSenmlRecordviene passato come primo argomento e (per i pack annidati) il pack del dispositivo di origine viene passato comedevice=.... Viene tipicamente usata per gestire i comandi degli attuatori.Le istanze
SenmlPacksono 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.- 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 sollevaException.
- base_unit: str | None¶
Unità base opzionale (
bu) – tipicamente un valore diSenmlUnits.
- 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
SenmlRecordo un altroSenmlPacke non deve già appartenere a un genitore diverso; in caso contrario viene sollevataException.
- remove(item: SenmlRecord | SenmlPack) None¶
Rimuove item da questo pack. Viene sollevata
Exceptionse 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.
- 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:
value –
bool,int,float,strobytearray. Altri tipi sollevanoException.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
SenmlRecordcome unico argomento.
SenmlRecordpuò essere usato come context manager in modo che all’uscita si rimuova dal pack genitore.- value¶
Il valore corrente. La riassegnazione verifica il tipo; sono accettati solo
bool, numeri,strebytearray. Per controllare la precisione del rendering di un valore float, arrotondalo prima dell’assegnazione, ad esempiorecord.value = round(x, 2).
- update_time: int | float | None¶
Tempo massimo prima che il sensore fornisca una lettura aggiornata (
ut).
- actuate¶
La callback fornita al momento della costruzione. Può essere riassegnata a runtime.
- class senml.SenmlBase¶
Classe base comune condivisa da
SenmlPackeSenmlRecord. 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.unitoSenmlPack.base_unit.