forked from platypush/platypush
Support for values passed in dict format to ThreeAxisSensor
This commit is contained in:
parent
5a6f4bcf57
commit
8d4aa310f4
1 changed files with 25 additions and 10 deletions
|
@ -1,7 +1,8 @@
|
||||||
|
from typing import Iterable, Mapping, Optional, Union
|
||||||
from sqlalchemy import Column, Integer, ForeignKey
|
from sqlalchemy import Column, Integer, ForeignKey
|
||||||
from sqlalchemy.orm import reconstructor, validates
|
|
||||||
|
|
||||||
from platypush.common.db import Base
|
from platypush.common.db import Base
|
||||||
|
from platypush.common.sensors import Numeric
|
||||||
|
|
||||||
from .sensors import RawSensor
|
from .sensors import RawSensor
|
||||||
|
|
||||||
|
@ -23,16 +24,30 @@ if 'three_axis_sensor' not in Base.metadata:
|
||||||
'polymorphic_identity': __tablename__,
|
'polymorphic_identity': __tablename__,
|
||||||
}
|
}
|
||||||
|
|
||||||
@validates('_value')
|
@RawSensor.value.setter
|
||||||
def check_value(self, _, value):
|
def value(
|
||||||
|
self, value: Optional[Union[Iterable[Numeric], Mapping[str, Numeric]]]
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Validates and normalizes the given value to a list of 3 numeric
|
||||||
|
values.
|
||||||
|
"""
|
||||||
|
if value is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if isinstance(value, dict):
|
||||||
|
assert set(value.keys()) == {
|
||||||
|
'x',
|
||||||
|
'y',
|
||||||
|
'z',
|
||||||
|
}, f'Invalid keys for entity of type {self.__class__}: "{value}"'
|
||||||
|
|
||||||
|
value = [value[k] for k in ['x', 'y', 'z']] # type: ignore
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
isinstance('_value', (list, tuple))
|
isinstance(value, (list, tuple))
|
||||||
and len(value) == 3
|
and len(value) == 3 # type: ignore
|
||||||
and all(isinstance(v, (int, float)) for v in value)
|
and all(isinstance(v, (int, float)) for v in value)
|
||||||
), f'Invalid 3-axis value: {value}'
|
), f'Invalid 3-axis value: {value}'
|
||||||
|
|
||||||
return list(value)
|
super(ThreeAxisSensor, type(self)).value.fset(self, value) # type: ignore
|
||||||
|
|
||||||
@reconstructor
|
|
||||||
def post_init(self):
|
|
||||||
self.is_json = True
|
|
||||||
|
|
Loading…
Reference in a new issue