senml --- Sensor Markup Language

Modul ini mengimplementasikan encoder/decoder kecil untuk Sensor Markup Language (SenML, RFC 8428). SenML adalah tipe media untuk pengukuran sensor dan parameter perangkat: setiap "pack" adalah daftar "record", di mana setiap record memiliki nama, satuan, nilai, stempel waktu, dan jumlah opsional.

Implementasi ini mendukung representasi JSON maupun CBOR dan memungkinkan pack untuk disarangkan sehingga satu root pack dapat mendeskripsikan gateway yang mengelola beberapa perangkat. Payload masuk dapat mengaktifkan callback aktuator pada record yang sudah ada.

Contoh penggunaan:

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())

Kelas

class senml.SenmlPack(name: str, callback=None)

Merepresentasikan sebuah SenML pack -- kumpulan instans SenmlRecord dan secara opsional objek SenmlPack anak lainnya. Ketika sebuah pack hanya berisi record, pack tersebut merepresentasikan satu perangkat; ketika berisi pack lain, pack tersebut bertindak sebagai gateway.

name adalah nama dasar SenML (bn) yang digunakan untuk setiap record yang terdapat dalam pack ini.

callback dipanggil dari from_json / from_cbor setiap kali record masuk menamai sensor yang belum dikenal sebelumnya; SenmlRecord baru diteruskan sebagai argumen pertama dan (untuk pack bersarang) pack perangkat asal diteruskan sebagai device=.... Biasanya digunakan untuk menangani perintah aktuator.

Instans SenmlPack dapat diiterasi -- iterasi menghasilkan setiap record sesuai urutan penyisipan -- dan dapat digunakan sebagai context manager sehingga saat keluar, pack menghapus dirinya dari induknya.

name: str

Nama dasar pack (bn).

base_value: int | float | None

Nilai dasar opsional (bv) yang ditambahkan ke nilai numerik setiap record saat encoding dan dikurangkan saat decoding. Menetapkan nilai non-numerik akan memunculkan Exception.

base_time: int | float | None

Waktu dasar opsional (bt) yang ditambahkan ke stempel waktu setiap record.

base_sum: int | float | None

Jumlah dasar opsional (bs) yang ditambahkan ke field sum setiap record.

base_unit: str | None

Satuan dasar opsional (bu) -- biasanya nilai dari SenmlUnits.

actuate

Callback yang diberikan saat konstruksi. Dapat diubah kembali saat runtime.

add(item: SenmlRecord | SenmlPack) None

Tambahkan item ke pack ini. item harus berupa SenmlRecord atau SenmlPack lainnya dan belum menjadi milik induk yang berbeda; jika tidak, Exception akan dimunculkan.

remove(item: SenmlRecord | SenmlPack) None

Hapus item dari pack ini. Exception dimunculkan jika item bukan anak dari pack ini.

clear() None

Hapus setiap record/sub-pack dari pack ini dan lepaskan referensi induknya.

from_json(data: str) None

Urai dokumen SenML/JSON dan gabungkan record ke pack ini. Record yang sudah ada (dicocokkan berdasarkan nama) memicu SenmlRecord.do_actuate(); record baru ditambahkan dan callback tingkat pack dipanggil.

to_json() str

Render pack beserta anaknya ke string SenML/JSON.

from_cbor(data: bytes) None

Urai string byte SenML/CBOR dan gabungkan record ke pack ini.

to_cbor() bytes

Render pack beserta anaknya ke string byte SenML/CBOR.

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

Helper internal yang dipanggil saat mengurai data masuk ketika tidak ada record yang cocok dengan suatu entri. Menambahkan SenmlRecord baru ke device (atau ke pack ini) dan meneruskannya ke callback.

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

Merepresentasikan satu pengukuran di dalam SenmlPack.

name adalah nama record SenML (n).

Argumen kata kunci berikut diterima:

  • value -- bool, int, float, str atau bytearray. Tipe lain memunculkan Exception.

  • time -- stempel waktu numerik (t).

  • unit -- string satuan, biasanya anggota dari SenmlUnits.

  • sum -- jumlah terintegrasi numerik (s).

  • update_time -- waktu maksimum sebelum sensor memberikan pembacaan baru (ut).

  • callback -- fungsi yang dipanggil ketika payload masuk memperbarui record ini. Fungsi ini menerima SenmlRecord sebagai satu-satunya argumen.

SenmlRecord dapat digunakan sebagai context manager sehingga saat keluar, record menghapus dirinya dari pack induknya.

name: str

Nama record (n).

value

Nilai saat ini. Penugasan ulang memeriksa tipe; hanya bool, angka, str dan bytearray yang diterima. Untuk mengontrol presisi render nilai float, bulatkan sebelum penugasan, mis. record.value = round(x, 2).

unit: str | None

String satuan (u).

time: int | float | None

Stempel waktu yang terkait dengan pengukuran ini (t).

update_time: int | float | None

Waktu maksimum sebelum sensor akan memberikan pembacaan yang diperbarui (ut).

sum: int | float | None

Field jumlah terintegrasi (s).

actuate

