New apps Added
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
"""Versatile Thermostat compatibility layer.
|
||||
|
||||
This module provides backward-compatible access to VTherm attributes
|
||||
to support both legacy versions (pre-v8.0.0) and new versions (v8.0.0+).
|
||||
|
||||
In v8.0.0+, many attributes were moved under a 'specific_states' nested object.
|
||||
This module abstracts that change to maintain compatibility.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from homeassistant.core import State
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def get_vtherm_attribute(
|
||||
state: State | None,
|
||||
attribute_name: str,
|
||||
default: Any = None,
|
||||
) -> Any:
|
||||
"""Get a VTherm attribute with backward compatibility.
|
||||
|
||||
Tries to read from the new nested path first (v8.0.0+):
|
||||
state.attributes["specific_states"][attribute_name]
|
||||
|
||||
Falls back to the legacy root path (pre-v8.0.0):
|
||||
state.attributes[attribute_name]
|
||||
|
||||
Args:
|
||||
state: The VTherm entity state object
|
||||
attribute_name: Name of the attribute to retrieve
|
||||
default: Default value if attribute not found
|
||||
|
||||
Returns:
|
||||
The attribute value, or default if not found
|
||||
|
||||
Examples:
|
||||
>>> # Works with v8.0.0+ (nested structure)
|
||||
>>> get_vtherm_attribute(state, "temperature_slope")
|
||||
0.04
|
||||
|
||||
>>> # Also works with pre-v8.0.0 (flat structure)
|
||||
>>> get_vtherm_attribute(state, "temperature_slope")
|
||||
0.04
|
||||
"""
|
||||
if not state or not state.attributes:
|
||||
return default
|
||||
|
||||
# Try new nested path first (v8.0.0+)
|
||||
specific_states = state.attributes.get("specific_states")
|
||||
if specific_states and isinstance(specific_states, dict):
|
||||
value = specific_states.get(attribute_name)
|
||||
if value is not None:
|
||||
_LOGGER.debug(
|
||||
"Found %s in specific_states (v8.0.0+ format): %s",
|
||||
attribute_name,
|
||||
value,
|
||||
)
|
||||
return value
|
||||
|
||||
# Fallback to legacy root path (pre-v8.0.0)
|
||||
value = state.attributes.get(attribute_name)
|
||||
if value is not None:
|
||||
_LOGGER.debug(
|
||||
"Found %s at root level (legacy format): %s",
|
||||
attribute_name,
|
||||
value,
|
||||
)
|
||||
return value
|
||||
|
||||
_LOGGER.debug(
|
||||
"Attribute %s not found in state %s, using default: %s",
|
||||
attribute_name,
|
||||
state.entity_id,
|
||||
default,
|
||||
)
|
||||
return default
|
||||
Reference in New Issue
Block a user