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 מסיר את עצמו מההורה שלו.

name: str

שם הבסיס של ה-pack (bn).

base_value: int | float | None

ערך בסיס אופציונלי (bv) שמתווסף לערך המספרי של כל record בעת הקידוד ומחוסר בעת הפענוח. הגדרת ערך לא מספרי מעלה Exception.

base_time: int | float | None

זמן בסיס אופציונלי (bt) שמתווסף לחותמת הזמן של כל record.

base_sum: int | float | None

סכום בסיס אופציונלי (bs) שמתווסף לשדה הסכום של כל record.

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 זה.

clear() None

מסיר כל record/sub-pack מ-pack זה ומנתק אותם מהפניית ההורה שלהם.

from_json(data: str) None

מנתח מסמך SenML/JSON וממזג את ה-records ל-pack זה. records שכבר קיימים (תואמים לפי שם) מפעילים את SenmlRecord.do_actuate(); records חדשים מצורפים וה-callback ברמת ה-pack מופעלת.

to_json() str

מעבד את ה-pack ואת בניו למחרוזת SenML/JSON.

from_cbor(data: bytes) None

מנתח מחרוזת בייטים של SenML/CBOR וממזג את ה-records ל-pack זה.

to_cbor() bytes

מעבד את ה-pack ואת בניו למחרוזת בייטים של SenML/CBOR.

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

פונקציית עזר פנימית המופעלת בעת ניתוח נתונים נכנסים כאשר אף record קיים אינו תואם לרשומה. מוסיפה SenmlRecord חדש ל-device (או ל-pack זה) ומעבירה אותו ל-callback.

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

מייצג מדידה יחידה בתוך SenmlPack.

name הוא שם ה-record של SenML (n).

הארגומנטים הבאים, מסוג מילת מפתח, מתקבלים:

  • valuebool, int, float, str או bytearray. סוגים אחרים מעלים Exception.

  • time – חותמת זמן מספרית (t).

  • unit – מחרוזת יחידה, בדרך כלל חבר ב-SenmlUnits.

  • sum – סכום משולב מספרי (s).

  • update_time – הזמן המרבי לפני שהחיישן יספק קריאה חדשה (ut).

  • callback – פונקציה המופעלת כאשר מטען נכנס מעדכן record זה. היא מקבלת את ה-SenmlRecord כארגומנט היחיד שלה.

ניתן להשתמש ב-SenmlRecord כמנהל הקשר (context manager) כך שביציאה הוא מסיר את עצמו מה-pack ההורה שלו.

name: str

שם ה-record (n).

value

הערך הנוכחי. הקצאה מחדש בודקת את הסוג; מתקבלים רק bool, מספרים, str ו-bytearray. כדי לשלוט בדיוק המעובד של ערך float, עגלו לפני ההקצאה, למשל record.value = round(x, 2).

unit: str | None

מחרוזת יחידה (u).

time: int | float | None

חותמת זמן המשויכת למדידה זו (t).

update_time: int | float | None

הזמן המרבי לפני שהחיישן יספק קריאה מעודכנת (ut).

sum: int | float | None

שדה הסכום המשולב (s).

actuate

ה-callback שסופקה בזמן הבנייה. ניתן להקצותה מחדש בזמן ריצה.

do_actuate(raw: dict, naming_map: dict) None

מעדכן record זה ממילון SenML גולמי נכנס, ואם קיימת, מפעיל את פונקציית ה-actuate callback.

class senml.SenmlBase

מחלקת בסיס משותפת ל-SenmlPack ו-SenmlRecord. היא אינה חושפת API ציבורי משלה; היא קיימת כדי ש-SenmlPack.add() תוכל לאמת שפריט שייך להיררכיית SenML.

class senml.SenmlUnits

מחלקת מרחב שמות שתכונות המחלקה שלה הן סמלי יחידות SenML המוגדרים על ידי RFC 8428. כל תכונה מתורגמת לקוד המחרוזת של היחידה, המתאים להקצאה ל-SenmlRecord.unit או ל-SenmlPack.base_unit.

SENML_UNIT_METER: str

"m" – מטר.

SENML_UNIT_KILOGRAM: str

"kg" – קילוגרם.

SENML_UNIT_GRAM: str

"g" – גרם.

SENML_UNIT_SECOND: str

"s" – שנייה.

SENML_UNIT_AMPERE: str

"A" – אמפר.

