senml --- 感測器標記語言 (Sensor Markup Language)¶
本模組為感測器標記語言 (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¶
將 item 從此 pack 移除。若 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()能驗證某項目是否屬於 SenML 階層。
- class senml.SenmlUnits¶
命名空間類別,其類別屬性即為 RFC 8428 所定義的 SenML 單位符號。每個屬性都解析為該單位的字串代碼,適合指派給
SenmlRecord.unit或SenmlPack.base_unit。