diff --git a/pyproject.toml b/pyproject.toml index b0a221c..45c9db1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "meshcore" -version = "1.9.8.dev5" +version = "1.9.8.dev6" authors = [ { name="Florent de Lamotte", email="florent@frizoncorrea.fr" }, { name="Alex Wolden", email="awolden@gmail.com" }, diff --git a/src/meshcore/lpp_json_encoder.py b/src/meshcore/lpp_json_encoder.py new file mode 100644 index 0000000..6b330c0 --- /dev/null +++ b/src/meshcore/lpp_json_encoder.py @@ -0,0 +1,56 @@ +from cayennelpp import LppFrame, LppData +from cayennelpp.lpp_type import LppType + +# type name "how to display vale" +# display : None: (use lib default), []: only one value to display, ["field1", "field2" ...]: meaning of each field +my_lpp_types = { + 0: ('digital input', []), + 1: ('digital output', []), + 2: ('analog input', []), + 3: ('analog output', []), + 100: ('generic sensor', []), + 101: ('illuminance', []), + 102: ('presence', []), + 103: ('temperature', []), + 104: ('humidity', []), + 113: ('accelerometer', ["acc_x", "acc_y", "acc_z"]), + 115: ('barometer', []), + 116: ('voltage', []), + 117: ('current', []), + 118: ('frequency', []), + 120: ('percentage', []), + 121: ('altitude', []), + 122: ('load', []), + 125: ('concentration', []), + 128: ('power', []), + 130: ('distance', []), + 131: ('energy', []), + 132: ('direction', None), + 133: ('time', []), + 134: ('gyrometer', None), + 135: ('colour', ["red", "green", "blue"]), + 136: ('gps', ["latitude", "longitude", "altitude"]), + 142: ('switch', []), +} + +def lpp_json_encoder (obj) : + """Encode LppType, LppData, and LppFrame to JSON.""" + if isinstance(obj, LppFrame): + return obj.data + if isinstance(obj, LppType): + return my_lpp_types[obj.type][0] + if isinstance(obj, LppData): + d = {"channel" : obj.channel, "type" : obj.type} + if my_lpp_types[obj.type.type][1] is None : + d["value"] = obj.value + elif len(my_lpp_types[obj.type.type][1]) == 0 : + d["value"] = obj.value[0] + else : + val_dict = {} + i = 0 + for t in my_lpp_types[obj.type.type][1] : + val_dict[t] = obj.value[i] + i = i + 1 + d["value"] = val_dict + return d + raise TypeError(repr(obj) + " is not JSON serialized") \ No newline at end of file diff --git a/src/meshcore/reader.py b/src/meshcore/reader.py index 1cc8499..11eb668 100644 --- a/src/meshcore/reader.py +++ b/src/meshcore/reader.py @@ -2,10 +2,11 @@ import sys import logging import asyncio import json -from cayennelpp import LppFrame, LppData, LppUtil +from cayennelpp import LppFrame, LppData from typing import Any, Optional, Dict from .events import Event, EventType, EventDispatcher from .packets import PacketType +from meshcore.lpp_json_encoder import lpp_json_encoder logger = logging.getLogger("meshcore") @@ -408,7 +409,7 @@ class MessageReader: data.append(lppdata) i = i + len(lppdata) - lpp = json.loads(json.dumps(LppFrame(data), default=LppUtil.json_encode_type_str)) + lpp = json.loads(json.dumps(LppFrame(data), default=lpp_json_encoder)) res["lpp"] = lpp