senml — Sensor Markup Language

Ten moduł implementuje niewielki koder/dekoder dla języka Sensor Markup Language (SenML, RFC 8428). SenML to typ medialny służący do reprezentowania pomiarów z sensorów i parametrów urządzeń: każdy „pack” jest listą „rekordów”, przy czym każdy rekord zawiera nazwę, jednostkę, wartość, znacznik czasu oraz opcjonalną sumę.

Implementacja obsługuje zarówno reprezentację JSON, jak i CBOR oraz pozwala zagnieżdżać packi, dzięki czemu jeden pack główny może opisywać bramę pośredniczącą dla wielu urządzeń. Przychodzące dane mogą wyzwalać wywołania zwrotne aktuatorów na istniejących rekordach.

Przykład użycia:

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

Klasy

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

Reprezentuje pack SenML – kolekcję instancji SenmlRecord oraz opcjonalnie innych podrzędnych obiektów SenmlPack. Gdy pack zawiera wyłącznie rekordy, reprezentuje pojedyncze urządzenie; gdy zawiera inne packi, działa jako brama.

name to bazowa nazwa SenML (bn) używana dla każdego rekordu zawartego w tym packu.

callback jest wywoływane z from_json / from_cbor zawsze, gdy przychodzący rekord nazywa wcześniej nieznany sensor; nowy SenmlRecord jest przekazywany jako pierwszy argument, a (w przypadku packów zagnieżdżonych) źródłowy pack urządzenia jest przekazywany jako device=.... Zwykle służy do obsługi poleceń dla aktuatorów.

Instancje SenmlPack są iterowalne – iteracja zwraca każdy rekord w kolejności wstawiania – i mogą być używane jako menedżer kontekstu, dzięki czemu przy wyjściu pack usuwa się ze swojego rodzica.

name: str

Bazowa nazwa packu (bn).

base_value: int | float | None

Opcjonalna wartość bazowa (bv) dodawana do liczbowej wartości każdego rekordu podczas kodowania i odejmowana podczas dekodowania. Ustawienie wartości nieliczbowej zgłasza Exception.

base_time: int | float | None

Opcjonalny czas bazowy (bt) dodawany do znacznika czasu każdego rekordu.

base_sum: int | float | None

Opcjonalna suma bazowa (bs) dodawana do pola sumy każdego rekordu.

base_unit: str | None

Opcjonalna jednostka bazowa (bu) – zwykle wartość z SenmlUnits.

actuate

Wywołanie zwrotne dostarczone w momencie konstrukcji. Może zostać ponownie przypisane w czasie działania.

add(item: SenmlRecord | SenmlPack) None

Dołącza item do tego packu. item musi być obiektem SenmlRecord lub innym SenmlPack i nie może już należeć do innego rodzica; w przeciwnym razie zgłaszany jest Exception.

remove(item: SenmlRecord | SenmlPack) None

Usuwa item z tego packu. Exception jest zgłaszany, jeśli item nie jest elementem podrzędnym tego packu.

clear() None

Usuwa każdy rekord/podrzędny pack z tego packu i odłącza je od odniesienia do rodzica.

from_json(data: str) None

Parsuje dokument SenML/JSON i scala rekordy z tym packiem. Rekordy, które już istnieją (dopasowane po nazwie), wyzwalają SenmlRecord.do_actuate(); nowe rekordy są dołączane, a wywołane zostaje callback na poziomie packu.

to_json() str

Renderuje pack i jego elementy podrzędne do łańcucha znaków SenML/JSON.

from_cbor(data: bytes) None

Parsuje łańcuch bajtów SenML/CBOR i scala rekordy z tym packiem.

to_cbor() bytes

Renderuje pack i jego elementy podrzędne do łańcucha bajtów SenML/CBOR.

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

Wewnętrzna funkcja pomocnicza wywoływana podczas parsowania przychodzących danych, gdy żaden istniejący rekord nie pasuje do wpisu. Dodaje nowy SenmlRecord do device (lub do tego packu) i przekazuje go do callback.

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

Reprezentuje pojedynczy pomiar wewnątrz SenmlPack.

name to nazwa rekordu SenML (n).

Akceptowane są następujące argumenty nazwane:

  • valuebool, int, float, str lub bytearray. Inne typy zgłaszają Exception.

  • time – liczbowy znacznik czasu (t).

  • unit – łańcuch jednostki, zwykle element SenmlUnits.

  • sum – liczbowa suma scałkowana (s).

  • update_time – maksymalny czas, zanim sensor dostarczy nowy odczyt (ut).

  • callback – funkcja wywoływana, gdy przychodzące dane aktualizują ten rekord. Otrzymuje SenmlRecord jako jedyny argument.

SenmlRecord może być używany jako menedżer kontekstu, dzięki czemu przy wyjściu usuwa się ze swojego packu nadrzędnego.

name: str

Nazwa rekordu (n).

value

Bieżąca wartość. Ponowne przypisanie sprawdza typ; akceptowane są tylko bool, liczby, str oraz bytearray. Aby kontrolować renderowaną precyzję wartości zmiennoprzecinkowej, zaokrąglij ją przed przypisaniem, np. record.value = round(x, 2).

unit: str | None

