senml --- Sensor Markup Language¶
โมดูลนี้ใช้งานตัวเข้ารหัส/ถอดรหัสขนาดเล็กสำหรับ Sensor Markup Language (SenML, RFC 8428) SenML เป็น media-type สำหรับการวัดค่าจากเซนเซอร์และพารามิเตอร์ของอุปกรณ์ โดย "pack" แต่ละชุดประกอบด้วยรายการ "record" ซึ่งแต่ละ record บรรจุชื่อ หน่วย ค่า เวลาประทับ และผลรวมเสริม
การใช้งานรองรับทั้งรูปแบบ JSON และ CBOR และอนุญาตให้ซ้อน pack ได้ เพื่อให้ root pack เดียวสามารถอธิบาย gateway ที่รองรับหลายอุปกรณ์ เพย์โหลดขาเข้าสามารถเรียก actuator callback บน 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 อื่นจะทำหน้าที่เป็น gatewayname คือ SenML base name (
bn) ที่ใช้กับทุก record ใน pack นี้callback จะถูกเรียกจาก
from_json/from_cborเมื่อใดก็ตามที่ record ขาเข้ากล่าวถึงเซนเซอร์ที่ไม่รู้จักมาก่อน โดยจะส่งSenmlRecordใหม่เป็นอาร์กิวเมนต์แรก และ (สำหรับ pack ที่ซ้อนกัน) จะส่ง device pack ต้นทางเป็นdevice=...มักใช้เพื่อจัดการคำสั่ง actuatorอินสแตนซ์
SenmlPackสามารถวนซ้ำได้ -- การวนซ้ำจะให้แต่ละ record ตามลำดับที่แทรก -- และอาจใช้เป็น context manager เพื่อให้เมื่อออก pack จะลบตัวเองออกจาก parent- base_value: int | float | None¶
base value เสริม (
bv) ที่จะบวกเข้ากับค่าตัวเลขของแต่ละ record เมื่อเข้ารหัส และลบออกเมื่อถอดรหัส การกำหนดค่าที่ไม่ใช่ตัวเลขจะ raiseException
- base_unit: str | None¶
base unit เสริม (
bu) -- โดยทั่วไปเป็นค่าจากSenmlUnits
- actuate¶
callback ที่ระบุในขณะสร้าง สามารถกำหนดค่าใหม่ได้ในขณะ runtime
- add(item: SenmlRecord | SenmlPack) None¶
เพิ่ม item เข้า pack นี้ item ต้องเป็น
SenmlRecordหรือSenmlPackอื่น และต้องไม่ได้เป็นของ parent อื่นอยู่แล้ว มิเช่นนั้นจะ raiseException
- remove(item: SenmlRecord | SenmlPack) None¶
ลบ item ออกจาก pack นี้ จะ raise
Exceptionหาก item ไม่ได้เป็น child ของ pack นี้
- from_json(data: str) None¶
แยกวิเคราะห์เอกสาร SenML/JSON และรวม record เข้า pack นี้ Record ที่มีอยู่แล้ว (จับคู่ด้วยชื่อ) จะเรียก
SenmlRecord.do_actuate()ส่วน record ใหม่จะถูกเพิ่มเข้าและเรียก callback ระดับ pack
- class senml.SenmlRecord(name: str, **kwargs)¶
แสดงถึงการวัดค่าเดียวภายใน
SenmlPackname คือชื่อ SenML record (
n)อาร์กิวเมนต์คีย์เวิร์ดต่อไปนี้รองรับ:
value --
bool,int,float,strหรือbytearrayประเภทอื่นจะ raiseExceptiontime -- เวลาประทับตัวเลข (
t)unit -- string หน่วย โดยทั่วไปเป็น member ของ
SenmlUnitssum -- ผลรวมสะสมตัวเลข (
s)update_time -- เวลาสูงสุดก่อนที่เซนเซอร์จะให้ค่าใหม่ (
ut)callback -- ฟังก์ชันที่เรียกเมื่อเพย์โหลดขาเข้าอัปเดต record นี้ รับ
SenmlRecordเป็นอาร์กิวเมนต์เดียว
SenmlRecordอาจใช้เป็น context manager เพื่อให้เมื่อออกจะลบตัวเองออกจาก parent pack- value¶
ค่าปัจจุบัน การกำหนดค่าใหม่จะตรวจสอบประเภท รับเฉพาะ
boolตัวเลขstrและbytearrayเท่านั้น หากต้องการควบคุมความแม่นยำในการแสดงผลของค่า float ให้ปัดเศษก่อนกำหนด เช่นrecord.value = round(x, 2)
- actuate¶
callback ที่ระบุในขณะสร้าง สามารถกำหนดค่าใหม่ได้ในขณะ runtime
- class senml.SenmlBase¶
คลาสฐานร่วมที่
SenmlPackและSenmlRecordใช้ร่วมกัน ไม่มี public API เป็นของตัวเอง มีอยู่เพื่อให้SenmlPack.add()สามารถตรวจสอบว่า item อยู่ใน SenML hierarchy
- class senml.SenmlUnits¶
คลาส namespace ที่มี class attribute เป็น SenML unit symbol ตามที่กำหนดใน RFC 8428 แต่ละ attribute จะแปลงเป็น string code ของหน่วยนั้น เหมาะสำหรับกำหนดให้กับ
SenmlRecord.unitหรือSenmlPack.base_unit