senml — Мова розмітки датчиків#

Цей модуль реалізує невеликий кодувальник/декодувальник для Мови розмітки датчиків (SenML, RFC 8428). SenML — це медіатип для вимірювань датчиків та параметрів пристроїв: кожен «пакет» являє собою список «записів», де кожен запис містить ім’я, одиницю, значення, мітку часу та необов’язкову суму.

Реалізація підтримує як JSON, так і CBOR представлення та дозволяє вкладати пакети так, що один кореневий пакет може описувати шлюз, який обслуговує кілька пристроїв. Вхідні корисні навантаження можуть запускати зворотні виклики актуаторів для наявних записів.

Приклад використання:

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

Класи#

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

Представляє пакет SenML – колекцію екземплярів SenmlRecord та, необов’язково, інших дочірніх об’єктів SenmlPack. Коли пакет містить лише записи, він представляє один пристрій; коли він містить інші пакети, він діє як шлюз.

name — базове ім’я SenML (bn), яке використовується для кожного запису, що міститься в цьому пакеті.

callback викликається з from_json / from_cbor щоразу, коли вхідний запис посилається на раніше невідомий датчик; новий SenmlRecord передається як перший аргумент, а (для вкладених пакетів) вихідний пакет пристрою передається як device=.... Зазвичай використовується для обробки команд актуаторів.

Екземпляри SenmlPack є ітерованими – ітерація повертає кожен запис у порядку вставки – і можуть використовуватися як менеджер контексту, щоб при виході пакет видалив себе зі свого батьківського.

name: str#

Базове ім’я пакета (bn).

base_value: int | float | None#

Необов’язкове базове значення (bv), яке додається до числового значення кожного запису при кодуванні та віднімається при декодуванні. Встановлення нечислового значення викликає Exception.

base_time: int | float | None#

Необов’язковий базовий час (bt), який додається до мітки часу кожного запису.

base_sum: int | float | None#

Необов’язкова базова сума (bs), яка додається до поля суми кожного запису.

base_unit: str | None#

Необов’язкова базова одиниця (bu) – зазвичай значення з SenmlUnits.

actuate#

Зворотний виклик, наданий під час конструювання. Може бути перепризначений під час виконання.

add(item: SenmlRecord | SenmlPack) None#

Додати item до цього пакета. item має бути SenmlRecord або іншим SenmlPack і не повинен вже належати до іншого батьківського об’єкта; інакше виникає Exception.

remove(item: SenmlRecord | SenmlPack) None#

Видалити item з цього пакета. Виникає Exception, якщо item не є дочірнім елементом цього пакета.

clear() None#

Видалити кожен запис/підпакет з цього пакета та від’єднати їх від їх батьківського посилання.

from_json(data: str) None#

Розібрати документ SenML/JSON та об’єднати записи в цей пакет. Записи, які вже існують (збіг за іменем), викликають SenmlRecord.do_actuate(); нові записи додаються, і викликається зворотний виклик на рівні пакета.

to_json() str#

Відобразити пакет та його дочірні елементи у рядок SenML/JSON.

from_cbor(data: bytes) None#

Розібрати рядок байтів SenML/CBOR та об’єднати записи в цей пакет.

to_cbor() bytes#

Відобразити пакет та його дочірні елементи у рядок байтів SenML/CBOR.

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

Внутрішній допоміжний метод, що викликається під час розбору вхідних даних, коли жоден наявний запис не відповідає запису. Додає новий SenmlRecord до device (або до цього пакета) і передає його до callback.

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

Представляє окреме вимірювання всередині SenmlPack.

name — ім’я запису SenML (n).

Прийняті такі аргументи-ключові слова:

  • valuebool, int, float, str або bytearray. Інші типи викликають Exception.

  • time – числова мітка часу (t).

  • unit – рядок одиниці, зазвичай член SenmlUnits.

  • sum – числова інтегрована сума (s).

  • update_time – максимальний час до надання датчиком нового показання (ut).

  • callback – функція, що викликається при оновленні цього запису вхідним корисним навантаженням. Отримує SenmlRecord як єдиний аргумент.

SenmlRecord може використовуватися як менеджер контексту, щоб при виході він видалив себе зі свого батьківського пакета.

name: str#

Ім’я запису (n).

value#

Поточне значення. При перепризначенні перевіряється тип; прийняті лише bool, числа, str та bytearray. Для управління відображуваною точністю значення з рухомою комою, округліть перед призначенням, наприклад record.value = round(x, 2).

unit: str | None#

Рядок одиниці (u).

time: int | float | None#

Мітка часу, пов’язана з цим вимірюванням (t).

update_time: int | float | None#

Максимальний час до надання датчиком оновленого показання (ut).

sum: int | float | None#

Поле інтегрованої суми (s).

actuate#

Зворотний виклик, наданий під час конструювання. Може бути перепризначений під час виконання.

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

