senml — Sensor Markup Language¶
Deze module implementeert een kleine encoder/decoder voor de Sensor Markup Language (SenML, RFC 8428). SenML is een mediatype voor sensormetingen en apparaatparameters: elke “pack” is een lijst van “records”, waarbij elk record een naam, eenheid, waarde, tijdstempel en optionele som bevat.
De implementatie ondersteunt zowel de JSON- als de CBOR-representatie en staat toe dat packs genest worden, zodat een enkel root-pack een gateway kan beschrijven die meerdere apparaten ontsluit. Inkomende payloads kunnen actuator-callbacks op bestaande records aansturen.
Voorbeeldgebruik:
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)¶
Vertegenwoordigt een SenML-pack – een verzameling van
SenmlRecord-instanties en optioneel andere onderliggendeSenmlPack-objecten. Wanneer een pack alleen records bevat, vertegenwoordigt het een enkel apparaat; wanneer het andere packs bevat, fungeert het als een gateway.name is de SenML-basisnaam (
bn) die voor elk record in dit pack wordt gebruikt.callback wordt aangeroepen vanuit
from_json/from_cbortelkens wanneer een inkomend record een eerder onbekende sensor benoemt; het nieuweSenmlRecordwordt als eerste argument doorgegeven en (voor geneste packs) wordt het oorspronkelijke apparaat-pack doorgegeven alsdevice=.... Het wordt doorgaans gebruikt om actuatorcommando’s af te handelen.SenmlPack-instanties zijn itereerbaar – iteratie levert elk record op in invoegvolgorde – en kunnen worden gebruikt als een context manager zodat het pack zichzelf bij het afsluiten uit zijn ouder verwijdert.- base_value: int | float | None¶
Optionele basiswaarde (
bv) die bij het coderen wordt toegevoegd aan de numerieke waarde van elk record en bij het decoderen wordt afgetrokken. Het instellen van een niet-numerieke waarde veroorzaaktException.
- base_time: int | float | None¶
Optionele basistijd (
bt) die wordt toegevoegd aan de tijdstempel van elk record.
- base_sum: int | float | None¶
Optionele basissom (
bs) die wordt toegevoegd aan het som-veld van elk record.
- base_unit: str | None¶
Optionele basiseenheid (
bu) – doorgaans een waarde uitSenmlUnits.
- actuate¶
De callback die bij de constructie is opgegeven. Kan tijdens runtime opnieuw worden toegewezen.
- add(item: SenmlRecord | SenmlPack) None¶
Voeg item toe aan dit pack. item moet een
SenmlRecordof een anderSenmlPackzijn en mag nog niet tot een andere ouder behoren; anders wordtExceptionveroorzaakt.
- remove(item: SenmlRecord | SenmlPack) None¶
Verwijder item uit dit pack.
Exceptionwordt veroorzaakt als item geen kind van dit pack is.
- from_json(data: str) None¶
Parseer een SenML/JSON-document en voeg de records samen in dit pack. Records die al bestaan (gematcht op naam) activeren
SenmlRecord.do_actuate(); nieuwe records worden toegevoegd en de callback op pack-niveau wordt aangeroepen.
- from_cbor(data: bytes) None¶
Parseer een SenML/CBOR-bytestring en voeg de records samen in dit pack.
- do_actuate(raw: dict, naming_map: dict, device: SenmlPack | None = None) None¶
Interne helper die wordt aangeroepen tijdens het parseren van inkomende data wanneer geen bestaand record overeenkomt met een vermelding. Voegt een nieuw
SenmlRecordtoe aandevice(of aan dit pack) en stuurt het door naar de callback.
- class senml.SenmlRecord(name: str, **kwargs)¶
Vertegenwoordigt een enkele meting binnen een
SenmlPack.name is de SenML-recordnaam (
n).De volgende keyword-argumenten worden geaccepteerd:
value –
bool,int,float,strofbytearray. Andere typen veroorzakenException.time – numerieke tijdstempel (
t).unit – een eenheidsstring, doorgaans een lid van
SenmlUnits.sum – numerieke geïntegreerde som (
s).update_time – maximale tijd voordat de sensor een nieuwe meting levert (
ut).callback – functie die wordt aangeroepen wanneer een inkomende payload dit record bijwerkt. Het ontvangt het
SenmlRecordals enige argument.
SenmlRecordkan worden gebruikt als een context manager zodat het zichzelf bij het afsluiten uit zijn ouder-pack verwijdert.- value¶
De huidige waarde. Bij hertoewijzing wordt het type gecontroleerd; alleen
bool, getallen,strenbytearrayworden geaccepteerd. Om de gerenderde precisie van een float-waarde te bepalen, rond je af vóór de toewijzing, bijvoorbeeldrecord.value = round(x, 2).
- update_time: int | float | None¶
Maximale tijd voordat de sensor een bijgewerkte meting levert (
ut).
- actuate¶
De callback die bij de constructie is opgegeven. Kan tijdens runtime opnieuw worden toegewezen.
- class senml.SenmlBase¶
Gemeenschappelijke basisklasse die gedeeld wordt door
SenmlPackenSenmlRecord. Het stelt geen eigen publieke API beschikbaar; het bestaat zodatSenmlPack.add()kan valideren dat een item tot de SenML-hiërarchie behoort.
- class senml.SenmlUnits¶
Namespace-klasse waarvan de klasse-attributen de SenML-eenheidssymbolen zijn die zijn gedefinieerd door RFC 8428. Elk attribuut resolveert naar de stringcode van de eenheid, geschikt voor toewijzing aan
SenmlRecord.unitofSenmlPack.base_unit.