senml — שפת סימון לחיישנים (Sensor Markup Language)¶
מודול זה מממש מקודד/מפענח קטן עבור Sensor Markup Language (SenML, RFC 8428). SenML הוא סוג מדיה למדידות חיישנים ולפרמטרים של התקנים: כל ”pack“ הוא רשימה של ”records“, כאשר כל record נושא שם, יחידה, ערך, חותמת זמן וסכום אופציונלי.
המימוש תומך הן בייצוג JSON והן בייצוג CBOR, ומאפשר לקנן packs כך ש-pack שורש יחיד יכול לתאר שער (gateway) שמייצג מספר התקנים. מטענים נכנסים יכולים להפעיל פונקציות callback של מפעילים על records קיימים.
דוגמה לשימוש:
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 מכיל records בלבד הוא מייצג התקן יחיד; כאשר הוא מכיל packs אחרים הוא משמש כשער (gateway).name הוא שם הבסיס של SenML (
bn) שבו משתמש כל record שמכיל pack זה.callback מופעלת מתוך
from_json/from_cborבכל פעם שרשומה נכנסת מציינת חיישן שלא היה ידוע קודם; ה-SenmlRecordהחדש מועבר כארגומנט הראשון, ו(עבור packs מקוננים) ה-pack של ההתקן המקורי מועבר כ-device=.... בדרך כלל היא משמשת לטיפול בפקודות למפעילים.מופעי
SenmlPackניתנים לאיטרציה – האיטרציה מחזירה כל record בסדר ההכנסה – וניתן להשתמש בהם כמנהל הקשר (context manager) כך שביציאה ה-pack מסיר את עצמו מההורה שלו.- base_value: int | float | None¶
ערך בסיס אופציונלי (
bv) שמתווסף לערך המספרי של כל record בעת הקידוד ומחוסר בעת הפענוח. הגדרת ערך לא מספרי מעלהException.
- base_unit: str | None¶
יחידת בסיס אופציונלית (
bu) – בדרך כלל ערך מתוךSenmlUnits.
- actuate¶
ה-callback שסופקה בזמן הבנייה. ניתן להקצותה מחדש בזמן ריצה.
- add(item: SenmlRecord | SenmlPack) None¶
מצרף את item ל-pack זה. item חייב להיות
SenmlRecordאוSenmlPackאחר ואסור שכבר ישתייך להורה אחר; אחרת מועלהException.
- remove(item: SenmlRecord | SenmlPack) None¶
מסיר את item מ-pack זה.
Exceptionמועלה אם item אינו בן של pack זה.
- from_json(data: str) None¶
מנתח מסמך SenML/JSON וממזג את ה-records ל-pack זה. records שכבר קיימים (תואמים לפי שם) מפעילים את
SenmlRecord.do_actuate(); records חדשים מצורפים וה-callback ברמת ה-pack מופעלת.
- class senml.SenmlRecord(name: str, **kwargs)¶
מייצג מדידה יחידה בתוך
SenmlPack.name הוא שם ה-record של SenML (
n).הארגומנטים הבאים, מסוג מילת מפתח, מתקבלים:
value –
bool,int,float,strאוbytearray. סוגים אחרים מעליםException.time – חותמת זמן מספרית (
t).unit – מחרוזת יחידה, בדרך כלל חבר ב-
SenmlUnits.sum – סכום משולב מספרי (
s).update_time – הזמן המרבי לפני שהחיישן יספק קריאה חדשה (
ut).callback – פונקציה המופעלת כאשר מטען נכנס מעדכן record זה. היא מקבלת את ה-
SenmlRecordכארגומנט היחיד שלה.
ניתן להשתמש ב-
SenmlRecordכמנהל הקשר (context manager) כך שביציאה הוא מסיר את עצמו מה-pack ההורה שלו.- value¶
הערך הנוכחי. הקצאה מחדש בודקת את הסוג; מתקבלים רק
bool, מספרים,strו-bytearray. כדי לשלוט בדיוק המעובד של ערך float, עגלו לפני ההקצאה, למשלrecord.value = round(x, 2).
- actuate¶
ה-callback שסופקה בזמן הבנייה. ניתן להקצותה מחדש בזמן ריצה.
- class senml.SenmlBase¶
מחלקת בסיס משותפת ל-
SenmlPackו-SenmlRecord. היא אינה חושפת API ציבורי משלה; היא קיימת כדי ש-SenmlPack.add()תוכל לאמת שפריט שייך להיררכיית SenML.
- class senml.SenmlUnits¶
מחלקת מרחב שמות שתכונות המחלקה שלה הן סמלי יחידות SenML המוגדרים על ידי RFC 8428. כל תכונה מתורגמת לקוד המחרוזת של היחידה, המתאים להקצאה ל-
SenmlRecord.unitאו ל-SenmlPack.base_unit.