Add label registry (#110821)

This commit is contained in:
Franck Nijhof 2024-02-19 11:59:08 +01:00 committed by GitHub
parent 8201ea4b3c
commit e0a9dcd996
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
134 changed files with 6045 additions and 23 deletions

View File

@ -35,6 +35,7 @@ from .helpers import (
entity_registry,
floor_registry,
issue_registry,
label_registry,
recorder,
restore_state,
template,
@ -304,6 +305,7 @@ async def async_load_base_functionality(hass: core.HomeAssistant) -> None:
entity_registry.async_load(hass),
floor_registry.async_load(hass),
issue_registry.async_load(hass),
label_registry.async_load(hass),
hass.async_add_executor_job(_cache_uname_processor),
template.async_load_custom_templates(hass),
restore_state.async_load(hass),

View File

@ -37,6 +37,7 @@ SECTIONS = (
"device_registry",
"entity_registry",
"floor_registry",
"label_registry",
"script",
"scene",
)

View File

@ -0,0 +1,130 @@
"""Websocket API to interact with the label registry."""
from typing import Any
import voluptuous as vol
from homeassistant.components import websocket_api
from homeassistant.components.websocket_api.connection import ActiveConnection
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.label_registry import LabelEntry, async_get
@callback
def async_setup(hass: HomeAssistant) -> bool:
"""Register the Label Registry WS commands."""
websocket_api.async_register_command(hass, websocket_list_labels)
websocket_api.async_register_command(hass, websocket_create_label)
websocket_api.async_register_command(hass, websocket_delete_label)
websocket_api.async_register_command(hass, websocket_update_label)
return True
@websocket_api.websocket_command(
{
vol.Required("type"): "config/label_registry/list",
}
)
@callback
def websocket_list_labels(
hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
) -> None:
"""Handle list labels command."""
registry = async_get(hass)
connection.send_result(
msg["id"],
[_entry_dict(entry) for entry in registry.async_list_labels()],
)
@websocket_api.websocket_command(
{
vol.Required("type"): "config/label_registry/create",
vol.Required("name"): str,
vol.Optional("color"): vol.Any(cv.color_hex, None),
vol.Optional("description"): vol.Any(str, None),
vol.Optional("icon"): vol.Any(cv.icon, None),
}
)
@websocket_api.require_admin
@callback
def websocket_create_label(
hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
) -> None:
"""Create label command."""
registry = async_get(hass)
data = dict(msg)
data.pop("type")
data.pop("id")
try:
entry = registry.async_create(**data)
except ValueError as err:
connection.send_error(msg["id"], "invalid_info", str(err))
else:
connection.send_result(msg["id"], _entry_dict(entry))
@websocket_api.websocket_command(
{
vol.Required("type"): "config/label_registry/delete",
vol.Required("label_id"): str,
}
)
@websocket_api.require_admin
@callback
def websocket_delete_label(
hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
) -> None:
"""Delete label command."""
registry = async_get(hass)
try:
registry.async_delete(msg["label_id"])
except KeyError:
connection.send_error(msg["id"], "invalid_info", "Label ID doesn't exist")
else:
connection.send_result(msg["id"])
@websocket_api.websocket_command(
{
vol.Required("type"): "config/label_registry/update",
vol.Required("label_id"): str,
vol.Optional("color"): vol.Any(cv.color_hex, None),
vol.Optional("description"): vol.Any(str, None),
vol.Optional("icon"): vol.Any(cv.icon, None),
vol.Optional("name"): str,
}
)
@websocket_api.require_admin
@callback
def websocket_update_label(
hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
) -> None:
"""Handle update label websocket command."""
registry = async_get(hass)
data = dict(msg)
data.pop("type")
data.pop("id")
try:
entry = registry.async_update(**data)
except ValueError as err:
connection.send_error(msg["id"], "invalid_info", str(err))
else:
connection.send_result(msg["id"], _entry_dict(entry))
@callback
def _entry_dict(entry: LabelEntry) -> dict[str, Any]:
"""Convert entry to API format."""
return {
"color": entry.color,
"description": entry.description,
"icon": entry.icon,
"label_id": entry.label_id,
"name": entry.name,
}

View File

@ -17,7 +17,7 @@ DATA_REGISTRY = "area_registry"
EVENT_AREA_REGISTRY_UPDATED = "area_registry_updated"
STORAGE_KEY = "core.area_registry"
STORAGE_VERSION_MAJOR = 1
STORAGE_VERSION_MINOR = 5
STORAGE_VERSION_MINOR = 6
SAVE_DELAY = 10
@ -36,6 +36,7 @@ class AreaEntry:
floor_id: str | None
icon: str | None
id: str
labels: set[str] = dataclasses.field(default_factory=set)
name: str
normalized_name: str
picture: str | None
@ -119,6 +120,11 @@ class AreaRegistryStore(Store[dict[str, list[dict[str, Any]]]]):
for area in old_data["areas"]:
area["floor_id"] = None
if old_minor_version < 6:
# Version 1.6 adds labels
for area in old_data["areas"]:
area["labels"] = []
if old_major_version > 1:
raise NotImplementedError
return old_data
@ -175,6 +181,7 @@ class AreaRegistry:
aliases: set[str] | None = None,
floor_id: str | None = None,
icon: str | None = None,
labels: set[str] | None = None,
picture: str | None = None,
) -> AreaEntry:
"""Create a new area."""
@ -189,6 +196,7 @@ class AreaRegistry:
floor_id=floor_id,
icon=icon,
id=area_id,
labels=labels or set(),
name=name,
normalized_name=normalized_name,
picture=picture,
@ -225,6 +233,7 @@ class AreaRegistry:
aliases: set[str] | UndefinedType = UNDEFINED,
floor_id: str | None | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED,
labels: set[str] | UndefinedType = UNDEFINED,
name: str | UndefinedType = UNDEFINED,
picture: str | None | UndefinedType = UNDEFINED,
) -> AreaEntry:
@ -234,6 +243,7 @@ class AreaRegistry:
aliases=aliases,
floor_id=floor_id,
icon=icon,
labels=labels,
name=name,
picture=picture,
)
@ -250,6 +260,7 @@ class AreaRegistry:
aliases: set[str] | UndefinedType = UNDEFINED,
floor_id: str | None | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED,
labels: set[str] | UndefinedType = UNDEFINED,
name: str | UndefinedType = UNDEFINED,
picture: str | None | UndefinedType = UNDEFINED,
) -> AreaEntry:
@ -261,6 +272,7 @@ class AreaRegistry:
for attr_name, value in (
("aliases", aliases),
("icon", icon),
("labels", labels),
("picture", picture),
("floor_id", floor_id),
):
@ -296,6 +308,7 @@ class AreaRegistry:
floor_id=area["floor_id"],
icon=area["icon"],
id=area["id"],
labels=set(area["labels"]),
name=area["name"],
normalized_name=normalized_name,
picture=area["picture"],
@ -320,6 +333,7 @@ class AreaRegistry:
"floor_id": entry.floor_id,
"icon": entry.icon,
"id": entry.id,
"labels": list(entry.labels),
"name": entry.name,
"picture": entry.picture,
}
@ -341,13 +355,16 @@ class AreaRegistry:
def _async_setup_cleanup(self) -> None:
"""Set up the area registry cleanup."""
# pylint: disable-next=import-outside-toplevel
from . import floor_registry as fr # Circular dependency
from . import ( # Circular dependencies
floor_registry as fr,
label_registry as lr,
)
@callback
def _floor_removed_from_registry_filter(
event: fr.EventFloorRegistryUpdated,
def _removed_from_registry_filter(
event: fr.EventFloorRegistryUpdated | lr.EventLabelRegistryUpdated,
) -> bool:
"""Filter all except for the remove action from floor registry events."""
"""Filter all except for the item removed from registry events."""
return event.data["action"] == "remove"
@callback
@ -360,10 +377,26 @@ class AreaRegistry:
self.hass.bus.async_listen(
event_type=fr.EVENT_FLOOR_REGISTRY_UPDATED,
event_filter=_floor_removed_from_registry_filter, # type: ignore[arg-type]
event_filter=_removed_from_registry_filter, # type: ignore[arg-type]
listener=_handle_floor_registry_update, # type: ignore[arg-type]
)
@callback
def _handle_label_registry_update(event: lr.EventLabelRegistryUpdated) -> None:
"""Update areas that have a label that has been removed."""
label_id = event.data["label_id"]
for area_id, area in self.areas.items():
if label_id in area.labels:
labels = area.labels.copy()
labels.remove(label_id)
self.async_update(area_id, labels=labels)
self.hass.bus.async_listen(
event_type=lr.EVENT_LABEL_REGISTRY_UPDATED,
event_filter=_removed_from_registry_filter, # type: ignore[arg-type]
listener=_handle_label_registry_update, # type: ignore[arg-type]
)
@callback
def async_get(hass: HomeAssistant) -> AreaRegistry:
@ -380,10 +413,16 @@ async def async_load(hass: HomeAssistant) -> None:
@callback
def async_entries_for_floor(registry: AreaRegistry, floor_id: str) -> list[AreaEntry]:
"""Return entries that match an floor."""
"""Return entries that match a floor."""
return [area for area in registry.areas.values() if floor_id == area.floor_id]
@callback
def async_entries_for_label(registry: AreaRegistry, label_id: str) -> list[AreaEntry]:
"""Return entries that match a label."""
return [area for area in registry.areas.values() if label_id in area.labels]
def normalize_area_name(area_name: str) -> str:
"""Normalize an area name by removing whitespace and case folding."""
return area_name.casefold().replace(" ", "")

View File

@ -43,7 +43,7 @@ DATA_REGISTRY = "device_registry"
EVENT_DEVICE_REGISTRY_UPDATED = "device_registry_updated"
STORAGE_KEY = "core.device_registry"
STORAGE_VERSION_MAJOR = 1
STORAGE_VERSION_MINOR = 4
STORAGE_VERSION_MINOR = 5
SAVE_DELAY = 10
CLEANUP_DELAY = 10
@ -238,6 +238,7 @@ class DeviceEntry:
hw_version: str | None = attr.ib(default=None)
id: str = attr.ib(factory=uuid_util.random_uuid_hex)
identifiers: set[tuple[str, str]] = attr.ib(converter=set, factory=set)
labels: set[str] = attr.ib(converter=set, factory=set)
manufacturer: str | None = attr.ib(default=None)
model: str | None = attr.ib(default=None)
name_by_user: str | None = attr.ib(default=None)
@ -378,6 +379,10 @@ class DeviceRegistryStore(storage.Store[dict[str, list[dict[str, Any]]]]):
# Introduced in 2023.11
for device in old_data["devices"]:
device["serial_number"] = None
if old_minor_version < 5:
# Introduced in 2024.3
for device in old_data["devices"]:
device["labels"] = device.get("labels", [])
if old_major_version > 1:
raise NotImplementedError
@ -634,6 +639,7 @@ class DeviceRegistry:
disabled_by: DeviceEntryDisabler | None | UndefinedType = UNDEFINED,
entry_type: DeviceEntryType | None | UndefinedType = UNDEFINED,
hw_version: str | None | UndefinedType = UNDEFINED,
labels: set[str] | UndefinedType = UNDEFINED,
manufacturer: str | None | UndefinedType = UNDEFINED,
merge_connections: set[tuple[str, str]] | UndefinedType = UNDEFINED,
merge_identifiers: set[tuple[str, str]] | UndefinedType = UNDEFINED,
@ -728,6 +734,7 @@ class DeviceRegistry:
("disabled_by", disabled_by),
("entry_type", entry_type),
("hw_version", hw_version),
("labels", labels),
("manufacturer", manufacturer),
("model", model),
("name", name),
@ -822,6 +829,7 @@ class DeviceRegistry:
tuple(iden) # type: ignore[misc]
for iden in device["identifiers"]
},
labels=set(device["labels"]),
manufacturer=device["manufacturer"],
model=device["model"],
name_by_user=device["name_by_user"],
@ -865,6 +873,7 @@ class DeviceRegistry:
"hw_version": entry.hw_version,
"id": entry.id,
"identifiers": list(entry.identifiers),
"labels": list(entry.labels),
"manufacturer": entry.manufacturer,
"model": entry.model,
"name_by_user": entry.name_by_user,
@ -937,6 +946,15 @@ class DeviceRegistry:
if area_id == device.area_id:
self.async_update_device(dev_id, area_id=None)
@callback
def async_clear_label_id(self, label_id: str) -> None:
"""Clear label from registry entries."""
for device_id, entry in self.devices.items():
if label_id in entry.labels:
labels = entry.labels.copy()
labels.remove(label_id)
self.async_update_device(device_id, labels=labels)
@callback
def async_get(hass: HomeAssistant) -> DeviceRegistry:
@ -957,6 +975,14 @@ def async_entries_for_area(registry: DeviceRegistry, area_id: str) -> list[Devic
return [device for device in registry.devices.values() if device.area_id == area_id]
@callback
def async_entries_for_label(
registry: DeviceRegistry, label_id: str
) -> list[DeviceEntry]:
"""Return entries that match a label."""
return [device for device in registry.devices.values() if label_id in device.labels]
@callback
def async_entries_for_config_entry(
registry: DeviceRegistry, config_entry_id: str
@ -1051,7 +1077,26 @@ def async_cleanup(
@callback
def async_setup_cleanup(hass: HomeAssistant, dev_reg: DeviceRegistry) -> None:
"""Clean up device registry when entities removed."""
from . import entity_registry # pylint: disable=import-outside-toplevel
# pylint: disable-next=import-outside-toplevel
from . import entity_registry, label_registry as lr
@callback
def _label_removed_from_registry_filter(
event: lr.EventLabelRegistryUpdated,
) -> bool:
"""Filter all except for the remove action from label registry events."""
return event.data["action"] == "remove"
@callback
def _handle_label_registry_update(event: lr.EventLabelRegistryUpdated) -> None:
"""Update devices that have a label that has been removed."""
dev_reg.async_clear_label_id(event.data["label_id"])
hass.bus.async_listen(
event_type=lr.EVENT_LABEL_REGISTRY_UPDATED,
event_filter=_label_removed_from_registry_filter, # type: ignore[arg-type]
listener=_handle_label_registry_update, # type: ignore[arg-type]
)
async def cleanup() -> None:
"""Cleanup."""

View File

@ -65,7 +65,7 @@ SAVE_DELAY = 10
_LOGGER = logging.getLogger(__name__)
STORAGE_VERSION_MAJOR = 1
STORAGE_VERSION_MINOR = 12
STORAGE_VERSION_MINOR = 13
STORAGE_KEY = "core.entity_registry"
CLEANUP_INTERVAL = 3600 * 24
@ -135,6 +135,7 @@ ReadOnlyEntityOptionsType = ReadOnlyDict[str, ReadOnlyDict[str, Any]]
DISPLAY_DICT_OPTIONAL = (
("ai", "area_id"),
("lb", "labels"),
("di", "device_id"),
("ic", "icon"),
("tk", "translation_key"),
@ -174,6 +175,7 @@ class RegistryEntry:
converter=attr.converters.default_if_none(factory=uuid_util.random_uuid_hex), # type: ignore[misc]
)
has_entity_name: bool = attr.ib(default=False)
labels: set[str] = attr.ib(factory=set)
name: str | None = attr.ib(default=None)
options: ReadOnlyEntityOptionsType = attr.ib(
default=None, converter=_protect_entity_options
@ -262,6 +264,7 @@ class RegistryEntry:
"hidden_by": self.hidden_by,
"icon": self.icon,
"id": self.id,
"labels": self.labels,
"name": self.name,
"options": self.options,
"original_name": self.original_name,
@ -348,7 +351,7 @@ class DeletedRegistryEntry:
class EntityRegistryStore(storage.Store[dict[str, list[dict[str, Any]]]]):
"""Store entity registry data."""
async def _async_migrate_func(
async def _async_migrate_func( # noqa: C901
self,
old_major_version: int,
old_minor_version: int,
@ -429,6 +432,11 @@ class EntityRegistryStore(storage.Store[dict[str, list[dict[str, Any]]]]):
for entity in data["entities"]:
entity["previous_unique_id"] = None
if old_major_version == 1 and old_minor_version < 13:
# Version 1.13 adds labels
for entity in data["entities"]:
entity["labels"] = []
if old_major_version > 1:
raise NotImplementedError
return data
@ -878,6 +886,7 @@ class EntityRegistry:
hidden_by: RegistryEntryHider | None | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED,
has_entity_name: bool | UndefinedType = UNDEFINED,
labels: set[str] | UndefinedType = UNDEFINED,
name: str | None | UndefinedType = UNDEFINED,
new_entity_id: str | UndefinedType = UNDEFINED,
new_unique_id: str | UndefinedType = UNDEFINED,
@ -928,6 +937,7 @@ class EntityRegistry:
("hidden_by", hidden_by),
("icon", icon),
("has_entity_name", has_entity_name),
("labels", labels),
("name", name),
("options", options),
("original_device_class", original_device_class),
@ -1005,6 +1015,7 @@ class EntityRegistry:
hidden_by: RegistryEntryHider | None | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED,
has_entity_name: bool | UndefinedType = UNDEFINED,
labels: set[str] | UndefinedType = UNDEFINED,
name: str | None | UndefinedType = UNDEFINED,
new_entity_id: str | UndefinedType = UNDEFINED,
new_unique_id: str | UndefinedType = UNDEFINED,
@ -1029,6 +1040,7 @@ class EntityRegistry:
hidden_by=hidden_by,
icon=icon,
has_entity_name=has_entity_name,
labels=labels,
name=name,
new_entity_id=new_entity_id,
new_unique_id=new_unique_id,
@ -1126,6 +1138,7 @@ class EntityRegistry:
icon=entity["icon"],
id=entity["id"],
has_entity_name=entity["has_entity_name"],
labels=set(entity["labels"]),
name=entity["name"],
options=entity["options"],
original_device_class=entity["original_device_class"],
@ -1182,6 +1195,7 @@ class EntityRegistry:
"icon": entry.icon,
"id": entry.id,
"has_entity_name": entry.has_entity_name,
"labels": list(entry.labels),
"name": entry.name,
"options": entry.options,
"original_device_class": entry.original_device_class,
@ -1210,6 +1224,15 @@ class EntityRegistry:
return data
@callback
def async_clear_label_id(self, label_id: str) -> None:
"""Clear label from registry entries."""
for entity_id, entry in self.entities.items():
if label_id in entry.labels:
labels = entry.labels.copy()
labels.remove(label_id)
self.async_update_entity(entity_id, labels=labels)
@callback
def async_clear_config_entry(self, config_entry_id: str) -> None:
"""Clear config entry from registry entries."""
@ -1282,6 +1305,14 @@ def async_entries_for_area(
return registry.entities.get_entries_for_area_id(area_id)
@callback
def async_entries_for_label(
registry: EntityRegistry, label_id: str
) -> list[RegistryEntry]:
"""Return entries that match a label."""
return [entry for entry in registry.entities.values() if label_id in entry.labels]
@callback
def async_entries_for_config_entry(
registry: EntityRegistry, config_entry_id: str
@ -1323,7 +1354,26 @@ def async_config_entry_disabled_by_changed(
@callback
def _async_setup_cleanup(hass: HomeAssistant, registry: EntityRegistry) -> None:
"""Clean up device registry when entities removed."""
from . import event # pylint: disable=import-outside-toplevel
# pylint: disable-next=import-outside-toplevel
from . import event, label_registry as lr
@callback
def _label_removed_from_registry_filter(
event: lr.EventLabelRegistryUpdated,
) -> bool:
"""Filter all except for the remove action from label registry events."""
return event.data["action"] == "remove"
@callback
def _handle_label_registry_update(event: lr.EventLabelRegistryUpdated) -> None:
"""Update entity that have a label that has been removed."""
registry.async_clear_label_id(event.data["label_id"])
hass.bus.async_listen(
event_type=lr.EVENT_LABEL_REGISTRY_UPDATED,
event_filter=_label_removed_from_registry_filter, # type: ignore[arg-type]
listener=_handle_label_registry_update, # type: ignore[arg-type]
)
@callback
def cleanup(_: datetime) -> None:

View File

@ -0,0 +1,283 @@
"""Provide a way to label and group anything."""
from __future__ import annotations
from collections import UserDict
from collections.abc import Iterable, ValuesView
import dataclasses
from dataclasses import dataclass
from typing import Literal, TypedDict, cast
from homeassistant.core import HomeAssistant, callback
from homeassistant.util import slugify
from .typing import UNDEFINED, EventType, UndefinedType
DATA_REGISTRY = "label_registry"
EVENT_LABEL_REGISTRY_UPDATED = "label_registry_updated"
STORAGE_KEY = "core.label_registry"
STORAGE_VERSION_MAJOR = 1
SAVE_DELAY = 10
class EventLabelRegistryUpdatedData(TypedDict):
"""Event data for when the label registry is updated."""
action: Literal["create", "remove", "update"]
label_id: str
EventLabelRegistryUpdated = EventType[EventLabelRegistryUpdatedData]
@dataclass(slots=True, frozen=True)
class LabelEntry:
"""Label Registry Entry."""
label_id: str
name: str
normalized_name: str
description: str | None = None
color: str | None = None
icon: str | None = None
class LabelRegistryItems(UserDict[str, LabelEntry]):
"""Container for label registry items, maps label id -> entry.
Maintains an additional index:
- normalized name -> entry
"""
def __init__(self) -> None:
"""Initialize the container."""
super().__init__()
self._normalized_names: dict[str, LabelEntry] = {}
def values(self) -> ValuesView[LabelEntry]:
"""Return the underlying values to avoid __iter__ overhead."""
return self.data.values()
def __setitem__(self, key: str, entry: LabelEntry) -> None:
"""Add an item."""
data = self.data
normalized_name = _normalize_label_name(entry.name)
if key in data:
old_entry = data[key]
if (
normalized_name != old_entry.normalized_name
and normalized_name in self._normalized_names
):
raise ValueError(
f"The name {entry.name} ({normalized_name}) is already in use"
)
del self._normalized_names[old_entry.normalized_name]
data[key] = entry
self._normalized_names[normalized_name] = entry
def __delitem__(self, key: str) -> None:
"""Remove an item."""
entry = self[key]
normalized_name = _normalize_label_name(entry.name)
del self._normalized_names[normalized_name]
super().__delitem__(key)
def get_label_by_name(self, name: str) -> LabelEntry | None:
"""Get label by name."""
return self._normalized_names.get(_normalize_label_name(name))
class LabelRegistry:
"""Class to hold a registry of labels."""
labels: LabelRegistryItems
_label_data: dict[str, LabelEntry]
def __init__(self, hass: HomeAssistant) -> None:
"""Initialize the label registry."""
self.hass = hass
self._store = hass.helpers.storage.Store(
STORAGE_VERSION_MAJOR,
STORAGE_KEY,
atomic_writes=True,
)
@callback
def async_get_label(self, label_id: str) -> LabelEntry | None:
"""Get label by ID.
We retrieve the LabelEntry from the underlying dict to avoid
the overhead of the UserDict __getitem__.
"""
return self._label_data.get(label_id)
@callback
def async_get_label_by_name(self, name: str) -> LabelEntry | None:
"""Get label by name."""
return self.labels.get_label_by_name(name)
@callback
def async_list_labels(self) -> Iterable[LabelEntry]:
"""Get all labels."""
return self.labels.values()
@callback
def _generate_id(self, name: str) -> str:
"""Initialize ID."""
suggestion = suggestion_base = slugify(name)
tries = 1
while suggestion in self.labels:
tries += 1
suggestion = f"{suggestion_base}_{tries}"
return suggestion
@callback
def async_create(
self,
name: str,
*,
color: str | None = None,
icon: str | None = None,
description: str | None = None,
) -> LabelEntry:
"""Create a new label."""
if label := self.async_get_label_by_name(name):
raise ValueError(
f"The name {name} ({label.normalized_name}) is already in use"
)
normalized_name = _normalize_label_name(name)
label = LabelEntry(
color=color,
description=description,
icon=icon,
label_id=self._generate_id(name),
name=name,
normalized_name=normalized_name,
)
label_id = label.label_id
self.labels[label_id] = label
self.async_schedule_save()
self.hass.bus.async_fire(
EVENT_LABEL_REGISTRY_UPDATED,
EventLabelRegistryUpdatedData(
action="create",
label_id=label_id,
),
)
return label
@callback
def async_delete(self, label_id: str) -> None:
"""Delete label."""
del self.labels[label_id]
self.hass.bus.async_fire(
EVENT_LABEL_REGISTRY_UPDATED,
EventLabelRegistryUpdatedData(
action="remove",
label_id=label_id,
),
)
self.async_schedule_save()
@callback
def async_update(
self,
label_id: str,
*,
color: str | None | UndefinedType = UNDEFINED,
description: str | None | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED,
name: str | UndefinedType = UNDEFINED,
) -> LabelEntry:
"""Update name of label."""
old = self.labels[label_id]
changes = {
attr_name: value
for attr_name, value in (
("color", color),
("description", description),
("icon", icon),
)
if value is not UNDEFINED and getattr(old, attr_name) != value
}
if name is not UNDEFINED and name != old.name:
changes["name"] = name
changes["normalized_name"] = _normalize_label_name(name)
if not changes:
return old
new = self.labels[label_id] = dataclasses.replace(old, **changes) # type: ignore[arg-type]
self.async_schedule_save()
self.hass.bus.async_fire(
EVENT_LABEL_REGISTRY_UPDATED,
EventLabelRegistryUpdatedData(
action="update",
label_id=label_id,
),
)
return new
async def async_load(self) -> None:
"""Load the label registry."""
data = await self._store.async_load()
labels = LabelRegistryItems()
if data is not None:
for label in data["labels"]:
normalized_name = _normalize_label_name(label["name"])
labels[label["label_id"]] = LabelEntry(
color=label["color"],
description=label["description"],
icon=label["icon"],
label_id=label["label_id"],
name=label["name"],
normalized_name=normalized_name,
)
self.labels = labels
self._label_data = labels.data
@callback
def async_schedule_save(self) -> None:
"""Schedule saving the label registry."""
self._store.async_delay_save(self._data_to_save, SAVE_DELAY)
@callback
def _data_to_save(self) -> dict[str, list[dict[str, str | None]]]:
"""Return data of label registry to store in a file."""
return {
"labels": [
{
"color": entry.color,
"description": entry.description,
"icon": entry.icon,
"label_id": entry.label_id,
"name": entry.name,
}
for entry in self.labels.values()
]
}
@callback
def async_get(hass: HomeAssistant) -> LabelRegistry:
"""Get label registry."""
return cast(LabelRegistry, hass.data[DATA_REGISTRY])
async def async_load(hass: HomeAssistant) -> None:
"""Load label registry."""
assert DATA_REGISTRY not in hass.data
hass.data[DATA_REGISTRY] = LabelRegistry(hass)
await hass.data[DATA_REGISTRY].async_load()
def _normalize_label_name(label_name: str) -> str:
"""Normalize a label name by removing whitespace and case folding."""
return label_name.casefold().replace(" ", "")

View File

@ -693,6 +693,7 @@ voluptuous = "vol"
"homeassistant.helpers.entity_registry" = "er"
"homeassistant.helpers.floor_registry" = "fr"
"homeassistant.helpers.issue_registry" = "ir"
"homeassistant.helpers.label_registry" = "lr"
"homeassistant.util.dt" = "dt_util"
[tool.ruff.lint.flake8-pytest-style]

View File

@ -66,6 +66,7 @@ from homeassistant.helpers import (
floor_registry as fr,
intent,
issue_registry as ir,
label_registry as lr,
recorder as recorder_helper,
restore_state,
restore_state as rs,
@ -297,6 +298,7 @@ async def async_test_home_assistant(
er.async_load(hass),
fr.async_load(hass),
ir.async_load(hass),
lr.async_load(hass),
rs.async_load(hass),
)
hass.data[bootstrap.DATA_REGISTRIES_LOADED] = None

View File

@ -18,6 +18,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -69,6 +71,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -122,6 +126,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -174,6 +180,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -228,6 +236,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -282,6 +292,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -334,6 +346,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -388,6 +402,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -442,6 +458,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -494,6 +512,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -548,6 +568,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({

View File

@ -18,6 +18,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -65,6 +67,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -112,6 +116,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -159,6 +165,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -17,6 +17,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'A. O. Smith',
'model': 'HPTS-50 200 202172000',
'name': 'My water heater',

View File

@ -37,6 +37,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -89,6 +91,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -217,6 +221,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -269,6 +275,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -67,6 +69,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -69,6 +69,7 @@ async def test_list_entities(
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": "Hello World",
"options": {},
"original_name": None,
@ -87,6 +88,7 @@ async def test_list_entities(
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": None,
"options": {},
"original_name": None,
@ -132,6 +134,7 @@ async def test_list_entities(
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": "Hello World",
"options": {},
"original_name": None,
@ -229,6 +232,7 @@ async def test_list_entities_for_display(
"ei": "test_domain.test",
"en": "Hello World",
"ic": "mdi:icon",
"lb": [],
"pl": "test_platform",
"tk": "translations_galore",
},
@ -237,31 +241,37 @@ async def test_list_entities_for_display(
"di": "device123",
"ei": "test_domain.nameless",
"en": None,
"lb": [],
"pl": "test_platform",
},
{
"ai": "area52",
"di": "device123",
"ei": "test_domain.renamed",
"lb": [],
"pl": "test_platform",
},
{
"ei": "test_domain.boring",
"lb": [],
"pl": "test_platform",
},
{
"ei": "test_domain.hidden",
"lb": [],
"hb": True,
"pl": "test_platform",
},
{
"dp": 0,
"ei": "sensor.default_precision",
"lb": [],
"pl": "test_platform",
},
{
"dp": 0,
"ei": "sensor.user_precision",
"lb": [],
"pl": "test_platform",
},
],
@ -302,6 +312,7 @@ async def test_list_entities_for_display(
"ai": "area52",
"di": "device123",
"ei": "test_domain.test",
"lb": [],
"en": "Hello World",
"pl": "test_platform",
},
@ -347,6 +358,7 @@ async def test_get_entity(hass: HomeAssistant, client: MockHAClientWebSocket) ->
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": "Hello World",
"options": {},
"original_device_class": None,
@ -379,6 +391,7 @@ async def test_get_entity(hass: HomeAssistant, client: MockHAClientWebSocket) ->
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": None,
"options": {},
"original_device_class": None,
@ -436,6 +449,7 @@ async def test_get_entities(hass: HomeAssistant, client: MockHAClientWebSocket)
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": "Hello World",
"options": {},
"original_device_class": None,
@ -459,6 +473,7 @@ async def test_get_entities(hass: HomeAssistant, client: MockHAClientWebSocket)
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": None,
"options": {},
"original_device_class": None,
@ -529,6 +544,7 @@ async def test_update_entity(
"hidden_by": "user", # We exchange strings over the WS API, not enums
"icon": "icon:after update",
"id": ANY,
"labels": [],
"name": "after update",
"options": {},
"original_device_class": None,
@ -601,6 +617,7 @@ async def test_update_entity(
"hidden_by": "user", # We exchange strings over the WS API, not enums
"icon": "icon:after update",
"id": ANY,
"labels": [],
"name": "after update",
"options": {},
"original_device_class": None,
@ -640,6 +657,7 @@ async def test_update_entity(
"hidden_by": "user", # We exchange strings over the WS API, not enums
"icon": "icon:after update",
"id": ANY,
"labels": [],
"name": "after update",
"options": {"sensor": {"unit_of_measurement": "beard_second"}},
"original_device_class": None,
@ -693,6 +711,7 @@ async def test_update_entity_require_restart(
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": None,
"options": {},
"original_device_class": None,
@ -805,6 +824,7 @@ async def test_update_entity_no_changes(
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": "name of entity",
"options": {},
"original_device_class": None,
@ -893,6 +913,7 @@ async def test_update_entity_id(
"hidden_by": None,
"icon": None,
"id": ANY,
"labels": [],
"name": None,
"options": {},
"original_device_class": None,

View File

@ -0,0 +1,235 @@
"""Test label registry API."""
import pytest
from homeassistant.components.config import label_registry
from homeassistant.core import HomeAssistant
from homeassistant.helpers import label_registry as lr
from tests.typing import MockHAClientWebSocket, WebSocketGenerator
@pytest.fixture(name="client")
async def client_fixture(
hass: HomeAssistant, hass_ws_client: WebSocketGenerator
) -> MockHAClientWebSocket:
"""Fixture that can interact with the config manager API."""
label_registry.async_setup(hass)
return await hass_ws_client(hass)
async def test_list_labels(
client: MockHAClientWebSocket,
label_registry: lr.LabelRegistry,
) -> None:
"""Test list entries."""
label_registry.async_create("mock 1")
label_registry.async_create(
name="mock 2",
color="#00FF00",
icon="mdi:two",
description="This is the second label",
)
assert len(label_registry.labels) == 2
await client.send_json_auto_id({"type": "config/label_registry/list"})
msg = await client.receive_json()
assert len(msg["result"]) == len(label_registry.labels)
assert msg["result"][0] == {
"color": None,
"description": None,
"icon": None,
"label_id": "mock_1",
"name": "mock 1",
}
assert msg["result"][1] == {
"color": "#00FF00",
"description": "This is the second label",
"icon": "mdi:two",
"label_id": "mock_2",
"name": "mock 2",
}
async def test_create_label(
client: MockHAClientWebSocket,
label_registry: lr.LabelRegistry,
) -> None:
"""Test create entry."""
await client.send_json_auto_id(
{
"name": "MOCK",
"type": "config/label_registry/create",
}
)
msg = await client.receive_json()
assert len(label_registry.labels) == 1
assert msg["result"] == {
"color": None,
"description": None,
"icon": None,
"label_id": "mock",
"name": "MOCK",
}
await client.send_json_auto_id(
{
"id": 2,
"name": "MOCKERY",
"type": "config/label_registry/create",
"color": "#00FF00",
"description": "This is the second label",
"icon": "mdi:two",
}
)
msg = await client.receive_json()
assert len(label_registry.labels) == 2
assert msg["result"] == {
"color": "#00FF00",
"description": "This is the second label",
"icon": "mdi:two",
"label_id": "mockery",
"name": "MOCKERY",
}
async def test_create_label_with_name_already_in_use(
client: MockHAClientWebSocket,
label_registry: lr.LabelRegistry,
) -> None:
"""Test create entry that should fail."""
label_registry.async_create("mock")
assert len(label_registry.labels) == 1
await client.send_json_auto_id(
{"name": "mock", "type": "config/label_registry/create"}
)
msg = await client.receive_json()
assert not msg["success"]
assert msg["error"]["code"] == "invalid_info"
assert msg["error"]["message"] == "The name mock (mock) is already in use"
assert len(label_registry.labels) == 1
async def test_delete_label(
client: MockHAClientWebSocket,
label_registry: lr.LabelRegistry,
) -> None:
"""Test delete entry."""
label = label_registry.async_create("mock")
assert len(label_registry.labels) == 1
await client.send_json_auto_id(
{"label_id": label.label_id, "type": "config/label_registry/delete"}
)
msg = await client.receive_json()
assert msg["success"]
assert not label_registry.labels
async def test_delete_non_existing_label(
client: MockHAClientWebSocket,
label_registry: lr.LabelRegistry,
) -> None:
"""Test delete entry that should fail."""
label_registry.async_create("mock")
assert len(label_registry.labels) == 1
await client.send_json_auto_id(
{"label_id": "omg_puppies", "type": "config/label_registry/delete"}
)
msg = await client.receive_json()
assert not msg["success"]
assert msg["error"]["code"] == "invalid_info"
assert msg["error"]["message"] == "Label ID doesn't exist"
assert len(label_registry.labels) == 1
async def test_update_label(
client: MockHAClientWebSocket,
label_registry: lr.LabelRegistry,
) -> None:
"""Test update entry."""
label = label_registry.async_create("mock")
assert len(label_registry.labels) == 1
await client.send_json_auto_id(
{
"label_id": label.label_id,
"name": "UPDATED",
"icon": "mdi:test",
"color": "#00FF00",
"description": "This is a label description",
"type": "config/label_registry/update",
}
)
msg = await client.receive_json()
assert len(label_registry.labels) == 1
assert msg["result"] == {
"color": "#00FF00",
"description": "This is a label description",
"icon": "mdi:test",
"label_id": "mock",
"name": "UPDATED",
}
await client.send_json_auto_id(
{
"label_id": label.label_id,
"name": "UPDATED AGAIN",
"icon": None,
"color": None,
"description": None,
"type": "config/label_registry/update",
}
)
msg = await client.receive_json()
assert len(label_registry.labels) == 1
assert msg["result"] == {
"color": None,
"description": None,
"icon": None,
"label_id": "mock",
"name": "UPDATED AGAIN",
}
async def test_update_with_name_already_in_use(
client: MockHAClientWebSocket,
label_registry: lr.LabelRegistry,
) -> None:
"""Test update entry."""
label = label_registry.async_create("mock 1")
label_registry.async_create("mock 2")
assert len(label_registry.labels) == 2
await client.send_json_auto_id(
{
"label_id": label.label_id,
"name": "mock 2",
"type": "config/label_registry/update",
}
)
msg = await client.receive_json()
assert not msg["success"]
assert msg["error"]["code"] == "invalid_info"
assert msg["error"]["message"] == "The name mock 2 (mock2) is already in use"
assert len(label_registry.labels) == 2

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -73,6 +75,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -116,6 +120,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -44,6 +44,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -31,6 +31,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -38,6 +38,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -91,6 +93,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -33,6 +33,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -81,6 +83,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -129,6 +133,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -177,6 +183,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -36,6 +36,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -87,6 +89,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -138,6 +142,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -28,6 +28,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -30,6 +30,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -72,6 +72,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -159,6 +161,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -246,6 +250,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -333,6 +339,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -21,6 +21,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'devolo',
'model': 'dLAN pro 1200+ WiFi ac',
'name': 'Mock Title',

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -76,6 +78,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -120,6 +124,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -165,6 +171,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -213,6 +221,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({

View File

@ -115,6 +115,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -159,6 +161,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -39,6 +39,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -52,6 +54,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -103,6 +107,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -152,6 +158,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -188,6 +196,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -61,6 +63,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -105,6 +109,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -150,6 +156,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -195,6 +203,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -240,6 +250,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -284,6 +296,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -329,6 +343,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -47,6 +49,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -59,6 +61,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -102,6 +106,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -145,6 +151,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -17,6 +17,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Ecovacs',
'model': 'DEEBOT OZMO 950 Series',
'name': 'Ozmo 950',

View File

@ -21,6 +21,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -23,6 +23,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -60,6 +62,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -105,6 +109,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor.private': dict({
@ -153,6 +159,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -197,6 +205,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -241,6 +251,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -284,6 +296,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -328,6 +342,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -374,6 +390,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -421,6 +439,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor.private': dict({
@ -472,6 +492,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -516,6 +538,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -559,6 +583,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -59,6 +61,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -102,6 +106,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -65,6 +67,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',
@ -105,6 +109,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -141,6 +147,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',

View File

@ -61,6 +61,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -97,6 +99,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light',
'name': 'Frenck',
@ -171,6 +175,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -207,6 +213,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light',
'name': 'Frenck',
@ -281,6 +289,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -317,6 +327,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light',
'name': 'Frenck',

View File

@ -33,6 +33,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -72,6 +74,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',
@ -116,6 +120,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -158,6 +164,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',
@ -202,6 +210,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -244,6 +254,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',
@ -288,6 +300,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -327,6 +341,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',
@ -371,6 +387,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -413,6 +431,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -65,6 +67,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',
@ -105,6 +109,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -141,6 +147,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Elgato',
'model': 'Elgato Key Light Mini',
'name': 'Frenck',

View File

@ -487,6 +487,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -512,6 +514,8 @@
'hw_version': None,
'id': <ANY>,
'is_new': False,
'labels': set({
}),
'manufacturer': 'EnergyZero',
'model': None,
'name': 'Energy market price',
@ -556,6 +560,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -581,6 +587,8 @@
'hw_version': None,
'id': <ANY>,
'is_new': False,
'labels': set({
}),
'manufacturer': 'EnergyZero',
'model': None,
'name': 'Energy market price',
@ -622,6 +630,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -647,6 +657,8 @@
'hw_version': None,
'id': <ANY>,
'is_new': False,
'labels': set({
}),
'manufacturer': 'EnergyZero',
'model': None,
'name': 'Energy market price',
@ -689,6 +701,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -714,6 +728,8 @@
'hw_version': None,
'id': <ANY>,
'is_new': False,
'labels': set({
}),
'manufacturer': 'EnergyZero',
'model': None,
'name': 'Energy market price',
@ -755,6 +771,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -780,6 +798,8 @@
'hw_version': None,
'id': <ANY>,
'is_new': False,
'labels': set({
}),
'manufacturer': 'EnergyZero',
'model': None,
'name': 'Energy market price',
@ -824,6 +844,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -849,6 +871,8 @@
'hw_version': None,
'id': <ANY>,
'is_new': False,
'labels': set({
}),
'manufacturer': 'EnergyZero',
'model': None,
'name': 'Gas market price',

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -57,6 +57,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -21,6 +21,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -75,6 +77,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -129,6 +133,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -183,6 +189,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -237,6 +245,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -291,6 +301,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -345,6 +357,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -399,6 +413,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -453,6 +469,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -507,6 +525,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -539,3 +559,563 @@
'state': '60',
})
# ---
# name: test_numbers[number.device_name_power_factor-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'away_extract_fan_setpoint',
'unique_id': '0000-0001-away_extract_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '30',
})
# ---
# name: test_numbers[number.device_name_power_factor_10-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_10',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'home_supply_fan_setpoint',
'unique_id': '0000-0001-home_supply_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_10-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_10',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '60',
})
# ---
# name: test_numbers[number.device_name_power_factor_2-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_2',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'away_supply_fan_setpoint',
'unique_id': '0000-0001-away_supply_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_2-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_2',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '40',
})
# ---
# name: test_numbers[number.device_name_power_factor_3-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_3',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'cooker_hood_extract_fan_setpoint',
'unique_id': '0000-0001-cooker_hood_extract_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_3-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_3',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '90',
})
# ---
# name: test_numbers[number.device_name_power_factor_4-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_4',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'cooker_hood_supply_fan_setpoint',
'unique_id': '0000-0001-cooker_hood_supply_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_4-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_4',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '100',
})
# ---
# name: test_numbers[number.device_name_power_factor_5-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_5',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'fireplace_extract_fan_setpoint',
'unique_id': '0000-0001-fireplace_extract_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_5-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_5',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '10',
})
# ---
# name: test_numbers[number.device_name_power_factor_6-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_6',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'fireplace_supply_fan_setpoint',
'unique_id': '0000-0001-fireplace_supply_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_6-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_6',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '20',
})
# ---
# name: test_numbers[number.device_name_power_factor_7-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_7',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'high_extract_fan_setpoint',
'unique_id': '0000-0001-high_extract_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_7-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_7',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '70',
})
# ---
# name: test_numbers[number.device_name_power_factor_8-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_8',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'high_supply_fan_setpoint',
'unique_id': '0000-0001-high_supply_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_8-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_8',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '80',
})
# ---
# name: test_numbers[number.device_name_power_factor_9-entry]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
}),
'config_entry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'number',
'entity_category': None,
'entity_id': 'number.device_name_power_factor_9',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': <NumberDeviceClass.POWER_FACTOR: 'power_factor'>,
'original_icon': None,
'original_name': 'Power factor',
'platform': 'flexit_bacnet',
'previous_unique_id': None,
'supported_features': 0,
'translation_key': 'home_extract_fan_setpoint',
'unique_id': '0000-0001-home_extract_fan_setpoint',
'unit_of_measurement': '%',
})
# ---
# name: test_numbers[number.device_name_power_factor_9-state]
StateSnapshot({
'attributes': ReadOnlyDict({
'device_class': 'power_factor',
'friendly_name': 'Device Name Power factor',
'max': 100,
'min': 0,
'mode': <NumberMode.SLIDER: 'slider'>,
'step': 1,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'number.device_name_power_factor_9',
'last_changed': <ANY>,
'last_updated': <ANY>,
'state': '50',
})
# ---

View File

@ -18,6 +18,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -66,6 +68,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -116,6 +120,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -163,6 +169,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -208,6 +216,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -253,6 +263,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -300,6 +312,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -351,6 +365,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -398,6 +414,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -443,6 +461,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -490,6 +510,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -539,6 +561,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -586,6 +610,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -633,6 +659,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -678,6 +706,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -17,6 +17,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': 'Mock Model',
'name': 'Mock Title',

View File

@ -18,6 +18,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -65,6 +67,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -113,6 +117,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -162,6 +168,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -210,6 +218,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -259,6 +269,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -307,6 +319,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -354,6 +368,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -401,6 +417,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -448,6 +466,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -495,6 +515,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -544,6 +566,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -592,6 +616,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -641,6 +667,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -690,6 +718,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -738,6 +768,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -786,6 +818,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -835,6 +869,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -883,6 +919,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -102,6 +102,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -78,6 +78,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -107,6 +109,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -136,6 +140,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -165,6 +171,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -194,6 +202,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

File diff suppressed because it is too large Load Diff

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -65,6 +67,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'HWE-P1',
'name': 'Device',

View File

@ -38,6 +38,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -74,6 +76,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'HWE-SKT',
'name': 'Device',

File diff suppressed because it is too large Load Diff

View File

@ -28,6 +28,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -64,6 +66,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'HWE-KWH1',
'name': 'Device',
@ -103,6 +107,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -139,6 +145,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'HWE-KWH3',
'name': 'Device',
@ -179,6 +187,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -215,6 +225,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'HWE-SKT',
'name': 'Device',
@ -254,6 +266,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -290,6 +304,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'HWE-SKT',
'name': 'Device',
@ -329,6 +345,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -365,6 +383,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'HWE-SKT',
'name': 'Device',
@ -404,6 +424,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -440,6 +462,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'SDM230-wifi',
'name': 'Device',
@ -479,6 +503,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -515,6 +541,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'HomeWizard',
'model': 'SDM630-wifi',
'name': 'Device',

View File

@ -28,6 +28,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -60,6 +62,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': None,
'name': 'Outlet 1',
@ -88,6 +92,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': None,
'name': '2CH Power strip',
@ -127,6 +133,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -159,6 +167,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': None,
'name': 'Outlet 2',
@ -187,6 +197,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': None,
'name': '2CH Power strip',

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -73,6 +75,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -28,6 +28,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -39,6 +39,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -93,6 +95,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -147,6 +151,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -201,6 +207,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -255,6 +263,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -593,6 +603,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -647,6 +659,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -701,6 +715,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -755,6 +771,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -809,6 +827,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -863,6 +883,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -39,6 +39,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -93,6 +95,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -147,6 +151,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -201,6 +207,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -69,6 +71,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -120,6 +124,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -168,6 +174,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -215,6 +223,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -17,6 +17,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'La Marzocco',
'model': 'GS3 AV',
'name': 'GS01234',
@ -56,6 +58,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -99,6 +103,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -142,6 +148,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -39,6 +39,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -93,6 +95,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -74,6 +76,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -132,6 +136,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -30,6 +30,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -102,6 +104,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -180,6 +184,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -257,6 +263,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -336,6 +344,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -63,6 +65,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -21,6 +21,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -17,6 +17,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Bubbendorf',
'model': 'Roller Shutter',
'name': 'Entrance Blinds',
@ -45,6 +47,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Bubbendorf',
'model': 'Orientable Shutter',
'name': 'Bubendorff blind',
@ -73,6 +77,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': '2 wire light switch/dimmer',
'name': 'Unknown 00:11:22:33:00:11:45:fe',
@ -101,6 +107,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Smarther',
'model': 'Smarther with Netatmo',
'name': '',
@ -129,6 +137,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Energy Meter',
'name': '',
@ -157,6 +167,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Light switch/dimmer with neutral',
'name': 'Bathroom light',
@ -185,6 +197,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -213,6 +227,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -241,6 +257,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -269,6 +287,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -297,6 +317,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -325,6 +347,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -353,6 +377,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -381,6 +407,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -409,6 +437,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -437,6 +467,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Connected Ecometer',
'name': '',
@ -465,6 +497,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Camera',
'name': 'Hall',
@ -493,6 +527,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Anemometer',
'name': 'Villa Garden',
@ -521,6 +557,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Outdoor Camera',
'name': 'Front',
@ -549,6 +587,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Video Doorbell',
'name': 'Netatmo-Doorbell',
@ -577,6 +617,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Air Quality Monitor',
'name': 'Kitchen',
@ -605,6 +647,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Air Quality Monitor',
'name': 'Livingroom',
@ -633,6 +677,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Air Quality Monitor',
'name': 'Baby Bedroom',
@ -661,6 +707,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Air Quality Monitor',
'name': 'Bedroom',
@ -689,6 +737,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Air Quality Monitor',
'name': 'Parents Bedroom',
@ -717,6 +767,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Legrand',
'model': 'Plug',
'name': '',
@ -745,6 +797,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Outdoor Module',
'name': 'Villa Outdoor',
@ -773,6 +827,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Module',
'name': 'Villa Bedroom',
@ -801,6 +857,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Indoor Module',
'name': 'Villa Bathroom',
@ -829,6 +887,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Home Weather station',
'name': 'Villa',
@ -857,6 +917,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Rain Gauge',
'name': 'Villa Rain',
@ -885,6 +947,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'OpenTherm Modulating Thermostat',
'name': '',
@ -913,6 +977,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Thermostat',
'name': '',
@ -941,6 +1007,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Valve',
'name': '',
@ -969,6 +1037,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Valve',
'name': '',
@ -997,6 +1067,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Public Weather station',
'name': 'Home avg',
@ -1025,6 +1097,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Public Weather station',
'name': 'Home max',
@ -1053,6 +1127,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netatmo',
'model': 'Smart Thermostat',
'name': 'MYHOME',

View File

@ -20,6 +20,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -73,6 +75,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -125,6 +129,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -21,6 +21,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

File diff suppressed because it is too large Load Diff

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -17,6 +17,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Netgear',
'model': 'LM1200',
'name': 'Netgear LM1200',

View File

@ -30,6 +30,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2405',
'name': '05.111111111111',
@ -68,6 +70,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18S20',
'name': '10.111111111111',
@ -106,6 +110,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2406',
'name': '12.111111111111',
@ -135,6 +141,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -164,6 +172,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -226,6 +236,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2423',
'name': '1D.111111111111',
@ -264,6 +276,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2409',
'name': '1F.111111111111',
@ -290,6 +304,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2423',
'name': '1D.111111111111',
@ -328,6 +344,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS1822',
'name': '22.111111111111',
@ -366,6 +384,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2438',
'name': '26.111111111111',
@ -404,6 +424,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.111111111111',
@ -442,6 +464,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.222222222222',
@ -480,6 +504,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.222222222223',
@ -518,6 +544,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2408',
'name': '29.111111111111',
@ -547,6 +575,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -576,6 +606,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -605,6 +637,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -634,6 +668,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -663,6 +699,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -692,6 +730,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -721,6 +761,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -750,6 +792,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -884,6 +928,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2760',
'name': '30.111111111111',
@ -922,6 +968,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2413',
'name': '3A.111111111111',
@ -951,6 +999,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -980,6 +1030,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1042,6 +1094,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS1825',
'name': '3B.111111111111',
@ -1080,6 +1134,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS28EA00',
'name': '42.111111111111',
@ -1118,6 +1174,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Embedded Data Systems',
'model': 'EDS0068',
'name': '7E.111111111111',
@ -1156,6 +1214,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Embedded Data Systems',
'model': 'EDS0066',
'name': '7E.222222222222',
@ -1194,6 +1254,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HobbyBoards_EF',
'name': 'EF.111111111111',
@ -1232,6 +1294,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HB_MOISTURE_METER',
'name': 'EF.111111111112',
@ -1270,6 +1334,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HB_HUB',
'name': 'EF.111111111113',
@ -1299,6 +1365,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1328,6 +1396,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1357,6 +1427,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1386,6 +1458,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -30,6 +30,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2405',
'name': '05.111111111111',
@ -68,6 +70,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18S20',
'name': '10.111111111111',
@ -99,6 +103,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -152,6 +158,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2406',
'name': '12.111111111111',
@ -183,6 +191,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -214,6 +224,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -282,6 +294,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2423',
'name': '1D.111111111111',
@ -313,6 +327,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -344,6 +360,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -410,6 +428,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2409',
'name': '1F.111111111111',
@ -436,6 +456,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2423',
'name': '1D.111111111111',
@ -467,6 +489,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -498,6 +522,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -564,6 +590,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS1822',
'name': '22.111111111111',
@ -595,6 +623,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -648,6 +678,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2438',
'name': '26.111111111111',
@ -679,6 +711,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -710,6 +744,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -741,6 +777,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -772,6 +810,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -803,6 +843,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -834,6 +876,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -865,6 +909,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -896,6 +942,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -927,6 +975,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -958,6 +1008,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -989,6 +1041,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1192,6 +1246,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.111111111111',
@ -1223,6 +1279,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1276,6 +1334,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.222222222222',
@ -1307,6 +1367,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1360,6 +1422,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.222222222223',
@ -1391,6 +1455,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1444,6 +1510,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2408',
'name': '29.111111111111',
@ -1482,6 +1550,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2760',
'name': '30.111111111111',
@ -1513,6 +1583,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1544,6 +1616,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1575,6 +1649,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1606,6 +1682,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1704,6 +1782,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2413',
'name': '3A.111111111111',
@ -1742,6 +1822,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS1825',
'name': '3B.111111111111',
@ -1773,6 +1855,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1826,6 +1910,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS28EA00',
'name': '42.111111111111',
@ -1857,6 +1943,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1910,6 +1998,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Embedded Data Systems',
'model': 'EDS0068',
'name': '7E.111111111111',
@ -1941,6 +2031,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1972,6 +2064,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2003,6 +2097,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2034,6 +2130,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2132,6 +2230,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Embedded Data Systems',
'model': 'EDS0066',
'name': '7E.222222222222',
@ -2163,6 +2263,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2194,6 +2296,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2262,6 +2366,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HobbyBoards_EF',
'name': 'EF.111111111111',
@ -2293,6 +2399,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2324,6 +2432,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2355,6 +2465,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2438,6 +2550,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HB_MOISTURE_METER',
'name': 'EF.111111111112',
@ -2469,6 +2583,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2500,6 +2616,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2531,6 +2649,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2562,6 +2682,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2660,6 +2782,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HB_HUB',
'name': 'EF.111111111113',

View File

@ -30,6 +30,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2405',
'name': '05.111111111111',
@ -59,6 +61,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -109,6 +113,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18S20',
'name': '10.111111111111',
@ -147,6 +153,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2406',
'name': '12.111111111111',
@ -176,6 +184,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -205,6 +215,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -234,6 +246,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -263,6 +277,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -349,6 +365,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2423',
'name': '1D.111111111111',
@ -387,6 +405,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2409',
'name': '1F.111111111111',
@ -413,6 +433,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2423',
'name': '1D.111111111111',
@ -451,6 +473,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS1822',
'name': '22.111111111111',
@ -489,6 +513,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2438',
'name': '26.111111111111',
@ -518,6 +544,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -568,6 +596,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.111111111111',
@ -606,6 +636,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.222222222222',
@ -644,6 +676,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS18B20',
'name': '28.222222222223',
@ -682,6 +716,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2408',
'name': '29.111111111111',
@ -711,6 +747,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -740,6 +778,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -769,6 +809,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -798,6 +840,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -827,6 +871,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -856,6 +902,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -885,6 +933,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -914,6 +964,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -943,6 +995,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -972,6 +1026,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1001,6 +1057,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1030,6 +1088,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1059,6 +1119,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1088,6 +1150,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1117,6 +1181,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1146,6 +1212,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1376,6 +1444,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2760',
'name': '30.111111111111',
@ -1414,6 +1484,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS2413',
'name': '3A.111111111111',
@ -1443,6 +1515,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1472,6 +1546,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1534,6 +1610,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS1825',
'name': '3B.111111111111',
@ -1572,6 +1650,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Maxim Integrated',
'model': 'DS28EA00',
'name': '42.111111111111',
@ -1610,6 +1690,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Embedded Data Systems',
'model': 'EDS0068',
'name': '7E.111111111111',
@ -1648,6 +1730,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Embedded Data Systems',
'model': 'EDS0066',
'name': '7E.222222222222',
@ -1686,6 +1770,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HobbyBoards_EF',
'name': 'EF.111111111111',
@ -1724,6 +1810,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HB_MOISTURE_METER',
'name': 'EF.111111111112',
@ -1753,6 +1841,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1782,6 +1872,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1811,6 +1903,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1840,6 +1934,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1869,6 +1965,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1898,6 +1996,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1927,6 +2027,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1956,6 +2058,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2090,6 +2194,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Hobby Boards',
'model': 'HB_HUB',
'name': 'EF.111111111113',
@ -2119,6 +2225,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2148,6 +2256,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2177,6 +2287,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2206,6 +2318,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -76,6 +76,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -47,6 +49,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -76,6 +80,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -105,6 +111,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -134,6 +142,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -163,6 +173,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -192,6 +204,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -296,6 +310,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -325,6 +341,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -354,6 +372,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -383,6 +403,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -412,6 +434,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -441,6 +465,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -470,6 +496,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -499,6 +527,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -528,6 +558,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -654,6 +686,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -683,6 +717,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -712,6 +748,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -741,6 +779,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -812,6 +852,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -841,6 +883,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -870,6 +914,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -899,6 +945,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -928,6 +976,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -957,6 +1007,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -986,6 +1038,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1015,6 +1069,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1044,6 +1100,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1073,6 +1131,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1210,6 +1270,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -1239,6 +1301,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1268,6 +1332,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1297,6 +1363,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1326,6 +1394,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1355,6 +1425,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1384,6 +1456,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1488,6 +1562,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -1517,6 +1593,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1546,6 +1624,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1575,6 +1655,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1604,6 +1686,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1633,6 +1717,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1662,6 +1748,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1691,6 +1779,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1720,6 +1810,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1846,6 +1938,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -1875,6 +1969,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1904,6 +2000,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1933,6 +2031,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2004,6 +2104,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -2033,6 +2135,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2062,6 +2166,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2091,6 +2197,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2120,6 +2228,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2149,6 +2259,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2178,6 +2290,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2207,6 +2321,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2236,6 +2352,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2265,6 +2383,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -47,6 +49,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -96,6 +100,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -125,6 +131,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -154,6 +162,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -183,6 +193,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -254,6 +266,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -283,6 +297,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -312,6 +328,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -341,6 +359,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -412,6 +432,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -441,6 +463,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -470,6 +494,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -499,6 +525,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -570,6 +598,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -599,6 +629,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -648,6 +680,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -677,6 +711,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -706,6 +742,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -735,6 +773,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -806,6 +846,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -835,6 +877,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -864,6 +908,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -893,6 +939,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -964,6 +1012,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -993,6 +1043,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1022,6 +1074,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1051,6 +1105,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -47,6 +49,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -97,6 +101,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -126,6 +132,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -176,6 +184,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -214,6 +224,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -243,6 +255,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -293,6 +307,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -322,6 +338,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -375,6 +393,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -404,6 +424,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -457,6 +479,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -495,6 +519,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -524,6 +550,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -56,6 +58,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -91,6 +95,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -145,6 +151,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -180,6 +188,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -234,6 +244,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -269,6 +281,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -323,6 +337,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -361,6 +377,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -396,6 +414,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -450,6 +470,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -485,6 +507,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -539,6 +563,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -574,6 +600,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -49,6 +51,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -80,6 +84,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -111,6 +117,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -140,6 +148,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -169,6 +179,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -198,6 +210,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -309,6 +323,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -340,6 +356,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -380,6 +398,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -411,6 +431,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -442,6 +464,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -478,6 +502,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -509,6 +535,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -540,6 +568,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -571,6 +601,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -600,6 +632,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -631,6 +665,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -662,6 +698,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -693,6 +731,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -722,6 +762,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -751,6 +793,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -780,6 +824,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1022,6 +1068,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -1053,6 +1101,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1093,6 +1143,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1124,6 +1176,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1155,6 +1209,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1191,6 +1247,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1222,6 +1280,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1253,6 +1313,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1284,6 +1346,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1313,6 +1377,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1344,6 +1410,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1375,6 +1443,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1404,6 +1474,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1433,6 +1505,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1462,6 +1536,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1491,6 +1567,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1729,6 +1807,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -1760,6 +1840,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1800,6 +1882,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1831,6 +1915,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1862,6 +1948,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1898,6 +1986,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1929,6 +2019,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1960,6 +2052,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -1991,6 +2085,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2020,6 +2116,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2051,6 +2149,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2082,6 +2182,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2111,6 +2213,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2140,6 +2244,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2169,6 +2275,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2198,6 +2306,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2227,6 +2337,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2476,6 +2588,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -2507,6 +2621,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2538,6 +2654,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2569,6 +2687,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2598,6 +2718,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2627,6 +2749,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2656,6 +2780,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2767,6 +2893,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Captur ii',
'name': 'REG-NUMBER',
@ -2798,6 +2926,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2838,6 +2968,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2869,6 +3001,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2900,6 +3034,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2936,6 +3072,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2967,6 +3105,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -2998,6 +3138,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3029,6 +3171,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3058,6 +3202,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3089,6 +3235,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3120,6 +3268,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3151,6 +3301,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3180,6 +3332,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3209,6 +3363,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3238,6 +3394,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3480,6 +3638,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -3511,6 +3671,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3551,6 +3713,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3582,6 +3746,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3613,6 +3779,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3649,6 +3817,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3680,6 +3850,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3711,6 +3883,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3742,6 +3916,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3771,6 +3947,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3802,6 +3980,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3833,6 +4013,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3862,6 +4044,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3891,6 +4075,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3920,6 +4106,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -3949,6 +4137,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4187,6 +4377,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Renault',
'model': 'Zoe',
'name': 'REG-NUMBER',
@ -4218,6 +4410,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4258,6 +4452,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4289,6 +4485,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4320,6 +4518,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4356,6 +4556,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4387,6 +4589,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4418,6 +4622,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4449,6 +4655,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4478,6 +4686,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4509,6 +4719,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4540,6 +4752,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4569,6 +4783,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4598,6 +4814,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4627,6 +4845,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4656,6 +4876,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -4685,6 +4907,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -40,6 +40,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': 'NB6VAC-FXC-r0',
'name': 'SFR Box',
@ -47,6 +49,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -76,6 +80,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -136,6 +142,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': 'NB6VAC-FXC-r0',
'name': 'SFR Box',
@ -165,6 +173,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -194,6 +204,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': 'NB6VAC-FXC-r0',
'name': 'SFR Box',
@ -47,6 +49,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': None,
'model': 'NB6VAC-FXC-r0',
'name': 'SFR Box',
@ -54,6 +56,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -83,6 +87,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -112,6 +118,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -149,6 +157,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -178,6 +188,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -207,6 +219,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -236,6 +250,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -267,6 +283,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -298,6 +316,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -329,6 +349,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -360,6 +382,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -391,6 +415,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -422,6 +448,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -460,6 +488,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -502,6 +532,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -64,6 +66,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({
@ -112,6 +116,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
'sensor': dict({

View File

@ -30,6 +30,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -62,6 +64,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tailwind',
'model': 'iQ3',
'name': 'Door 1',
@ -103,6 +107,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -135,6 +141,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tailwind',
'model': 'iQ3',
'name': 'Door 2',

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -65,6 +67,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tailwind',
'model': 'iQ3',
'name': 'Tailwind iQ3',

View File

@ -30,6 +30,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -62,6 +64,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tailwind',
'model': 'iQ3',
'name': 'Door 1',
@ -103,6 +107,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -135,6 +141,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tailwind',
'model': 'iQ3',
'name': 'Door 2',

View File

@ -39,6 +39,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -75,6 +77,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tailwind',
'model': 'iQ3',
'name': 'Tailwind iQ3',

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -59,6 +61,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -103,6 +107,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -146,6 +152,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -189,6 +197,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -232,6 +242,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -18,6 +18,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -66,6 +68,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -114,6 +118,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -162,6 +168,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -210,6 +218,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -258,6 +268,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -312,6 +324,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -365,6 +379,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -411,6 +427,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),

View File

@ -16,6 +16,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -47,6 +49,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -78,6 +82,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -128,4 +134,4 @@
'last_updated': <ANY>,
'state': 'off',
})
# ---
# ---

View File

@ -17,6 +17,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tedee',
'model': 'Bridge',
'name': 'Bridge-AB1C',
@ -26,4 +28,4 @@
'sw_version': None,
'via_device_id': None,
})
# ---
# ---

View File

@ -29,6 +29,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -61,6 +63,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tedee',
'model': 'Tedee PRO',
'name': 'Lock-1A2B',
@ -101,6 +105,8 @@
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
@ -133,6 +139,8 @@
),
}),
'is_new': False,
'labels': set({
}),
'manufacturer': 'Tedee',
'model': 'Tedee GO',
'name': 'Lock-2C3D',

Some files were not shown because too many files have changed in this diff Show More