Callback yang diberikan saat konstruksi. Dapat diubah kembali saat runtime.

do_actuate(raw: dict, naming_map: dict) None

Perbarui record ini dari kamus SenML masuk mentah dan, jika ada, panggil callback aktuasi.

class senml.SenmlBase

Kelas dasar bersama yang digunakan oleh SenmlPack dan SenmlRecord. Kelas ini tidak mengekspos API publik sendiri; kelas ini ada agar SenmlPack.add() dapat memvalidasi bahwa suatu item termasuk dalam hierarki SenML.

class senml.SenmlUnits

Kelas namespace yang atribut kelasnya adalah simbol satuan SenML yang didefinisikan oleh RFC 8428. Setiap atribut diselesaikan ke kode string satuannya, cocok untuk penugasan ke SenmlRecord.unit atau SenmlPack.base_unit.

SENML_UNIT_METER: str

"m" -- metre.

SENML_UNIT_KILOGRAM: str

"kg" -- kilogram.

SENML_UNIT_GRAM: str

"g" -- gram.

SENML_UNIT_SECOND: str

"s" -- sekon.

SENML_UNIT_AMPERE: str

"A" -- ampere.

SENML_UNIT_KELVIN: str

"K" -- kelvin.

SENML_UNIT_CANDELA: str

"cd" -- kandela.

SENML_UNIT_MOLE: str

"mol" -- mol.

SENML_UNIT_HERTZ: str

"Hz" -- hertz.

SENML_UNIT_RADIAN: str

"rad" -- radian.

SENML_UNIT_STERADIAN: str

"sr" -- steradian.

SENML_UNIT_NEWTON: str

"N" -- newton.

SENML_UNIT_PASCAL: str

"Pa" -- pascal.

SENML_UNIT_JOULE: str

"J" -- joule.

SENML_UNIT_WATT: str

"W" -- watt.

SENML_UNIT_COULOMB: str

"C" -- coulomb.

SENML_UNIT_VOLT: str

"V" -- volt.

SENML_UNIT_FARAD: str

"F" -- farad.

SENML_UNIT_OHM: str

"Ohm" -- ohm.

SENML_UNIT_SIEMENS: str

"S" -- siemens.

SENML_UNIT_WEBER: str

"Wb" -- weber.

SENML_UNIT_TESLA: str

"T" -- tesla.

SENML_UNIT_HENRY: str

"H" -- henry.

SENML_UNIT_DEGREES_CELSIUS: str

"Cel" -- derajat Celsius.

SENML_UNIT_LUMEN: str

"lm" -- lumen.

SENML_UNIT_LUX: str

"lx" -- lux.

SENML_UNIT_BECQUEREL: str

"Bq" -- becquerel.

SENML_UNIT_GRAY: str

"Gy" -- gray.

SENML_UNIT_SIEVERT: str

"Sv" -- sievert.

SENML_UNIT_KATAL: str

"kat" -- katal.

SENML_UNIT_SQUARE_METER: str

"m2" -- meter persegi.

SENML_UNIT_CUBIC_METER: str

"m3" -- meter kubik.

SENML_UNIT_LITER: str

"l" -- liter.

SENML_UNIT_VELOCITY: str

"m/s" -- kecepatan.

SENML_UNIT_ACCELERATION: str

"m/s2" -- percepatan.

SENML_UNIT_CUBIC_METER_PER_SECOND: str

"m3/s" -- laju aliran volumetrik.

SENML_UNIT_LITER_PER_SECOND: str

"l/s" -- liter per sekon.

SENML_UNIT_WATT_PER_SQUARE_METER: str

"W/m2" -- iradiasi.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str

"cd/m2" -- luminansi.

SENML_UNIT_BIT: str

"bit" -- bit.

SENML_UNIT_BIT_PER_SECOND: str

"bit/s" -- bit per sekon.

SENML_UNIT_DEGREES_LATITUDE: str

"lat" -- derajat lintang.

SENML_UNIT_DEGREES_LONGITUDE: str

"lon" -- derajat bujur.

SENML_UNIT_PH: str

"pH" -- keasaman (pH).

SENML_UNIT_DECIBEL: str

"db" -- desibel.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str

"dBW" -- desibel relatif terhadap 1 W.

SENML_UNIT_BEL: str

"Bspl" -- bel (tingkat tekanan suara).

SENML_UNIT_COUNTER: str

"count" -- penghitung.

SENML_UNIT_RATIO: str

"//" -- rasio (tanpa dimensi).

SENML_UNIT_RELATIVE_HUMIDITY: str

"%RH" -- kelembaban relatif.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str

"%EL" -- sisa level baterai dalam persentase.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str

"EL" -- sisa level baterai dalam sekon.

SENML_UNIT_EVENT_RATE_PER_SECOND: str

"1/s" -- laju kejadian per sekon.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str

"1/min" -- laju kejadian per menit.

SENML_UNIT_BPM: str

"beat/min" -- detak per menit.

SENML_UNIT_BEATS: str

"beats" -- detak.

SENML_UNIT_SIEMENS_PER_METER: str

"S/m" -- siemens per metre (konduktivitas listrik).