Source code for ents.proto.decode

"""Module to decode soil power sensor messages"""

from google.protobuf.json_format import MessageToDict

from .soil_power_sensor_pb2 import Measurement, Response, UserConfiguration


[docs] def decode_response(data: bytes): """Decodes a Response message. Args: data: Byte array of Response message. Returns: Returns the ResponseType. Raises: KeyError: Missing the resp field. """ resp = Response() resp.ParseFromString(data) if not resp.HasField("resp"): raise KeyError("Missing response type") return resp.resp
[docs] def decode_measurement(data: bytes, raw: bool = True) -> dict: """Decodes a Measurement message The data is decoded into a flat dictionary with the measurement type. Args: data: Byte array of Measurement message. raw: Flag to return raw or adjusted measurements Returns: Flat dictionary of values from the meta field, measurement field, and the key "type" to indicate the type of measurement. Raises: KeyError: When the serialized data is missing a required field. """ # parse data meas = Measurement() meas.ParseFromString(data) # convert meta into dict if not meas.HasField("meta"): raise KeyError("Measurement missing metadata") meta_dict = MessageToDict(meas.meta, always_print_fields_with_no_presence=True) # decode measurement if not meas.HasField("measurement"): raise KeyError("Measurement missing data") measurement_type = meas.WhichOneof("measurement") measurement_dict = MessageToDict( getattr(meas, measurement_type), always_print_fields_with_no_presence=True ) # store measurement type meta_dict["type"] = measurement_type # store measurement data meta_dict["data"] = measurement_dict # process raw if not raw and meta_dict["type"] == "bme280": # convert measurements to hPa, C, and % meta_dict["data"]["pressure"] /= 10.0 meta_dict["data"]["temperature"] /= 100.0 meta_dict["data"]["humidity"] /= 1000.0 # store measurement type meta_dict["data_type"] = {} for key, value in measurement_dict.items(): meta_dict["data_type"][key] = type(value) return meta_dict
[docs] def decode_user_configuration(data: bytes) -> dict: """Decodes a UserConfiguration message Args: data: Byte array of UserConfiguration message. Returns: Dictionary of UserConfiguration values. Raises: KeyError: When the serialized data is missing a required field. """ user_config = UserConfiguration() user_config.ParseFromString(data) if user_config.cell_id == 0 or user_config.logger_id == 0: raise KeyError("User configuration missing required fields") user_config_dict = MessageToDict( user_config, always_print_fields_with_no_presence=True ) return user_config_dict