Łańcuch jednostki (u).

time: int | float | None

Znacznik czasu powiązany z tym pomiarem (t).

update_time: int | float | None

Maksymalny czas, zanim sensor dostarczy zaktualizowany odczyt (ut).

sum: int | float | None

Pole sumy scałkowanej (s).

actuate

Wywołanie zwrotne dostarczone w momencie konstrukcji. Może zostać ponownie przypisane w czasie działania.

do_actuate(raw: dict, naming_map: dict) None

Aktualizuje ten rekord na podstawie surowego przychodzącego słownika SenML i, jeśli istnieje, wywołuje wywołanie zwrotne aktuatora.

class senml.SenmlBase

Wspólna klasa bazowa współdzielona przez SenmlPack i SenmlRecord. Nie udostępnia własnego publicznego API; istnieje po to, aby SenmlPack.add() mogła zweryfikować, że element należy do hierarchii SenML.

class senml.SenmlUnits

Klasa przestrzeni nazw, której atrybuty klasowe są symbolami jednostek SenML zdefiniowanymi przez RFC 8428. Każdy atrybut zwraca kod łańcuchowy jednostki, odpowiedni do przypisania do SenmlRecord.unit lub 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" – amper.

SENML_UNIT_KELVIN: str

"K" – kelwin.

SENML_UNIT_CANDELA: str

"cd" – kandela.

SENML_UNIT_MOLE: str

"mol" – mol.

SENML_UNIT_HERTZ: str

"Hz" – herc.

SENML_UNIT_RADIAN: str

"rad" – radian.

SENML_UNIT_STERADIAN: str

"sr" – steradian.

SENML_UNIT_NEWTON: str

"N" – niuton.

SENML_UNIT_PASCAL: str

"Pa" – paskal.

SENML_UNIT_JOULE: str

"J" – dżul.

SENML_UNIT_WATT: str

"W" – wat.

SENML_UNIT_COULOMB: str

"C" – kulomb.

SENML_UNIT_VOLT: str

"V" – wolt.

SENML_UNIT_FARAD: str

"F" – farad.

SENML_UNIT_OHM: str

"Ohm" – om.

SENML_UNIT_SIEMENS: str

"S" – simens.

SENML_UNIT_WEBER: str

"Wb" – weber.

SENML_UNIT_TESLA: str

"T" – tesla.

SENML_UNIT_HENRY: str

"H" – henr.

SENML_UNIT_DEGREES_CELSIUS: str

"Cel" – stopnie Celsjusza.

SENML_UNIT_LUMEN: str

"lm" – lumen.

SENML_UNIT_LUX: str

"lx" – luks.

SENML_UNIT_BECQUEREL: str

"Bq" – bekerel.

SENML_UNIT_GRAY: str

"Gy" – grej.

SENML_UNIT_SIEVERT: str

"Sv" – siwert.

SENML_UNIT_KATAL: str

"kat" – katal.

SENML_UNIT_SQUARE_METER: str

"m2" – metr kwadratowy.

SENML_UNIT_CUBIC_METER: str

"m3" – metr sześcienny.

SENML_UNIT_LITER: str

"l" – litr.

SENML_UNIT_VELOCITY: str

"m/s" – prędkość.

SENML_UNIT_ACCELERATION: str

"m/s2" – przyspieszenie.

SENML_UNIT_CUBIC_METER_PER_SECOND: str

"m3/s" – objętościowe natężenie przepływu.

SENML_UNIT_LITER_PER_SECOND: str

"l/s" – litr na sekundę.

SENML_UNIT_WATT_PER_SQUARE_METER: str

"W/m2" – natężenie napromieniowania.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str

"cd/m2" – luminancja.

SENML_UNIT_BIT: str

"bit" – bit.

SENML_UNIT_BIT_PER_SECOND: str

"bit/s" – bit na sekundę.

SENML_UNIT_DEGREES_LATITUDE: str

"lat" – stopnie szerokości geograficznej.

SENML_UNIT_DEGREES_LONGITUDE: str

"lon" – stopnie długości geograficznej.

SENML_UNIT_PH: str

"pH" – kwasowość (pH).

SENML_UNIT_DECIBEL: str

"db" – decybel.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str

"dBW" – decybel względem 1 W.

SENML_UNIT_BEL: str

"Bspl" – bel (poziom ciśnienia akustycznego).

SENML_UNIT_COUNTER: str

"count" – licznik.

SENML_UNIT_RATIO: str

"//" – stosunek (bezwymiarowy).

SENML_UNIT_RELATIVE_HUMIDITY: str

"%RH" – wilgotność względna.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str

"%EL" – pozostały poziom naładowania baterii w procentach.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str

"EL" – pozostały poziom naładowania baterii w sekundach.

SENML_UNIT_EVENT_RATE_PER_SECOND: str

"1/s" – częstość zdarzeń na sekundę.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str

"1/min" – częstość zdarzeń na minutę.

SENML_UNIT_BPM: str

"beat/min" – uderzenia na minutę.

SENML_UNIT_BEATS: str

"beats" – uderzenia.

SENML_UNIT_SIEMENS_PER_METER: str

"S/m" – simens na metr (przewodność elektryczna).