Оновити цей запис з необробленого вхідного словника SenML та, якщо присутній, викликати зворотний виклик актуатора.

class senml.SenmlBase#

Загальний базовий клас, спільний для SenmlPack та SenmlRecord. Він не надає власного публічного API; він існує так, щоб SenmlPack.add() міг перевірити, що елемент належить до ієрархії SenML.

class senml.SenmlUnits#

Клас-простір імен, атрибути якого є символами одиниць SenML, визначеними RFC 8428. Кожен атрибут розв’язується до рядкового коду одиниці, придатного для призначення SenmlRecord.unit або SenmlPack.base_unit.

SENML_UNIT_METER: str#

"m" – метр.

SENML_UNIT_KILOGRAM: str#

"kg" – кілограм.

SENML_UNIT_GRAM: str#

"g" – грам.

SENML_UNIT_SECOND: str#

"s" – секунда.

SENML_UNIT_AMPERE: str#

"A" – ампер.

SENML_UNIT_KELVIN: str#

"K" – кельвін.

SENML_UNIT_CANDELA: str#

"cd" – кандела.

SENML_UNIT_MOLE: str#

"mol" – моль.

SENML_UNIT_HERTZ: str#

"Hz" – герц.

SENML_UNIT_RADIAN: str#

"rad" – радіан.

SENML_UNIT_STERADIAN: str#

"sr" – стерадіан.

SENML_UNIT_NEWTON: str#

"N" – ньютон.

SENML_UNIT_PASCAL: str#

"Pa" – паскаль.

SENML_UNIT_JOULE: str#

"J" – джоуль.

SENML_UNIT_WATT: str#

"W" – ват.

SENML_UNIT_COULOMB: str#

"C" – кулон.

SENML_UNIT_VOLT: str#

"V" – вольт.

SENML_UNIT_FARAD: str#

"F" – фарад.

SENML_UNIT_OHM: str#

"Ohm" – ом.

SENML_UNIT_SIEMENS: str#

"S" – сіменс.

SENML_UNIT_WEBER: str#

"Wb" – вебер.

SENML_UNIT_TESLA: str#

"T" – тесла.

SENML_UNIT_HENRY: str#

"H" – генрі.

SENML_UNIT_DEGREES_CELSIUS: str#

"Cel" – градус Цельсія.

SENML_UNIT_LUMEN: str#

"lm" – люмен.

SENML_UNIT_LUX: str#

"lx" – люкс.

SENML_UNIT_BECQUEREL: str#

"Bq" – беккерель.

SENML_UNIT_GRAY: str#

"Gy" – грей.

SENML_UNIT_SIEVERT: str#

"Sv" – зіверт.

SENML_UNIT_KATAL: str#

"kat" – катал.

SENML_UNIT_SQUARE_METER: str#

"m2" – квадратний метр.

SENML_UNIT_CUBIC_METER: str#

"m3" – кубічний метр.

SENML_UNIT_LITER: str#

"l" – літр.

SENML_UNIT_VELOCITY: str#

"m/s" – швидкість.

SENML_UNIT_ACCELERATION: str#

"m/s2" – прискорення.

SENML_UNIT_CUBIC_METER_PER_SECOND: str#

"m3/s" – об’ємна витрата.

SENML_UNIT_LITER_PER_SECOND: str#

"l/s" – літр на секунду.

SENML_UNIT_WATT_PER_SQUARE_METER: str#

"W/m2" – опромінення.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str#

"cd/m2" – яскравість.

SENML_UNIT_BIT: str#

"bit" – біт.

SENML_UNIT_BIT_PER_SECOND: str#

"bit/s" – біт на секунду.

SENML_UNIT_DEGREES_LATITUDE: str#

"lat" – градуси широти.

SENML_UNIT_DEGREES_LONGITUDE: str#

"lon" – градуси довготи.

SENML_UNIT_PH: str#

"pH" – кислотність (pH).

SENML_UNIT_DECIBEL: str#

"db" – децибел.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str#

"dBW" – децибел відносно 1 Вт.

SENML_UNIT_BEL: str#

"Bspl" – бел (рівень звукового тиску).

SENML_UNIT_COUNTER: str#

"count" – лічильник.

SENML_UNIT_RATIO: str#

"//" – відношення (безрозмірне).

SENML_UNIT_RELATIVE_HUMIDITY: str#

"%RH" – відносна вологість.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str#

"%EL" – залишковий заряд акумулятора у відсотках.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str#

"EL" – залишковий заряд акумулятора в секундах.

SENML_UNIT_EVENT_RATE_PER_SECOND: str#

"1/s" – частота подій за секунду.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str#

"1/min" – частота подій за хвилину.

SENML_UNIT_BPM: str#

"beat/min" – удари за хвилину.

SENML_UNIT_BEATS: str#

"beats" – удари.

SENML_UNIT_SIEMENS_PER_METER: str#

"S/m" – сіменс на метр (електрична провідність).