senml --- لغة ترميز المستشعرات (Sensor Markup Language)¶
تنفّذ هذه الوحدة مرمّزًا/فاكّ ترميز صغيرًا للغة ترميز المستشعرات (SenML، RFC 8428). إنّ SenML هي نوع وسائط لقياسات المستشعرات ومعاملات الأجهزة: كل "حزمة" هي قائمة من "السجلات"، حيث يحمل كل سجل اسمًا ووحدة وقيمة وطابعًا زمنيًا ومجموعًا اختياريًا.
يدعم هذا التنفيذ كلًا من تمثيلَي JSON وCBOR ويسمح بتداخل الحزم بحيث يمكن لحزمة جذر واحدة أن تصف بوابة تتقدّم أجهزة متعددة. ويمكن للحمولات الواردة أن تشغّل دوال رد نداء المشغّلات على السجلات الموجودة.
مثال على الاستخدام:
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 -- وهي مجموعة من نسخ
SenmlRecordوربما كائناتSenmlPackفرعية أخرى. عندما تحتوي الحزمة على سجلات فقط فإنها تمثّل جهازًا واحدًا؛ وعندما تحتوي على حزم أخرى فإنها تعمل كبوابة.name هو الاسم الأساسي في SenML (
bn) المستخدَم لكل سجل موجود في هذه الحزمة.callback يُستدعى من
from_json/from_cborكلما سمّى سجل وارد مستشعرًا غير معروف سابقًا؛ يُمرَّرSenmlRecordالجديد كأول وسيط و(للحزم المتداخلة) تُمرَّر حزمة الجهاز الأصلية كـdevice=.... وهو يُستخدم عادةً للتعامل مع أوامر المشغّلات.نسخ
SenmlPackقابلة للتكرار -- إذ يُنتج التكرار كل سجل بترتيب الإدراج -- ويمكن استخدامها كمدير سياق بحيث تزيل الحزمة نفسها من والدها عند الخروج.- base_value: int | float | None¶
قيمة أساسية اختيارية (
bv) تُضاف إلى القيمة العددية لكل سجل عند الترميز وتُطرح عند فك الترميز. تعيين قيمة غير عددية يثيرException.
- base_unit: str | None¶
وحدة أساسية اختيارية (
bu) -- عادةً قيمة منSenmlUnits.
- actuate¶
دالة رد النداء المُمرَّرة وقت الإنشاء. ويمكن إعادة تعيينها أثناء التشغيل.
- add(item: SenmlRecord | SenmlPack) None¶
يُلحق item بهذه الحزمة. يجب أن يكون item من نوع
SenmlRecordأوSenmlPackآخر، ويجب ألا ينتمي مسبقًا إلى والد مختلف؛ وإلا أُثيرException.
- remove(item: SenmlRecord | SenmlPack) None¶
يزيل item من هذه الحزمة. يُثار
Exceptionإذا لم يكن item عنصرًا فرعيًا من هذه الحزمة.
- from_json(data: str) None¶
يحلّل مستند SenML/JSON ويدمج السجلات في هذه الحزمة. السجلات الموجودة مسبقًا (المطابَقة بالاسم) تشغّل
SenmlRecord.do_actuate()؛ أما السجلات الجديدة فتُلحق وتُستدعى دالة رد النداء callback على مستوى الحزمة.
- class senml.SenmlRecord(name: str, **kwargs)¶
يمثّل قياسًا واحدًا داخل
SenmlPack.name هو اسم سجل SenML (
n).تُقبل وسائط الكلمات المفتاحية التالية:
value --
boolأوintأوfloatأوstrأوbytearray. الأنواع الأخرى تثيرException.time -- طابع زمني عددي (
t).unit -- سلسلة وحدة، عادةً عضو من
SenmlUnits.sum -- مجموع تكاملي عددي (
s).update_time -- أقصى مدة قبل أن يوفّر المستشعر قراءة جديدة (
ut).callback -- دالة تُستدعى عندما تحدّث حمولة واردة هذا السجل. تتلقى
SenmlRecordكوسيطها الوحيد.
يمكن استخدام
SenmlRecordكمدير سياق بحيث يزيل نفسه من حزمته الأم عند الخروج.- value¶
القيمة الحالية. تتحقق إعادة التعيين من النوع؛ ولا تُقبل سوى
boolوالأعداد وstrوbytearray. وللتحكم في الدقة المصيّرة لقيمة عشرية، قرّبها قبل التعيين، مثلًاrecord.value = round(x, 2).
- actuate¶
دالة رد النداء المُمرَّرة وقت الإنشاء. ويمكن إعادة تعيينها أثناء التشغيل.
- class senml.SenmlBase¶
صنف أساسي مشترك تتشاركه
SenmlPackوSenmlRecord. لا يكشف عن أي واجهة برمجية عامة خاصة به؛ وهو موجود حتى تتمكنSenmlPack.add()من التحقق من أن عنصرًا ما ينتمي إلى التسلسل الهرمي لـ SenML.
- class senml.SenmlUnits¶
صنف فضاء أسماء تكون سماته الصنفية رموز وحدات SenML المعرّفة في RFC 8428. تُحلّ كل سمة إلى الرمز النصي للوحدة، وهو مناسب للتعيين إلى
SenmlRecord.unitأوSenmlPack.base_unit.