senml --- 传感器标记语言(Sensor Markup Language)¶
本模块实现了一个用于传感器标记语言(SenML,RFC 8428)的小型编码器/解码器。SenML 是一种用于传感器测量值和设备参数的媒体类型:每个“pack”是一个“record”列表,其中每条 record 都带有名称、单位、值、时间戳以及可选的累加值。
该实现同时支持 JSON 和 CBOR 两种表示形式,并允许将 pack 嵌套,从而使单个根 pack 能够描述一个面向多台设备的网关。入站负载可以驱动现有 record 上的执行器回调。
示例用法:
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 pack —— 由若干
SenmlRecord实例以及可选的其他子SenmlPack对象组成的集合。当某个 pack 仅包含 record 时,它表示单台设备;当它包含其他 pack 时,则充当网关。name 是 SenML 基础名称(
bn),用于此 pack 中包含的每条 record。callback 在
from_json/from_cbor中被调用,每当一条入站 record 命名了一个先前未知的传感器时触发;新建的SenmlRecord作为第一个参数传入,(对于嵌套 pack)发起方设备 pack 则通过device=...传入。它通常用于处理执行器命令。SenmlPack实例是可迭代的 —— 迭代会按插入顺序逐个产出 record —— 并且可以用作上下文管理器,从而在退出时让该 pack 将自身从其父级中移除。- base_unit: str | None¶
可选的基础单位(
bu)—— 通常取自SenmlUnits中的某个值。
- actuate¶
构造时提供的回调。可在运行时重新赋值。
- add(item: SenmlRecord | SenmlPack) None¶
将 item 追加到此 pack。item 必须是
SenmlRecord或另一个SenmlPack,且不能已经属于其他父级;否则会引发Exception。
- remove(item: SenmlRecord | SenmlPack) None¶
从此 pack 中移除 item。如果 item 不是此 pack 的子项,则会引发
Exception。
- from_json(data: str) None¶
解析一个 SenML/JSON 文档并将其中的 record 合并到此 pack 中。已存在(按名称匹配)的 record 会触发
SenmlRecord.do_actuate();新的 record 会被追加,并调用 pack 级别的 callback。
- class senml.SenmlRecord(name: str, **kwargs)¶
表示
SenmlPack内部的单次测量。name 是 SenML record 名称(
n)。可接受以下关键字参数:
value ——
bool、int、float、str或bytearray。其他类型会引发Exception。time —— 数值时间戳(
t)。unit —— 单位字符串,通常是
SenmlUnits的某个成员。sum —— 数值积分累加值(
s)。update_time —— 传感器提供新读数之前的最长时间(
ut)。callback —— 当入站负载更新此 record 时调用的函数。它接收
SenmlRecord作为唯一参数。
SenmlRecord可以用作上下文管理器,从而在退出时将自身从其父 pack 中移除。- value¶
当前值。重新赋值时会检查类型;仅接受
bool、数字、str和bytearray。要控制浮点值渲染时的精度,请在赋值前先四舍五入,例如record.value = round(x, 2)。
- actuate¶
构造时提供的回调。可在运行时重新赋值。
- class senml.SenmlBase¶
SenmlPack与SenmlRecord共享的公共基类。它本身不暴露任何公共 API;其存在的意义在于让SenmlPack.add()能够验证某个 item 属于 SenML 层次结构。
- class senml.SenmlUnits¶
一个命名空间类,其类属性为 RFC 8428 所定义的 SenML 单位符号。每个属性都解析为该单位的字符串代码,适合赋值给
SenmlRecord.unit或SenmlPack.base_unit。