forked from platypush/platypush
Better way of handling with RawSensor
in bluetooth
integration.
This commit is contained in:
parent
a5a923a752
commit
9776921836
1 changed files with 20 additions and 5 deletions
|
@ -40,6 +40,17 @@ class TheengsEntity:
|
||||||
model_id: Optional[str] = None
|
model_id: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
|
# pylint: disable=too-few-public-methods
|
||||||
|
class NullSensor:
|
||||||
|
"""
|
||||||
|
Dummy class to model sensors with null values (hence without sufficient
|
||||||
|
information for the application to infer the type).
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, *_, **__):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# Maps property names to transformer methods (first mapper choice).
|
# Maps property names to transformer methods (first mapper choice).
|
||||||
_property_to_entity: Dict[str, Callable[[Any, Dict[str, Any]], Entity]] = {
|
_property_to_entity: Dict[str, Callable[[Any, Dict[str, Any]], Entity]] = {
|
||||||
'battery': lambda value, conf: Battery(
|
'battery': lambda value, conf: Battery(
|
||||||
|
@ -96,6 +107,9 @@ _value_type_to_entity: Dict[type, Callable[[Any, Dict[str, Any]], Entity]] = {
|
||||||
bool: lambda value, _: BinarySensor(value=value),
|
bool: lambda value, _: BinarySensor(value=value),
|
||||||
int: lambda value, _: NumericSensor(value=value),
|
int: lambda value, _: NumericSensor(value=value),
|
||||||
float: lambda value, _: NumericSensor(value=value),
|
float: lambda value, _: NumericSensor(value=value),
|
||||||
|
str: lambda value, _: RawSensor(value=value),
|
||||||
|
bytes: lambda value, _: RawSensor(value=value),
|
||||||
|
bytearray: lambda value, _: RawSensor(value=value),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,8 +140,8 @@ def device_to_entity(device: BLEDevice, data: AdvertisementData) -> BluetoothDev
|
||||||
# If not, check if we can infer an entity mapper from the value type.
|
# If not, check if we can infer an entity mapper from the value type.
|
||||||
_value_type_to_entity.get(
|
_value_type_to_entity.get(
|
||||||
type(theengs_entity.data.get(name)),
|
type(theengs_entity.data.get(name)),
|
||||||
# If not, default to a raw sensor.
|
# If not, default to a NullSensor.
|
||||||
lambda value, _: RawSensor(value=value),
|
lambda *_: NullSensor(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)(theengs_entity.data.get(name), conf)
|
)(theengs_entity.data.get(name), conf)
|
||||||
|
@ -135,6 +149,10 @@ def device_to_entity(device: BLEDevice, data: AdvertisementData) -> BluetoothDev
|
||||||
}
|
}
|
||||||
|
|
||||||
for prop, entity in parsed_entities.items():
|
for prop, entity in parsed_entities.items():
|
||||||
|
if isinstance(entity, NullSensor):
|
||||||
|
# Skip entities that we couldn't parse.
|
||||||
|
continue
|
||||||
|
|
||||||
entity.id = f'{parent_entity.id}:{prop}'
|
entity.id = f'{parent_entity.id}:{prop}'
|
||||||
entity.name = prop
|
entity.name = prop
|
||||||
parent_entity.children.append(entity)
|
parent_entity.children.append(entity)
|
||||||
|
@ -169,10 +187,7 @@ def _parse_advertisement_data(data: AdvertisementData) -> TheengsEntity:
|
||||||
entity_args['name'] = data.local_name
|
entity_args['name'] = data.local_name
|
||||||
|
|
||||||
if entity_args:
|
if entity_args:
|
||||||
# print('==== DECODING: ====')
|
|
||||||
# print(entity_args)
|
|
||||||
encoded_ret = decodeBLE(json.dumps(entity_args))
|
encoded_ret = decodeBLE(json.dumps(entity_args))
|
||||||
# print('==== DECODED! ====')
|
|
||||||
|
|
||||||
if encoded_ret:
|
if encoded_ret:
|
||||||
entity_args = json.loads(encoded_ret)
|
entity_args = json.loads(encoded_ret)
|
||||||
|
|
Loading…
Reference in a new issue