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 は、この pack に含まれるすべての record に使用される SenML ベース名(bn)です。

callback は、受信した record が以前に未知だったセンサーを名指ししたときに、必ず from_jsonfrom_cbor から呼び出されます。新しい SenmlRecord が最初の引数として渡され、(ネストされた pack の場合)発信元のデバイス pack が device=... として渡されます。通常はアクチュエータコマンドを処理するために使用されます。

SenmlPack インスタンスはイテラブルであり(イテレーションは挿入順に各 record を返します)、コンテキストマネージャとして使用することもできます。これにより、終了時に pack は自身を親から取り除きます。

name: str

pack のベース名(bn)。

base_value: int | float | None

オプションのベース値(bv)。エンコード時に各 record の数値に加算され、デコード時に減算されます。数値以外の値を設定すると Exception が発生します。

base_time: int | float | None

オプションのベース時刻(bt)。各 record のタイムスタンプに加算されます。

base_sum: int | float | None

オプションのベース合計(bs)。各 record の合計フィールドに加算されます。

base_unit: str | None

オプションのベース単位(bu)。通常は SenmlUnits の値です。

actuate

構築時に指定されたコールバック。実行時に再代入できます。

add(item: SenmlRecord | SenmlPack) None

item をこの pack に追加します。itemSenmlRecord または別の SenmlPack でなければならず、すでに別の親に属していてはなりません。そうでない場合は Exception が発生します。

remove(item: SenmlRecord | SenmlPack) None

item をこの pack から取り除きます。item がこの pack の子でない場合は Exception が発生します。

clear() None

この pack からすべての record/サブ pack を取り除き、それらの親参照から切り離します。

from_json(data: str) None

SenML/JSON ドキュメントを解析し、record をこの pack にマージします。すでに存在する record(名前で照合)は SenmlRecord.do_actuate() をトリガーし、新しい record は追加され、pack レベルの callback が呼び出されます。

to_json() str

pack とその子を SenML/JSON 文字列にレンダリングします。

from_cbor(data: bytes) None

SenML/CBOR バイト文字列を解析し、record をこの pack にマージします。

to_cbor() bytes

pack とその子を SenML/CBOR バイト文字列にレンダリングします。

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

受信データの解析中に、エントリに一致する既存の record がない場合に呼び出される内部ヘルパーです。新しい SenmlRecorddevice(またはこの pack)に追加し、callback に転送します。

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

SenmlPack 内の単一の測定値を表します。

name は SenML record 名(n)です。

以下のキーワード引数を受け付けます。

  • value -- boolintfloatstr または bytearray。その他の型は Exception を発生させます。

  • time -- 数値のタイムスタンプ(t)。

  • unit -- 単位文字列。通常は SenmlUnits のメンバーです。

  • sum -- 数値の積算合計(s)。

  • update_time -- センサーが新しい読み取り値を提供するまでの最大時間(ut)。

  • callback -- 受信ペイロードがこの record を更新したときに呼び出される関数。SenmlRecord を唯一の引数として受け取ります。

SenmlRecord はコンテキストマネージャとして使用でき、終了時に自身を親 pack から取り除きます。

name: str

record 名(n)。

value

現在の値。再代入時に型がチェックされ、bool、数値、strbytearray のみが受け付けられます。float 値のレンダリング精度を制御するには、代入前に丸めてください。例: 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 辞書からこの record を更新し、存在する場合はアクチュエートコールバックを呼び出します。

class senml.SenmlBase

SenmlPackSenmlRecord で共有される共通基底クラスです。独自の公開 API は公開していません。SenmlPack.add() が、ある item が SenML 階層に属することを検証できるようにするために存在します。

class senml.SenmlUnits

クラス属性が RFC 8428 で定義された SenML 単位記号となっている名前空間クラスです。各属性は単位の文字列コードに解決され、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 W を基準としたデシベル。

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" -- 毎メートルジーメンス(電気伝導率)。