senml — Sensor Markup Language¶
Dieses Modul implementiert einen kleinen Encoder/Decoder für die Sensor Markup Language (SenML, RFC 8428). SenML ist ein Medientyp für Sensormessungen und Geräteparameter: Jedes „Pack“ ist eine Liste von „Records“, wobei jeder Record einen Namen, eine Einheit, einen Wert, einen Zeitstempel und optional eine Summe trägt.
Die Implementierung unterstützt sowohl die JSON- als auch die CBOR-Darstellung und erlaubt das Verschachteln von Packs, sodass ein einzelnes Root-Pack ein Gateway beschreiben kann, das mehreren Geräten vorgeschaltet ist. Eingehende Payloads können Aktuator-Callbacks auf bestehenden Records auslösen.
Beispielverwendung:
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())
Klassen¶
- class senml.SenmlPack(name: str, callback=None)¶
Repräsentiert ein SenML-Pack – eine Sammlung von
SenmlRecord-Instanzen und optional weiteren untergeordnetenSenmlPack-Objekten. Wenn ein Pack nur Records enthält, repräsentiert es ein einzelnes Gerät; wenn es weitere Packs enthält, fungiert es als Gateway.name ist der SenML-Basisname (
bn), der für jeden in diesem Pack enthaltenen Record verwendet wird.callback wird von
from_json/from_cboraufgerufen, sobald ein eingehender Record einen zuvor unbekannten Sensor benennt; der neueSenmlRecordwird als erstes Argument übergeben und (bei verschachtelten Packs) das ursprüngliche Geräte-Pack alsdevice=.... Es wird typischerweise zur Verarbeitung von Aktuator-Befehlen verwendet.SenmlPack-Instanzen sind iterierbar – die Iteration liefert jeden Record in Einfügereihenfolge – und können als Kontextmanager verwendet werden, sodass sich das Pack beim Verlassen selbst aus seinem übergeordneten Element entfernt.- base_value: int | float | None¶
Optionaler Basiswert (
bv), der beim Kodieren zum numerischen Wert jedes Records addiert und beim Dekodieren subtrahiert wird. Das Setzen eines nicht-numerischen Werts löstExceptionaus.
- base_time: int | float | None¶
Optionale Basiszeit (
bt), die zum Zeitstempel jedes Records addiert wird.
- base_sum: int | float | None¶
Optionale Basissumme (
bs), die zum Summenfeld jedes Records addiert wird.
- base_unit: str | None¶
Optionale Basiseinheit (
bu) – typischerweise ein Wert ausSenmlUnits.
- actuate¶
Der zum Konstruktionszeitpunkt angegebene Callback. Kann zur Laufzeit neu zugewiesen werden.
- add(item: SenmlRecord | SenmlPack) None¶
Fügt item zu diesem Pack hinzu. item muss ein
SenmlRecordoder ein weiteresSenmlPacksein und darf nicht bereits zu einem anderen übergeordneten Element gehören; andernfalls wirdExceptionausgelöst.
- remove(item: SenmlRecord | SenmlPack) None¶
Entfernt item aus diesem Pack.
Exceptionwird ausgelöst, wenn item kein untergeordnetes Element dieses Packs ist.
- clear() None¶
Entfernt jeden Record/jedes Sub-Pack aus diesem Pack und löst deren Referenz auf das übergeordnete Element auf.
- from_json(data: str) None¶
Parst ein SenML/JSON-Dokument und führt die Records in dieses Pack zusammen. Records, die bereits existieren (über den Namen abgeglichen), lösen
SenmlRecord.do_actuate()aus; neue Records werden angehängt und der Pack-weite callback wird aufgerufen.
- from_cbor(data: bytes) None¶
Parst eine SenML/CBOR-Bytefolge und führt die Records in dieses Pack zusammen.
- do_actuate(raw: dict, naming_map: dict, device: SenmlPack | None = None) None¶
Interner Helfer, der beim Parsen eingehender Daten aufgerufen wird, wenn kein vorhandener Record zu einem Eintrag passt. Fügt einen neuen
SenmlRecordzudevice(oder zu diesem Pack) hinzu und leitet ihn an den callback weiter.
- class senml.SenmlRecord(name: str, **kwargs)¶
Repräsentiert eine einzelne Messung innerhalb eines
SenmlPack.name ist der SenML-Record-Name (
n).Die folgenden Schlüsselwortargumente werden akzeptiert:
value –
bool,int,float,stroderbytearray. Andere Typen lösenExceptionaus.time – numerischer Zeitstempel (
t).unit – ein Einheiten-String, typischerweise ein Element von
SenmlUnits.sum – numerische integrierte Summe (
s).update_time – maximale Zeit, bevor der Sensor eine neue Messung liefert (
ut).callback – Funktion, die aufgerufen wird, wenn eine eingehende Payload diesen Record aktualisiert. Sie erhält den
SenmlRecordals einziges Argument.
SenmlRecordkann als Kontextmanager verwendet werden, sodass er sich beim Verlassen selbst aus seinem übergeordneten Pack entfernt.- value¶
Der aktuelle Wert. Bei einer Neuzuweisung wird der Typ geprüft; nur
bool, Zahlen,strundbytearraywerden akzeptiert. Um die gerenderte Genauigkeit eines Float-Werts zu steuern, runden Sie vor der Zuweisung, z. B.record.value = round(x, 2).
- update_time: int | float | None¶
Maximale Zeit, bevor der Sensor eine aktualisierte Messung liefert (
ut).
- actuate¶
Der zum Konstruktionszeitpunkt angegebene Callback. Kann zur Laufzeit neu zugewiesen werden.
- class senml.SenmlBase¶
Gemeinsame Basisklasse, die von
SenmlPackundSenmlRecordgenutzt wird. Sie stellt keine eigene öffentliche API bereit; sie existiert, damitSenmlPack.add()validieren kann, dass ein Element zur SenML-Hierarchie gehört.
- class senml.SenmlUnits¶
Namespace-Klasse, deren Klassenattribute die durch RFC 8428 definierten SenML-Einheitensymbole sind. Jedes Attribut wird zum String-Code der Einheit aufgelöst, geeignet zur Zuweisung an
SenmlRecord.unitoderSenmlPack.base_unit.