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_json/from_cborから呼び出されます。新しいSenmlRecordが最初の引数として渡され、(ネストされた pack の場合)発信元のデバイス pack がdevice=...として渡されます。通常はアクチュエータコマンドを処理するために使用されます。SenmlPackインスタンスはイテラブルであり(イテレーションは挿入順に各 record を返します)、コンテキストマネージャとして使用することもできます。これにより、終了時に pack は自身を親から取り除きます。- base_value: int | float | None¶
オプションのベース値(
bv)。エンコード時に各 record の数値に加算され、デコード時に減算されます。数値以外の値を設定するとExceptionが発生します。
- 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のみが受け付けられます。float 値のレンダリング精度を制御するには、代入前に丸めてください。例: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への代入に適しています。