senml — Sensor Markup Language#

Tento modul implementuje malý kodér/dekodér pro jazyk Sensor Markup Language (SenML, RFC 8428). SenML je mediální typ pro měření ze senzorů a parametry zařízení: každý „pack“ je seznam „records“ (záznamů), kde každý záznam nese název, jednotku, hodnotu, časové razítko a volitelný součet.

Implementace podporuje reprezentaci jak v JSON, tak v CBOR a umožňuje vnořování packů, takže jediný kořenový pack může popisovat bránu zaštiťující více zařízení. Příchozí payloady mohou spouštět callbacky aktuátorů u existujících záznamů.

Příklad použití:

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

Třídy#

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

Reprezentuje SenML pack – kolekci instancí SenmlRecord a volitelně dalších podřízených objektů SenmlPack. Když pack obsahuje pouze záznamy, reprezentuje jediné zařízení; když obsahuje další packy, funguje jako brána.

name je základní název SenML (bn) použitý pro každý záznam obsažený v tomto packu.

callback je voláno z from_json / from_cbor, kdykoli příchozí záznam pojmenuje dříve neznámý senzor; nový SenmlRecord je předán jako první argument a (u vnořených packů) je původní pack zařízení předán jako device=.... Typicky se používá ke zpracování příkazů aktuátorů.

Instance SenmlPack jsou iterovatelné – iterace vrací jednotlivé záznamy v pořadí vložení – a mohou být použity jako kontextový manažer, takže při ukončení se pack sám odebere ze svého rodiče.

name: str#

Základní název packu (bn).

base_value: int | float | None#

Volitelná základní hodnota (bv) přičtená k numerické hodnotě každého záznamu při kódování a odečtená při dekódování. Nastavení nenumerické hodnoty vyvolá Exception.

base_time: int | float | None#

Volitelný základní čas (bt) přičtený k časovému razítku každého záznamu.

base_sum: int | float | None#

Volitelný základní součet (bs) přičtený k poli součtu každého záznamu.

base_unit: str | None#

Volitelná základní jednotka (bu) – typicky hodnota z SenmlUnits.

actuate#

Callback dodaný při konstrukci. Lze ho znovu přiřadit za běhu.

add(item: SenmlRecord | SenmlPack) None#

Připojí item k tomuto packu. item musí být SenmlRecord nebo jiný SenmlPack a nesmí již patřit jinému rodiči; jinak je vyvolána Exception.

remove(item: SenmlRecord | SenmlPack) None#

Odebere item z tohoto packu. Exception je vyvolána, pokud item není potomkem tohoto packu.

clear() None#

Odebere každý záznam/podřízený pack z tohoto packu a odpojí je od jejich referenci na rodiče.

from_json(data: str) None#

Naparsuje dokument SenML/JSON a sloučí záznamy do tohoto packu. Záznamy, které již existují (porovnané podle názvu), spustí SenmlRecord.do_actuate(); nové záznamy jsou připojeny a je vyvoláno callback na úrovni packu.

to_json() str#

Vykreslí pack a jeho potomky do řetězce SenML/JSON.

from_cbor(data: bytes) None#

Naparsuje bajtový řetězec SenML/CBOR a sloučí záznamy do tohoto packu.

to_cbor() bytes#

Vykreslí pack a jeho potomky do bajtového řetězce SenML/CBOR.

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

Interní pomocná funkce volaná během parsování příchozích dat, když žádný existující záznam neodpovídá položce. Přidá nový SenmlRecord do device (nebo do tohoto packu) a předá ho dál callbacku.

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

Reprezentuje jediné měření uvnitř SenmlPack.

name je název SenML záznamu (n).

Přijímány jsou následující klíčové argumenty:

  • valuebool, int, float, str nebo bytearray. Ostatní typy vyvolají Exception.

  • time – numerické časové razítko (t).

  • unit – řetězec jednotky, typicky člen SenmlUnits.

  • sum – numerický integrovaný součet (s).

  • update_time – maximální čas, než senzor poskytne čerstvé čtení (ut).

  • callback – funkce volaná, když příchozí payload aktualizuje tento záznam. Přijímá SenmlRecord jako svůj jediný argument.

SenmlRecord lze použít jako kontextový manažer, takže při ukončení se sám odebere ze svého rodičovského packu.

name: str#

Název záznamu (n).

value#

