senml — Sensor Markup Language

이 모듈은 Sensor Markup Language(SenML, RFC 8428)를 위한 작은 인코더/디코더를 구현합니다. SenML은 센서 측정값과 장치 매개변수를 위한 미디어 타입입니다. 각 “pack”은 “record”의 리스트이며, 모든 record는 이름, 단위, 값, 타임스탬프 및 선택적 합계를 담고 있습니다.

이 구현은 JSON과 CBOR 표현을 모두 지원하며, pack을 중첩할 수 있어 하나의 루트 pack이 여러 장치를 관리하는 게이트웨이를 기술할 수 있습니다. 인바운드 페이로드는 기존 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을 포함할 때는 게이트웨이 역할을 합니다.

name 은 이 pack에 포함된 모든 record에 사용되는 SenML 기본 이름(bn)입니다.

callback 은 인바운드 record가 이전에 알려지지 않은 센서를 가리킬 때마다 from_json / from_cbor 에서 호출됩니다. 새로운 SenmlRecord 가 첫 번째 인수로 전달되며, (중첩된 pack의 경우) 발신 장치 pack이 device=... 로 전달됩니다. 일반적으로 액추에이터 명령을 처리하는 데 사용됩니다.

SenmlPack 인스턴스는 반복 가능하며 – 반복하면 삽입 순서대로 각 record를 산출합니다 – 컨텍스트 관리자로 사용할 수 있어 종료 시 pack이 자신을 부모로부터 제거합니다.

name: str

pack의 기본 이름(bn)입니다.

base_value: int | float | None

인코딩 시 각 record의 숫자 값에 더해지고 디코딩 시 빼지는 선택적 기본 값(bv)입니다. 숫자가 아닌 값을 설정하면 Exception 이 발생합니다.

base_time: int | float | None

각 record의 타임스탬프에 더해지는 선택적 기본 시간(bt)입니다.

base_sum: int | float | None

각 record의 sum 필드에 더해지는 선택적 기본 합계(bs)입니다.

base_unit: str | None

선택적 기본 단위(bu) – 일반적으로 SenmlUnits 의 값입니다.

actuate

생성 시 제공된 콜백입니다. 런타임에 다시 할당할 수 있습니다.

add(item: SenmlRecord | SenmlPack) None

item 을 이 pack에 추가합니다. itemSenmlRecord 또는 다른 SenmlPack 이어야 하며, 이미 다른 부모에 속해 있어서는 안 됩니다. 그렇지 않으면 Exception 이 발생합니다.

remove(item: SenmlRecord | SenmlPack) None

item 을 이 pack에서 제거합니다. item 이 이 pack의 자식이 아니면 Exception 이 발생합니다.

clear() None

이 pack에서 모든 record/하위 pack을 제거하고 부모 참조에서 분리합니다.

from_json(data: str) None

SenML/JSON 문서를 파싱하여 record를 이 pack에 병합합니다. (이름으로 일치하여) 이미 존재하는 record는 SenmlRecord.do_actuate() 를 트리거하고, 새 record는 추가되며 pack 수준의 callback 이 호출됩니다.

to_json() str

pack과 그 자식을 SenML/JSON 문자열로 렌더링합니다.

from_cbor(data: bytes) None

SenML/CBOR 바이트 문자열을 파싱하여 record를 이 pack에 병합합니다.

to_cbor() bytes

pack과 그 자식을 SenML/CBOR 바이트 문자열로 렌더링합니다.

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

인바운드 데이터를 파싱하는 동안 기존 record와 일치하는 항목이 없을 때 호출되는 내부 헬퍼입니다. 새로운 SenmlRecorddevice (또는 이 pack)에 추가하고 이를 callback 으로 전달합니다.

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

SenmlPack 내부의 단일 측정값을 나타냅니다.

name 은 SenML record 이름(n)입니다.

다음 키워드 인수가 허용됩니다:

  • valuebool, int, float, str 또는 bytearray. 다른 타입은 Exception 을 발생시킵니다.

  • time – 숫자 타임스탬프(t)입니다.

  • unit – 단위 문자열이며, 일반적으로 SenmlUnits 의 멤버입니다.

  • sum – 숫자로 적분된 합계(s)입니다.

  • update_time – 센서가 새로운 측정값을 제공하기까지의 최대 시간(ut)입니다.

  • callback – 인바운드 페이로드가 이 record를 갱신할 때 호출되는 함수입니다. SenmlRecord 를 유일한 인수로 받습니다.

SenmlRecord 는 컨텍스트 관리자로 사용할 수 있어 종료 시 자신을 부모 pack에서 제거합니다.

name: str

record 이름(n)입니다.

value

현재 값입니다. 다시 할당하면 타입을 검사하며, bool, 숫자, strbytearray 만 허용됩니다. 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

생성 시 제공된 콜백입니다. 런타임에 다시 할당할 수 있습니다.

do_actuate(raw: dict, naming_map: dict) None

원시 인바운드 SenML 딕셔너리로 이 record를 갱신하고, 존재하는 경우 액추에이트 콜백을 호출합니다.

class senml.SenmlBase

SenmlPackSenmlRecord 가 공유하는 공통 기본 클래스입니다. 자체적인 공개 API는 노출하지 않으며, SenmlPack.add() 가 항목이 SenML 계층에 속하는지 검증할 수 있도록 존재합니다.

class senml.SenmlUnits

클래스 속성이 RFC 8428 에 정의된 SenML 단위 기호인 네임스페이스 클래스입니다. 각 속성은 해당 단위의 문자열 코드로 해석되며, 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" – 휘도.

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" – 미터당 지멘스(전기 전도율).