senml — язык разметки датчиков (Sensor Markup Language)¶
Этот модуль реализует небольшой кодировщик/декодировщик для языка разметки датчиков (Sensor Markup Language, 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являются итерируемыми — итерация выдаёт каждую запись в порядке вставки — и могут использоваться как менеджер контекста, так что при выходе пакет удаляет себя из своего родителя.- 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(); новые записи добавляются, и вызывается функция обратного вызова callback уровня пакета.
- 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).Принимаются следующие именованные аргументы:
value —
bool,int,float,strилиbytearray. Другие типы вызываютException.time — числовая временная метка (
t).unit — строка единицы измерения, обычно член
SenmlUnits.sum — числовая интегрированная сумма (
s).update_time — максимальное время до того, как датчик предоставит новое показание (
ut).callback — функция, вызываемая, когда входящие данные обновляют эту запись. Она получает объект
SenmlRecordв качестве своего единственного аргумента.
SenmlRecordможет использоваться как менеджер контекста, так что при выходе он удаляет себя из своего родительского пакета.- value¶
Текущее значение. При переназначении проверяется тип; принимаются только
bool, числа,strиbytearray. Чтобы управлять отображаемой точностью значения с плавающей точкой, округлите его перед присваиванием, напримерrecord.value = round(x, 2).
- update_time: int | float | None¶
Максимальное время до того, как датчик предоставит обновлённое показание (
ut).
- actuate¶
Функция обратного вызова, переданная во время создания. Может быть переназначена во время выполнения.
- class senml.SenmlBase¶
Общий базовый класс, разделяемый
SenmlPackиSenmlRecord. Он не предоставляет собственного публичного API; он существует для того, чтобыSenmlPack.add()мог проверить, что элемент принадлежит иерархии SenML.
- class senml.SenmlUnits¶
Класс-пространство имён, атрибуты класса которого являются символами единиц измерения SenML, определёнными в RFC 8428. Каждый атрибут разрешается в строковый код единицы измерения, подходящий для присваивания
SenmlRecord.unitилиSenmlPack.base_unit.- SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str¶
"%EL"— оставшийся уровень заряда батареи в процентах.