Skip to content

Commit 1af4239

Browse files
authored
Merge pull request #202 from Guzz-T/issue/190/data_vector
Support Smart-Home-Interface Part 4: Data vector classes
2 parents 43ca218 + 0bd99ac commit 1af4239

File tree

7 files changed

+821
-8
lines changed

7 files changed

+821
-8
lines changed

luxtronik/shi/constants.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
# Default offset for the input or holding indices
1212
LUXTRONIK_DEFAULT_DEFINITION_OFFSET: Final = 10000
1313

14+
# Identifier of holding data-vectors and partial name for unknown holding fields
15+
HOLDINGS_FIELD_NAME: Final = "holding"
16+
17+
# Identifier of input data-vectors and partial name for unknown input fields
18+
INPUTS_FIELD_NAME: Final = "input"
19+
1420
# Waiting time (in seconds) after writing the holdings
1521
# to give the controller time to recalculate values, etc.
1622
LUXTRONIK_WAIT_TIME_AFTER_HOLDING_WRITE: Final = 1
@@ -21,3 +27,9 @@
2127

2228
# First Luxtronik firmware version that supports the Smart Home Interface (SHI)
2329
LUXTRONIK_FIRST_VERSION_WITH_SHI: Final = (3, 90, 1, 0)
30+
31+
# Latest supported Luxtronik firmware version
32+
# Note:
33+
# No checks are performed against this version.
34+
# This is merely the default value if no version is specified.
35+
LUXTRONIK_LATEST_SHI_VERSION: Final = (3, 92, 0, 0)

luxtronik/shi/definitions.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,10 @@ def __init__(self):
203203
def __getitem__(self, name_or_idx):
204204
return self.get(name_or_idx)
205205

206-
def __contains__(self, name_or_idx):
207-
return self._get(name_or_idx) is not None
206+
def __contains__(self, def_name_or_idx):
207+
if isinstance(def_name_or_idx, LuxtronikDefinition):
208+
return any(def_name_or_idx is d for d in self._index_dict.values())
209+
return self._get(def_name_or_idx) is not None
208210

209211
def _add_alias(self, definition, alias):
210212
"""
@@ -410,11 +412,15 @@ def __init__(self, definitions_list, name, offset=LUXTRONIK_DEFAULT_DEFINITION_O
410412
# The correct sorting has already been ensured by the pytest
411413
for item in definitions_list:
412414
d = LuxtronikDefinition(item, name, offset)
413-
self._add(d)
415+
if d.valid:
416+
self._add(d)
414417

415418
def __getitem__(self, name_or_idx):
416419
return self.get(name_or_idx)
417420

421+
def __contains__(self, def_name_or_idx):
422+
return def_name_or_idx in self._lookup
423+
418424
def __len__(self):
419425
return len(self._definitions)
420426

@@ -488,13 +494,12 @@ def _add(self, definition):
488494
Args:
489495
definition (LuxtronikDefinition): Definition to add
490496
"""
491-
if definition.valid:
492-
self._definitions.append(definition)
493-
self._lookup.add(definition)
497+
self._definitions.append(definition)
498+
self._lookup.add(definition)
494499

495500
def add(self, data_dict):
496501
"""
497-
Add a custom (valid) definition
502+
Add a custom (valid) definition. Existing definitions will not be overwritten.
498503
499504
Args:
500505
data_dict (dict): Data for the definition to add
@@ -506,9 +511,11 @@ def add(self, data_dict):
506511
If multiple definitions added for the same index/name, the last added takes precedence.
507512
"""
508513
definition = LuxtronikDefinition(data_dict, self._name, self._offset)
514+
if not definition.valid:
515+
return None
509516
self._add(definition)
510517
self._definitions.sort(key=lambda item: item.index)
511-
return definition if definition.valid else None
518+
return definition
512519

513520

514521
###############################################################################

luxtronik/shi/holdings.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""Parse luxtronik Holdings."""
2+
3+
import logging
4+
from typing import Final
5+
6+
from luxtronik.definitions.holdings import HOLDINGS_DEFINITIONS_LIST, HOLDINGS_OFFSET
7+
8+
from luxtronik.shi.constants import HOLDINGS_FIELD_NAME
9+
from luxtronik.shi.definitions import LuxtronikDefinitionsList
10+
from luxtronik.shi.vector import DataVectorSmartHome
11+
12+
13+
HOLDINGS_DEFINITIONS: Final = LuxtronikDefinitionsList(
14+
HOLDINGS_DEFINITIONS_LIST,
15+
HOLDINGS_FIELD_NAME,
16+
HOLDINGS_OFFSET
17+
)
18+
19+
class Holdings(DataVectorSmartHome):
20+
"""Class that holds holding fields."""
21+
22+
logger = logging.getLogger("Luxtronik.Holdings")
23+
name = HOLDINGS_FIELD_NAME
24+
definitions = HOLDINGS_DEFINITIONS

luxtronik/shi/inputs.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""Parse luxtronik Inputs."""
2+
3+
import logging
4+
from typing import Final
5+
6+
from luxtronik.definitions.inputs import INPUTS_DEFINITIONS_LIST, INPUTS_OFFSET
7+
8+
from luxtronik.shi.constants import INPUTS_FIELD_NAME
9+
from luxtronik.shi.definitions import LuxtronikDefinitionsList
10+
from luxtronik.shi.vector import DataVectorSmartHome
11+
12+
13+
INPUTS_DEFINITIONS: Final = LuxtronikDefinitionsList(
14+
INPUTS_DEFINITIONS_LIST,
15+
INPUTS_FIELD_NAME,
16+
INPUTS_OFFSET
17+
)
18+
19+
class Inputs(DataVectorSmartHome):
20+
"""Class that holds input fields."""
21+
22+
logger = logging.getLogger("Luxtronik.Inputs")
23+
name = INPUTS_FIELD_NAME
24+
definitions = INPUTS_DEFINITIONS

0 commit comments

Comments
 (0)