SENML_UNIT_KELVIN: str

"K" – קלווין.

SENML_UNIT_CANDELA: str

"cd" – קנדלה.

SENML_UNIT_MOLE: str

"mol" – מול.

SENML_UNIT_HERTZ: str

"Hz" – הרץ.

SENML_UNIT_RADIAN: str

"rad" – רדיאן.

SENML_UNIT_STERADIAN: str

"sr" – סטרדיאן.

SENML_UNIT_NEWTON: str

"N" – ניוטון.

SENML_UNIT_PASCAL: str

"Pa" – פסקל.

SENML_UNIT_JOULE: str

"J" – ג’אול.

SENML_UNIT_WATT: str

"W" – ואט.

SENML_UNIT_COULOMB: str

"C" – קולון.

SENML_UNIT_VOLT: str

"V" – וולט.

SENML_UNIT_FARAD: str

"F" – פאראד.

SENML_UNIT_OHM: str

"Ohm" – אוהם.

SENML_UNIT_SIEMENS: str

"S" – סימנס.

SENML_UNIT_WEBER: str

"Wb" – ובר.

SENML_UNIT_TESLA: str

"T" – טסלה.

SENML_UNIT_HENRY: str

"H" – הנרי.

SENML_UNIT_DEGREES_CELSIUS: str

"Cel" – מעלות צלזיוס.

SENML_UNIT_LUMEN: str

"lm" – לומן.

SENML_UNIT_LUX: str

"lx" – לוקס.

SENML_UNIT_BECQUEREL: str

"Bq" – בקרל.

SENML_UNIT_GRAY: str

"Gy" – גריי.

SENML_UNIT_SIEVERT: str

"Sv" – סיוורט.

SENML_UNIT_KATAL: str

"kat" – קטל.

SENML_UNIT_SQUARE_METER: str

"m2" – מטר רבוע.

SENML_UNIT_CUBIC_METER: str

"m3" – מטר מעוקב.

SENML_UNIT_LITER: str

"l" – ליטר.

SENML_UNIT_VELOCITY: str

"m/s" – מהירות.

SENML_UNIT_ACCELERATION: str

"m/s2" – תאוצה.

SENML_UNIT_CUBIC_METER_PER_SECOND: str

"m3/s" – ספיקה נפחית.

SENML_UNIT_LITER_PER_SECOND: str

"l/s" – ליטר לשנייה.

SENML_UNIT_WATT_PER_SQUARE_METER: str

"W/m2" – עוצמת קרינה.

SENML_UNIT_CANDELA_PER_SQUARE_METER: str

"cd/m2" – בהירות (luminance).

SENML_UNIT_BIT: str

"bit" – ביט.

SENML_UNIT_BIT_PER_SECOND: str

"bit/s" – ביט לשנייה.

SENML_UNIT_DEGREES_LATITUDE: str

"lat" – מעלות קו רוחב.

SENML_UNIT_DEGREES_LONGITUDE: str

"lon" – מעלות קו אורך.

SENML_UNIT_PH: str

"pH" – חומציות (pH).

SENML_UNIT_DECIBEL: str

"db" – דציבל.

SENML_UNIT_DECIBEL_RELATIVE_TO_1_W: str

"dBW" – דציבל יחסית ל-1 W.

SENML_UNIT_BEL: str

"Bspl" – בל (רמת לחץ קול).

SENML_UNIT_COUNTER: str

"count" – מונה.

SENML_UNIT_RATIO: str

"//" – יחס (חסר ממדים).

SENML_UNIT_RELATIVE_HUMIDITY: str

"%RH" – לחות יחסית.

SENML_UNIT_PERCENTAGE_REMAINING_BATTERY_LEVEL: str

"%EL" – רמת סוללה נותרת באחוזים.

SENML_UNIT_SECONDS_REMAINING_BATTERY_LEVEL: str

"EL" – רמת סוללה נותרת בשניות.

SENML_UNIT_EVENT_RATE_PER_SECOND: str

"1/s" – קצב אירועים לשנייה.

SENML_UNIT_EVENT_RATE_PER_MINUTE: str

"1/min" – קצב אירועים לדקה.

SENML_UNIT_BPM: str

"beat/min" – פעימות לדקה.

SENML_UNIT_BEATS: str

"beats" – פעימות.

SENML_UNIT_SIEMENS_PER_METER: str

"S/m" – סימנס למטר (מוליכות חשמלית).