mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-29 21:03:40 +00:00
feat(api): add multi-home support and diagnostic sensors
API Client:
- Changed async_get_price_info() to accept home_ids parameter
- Implemented _get_price_info_for_specific_homes() using GraphQL aliases
(home0: home(id: "abc") { ... }) for efficient multi-home queries
- Extended async_get_viewer_details() with comprehensive home metadata
(owner, address, meteringPointData, subscription, features)
- Removed deprecated async_get_data() method (combined query no longer needed)
- Updated _is_data_empty() to handle aliased response structure
Coordinator:
- Added _get_configured_home_ids() to collect all active config entries
- Modified _fetch_all_homes_data() to only query configured homes
- Added refresh_user_data() forcing user data refresh (bypasses cache)
- Improved get_user_profile() with detailed user info (name, login, accountType)
- Fixed get_user_homes() to extract from viewer object
Binary Sensors:
- Added has_ventilation_system sensor (home metadata)
- Added realtime_consumption_enabled sensor (features check)
- Refactored state getter mapping to dictionary pattern
Diagnostic Sensors (12 new):
- Home metadata: home_type, home_size, main_fuse_size, number_of_residents,
primary_heating_source
- Metering point: grid_company, grid_area_code, price_area_code,
consumption_ean, production_ean, energy_tax_type, vat_type,
estimated_annual_consumption
- Subscription: subscription_status
- Added available property override to hide diagnostic sensors with no data
Config Flow:
- Fixed subentry flow to exclude parent home_id from available homes
- Added debug logging for home title generation
Entity:
- Made attribution translatable (get_translation("attribution"))
- Removed hardcoded user name suffix from subentry device names
Impact: Enables multi-home setups with dedicated subentries. Each home gets
its own set of sensors and only configured homes are queried (reduces API
load). New diagnostic sensors provide comprehensive home metadata from Tibber
API. Users can track ventilation systems, heating types, metering point info,
and subscription status.
This commit is contained in:
parent
4e64cf7598
commit
63442dae1d
18 changed files with 1384 additions and 150 deletions
|
|
@ -187,47 +187,54 @@ def _is_data_empty(data: dict, query_type: str) -> bool:
|
|||
)
|
||||
|
||||
elif query_type == "price_info":
|
||||
# Check for homes existence and non-emptiness before accessing
|
||||
subscription = None
|
||||
if (
|
||||
"viewer" not in data
|
||||
or "homes" not in data["viewer"]
|
||||
or not isinstance(data["viewer"]["homes"], list)
|
||||
or len(data["viewer"]["homes"]) == 0
|
||||
or "currentSubscription" not in data["viewer"]["homes"][0]
|
||||
or data["viewer"]["homes"][0]["currentSubscription"] is None
|
||||
):
|
||||
_LOGGER.debug("Missing homes/currentSubscription in price_info check")
|
||||
# Check for home aliases (home0, home1, etc.)
|
||||
viewer = data.get("viewer", {})
|
||||
home_aliases = [key for key in viewer if key.startswith("home") and key[4:].isdigit()]
|
||||
|
||||
if not home_aliases:
|
||||
_LOGGER.debug("No home aliases found in price_info response")
|
||||
is_empty = True
|
||||
else:
|
||||
subscription = data["viewer"]["homes"][0]["currentSubscription"]
|
||||
# Check first home for valid data
|
||||
_LOGGER.debug("Checking price_info with %d home(s)", len(home_aliases))
|
||||
first_home = viewer.get(home_aliases[0])
|
||||
|
||||
# Check priceInfoRange (192 quarter-hourly intervals)
|
||||
has_historical = (
|
||||
"priceInfoRange" in subscription
|
||||
and subscription["priceInfoRange"] is not None
|
||||
and "edges" in subscription["priceInfoRange"]
|
||||
and subscription["priceInfoRange"]["edges"]
|
||||
)
|
||||
if (
|
||||
not first_home
|
||||
or "currentSubscription" not in first_home
|
||||
or first_home["currentSubscription"] is None
|
||||
):
|
||||
_LOGGER.debug("Missing currentSubscription in first home")
|
||||
is_empty = True
|
||||
else:
|
||||
subscription = first_home["currentSubscription"]
|
||||
|
||||
# Check priceInfo for today's data
|
||||
has_price_info = "priceInfo" in subscription and subscription["priceInfo"] is not None
|
||||
has_today = (
|
||||
has_price_info
|
||||
and "today" in subscription["priceInfo"]
|
||||
and subscription["priceInfo"]["today"] is not None
|
||||
and len(subscription["priceInfo"]["today"]) > 0
|
||||
)
|
||||
# Check priceInfoRange (192 quarter-hourly intervals)
|
||||
has_historical = (
|
||||
"priceInfoRange" in subscription
|
||||
and subscription["priceInfoRange"] is not None
|
||||
and "edges" in subscription["priceInfoRange"]
|
||||
and subscription["priceInfoRange"]["edges"]
|
||||
)
|
||||
|
||||
# Data is empty if we don't have historical data or today's data
|
||||
is_empty = not has_historical or not has_today
|
||||
# Check priceInfo for today's data
|
||||
has_price_info = "priceInfo" in subscription and subscription["priceInfo"] is not None
|
||||
has_today = (
|
||||
has_price_info
|
||||
and "today" in subscription["priceInfo"]
|
||||
and subscription["priceInfo"]["today"] is not None
|
||||
and len(subscription["priceInfo"]["today"]) > 0
|
||||
)
|
||||
|
||||
_LOGGER.debug(
|
||||
"Price info check - priceInfoRange: %s, today: %s, is_empty: %s",
|
||||
bool(has_historical),
|
||||
bool(has_today),
|
||||
is_empty,
|
||||
)
|
||||
# Data is empty if we don't have historical data or today's data
|
||||
is_empty = not has_historical or not has_today
|
||||
|
||||
_LOGGER.debug(
|
||||
"Price info check - priceInfoRange: %s, today: %s, is_empty: %s",
|
||||
bool(has_historical),
|
||||
bool(has_today),
|
||||
is_empty,
|
||||
)
|
||||
|
||||
elif query_type in ["daily", "hourly", "monthly"]:
|
||||
# Check for homes existence and non-emptiness before accessing
|
||||
|
|
@ -377,7 +384,7 @@ class TibberPricesApiClient:
|
|||
self._socket_connect_timeout = 5 # Socket connection timeout
|
||||
|
||||
async def async_get_viewer_details(self) -> Any:
|
||||
"""Test connection to the API."""
|
||||
"""Get comprehensive viewer and home details from Tibber API."""
|
||||
return await self._api_wrapper(
|
||||
data={
|
||||
"query": """
|
||||
|
|
@ -386,15 +393,63 @@ class TibberPricesApiClient:
|
|||
userId
|
||||
name
|
||||
login
|
||||
accountType
|
||||
homes {
|
||||
id
|
||||
type
|
||||
appNickname
|
||||
appAvatar
|
||||
size
|
||||
timeZone
|
||||
mainFuseSize
|
||||
numberOfResidents
|
||||
primaryHeatingSource
|
||||
hasVentilationSystem
|
||||
address {
|
||||
address1
|
||||
address2
|
||||
address3
|
||||
postalCode
|
||||
city
|
||||
country
|
||||
latitude
|
||||
longitude
|
||||
}
|
||||
owner {
|
||||
id
|
||||
firstName
|
||||
lastName
|
||||
isCompany
|
||||
name
|
||||
contactInfo {
|
||||
email
|
||||
mobile
|
||||
}
|
||||
language
|
||||
}
|
||||
meteringPointData {
|
||||
consumptionEan
|
||||
gridCompany
|
||||
gridAreaCode
|
||||
priceAreaCode
|
||||
productionEan
|
||||
energyTaxType
|
||||
vatType
|
||||
estimatedAnnualConsumption
|
||||
}
|
||||
currentSubscription {
|
||||
id
|
||||
status
|
||||
validFrom
|
||||
validTo
|
||||
priceInfo {
|
||||
current {
|
||||
currency
|
||||
}
|
||||
}
|
||||
}
|
||||
features {
|
||||
realTimeConsumptionEnabled
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -404,55 +459,90 @@ class TibberPricesApiClient:
|
|||
query_type=QueryType.USER,
|
||||
)
|
||||
|
||||
async def async_get_price_info(self) -> dict:
|
||||
"""Get price info data in flat format for all homes."""
|
||||
async def async_get_price_info(self, home_ids: set[str]) -> dict:
|
||||
"""
|
||||
Get price info data in flat format for specified homes.
|
||||
|
||||
Args:
|
||||
home_ids: Set of home IDs to fetch data for.
|
||||
|
||||
Returns:
|
||||
Dictionary with homes data keyed by home_id.
|
||||
|
||||
"""
|
||||
return await self._get_price_info_for_specific_homes(home_ids)
|
||||
|
||||
async def _get_price_info_for_specific_homes(self, home_ids: set[str]) -> dict:
|
||||
"""Get price info for specific homes using GraphQL aliases."""
|
||||
if not home_ids:
|
||||
return {"homes": {}}
|
||||
|
||||
# Build query with aliases for each home
|
||||
# Example: home1: home(id: "abc") { ... }
|
||||
home_queries = []
|
||||
for idx, home_id in enumerate(sorted(home_ids)):
|
||||
alias = f"home{idx}"
|
||||
home_query = f"""
|
||||
{alias}: home(id: "{home_id}") {{
|
||||
id
|
||||
consumption(resolution:DAILY,last:1) {{
|
||||
pageInfo{{currency}}
|
||||
}}
|
||||
currentSubscription {{
|
||||
priceInfoRange(resolution:QUARTER_HOURLY,last:192) {{
|
||||
edges{{node{{
|
||||
startsAt total energy tax level
|
||||
}}}}
|
||||
}}
|
||||
priceInfo(resolution:QUARTER_HOURLY) {{
|
||||
today{{startsAt total energy tax level}}
|
||||
tomorrow{{startsAt total energy tax level}}
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
"""
|
||||
home_queries.append(home_query)
|
||||
|
||||
query = "{viewer{" + "".join(home_queries) + "}}"
|
||||
|
||||
_LOGGER.debug("Fetching price info for %d specific home(s)", len(home_ids))
|
||||
|
||||
data = await self._api_wrapper(
|
||||
data={
|
||||
"query": """
|
||||
{viewer{homes{
|
||||
id
|
||||
consumption(resolution:DAILY,last:1){
|
||||
pageInfo{currency}
|
||||
}
|
||||
currentSubscription{
|
||||
priceInfoRange(resolution:QUARTER_HOURLY,last:192){
|
||||
edges{node{
|
||||
startsAt total energy tax level
|
||||
}}
|
||||
}
|
||||
priceInfo(resolution:QUARTER_HOURLY){
|
||||
today{startsAt total energy tax level}
|
||||
tomorrow{startsAt total energy tax level}
|
||||
}
|
||||
}
|
||||
}}}"""
|
||||
},
|
||||
data={"query": query},
|
||||
query_type=QueryType.PRICE_INFO,
|
||||
)
|
||||
homes = data.get("viewer", {}).get("homes", [])
|
||||
|
||||
# Parse aliased response
|
||||
viewer = data.get("viewer", {})
|
||||
homes_data = {}
|
||||
for home in homes:
|
||||
home_id = home.get("id")
|
||||
if home_id:
|
||||
if "currentSubscription" in home and home["currentSubscription"] is not None:
|
||||
# Extract currency from consumption data if available
|
||||
currency = None
|
||||
if home.get("consumption"):
|
||||
page_info = home["consumption"].get("pageInfo")
|
||||
if page_info:
|
||||
currency = page_info.get("currency")
|
||||
|
||||
homes_data[home_id] = _flatten_price_info(
|
||||
home["currentSubscription"],
|
||||
currency,
|
||||
)
|
||||
else:
|
||||
_LOGGER.debug(
|
||||
"Home %s has no active subscription - price data will be unavailable",
|
||||
home_id,
|
||||
)
|
||||
homes_data[home_id] = {}
|
||||
for idx, home_id in enumerate(sorted(home_ids)):
|
||||
alias = f"home{idx}"
|
||||
home = viewer.get(alias)
|
||||
|
||||
if not home:
|
||||
_LOGGER.debug("Home %s not found in API response", home_id)
|
||||
homes_data[home_id] = {}
|
||||
continue
|
||||
|
||||
if "currentSubscription" in home and home["currentSubscription"] is not None:
|
||||
# Extract currency from consumption data if available
|
||||
currency = None
|
||||
if home.get("consumption"):
|
||||
page_info = home["consumption"].get("pageInfo")
|
||||
if page_info:
|
||||
currency = page_info.get("currency")
|
||||
|
||||
homes_data[home_id] = _flatten_price_info(
|
||||
home["currentSubscription"],
|
||||
currency,
|
||||
)
|
||||
else:
|
||||
_LOGGER.debug(
|
||||
"Home %s has no active subscription - price data will be unavailable",
|
||||
home_id,
|
||||
)
|
||||
homes_data[home_id] = {}
|
||||
|
||||
data["homes"] = homes_data
|
||||
return data
|
||||
|
|
@ -553,40 +643,6 @@ class TibberPricesApiClient:
|
|||
data["homes"] = homes_data
|
||||
return data
|
||||
|
||||
async def async_get_data(self) -> dict:
|
||||
"""Get all data from the API by combining multiple queries in flat format for all homes."""
|
||||
price_info = await self.async_get_price_info()
|
||||
daily_rating = await self.async_get_daily_price_rating()
|
||||
hourly_rating = await self.async_get_hourly_price_rating()
|
||||
monthly_rating = await self.async_get_monthly_price_rating()
|
||||
|
||||
all_home_ids = set()
|
||||
all_home_ids.update(price_info.get("homes", {}).keys())
|
||||
all_home_ids.update(daily_rating.get("homes", {}).keys())
|
||||
all_home_ids.update(hourly_rating.get("homes", {}).keys())
|
||||
all_home_ids.update(monthly_rating.get("homes", {}).keys())
|
||||
|
||||
homes_combined = {}
|
||||
for home_id in all_home_ids:
|
||||
daily_data = daily_rating.get("homes", {}).get(home_id, {})
|
||||
hourly_data = hourly_rating.get("homes", {}).get(home_id, {})
|
||||
monthly_data = monthly_rating.get("homes", {}).get(home_id, {})
|
||||
|
||||
price_rating = {
|
||||
"thresholdPercentages": daily_data.get("thresholdPercentages"),
|
||||
"daily": daily_data.get("daily", []),
|
||||
"hourly": hourly_data.get("hourly", []),
|
||||
"monthly": monthly_data.get("monthly", []),
|
||||
"currency": (daily_data.get("currency") or hourly_data.get("currency") or monthly_data.get("currency")),
|
||||
}
|
||||
|
||||
homes_combined[home_id] = {
|
||||
"priceInfo": price_info.get("homes", {}).get(home_id, {}),
|
||||
"priceRating": price_rating,
|
||||
}
|
||||
|
||||
return {"homes": homes_combined}
|
||||
|
||||
async def _make_request(
|
||||
self,
|
||||
headers: dict[str, str],
|
||||
|
|
|
|||
|
|
@ -78,16 +78,16 @@ class TibberPricesBinarySensor(TibberPricesEntity, BinarySensorEntity):
|
|||
"""Return the appropriate state getter method based on the sensor type."""
|
||||
key = self.entity_description.key
|
||||
|
||||
if key == "peak_price_period":
|
||||
return self._peak_price_state
|
||||
if key == "best_price_period":
|
||||
return self._best_price_state
|
||||
if key == "connection":
|
||||
return lambda: True if self.coordinator.data else None
|
||||
if key == "tomorrow_data_available":
|
||||
return self._tomorrow_data_available_state
|
||||
state_getters = {
|
||||
"peak_price_period": self._peak_price_state,
|
||||
"best_price_period": self._best_price_state,
|
||||
"connection": lambda: True if self.coordinator.data else None,
|
||||
"tomorrow_data_available": self._tomorrow_data_available_state,
|
||||
"has_ventilation_system": self._has_ventilation_system_state,
|
||||
"realtime_consumption_enabled": self._realtime_consumption_enabled_state,
|
||||
}
|
||||
|
||||
return None
|
||||
return state_getters.get(key)
|
||||
|
||||
def _best_price_state(self) -> bool | None:
|
||||
"""Return True if the current time is within a best price period."""
|
||||
|
|
@ -130,6 +130,50 @@ class TibberPricesBinarySensor(TibberPricesEntity, BinarySensorEntity):
|
|||
return False
|
||||
return False
|
||||
|
||||
def _has_ventilation_system_state(self) -> bool | None:
|
||||
"""Return True if the home has a ventilation system."""
|
||||
if not self.coordinator.data:
|
||||
return None
|
||||
|
||||
user_homes = self.coordinator.get_user_homes()
|
||||
if not user_homes:
|
||||
return None
|
||||
|
||||
home_id = self.coordinator.config_entry.data.get("home_id")
|
||||
if not home_id:
|
||||
return None
|
||||
|
||||
home_data = next((home for home in user_homes if home.get("id") == home_id), None)
|
||||
if not home_data:
|
||||
return None
|
||||
|
||||
value = home_data.get("hasVentilationSystem")
|
||||
return value if isinstance(value, bool) else None
|
||||
|
||||
def _realtime_consumption_enabled_state(self) -> bool | None:
|
||||
"""Return True if realtime consumption is enabled."""
|
||||
if not self.coordinator.data:
|
||||
return None
|
||||
|
||||
user_homes = self.coordinator.get_user_homes()
|
||||
if not user_homes:
|
||||
return None
|
||||
|
||||
home_id = self.coordinator.config_entry.data.get("home_id")
|
||||
if not home_id:
|
||||
return None
|
||||
|
||||
home_data = next((home for home in user_homes if home.get("id") == home_id), None)
|
||||
if not home_data:
|
||||
return None
|
||||
|
||||
features = home_data.get("features")
|
||||
if not features:
|
||||
return None
|
||||
|
||||
value = features.get("realTimeConsumptionEnabled")
|
||||
return value if isinstance(value, bool) else None
|
||||
|
||||
def _get_tomorrow_data_available_attributes(self) -> dict | None:
|
||||
"""Return attributes for tomorrow_data_available binary sensor."""
|
||||
return get_tomorrow_data_available_attributes(self.coordinator.data)
|
||||
|
|
|
|||
|
|
@ -41,6 +41,25 @@ ENTITY_DESCRIPTIONS = (
|
|||
translation_key="tomorrow_data_available",
|
||||
name="Tomorrow's Data Available",
|
||||
icon="mdi:calendar-check",
|
||||
device_class=None, # No specific device_class = shows generic "On/Off"
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
),
|
||||
BinarySensorEntityDescription(
|
||||
key="has_ventilation_system",
|
||||
translation_key="has_ventilation_system",
|
||||
name="Has Ventilation System",
|
||||
icon="mdi:air-filter",
|
||||
device_class=None, # No specific device_class = shows generic "On/Off"
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
BinarySensorEntityDescription(
|
||||
key="realtime_consumption_enabled",
|
||||
translation_key="realtime_consumption_enabled",
|
||||
name="Realtime Consumption Enabled",
|
||||
icon="mdi:speedometer",
|
||||
device_class=None, # No specific device_class = shows generic "On/Off"
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -56,13 +56,17 @@ class TibberPricesSubentryFlowHandler(ConfigSubentryFlow):
|
|||
unique_id=home_id,
|
||||
)
|
||||
|
||||
# Get existing home IDs by checking all subentries for this parent
|
||||
# Get existing home IDs by checking all entries (parent + subentries)
|
||||
existing_home_ids = {
|
||||
entry.data["home_id"]
|
||||
for entry in self.hass.config_entries.async_entries(DOMAIN)
|
||||
if entry.data.get("home_id") and entry != parent_entry
|
||||
if entry.data.get("home_id")
|
||||
}
|
||||
|
||||
# Also include parent entry's home_id if it exists
|
||||
if parent_entry.data.get("home_id"):
|
||||
existing_home_ids.add(parent_entry.data["home_id"])
|
||||
|
||||
available_homes = [home for home in homes if home["id"] not in existing_home_ids]
|
||||
|
||||
if not available_homes:
|
||||
|
|
|
|||
|
|
@ -628,12 +628,24 @@ class TibberPricesDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
|||
|
||||
async def _fetch_all_homes_data(self) -> dict[str, Any]:
|
||||
"""Fetch data for all homes (main coordinator only)."""
|
||||
# Get price data for all homes
|
||||
price_data = await self.api.async_get_price_info()
|
||||
# Get list of home_ids that have active config entries
|
||||
configured_home_ids = self._get_configured_home_ids()
|
||||
|
||||
if not configured_home_ids:
|
||||
self._log("warning", "No configured homes found - cannot fetch price data")
|
||||
return {
|
||||
"timestamp": dt_util.utcnow(),
|
||||
"homes": {},
|
||||
}
|
||||
|
||||
# Get price data for configured homes only (API call with specific home_ids)
|
||||
self._log("debug", "Fetching price data for %d configured home(s)", len(configured_home_ids))
|
||||
price_data = await self.api.async_get_price_info(home_ids=configured_home_ids)
|
||||
|
||||
all_homes_data = {}
|
||||
homes_list = price_data.get("homes", {})
|
||||
|
||||
# Process returned data
|
||||
for home_id, home_price_data in homes_list.items():
|
||||
# Store raw price data without enrichment
|
||||
# Enrichment will be done dynamically when data is transformed
|
||||
|
|
@ -642,6 +654,12 @@ class TibberPricesDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
|||
}
|
||||
all_homes_data[home_id] = home_data
|
||||
|
||||
self._log(
|
||||
"debug",
|
||||
"Successfully fetched data for %d home(s)",
|
||||
len(all_homes_data),
|
||||
)
|
||||
|
||||
return {
|
||||
"timestamp": dt_util.utcnow(),
|
||||
"homes": all_homes_data,
|
||||
|
|
@ -674,6 +692,24 @@ class TibberPricesDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
|||
return coordinator
|
||||
return None
|
||||
|
||||
def _get_configured_home_ids(self) -> set[str]:
|
||||
"""Get all home_ids that have active config entries (main + subentries)."""
|
||||
home_ids = set()
|
||||
|
||||
# Collect home_ids from all config entries for this domain
|
||||
for entry in self.hass.config_entries.async_entries(DOMAIN):
|
||||
if home_id := entry.data.get("home_id"):
|
||||
home_ids.add(home_id)
|
||||
|
||||
self._log(
|
||||
"debug",
|
||||
"Found %d configured home(s): %s",
|
||||
len(home_ids),
|
||||
", ".join(sorted(home_ids)),
|
||||
)
|
||||
|
||||
return home_ids
|
||||
|
||||
async def _load_cache(self) -> None:
|
||||
"""Load cached data from storage."""
|
||||
try:
|
||||
|
|
@ -1711,7 +1747,14 @@ class TibberPricesDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
|||
"""Force refresh of user data and return True if data was updated."""
|
||||
try:
|
||||
current_time = dt_util.utcnow()
|
||||
await self._update_user_data_if_needed(current_time)
|
||||
self._log("info", "Forcing user data refresh (bypassing cache)")
|
||||
|
||||
# Force update by calling API directly (bypass cache check)
|
||||
user_data = await self.api.async_get_viewer_details()
|
||||
self._cached_user_data = user_data
|
||||
self._last_user_update = current_time
|
||||
self._log("info", "User data refreshed successfully - found %d home(s)", len(user_data.get("homes", [])))
|
||||
|
||||
await self._store_cache()
|
||||
except (
|
||||
TibberPricesApiClientAuthenticationError,
|
||||
|
|
@ -1733,4 +1776,5 @@ class TibberPricesDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
|||
"""Get list of user homes."""
|
||||
if not self._cached_user_data:
|
||||
return []
|
||||
return self._cached_user_data.get("homes", [])
|
||||
viewer = self._cached_user_data.get("viewer", {})
|
||||
return viewer.get("homes", [])
|
||||
|
|
|
|||
|
|
@ -348,6 +348,76 @@
|
|||
"description": "Minuten bis nächste teure Periode startet (0 beim Übergang)",
|
||||
"long_description": "Zeigt Minuten bis die nächste teure Periode startet. Während einer aktiven Periode zeigt dies die Zeit bis zur Periode NACH der aktuellen. Gibt 0 während kurzer Übergangsphasen zurück. Aktualisiert sich jede Minute.",
|
||||
"usage_tips": "Präventive Automatisierung: 'Wenn next_in_minutes > 0 UND next_in_minutes < 10, beende aktuellen Ladezyklus jetzt bevor Preise steigen'."
|
||||
},
|
||||
"home_type": {
|
||||
"description": "Art der Wohnung (Wohnung, Haus usw.)",
|
||||
"long_description": "Zeigt den Wohnungstyp, wie in deinem Tibber-Konto konfiguriert. Diese Metadaten können nützlich sein, um Energieverbrauchsmuster zu kategorisieren.",
|
||||
"usage_tips": "Nutze dies zur Organisation deines Smart-Home-Systems oder für Analysezwecke."
|
||||
},
|
||||
"home_size": {
|
||||
"description": "Wohnfläche in Quadratmetern",
|
||||
"long_description": "Zeigt die Größe deiner Wohnung in Quadratmetern, wie in deinem Tibber-Konto konfiguriert. Kann verwendet werden, um den Energieverbrauch pro Quadratmeter zu berechnen.",
|
||||
"usage_tips": "Nutze dies für Energieeffizienzberechnungen: 'Meine Wohnung verbraucht X kWh pro Quadratmeter pro Jahr'."
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"description": "Hauptsicherungsgröße in Ampere",
|
||||
"long_description": "Zeigt die Kapazität deiner Hauptsicherung in Ampere. Dies bestimmt die maximale elektrische Last, die deine Wohnung gleichzeitig bewältigen kann.",
|
||||
"usage_tips": "Nutze dies zur Überlastungsvermeidung: 'Wenn der Gesamtstromverbrauch sich der Sicherungsgröße nähert, verschiebe das Starten zusätzlicher Geräte'."
|
||||
},
|
||||
"number_of_residents": {
|
||||
"description": "Anzahl der im Haushalt lebenden Personen",
|
||||
"long_description": "Zeigt die Anzahl der Bewohner, wie in deinem Tibber-Konto konfiguriert. Nützlich für Pro-Kopf-Energieverbrauchsberechnungen.",
|
||||
"usage_tips": "Nutze dies für Haushalts-Energieanalysen: 'Energieverbrauch pro Person pro Tag'."
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"description": "Primärer Heizungstyp",
|
||||
"long_description": "Zeigt den Typ des in deiner Wohnung verwendeten Heizsystems, wie in deinem Tibber-Konto konfiguriert. Dies kann eine Wärmepumpe, Elektroheizung, Gas, Öl oder andere Heizquellen sein.",
|
||||
"usage_tips": "Nutze dies zur Kategorisierung heizungsbezogener Automatisierungen oder für Energieverbrauchsanalysen nach Heizungsart."
|
||||
},
|
||||
"grid_company": {
|
||||
"description": "Name deines Stromnetzbetreibers",
|
||||
"long_description": "Zeigt den Namen des Unternehmens, das das Stromnetz in deiner Region betreibt. Dies ist der Verteilnetzbetreiber (VNB), der für die Stromlieferung zu deinem Haus verantwortlich ist.",
|
||||
"usage_tips": "Nützlich für administrative Zwecke und zur Behebung netzbezogener Probleme."
|
||||
},
|
||||
"grid_area_code": {
|
||||
"description": "Netzgebiets-Kennziffer",
|
||||
"long_description": "Zeigt den Code, der dein Stromnetzgebiet identifiziert. Dieser Code wird vom Netzbetreiber für Routing- und Abrechnungszwecke verwendet.",
|
||||
"usage_tips": "Nutze dies als administrative Referenz oder bei der Kontaktaufnahme mit deinem Netzbetreiber."
|
||||
},
|
||||
"price_area_code": {
|
||||
"description": "Strompreis-Zonencode",
|
||||
"long_description": "Zeigt den Code für deine Strompreiszone (z.B. NO1, NO2, SE3, DK1). Verschiedene Zonen haben unterschiedliche Großhandelsstrompreise basierend auf regionalem Angebot und Nachfrage.",
|
||||
"usage_tips": "Nutze dies, um zu verstehen, in welcher Preisregion du dich befindest. Nützlich beim Preisvergleich mit anderen oder bei der Analyse regionaler Preismuster."
|
||||
},
|
||||
"consumption_ean": {
|
||||
"description": "EAN-Code für Stromverbrauchsmessung",
|
||||
"long_description": "Zeigt die Europäische Artikelnummer (EAN), die deinen Stromverbrauchszähler eindeutig identifiziert. Dieser 18-stellige Code wird für Abrechnungs- und Verwaltungszwecke verwendet.",
|
||||
"usage_tips": "Nutze dies bei der Kommunikation mit deinem Stromanbieter oder für administrative Dokumentation."
|
||||
},
|
||||
"production_ean": {
|
||||
"description": "EAN-Code für Stromerzeugungsmessung",
|
||||
"long_description": "Zeigt die Europäische Artikelnummer (EAN) für deinen Stromerzeugungszähler (wenn du Solarpanels oder andere Erzeugung hast). Dieser Code verfolgt Strom, den du ins Netz einspeist.",
|
||||
"usage_tips": "Relevant, wenn du Solarpanels oder andere Stromerzeugung hast. Nutze für administrative Zwecke und bei der Beantragung von Einspeisevergütung."
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"description": "Art der angewandten Energiesteuer",
|
||||
"long_description": "Zeigt die Energiesteuerkategorie, die auf deinen Stromverbrauch angewendet wird. Steuersätze variieren nach Land und manchmal nach Verbrauchertyp (privat, gewerblich usw.).",
|
||||
"usage_tips": "Nutze dies zum Verständnis der Aufschlüsselung deiner Stromrechnung und für Gesamtkostenberechnungen."
|
||||
},
|
||||
"vat_type": {
|
||||
"description": "Mehrwertsteuerkategorie",
|
||||
"long_description": "Zeigt die Mehrwertsteuerkategorie, die auf deinen Stromverbrauch angewendet wird. Mehrwertsteuersätze variieren nach Land und können für Strom anders sein als für andere Waren und Dienstleistungen.",
|
||||
"usage_tips": "Nutze dies zum Verständnis deiner Stromrechnung und zur Berechnung der Gesamtkosten inklusive Steuern."
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"description": "Geschätzter jährlicher Stromverbrauch in kWh",
|
||||
"long_description": "Zeigt deinen geschätzten jährlichen Stromverbrauch in Kilowattstunden, wie in deinem Tibber-Konto berechnet oder konfiguriert. Diese Schätzung wird verwendet, um den tatsächlichen Verbrauch mit den erwarteten Werten zu vergleichen.",
|
||||
"usage_tips": "Nutze dies, um zu verfolgen, ob dein tatsächlicher Verbrauch über oder unter den Erwartungen liegt. Vergleiche den monatlichen Verbrauch mit 1/12 dieses Wertes, um ungewöhnliche Muster zu identifizieren."
|
||||
},
|
||||
"subscription_status": {
|
||||
"description": "Status deines Tibber-Abonnements",
|
||||
"long_description": "Zeigt, ob dein Tibber-Abonnement derzeit aktiv ist, beendet wurde oder auf Aktivierung wartet. Ein Status 'Aktiv' bedeutet, dass du aktiv Strom über Tibber beziehst.",
|
||||
"usage_tips": "Nutze dies zur Überwachung deines Abonnementstatus. Richte Benachrichtigungen ein, wenn sich der Status von 'Aktiv' ändert, um einen unterbrechungsfreien Service sicherzustellen."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
@ -370,6 +440,16 @@
|
|||
"description": "Ob die Verbindung zur Tibber API funktioniert",
|
||||
"long_description": "Zeigt an, ob die Integration erfolgreich eine Verbindung zur Tibber API herstellen kann",
|
||||
"usage_tips": "Nutze dies, um den Verbindungsstatus zur Tibber API zu überwachen"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"description": "Ob deine Wohnung über eine Lüftungsanlage verfügt",
|
||||
"long_description": "Zeigt an, ob eine Lüftungsanlage für deine Wohnung im Tibber-Konto registriert ist. Lüftungsanlagen können erhebliche Stromverbraucher sein, die von intelligenter Planung profitieren können.",
|
||||
"usage_tips": "Nutze dies, um lüftungsspezifische Automatisierungen oder Energieüberwachung zu aktivieren. Falls aktiv, erwäge die Planung der Lüftung während Niedrigpreisphasen."
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"description": "Ob die Echtzeit-Verbrauchsüberwachung aktiv ist",
|
||||
"long_description": "Zeigt an, ob die Echtzeit-Stromverbrauchsüberwachung für dein Tibber-Zuhause aktiviert und aktiv ist. Dies erfordert kompatible Messhardware (z. B. Tibber Pulse) und ein aktives Abonnement.",
|
||||
"usage_tips": "Verwende dies, um zu überprüfen, ob Echtzeit-Verbrauchsdaten verfügbar sind. Aktiviere Benachrichtigungen, falls dies unerwartet auf 'Aus' wechselt, was auf potenzielle Hardware- oder Verbindungsprobleme hinweist."
|
||||
}
|
||||
},
|
||||
"home_types": {
|
||||
|
|
@ -377,5 +457,6 @@
|
|||
"ROWHOUSE": "Reihenhaus",
|
||||
"HOUSE": "Haus",
|
||||
"COTTAGE": "Ferienhaus"
|
||||
}
|
||||
},
|
||||
"attribution": "Daten bereitgestellt von Tibber"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -348,6 +348,76 @@
|
|||
"description": "Minutes until next peak price period starts (0 when in transition)",
|
||||
"long_description": "Shows minutes until the next peak price period starts. During an active period, shows time until the period AFTER the current one. Returns 0 during brief transition moments. Updates every minute.",
|
||||
"usage_tips": "Pre-emptive automation: 'If next_in_minutes > 0 AND next_in_minutes < 10, complete current charging cycle now before prices increase'."
|
||||
},
|
||||
"home_type": {
|
||||
"description": "Type of home (apartment, house, etc.)",
|
||||
"long_description": "Shows the type of dwelling as configured in your Tibber account. This metadata can be useful for categorizing energy consumption patterns.",
|
||||
"usage_tips": "Use this for organizing your smart home system or for analytics purposes."
|
||||
},
|
||||
"home_size": {
|
||||
"description": "Size of home in square meters",
|
||||
"long_description": "Shows the size of your home in square meters as configured in your Tibber account. Can be used to calculate energy consumption per square meter.",
|
||||
"usage_tips": "Use this in energy efficiency calculations: 'My home uses X kWh per square meter per year'."
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"description": "Main electrical fuse size in amperes",
|
||||
"long_description": "Shows the capacity of your main electrical fuse in amperes. This determines the maximum electrical load your home can handle simultaneously.",
|
||||
"usage_tips": "Use this to prevent overloading: 'If total current consumption approaches fuse size, postpone starting additional appliances'."
|
||||
},
|
||||
"number_of_residents": {
|
||||
"description": "Number of people living in the home",
|
||||
"long_description": "Shows the number of residents as configured in your Tibber account. Useful for per-capita energy consumption calculations.",
|
||||
"usage_tips": "Use this for household energy analytics: 'Energy consumption per person per day'."
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"description": "Primary heating system type",
|
||||
"long_description": "Shows the type of heating system used in your home as configured in your Tibber account. This can be a heat pump, electric heating, gas, oil, or other heating sources.",
|
||||
"usage_tips": "Use this to categorize heating-related automations or for energy consumption analysis by heating type."
|
||||
},
|
||||
"grid_company": {
|
||||
"description": "Name of your electricity grid operator",
|
||||
"long_description": "Shows the name of the company operating the electrical grid in your area. This is the distribution system operator (DSO) responsible for delivering electricity to your home.",
|
||||
"usage_tips": "Useful for administrative purposes and troubleshooting grid-related issues."
|
||||
},
|
||||
"grid_area_code": {
|
||||
"description": "Grid area identifier code",
|
||||
"long_description": "Shows the code identifying your electrical grid area. This code is used by the grid operator for routing and billing purposes.",
|
||||
"usage_tips": "Use this for administrative reference or when contacting your grid operator."
|
||||
},
|
||||
"price_area_code": {
|
||||
"description": "Electricity price area code",
|
||||
"long_description": "Shows the code for your electricity price area (e.g., NO1, NO2, SE3, DK1). Different areas have different wholesale electricity prices based on regional supply and demand.",
|
||||
"usage_tips": "Use this to understand which price region you're in. Useful when comparing prices with others or analyzing regional price patterns."
|
||||
},
|
||||
"consumption_ean": {
|
||||
"description": "EAN code for electricity consumption metering",
|
||||
"long_description": "Shows the European Article Number (EAN) code that uniquely identifies your electricity consumption meter. This 18-digit code is used for billing and administrative purposes.",
|
||||
"usage_tips": "Use this when communicating with your electricity provider or for administrative documentation."
|
||||
},
|
||||
"production_ean": {
|
||||
"description": "EAN code for electricity production metering",
|
||||
"long_description": "Shows the European Article Number (EAN) code for your electricity production meter (if you have solar panels or other generation). This code tracks electricity you feed back into the grid.",
|
||||
"usage_tips": "Relevant if you have solar panels or other electricity generation. Use for administrative purposes and when claiming feed-in compensation."
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"description": "Type of energy tax applied",
|
||||
"long_description": "Shows the energy tax category applied to your electricity consumption. Tax rates vary by country and sometimes by consumer type (residential, commercial, etc.).",
|
||||
"usage_tips": "Use this for understanding your electricity bill breakdown and total cost calculations."
|
||||
},
|
||||
"vat_type": {
|
||||
"description": "VAT (Value Added Tax) category",
|
||||
"long_description": "Shows the VAT category applied to your electricity consumption. VAT rates vary by country and may differ for electricity compared to other goods and services.",
|
||||
"usage_tips": "Use this for understanding your electricity bill and calculating total costs including taxes."
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"description": "Estimated yearly electricity consumption in kWh",
|
||||
"long_description": "Shows your estimated annual electricity consumption in kilowatt-hours as calculated or configured in your Tibber account. This estimate is used for comparing actual consumption to expected values.",
|
||||
"usage_tips": "Use this to track if your actual consumption is above or below expectations. Compare monthly consumption to 1/12 of this value to identify unusual patterns."
|
||||
},
|
||||
"subscription_status": {
|
||||
"description": "Status of your Tibber subscription",
|
||||
"long_description": "Shows whether your Tibber subscription is currently running, has ended, or is pending activation. A status of 'running' means you're actively receiving electricity through Tibber.",
|
||||
"usage_tips": "Use this to monitor your subscription status. Set up alerts if status changes from 'running' to ensure uninterrupted service."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
@ -370,6 +440,16 @@
|
|||
"description": "Whether the connection to the Tibber API is working",
|
||||
"long_description": "Indicates if the integration can successfully connect to the Tibber API",
|
||||
"usage_tips": "Use this to monitor the connection status to the Tibber API"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"description": "Whether your home has a ventilation system",
|
||||
"long_description": "Indicates if a ventilation system is registered for your home in the Tibber account. Ventilation systems can be significant electricity consumers that may benefit from smart scheduling.",
|
||||
"usage_tips": "Use this to enable ventilation-specific automations or energy monitoring. If true, consider scheduling ventilation during low-price periods."
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"description": "Whether realtime consumption monitoring is active",
|
||||
"long_description": "Indicates if realtime electricity consumption monitoring is enabled and active for your Tibber home. This requires compatible metering hardware (e.g., Tibber Pulse) and an active subscription.",
|
||||
"usage_tips": "Use this to verify that realtime consumption data is available. Enable notifications if this changes to 'off' unexpectedly, indicating potential hardware or connectivity issues."
|
||||
}
|
||||
},
|
||||
"home_types": {
|
||||
|
|
@ -377,5 +457,6 @@
|
|||
"ROWHOUSE": "Rowhouse",
|
||||
"HOUSE": "House",
|
||||
"COTTAGE": "Cottage"
|
||||
}
|
||||
},
|
||||
"attribution": "Data provided by Tibber"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -348,6 +348,76 @@
|
|||
"description": "Total varighet av gjeldende eller neste dyrperiode i minutter",
|
||||
"long_description": "Viser den totale varigheten av dyrperioden i minutter. Under en aktiv periode viser dette hele varigheten av gjeldende periode. Når ingen periode er aktiv, viser dette varigheten av neste kommende periode. Eksempel: '60 minutter' for en 1-times periode.",
|
||||
"usage_tips": "Bruk til å planlegge energibesparelsestiltak: 'Hvis duration > 120, reduser varmetemperatur mer aggressivt (lang dyr periode)'. Hjelper med å vurdere hvor mye energiforbruk må reduseres."
|
||||
},
|
||||
"home_type": {
|
||||
"description": "Type bolig (leilighet, hus osv.)",
|
||||
"long_description": "Viser boligtypen som er konfigurert i Tibber-kontoen din. Disse metadataene kan være nyttige for å kategorisere energiforbruksmønstre.",
|
||||
"usage_tips": "Bruk dette til å organisere smarthussystemet ditt eller for analyseformål."
|
||||
},
|
||||
"home_size": {
|
||||
"description": "Boligareal i kvadratmeter",
|
||||
"long_description": "Viser størrelsen på boligen din i kvadratmeter som konfigurert i Tibber-kontoen din. Kan brukes til å beregne energiforbruk per kvadratmeter.",
|
||||
"usage_tips": "Bruk dette i energieffektivitetsberegninger: 'Boligen min bruker X kWh per kvadratmeter per år'."
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"description": "Hovedsikringsstørrelse i ampere",
|
||||
"long_description": "Viser kapasiteten til hovedsikringen din i ampere. Dette bestemmer maksimal elektrisk belastning boligen din kan håndtere samtidig.",
|
||||
"usage_tips": "Bruk dette til å forhindre overbelastning: 'Hvis totalt strømforbruk nærmer seg sikringsstørrelsen, utsett oppstart av flere apparater'."
|
||||
},
|
||||
"number_of_residents": {
|
||||
"description": "Antall personer som bor i boligen",
|
||||
"long_description": "Viser antall beboere som konfigurert i Tibber-kontoen din. Nyttig for beregninger av energiforbruk per person.",
|
||||
"usage_tips": "Bruk dette til energianalyse for husholdningen: 'Energiforbruk per person per dag'."
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"description": "Primær varmesystemtype",
|
||||
"long_description": "Viser typen varmesystem som brukes i boligen din som konfigurert i Tibber-kontoen din. Dette kan være en varmepumpe, elektrisk oppvarming, gass, olje eller andre varmekilder.",
|
||||
"usage_tips": "Bruk dette til å kategorisere varmerelaterte automatiseringer eller for energiforbruksanalyse etter varmetype."
|
||||
},
|
||||
"grid_company": {
|
||||
"description": "Navn på nettoperatøren din",
|
||||
"long_description": "Viser navnet på selskapet som driver strømnettet i området ditt. Dette er distribusjonssystemoperatøren (DSO) som er ansvarlig for strømleveransen til hjemmet ditt.",
|
||||
"usage_tips": "Nyttig for administrative formål og feilsøking av nettrelaterte problemer."
|
||||
},
|
||||
"grid_area_code": {
|
||||
"description": "Nettområdets identifikasjonskode",
|
||||
"long_description": "Viser koden som identifiserer strømnettsområdet ditt. Denne koden brukes av nettoperatøren til routing og faktureringsformål.",
|
||||
"usage_tips": "Bruk dette som administrativ referanse eller når du kontakter nettoperatøren din."
|
||||
},
|
||||
"price_area_code": {
|
||||
"description": "Strømprisområdekode",
|
||||
"long_description": "Viser koden for strømprisområdet ditt (f.eks. NO1, NO2, SE3, DK1). Ulike områder har forskjellige engrosstrømpriser basert på regional tilbud og etterspørsel.",
|
||||
"usage_tips": "Bruk dette til å forstå hvilket prisområde du er i. Nyttig ved sammenligning av priser med andre eller analyse av regionale prismønstre."
|
||||
},
|
||||
"consumption_ean": {
|
||||
"description": "EAN-kode for strømforbruksmåling",
|
||||
"long_description": "Viser European Article Number (EAN)-koden som unikt identifiserer strømforbruksmåleren din. Denne 18-sifrede koden brukes til fakturerings- og administrasjonsformål.",
|
||||
"usage_tips": "Bruk dette ved kommunikasjon med strømleverandøren din eller for administrativ dokumentasjon."
|
||||
},
|
||||
"production_ean": {
|
||||
"description": "EAN-kode for strømproduksjonsmåling",
|
||||
"long_description": "Viser European Article Number (EAN)-koden for strømproduksjonsmåleren din (hvis du har solcellepaneler eller annen produksjon). Denne koden sporer strøm du sender tilbake til nettet.",
|
||||
"usage_tips": "Relevant hvis du har solcellepaneler eller annen strømproduksjon. Bruk til administrative formål og ved krav om innmatingsutbetaling."
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"description": "Type energiavgift som påløper",
|
||||
"long_description": "Viser energiavgiftskategorien som gjelder for strømforbruket ditt. Avgiftssatser varierer etter land og noen ganger etter forbrukertype (privat, næring osv.).",
|
||||
"usage_tips": "Bruk dette til å forstå nedbrytningen av strømregningen din og for totale kostnadsberegninger."
|
||||
},
|
||||
"vat_type": {
|
||||
"description": "MVA-kategori (merverdiavgift)",
|
||||
"long_description": "Viser MVA-kategorien som gjelder for strømforbruket ditt. MVA-satser varierer etter land og kan være forskjellige for strøm sammenlignet med andre varer og tjenester.",
|
||||
"usage_tips": "Bruk dette til å forstå strømregningen din og beregne totale kostnader inkludert avgifter."
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"description": "Estimert årlig strømforbruk i kWh",
|
||||
"long_description": "Viser ditt estimerte årlige strømforbruk i kilowattimer som beregnet eller konfigurert i Tibber-kontoen din. Dette estimatet brukes til å sammenligne faktisk forbruk med forventede verdier.",
|
||||
"usage_tips": "Bruk dette til å spore om ditt faktiske forbruk er over eller under forventningene. Sammenlign månedlig forbruk med 1/12 av denne verdien for å identifisere uvanlige mønstre."
|
||||
},
|
||||
"subscription_status": {
|
||||
"description": "Status for Tibber-abonnementet ditt",
|
||||
"long_description": "Viser om Tibber-abonnementet ditt for øyeblikket er aktivt, avsluttet eller venter på aktivering. En status 'Aktiv' betyr at du aktivt mottar strøm gjennom Tibber.",
|
||||
"usage_tips": "Bruk dette til å overvåke abonnementsstatusen din. Sett opp varsler hvis statusen endres fra 'Aktiv' for å sikre uavbrutt tjeneste."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
@ -370,6 +440,16 @@
|
|||
"description": "Om tilkoblingen til Tibber API fungerer",
|
||||
"long_description": "Indikerer om integrasjonen kan koble til Tibber API",
|
||||
"usage_tips": "Bruk dette til å overvåke tilkoblingsstatusen til Tibber API"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"description": "Om boligen din har ventilasjonsanlegg",
|
||||
"long_description": "Indikerer om et ventilasjonsanlegg er registrert for boligen din i Tibber-kontoen. Ventilasjonsanlegg kan være betydelige strømforbrukere som kan dra nytte av smart planlegging.",
|
||||
"usage_tips": "Bruk dette til å aktivere ventilasjonsrelaterte automatiseringer eller energiovervåking. Hvis aktivt, vurder å planlegge ventilasjon i lavprisperioder."
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"description": "Om sanntidsforbruksovervåking er aktiv",
|
||||
"long_description": "Indikerer om sanntidsovervåking av strømforbruk er aktivert og aktiv for ditt Tibber-hjem. Dette krever kompatibel målehardware (f.eks. Tibber Pulse) og et aktivt abonnement.",
|
||||
"usage_tips": "Bruk dette for å bekrefte at sanntidsforbruksdata er tilgjengelig. Aktiver varsler hvis dette endres til 'av' uventet, noe som indikerer potensielle maskinvare- eller tilkoblingsproblemer."
|
||||
}
|
||||
},
|
||||
"home_types": {
|
||||
|
|
@ -377,5 +457,6 @@
|
|||
"ROWHOUSE": "Rekkehus",
|
||||
"HOUSE": "Hus",
|
||||
"COTTAGE": "Hytte"
|
||||
}
|
||||
},
|
||||
"attribution": "Data levert av Tibber"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -348,6 +348,76 @@
|
|||
"description": "Totale duur van huidige of volgende dure periode in minuten",
|
||||
"long_description": "Toont de totale duur van de dure periode in minuten. Tijdens een actieve periode toont dit de volledige lengte van de huidige periode. Wanneer geen periode actief is, toont dit de duur van de volgende komende periode. Voorbeeld: '60 minuten' voor een 1-uur periode.",
|
||||
"usage_tips": "Gebruik om energiebesparende maatregelen te plannen: 'Als duration > 120, verlaag verwarmingstemperatuur agressiever (lange dure periode)'. Helpt bij het inschatten hoeveel energieverbruik moet worden verminderd."
|
||||
},
|
||||
"home_type": {
|
||||
"description": "Type woning (appartement, huis enz.)",
|
||||
"long_description": "Toont het woningtype zoals geconfigureerd in je Tibber-account. Deze metadata kunnen nuttig zijn voor het categoriseren van energieverbruikspatronen.",
|
||||
"usage_tips": "Gebruik dit voor het organiseren van je smart home-systeem of voor analysedoeleinden."
|
||||
},
|
||||
"home_size": {
|
||||
"description": "Woonoppervlakte in vierkante meters",
|
||||
"long_description": "Toont de grootte van je woning in vierkante meters zoals geconfigureerd in je Tibber-account. Kan worden gebruikt om energieverbruik per vierkante meter te berekenen.",
|
||||
"usage_tips": "Gebruik dit in energie-efficiëntieberekeningen: 'Mijn woning verbruikt X kWh per vierkante meter per jaar'."
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"description": "Hoofdzekeringgrootte in ampères",
|
||||
"long_description": "Toont de capaciteit van je hoofdzekering in ampères. Dit bepaalt de maximale elektrische belasting die je woning tegelijkertijd aankan.",
|
||||
"usage_tips": "Gebruik dit om overbelasting te voorkomen: 'Als het totale stroomverbruik de zekeringgrootte nadert, stel het starten van extra apparaten uit'."
|
||||
},
|
||||
"number_of_residents": {
|
||||
"description": "Aantal personen dat in de woning woont",
|
||||
"long_description": "Toont het aantal bewoners zoals geconfigureerd in je Tibber-account. Nuttig voor berekeningen van energieverbruik per persoon.",
|
||||
"usage_tips": "Gebruik dit voor huishoudelijke energie-analyses: 'Energieverbruik per persoon per dag'."
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"description": "Primair verwarmingssysteemtype",
|
||||
"long_description": "Toont het type verwarmingssysteem dat in je woning wordt gebruikt zoals geconfigureerd in je Tibber-account. Dit kan een warmtepomp, elektrische verwarming, gas, olie of andere warmtebronnen zijn.",
|
||||
"usage_tips": "Gebruik dit om verwarmingsgerelateerde automatiseringen te categoriseren of voor energieverbruiksanalyse per verwarmingstype."
|
||||
},
|
||||
"grid_company": {
|
||||
"description": "Naam van je elektriciteitsnetbeheerder",
|
||||
"long_description": "Toont de naam van het bedrijf dat het elektriciteitsnet in je gebied beheert. Dit is de distributienetwerkbeheerder (DNB) die verantwoordelijk is voor de levering van elektriciteit aan je woning.",
|
||||
"usage_tips": "Nuttig voor administratieve doeleinden en het oplossen van netgerelateerde problemen."
|
||||
},
|
||||
"grid_area_code": {
|
||||
"description": "Netgebied-identificatiecode",
|
||||
"long_description": "Toont de code die je elektriciteitsnetgebied identificeert. Deze code wordt door de netbeheerder gebruikt voor routing- en factureringsdoeleinden.",
|
||||
"usage_tips": "Gebruik dit als administratieve referentie of bij contact met je netbeheerder."
|
||||
},
|
||||
"price_area_code": {
|
||||
"description": "Elektriciteitsprijszonecode",
|
||||
"long_description": "Toont de code voor je elektriciteitsprijszone (bijv. NO1, NO2, SE3, DK1). Verschillende zones hebben verschillende groothandelselektriciteitsprijzen op basis van regionaal aanbod en vraag.",
|
||||
"usage_tips": "Gebruik dit om te begrijpen in welke prijsregio je je bevindt. Nuttig bij het vergelijken van prijzen met anderen of het analyseren van regionale prijspatronen."
|
||||
},
|
||||
"consumption_ean": {
|
||||
"description": "EAN-code voor elektriciteitsverbruiksmeting",
|
||||
"long_description": "Toont de European Article Number (EAN)-code die je elektriciteitsverbruiksmeter uniek identificeert. Deze 18-cijferige code wordt gebruikt voor facturerings- en administratieve doeleinden.",
|
||||
"usage_tips": "Gebruik dit bij communicatie met je elektriciteitsleverancier of voor administratieve documentatie."
|
||||
},
|
||||
"production_ean": {
|
||||
"description": "EAN-code voor elektriciteitsproductiemeting",
|
||||
"long_description": "Toont de European Article Number (EAN)-code voor je elektriciteitsproductiemeter (als je zonnepanelen of andere opwekking hebt). Deze code volgt elektriciteit die je terug het net op stuurt.",
|
||||
"usage_tips": "Relevant als je zonnepanelen of andere elektriciteitsopwekking hebt. Gebruik voor administratieve doeleinden en bij het claimen van teruglevering."
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"description": "Type energiebelasting toegepast",
|
||||
"long_description": "Toont de energiebelastingcategorie die wordt toegepast op je elektriciteitsverbruik. Belastingtarieven variëren per land en soms per consumententype (particulier, zakelijk enz.).",
|
||||
"usage_tips": "Gebruik dit voor het begrijpen van de uitsplitsing van je elektriciteitsrekening en voor berekeningen van totale kosten."
|
||||
},
|
||||
"vat_type": {
|
||||
"description": "BTW-categorie (belasting over toegevoegde waarde)",
|
||||
"long_description": "Toont de BTW-categorie die wordt toegepast op je elektriciteitsverbruik. BTW-tarieven variëren per land en kunnen verschillen voor elektriciteit vergeleken met andere goederen en diensten.",
|
||||
"usage_tips": "Gebruik dit voor het begrijpen van je elektriciteitsrekening en het berekenen van totale kosten inclusief belastingen."
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"description": "Geschat jaarlijks elektriciteitsverbruik in kWh",
|
||||
"long_description": "Toont je geschatte jaarlijkse elektriciteitsverbruik in kilowattuur zoals berekend of geconfigureerd in je Tibber-account. Deze schatting wordt gebruikt om daadwerkelijk verbruik te vergelijken met verwachte waarden.",
|
||||
"usage_tips": "Gebruik dit om te volgen of je daadwerkelijke verbruik boven of onder de verwachtingen ligt. Vergelijk maandelijks verbruik met 1/12 van deze waarde om ongebruikelijke patronen te identificeren."
|
||||
},
|
||||
"subscription_status": {
|
||||
"description": "Status van je Tibber-abonnement",
|
||||
"long_description": "Toont of je Tibber-abonnement momenteel actief is, is beëindigd of wacht op activering. Een status 'Actief' betekent dat je actief elektriciteit ontvangt via Tibber.",
|
||||
"usage_tips": "Gebruik dit om je abonnementsstatus te monitoren. Stel meldingen in als de status verandert van 'Actief' om ononderbroken service te garanderen."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
@ -370,6 +440,16 @@
|
|||
"description": "Of de verbinding met de Tibber API werkt",
|
||||
"long_description": "Geeft aan of de integratie succesvol verbinding kan maken met de Tibber API",
|
||||
"usage_tips": "Gebruik dit om de verbindingsstatus met de Tibber API te monitoren"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"description": "Of je woning een ventilatiesysteem heeft",
|
||||
"long_description": "Geeft aan of een ventilatiesysteem is geregistreerd voor je woning in het Tibber-account. Ventilatiesystemen kunnen aanzienlijke elektriciteitsverbruikers zijn die baat kunnen hebben bij slimme planning.",
|
||||
"usage_tips": "Gebruik dit om ventilatiespecifieke automatiseringen of energiemonitoring in te schakelen. Indien actief, overweeg ventilatie te plannen tijdens perioden met lage prijzen."
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"description": "Of realtime verbruiksmonitoring actief is",
|
||||
"long_description": "Geeft aan of realtime elektriciteitsverbruikmonitoring is ingeschakeld en actief voor je Tibber-woning. Dit vereist compatibele meethardware (bijv. Tibber Pulse) en een actief abonnement.",
|
||||
"usage_tips": "Gebruik dit om te verifiëren dat realtimeverbruiksgegevens beschikbaar zijn. Schakel meldingen in als dit onverwacht verandert naar 'uit', wat wijst op mogelijke hardware- of verbindingsproblemen."
|
||||
}
|
||||
},
|
||||
"home_types": {
|
||||
|
|
@ -377,5 +457,6 @@
|
|||
"ROWHOUSE": "Rijhuis",
|
||||
"HOUSE": "Huis",
|
||||
"COTTAGE": "Huisje"
|
||||
}
|
||||
},
|
||||
"attribution": "Gegevens geleverd door Tibber"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -348,6 +348,76 @@
|
|||
"description": "Total längd på nuvarande eller nästa dyrperiod i minuter",
|
||||
"long_description": "Visar den totala längden på dyrperioden i minuter. Under en aktiv period visar detta hela längden av nuvarande period. När ingen period är aktiv visar detta längden på nästa kommande period. Exempel: '60 minuter' för en 1-timmars period.",
|
||||
"usage_tips": "Använd för att planera energisparåtgärder: 'Om duration > 120, minska värmetemperatur mer aggressivt (lång dyr period)'. Hjälper till att bedöma hur mycket energiförbrukning måste minskas."
|
||||
},
|
||||
"home_type": {
|
||||
"description": "Bostadstyp (lägenhet, hus osv.)",
|
||||
"long_description": "Visar bostadstypen som konfigurerats i ditt Tibber-konto. Denna metadata kan vara användbar för att kategorisera energiförbrukningsmönster.",
|
||||
"usage_tips": "Använd detta för att organisera ditt smarthussystem eller för analysändamål."
|
||||
},
|
||||
"home_size": {
|
||||
"description": "Boyta i kvadratmeter",
|
||||
"long_description": "Visar storleken på din bostad i kvadratmeter som konfigurerats i ditt Tibber-konto. Kan användas för att beräkna energiförbrukning per kvadratmeter.",
|
||||
"usage_tips": "Använd detta i energieffektivitetsberäkningar: 'Min bostad använder X kWh per kvadratmeter per år'."
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"description": "Huvudsäkringsstorlek i ampere",
|
||||
"long_description": "Visar kapaciteten på din huvudsäkring i ampere. Detta bestämmer den maximala elektriska belastningen din bostad kan hantera samtidigt.",
|
||||
"usage_tips": "Använd detta för att förhindra överbelastning: 'Om total strömförbrukning närmar sig säkringsstorleken, skjut upp start av ytterligare apparater'."
|
||||
},
|
||||
"number_of_residents": {
|
||||
"description": "Antal personer som bor i bostaden",
|
||||
"long_description": "Visar antalet boende som konfigurerats i ditt Tibber-konto. Användbart för beräkningar av energiförbrukning per person.",
|
||||
"usage_tips": "Använd detta för hushållets energianalyser: 'Energiförbrukning per person per dag'."
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"description": "Primär värmesystemtyp",
|
||||
"long_description": "Visar typen av värmesystem som används i din bostad som konfigurerats i ditt Tibber-konto. Detta kan vara en värmepump, elektrisk uppvärmning, gas, olja eller andra värmekällor.",
|
||||
"usage_tips": "Använd detta för att kategorisera värmerelaterade automationer eller för energiförbrukningsanalys efter värmetyp."
|
||||
},
|
||||
"grid_company": {
|
||||
"description": "Namn på din elnätsoperatör",
|
||||
"long_description": "Visar namnet på företaget som driver elnätet i ditt område. Detta är distributionssystemoperatören (DSO) som ansvarar för att leverera elektricitet till ditt hem.",
|
||||
"usage_tips": "Användbart för administrativa ändamål och felsökning av nätrelaterade problem."
|
||||
},
|
||||
"grid_area_code": {
|
||||
"description": "Nätområdets identifieringskod",
|
||||
"long_description": "Visar koden som identifierar ditt elnätsområde. Denna kod används av nätoperatören för routing- och faktureringsändamål.",
|
||||
"usage_tips": "Använd detta som administrativ referens eller vid kontakt med din nätoperatör."
|
||||
},
|
||||
"price_area_code": {
|
||||
"description": "Elprisområdeskod",
|
||||
"long_description": "Visar koden för ditt elprisområde (t.ex. NO1, NO2, SE3, DK1). Olika områden har olika grossistelpriser baserat på regionalt utbud och efterfrågan.",
|
||||
"usage_tips": "Använd detta för att förstå vilket prisområde du befinner dig i. Användbart vid jämförelse av priser med andra eller analys av regionala prismönster."
|
||||
},
|
||||
"consumption_ean": {
|
||||
"description": "EAN-kod för elförbrukningsmätning",
|
||||
"long_description": "Visar European Article Number (EAN)-koden som unikt identifierar din elförbrukningsmätare. Denna 18-siffriga kod används för fakturerings- och administrativa ändamål.",
|
||||
"usage_tips": "Använd detta vid kommunikation med din elleverantör eller för administrativ dokumentation."
|
||||
},
|
||||
"production_ean": {
|
||||
"description": "EAN-kod för elproduktionsmätning",
|
||||
"long_description": "Visar European Article Number (EAN)-koden för din elproduktionsmätare (om du har solpaneler eller annan produktion). Denna kod spårar elektricitet du matar tillbaka till nätet.",
|
||||
"usage_tips": "Relevant om du har solpaneler eller annan elproduktion. Använd för administrativa ändamål och vid krav på inmatningsersättning."
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"description": "Typ av energiskatt som tillämpas",
|
||||
"long_description": "Visar energiskattekategorin som tillämpas på din elförbrukning. Skattesatser varierar per land och ibland per konsumenttyp (privat, kommersiell osv.).",
|
||||
"usage_tips": "Använd detta för att förstå uppdelningen av din elräkning och för totala kostnadsberäkningar."
|
||||
},
|
||||
"vat_type": {
|
||||
"description": "Momskategori (mervärdesskatt)",
|
||||
"long_description": "Visar momskategorin som tillämpas på din elförbrukning. Momssatser varierar per land och kan skilja sig för elektricitet jämfört med andra varor och tjänster.",
|
||||
"usage_tips": "Använd detta för att förstå din elräkning och beräkna totala kostnader inklusive skatter."
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"description": "Uppskattat årligt elförbrukning i kWh",
|
||||
"long_description": "Visar din uppskattade årliga elförbrukning i kilowattimmar som beräknats eller konfigurerats i ditt Tibber-konto. Denna uppskattning används för att jämföra faktisk förbrukning med förväntade värden.",
|
||||
"usage_tips": "Använd detta för att spåra om din faktiska förbrukning är över eller under förväntningarna. Jämför månatlig förbrukning med 1/12 av detta värde för att identifiera ovanliga mönster."
|
||||
},
|
||||
"subscription_status": {
|
||||
"description": "Status för ditt Tibber-abonnemang",
|
||||
"long_description": "Visar om ditt Tibber-abonnemang för närvarande är aktivt, har avslutats eller väntar på aktivering. En status 'Aktiv' betyder att du aktivt tar emot elektricitet genom Tibber.",
|
||||
"usage_tips": "Använd detta för att övervaka din abonnemangsstatus. Ställ in varningar om statusen ändras från 'Aktiv' för att säkerställa oavbruten service."
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
@ -370,6 +440,16 @@
|
|||
"description": "Om anslutningen till Tibber API fungerar",
|
||||
"long_description": "Indikerar om integrationen framgångsrikt kan ansluta till Tibber API",
|
||||
"usage_tips": "Använd detta för att övervaka anslutningsstatus till Tibber API"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"description": "Om din bostad har ventilationssystem",
|
||||
"long_description": "Indikerar om ett ventilationssystem är registrerat för din bostad i Tibber-kontot. Ventilationssystem kan vara betydande elförbrukare som kan dra nytta av smart schemaläggning.",
|
||||
"usage_tips": "Använd detta för att aktivera ventilationsspecifika automationer eller energiövervakning. Om aktivt, överväg att schemalägga ventilation under lågprisperioder."
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"description": "Om realtidsförbrukningsövervakning är aktiv",
|
||||
"long_description": "Indikerar om realtidsövervakning av elförbrukning är aktiverad och aktiv för ditt Tibber-hem. Detta kräver kompatibel mätutrustning (t.ex. Tibber Pulse) och en aktiv prenumeration.",
|
||||
"usage_tips": "Använd detta för att verifiera att realtidsförbrukningen är tillgänglig. Aktivera meddelanden om detta oväntat ändras till 'av', vilket indikerar potentiella hårdvaru- eller anslutningsproblem."
|
||||
}
|
||||
},
|
||||
"home_types": {
|
||||
|
|
@ -377,5 +457,6 @@
|
|||
"ROWHOUSE": "Radhus",
|
||||
"HOUSE": "Hus",
|
||||
"COTTAGE": "Stuga"
|
||||
}
|
||||
},
|
||||
"attribution": "Data tillhandahålls av Tibber"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,14 +5,13 @@ from __future__ import annotations
|
|||
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from .const import ATTRIBUTION, DOMAIN, get_home_type_translation
|
||||
from .const import ATTRIBUTION, DOMAIN, get_home_type_translation, get_translation
|
||||
from .coordinator import TibberPricesDataUpdateCoordinator
|
||||
|
||||
|
||||
class TibberPricesEntity(CoordinatorEntity[TibberPricesDataUpdateCoordinator]):
|
||||
"""TibberPricesEntity class."""
|
||||
|
||||
_attr_attribution = ATTRIBUTION
|
||||
_attr_has_entity_name = True
|
||||
|
||||
def __init__(self, coordinator: TibberPricesDataUpdateCoordinator) -> None:
|
||||
|
|
@ -22,9 +21,13 @@ class TibberPricesEntity(CoordinatorEntity[TibberPricesDataUpdateCoordinator]):
|
|||
# Get device information
|
||||
home_name, home_id, home_type = self._get_device_info()
|
||||
|
||||
# Get translated home type using the configured language
|
||||
# Get configured language
|
||||
language = coordinator.hass.config.language or "en"
|
||||
|
||||
# Get translated home type and attribution
|
||||
translated_model = get_home_type_translation(home_type, language) if home_type else "Unknown"
|
||||
# Get translated attribution, fallback to constant if translation not found
|
||||
self._attr_attribution = get_translation(["attribution"], language) or ATTRIBUTION
|
||||
|
||||
self._attr_device_info = DeviceInfo(
|
||||
entry_type=DeviceEntryType.SERVICE,
|
||||
|
|
@ -50,9 +53,6 @@ class TibberPricesEntity(CoordinatorEntity[TibberPricesDataUpdateCoordinator]):
|
|||
|
||||
if is_subentry:
|
||||
home_name, home_id, home_type = self._get_subentry_device_info()
|
||||
# Add user information if available
|
||||
if user_profile and user_profile.get("name"):
|
||||
home_name = f"{home_name} ({user_profile['name']})"
|
||||
elif user_profile:
|
||||
home_name = self._get_main_entry_device_info(user_profile)
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ from homeassistant.components.sensor import (
|
|||
SensorEntity,
|
||||
SensorEntityDescription,
|
||||
)
|
||||
from homeassistant.const import EntityCategory
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.util import dt as dt_util
|
||||
|
||||
|
|
@ -271,6 +272,23 @@ class TibberPricesSensor(TibberPricesEntity, SensorEntity):
|
|||
"data_timestamp": self._get_data_timestamp,
|
||||
# Price forecast sensor
|
||||
"price_forecast": self._get_price_forecast_value,
|
||||
# Home metadata sensors
|
||||
"home_type": lambda: self._get_home_metadata_value("type"),
|
||||
"home_size": lambda: self._get_home_metadata_value("size"),
|
||||
"main_fuse_size": lambda: self._get_home_metadata_value("mainFuseSize"),
|
||||
"number_of_residents": lambda: self._get_home_metadata_value("numberOfResidents"),
|
||||
"primary_heating_source": lambda: self._get_home_metadata_value("primaryHeatingSource"),
|
||||
# Metering point sensors
|
||||
"grid_company": lambda: self._get_metering_point_value("gridCompany"),
|
||||
"grid_area_code": lambda: self._get_metering_point_value("gridAreaCode"),
|
||||
"price_area_code": lambda: self._get_metering_point_value("priceAreaCode"),
|
||||
"consumption_ean": lambda: self._get_metering_point_value("consumptionEan"),
|
||||
"production_ean": lambda: self._get_metering_point_value("productionEan"),
|
||||
"energy_tax_type": lambda: self._get_metering_point_value("energyTaxType"),
|
||||
"vat_type": lambda: self._get_metering_point_value("vatType"),
|
||||
"estimated_annual_consumption": lambda: self._get_metering_point_value("estimatedAnnualConsumption"),
|
||||
# Subscription sensors
|
||||
"subscription_status": lambda: self._get_subscription_value("status"),
|
||||
# Volatility sensors
|
||||
"today_volatility": lambda: self._get_volatility_value(volatility_type="today"),
|
||||
"tomorrow_volatility": lambda: self._get_volatility_value(volatility_type="tomorrow"),
|
||||
|
|
@ -1220,6 +1238,109 @@ class TibberPricesSensor(TibberPricesEntity, SensorEntity):
|
|||
# Return a simple status message indicating how much forecast data is available
|
||||
return f"Forecast available for {len(future_prices)} intervals"
|
||||
|
||||
def _get_home_metadata_value(self, field: str) -> str | int | None:
|
||||
"""
|
||||
Get home metadata value from user data.
|
||||
|
||||
String values are converted to lowercase for ENUM device_class compatibility.
|
||||
"""
|
||||
user_homes = self.coordinator.get_user_homes()
|
||||
if not user_homes:
|
||||
return None
|
||||
|
||||
# Find the home matching this sensor's home_id
|
||||
home_id = self.coordinator.config_entry.data.get("home_id")
|
||||
if not home_id:
|
||||
return None
|
||||
|
||||
home_data = next((home for home in user_homes if home.get("id") == home_id), None)
|
||||
if not home_data:
|
||||
return None
|
||||
|
||||
value = home_data.get(field)
|
||||
|
||||
# Convert string to lowercase for ENUM device_class
|
||||
if isinstance(value, str):
|
||||
return value.lower()
|
||||
|
||||
return value
|
||||
|
||||
def _get_metering_point_value(self, field: str) -> str | int | None:
|
||||
"""Get metering point data value from user data."""
|
||||
user_homes = self.coordinator.get_user_homes()
|
||||
if not user_homes:
|
||||
return None
|
||||
|
||||
home_id = self.coordinator.config_entry.data.get("home_id")
|
||||
if not home_id:
|
||||
return None
|
||||
|
||||
home_data = next((home for home in user_homes if home.get("id") == home_id), None)
|
||||
if not home_data:
|
||||
return None
|
||||
|
||||
metering_point = home_data.get("meteringPointData")
|
||||
if not metering_point:
|
||||
return None
|
||||
|
||||
return metering_point.get(field)
|
||||
|
||||
def _get_subscription_value(self, field: str) -> str | None:
|
||||
"""
|
||||
Get subscription value from user data.
|
||||
|
||||
String values are converted to lowercase for ENUM device_class compatibility.
|
||||
"""
|
||||
user_homes = self.coordinator.get_user_homes()
|
||||
if not user_homes:
|
||||
return None
|
||||
|
||||
home_id = self.coordinator.config_entry.data.get("home_id")
|
||||
if not home_id:
|
||||
return None
|
||||
|
||||
home_data = next((home for home in user_homes if home.get("id") == home_id), None)
|
||||
if not home_data:
|
||||
return None
|
||||
|
||||
subscription = home_data.get("currentSubscription")
|
||||
if not subscription:
|
||||
return None
|
||||
|
||||
value = subscription.get(field)
|
||||
|
||||
# Convert string to lowercase for ENUM device_class
|
||||
if isinstance(value, str):
|
||||
return value.lower()
|
||||
|
||||
return value
|
||||
|
||||
@property
|
||||
def available(self) -> bool:
|
||||
"""
|
||||
Return if entity is available.
|
||||
|
||||
For diagnostic sensors, hide them if they have no data (return None).
|
||||
User requirement: Don't show sensors with "Unknown" state.
|
||||
"""
|
||||
# First check if coordinator is available
|
||||
if not super().available:
|
||||
return False
|
||||
|
||||
# For diagnostic sensors with no data, hide them completely
|
||||
if self.entity_description.entity_category == EntityCategory.DIAGNOSTIC:
|
||||
try:
|
||||
value = self.native_value
|
||||
except (KeyError, ValueError, TypeError):
|
||||
# If we can't get the value, hide the sensor
|
||||
return False
|
||||
else:
|
||||
# Hide sensor if value is None (no data available)
|
||||
return value is not None
|
||||
|
||||
# For all other sensors, use default availability
|
||||
return True
|
||||
|
||||
@property
|
||||
def native_value(self) -> float | str | datetime | None:
|
||||
"""Return the native value of the sensor."""
|
||||
|
|
|
|||
|
|
@ -23,7 +23,14 @@ from homeassistant.components.sensor import (
|
|||
SensorEntityDescription,
|
||||
SensorStateClass,
|
||||
)
|
||||
from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfTime
|
||||
from homeassistant.const import (
|
||||
PERCENTAGE,
|
||||
EntityCategory,
|
||||
UnitOfArea,
|
||||
UnitOfElectricCurrent,
|
||||
UnitOfEnergy,
|
||||
UnitOfTime,
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# SENSOR DEFINITIONS - Grouped by calculation method
|
||||
|
|
@ -822,6 +829,155 @@ DIAGNOSTIC_SENSORS = (
|
|||
state_class=None, # Text/status value: no statistics
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
),
|
||||
# Home metadata from user data
|
||||
SensorEntityDescription(
|
||||
key="home_type",
|
||||
translation_key="home_type",
|
||||
name="Home Type",
|
||||
icon="mdi:home-variant",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
device_class=SensorDeviceClass.ENUM,
|
||||
options=["apartment", "rowhouse", "house", "cottage"],
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="home_size",
|
||||
translation_key="home_size",
|
||||
name="Home Size",
|
||||
icon="mdi:ruler-square",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
native_unit_of_measurement=UnitOfArea.SQUARE_METERS,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
entity_registry_enabled_default=False,
|
||||
suggested_display_precision=0,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="main_fuse_size",
|
||||
translation_key="main_fuse_size",
|
||||
name="Main Fuse Size",
|
||||
icon="mdi:fuse",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
|
||||
device_class=SensorDeviceClass.CURRENT,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
entity_registry_enabled_default=False,
|
||||
suggested_display_precision=0,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="number_of_residents",
|
||||
translation_key="number_of_residents",
|
||||
name="Number of Residents",
|
||||
icon="mdi:account-group",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
entity_registry_enabled_default=False,
|
||||
suggested_display_precision=0,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="primary_heating_source",
|
||||
translation_key="primary_heating_source",
|
||||
name="Primary Heating Source",
|
||||
icon="mdi:heating-coil",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
device_class=SensorDeviceClass.ENUM,
|
||||
options=[
|
||||
"air2air_heatpump",
|
||||
"air2water_heatpump",
|
||||
"boiler",
|
||||
"central_heating",
|
||||
"district_heating",
|
||||
"district_heating",
|
||||
"district",
|
||||
"electric_boiler",
|
||||
"electricity",
|
||||
"floor",
|
||||
"gas",
|
||||
"ground_heatpump",
|
||||
"ground",
|
||||
"oil",
|
||||
"other",
|
||||
"waste",
|
||||
],
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
# Metering point data
|
||||
SensorEntityDescription(
|
||||
key="grid_company",
|
||||
translation_key="grid_company",
|
||||
name="Grid Company",
|
||||
icon="mdi:transmission-tower",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="grid_area_code",
|
||||
translation_key="grid_area_code",
|
||||
name="Grid Area Code",
|
||||
icon="mdi:map-marker",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="price_area_code",
|
||||
translation_key="price_area_code",
|
||||
name="Price Area Code",
|
||||
icon="mdi:currency-eur",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="consumption_ean",
|
||||
translation_key="consumption_ean",
|
||||
name="Consumption EAN",
|
||||
icon="mdi:barcode",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="production_ean",
|
||||
translation_key="production_ean",
|
||||
name="Production EAN",
|
||||
icon="mdi:solar-power",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="energy_tax_type",
|
||||
translation_key="energy_tax_type",
|
||||
name="Energy Tax Type",
|
||||
icon="mdi:cash",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="vat_type",
|
||||
translation_key="vat_type",
|
||||
name="VAT Type",
|
||||
icon="mdi:percent",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
SensorEntityDescription(
|
||||
key="estimated_annual_consumption",
|
||||
translation_key="estimated_annual_consumption",
|
||||
name="Estimated Annual Consumption",
|
||||
icon="mdi:lightning-bolt",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
state_class=SensorStateClass.TOTAL,
|
||||
suggested_display_precision=0,
|
||||
),
|
||||
# Subscription data
|
||||
SensorEntityDescription(
|
||||
key="subscription_status",
|
||||
translation_key="subscription_status",
|
||||
name="Subscription Status",
|
||||
icon="mdi:file-document-check",
|
||||
entity_category=EntityCategory.DIAGNOSTIC,
|
||||
device_class=SensorDeviceClass.ENUM,
|
||||
options=["running", "ended", "pending", "unknown"],
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
)
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -552,20 +552,97 @@
|
|||
},
|
||||
"price_forecast": {
|
||||
"name": "Preisprognose"
|
||||
},
|
||||
"home_type": {
|
||||
"name": "Wohnungstyp",
|
||||
"state": {
|
||||
"apartment": "Wohnung",
|
||||
"rowhouse": "Reihenhaus",
|
||||
"house": "Haus",
|
||||
"cottage": "Ferienhaus"
|
||||
}
|
||||
},
|
||||
"home_size": {
|
||||
"name": "Wohnfläche"
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"name": "Hauptsicherung"
|
||||
},
|
||||
"number_of_residents": {
|
||||
"name": "Anzahl Bewohner"
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"name": "Primäre Heizquelle",
|
||||
"state": {
|
||||
"air2air_heatpump": "Luft-Luft-Wärmepumpe",
|
||||
"air2water_heatpump": "Luft-Wasser-Wärmepumpe",
|
||||
"boiler": "Boiler",
|
||||
"central_heating": "Zentralheizung",
|
||||
"district_heating": "Fernwärme",
|
||||
"district": "Fernwärme",
|
||||
"electric_boiler": "Elektroboiler",
|
||||
"electricity": "Elektroheizung",
|
||||
"floor": "Fußbodenheizung",
|
||||
"gas": "Gas",
|
||||
"ground_heatpump": "Erdwärmepumpe",
|
||||
"ground": "Erdwärmepumpe",
|
||||
"oil": "Öl",
|
||||
"other": "Sonstige",
|
||||
"waste": "Abwärme"
|
||||
}
|
||||
},
|
||||
"grid_company": {
|
||||
"name": "Netzbetreiber"
|
||||
},
|
||||
"grid_area_code": {
|
||||
"name": "Netzgebietscode"
|
||||
},
|
||||
"price_area_code": {
|
||||
"name": "Preiszonencode"
|
||||
},
|
||||
"consumption_ean": {
|
||||
"name": "Verbrauchs-EAN"
|
||||
},
|
||||
"production_ean": {
|
||||
"name": "Erzeugungs-EAN"
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"name": "Energiesteuertyp"
|
||||
},
|
||||
"vat_type": {
|
||||
"name": "Mehrwertsteuertyp"
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"name": "Geschätzter Jahresverbrauch"
|
||||
},
|
||||
"subscription_status": {
|
||||
"name": "Abonnementstatus",
|
||||
"state": {
|
||||
"running": "Aktiv",
|
||||
"ended": "Beendet",
|
||||
"pending": "Ausstehend",
|
||||
"unknown": "Unbekannt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
"peak_price_period": {
|
||||
"name": "Spitzenpreis-Periode"
|
||||
"name": "Höchstpreis-Zeitraum"
|
||||
},
|
||||
"best_price_period": {
|
||||
"name": "Bestpreis-Periode"
|
||||
"name": "Bestpreis-Zeitraum"
|
||||
},
|
||||
"connection": {
|
||||
"name": "Tibber API-Verbindung"
|
||||
"name": "Tibber-API-Verbindung"
|
||||
},
|
||||
"tomorrow_data_available": {
|
||||
"name": "Daten für morgen verfügbar"
|
||||
"name": "Morgige Daten verfügbar"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"name": "Hat Lüftungsanlage"
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"name": "Echtzeitverbrauch aktiviert"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -548,6 +548,77 @@
|
|||
},
|
||||
"price_forecast": {
|
||||
"name": "Price Forecast"
|
||||
},
|
||||
"home_type": {
|
||||
"name": "Home Type",
|
||||
"state": {
|
||||
"apartment": "Apartment",
|
||||
"rowhouse": "Rowhouse",
|
||||
"house": "House",
|
||||
"cottage": "Cottage"
|
||||
}
|
||||
},
|
||||
"home_size": {
|
||||
"name": "Home Size"
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"name": "Main Fuse Size"
|
||||
},
|
||||
"number_of_residents": {
|
||||
"name": "Number of Residents"
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"name": "Primary Heating Source",
|
||||
"state": {
|
||||
"air2air_heatpump": "Air-to-Air Heat Pump",
|
||||
"air2water_heatpump": "Air-to-Water Heat Pump",
|
||||
"boiler": "Boiler",
|
||||
"central_heating": "Central Heating",
|
||||
"district_heating": "District Heating",
|
||||
"district": "District Heating",
|
||||
"electric_boiler": "Electric Boiler",
|
||||
"electricity": "Electricity",
|
||||
"floor": "Floor Heating",
|
||||
"gas": "Gas",
|
||||
"ground_heatpump": "Ground Heat Pump",
|
||||
"ground": "Ground Heat Pump",
|
||||
"oil": "Oil",
|
||||
"other": "Other",
|
||||
"waste": "Waste Heat"
|
||||
}
|
||||
},
|
||||
"grid_company": {
|
||||
"name": "Grid Company"
|
||||
},
|
||||
"grid_area_code": {
|
||||
"name": "Grid Area Code"
|
||||
},
|
||||
"price_area_code": {
|
||||
"name": "Price Area Code"
|
||||
},
|
||||
"consumption_ean": {
|
||||
"name": "Consumption EAN"
|
||||
},
|
||||
"production_ean": {
|
||||
"name": "Production EAN"
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"name": "Energy Tax Type"
|
||||
},
|
||||
"vat_type": {
|
||||
"name": "VAT Type"
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"name": "Estimated Annual Consumption"
|
||||
},
|
||||
"subscription_status": {
|
||||
"name": "Subscription Status",
|
||||
"state": {
|
||||
"running": "Running",
|
||||
"ended": "Ended",
|
||||
"pending": "Pending",
|
||||
"unknown": "Unknown"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
|
|
@ -562,6 +633,12 @@
|
|||
},
|
||||
"tomorrow_data_available": {
|
||||
"name": "Tomorrow's Data Available"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"name": "Has Ventilation System"
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"name": "Realtime Consumption Enabled"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -548,20 +548,97 @@
|
|||
},
|
||||
"price_forecast": {
|
||||
"name": "Prisprognose"
|
||||
},
|
||||
"home_type": {
|
||||
"name": "Boligtype",
|
||||
"state": {
|
||||
"apartment": "Leilighet",
|
||||
"rowhouse": "Rekkehus",
|
||||
"house": "Hus",
|
||||
"cottage": "Hytte"
|
||||
}
|
||||
},
|
||||
"home_size": {
|
||||
"name": "Boligareal"
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"name": "Hovedsikring"
|
||||
},
|
||||
"number_of_residents": {
|
||||
"name": "Antall beboere"
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"name": "Primær varmekilde",
|
||||
"state": {
|
||||
"air2air_heatpump": "Luft-til-luft-varmepumpe",
|
||||
"air2water_heatpump": "Luft-til-vann-varmepumpe",
|
||||
"boiler": "Varmtvannsbereder",
|
||||
"central_heating": "Sentralvarme",
|
||||
"district_heating": "Fjernvarme",
|
||||
"district": "Fjernvarme",
|
||||
"electric_boiler": "Elektrisk varmtvannsbereder",
|
||||
"electricity": "Elektrisitet",
|
||||
"floor": "Gulvvarme",
|
||||
"gas": "Gass",
|
||||
"ground_heatpump": "Jordvarmepumpe",
|
||||
"ground": "Jordvarmepumpe",
|
||||
"oil": "Olje",
|
||||
"other": "Annet",
|
||||
"waste": "Spillvarme"
|
||||
}
|
||||
},
|
||||
"grid_company": {
|
||||
"name": "Nettselskap"
|
||||
},
|
||||
"grid_area_code": {
|
||||
"name": "Nettområdekode"
|
||||
},
|
||||
"price_area_code": {
|
||||
"name": "Prisområdekode"
|
||||
},
|
||||
"consumption_ean": {
|
||||
"name": "Forbruks-EAN"
|
||||
},
|
||||
"production_ean": {
|
||||
"name": "Produksjons-EAN"
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"name": "Energiavgiftstype"
|
||||
},
|
||||
"vat_type": {
|
||||
"name": "MVA-type"
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"name": "Estimert årlig forbruk"
|
||||
},
|
||||
"subscription_status": {
|
||||
"name": "Abonnementsstatus",
|
||||
"state": {
|
||||
"running": "Aktiv",
|
||||
"ended": "Avsluttet",
|
||||
"pending": "Venter",
|
||||
"unknown": "Ukjent"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
"peak_price_period": {
|
||||
"name": "Topprisperiode"
|
||||
"name": "Toppris-periode"
|
||||
},
|
||||
"best_price_period": {
|
||||
"name": "Beste prisperiode"
|
||||
"name": "Lavpris-periode"
|
||||
},
|
||||
"connection": {
|
||||
"name": "Tibber API-tilkobling"
|
||||
},
|
||||
"tomorrow_data_available": {
|
||||
"name": "Morgendagens data tilgjengelig"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"name": "Har ventilasjonsanlegg"
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"name": "Sanntidsforbruk aktivert"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -548,20 +548,97 @@
|
|||
},
|
||||
"price_forecast": {
|
||||
"name": "Prijsprognose"
|
||||
},
|
||||
"home_type": {
|
||||
"name": "Woningtype",
|
||||
"state": {
|
||||
"apartment": "Appartement",
|
||||
"rowhouse": "Rijtjeshuis",
|
||||
"house": "Huis",
|
||||
"cottage": "Vakantiehuis"
|
||||
}
|
||||
},
|
||||
"home_size": {
|
||||
"name": "Woonoppervlakte"
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"name": "Hoofdzekering"
|
||||
},
|
||||
"number_of_residents": {
|
||||
"name": "Aantal bewoners"
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"name": "Primaire warmtebron",
|
||||
"state": {
|
||||
"air2air_heatpump": "Lucht-lucht-warmtepomp",
|
||||
"air2water_heatpump": "Lucht-water-warmtepomp",
|
||||
"boiler": "Boiler",
|
||||
"central_heating": "Centrale verwarming",
|
||||
"district_heating": "Stadsverwarming",
|
||||
"district": "Stadsverwarming",
|
||||
"electric_boiler": "Elektrische boiler",
|
||||
"electricity": "Elektriciteit",
|
||||
"floor": "Vloerverwarming",
|
||||
"gas": "Gas",
|
||||
"ground_heatpump": "Bodemwarmtepomp",
|
||||
"ground": "Bodemwarmtepomp",
|
||||
"oil": "Olie",
|
||||
"other": "Anders",
|
||||
"waste": "Restwarmte"
|
||||
}
|
||||
},
|
||||
"grid_company": {
|
||||
"name": "Netbeheerder"
|
||||
},
|
||||
"grid_area_code": {
|
||||
"name": "Netgebiedcode"
|
||||
},
|
||||
"price_area_code": {
|
||||
"name": "Prijszonecode"
|
||||
},
|
||||
"consumption_ean": {
|
||||
"name": "Verbruiks-EAN"
|
||||
},
|
||||
"production_ean": {
|
||||
"name": "Productie-EAN"
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"name": "Energiebelastingtype"
|
||||
},
|
||||
"vat_type": {
|
||||
"name": "BTW-type"
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"name": "Geschat jaarverbruik"
|
||||
},
|
||||
"subscription_status": {
|
||||
"name": "Abonnementsstatus",
|
||||
"state": {
|
||||
"running": "Actief",
|
||||
"ended": "Beëindigd",
|
||||
"pending": "In afwachting",
|
||||
"unknown": "Onbekend"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
"peak_price_period": {
|
||||
"name": "Piekprijsperiode"
|
||||
"name": "Piekprijs-periode"
|
||||
},
|
||||
"best_price_period": {
|
||||
"name": "Beste prijsperiode"
|
||||
"name": "Beste prijs-periode"
|
||||
},
|
||||
"connection": {
|
||||
"name": "Tibber API-verbinding"
|
||||
},
|
||||
"tomorrow_data_available": {
|
||||
"name": "Gegevens van morgen beschikbaar"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"name": "Heeft ventilatiesysteem"
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"name": "Realtime verbruik ingeschakeld"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -548,20 +548,97 @@
|
|||
},
|
||||
"price_forecast": {
|
||||
"name": "Prisprognos"
|
||||
},
|
||||
"home_type": {
|
||||
"name": "Bostadstyp",
|
||||
"state": {
|
||||
"apartment": "Lägenhet",
|
||||
"rowhouse": "Radhus",
|
||||
"house": "Hus",
|
||||
"cottage": "Stuga"
|
||||
}
|
||||
},
|
||||
"home_size": {
|
||||
"name": "Boyta"
|
||||
},
|
||||
"main_fuse_size": {
|
||||
"name": "Huvudsäkring"
|
||||
},
|
||||
"number_of_residents": {
|
||||
"name": "Antal boende"
|
||||
},
|
||||
"primary_heating_source": {
|
||||
"name": "Primär värmekälla",
|
||||
"state": {
|
||||
"air2air_heatpump": "Luft-till-luft-värmepump",
|
||||
"air2water_heatpump": "Luft-till-vatten-värmepump",
|
||||
"boiler": "Varmvattenberedare",
|
||||
"central_heating": "Centralvärme",
|
||||
"district_heating": "Fjärrvärme",
|
||||
"district": "Fjärrvärme",
|
||||
"electric_boiler": "Elektrisk varmvattenberedare",
|
||||
"electricity": "Elektricitet",
|
||||
"floor": "Golvvärme",
|
||||
"gas": "Gas",
|
||||
"ground_heatpump": "Bergvärmepump",
|
||||
"ground": "Bergvärmepump",
|
||||
"oil": "Olja",
|
||||
"other": "Annat",
|
||||
"waste": "Spillvärme"
|
||||
}
|
||||
},
|
||||
"grid_company": {
|
||||
"name": "Nätbolag"
|
||||
},
|
||||
"grid_area_code": {
|
||||
"name": "Nätområdeskod"
|
||||
},
|
||||
"price_area_code": {
|
||||
"name": "Prisområdeskod"
|
||||
},
|
||||
"consumption_ean": {
|
||||
"name": "Förbruknings-EAN"
|
||||
},
|
||||
"production_ean": {
|
||||
"name": "Produktions-EAN"
|
||||
},
|
||||
"energy_tax_type": {
|
||||
"name": "Energiskattetyp"
|
||||
},
|
||||
"vat_type": {
|
||||
"name": "Momstyp"
|
||||
},
|
||||
"estimated_annual_consumption": {
|
||||
"name": "Uppskattat årsförbrukning"
|
||||
},
|
||||
"subscription_status": {
|
||||
"name": "Abonnemangsstatus",
|
||||
"state": {
|
||||
"running": "Aktiv",
|
||||
"ended": "Avslutad",
|
||||
"pending": "Väntar",
|
||||
"unknown": "Okänd"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary_sensor": {
|
||||
"peak_price_period": {
|
||||
"name": "Topprisperiod"
|
||||
"name": "Toppris-period"
|
||||
},
|
||||
"best_price_period": {
|
||||
"name": "Bästa prisperiod"
|
||||
"name": "Bästa pris-period"
|
||||
},
|
||||
"connection": {
|
||||
"name": "Tibber API-anslutning"
|
||||
},
|
||||
"tomorrow_data_available": {
|
||||
"name": "Morgondagens data tillgänglig"
|
||||
},
|
||||
"has_ventilation_system": {
|
||||
"name": "Har ventilationssystem"
|
||||
},
|
||||
"realtime_consumption_enabled": {
|
||||
"name": "Realtidsförbrukning aktiverad"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in a new issue