Aktuální hodnota. Při novém přiřazení se kontroluje typ; přijímány jsou pouze bool, čísla, str a bytearray. Pro řízení vykreslované přesnosti hodnoty typu float zaokrouhlete před přiřazením, např. record.value = round(x, 2).

unit: str | None#

Řetězec jednotky (u).

time: int | float | None#

Časové razítko spojené s tímto měřením (t).

update_time: int | float | None#

Maximální čas, než senzor poskytne aktualizované čtení (ut).

sum: int | float | None#

Pole integrovaného součtu (s).

actuate#

Callback dodaný při konstrukci. Lze ho znovu přiřadit za běhu.

do_actuate(raw: dict, naming_map: dict) None#

Aktualizuje tento záznam ze surového příchozího SenML slovníku a, je-li přítomen, vyvolá actuate callback.

class senml.SenmlBase#

Společná základní třída sdílená SenmlPack a SenmlRecord. Nevystavuje žádné vlastní veřejné API; existuje proto, aby SenmlPack.add() mohla ověřit, že položka patří do hierarchie SenML.

class senml.SenmlUnits#

Třída jmenného prostoru, jejíž atributy třídy jsou symboly jednotek SenML definované v RFC 8428. Každý atribut se rozliší na řetězcový kód jednotky vhodný pro přiřazení do SenmlRecord.unit nebo SenmlPack.base_unit.

SENML_UNIT_METER: str#

"m" – metr.

SENML_UNIT_KILOGRAM: str#

"kg" – kilogram.

SENML_UNIT_GRAM: str#

"g" – gram.

SENML_UNIT_SECOND: str#

"s" – sekunda.

SENML_UNIT_AMPERE: str#

"A" – ampér.

SENML_UNIT_KELVIN: str#

"K" – kelvin.

SENML_UNIT_CANDELA: str#

"cd" – kandela.

SENML_UNIT_MOLE: str#

"mol" – mol.

SENML_UNIT_HERTZ: str#

"Hz" – hertz.

SENML_UNIT_RADIAN: str#

"rad" – radián.

SENML_UNIT_STERADIAN: str#

"sr" – steradián.

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" – stupně Celsia.

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" – metr čtvereční.

SENML_UNIT_CUBIC_METER: str#

"m3" – metr krychlový.

SENML_UNIT_LITER: str#

"l" – litr.

SENML_UNIT_VELOCITY: str#

"m/s" – rychlost.

SENML_UNIT_ACCELERATION: str#

"m/s2" – zrychlení.

SENML_UNIT_CUBIC_METER_PER_SECOND: str#

"m3/s" – objemový průtok.

SENML_UNIT_LITER_PER_SECOND: str#

"l/s" – litr za sekundu.

SENML_UNIT_WATT_PER_SQUARE_METER: str#

"W/m2" – ozáření.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str#

"cd/m2" – jas.

SENML_UNIT_BIT: str#

"bit" – bit.

SENML_UNIT_BIT_PER_SECOND: str#

"bit/s" – bit za sekundu.

SENML_UNIT_DEGREES_LATITUDE: str#

"lat" – stupně zeměpisné šířky.

SENML_UNIT_DEGREES_LONGITUDE: str#

"lon" – stupně zeměpisné délky.

SENML_UNIT_PH: str#

"pH" – kyselost (pH).

SENML_UNIT_DECIBEL: str#

"db" – decibel.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str#

"dBW" – decibel vztažený k 1 W.

SENML_UNIT_BEL: str#

"Bspl" – bel (hladina akustického tlaku).

SENML_UNIT_COUNTER: str#

"count" – čítač.

SENML_UNIT_RATIO: str#

"//" – poměr (bezrozměrný).

SENML_UNIT_RELATIVE_HUMIDITY: str#

"%RH" – relativní vlhkost.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str#

"%EL" – zbývající úroveň baterie v procentech.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str#

"EL" – zbývající úroveň baterie v sekundách.

SENML_UNIT_EVENT_RATE_PER_SECOND: str#

"1/s" – četnost událostí za sekundu.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str#

"1/min" – četnost událostí za minutu.

SENML_UNIT_BPM: str#

"beat/min" – údery za minutu.

SENML_UNIT_BEATS: str#

"beats" – údery.

SENML_UNIT_SIEMENS_PER_METER: str#

"S/m" – siemens na metr (elektrická vodivost).