diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d271cd6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +*.manifest +*.spec + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# IDEs +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Home Assistant +*.log +*.db +*.db-shm +*.db-wal + +# Temporary files +/tmp/ \ No newline at end of file diff --git a/README.md b/README.md index daa13ad..81b21a5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,244 @@ -# ha_lionel_controller -A custom integration for your Lionel Trains +# Lionel Train Controller + +A Home Assistant custom integration for controlling Lionel LionChief Bluetooth locomotives. + +## Features + +- **Throttle Control**: Use a number slider to control train speed (0-100%) +- **Direction Control**: Switch between forward and reverse +- **Sound Effects**: Control horn, bell, and announcements +- **Lighting**: Train lights, cab lights, and number board control +- **Advanced Features**: Smoke unit control and coupler firing +- **Volume Controls**: Individual volume control for horn, bell, speech, and engine sounds +- **Status Monitoring**: Battery level, temperature, and voltage monitoring +- **Connection Status**: Monitor Bluetooth connection status +- **Auto-Discovery**: Automatically discover locomotives when powered on +- **HACS Compatible**: Easy installation through HACS + +## Supported Controls + +### Number Entities +- **Throttle**: Variable speed control slider from 0-100% +- **Master Volume**: Overall volume control (0-7) +- **Horn Volume**: Horn sound volume (0-7) +- **Bell Volume**: Bell sound volume (0-7) +- **Speech Volume**: Announcement volume (0-7) +- **Engine Volume**: Engine sound volume (0-7) + +### Switch Entities +- **Lights**: Control locomotive lighting (defaults to on) +- **Horn**: Turn horn sound on/off +- **Bell**: Turn bell sound on/off +- **Cab Lights**: Control cab interior lighting +- **Number Boards**: Control number board illumination +- **Smoke Unit**: Control smoke generator on/off + +### Button Entities +- **Stop**: Emergency stop button (sets throttle to 0) +- **Forward**: Set locomotive direction to forward +- **Reverse**: Set locomotive direction to reverse +- **Disconnect**: Disconnect from locomotive +- **Reconnect**: Force reconnection to locomotive +- **Fire Coupler**: Activate locomotive coupler +- **Status Requests**: Battery, temperature, voltage checks +- **Announcements**: Various conductor announcements + - Random, Ready to Roll, Hey There, Squeaky + - Water and Fire, Fastest Freight, Penna Flyer + +### Sensor Entities +- **Battery Level**: Monitor locomotive battery percentage +- **Temperature**: Internal temperature monitoring +- **Voltage**: Power supply voltage monitoring + +### Binary Sensor +- **Connection**: Shows Bluetooth connection status + +## Installation + +### HACS (Recommended) +1. Open HACS in Home Assistant +2. Go to "Integrations" +3. Click the three dots menu and select "Custom repositories" +4. Add `https://github.com/iamjoshk/ha_lionel_controller` as an Integration +5. Install "Lionel Train Controller" +6. Restart Home Assistant + +### Manual Installation +1. Copy the `custom_components/lionel_controller` folder to your Home Assistant `custom_components` directory +2. Restart Home Assistant + +## Configuration + +### Auto-Discovery (Recommended) +1. Power on your Lionel LionChief locomotive near your Home Assistant device +2. The integration will automatically detect the train and show a notification +3. Go to Settings → Devices & Services to see the discovered train +4. Click "Configure" to add it to Home Assistant + +### Manual Setup +1. Go to Settings → Devices & Services +2. Click "Add Integration" +3. Search for "Lionel Train Controller" +4. Enter your locomotive's Bluetooth MAC address +5. Optionally customize the name and service UUID +6. Click Submit + +### Finding Your Train's MAC Address + +You can find your locomotive's MAC address by: +1. Using a Bluetooth scanner app on your phone +2. Looking in Home Assistant Developer Tools → States for bluetooth devices +3. Using the ESPHome logs if you have the reference implementation +4. Using Home Assistant's built-in Bluetooth integration to scan for devices + +### Example MAC Address Format +`FC:1F:C3:9F:A5:4A` (format: XX:XX:XX:XX:XX:XX) + +## Usage Examples + +Once configured, you can control your train through: + +### Automations +```yaml +# Example automation to start train at sunset with volume control +automation: + - alias: "Start Christmas Train at Sunset" + trigger: + - platform: sun + event: sunset + action: + # Set volumes first + - service: number.set_value + target: + entity_id: number.lionel_train_master_volume + data: + value: 5 + - service: number.set_value + target: + entity_id: number.lionel_train_horn_volume + data: + value: 6 + # Turn on lights and start train + - service: switch.turn_on + target: + entity_id: + - switch.lionel_train_lights + - switch.lionel_train_cab_lights + - switch.lionel_train_smoke_unit + - service: number.set_value + target: + entity_id: number.lionel_train_throttle + data: + value: 30 + - service: button.press + target: + entity_id: button.lionel_train_forward + - service: button.press + target: + entity_id: button.lionel_train_announcement_ready_to_roll +``` +``` + +### Dashboard Cards +```yaml +# Complete train control dashboard +type: entities +title: "Lionel Train Controller" +entities: + # Speed and Direction + - entity: number.lionel_train_throttle + - entity: button.lionel_train_forward + - entity: button.lionel_train_reverse + - entity: button.lionel_train_stop + + # Lighting Controls + - entity: switch.lionel_train_lights + - entity: switch.lionel_train_cab_lights + - entity: switch.lionel_train_number_boards + + # Sound Controls + - entity: switch.lionel_train_horn + - entity: switch.lionel_train_bell + - entity: number.lionel_train_master_volume + - entity: number.lionel_train_horn_volume + - entity: number.lionel_train_bell_volume + + # Advanced Features + - entity: switch.lionel_train_smoke_unit + - entity: button.lionel_train_fire_coupler + + # Status Monitoring + - entity: sensor.lionel_train_battery_level + - entity: sensor.lionel_train_temperature + - entity: sensor.lionel_train_voltage + - entity: binary_sensor.lionel_train_connection + + # Connection Control + - entity: button.lionel_train_reconnect +``` + +## Protocol Details + +This integration implements the complete Lionel LionChief Bluetooth protocol based on multiple reverse-engineering efforts: + +- **Primary Service UUID**: `e20a39f4-73f5-4bc4-a12f-17d1ad07a961` (LionChief control) +- **Device Info Service**: `0000180a-0000-1000-8000-00805f9b34fb` (standard BLE device information) +- **Write Characteristic**: `08590f7e-db05-467e-8757-72f6faeb13d4` (LionelCommand) +- **Notify Characteristic**: `08590f7e-db05-467e-8757-72f6faeb14d3` (LionelData) + +### Enhanced Command Structure + +The integration now uses the proper Lionel command format: +- **Byte 0**: Always `0x00` (command prefix) +- **Byte 1**: Command code (e.g., `0x45` for speed, `0x46` for direction) +- **Byte 2+**: Parameters specific to each command +- **Last Byte**: Checksum (simplified to `0x00` for compatibility) + +### Device Information + +The integration automatically reads and displays: +- Model number +- Serial number +- Firmware revision +- Hardware revision +- Software revision +- Manufacturer name + +This information is displayed in Home Assistant's device registry for better identification. + +## Compatibility + +- Tested with Pennsylvania Flyer locomotive +- Should work with other LionChief Bluetooth locomotives +- Requires Home Assistant 2023.8.0 or later +- Requires Python bleak 0.20.0 or later + +## Troubleshooting + +### Connection Issues +- Ensure locomotive is powered on and in Bluetooth pairing mode +- Check that locomotive is within Bluetooth range (typically 10-30 feet) +- Verify MAC address is correct +- Try restarting Home Assistant if connection issues persist + +### Improved Connection Reliability +The integration uses `bleak-retry-connector` for enhanced connection stability: +- **Automatic Retries**: Failed connections are automatically retried up to 3 times +- **Exponential Backoff**: Increasing delays between retry attempts to avoid overwhelming the device +- **Service Caching**: Bluetooth service information is cached for faster subsequent connections +- **Better Error Handling**: More informative error messages for connection troubleshooting + +### Service UUID Issues +Different locomotive models may use different service UUIDs. If the default doesn't work: +1. Use a Bluetooth scanner to find your locomotive's service UUID +2. Reconfigure the integration with the correct UUID + +## Credits + +- Protocol reverse engineering by [Property404](https://github.com/Property404/lionchief-controller) +- ESPHome reference implementation by [@iamjoshk](https://github.com/iamjoshk/home-assistant-collection/tree/main/ESPHome/LionelController) +- Additional protocol details from [pedasmith's BluetoothDeviceController](https://github.com/pedasmith/BluetoothDeviceController/blob/main/BluetoothProtocolsDevices/Lionel_LionChief.cs) + +## Contributing + +Issues and pull requests welcome! Please see the GitHub repository for more information. diff --git a/custom_components/lionel_controller/__init__.py b/custom_components/lionel_controller/__init__.py new file mode 100644 index 0000000..27bcc05 --- /dev/null +++ b/custom_components/lionel_controller/__init__.py @@ -0,0 +1,755 @@ +"""The Lionel Train Controller integration.""" +from __future__ import annotations + +import asyncio +import logging +from typing import Any + +from bleak import BleakClient, BleakError +from bleak_retry_connector import establish_connection, BleakClientWithServiceCache +from homeassistant.components import bluetooth +from homeassistant.components.bluetooth import BluetoothServiceInfoBleak, BluetoothChange +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_NAME, Platform +from homeassistant.core import HomeAssistant, callback +from homeassistant.exceptions import ConfigEntryNotReady + +from .const import ( + CMD_CAB_LIGHTS, + CMD_COUPLER, + CMD_MASTER_VOLUME, + CMD_NUMBER_BOARDS, + CMD_SMOKE, + CONF_MAC_ADDRESS, + CONF_SERVICE_UUID, + DEFAULT_RETRY_COUNT, + DEFAULT_TIMEOUT, + DEVICE_INFO_SERVICE_UUID, + DOMAIN, + FIRMWARE_REVISION_CHAR_UUID, + HARDWARE_REVISION_CHAR_UUID, + LIONCHIEF_SERVICE_UUID, + MANUFACTURER_NAME_CHAR_UUID, + MODEL_NUMBER_CHAR_UUID, + NOTIFY_CHARACTERISTIC_UUID, + SERIAL_NUMBER_CHAR_UUID, + SOFTWARE_REVISION_CHAR_UUID, + SOUND_SOURCE_BELL, + SOUND_SOURCE_ENGINE, + SOUND_SOURCE_HORN, + SOUND_SOURCE_SPEECH, + WRITE_CHARACTERISTIC_UUID, + build_command, + build_simple_command, +) + +_LOGGER = logging.getLogger(__name__) + +PLATFORMS: list[Platform] = [Platform.NUMBER, Platform.SWITCH, Platform.BUTTON, Platform.BINARY_SENSOR] + + +@callback +def _async_discovered_device( + service_info: BluetoothServiceInfoBleak, change: BluetoothChange +) -> bool: + """Check if discovered device is a Lionel LionChief locomotive.""" + if change != BluetoothChange.ADVERTISEMENT: + return False + + # Check for Lionel LionChief service UUID + lionel_service_uuid = LIONCHIEF_SERVICE_UUID.lower() + return any( + service_uuid.lower() == lionel_service_uuid + for service_uuid in service_info.service_uuids + ) + + +async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + """Set up Lionel Train Controller from a config entry.""" + mac_address = entry.data[CONF_MAC_ADDRESS] + name = entry.data[CONF_NAME] + service_uuid = entry.data[CONF_SERVICE_UUID] + + coordinator = LionelTrainCoordinator(hass, mac_address, name, service_uuid) + + # Don't require initial connection - allow integration to load even if locomotive is off + try: + await coordinator.async_setup() + _LOGGER.info("Successfully connected to Lionel train at %s", mac_address) + except (BleakError, asyncio.TimeoutError) as err: + _LOGGER.warning("Could not connect to Lionel train at %s during setup: %s", mac_address, err) + _LOGGER.info("Integration will load anyway - train will connect when powered on") + # Don't raise ConfigEntryNotReady - let the integration load anyway + + hass.data.setdefault(DOMAIN, {}) + hass.data[DOMAIN][entry.entry_id] = coordinator + + # Register services + async def reload_integration_service(call): + """Service to reload the integration for better reconnection.""" + entry_id = call.data.get("entry_id") + if entry_id and entry_id in hass.data[DOMAIN]: + _LOGGER.info("Reloading integration via service call") + await hass.config_entries.async_reload(entry_id) + + # Register the service if not already registered + if not hass.services.has_service(DOMAIN, "reload_integration"): + hass.services.async_register(DOMAIN, "reload_integration", reload_integration_service) + + await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) + return True + + +async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + """Unload a config entry.""" + if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS): + coordinator = hass.data[DOMAIN].pop(entry.entry_id) + await coordinator.async_shutdown() + + return unload_ok + + +class LionelTrainCoordinator: + """Coordinator for managing the Lionel train connection.""" + + def __init__( + self, + hass: HomeAssistant, + mac_address: str, + name: str, + service_uuid: str, + ) -> None: + """Initialize the coordinator.""" + self.hass = hass + self.mac_address = mac_address + self.name = name + self.service_uuid = service_uuid + self._client: BleakClientWithServiceCache | None = None + self._connected = False + self._lock = asyncio.Lock() + self._retry_count = 0 + self._update_callbacks = set() + + # State tracking + self._speed = 0 + self._direction_forward = True + self._lights_on = True # Default to on since locomotive lights are on when reconnected + self._horn_on = False + self._bell_on = False + + # Advanced feature state tracking + self._master_volume = 5 # Default mid-range volume + self._horn_volume = 5 + self._bell_volume = 5 + self._speech_volume = 5 + self._engine_volume = 5 + self._horn_pitch = 0 + self._bell_pitch = 0 + self._speech_pitch = 0 + self._engine_pitch = 0 + + self._smoke_on = False + self._cab_lights_on = False + self._number_boards_on = False + + # Device information + self._model_number = None + self._serial_number = None + self._firmware_revision = None + self._hardware_revision = None + self._software_revision = None + self._manufacturer_name = None + + # Dynamic characteristic discovery + self._discovered_write_char = None + self._discovered_notify_char = None + self._discovered_lionchief_service = None + + @property + def connected(self) -> bool: + """Return True if connected to the train.""" + return self._connected and self._client is not None and self._client.is_connected + + @property + def speed(self) -> int: + """Return current speed (0-100).""" + return self._speed + + @property + def direction_forward(self) -> bool: + """Return True if direction is forward.""" + return self._direction_forward + + @property + def lights_on(self) -> bool: + """Return True if lights are on.""" + return self._lights_on + + @property + def horn_on(self) -> bool: + """Return True if horn is on.""" + return self._horn_on + + @property + def bell_on(self) -> bool: + """Return True if bell is on.""" + return self._bell_on + + # Advanced feature properties + @property + def master_volume(self) -> int: + """Return master volume (0-7).""" + return self._master_volume + + @property + def horn_volume(self) -> int: + """Return horn volume (0-7).""" + return self._horn_volume + + @property + def bell_volume(self) -> int: + """Return bell volume (0-7).""" + return self._bell_volume + + @property + def speech_volume(self) -> int: + """Return speech volume (0-7).""" + return self._speech_volume + + @property + def engine_volume(self) -> int: + """Return engine volume (0-7).""" + return self._engine_volume + + @property + def smoke_on(self) -> bool: + """Return True if smoke unit is on.""" + return self._smoke_on + + @property + def cab_lights_on(self) -> bool: + """Return True if cab lights are on.""" + return self._cab_lights_on + + @property + def number_boards_on(self) -> bool: + """Return True if number boards are on.""" + return self._number_boards_on + + @property + def device_info(self) -> dict: + """Return device information.""" + return { + "model": self._model_number or "LionChief Locomotive", + "manufacturer": self._manufacturer_name or "Lionel", + "sw_version": self._software_revision or "Unknown", + "hw_version": self._hardware_revision or "Unknown", + "serial_number": self._serial_number, + } + + def add_update_callback(self, callback): + """Add a callback to be called when the state changes.""" + self._update_callbacks.add(callback) + + def remove_update_callback(self, callback): + """Remove a callback.""" + self._update_callbacks.discard(callback) + + def _notify_state_change(self): + """Notify all registered callbacks of state changes.""" + for callback in self._update_callbacks: + try: + callback() + except Exception as err: + _LOGGER.error("Error calling update callback: %s", err) + + async def async_setup(self) -> None: + """Set up the coordinator.""" + try: + await self._async_connect() + except (BleakError, asyncio.TimeoutError) as err: + _LOGGER.debug("Initial connection failed during setup: %s", err) + # Don't raise - let the integration load anyway + # Connection will be attempted when entities try to communicate + + async def async_shutdown(self) -> None: + """Shut down the coordinator.""" + if self._client and self._client.is_connected: + await self._client.disconnect() + self._connected = False + + async def _async_connect(self) -> None: + """Connect to the train.""" + async with self._lock: + if self._connected: + return + + # Get a fresh BLE device reference + ble_device = bluetooth.async_ble_device_from_address( + self.hass, self.mac_address, connectable=True + ) + + if not ble_device: + # Try to scan for the device if not found in cache + _LOGGER.debug("Device not found in cache, attempting fresh lookup") + await asyncio.sleep(0.5) # Brief delay before retry + ble_device = bluetooth.async_ble_device_from_address( + self.hass, self.mac_address, connectable=True + ) + + if not ble_device: + raise BleakError(f"Could not find Bluetooth device with address {self.mac_address}") + + try: + _LOGGER.debug("Establishing connection to %s", self.mac_address) + self._client = await establish_connection( + BleakClientWithServiceCache, + ble_device, + self.mac_address, + max_attempts=3, + ) + + # Read device information if available + await self._read_device_info() + + # Log all BLE services and characteristics for debugging + await self._log_ble_characteristics() + + # Set up notification handler for status updates (after discovery) + try: + notify_char_uuid = self._discovered_notify_char or NOTIFY_CHARACTERISTIC_UUID + await self._client.start_notify( + notify_char_uuid, self._notification_handler + ) + _LOGGER.info("📡 Set up notifications on %s", notify_char_uuid) + except BleakError as err: + _LOGGER.debug("Could not set up notifications (train may not support them): %s", err) + + self._connected = True + self._retry_count = 0 + _LOGGER.info("Connected to Lionel train at %s", self.mac_address) + + except BleakError as err: + _LOGGER.error("Failed to connect to train: %s", err) + self._connected = False + raise + + async def _notification_handler(self, sender: int, data: bytearray) -> None: + """Handle notifications from the train.""" + _LOGGER.debug("Received notification: %s", data.hex()) + + # Parse locomotive status data based on protocol analysis + if len(data) >= 8 and data[0] == 0x00 and data[1] == 0x81 and data[2] == 0x02: + # This is train status data: [0x00, 0x81, 0x02, speed, direction, 0x03, 0x0C, flags] + try: + self._speed = int((data[3] / 31) * 100) # Convert 0-31 to 0-100% + self._direction_forward = data[4] == 0x01 + + # Parse flags byte (data[7]) + flags = data[7] + self._lights_on = (flags & 0x04) != 0 + self._bell_on = (flags & 0x02) != 0 + + _LOGGER.debug("Parsed train status: speed=%d%%, forward=%s, lights=%s, bell=%s", + self._speed, self._direction_forward, self._lights_on, self._bell_on) + + # Notify entities of state change + self._notify_state_change() + + except (IndexError, ValueError) as err: + _LOGGER.debug("Error parsing train status: %s", err) + + async def _read_device_info(self) -> None: + """Read device information characteristics.""" + device_info_chars = { + MODEL_NUMBER_CHAR_UUID: "_model_number", + SERIAL_NUMBER_CHAR_UUID: "_serial_number", + FIRMWARE_REVISION_CHAR_UUID: "_firmware_revision", + HARDWARE_REVISION_CHAR_UUID: "_hardware_revision", + SOFTWARE_REVISION_CHAR_UUID: "_software_revision", + MANUFACTURER_NAME_CHAR_UUID: "_manufacturer_name", + } + + for char_uuid, attr_name in device_info_chars.items(): + try: + result = await self._client.read_gatt_char(char_uuid) + value = result.decode('utf-8', errors='ignore').strip() + if value: + setattr(self, attr_name, value) + _LOGGER.debug("Read %s: %s", attr_name, value) + except BleakError: + _LOGGER.debug("Could not read characteristic %s", char_uuid) + + async def _log_ble_characteristics(self) -> None: + """Log all BLE services and characteristics for debugging and discover dynamic characteristics.""" + try: + _LOGGER.info("=== BLE Service Discovery for %s ===", self.mac_address) + + services = self._client.services + # Convert to list to get length safely + service_list = list(services) + _LOGGER.info("Found %d services", len(service_list)) + + # Store discovered characteristics for dynamic usage + self._discovered_write_char = None + self._discovered_notify_char = None + self._discovered_lionchief_service = None + + service_count = 0 + for service in service_list: + service_count += 1 + _LOGGER.info("Service %d: %s (UUID: %s)", service_count, service.description, service.uuid) + + # Check if this might be the LionChief control service + # Look for services with writable characteristics that aren't standard BLE services + is_potential_lionchief = ( + str(service.uuid).lower() not in [ + "0000180a-0000-1000-8000-00805f9b34fb", # Device Information + "0000180f-0000-1000-8000-00805f9b34fb", # Battery Service + "00001800-0000-1000-8000-00805f9b34fb", # Generic Access + "00001801-0000-1000-8000-00805f9b34fb", # Generic Attribute + ] + ) + + char_count = 0 + for char in service.characteristics: + char_count += 1 + properties = [] + has_write = False + has_notify = False + + if "read" in char.properties: + properties.append("READ") + if "write" in char.properties: + properties.append("WRITE") + has_write = True + if "write-without-response" in char.properties: + properties.append("WRITE-NO-RESP") + has_write = True + if "notify" in char.properties: + properties.append("NOTIFY") + has_notify = True + if "indicate" in char.properties: + properties.append("INDICATE") + has_notify = True + + _LOGGER.info(" Char %d: %s (UUID: %s) [%s]", + char_count, char.description, char.uuid, ", ".join(properties)) + + # Identify potential LionChief characteristics + if is_potential_lionchief: + if has_write and not self._discovered_write_char: + self._discovered_write_char = str(char.uuid) + _LOGGER.info(" *** POTENTIAL LIONCHIEF WRITE CHARACTERISTIC ***") + if has_notify and not self._discovered_notify_char: + self._discovered_notify_char = str(char.uuid) + _LOGGER.info(" *** POTENTIAL LIONCHIEF NOTIFY CHARACTERISTIC ***") + + if has_write or has_notify: + self._discovered_lionchief_service = str(service.uuid) + + # Try to read characteristics that support reading (with better error handling) + if "read" in char.properties: + try: + _LOGGER.debug(" Attempting to read characteristic value...") + value = await self._client.read_gatt_char(char.uuid) + if value and len(value) <= 50: # Increased limit and null check + try: + # Try to decode as string first + decoded = value.decode('utf-8').strip('\x00') + _LOGGER.info(" Value (text): '%s'", decoded) + except UnicodeDecodeError: + # Fall back to hex + _LOGGER.info(" Value (hex): %s", value.hex()) + elif value: + _LOGGER.info(" Value: ", len(value)) + except Exception as err: + _LOGGER.debug(" Could not read value: %s", err) + + _LOGGER.info(" Found %d characteristics in this service", char_count) + + _LOGGER.info("=== End BLE Service Discovery ===") + + # Log discovered LionChief characteristics + if self._discovered_lionchief_service: + _LOGGER.info("🎯 DISCOVERED LIONCHIEF SERVICE: %s", self._discovered_lionchief_service) + if self._discovered_write_char: + _LOGGER.info("🎯 DISCOVERED WRITE CHARACTERISTIC: %s", self._discovered_write_char) + if self._discovered_notify_char: + _LOGGER.info("🎯 DISCOVERED NOTIFY CHARACTERISTIC: %s", self._discovered_notify_char) + + # Update constants if we found better characteristics + if self._discovered_write_char and self._discovered_write_char != WRITE_CHARACTERISTIC_UUID: + _LOGGER.info("💡 Consider updating WRITE_CHARACTERISTIC_UUID to: %s", self._discovered_write_char) + if self._discovered_notify_char and self._discovered_notify_char != NOTIFY_CHARACTERISTIC_UUID: + _LOGGER.info("💡 Consider updating NOTIFY_CHARACTERISTIC_UUID to: %s", self._discovered_notify_char) + + except Exception as err: + _LOGGER.error("Error during BLE service discovery: %s", err) + import traceback + _LOGGER.error("Full traceback: %s", traceback.format_exc()) + + async def async_send_command(self, command_data: list[int]) -> bool: + """Send a command to the train.""" + async with self._lock: + # Try to connect if not connected + if not self.connected: + try: + await self._async_connect() + except BleakError as err: + _LOGGER.error("Failed to connect before sending command: %s", err) + return False + + # Use discovered write characteristic if available, otherwise use default + write_char_uuid = self._discovered_write_char or WRITE_CHARACTERISTIC_UUID + + # Retry command sending with better error handling + max_retries = 3 + for attempt in range(max_retries): + try: + await self._client.write_gatt_char( + write_char_uuid, bytearray(command_data) + ) + _LOGGER.info("✅ Sent command successfully to %s: %s (hex: %s)", + write_char_uuid, command_data, ' '.join(f'{b:02x}' for b in command_data)) + return True + + except BleakError as err: + _LOGGER.warning("Failed to send command to %s (attempt %d/%d): %s", + write_char_uuid, attempt + 1, max_retries, err) + self._connected = False + + # Try to reconnect on subsequent attempts + if attempt < max_retries - 1: + try: + await asyncio.sleep(0.5 * (attempt + 1)) # Exponential backoff + await self._async_connect() + except BleakError: + _LOGGER.debug("Reconnection attempt %d failed", attempt + 1) + continue + else: + _LOGGER.error("Failed to send command after %d attempts: %s", max_retries, err) + + return False + + async def async_set_speed(self, speed: int) -> bool: + """Set train speed (0-100).""" + if not 0 <= speed <= 100: + raise ValueError("Speed must be between 0 and 100") + + # Convert 0-100 to 0-31 (0x00-0x1F) hex scale + hex_speed = int((speed / 100) * 31) + command = build_simple_command(0x45, [hex_speed]) + + success = await self.async_send_command(command) + if success: + self._speed = speed + self._notify_state_change() + return success + + async def async_set_direction(self, forward: bool) -> bool: + """Set train direction.""" + direction_value = 0x01 if forward else 0x02 + command = build_simple_command(0x46, [direction_value]) + + success = await self.async_send_command(command) + if success: + self._direction_forward = forward + return success + + async def async_set_lights(self, on: bool) -> bool: + """Set train lights.""" + command = build_simple_command(0x51, [0x01 if on else 0x00]) + success = await self.async_send_command(command) + if success: + self._lights_on = on + return success + + async def async_set_horn(self, on: bool) -> bool: + """Set train horn.""" + command = build_simple_command(0x48, [0x01 if on else 0x00]) + success = await self.async_send_command(command) + if success: + self._horn_on = on + return success + + async def async_set_bell(self, on: bool) -> bool: + """Set train bell.""" + command = build_simple_command(0x47, [0x01 if on else 0x00]) + success = await self.async_send_command(command) + if success: + self._bell_on = on + return success + + async def async_play_announcement(self, announcement_code: int) -> bool: + """Play announcement sound.""" + command = build_simple_command(0x4D, [announcement_code, 0x00]) + return await self.async_send_command(command) + + async def async_disconnect(self) -> bool: + """Disconnect from train.""" + command = build_simple_command(0x4B, [0x00, 0x00]) + return await self.async_send_command(command) + + async def async_force_reconnect(self) -> bool: + """Force reconnection to the train.""" + _LOGGER.info("Force reconnecting to Lionel train at %s", self.mac_address) + + # Clear connection state first - don't try to send disconnect commands + # since the locomotive might already be disconnected/powered off + self._connected = False + if self._client: + try: + if self._client.is_connected: + await self._client.disconnect() + _LOGGER.debug("Disconnected existing client") + except Exception as err: + _LOGGER.debug("Error disconnecting client (expected if already disconnected): %s", err) + finally: + self._client = None + + # Wait for any existing connections to clear + await asyncio.sleep(1.0) + + # Now try to establish a fresh connection + max_attempts = 5 + for attempt in range(max_attempts): + try: + _LOGGER.debug("Connection attempt %d/%d", attempt + 1, max_attempts) + + # Get fresh device reference + ble_device = bluetooth.async_ble_device_from_address( + self.hass, self.mac_address, connectable=True + ) + + if not ble_device: + if attempt < max_attempts - 1: + wait_time = (attempt + 1) * 1.0 # 1s, 2s, 3s, 4s delays + _LOGGER.debug("Device not found, waiting %s seconds before retry", wait_time) + await asyncio.sleep(wait_time) + continue + else: + raise BleakError(f"Could not find Bluetooth device {self.mac_address}") + + # Establish fresh connection + async with self._lock: + _LOGGER.debug("Establishing connection to %s", self.mac_address) + self._client = await establish_connection( + BleakClientWithServiceCache, + ble_device, + self.mac_address, + max_attempts=3, + ) + + # Set up notification handler + try: + await self._client.start_notify( + NOTIFY_CHARACTERISTIC_UUID, self._notification_handler + ) + except BleakError: + _LOGGER.debug("Could not set up notifications") + + # Read device information + await self._read_device_info() + + self._connected = True + self._retry_count = 0 + _LOGGER.info("Successfully reconnected to train") + + # Notify all entities of the reconnection + self._notify_state_change() + return True + + except BleakError as err: + _LOGGER.debug("Connection attempt %d failed: %s", attempt + 1, err) + if attempt < max_attempts - 1: + wait_time = (attempt + 1) * 2.0 # 2s, 4s, 6s, 8s delays + _LOGGER.debug("Waiting %s seconds before retry", wait_time) + await asyncio.sleep(wait_time) + else: + _LOGGER.error("Failed to reconnect after %d attempts: %s", max_attempts, err) + return False + + return False + + # Advanced feature control methods + async def async_set_master_volume(self, volume: int) -> bool: + """Set master volume (0-7).""" + if not 0 <= volume <= 7: + raise ValueError("Volume must be between 0 and 7") + + command = build_simple_command(CMD_MASTER_VOLUME, [volume]) + success = await self.async_send_command(command) + if success: + self._master_volume = volume + self._notify_state_change() + return success + + async def async_set_sound_volume(self, sound_source: int, volume: int, pitch: int = None) -> bool: + """Set volume and optionally pitch for specific sound source.""" + if not 0 <= volume <= 7: + raise ValueError("Volume must be between 0 and 7") + if pitch is not None and not -2 <= pitch <= 2: + raise ValueError("Pitch must be between -2 and 2") + + # Use simple command for better compatibility + if pitch is not None: + command = build_simple_command(CMD_SOUND_VOLUME, [sound_source, volume, pitch & 0xFF]) + else: + command = build_simple_command(CMD_SOUND_VOLUME, [sound_source, volume]) + + success = await self.async_send_command(command) + + if success: + # Update state tracking based on sound source + if sound_source == SOUND_SOURCE_HORN: + self._horn_volume = volume + if pitch is not None: + self._horn_pitch = pitch + elif sound_source == SOUND_SOURCE_BELL: + self._bell_volume = volume + if pitch is not None: + self._bell_pitch = pitch + elif sound_source == SOUND_SOURCE_SPEECH: + self._speech_volume = volume + if pitch is not None: + self._speech_pitch = pitch + elif sound_source == SOUND_SOURCE_ENGINE: + self._engine_volume = volume + if pitch is not None: + self._engine_pitch = pitch + + self._notify_state_change() + return success + + async def async_set_smoke(self, on: bool) -> bool: + """Set smoke unit on/off.""" + command = build_simple_command(CMD_SMOKE, [0x01 if on else 0x00]) + success = await self.async_send_command(command) + if success: + self._smoke_on = on + self._notify_state_change() + return success + + async def async_fire_coupler(self) -> bool: + """Fire the coupler (one-shot action).""" + command = build_simple_command(CMD_COUPLER, [0x01]) + return await self.async_send_command(command) + + async def async_set_cab_lights(self, on: bool) -> bool: + """Set cab lights on/off.""" + command = build_simple_command(CMD_CAB_LIGHTS, [0x01 if on else 0x00]) + success = await self.async_send_command(command) + if success: + self._cab_lights_on = on + self._notify_state_change() + return success + + async def async_set_number_boards(self, on: bool) -> bool: + """Set number board lights on/off.""" + command = build_simple_command(CMD_NUMBER_BOARDS, [0x01 if on else 0x00]) + success = await self.async_send_command(command) + if success: + self._number_boards_on = on + self._notify_state_change() + return success \ No newline at end of file diff --git a/custom_components/lionel_controller/binary_sensor.py b/custom_components/lionel_controller/binary_sensor.py new file mode 100644 index 0000000..a2c882f --- /dev/null +++ b/custom_components/lionel_controller/binary_sensor.py @@ -0,0 +1,64 @@ +"""Binary sensor platform for Lionel Train Controller integration.""" +from __future__ import annotations + +import logging + +from homeassistant.components.binary_sensor import ( + BinarySensorDeviceClass, + BinarySensorEntity, +) +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_NAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from . import LionelTrainCoordinator +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up the Lionel Train binary sensor platform.""" + coordinator: LionelTrainCoordinator = hass.data[DOMAIN][config_entry.entry_id] + name = config_entry.data[CONF_NAME] + + async_add_entities([LionelTrainConnectionSensor(coordinator, name)], True) + + +class LionelTrainConnectionSensor(BinarySensorEntity): + """Binary sensor for Lionel Train connection status.""" + + _attr_has_entity_name = True + _attr_name = "Connection" + _attr_device_class = BinarySensorDeviceClass.CONNECTIVITY + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the binary sensor.""" + self._coordinator = coordinator + self._attr_unique_id = f"{coordinator.mac_address}_connection" + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": device_name, + **coordinator.device_info, + } + # Register for state updates + self._coordinator.add_update_callback(self.async_write_ha_state) + + async def async_will_remove_from_hass(self) -> None: + """Entity being removed from hass.""" + self._coordinator.remove_update_callback(self.async_write_ha_state) + + @property + def is_on(self) -> bool: + """Return True if the train is connected.""" + return self._coordinator.connected + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return True # This sensor is always available to show connection status \ No newline at end of file diff --git a/custom_components/lionel_controller/button.py b/custom_components/lionel_controller/button.py new file mode 100644 index 0000000..35cb119 --- /dev/null +++ b/custom_components/lionel_controller/button.py @@ -0,0 +1,191 @@ +"""Button platform for Lionel Train Controller integration.""" +from __future__ import annotations + +import logging + +from homeassistant.components.button import ButtonEntity +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_NAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from . import LionelTrainCoordinator +from .const import ANNOUNCEMENTS, DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up the Lionel Train button platform.""" + coordinator: LionelTrainCoordinator = hass.data[DOMAIN][config_entry.entry_id] + name = config_entry.data[CONF_NAME] + + buttons = [ + LionelTrainDisconnectButton(coordinator, name), + LionelTrainReconnectButton(coordinator, name), + LionelTrainStopButton(coordinator, name), + LionelTrainForwardButton(coordinator, name), + LionelTrainReverseButton(coordinator, name), + LionelTrainCouplerButton(coordinator, name), + ] + + # Add announcement buttons + for announcement_name in ANNOUNCEMENTS: + buttons.append( + LionelTrainAnnouncementButton(coordinator, name, announcement_name) + ) + + async_add_entities(buttons, True) + + +class LionelTrainButtonBase(ButtonEntity): + """Base class for Lionel Train buttons.""" + + _attr_has_entity_name = True + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the button.""" + self._coordinator = coordinator + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": device_name, + **coordinator.device_info, + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + +class LionelTrainDisconnectButton(LionelTrainButtonBase): + """Button for disconnecting from the train.""" + + _attr_name = "Disconnect" + _attr_icon = "mdi:bluetooth-off" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the disconnect button.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_disconnect" + + async def async_press(self) -> None: + """Press the button.""" + await self._coordinator.async_disconnect() + + +class LionelTrainReconnectButton(LionelTrainButtonBase): + """Button for reconnecting to the train.""" + + _attr_name = "Reconnect" + _attr_icon = "mdi:bluetooth-connect" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the reconnect button.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_reconnect" + + async def async_press(self) -> None: + """Press the button.""" + _LOGGER.info("Reconnect button pressed - initiating fresh connection") + + success = await self._coordinator.async_force_reconnect() + + if success: + _LOGGER.info("Reconnect successful") + else: + _LOGGER.error("Reconnect failed - ensure locomotive is powered on and in range") + + # Always trigger a state update to refresh entity availability + self.async_write_ha_state() + + +class LionelTrainStopButton(LionelTrainButtonBase): + """Button for stopping the train.""" + + _attr_name = "Stop" + _attr_icon = "mdi:stop" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the stop button.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_stop" + + async def async_press(self) -> None: + """Press the button.""" + await self._coordinator.async_set_speed(0) + + +class LionelTrainForwardButton(LionelTrainButtonBase): + """Button for setting forward direction.""" + + _attr_name = "Forward" + _attr_icon = "mdi:arrow-right" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the forward button.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_forward" + + async def async_press(self) -> None: + """Press the button.""" + await self._coordinator.async_set_direction(True) + + +class LionelTrainReverseButton(LionelTrainButtonBase): + """Button for setting reverse direction.""" + + _attr_name = "Reverse" + _attr_icon = "mdi:arrow-left" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the reverse button.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_reverse" + + async def async_press(self) -> None: + """Press the button.""" + await self._coordinator.async_set_direction(False) + + +class LionelTrainAnnouncementButton(LionelTrainButtonBase): + """Button for playing announcements.""" + + _attr_icon = "mdi:bullhorn-variant" + + def __init__( + self, coordinator: LionelTrainCoordinator, device_name: str, announcement_name: str + ) -> None: + """Initialize the announcement button.""" + super().__init__(coordinator, device_name) + self._announcement_name = announcement_name + self._attr_name = f"Announcement {announcement_name}" + self._attr_unique_id = f"{coordinator.mac_address}_announcement_{announcement_name.lower().replace(' ', '_')}" + + async def async_press(self) -> None: + """Press the button.""" + announcement_config = ANNOUNCEMENTS[self._announcement_name] + announcement_code = announcement_config["code"] + await self._coordinator.async_play_announcement(announcement_code) + + +class LionelTrainCouplerButton(LionelTrainButtonBase): + """Button for firing the coupler.""" + + _attr_name = "Fire Coupler" + _attr_icon = "mdi:link-variant" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the coupler button.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_coupler" + + async def async_press(self) -> None: + """Press the button.""" + await self._coordinator.async_fire_coupler() + + diff --git a/custom_components/lionel_controller/config_flow.py b/custom_components/lionel_controller/config_flow.py new file mode 100644 index 0000000..602e220 --- /dev/null +++ b/custom_components/lionel_controller/config_flow.py @@ -0,0 +1,196 @@ +"""Config flow for Lionel Train Controller integration.""" +from __future__ import annotations + +import logging +from typing import Any + +import voluptuous as vol +from bleak import BleakScanner +from bleak.exc import BleakError +from homeassistant import config_entries +from homeassistant.components import bluetooth +from homeassistant.components.bluetooth import BluetoothServiceInfoBleak +from homeassistant.const import CONF_NAME +from homeassistant.core import HomeAssistant +from homeassistant.data_entry_flow import FlowResult +from homeassistant.exceptions import HomeAssistantError + +from .const import ( + CONF_MAC_ADDRESS, + CONF_SERVICE_UUID, + DEFAULT_NAME, + DEFAULT_SERVICE_UUID, + DOMAIN, +) + +_LOGGER = logging.getLogger(__name__) + +STEP_USER_DATA_SCHEMA = vol.Schema( + { + vol.Required(CONF_MAC_ADDRESS): str, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): str, + vol.Optional(CONF_SERVICE_UUID, default=DEFAULT_SERVICE_UUID): str, + } +) + + +async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, Any]: + """Validate the user input allows us to connect. + + Data has the keys from STEP_USER_DATA_SCHEMA with values provided by the user. + """ + mac_address = data[CONF_MAC_ADDRESS] + + # Validate MAC address format + if not _is_valid_mac_address(mac_address): + raise InvalidMacAddress + + # Try to discover the device + try: + scanner = BleakScanner() + devices = await scanner.discover(timeout=10.0) + + device_found = any( + device.address.upper() == mac_address.upper() for device in devices + ) + + if not device_found: + raise CannotConnect + + except BleakError as err: + _LOGGER.exception("Error discovering Bluetooth devices") + raise CannotConnect from err + + # Return info that you want to store in the config entry. + return { + "title": data[CONF_NAME], + "mac_address": mac_address.upper(), + "service_uuid": data[CONF_SERVICE_UUID], + } + + +def _is_valid_mac_address(mac: str) -> bool: + """Check if MAC address is valid.""" + parts = mac.split(":") + if len(parts) != 6: + return False + + for part in parts: + if len(part) != 2: + return False + try: + int(part, 16) + except ValueError: + return False + + return True + + +class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): + """Handle a config flow for Lionel Train Controller.""" + + VERSION = 1 + + def __init__(self) -> None: + """Initialize the config flow.""" + self._discovered_devices: dict[str, BluetoothServiceInfoBleak] = {} + + async def async_step_user( + self, user_input: dict[str, Any] | None = None + ) -> FlowResult: + """Handle the initial step.""" + errors: dict[str, str] = {} + + if user_input is not None: + try: + info = await validate_input(self.hass, user_input) + except CannotConnect: + errors["base"] = "cannot_connect" + except InvalidMacAddress: + errors[CONF_MAC_ADDRESS] = "invalid_mac" + except Exception: # pylint: disable=broad-except + _LOGGER.exception("Unexpected exception") + errors["base"] = "unknown" + else: + # Check if already configured + await self.async_set_unique_id(info["mac_address"]) + self._abort_if_unique_id_configured() + + return self.async_create_entry(title=info["title"], data={ + CONF_MAC_ADDRESS: info["mac_address"], + CONF_NAME: info["title"], + CONF_SERVICE_UUID: info["service_uuid"], + }) + + return self.async_show_form( + step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors + ) + + async def async_step_bluetooth( + self, discovery_info: BluetoothServiceInfoBleak + ) -> FlowResult: + """Handle the bluetooth discovery step.""" + await self.async_set_unique_id(discovery_info.address) + self._abort_if_unique_id_configured() + + # Check if this is a Lionel train by service UUID + lionel_service_found = False + for service_uuid in discovery_info.service_uuids: + if service_uuid.lower() == DEFAULT_SERVICE_UUID.lower(): + lionel_service_found = True + break + + if not lionel_service_found: + return self.async_abort(reason="not_lionel_device") + + self._discovered_devices[discovery_info.address] = discovery_info + + # Set context for better user experience + self.context["title_placeholders"] = { + "name": discovery_info.name or f"Lionel Train ({discovery_info.address[-5:]})" + } + + return await self.async_step_bluetooth_confirm() + + async def async_step_bluetooth_confirm( + self, user_input: dict[str, Any] | None = None + ) -> FlowResult: + """Confirm discovery.""" + if user_input is not None: + discovery_info = self._discovered_devices[self.unique_id] + + # Try to get device name from discovery or use default + device_name = discovery_info.name + if not device_name: + # Create a friendly name based on MAC address + mac_suffix = discovery_info.address[-5:].replace(":", "") + device_name = f"Lionel Train {mac_suffix}" + + return self.async_create_entry( + title=device_name, + data={ + CONF_MAC_ADDRESS: discovery_info.address, + CONF_NAME: device_name, + CONF_SERVICE_UUID: DEFAULT_SERVICE_UUID, + }, + ) + + # Show confirmation form with device details + discovery_info = self._discovered_devices[self.unique_id] + device_name = discovery_info.name or f"Lionel Train ({discovery_info.address[-5:]})" + + return self.async_show_form( + step_id="bluetooth_confirm", + description_placeholders={ + "name": device_name, + "address": discovery_info.address, + }, + ) + + +class CannotConnect(HomeAssistantError): + """Error to indicate we cannot connect.""" + + +class InvalidMacAddress(HomeAssistantError): + """Error to indicate there is invalid MAC address.""" \ No newline at end of file diff --git a/custom_components/lionel_controller/const.py b/custom_components/lionel_controller/const.py new file mode 100644 index 0000000..64c2889 --- /dev/null +++ b/custom_components/lionel_controller/const.py @@ -0,0 +1,128 @@ +"""Constants for the Lionel Train Controller integration.""" + +DOMAIN = "lionel_controller" + +# Service UUIDs +LIONCHIEF_SERVICE_UUID = "e20a39f4-73f5-4bc4-a12f-17d1ad07a961" +DEVICE_INFO_SERVICE_UUID = "0000180a-0000-1000-8000-00805f9b34fb" +GENERIC_ACCESS_SERVICE_UUID = "00001800-0000-1000-8000-00805f9b34fb" + +# Default service UUID (may vary by model) +DEFAULT_SERVICE_UUID = LIONCHIEF_SERVICE_UUID + +# LionChief Characteristic UUIDs +WRITE_CHARACTERISTIC_UUID = "08590f7e-db05-467e-8757-72f6faeb13d4" # LionelCommand +NOTIFY_CHARACTERISTIC_UUID = "08590f7e-db05-467e-8757-72f6faeb14d3" # LionelData + +# Device Information Characteristic UUIDs +DEVICE_NAME_CHAR_UUID = "00002a00-0000-1000-8000-00805f9b34fb" +MODEL_NUMBER_CHAR_UUID = "00002a24-0000-1000-8000-00805f9b34fb" +SERIAL_NUMBER_CHAR_UUID = "00002a25-0000-1000-8000-00805f9b34fb" +FIRMWARE_REVISION_CHAR_UUID = "00002a26-0000-1000-8000-00805f9b34fb" +HARDWARE_REVISION_CHAR_UUID = "00002a27-0000-1000-8000-00805f9b34fb" +SOFTWARE_REVISION_CHAR_UUID = "00002a28-0000-1000-8000-00805f9b34fb" +MANUFACTURER_NAME_CHAR_UUID = "00002a29-0000-1000-8000-00805f9b34fb" + +# Command structure constants +CMD_ZERO_BYTE = 0x00 # First byte is always 0x00 +CMD_CHECKSUM = 0x00 # Checksum (simplified for now) + +# Command codes (second byte) +CMD_SPEED = 0x45 +CMD_DIRECTION = 0x46 +CMD_BELL = 0x47 +CMD_HORN = 0x48 +CMD_ANNOUNCEMENT = 0x4D +CMD_DISCONNECT = 0x4B +CMD_LIGHTS = 0x51 +CMD_MASTER_VOLUME = 0x4C # Overall volume control +CMD_SOUND_VOLUME = 0x44 # Volume/pitch for individual sound sources + +# New advanced command codes +CMD_SMOKE = 0x52 # Smoke unit control (estimated) +CMD_COUPLER = 0x53 # Coupler firing (estimated) +CMD_CAB_LIGHTS = 0x54 # Cab lights control (estimated) +CMD_NUMBER_BOARDS = 0x55 # Number board lights (estimated) + +# Direction values (third byte for direction commands) +DIRECTION_FORWARD = 0x01 +DIRECTION_REVERSE = 0x02 + +# Sound source types for volume control +SOUND_SOURCE_HORN = 0x01 +SOUND_SOURCE_BELL = 0x02 +SOUND_SOURCE_SPEECH = 0x03 +SOUND_SOURCE_ENGINE = 0x04 + +# Volume and pitch ranges +VOLUME_MIN = 0 +VOLUME_MAX = 7 +PITCH_MIN = -2 +PITCH_MAX = 2 + +# Configuration keys +CONF_MAC_ADDRESS = "mac_address" +CONF_SERVICE_UUID = "service_uuid" + +# Default values +DEFAULT_NAME = "Lionel Train" +DEFAULT_TIMEOUT = 10.0 +DEFAULT_RETRY_COUNT = 3 + +# Enhanced announcement sounds with proper command structure +ANNOUNCEMENTS = { + "Random": {"code": 0x00, "name": "Random"}, + "Ready to Roll": {"code": 0x01, "name": "Ready to Roll"}, + "Hey There": {"code": 0x02, "name": "Hey There"}, + "Squeaky": {"code": 0x03, "name": "Squeaky"}, + "Water and Fire": {"code": 0x04, "name": "Water and Fire"}, + "Fastest Freight": {"code": 0x05, "name": "Fastest Freight"}, + "Penna Flyer": {"code": 0x06, "name": "Penna Flyer"}, +} + +# Command building helper functions +def calculate_checksum(command_code: int, parameters: list[int] = None) -> int: + """Calculate proper Lionel checksum based on protocol.""" + if parameters is None: + parameters = [] + + # Checksum calculation: 0xFF - command - sum(parameters) + checksum = 0xFF - command_code + for param in parameters: + checksum = (checksum - param) & 0xFF + + return checksum + +def build_command(command_code: int, parameters: list[int] = None) -> list[int]: + """Build a properly formatted Lionel command with correct checksum.""" + if parameters is None: + parameters = [] + + # Enhanced command structure: [0x00, command, param1, param2, ..., checksum] + command = [CMD_ZERO_BYTE, command_code] + parameters + + # Add proper checksum + checksum = calculate_checksum(command_code, parameters) + command.append(checksum) + + return command + +def build_simple_command(command_code: int, parameters: list[int] = None) -> list[int]: + """Build a simple Lionel command without checksum for basic compatibility.""" + if parameters is None: + parameters = [] + + # Simple command structure: [0x00, command, param1, param2, ...] + # No checksum for maximum compatibility + command = [CMD_ZERO_BYTE, command_code] + parameters + + return command + +def build_volume_command(sound_source: int, volume: int, pitch: int = None) -> list[int]: + """Build volume/pitch command for specific sound source.""" + if pitch is not None: + # Clamp pitch to valid range + pitch = max(PITCH_MIN, min(PITCH_MAX, pitch)) + return build_command(CMD_SOUND_VOLUME, [sound_source, volume, pitch & 0xFF]) + else: + return build_command(CMD_SOUND_VOLUME, [sound_source, volume]) \ No newline at end of file diff --git a/custom_components/lionel_controller/manifest.json b/custom_components/lionel_controller/manifest.json new file mode 100644 index 0000000..deff891 --- /dev/null +++ b/custom_components/lionel_controller/manifest.json @@ -0,0 +1,24 @@ +{ + "domain": "lionel_controller", + "name": "Lionel Train Controller", + "version": "1.0.0", + "documentation": "https://github.com/iamjoshk/ha_lionel_controller", + "issue_tracker": "https://github.com/iamjoshk/ha_lionel_controller/issues", + "dependencies": [], + "config_flow": true, + "codeowners": ["@iamjoshk"], + "requirements": ["bleak>=0.20.0", "bleak-retry-connector>=3.4.0"], + "bluetooth": [ + { + "service_uuid": "e20a39f4-73f5-4bc4-a12f-17d1ad07a961", + "connectable": true + }, + { + "service_uuid": "0000180a-0000-1000-8000-00805f9b34fb", + "connectable": false + } + ], + "bluetooth_discovery": true, + "iot_class": "local_push", + "quality_scale": "silver" +} \ No newline at end of file diff --git a/custom_components/lionel_controller/number.py b/custom_components/lionel_controller/number.py new file mode 100644 index 0000000..0629198 --- /dev/null +++ b/custom_components/lionel_controller/number.py @@ -0,0 +1,268 @@ +"""Number platform for Lionel Train Controller integration.""" +from __future__ import annotations + +import logging +from typing import Any + +from homeassistant.components.number import NumberEntity, NumberMode +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_NAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from . import LionelTrainCoordinator +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up the Lionel Train number platform.""" + coordinator: LionelTrainCoordinator = hass.data[DOMAIN][config_entry.entry_id] + name = config_entry.data[CONF_NAME] + + async_add_entities([ + LionelTrainThrottle(coordinator, name), + LionelTrainMasterVolume(coordinator, name), + LionelTrainHornVolume(coordinator, name), + LionelTrainBellVolume(coordinator, name), + LionelTrainSpeechVolume(coordinator, name), + LionelTrainEngineVolume(coordinator, name), + ], True) + + +class LionelTrainThrottle(NumberEntity): + """Representation of a Lionel Train throttle as a number entity.""" + + _attr_has_entity_name = True + _attr_name = "Throttle" + _attr_icon = "mdi:train" + _attr_mode = NumberMode.SLIDER + _attr_native_min_value = 0 + _attr_native_max_value = 100 + _attr_native_step = 1 + _attr_native_unit_of_measurement = "%" + + def __init__(self, coordinator: LionelTrainCoordinator, name: str) -> None: + """Initialize the number entity.""" + self._coordinator = coordinator + self._attr_unique_id = f"{coordinator.mac_address}_throttle" + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": name, + **coordinator.device_info, + } + # Register for state updates + self._coordinator.add_update_callback(self.async_write_ha_state) + + async def async_will_remove_from_hass(self) -> None: + """Entity being removed from hass.""" + self._coordinator.remove_update_callback(self.async_write_ha_state) + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + @property + def native_value(self) -> float | None: + """Return the current throttle value.""" + return self._coordinator.speed + + async def async_set_native_value(self, value: float) -> None: + """Set the throttle value.""" + await self._coordinator.async_set_speed(int(value)) + self.async_write_ha_state() + + +class LionelTrainMasterVolume(NumberEntity): + """Representation of master volume control.""" + + _attr_has_entity_name = True + _attr_name = "Master Volume" + _attr_icon = "mdi:volume-high" + _attr_mode = NumberMode.SLIDER + _attr_native_min_value = 0 + _attr_native_max_value = 7 + _attr_native_step = 1 + + def __init__(self, coordinator: LionelTrainCoordinator, name: str) -> None: + """Initialize the number entity.""" + self._coordinator = coordinator + self._attr_unique_id = f"{coordinator.mac_address}_master_volume" + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": name, + **coordinator.device_info, + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + @property + def native_value(self) -> float | None: + """Return the current master volume.""" + return self._coordinator.master_volume + + async def async_set_native_value(self, value: float) -> None: + """Set the master volume.""" + await self._coordinator.async_set_master_volume(int(value)) + self.async_write_ha_state() + + +class LionelTrainHornVolume(NumberEntity): + """Representation of horn volume control.""" + + _attr_has_entity_name = True + _attr_name = "Horn Volume" + _attr_icon = "mdi:bullhorn" + _attr_mode = NumberMode.SLIDER + _attr_native_min_value = 0 + _attr_native_max_value = 7 + _attr_native_step = 1 + + def __init__(self, coordinator: LionelTrainCoordinator, name: str) -> None: + """Initialize the number entity.""" + self._coordinator = coordinator + self._attr_unique_id = f"{coordinator.mac_address}_horn_volume" + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": name, + **coordinator.device_info, + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + @property + def native_value(self) -> float | None: + """Return the current horn volume.""" + return self._coordinator.horn_volume + + async def async_set_native_value(self, value: float) -> None: + """Set the horn volume.""" + from .const import SOUND_SOURCE_HORN + await self._coordinator.async_set_sound_volume(SOUND_SOURCE_HORN, int(value)) + self.async_write_ha_state() + + +class LionelTrainBellVolume(NumberEntity): + """Representation of bell volume control.""" + + _attr_has_entity_name = True + _attr_name = "Bell Volume" + _attr_icon = "mdi:bell" + _attr_mode = NumberMode.SLIDER + _attr_native_min_value = 0 + _attr_native_max_value = 7 + _attr_native_step = 1 + + def __init__(self, coordinator: LionelTrainCoordinator, name: str) -> None: + """Initialize the number entity.""" + self._coordinator = coordinator + self._attr_unique_id = f"{coordinator.mac_address}_bell_volume" + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": name, + **coordinator.device_info, + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + @property + def native_value(self) -> float | None: + """Return the current bell volume.""" + return self._coordinator.bell_volume + + async def async_set_native_value(self, value: float) -> None: + """Set the bell volume.""" + from .const import SOUND_SOURCE_BELL + await self._coordinator.async_set_sound_volume(SOUND_SOURCE_BELL, int(value)) + self.async_write_ha_state() + + +class LionelTrainSpeechVolume(NumberEntity): + """Representation of speech volume control.""" + + _attr_has_entity_name = True + _attr_name = "Speech Volume" + _attr_icon = "mdi:account-voice" + _attr_mode = NumberMode.SLIDER + _attr_native_min_value = 0 + _attr_native_max_value = 7 + _attr_native_step = 1 + + def __init__(self, coordinator: LionelTrainCoordinator, name: str) -> None: + """Initialize the number entity.""" + self._coordinator = coordinator + self._attr_unique_id = f"{coordinator.mac_address}_speech_volume" + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": name, + **coordinator.device_info, + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + @property + def native_value(self) -> float | None: + """Return the current speech volume.""" + return self._coordinator.speech_volume + + async def async_set_native_value(self, value: float) -> None: + """Set the speech volume.""" + from .const import SOUND_SOURCE_SPEECH + await self._coordinator.async_set_sound_volume(SOUND_SOURCE_SPEECH, int(value)) + self.async_write_ha_state() + + +class LionelTrainEngineVolume(NumberEntity): + """Representation of engine volume control.""" + + _attr_has_entity_name = True + _attr_name = "Engine Volume" + _attr_icon = "mdi:train" + _attr_mode = NumberMode.SLIDER + _attr_native_min_value = 0 + _attr_native_max_value = 7 + _attr_native_step = 1 + + def __init__(self, coordinator: LionelTrainCoordinator, name: str) -> None: + """Initialize the number entity.""" + self._coordinator = coordinator + self._attr_unique_id = f"{coordinator.mac_address}_engine_volume" + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": name, + **coordinator.device_info, + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + @property + def native_value(self) -> float | None: + """Return the current engine volume.""" + return self._coordinator.engine_volume + + async def async_set_native_value(self, value: float) -> None: + """Set the engine volume.""" + from .const import SOUND_SOURCE_ENGINE + await self._coordinator.async_set_sound_volume(SOUND_SOURCE_ENGINE, int(value)) + self.async_write_ha_state() \ No newline at end of file diff --git a/custom_components/lionel_controller/services.yaml b/custom_components/lionel_controller/services.yaml new file mode 100644 index 0000000..7fbe291 --- /dev/null +++ b/custom_components/lionel_controller/services.yaml @@ -0,0 +1,10 @@ +reload_integration: + name: Reload Integration + description: Reload the Lionel Train Controller integration for better reconnection. + fields: + entry_id: + name: Entry ID + description: The config entry ID to reload (optional - uses current integration if not provided). + required: false + selector: + text: \ No newline at end of file diff --git a/custom_components/lionel_controller/strings.json b/custom_components/lionel_controller/strings.json new file mode 100644 index 0000000..6bd5db8 --- /dev/null +++ b/custom_components/lionel_controller/strings.json @@ -0,0 +1,28 @@ +{ + "config": { + "step": { + "user": { + "title": "Lionel Train Controller", + "description": "Set up your Lionel LionChief locomotive", + "data": { + "mac_address": "Bluetooth MAC address", + "name": "Name", + "service_uuid": "Service UUID" + } + }, + "bluetooth_confirm": { + "title": "Confirm Lionel Train Discovery", + "description": "Discovered Lionel train: **{name}** at address `{address}`. Do you want to add it to Home Assistant?" + } + }, + "error": { + "cannot_connect": "Failed to connect to the train. Make sure it's powered on and in range.", + "invalid_mac": "Invalid MAC address format", + "unknown": "Unexpected error occurred" + }, + "abort": { + "already_configured": "Device is already configured", + "not_lionel_device": "This device is not a Lionel LionChief locomotive" + } + } +} \ No newline at end of file diff --git a/custom_components/lionel_controller/switch.py b/custom_components/lionel_controller/switch.py new file mode 100644 index 0000000..2d58128 --- /dev/null +++ b/custom_components/lionel_controller/switch.py @@ -0,0 +1,219 @@ +"""Switch platform for Lionel Train Controller integration.""" +from __future__ import annotations + +import logging +from typing import Any + +from homeassistant.components.switch import SwitchEntity +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_NAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from . import LionelTrainCoordinator +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up the Lionel Train switch platform.""" + coordinator: LionelTrainCoordinator = hass.data[DOMAIN][config_entry.entry_id] + name = config_entry.data[CONF_NAME] + + switches = [ + LionelTrainLightsSwitch(coordinator, name), + LionelTrainHornSwitch(coordinator, name), + LionelTrainBellSwitch(coordinator, name), + LionelTrainSmokeSwitch(coordinator, name), + LionelTrainCabLightsSwitch(coordinator, name), + LionelTrainNumberBoardsSwitch(coordinator, name), + ] + + async_add_entities(switches, True) + + +class LionelTrainSwitchBase(SwitchEntity): + """Base class for Lionel Train switches.""" + + _attr_has_entity_name = True + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the switch.""" + self._coordinator = coordinator + self._attr_device_info = { + "identifiers": {(DOMAIN, coordinator.mac_address)}, + "name": device_name, + **coordinator.device_info, + } + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._coordinator.connected + + +class LionelTrainLightsSwitch(LionelTrainSwitchBase): + """Switch for controlling train lights.""" + + _attr_name = "Lights" + _attr_icon = "mdi:lightbulb" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the lights switch.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_lights" + + @property + def is_on(self) -> bool: + """Return True if the lights are on.""" + return self._coordinator.lights_on + + async def async_turn_on(self, **kwargs: Any) -> None: + """Turn on the lights.""" + await self._coordinator.async_set_lights(True) + self.async_write_ha_state() + + async def async_turn_off(self, **kwargs: Any) -> None: + """Turn off the lights.""" + await self._coordinator.async_set_lights(False) + self.async_write_ha_state() + + +class LionelTrainHornSwitch(LionelTrainSwitchBase): + """Switch for controlling train horn.""" + + _attr_name = "Horn" + _attr_icon = "mdi:bullhorn" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the horn switch.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_horn" + + @property + def is_on(self) -> bool: + """Return True if the horn is on.""" + return self._coordinator.horn_on + + async def async_turn_on(self, **kwargs: Any) -> None: + """Turn on the horn.""" + await self._coordinator.async_set_horn(True) + self.async_write_ha_state() + + async def async_turn_off(self, **kwargs: Any) -> None: + """Turn off the horn.""" + await self._coordinator.async_set_horn(False) + self.async_write_ha_state() + + +class LionelTrainBellSwitch(LionelTrainSwitchBase): + """Switch for controlling train bell.""" + + _attr_name = "Bell" + _attr_icon = "mdi:bell" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the bell switch.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_bell" + + @property + def is_on(self) -> bool: + """Return True if the bell is on.""" + return self._coordinator.bell_on + + async def async_turn_on(self, **kwargs: Any) -> None: + """Turn on the bell.""" + await self._coordinator.async_set_bell(True) + self.async_write_ha_state() + + async def async_turn_off(self, **kwargs: Any) -> None: + """Turn off the bell.""" + await self._coordinator.async_set_bell(False) + self.async_write_ha_state() + + +class LionelTrainSmokeSwitch(LionelTrainSwitchBase): + """Switch for controlling smoke unit.""" + + _attr_name = "Smoke Unit" + _attr_icon = "mdi:smoke" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the smoke switch.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_smoke" + + @property + def is_on(self) -> bool: + """Return True if the smoke unit is on.""" + return self._coordinator.smoke_on + + async def async_turn_on(self, **kwargs: Any) -> None: + """Turn on the smoke unit.""" + await self._coordinator.async_set_smoke(True) + self.async_write_ha_state() + + async def async_turn_off(self, **kwargs: Any) -> None: + """Turn off the smoke unit.""" + await self._coordinator.async_set_smoke(False) + self.async_write_ha_state() + + +class LionelTrainCabLightsSwitch(LionelTrainSwitchBase): + """Switch for controlling cab lights.""" + + _attr_name = "Cab Lights" + _attr_icon = "mdi:lightbulb-outline" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the cab lights switch.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_cab_lights" + + @property + def is_on(self) -> bool: + """Return True if the cab lights are on.""" + return self._coordinator.cab_lights_on + + async def async_turn_on(self, **kwargs: Any) -> None: + """Turn on the cab lights.""" + await self._coordinator.async_set_cab_lights(True) + self.async_write_ha_state() + + async def async_turn_off(self, **kwargs: Any) -> None: + """Turn off the cab lights.""" + await self._coordinator.async_set_cab_lights(False) + self.async_write_ha_state() + + +class LionelTrainNumberBoardsSwitch(LionelTrainSwitchBase): + """Switch for controlling number board lights.""" + + _attr_name = "Number Boards" + _attr_icon = "mdi:numeric" + + def __init__(self, coordinator: LionelTrainCoordinator, device_name: str) -> None: + """Initialize the number boards switch.""" + super().__init__(coordinator, device_name) + self._attr_unique_id = f"{coordinator.mac_address}_number_boards" + + @property + def is_on(self) -> bool: + """Return True if the number boards are on.""" + return self._coordinator.number_boards_on + + async def async_turn_on(self, **kwargs: Any) -> None: + """Turn on the number boards.""" + await self._coordinator.async_set_number_boards(True) + self.async_write_ha_state() + + async def async_turn_off(self, **kwargs: Any) -> None: + """Turn off the number boards.""" + await self._coordinator.async_set_number_boards(False) + self.async_write_ha_state() \ No newline at end of file diff --git a/custom_components/lionel_controller/translations/en.json b/custom_components/lionel_controller/translations/en.json new file mode 100644 index 0000000..6bd5db8 --- /dev/null +++ b/custom_components/lionel_controller/translations/en.json @@ -0,0 +1,28 @@ +{ + "config": { + "step": { + "user": { + "title": "Lionel Train Controller", + "description": "Set up your Lionel LionChief locomotive", + "data": { + "mac_address": "Bluetooth MAC address", + "name": "Name", + "service_uuid": "Service UUID" + } + }, + "bluetooth_confirm": { + "title": "Confirm Lionel Train Discovery", + "description": "Discovered Lionel train: **{name}** at address `{address}`. Do you want to add it to Home Assistant?" + } + }, + "error": { + "cannot_connect": "Failed to connect to the train. Make sure it's powered on and in range.", + "invalid_mac": "Invalid MAC address format", + "unknown": "Unexpected error occurred" + }, + "abort": { + "already_configured": "Device is already configured", + "not_lionel_device": "This device is not a Lionel LionChief locomotive" + } + } +} \ No newline at end of file diff --git a/debug_log.txt b/debug_log.txt new file mode 100644 index 0000000..3ef0672 --- /dev/null +++ b/debug_log.txt @@ -0,0 +1,1194 @@ +2025-09-30 09:58:14.815 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration hacs which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.815 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration zha_toolkit which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.816 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration spook which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.817 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration flightradar24 which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.817 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration spook_inverse which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.818 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration llmvision which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.818 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration spotcast which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.819 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration lunar_phase which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.819 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration openplantbook which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.820 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration discogs_sync which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.820 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration plant which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.821 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration webrtc which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.821 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration teamtracker which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.822 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration frigate which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.823 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration pirateweather which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.823 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration zha_device_info which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.824 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration wican which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.824 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration spotifyplus which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.825 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration bermuda which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:14.825 WARNING (SyncWorker_0) [homeassistant.loader] We found a custom integration lionel_controller which has not been tested by Home Assistant. This component might cause stability problems, be sure to disable it if you experience issues with Home Assistant +2025-09-30 09:58:15.904 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.09 seconds +2025-09-30 09:58:15.904 INFO (MainThread) [homeassistant.setup] Setup of domain logger took 0.09 seconds +2025-09-30 09:58:15.905 INFO (MainThread) [homeassistant.setup] Setting up websocket_api +2025-09-30 09:58:15.905 INFO (MainThread) [homeassistant.setup] Setup of domain websocket_api took 0.00 seconds +2025-09-30 09:58:15.905 INFO (MainThread) [homeassistant.setup] Setup of domain system_log took 0.09 seconds +2025-09-30 09:58:15.908 INFO (MainThread) [homeassistant.setup] Setting up network +2025-09-30 09:58:15.910 INFO (MainThread) [homeassistant.setup] Setup of domain network took 0.00 seconds +2025-09-30 09:58:15.911 INFO (MainThread) [homeassistant.bootstrap] Setting up stage frontend: {'frontend'}; already set up: {} +Dependencies: {'onboarding', 'lovelace', 'search', 'diagnostics', 'file_upload', 'auth', 'config', 'device_automation', 'repairs', 'api'}; already set up: {'system_log', 'websocket_api', 'http'} +2025-09-30 09:58:15.911 INFO (MainThread) [homeassistant.setup] Setting up auth +2025-09-30 09:58:15.912 INFO (MainThread) [homeassistant.setup] Setup of domain auth took 0.00 seconds +2025-09-30 09:58:15.912 INFO (MainThread) [homeassistant.setup] Setting up onboarding +2025-09-30 09:58:15.912 INFO (MainThread) [homeassistant.setup] Setup of domain onboarding took 0.00 seconds +2025-09-30 09:58:15.912 INFO (MainThread) [homeassistant.setup] Setting up lovelace +2025-09-30 09:58:15.913 INFO (MainThread) [homeassistant.setup] Setting up search +2025-09-30 09:58:15.913 INFO (MainThread) [homeassistant.setup] Setup of domain search took 0.00 seconds +2025-09-30 09:58:15.914 INFO (MainThread) [homeassistant.setup] Setting up diagnostics +2025-09-30 09:58:15.915 INFO (MainThread) [homeassistant.setup] Setup of domain diagnostics took 0.00 seconds +2025-09-30 09:58:15.915 INFO (MainThread) [homeassistant.setup] Setting up file_upload +2025-09-30 09:58:15.915 INFO (MainThread) [homeassistant.setup] Setup of domain file_upload took 0.00 seconds +2025-09-30 09:58:15.915 INFO (MainThread) [homeassistant.setup] Setting up api +2025-09-30 09:58:15.917 INFO (MainThread) [homeassistant.setup] Setup of domain api took 0.00 seconds +2025-09-30 09:58:15.917 INFO (MainThread) [homeassistant.setup] Setting up config +2025-09-30 09:58:15.919 INFO (MainThread) [homeassistant.setup] Setup of domain config took 0.00 seconds +2025-09-30 09:58:15.919 INFO (MainThread) [homeassistant.setup] Setting up device_automation +2025-09-30 09:58:15.919 INFO (MainThread) [homeassistant.setup] Setup of domain device_automation took 0.00 seconds +2025-09-30 09:58:15.919 INFO (MainThread) [homeassistant.setup] Setting up repairs +2025-09-30 09:58:15.919 INFO (MainThread) [homeassistant.setup] Setup of domain repairs took 0.00 seconds +2025-09-30 09:58:15.921 INFO (MainThread) [homeassistant.setup] Setup of domain lovelace took 0.01 seconds +2025-09-30 09:58:15.927 INFO (MainThread) [homeassistant.setup] Setting up frontend +2025-09-30 09:58:15.933 INFO (MainThread) [homeassistant.setup] Setup of domain frontend took 0.01 seconds +2025-09-30 09:58:15.933 INFO (MainThread) [homeassistant.bootstrap] Setting up stage recorder: {'recorder'}; already set up: {} +Dependencies: {}; already set up: {} +2025-09-30 09:58:15.936 INFO (MainThread) [homeassistant.components.http] Now listening on port 8123 +2025-09-30 09:58:15.936 INFO (MainThread) [homeassistant.setup] Setup of domain http took 0.00 seconds +2025-09-30 09:58:15.941 INFO (MainThread) [homeassistant.setup] Setting up recorder +2025-09-30 09:58:15.982 INFO (MainThread) [homeassistant.setup] Setup of domain recorder took 0.04 seconds +2025-09-30 09:58:15.982 INFO (MainThread) [homeassistant.bootstrap] Nothing to set up in stage debugger: {'debugpy'} +2025-09-30 09:58:15.982 INFO (MainThread) [homeassistant.bootstrap] Setting up stage zeroconf: {'zeroconf'}; already set up: {} +Dependencies: {}; already set up: {'network', 'http', 'websocket_api', 'api'} +2025-09-30 09:58:15.982 INFO (MainThread) [homeassistant.setup] Setting up zeroconf +2025-09-30 09:58:15.987 INFO (MainThread) [homeassistant.components.zeroconf] Starting Zeroconf broadcast +2025-09-30 09:58:15.987 INFO (MainThread) [homeassistant.setup] Setup of domain zeroconf took 0.00 seconds +2025-09-30 09:58:15.987 INFO (MainThread) [homeassistant.bootstrap] Setting up stage 1: {'dhcp', 'cloud', 'hassio', 'ssdp', 'usb', 'bluetooth'}; already set up: {} +Dependencies: {'intent', 'conversation', 'webhook', 'wake_word', 'stt', 'tts', 'ffmpeg', 'assist_pipeline', 'backup'}; already set up: {'http', 'websocket_api', 'network', 'auth', 'repairs'} +2025-09-30 09:58:15.987 INFO (MainThread) [homeassistant.setup] Setting up webhook +2025-09-30 09:58:15.988 INFO (MainThread) [homeassistant.setup] Setup of domain webhook took 0.00 seconds +2025-09-30 09:58:15.988 INFO (MainThread) [homeassistant.setup] Setting up hassio +2025-09-30 09:58:16.017 INFO (MainThread) [homeassistant.setup] Setting up intent +2025-09-30 09:58:16.017 INFO (MainThread) [homeassistant.setup] Setup of domain intent took 0.00 seconds +2025-09-30 09:58:16.023 INFO (MainThread) [homeassistant.setup] Setting up wake_word +2025-09-30 09:58:16.023 INFO (MainThread) [homeassistant.setup] Setup of domain wake_word took 0.00 seconds +2025-09-30 09:58:16.030 INFO (MainThread) [homeassistant.setup] Setting up stt +2025-09-30 09:58:16.030 INFO (MainThread) [homeassistant.setup] Setup of domain stt took 0.00 seconds +2025-09-30 09:58:16.040 INFO (MainThread) [homeassistant.setup] Setting up ffmpeg +2025-09-30 09:58:16.040 INFO (MainThread) [homeassistant.setup] Setup of domain ffmpeg took 0.00 seconds +2025-09-30 09:58:16.100 INFO (MainThread) [homeassistant.setup] Setup of domain hassio took 0.11 seconds +2025-09-30 09:58:16.124 INFO (MainThread) [homeassistant.setup] Setting up binary_sensor +2025-09-30 09:58:16.124 INFO (MainThread) [homeassistant.setup] Setup of domain binary_sensor took 0.00 seconds +2025-09-30 09:58:16.124 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up hassio.binary_sensor +2025-09-30 09:58:16.126 INFO (MainThread) [homeassistant.setup] Setting up update +2025-09-30 09:58:16.127 INFO (MainThread) [homeassistant.setup] Setup of domain update took 0.00 seconds +2025-09-30 09:58:16.127 INFO (MainThread) [homeassistant.components.update] Setting up hassio.update +2025-09-30 09:58:16.711 INFO (MainThread) [homeassistant.setup] Setting up dhcp +2025-09-30 09:58:16.712 INFO (MainThread) [homeassistant.setup] Setup of domain dhcp took 0.00 seconds +2025-09-30 09:58:16.735 INFO (MainThread) [homeassistant.setup] Setting up ssdp +2025-09-30 09:58:16.737 INFO (MainThread) [homeassistant.setup] Setup of domain ssdp took 0.00 seconds +2025-09-30 09:58:16.747 INFO (MainThread) [homeassistant.setup] Setting up usb +2025-09-30 09:58:16.748 INFO (MainThread) [homeassistant.setup] Setup of domain usb took 0.00 seconds +2025-09-30 09:58:16.811 INFO (MainThread) [homeassistant.setup] Setting up conversation +2025-09-30 09:58:16.812 INFO (MainThread) [homeassistant.setup] Setup of domain conversation took 0.00 seconds +2025-09-30 09:58:16.832 INFO (MainThread) [homeassistant.setup] Setting up sensor +2025-09-30 09:58:16.832 INFO (MainThread) [homeassistant.setup] Setup of domain sensor took 0.00 seconds +2025-09-30 09:58:16.833 INFO (MainThread) [homeassistant.components.sensor] Setting up hassio.sensor +2025-09-30 09:58:16.837 INFO (MainThread) [homeassistant.setup] Setting up backup +2025-09-30 09:58:16.838 INFO (MainThread) [homeassistant.setup] Setup of domain backup took 0.00 seconds +2025-09-30 09:58:16.850 INFO (MainThread) [homeassistant.setup] Setting up bluetooth +2025-09-30 09:58:16.878 INFO (MainThread) [homeassistant.setup] Setup of domain bluetooth took 0.03 seconds +2025-09-30 09:58:16.885 INFO (MainThread) [homeassistant.setup] Setting up tts +2025-09-30 09:58:16.887 INFO (MainThread) [homeassistant.components.sensor] Setting up time_date.sensor +2025-09-30 09:58:16.890 INFO (MainThread) [homeassistant.setup] Setup of domain tts took 0.00 seconds +2025-09-30 09:58:16.912 INFO (MainThread) [homeassistant.setup] Setting up assist_pipeline +2025-09-30 09:58:16.913 INFO (MainThread) [homeassistant.setup] Setup of domain assist_pipeline took 0.00 seconds +2025-09-30 09:58:16.917 INFO (MainThread) [homeassistant.setup] Setting up event +2025-09-30 09:58:16.917 INFO (MainThread) [homeassistant.setup] Setup of domain event took 0.00 seconds +2025-09-30 09:58:16.917 INFO (MainThread) [homeassistant.components.event] Setting up backup.event +2025-09-30 09:58:16.918 INFO (MainThread) [homeassistant.components.sensor] Setting up backup.sensor +2025-09-30 09:58:17.069 INFO (MainThread) [homeassistant.setup] Setting up cloud +2025-09-30 09:58:17.072 INFO (MainThread) [homeassistant.setup] Setup of domain cloud took 0.00 seconds +2025-09-30 09:58:17.087 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up cloud.binary_sensor +2025-09-30 09:58:17.088 INFO (MainThread) [homeassistant.components.stt] Setting up cloud.stt +2025-09-30 09:58:17.088 INFO (MainThread) [homeassistant.components.tts] Setting up cloud.tts +2025-09-30 09:58:17.108 INFO (MainThread) [homeassistant.bootstrap] Setting up stage 2: {'systemmonitor', 'cast', 'shell_command', 'teamtracker', 'radio_browser', 'sun', 'system_health', 'bermuda', 'llmvision', 'local_calendar', 'statistics', 'esphome', 'command_line', 'fully_kiosk', 'lunar_phase', 'input_datetime', 'androidtv_remote', 'schlage', 'schedule', 'private_ble_device', 'shelly', 'ibeacon', 'nut', 'google_mail', 'switchbot', 'spotify', 'mobile_app', 'person', 'script', 'fan', 'zha', 'python_script', 'frigate', 'lionel_controller', 'google_generative_ai_conversation', 'counter', 'roomba', 'discogs_sync', 'tag', 'ecobee', 'moon', 'zha_device_info', 'light', 'google_assistant_sdk', 'harmony', 'airnow', 'homekit_controller', 'plant', 'group', 'utility_meter', 'thread', 'scene', 'input_number', 'input_text', 'integration', 'ambient_network', 'input_boolean', 'input_button', 'openplantbook', 'default_config', 'rest', 'go2rtc', 'hardware', 'input_select', 'filter', 'zone', 'hacs', 'derivative', 'flightradar24', 'pirateweather', 'tplink', 'spotcast', 'switch_as_x', 'proximity', 'vlc_telnet', 'threshold', 'zha_toolkit', 'mqtt', 'history_stats', 'application_credentials', 'template', 'uptime', 'panel_custom', 'automation', 'notify', 'onkyo', 'analytics', 'timer', 'spook', 'downloader'}; already set up: {'cloud', 'hassio', 'recorder', 'bluetooth', 'conversation', 'http', 'websocket_api', 'logger', 'frontend', 'tts', 'network', 'homeassistant', 'backup', 'sensor'} +Dependencies: {'logbook', 'my', 'homeassistant_alerts', 'remote', 'blueprint', 'number', 'media_source', 'camera', 'history', 'energy', 'device_tracker', 'select', 'homeassistant_hardware', 'stream', 'bluetooth_adapters', 'image_upload', 'trace'}; already set up: {'system_log', 'intent', 'conversation', 'diagnostics', 'websocket_api', 'backup', 'repairs', 'zeroconf', 'onboarding', 'recorder', 'wake_word', 'usb', 'stt', 'ffmpeg', 'webhook', 'bluetooth', 'dhcp', 'file_upload', 'assist_pipeline', 'auth', 'config', 'search', 'lovelace', 'cloud', 'persistent_notification', 'hassio', 'ssdp', 'http', 'frontend', 'tts', 'network', 'homeassistant', 'device_automation', 'api'} +2025-09-30 09:58:17.108 INFO (MainThread) [homeassistant.setup] Setting up remote +2025-09-30 09:58:17.109 INFO (MainThread) [homeassistant.setup] Setup of domain remote took 0.00 seconds +2025-09-30 09:58:17.110 INFO (MainThread) [homeassistant.setup] Setting up number +2025-09-30 09:58:17.110 INFO (MainThread) [homeassistant.setup] Setup of domain number took 0.00 seconds +2025-09-30 09:58:17.110 INFO (MainThread) [homeassistant.setup] Setting up scene +2025-09-30 09:58:17.111 INFO (MainThread) [homeassistant.components.scene] Setting up homeassistant.scene +2025-09-30 09:58:17.111 INFO (MainThread) [homeassistant.setup] Setup of domain scene took 0.00 seconds +2025-09-30 09:58:17.112 INFO (MainThread) [homeassistant.setup] Setting up camera +2025-09-30 09:58:17.113 INFO (MainThread) [homeassistant.setup] Setup of domain camera took 0.00 seconds +2025-09-30 09:58:17.114 INFO (MainThread) [homeassistant.setup] Setting up select +2025-09-30 09:58:17.115 INFO (MainThread) [homeassistant.setup] Setup of domain select took 0.00 seconds +2025-09-30 09:58:17.115 INFO (MainThread) [homeassistant.setup] Setting up notify +2025-09-30 09:58:17.115 INFO (MainThread) [homeassistant.setup] Setting up group +2025-09-30 09:58:17.116 INFO (MainThread) [homeassistant.setup] Setup of domain group took 0.00 seconds +2025-09-30 09:58:17.117 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up group.binary_sensor +2025-09-30 09:58:17.117 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up group.binary_sensor +2025-09-30 09:58:17.118 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up group.binary_sensor +2025-09-30 09:58:17.118 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up group.binary_sensor +2025-09-30 09:58:17.119 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up group.binary_sensor +2025-09-30 09:58:17.119 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up group.binary_sensor +2025-09-30 09:58:17.121 INFO (MainThread) [homeassistant.setup] Setup of domain notify took 0.01 seconds +2025-09-30 09:58:17.121 INFO (MainThread) [homeassistant.setup] Setting up zone +2025-09-30 09:58:17.121 INFO (MainThread) [homeassistant.setup] Setting up media_source +2025-09-30 09:58:17.122 INFO (MainThread) [homeassistant.setup] Setup of domain media_source took 0.00 seconds +2025-09-30 09:58:17.123 INFO (MainThread) [homeassistant.setup] Setting up history +2025-09-30 09:58:17.123 INFO (MainThread) [homeassistant.setup] Setup of domain history took 0.00 seconds +2025-09-30 09:58:17.123 INFO (MainThread) [homeassistant.setup] Setting up system_health +2025-09-30 09:58:17.124 INFO (MainThread) [homeassistant.setup] Setup of domain system_health took 0.00 seconds +2025-09-30 09:58:17.124 INFO (MainThread) [homeassistant.setup] Setting up image_upload +2025-09-30 09:58:17.124 INFO (MainThread) [homeassistant.setup] Setting up input_number +2025-09-30 09:58:17.125 INFO (MainThread) [homeassistant.setup] Setting up input_boolean +2025-09-30 09:58:17.126 INFO (MainThread) [homeassistant.setup] Setting up input_button +2025-09-30 09:58:17.126 INFO (MainThread) [homeassistant.setup] Setting up logbook +2025-09-30 09:58:17.128 INFO (MainThread) [homeassistant.setup] Setup of domain logbook took 0.00 seconds +2025-09-30 09:58:17.128 INFO (MainThread) [homeassistant.setup] Setting up stream +2025-09-30 09:58:17.129 INFO (MainThread) [homeassistant.setup] Setting up blueprint +2025-09-30 09:58:17.129 INFO (MainThread) [homeassistant.setup] Setup of domain blueprint took 0.00 seconds +2025-09-30 09:58:17.129 INFO (MainThread) [homeassistant.setup] Setting up input_select +2025-09-30 09:58:17.130 INFO (MainThread) [homeassistant.setup] Setting up trace +2025-09-30 09:58:17.130 INFO (MainThread) [homeassistant.setup] Setup of domain trace took 0.00 seconds +2025-09-30 09:58:17.135 INFO (MainThread) [homeassistant.setup] Setting up panel_custom +2025-09-30 09:58:17.135 INFO (MainThread) [homeassistant.setup] Setup of domain panel_custom took 0.00 seconds +2025-09-30 09:58:17.144 INFO (SyncWorker_0) [homeassistant.util.package] Attempting install of pycountry==24.6.1 +2025-09-30 09:58:17.148 INFO (MainThread) [homeassistant.setup] Setting up timer +2025-09-30 09:58:17.165 INFO (MainThread) [homeassistant.setup] Setup of domain zone took 0.04 seconds +2025-09-30 09:58:17.166 INFO (MainThread) [homeassistant.setup] Setup of domain image_upload took 0.04 seconds +2025-09-30 09:58:17.172 INFO (MainThread) [homeassistant.setup] Setup of domain input_number took 0.05 seconds +2025-09-30 09:58:17.173 INFO (MainThread) [homeassistant.setup] Setup of domain input_boolean took 0.05 seconds +2025-09-30 09:58:17.173 INFO (MainThread) [homeassistant.setup] Setup of domain input_button took 0.05 seconds +2025-09-30 09:58:17.174 INFO (MainThread) [homeassistant.setup] Setup of domain input_select took 0.04 seconds +2025-09-30 09:58:17.197 INFO (MainThread) [homeassistant.setup] Setup of domain timer took 0.05 seconds +2025-09-30 09:58:17.200 INFO (MainThread) [homeassistant.setup] Setting up device_tracker +2025-09-30 09:58:17.200 INFO (MainThread) [homeassistant.setup] Setup of domain device_tracker took 0.00 seconds +2025-09-30 09:58:17.200 INFO (MainThread) [homeassistant.setup] Setting up person +2025-09-30 09:58:17.275 INFO (MainThread) [homeassistant.setup] Setup of domain person took 0.07 seconds +2025-09-30 09:58:17.306 INFO (MainThread) [homeassistant.setup] Setting up fan +2025-09-30 09:58:17.308 INFO (MainThread) [homeassistant.setup] Setup of domain fan took 0.00 seconds +2025-09-30 09:58:17.317 INFO (MainThread) [homeassistant.setup] Setting up light +2025-09-30 09:58:17.321 INFO (MainThread) [homeassistant.setup] Setup of domain light took 0.00 seconds +2025-09-30 09:58:17.322 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.323 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.324 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.324 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.324 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.325 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.325 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.326 INFO (MainThread) [homeassistant.components.light] Setting up group.light +2025-09-30 09:58:17.340 INFO (MainThread) [homeassistant.setup] Setting up switch_as_x +2025-09-30 09:58:17.340 INFO (MainThread) [homeassistant.setup] Setup of domain switch_as_x took 0.00 seconds +2025-09-30 09:58:17.343 INFO (MainThread) [homeassistant.setup] Setup of domain stream took 0.21 seconds +2025-09-30 09:58:17.354 INFO (MainThread) [homeassistant.setup] Setting up harmony +2025-09-30 09:58:17.354 INFO (MainThread) [homeassistant.setup] Setup of domain harmony took 0.00 seconds +2025-09-30 09:58:17.361 INFO (MainThread) [homeassistant.setup] Setting up airnow +2025-09-30 09:58:17.361 INFO (MainThread) [homeassistant.setup] Setup of domain airnow took 0.00 seconds +2025-09-30 09:58:17.405 INFO (MainThread) [homeassistant.setup] Setting up systemmonitor +2025-09-30 09:58:17.406 INFO (MainThread) [homeassistant.setup] Setup of domain systemmonitor took 0.00 seconds +2025-09-30 09:58:17.458 INFO (MainThread) [homeassistant.setup] Setting up cast +2025-09-30 09:58:17.458 INFO (MainThread) [homeassistant.setup] Setup of domain cast took 0.00 seconds +2025-09-30 09:58:17.458 INFO (MainThread) [homeassistant.setup] Setting up shell_command +2025-09-30 09:58:17.458 INFO (MainThread) [homeassistant.setup] Setup of domain shell_command took 0.00 seconds +2025-09-30 09:58:17.486 INFO (MainThread) [homeassistant.setup] Setting up teamtracker +2025-09-30 09:58:17.486 INFO (MainThread) [homeassistant.setup] Setup of domain teamtracker took 0.00 seconds +2025-09-30 09:58:17.486 INFO (MainThread) [custom_components.teamtracker] team_tracker_eagles: Setting up sensor from UI configuration using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:17.488 INFO (MainThread) [custom_components.teamtracker] team_tracker_phillies: Setting up sensor from UI configuration using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:17.492 INFO (MainThread) [custom_components.teamtracker] team_tracker_sixers: Setting up sensor from UI configuration using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:17.495 INFO (MainThread) [custom_components.teamtracker] team_tracker_flyers: Setting up sensor from UI configuration using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:17.499 INFO (MainThread) [homeassistant.setup] Setting up tag +2025-09-30 09:58:17.500 INFO (MainThread) [homeassistant.setup] Setup of domain tag took 0.00 seconds +2025-09-30 09:58:17.523 INFO (MainThread) [homeassistant.setup] Setting up shelly +2025-09-30 09:58:17.523 INFO (MainThread) [homeassistant.setup] Setup of domain shelly took 0.00 seconds +2025-09-30 09:58:17.540 INFO (MainThread) [homeassistant.setup] Setting up thread +2025-09-30 09:58:17.540 INFO (MainThread) [homeassistant.setup] Setup of domain thread took 0.00 seconds +2025-09-30 09:58:17.559 INFO (MainThread) [homeassistant.setup] Setting up openplantbook +2025-09-30 09:58:17.559 INFO (MainThread) [homeassistant.setup] Setup of domain openplantbook took 0.00 seconds +2025-09-30 09:58:17.559 INFO (MainThread) [custom_components.openplantbook.uploader] Plant-sensors data upload schedule is active +2025-09-30 09:58:17.561 INFO (MainThread) [homeassistant.setup] Setting up counter +2025-09-30 09:58:17.563 INFO (MainThread) [homeassistant.setup] Setup of domain counter took 0.00 seconds +2025-09-30 09:58:17.569 INFO (MainThread) [homeassistant.setup] Setting up utility_meter +2025-09-30 09:58:17.569 INFO (MainThread) [homeassistant.setup] Setup of domain utility_meter took 0.00 seconds +2025-09-30 09:58:17.573 INFO (MainThread) [homeassistant.setup] Setting up sun +2025-09-30 09:58:17.573 INFO (MainThread) [homeassistant.setup] Setup of domain sun took 0.00 seconds +2025-09-30 09:58:17.574 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up sun.binary_sensor +2025-09-30 09:58:17.575 INFO (MainThread) [homeassistant.components.sensor] Setting up sun.sensor +2025-09-30 09:58:17.587 INFO (MainThread) [aioshelly.rpc_device.wsrpc] Connected to 192.168.16.133 +2025-09-30 09:58:17.590 INFO (MainThread) [aioshelly.rpc_device.wsrpc] Connected to 192.168.16.152 +2025-09-30 09:58:17.598 INFO (MainThread) [aioshelly.rpc_device.wsrpc] Connected to 192.168.16.183 +2025-09-30 09:58:17.638 INFO (MainThread) [homeassistant.setup] Setting up llmvision +2025-09-30 09:58:17.640 INFO (MainThread) [homeassistant.setup] Setup of domain llmvision took 0.00 seconds +2025-09-30 09:58:18.412 INFO (MainThread) [homeassistant.setup] Setting up local_calendar +2025-09-30 09:58:18.412 INFO (MainThread) [homeassistant.setup] Setup of domain local_calendar took 0.00 seconds +2025-09-30 09:58:18.416 INFO (MainThread) [homeassistant.setup] Setting up statistics +2025-09-30 09:58:18.416 INFO (MainThread) [homeassistant.setup] Setup of domain statistics took 0.00 seconds +2025-09-30 09:58:18.416 INFO (MainThread) [homeassistant.components.sensor] Setting up statistics.sensor +2025-09-30 09:58:18.427 INFO (MainThread) [homeassistant.setup] Setting up input_text +2025-09-30 09:58:18.438 INFO (MainThread) [homeassistant.setup] Setup of domain input_text took 0.01 seconds +2025-09-30 09:58:18.444 INFO (MainThread) [homeassistant.setup] Setting up energy +2025-09-30 09:58:18.444 INFO (MainThread) [homeassistant.setup] Setup of domain energy took 0.00 seconds +2025-09-30 09:58:18.559 INFO (MainThread) [homeassistant.setup] Setting up ambient_network +2025-09-30 09:58:18.560 INFO (MainThread) [homeassistant.setup] Setup of domain ambient_network took 0.00 seconds +2025-09-30 09:58:18.568 INFO (MainThread) [homeassistant.setup] Setting up command_line +2025-09-30 09:58:18.569 INFO (MainThread) [homeassistant.setup] Setup of domain command_line took 0.00 seconds +2025-09-30 09:58:18.572 INFO (MainThread) [homeassistant.setup] Setting up my +2025-09-30 09:58:18.572 INFO (MainThread) [homeassistant.setup] Setup of domain my took 0.00 seconds +2025-09-30 09:58:18.609 INFO (MainThread) [homeassistant.setup] Setting up go2rtc +2025-09-30 09:58:18.612 INFO (MainThread) [homeassistant.setup] Setting up homeassistant_alerts +2025-09-30 09:58:18.613 INFO (MainThread) [homeassistant.setup] Setup of domain homeassistant_alerts took 0.00 seconds +2025-09-30 09:58:18.642 INFO (MainThread) [homeassistant.setup] Setting up mqtt +2025-09-30 09:58:18.642 INFO (MainThread) [homeassistant.setup] Setup of domain mqtt took 0.00 seconds +2025-09-30 09:58:18.732 INFO (MainThread) [homeassistant.setup] Setting up rest +2025-09-30 09:58:18.777 INFO (MainThread) [homeassistant.setup] Setup of domain go2rtc took 0.17 seconds +2025-09-30 09:58:18.785 INFO (MainThread) [homeassistant.setup] Setting up lunar_phase +2025-09-30 09:58:18.785 INFO (MainThread) [homeassistant.setup] Setup of domain lunar_phase took 0.00 seconds +2025-09-30 09:58:18.798 INFO (MainThread) [homeassistant.setup] Setting up hardware +2025-09-30 09:58:18.811 INFO (MainThread) [homeassistant.setup] Setting up input_datetime +2025-09-30 09:58:18.821 INFO (MainThread) [homeassistant.setup] Setup of domain hardware took 0.02 seconds +2025-09-30 09:58:18.829 INFO (MainThread) [homeassistant.setup] Setting up androidtv_remote +2025-09-30 09:58:18.829 INFO (MainThread) [homeassistant.setup] Setup of domain androidtv_remote took 0.00 seconds +2025-09-30 09:58:18.834 INFO (MainThread) [homeassistant.setup] Setup of domain input_datetime took 0.02 seconds +2025-09-30 09:58:18.864 INFO (MainThread) [homeassistant.setup] Setting up schlage +2025-09-30 09:58:18.864 INFO (MainThread) [homeassistant.setup] Setup of domain schlage took 0.00 seconds +2025-09-30 09:58:18.883 INFO (MainThread) [homeassistant.setup] Setting up schedule +2025-09-30 09:58:18.886 INFO (MainThread) [homeassistant.setup] Setup of domain schedule took 0.00 seconds +2025-09-30 09:58:18.902 INFO (MainThread) [homeassistant.setup] Setting up filter +2025-09-30 09:58:18.903 INFO (MainThread) [homeassistant.setup] Setup of domain filter took 0.00 seconds +2025-09-30 09:58:18.916 INFO (MainThread) [homeassistant.setup] Setting up nut +2025-09-30 09:58:18.916 INFO (MainThread) [homeassistant.setup] Setup of domain nut took 0.00 seconds +2025-09-30 09:58:18.930 INFO (MainThread) [homeassistant.setup] Setting up python_script +2025-09-30 09:58:18.937 INFO (MainThread) [homeassistant.setup] Setup of domain python_script took 0.01 seconds +2025-09-30 09:58:18.942 INFO (MainThread) [hass_nabucasa.iot] Connected +2025-09-30 09:58:18.982 INFO (MainThread) [homeassistant.setup] Setting up flightradar24 +2025-09-30 09:58:18.982 INFO (MainThread) [homeassistant.setup] Setup of domain flightradar24 took 0.00 seconds +2025-09-30 09:58:18.994 INFO (MainThread) [homeassistant.setup] Setting up application_credentials +2025-09-30 09:58:18.995 INFO (MainThread) [homeassistant.setup] Setup of domain application_credentials took 0.00 seconds +2025-09-30 09:58:19.000 INFO (MainThread) [homeassistant.setup] Setting up pirateweather +2025-09-30 09:58:19.000 INFO (MainThread) [homeassistant.setup] Setup of domain pirateweather took 0.00 seconds +2025-09-30 09:58:19.002 INFO (MainThread) [custom_components.pirateweather] Using default Pirate Weather Endpoint +2025-09-30 09:58:19.031 INFO (MainThread) [homeassistant.setup] Setting up vlc_telnet +2025-09-30 09:58:19.031 INFO (MainThread) [homeassistant.setup] Setup of domain vlc_telnet took 0.00 seconds +2025-09-30 09:58:19.050 INFO (MainThread) [homeassistant.setup] Setting up threshold +2025-09-30 09:58:19.050 INFO (MainThread) [homeassistant.setup] Setup of domain threshold took 0.00 seconds +2025-09-30 09:58:19.051 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up threshold.binary_sensor +2025-09-30 09:58:19.052 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up threshold.binary_sensor +2025-09-30 09:58:19.052 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up threshold.binary_sensor +2025-09-30 09:58:19.055 INFO (MainThread) [snitun.utils.aiohttp_client] AioHTTP snitun client started on 127.0.0.1:41327 +2025-09-30 09:58:19.178 INFO (MainThread) [snitun.utils.aiohttp_client] AioHTTP snitun client connected to: us-east-1-5.ui.nabu.casa:443 +2025-09-30 09:58:19.253 INFO (MainThread) [homeassistant.setup] Setup of domain rest took 0.52 seconds +2025-09-30 09:58:19.336 INFO (ImportExecutor_0) [zigpy.serial] Using pyserial-asyncio-fast in place of pyserial-asyncio +2025-09-30 09:58:19.450 INFO (MainThread) [homeassistant.setup] Setting up homeassistant_hardware +2025-09-30 09:58:19.450 INFO (MainThread) [homeassistant.setup] Setup of domain homeassistant_hardware took 0.00 seconds +2025-09-30 09:58:19.456 INFO (MainThread) [homeassistant.setup] Setting up history_stats +2025-09-30 09:58:19.457 INFO (MainThread) [homeassistant.setup] Setup of domain history_stats took 0.00 seconds +2025-09-30 09:58:19.479 INFO (MainThread) [homeassistant.components.sensor] Setting up history_stats.sensor +2025-09-30 09:58:19.482 INFO (MainThread) [homeassistant.components.sensor] Setting up history_stats.sensor +2025-09-30 09:58:19.484 INFO (MainThread) [homeassistant.components.sensor] Setting up history_stats.sensor +2025-09-30 09:58:19.488 INFO (MainThread) [homeassistant.setup] Setting up lionel_controller +2025-09-30 09:58:19.488 INFO (MainThread) [homeassistant.setup] Setup of domain lionel_controller took 0.00 seconds +2025-09-30 09:58:19.488 DEBUG (MainThread) [custom_components.lionel_controller] Device not found in cache, attempting fresh lookup +2025-09-30 09:58:19.491 INFO (MainThread) [homeassistant.components.sensor] Setting up history_stats.sensor +2025-09-30 09:58:19.993 DEBUG (MainThread) [custom_components.lionel_controller] Initial connection failed during setup: Could not find Bluetooth device with address FC:1F:C3:9F:A5:4A +2025-09-30 09:58:19.994 INFO (MainThread) [custom_components.lionel_controller] Successfully connected to Lionel train at FC:1F:C3:9F:A5:4A +2025-09-30 09:58:20.282 INFO (MainThread) [homeassistant.setup] Setting up google_generative_ai_conversation +2025-09-30 09:58:20.282 INFO (MainThread) [homeassistant.setup] Setup of domain google_generative_ai_conversation took 0.00 seconds +2025-09-30 09:58:20.283 INFO (MainThread) [homeassistant.setup] Setting up uptime +2025-09-30 09:58:20.283 INFO (MainThread) [homeassistant.setup] Setup of domain uptime took 0.00 seconds +2025-09-30 09:58:20.388 INFO (MainThread) [homeassistant.setup] Setting up roomba +2025-09-30 09:58:20.388 INFO (MainThread) [homeassistant.setup] Setup of domain roomba took 0.00 seconds +2025-09-30 09:58:20.392 INFO (MainThread) [homeassistant.setup] Setting up discogs_sync +2025-09-30 09:58:20.392 INFO (MainThread) [homeassistant.setup] Setup of domain discogs_sync took 0.00 seconds +2025-09-30 09:58:20.402 INFO (SyncWorker_9) [roombapy.remote_client] Connecting to 192.168.16.25, attempt 1 of 3 +2025-09-30 09:58:20.432 WARNING (MainThread) [homeassistant.util.loop] Detected blocking call to open with args ('/root/.netrc',) inside the event loop by integration 'google_generative_ai_conversation' at homeassistant/components/google_generative_ai_conversation/__init__.py, line 165: await client.aio.models.get( (offender: /usr/local/lib/python3.13/netrc.py, line 87: with open(file, encoding="utf-8") as fp:), please create a bug report at https://github.com/home-assistant/core/issues?q=is%3Aopen+is%3Aissue+label%3A%22integration%3A+google_generative_ai_conversation%22 +For developers, please see https://developers.home-assistant.io/docs/asyncio_blocking_operations/#open +Traceback (most recent call last): + File "", line 198, in _run_module_as_main + File "", line 88, in _run_code + File "/usr/src/homeassistant/homeassistant/__main__.py", line 223, in + sys.exit(main()) + File "/usr/src/homeassistant/homeassistant/__main__.py", line 209, in main + exit_code = runner.run(runtime_conf) + File "/usr/src/homeassistant/homeassistant/runner.py", line 156, in run + return loop.run_until_complete(setup_and_run_hass(runtime_config)) + File "/usr/local/lib/python3.13/asyncio/base_events.py", line 712, in run_until_complete + self.run_forever() + File "/usr/local/lib/python3.13/asyncio/base_events.py", line 683, in run_forever + self._run_once() + File "/usr/local/lib/python3.13/asyncio/base_events.py", line 2050, in _run_once + handle._run() + File "/usr/local/lib/python3.13/asyncio/events.py", line 89, in _run + self._context.run(self._callback, *self._args) + File "/usr/src/homeassistant/homeassistant/config_entries.py", line 896, in async_setup_locked + await self.async_setup(hass, integration=integration) + File "/usr/src/homeassistant/homeassistant/config_entries.py", line 662, in async_setup + await self.__async_setup_with_context(hass, integration) + File "/usr/src/homeassistant/homeassistant/config_entries.py", line 751, in __async_setup_with_context + result = await component.async_setup_entry(hass, self) + File "/usr/src/homeassistant/homeassistant/components/google_generative_ai_conversation/__init__.py", line 165, in async_setup_entry + await client.aio.models.get( + +2025-09-30 09:58:20.449 INFO (MainThread) [homeassistant.setup] Setting up onkyo +2025-09-30 09:58:20.449 INFO (MainThread) [homeassistant.setup] Setup of domain onkyo took 0.00 seconds +2025-09-30 09:58:20.454 INFO (MainThread) [homeassistant.setup] Setting up ecobee +2025-09-30 09:58:20.454 INFO (MainThread) [homeassistant.setup] Setup of domain ecobee took 0.00 seconds +2025-09-30 09:58:20.457 INFO (MainThread) [homeassistant.setup] Setting up moon +2025-09-30 09:58:20.457 INFO (MainThread) [homeassistant.setup] Setup of domain moon took 0.00 seconds +2025-09-30 09:58:20.460 INFO (MainThread) [homeassistant.setup] Setting up downloader +2025-09-30 09:58:20.460 INFO (MainThread) [homeassistant.setup] Setup of domain downloader took 0.00 seconds +2025-09-30 09:58:20.466 INFO (MainThread) [homeassistant.setup] Setting up proximity +2025-09-30 09:58:20.466 INFO (MainThread) [homeassistant.setup] Setup of domain proximity took 0.00 seconds +2025-09-30 09:58:20.471 INFO (MainThread) [homeassistant.components.light] Setting up switch_as_x.light +2025-09-30 09:58:20.472 INFO (MainThread) [homeassistant.components.light] Setting up switch_as_x.light +2025-09-30 09:58:20.478 INFO (MainThread) [homeassistant.setup] Setting up switch +2025-09-30 09:58:20.479 INFO (MainThread) [homeassistant.setup] Setup of domain switch took 0.00 seconds +2025-09-30 09:58:20.486 INFO (MainThread) [homeassistant.components.switch] Setting up group.switch +2025-09-30 09:58:20.488 INFO (MainThread) [homeassistant.components.notify] Setting up notify.group +2025-09-30 09:58:20.658 INFO (MainThread) [homeassistant.setup] Setting up tplink +2025-09-30 09:58:20.658 INFO (MainThread) [homeassistant.setup] Setup of domain tplink took 0.00 seconds +2025-09-30 09:58:20.758 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up systemmonitor.binary_sensor +2025-09-30 09:58:20.758 INFO (MainThread) [homeassistant.components.sensor] Setting up systemmonitor.sensor +2025-09-30 09:58:20.781 INFO (MainThread) [homeassistant.setup] Setting up media_player +2025-09-30 09:58:20.787 INFO (MainThread) [homeassistant.setup] Setup of domain media_player took 0.00 seconds +2025-09-30 09:58:20.787 INFO (MainThread) [homeassistant.components.media_player] Setting up cast.media_player +2025-09-30 09:58:20.836 INFO (MainThread) [homeassistant.setup] Setting up mobile_app +2025-09-30 09:58:20.837 INFO (MainThread) [homeassistant.setup] Setup of domain mobile_app took 0.00 seconds +2025-09-30 09:58:20.837 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.838 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.838 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.841 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.842 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.843 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.847 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.847 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.847 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.850 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.851 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.852 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.854 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.856 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.856 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.859 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.860 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.861 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.867 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.867 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.868 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.871 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.871 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.872 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.874 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mobile_app.binary_sensor +2025-09-30 09:58:20.875 INFO (MainThread) [homeassistant.components.device_tracker] Setting up mobile_app.device_tracker +2025-09-30 09:58:20.875 INFO (MainThread) [homeassistant.components.sensor] Setting up mobile_app.sensor +2025-09-30 09:58:20.876 INFO (MainThread) [homeassistant.components.notify] Setting up notify.mobile_app +2025-09-30 09:58:20.878 INFO (MainThread) [homeassistant.setup] Setting up default_config +2025-09-30 09:58:20.878 INFO (MainThread) [homeassistant.setup] Setup of domain default_config took 0.00 seconds +2025-09-30 09:58:21.052 INFO (MainThread) [homeassistant.setup] Setting up esphome +2025-09-30 09:58:21.054 INFO (MainThread) [homeassistant.components.sensor] Setting up teamtracker.sensor +2025-09-30 09:58:21.054 INFO (MainThread) [custom_components.teamtracker.sensor] team_tracker_phillies: Updating sensor from UI using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:21.056 INFO (MainThread) [homeassistant.components.sensor] Setting up teamtracker.sensor +2025-09-30 09:58:21.056 INFO (MainThread) [custom_components.teamtracker.sensor] team_tracker_eagles: Updating sensor from UI using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:21.058 INFO (MainThread) [homeassistant.components.sensor] Setting up teamtracker.sensor +2025-09-30 09:58:21.058 INFO (MainThread) [custom_components.teamtracker.sensor] team_tracker_sixers: Updating sensor from UI using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:21.060 INFO (MainThread) [homeassistant.components.sensor] Setting up teamtracker.sensor +2025-09-30 09:58:21.060 INFO (MainThread) [custom_components.teamtracker.sensor] team_tracker_flyers: Updating sensor from UI using TeamTracker v0.14.9, if you have any issues please report them here: https://github.com/vasqued2/ha-teamtracker +2025-09-30 09:58:21.072 INFO (MainThread) [homeassistant.setup] Setup of domain esphome took 0.02 seconds +2025-09-30 09:58:21.077 INFO (MainThread) [homeassistant.setup] Setting up derivative +2025-09-30 09:58:21.077 INFO (MainThread) [homeassistant.setup] Setup of domain derivative took 0.00 seconds +2025-09-30 09:58:21.081 INFO (MainThread) [homeassistant.setup] Setting up integration +2025-09-30 09:58:21.082 INFO (MainThread) [homeassistant.setup] Setup of domain integration took 0.00 seconds +2025-09-30 09:58:21.085 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.087 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.088 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.091 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.092 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.094 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.094 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.095 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.096 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.096 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.098 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.099 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.101 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.102 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.103 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.104 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.106 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.107 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.108 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.109 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.110 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.112 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.112 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.113 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.113 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.114 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.115 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.115 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.116 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.116 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.117 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.117 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.118 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.118 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.119 INFO (MainThread) [homeassistant.components.sensor] Setting up utility_meter.sensor +2025-09-30 09:58:21.128 INFO (MainThread) [homeassistant.components.sensor] Setting up airnow.sensor +2025-09-30 09:58:21.168 INFO (paho-mqtt-client-47270438B1954E0DA38660DC9A6EBE60) [roombapy.roomba] Connecting to Roomba 192.168.16.25 +2025-09-30 09:58:21.184 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up shelly.binary_sensor +2025-09-30 09:58:21.185 INFO (MainThread) [homeassistant.setup] Setting up button +2025-09-30 09:58:21.185 INFO (MainThread) [homeassistant.setup] Setup of domain button took 0.00 seconds +2025-09-30 09:58:21.185 INFO (MainThread) [homeassistant.components.button] Setting up shelly.button +2025-09-30 09:58:21.186 INFO (MainThread) [homeassistant.setup] Setting up climate +2025-09-30 09:58:21.187 INFO (MainThread) [homeassistant.setup] Setup of domain climate took 0.00 seconds +2025-09-30 09:58:21.187 INFO (MainThread) [homeassistant.components.climate] Setting up shelly.climate +2025-09-30 09:58:21.188 INFO (MainThread) [homeassistant.setup] Setting up cover +2025-09-30 09:58:21.188 INFO (MainThread) [homeassistant.setup] Setup of domain cover took 0.00 seconds +2025-09-30 09:58:21.189 INFO (MainThread) [homeassistant.components.cover] Setting up shelly.cover +2025-09-30 09:58:21.189 INFO (MainThread) [homeassistant.components.event] Setting up shelly.event +2025-09-30 09:58:21.189 INFO (MainThread) [homeassistant.components.light] Setting up shelly.light +2025-09-30 09:58:21.191 INFO (MainThread) [homeassistant.components.number] Setting up shelly.number +2025-09-30 09:58:21.191 INFO (MainThread) [homeassistant.components.select] Setting up shelly.select +2025-09-30 09:58:21.191 INFO (MainThread) [homeassistant.components.sensor] Setting up shelly.sensor +2025-09-30 09:58:21.194 INFO (MainThread) [homeassistant.components.switch] Setting up shelly.switch +2025-09-30 09:58:21.194 INFO (MainThread) [homeassistant.setup] Setting up text +2025-09-30 09:58:21.194 INFO (MainThread) [homeassistant.setup] Setup of domain text took 0.00 seconds +2025-09-30 09:58:21.194 INFO (MainThread) [homeassistant.components.text] Setting up shelly.text +2025-09-30 09:58:21.194 INFO (MainThread) [homeassistant.components.update] Setting up shelly.update +2025-09-30 09:58:21.195 INFO (MainThread) [homeassistant.setup] Setting up valve +2025-09-30 09:58:21.196 INFO (MainThread) [homeassistant.setup] Setup of domain valve took 0.00 seconds +2025-09-30 09:58:21.196 INFO (MainThread) [homeassistant.components.valve] Setting up shelly.valve +2025-09-30 09:58:21.196 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up shelly.binary_sensor +2025-09-30 09:58:21.197 INFO (MainThread) [homeassistant.components.button] Setting up shelly.button +2025-09-30 09:58:21.197 INFO (MainThread) [homeassistant.components.climate] Setting up shelly.climate +2025-09-30 09:58:21.198 INFO (MainThread) [homeassistant.components.cover] Setting up shelly.cover +2025-09-30 09:58:21.198 INFO (MainThread) [homeassistant.components.event] Setting up shelly.event +2025-09-30 09:58:21.198 INFO (MainThread) [homeassistant.components.light] Setting up shelly.light +2025-09-30 09:58:21.198 INFO (MainThread) [homeassistant.components.number] Setting up shelly.number +2025-09-30 09:58:21.198 INFO (MainThread) [homeassistant.components.select] Setting up shelly.select +2025-09-30 09:58:21.198 INFO (MainThread) [homeassistant.components.sensor] Setting up shelly.sensor +2025-09-30 09:58:21.200 INFO (MainThread) [homeassistant.components.switch] Setting up shelly.switch +2025-09-30 09:58:21.200 INFO (MainThread) [homeassistant.components.text] Setting up shelly.text +2025-09-30 09:58:21.200 INFO (MainThread) [homeassistant.components.update] Setting up shelly.update +2025-09-30 09:58:21.201 INFO (MainThread) [homeassistant.components.valve] Setting up shelly.valve +2025-09-30 09:58:21.201 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up shelly.binary_sensor +2025-09-30 09:58:21.202 INFO (MainThread) [homeassistant.components.button] Setting up shelly.button +2025-09-30 09:58:21.202 INFO (MainThread) [homeassistant.components.climate] Setting up shelly.climate +2025-09-30 09:58:21.203 INFO (MainThread) [homeassistant.components.cover] Setting up shelly.cover +2025-09-30 09:58:21.203 INFO (MainThread) [homeassistant.components.event] Setting up shelly.event +2025-09-30 09:58:21.203 INFO (MainThread) [homeassistant.components.light] Setting up shelly.light +2025-09-30 09:58:21.203 INFO (MainThread) [homeassistant.components.number] Setting up shelly.number +2025-09-30 09:58:21.203 INFO (MainThread) [homeassistant.components.select] Setting up shelly.select +2025-09-30 09:58:21.203 INFO (MainThread) [homeassistant.components.sensor] Setting up shelly.sensor +2025-09-30 09:58:21.205 INFO (MainThread) [homeassistant.components.switch] Setting up shelly.switch +2025-09-30 09:58:21.205 INFO (MainThread) [homeassistant.components.text] Setting up shelly.text +2025-09-30 09:58:21.205 INFO (MainThread) [homeassistant.components.update] Setting up shelly.update +2025-09-30 09:58:21.206 INFO (MainThread) [homeassistant.components.valve] Setting up shelly.valve +2025-09-30 09:58:21.213 INFO (MainThread) [homeassistant.setup] Setting up calendar +2025-09-30 09:58:21.214 INFO (MainThread) [homeassistant.setup] Setup of domain calendar took 0.00 seconds +2025-09-30 09:58:21.214 INFO (MainThread) [homeassistant.components.calendar] Setting up local_calendar.calendar +2025-09-30 09:58:21.217 INFO (MainThread) [homeassistant.components.sensor] Setting up energy.sensor +2025-09-30 09:58:21.275 INFO (MainThread) [homeassistant.setup] Setting up radio_browser +2025-09-30 09:58:21.275 INFO (MainThread) [homeassistant.setup] Setup of domain radio_browser took 0.00 seconds +2025-09-30 09:58:21.278 INFO (MainThread) [homeassistant.setup] Setting up analytics +2025-09-30 09:58:21.279 INFO (MainThread) [homeassistant.setup] Setup of domain analytics took 0.00 seconds +2025-09-30 09:58:21.281 INFO (MainThread) [homeassistant.components.sensor] Setting up command_line.sensor +2025-09-30 09:58:21.282 INFO (MainThread) [homeassistant.components.sensor] Setting up command_line.sensor +2025-09-30 09:58:21.283 INFO (MainThread) [homeassistant.components.sensor] Setting up command_line.sensor +2025-09-30 09:58:21.284 INFO (MainThread) [homeassistant.components.sensor] Setting up command_line.sensor +2025-09-30 09:58:21.295 INFO (MainThread) [homeassistant.components.remote] Setting up harmony.remote +2025-09-30 09:58:21.296 INFO (MainThread) [homeassistant.components.select] Setting up harmony.select +2025-09-30 09:58:21.313 INFO (MainThread) [homeassistant.components.sensor] Setting up filter.sensor +2025-09-30 09:58:21.329 INFO (MainThread) [homeassistant.components.media_player] Setting up androidtv_remote.media_player +2025-09-30 09:58:21.329 INFO (MainThread) [homeassistant.components.remote] Setting up androidtv_remote.remote +2025-09-30 09:58:21.433 INFO (MainThread) [homeassistant.setup] Setting up hacs +2025-09-30 09:58:21.433 INFO (MainThread) [homeassistant.setup] Setup of domain hacs took 0.00 seconds +2025-09-30 09:58:21.433 INFO (MainThread) [custom_components.hacs] +------------------------------------------------------------------- +HACS (Home Assistant Community Store) + +Version: 2.0.5 +This is a custom integration +If you have any issues with this you need to open an issue here: +https://github.com/hacs/integration/issues +------------------------------------------------------------------- + +2025-09-30 09:58:21.450 INFO (MainThread) [custom_components.hacs] Restore started +2025-09-30 09:58:21.450 INFO (MainThread) [homeassistant.components.button] Setting up nut.button +2025-09-30 09:58:21.450 INFO (MainThread) [homeassistant.components.sensor] Setting up nut.sensor +2025-09-30 09:58:21.457 INFO (MainThread) [homeassistant.components.switch] Setting up nut.switch +2025-09-30 09:58:21.536 INFO (MainThread) [custom_components.hacs] Restore done +2025-09-30 09:58:21.537 INFO (MainThread) [custom_components.hacs] Enable category: integration +2025-09-30 09:58:21.537 INFO (MainThread) [custom_components.hacs] Enable category: plugin +2025-09-30 09:58:21.537 INFO (MainThread) [custom_components.hacs] Enable category: template +2025-09-30 09:58:21.537 INFO (MainThread) [custom_components.hacs] Enable category: python_script +2025-09-30 09:58:21.537 INFO (MainThread) [custom_components.hacs] Enable category: theme +2025-09-30 09:58:21.537 INFO (MainThread) [custom_components.hacs] Enable category: appdaemon +2025-09-30 09:58:21.719 INFO (MainThread) [custom_components.hacs] Setting up plugin endpoint +2025-09-30 09:58:21.719 INFO (MainThread) [custom_components.hacs] storage mode, cache for /hacsfiles/: True +2025-09-30 09:58:22.001 INFO (MainThread) [homeassistant.setup] Setting up spotify +2025-09-30 09:58:22.001 INFO (MainThread) [homeassistant.setup] Setup of domain spotify took 0.00 seconds +2025-09-30 09:58:22.038 INFO (MainThread) [homeassistant.setup] Setting up google_assistant_sdk +2025-09-30 09:58:22.039 INFO (MainThread) [homeassistant.setup] Setup of domain google_assistant_sdk took 0.00 seconds +2025-09-30 09:58:22.189 INFO (MainThread) [homeassistant.setup] Setting up google_mail +2025-09-30 09:58:22.190 INFO (MainThread) [homeassistant.setup] Setup of domain google_mail took 0.00 seconds +2025-09-30 09:58:22.218 INFO (MainThread) [homeassistant.components.sensor] Setting up lunar_phase.sensor +2025-09-30 09:58:22.223 INFO (MainThread) [homeassistant.components.media_player] Setting up vlc_telnet.media_player +2025-09-30 09:58:22.234 INFO (MainThread) [homeassistant.components.sensor] Setting up pirateweather.sensor +2025-09-30 09:58:22.466 INFO (MainThread) [homeassistant.setup] Setting up weather +2025-09-30 09:58:22.467 INFO (MainThread) [homeassistant.setup] Setup of domain weather took 0.00 seconds +2025-09-30 09:58:22.467 INFO (MainThread) [homeassistant.components.weather] Setting up pirateweather.weather +2025-09-30 09:58:22.469 INFO (MainThread) [homeassistant.components.sensor] Setting up pirateweather.sensor +2025-09-30 09:58:22.475 INFO (MainThread) [homeassistant.components.weather] Setting up pirateweather.weather +2025-09-30 09:58:22.483 INFO (MainThread) [homeassistant.components.sensor] Setting up rest.sensor +2025-09-30 09:58:22.485 INFO (MainThread) [homeassistant.components.sensor] Setting up rest.sensor +2025-09-30 09:58:22.486 INFO (MainThread) [homeassistant.components.sensor] Setting up rest.sensor +2025-09-30 09:58:22.487 INFO (MainThread) [homeassistant.components.sensor] Setting up rest.sensor +2025-09-30 09:58:22.490 INFO (MainThread) [homeassistant.components.sensor] Setting up rest.sensor +2025-09-30 09:58:22.803 INFO (MainThread) [homeassistant.setup] Setting up zha +2025-09-30 09:58:22.803 INFO (MainThread) [homeassistant.setup] Setup of domain zha took 0.00 seconds +2025-09-30 09:58:22.812 INFO (MainThread) [homeassistant.components.device_tracker] Setting up flightradar24.device_tracker +2025-09-30 09:58:22.813 INFO (MainThread) [homeassistant.components.sensor] Setting up flightradar24.sensor +2025-09-30 09:58:22.814 INFO (MainThread) [homeassistant.components.switch] Setting up flightradar24.switch +2025-09-30 09:58:22.814 INFO (MainThread) [homeassistant.components.text] Setting up flightradar24.text +2025-09-30 09:58:22.815 INFO (MainThread) [homeassistant.components.button] Setting up flightradar24.button +2025-09-30 09:58:22.819 INFO (MainThread) [homeassistant.components.sensor] Setting up ambient_network.sensor +2025-09-30 09:58:22.837 INFO (MainThread) [homeassistant.components.number] Setting up lionel_controller.number +2025-09-30 09:58:22.839 INFO (MainThread) [homeassistant.components.switch] Setting up lionel_controller.switch +2025-09-30 09:58:22.841 INFO (MainThread) [homeassistant.components.button] Setting up lionel_controller.button +2025-09-30 09:58:22.845 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up lionel_controller.binary_sensor +2025-09-30 09:58:22.848 INFO (MainThread) [homeassistant.components.sensor] Setting up uptime.sensor +2025-09-30 09:58:22.859 INFO (MainThread) [homeassistant.components.media_player] Setting up onkyo.media_player +2025-09-30 09:58:22.860 INFO (MainThread) [homeassistant.components.sensor] Setting up moon.sensor +2025-09-30 09:58:22.863 INFO (MainThread) [homeassistant.components.sensor] Setting up proximity.sensor +2025-09-30 09:58:22.965 INFO (MainThread) [homeassistant.setup] Setting up ai_task +2025-09-30 09:58:22.967 INFO (MainThread) [homeassistant.setup] Setup of domain ai_task took 0.00 seconds +2025-09-30 09:58:22.967 INFO (MainThread) [homeassistant.components.ai_task] Setting up google_generative_ai_conversation.ai_task +2025-09-30 09:58:22.968 INFO (MainThread) [homeassistant.components.conversation] Setting up google_generative_ai_conversation.conversation +2025-09-30 09:58:22.968 INFO (MainThread) [homeassistant.components.stt] Setting up google_generative_ai_conversation.stt +2025-09-30 09:58:22.969 INFO (MainThread) [homeassistant.components.tts] Setting up google_generative_ai_conversation.tts +2025-09-30 09:58:22.991 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up ecobee.binary_sensor +2025-09-30 09:58:22.992 INFO (MainThread) [homeassistant.components.climate] Setting up ecobee.climate +2025-09-30 09:58:22.995 INFO (MainThread) [homeassistant.setup] Setting up humidifier +2025-09-30 09:58:22.995 INFO (MainThread) [homeassistant.setup] Setup of domain humidifier took 0.00 seconds +2025-09-30 09:58:22.996 INFO (MainThread) [homeassistant.components.humidifier] Setting up ecobee.humidifier +2025-09-30 09:58:22.996 INFO (MainThread) [homeassistant.components.notify] Setting up ecobee.notify +2025-09-30 09:58:22.997 INFO (MainThread) [homeassistant.components.number] Setting up ecobee.number +2025-09-30 09:58:22.997 INFO (MainThread) [homeassistant.components.sensor] Setting up ecobee.sensor +2025-09-30 09:58:22.999 INFO (MainThread) [homeassistant.components.switch] Setting up ecobee.switch +2025-09-30 09:58:22.999 INFO (MainThread) [homeassistant.components.weather] Setting up ecobee.weather +2025-09-30 09:58:23.048 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up tplink.binary_sensor +2025-09-30 09:58:23.049 INFO (MainThread) [homeassistant.components.button] Setting up tplink.button +2025-09-30 09:58:23.049 INFO (MainThread) [homeassistant.components.camera] Setting up tplink.camera +2025-09-30 09:58:23.049 INFO (MainThread) [homeassistant.components.climate] Setting up tplink.climate +2025-09-30 09:58:23.050 INFO (MainThread) [homeassistant.components.fan] Setting up tplink.fan +2025-09-30 09:58:23.050 INFO (MainThread) [homeassistant.components.light] Setting up tplink.light +2025-09-30 09:58:23.050 INFO (MainThread) [homeassistant.components.number] Setting up tplink.number +2025-09-30 09:58:23.050 INFO (MainThread) [homeassistant.components.select] Setting up tplink.select +2025-09-30 09:58:23.050 INFO (MainThread) [homeassistant.components.sensor] Setting up tplink.sensor +2025-09-30 09:58:23.051 INFO (MainThread) [homeassistant.setup] Setting up siren +2025-09-30 09:58:23.052 INFO (MainThread) [homeassistant.setup] Setup of domain siren took 0.00 seconds +2025-09-30 09:58:23.052 INFO (MainThread) [homeassistant.components.siren] Setting up tplink.siren +2025-09-30 09:58:23.052 INFO (MainThread) [homeassistant.components.switch] Setting up tplink.switch +2025-09-30 09:58:23.053 INFO (MainThread) [homeassistant.setup] Setting up vacuum +2025-09-30 09:58:23.054 INFO (MainThread) [homeassistant.setup] Setup of domain vacuum took 0.00 seconds +2025-09-30 09:58:23.054 INFO (MainThread) [homeassistant.components.vacuum] Setting up tplink.vacuum +2025-09-30 09:58:23.055 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up tplink.binary_sensor +2025-09-30 09:58:23.056 INFO (MainThread) [homeassistant.components.button] Setting up tplink.button +2025-09-30 09:58:23.057 INFO (MainThread) [homeassistant.components.camera] Setting up tplink.camera +2025-09-30 09:58:23.057 INFO (MainThread) [homeassistant.components.climate] Setting up tplink.climate +2025-09-30 09:58:23.057 INFO (MainThread) [homeassistant.components.fan] Setting up tplink.fan +2025-09-30 09:58:23.057 INFO (MainThread) [homeassistant.components.light] Setting up tplink.light +2025-09-30 09:58:23.057 INFO (MainThread) [homeassistant.components.number] Setting up tplink.number +2025-09-30 09:58:23.057 INFO (MainThread) [homeassistant.components.select] Setting up tplink.select +2025-09-30 09:58:23.058 INFO (MainThread) [homeassistant.components.sensor] Setting up tplink.sensor +2025-09-30 09:58:23.060 INFO (MainThread) [homeassistant.components.siren] Setting up tplink.siren +2025-09-30 09:58:23.060 INFO (MainThread) [homeassistant.components.switch] Setting up tplink.switch +2025-09-30 09:58:23.061 INFO (MainThread) [homeassistant.components.vacuum] Setting up tplink.vacuum +2025-09-30 09:58:23.071 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.071 INFO (MainThread) [homeassistant.components.light] Setting up esphome.light +2025-09-30 09:58:23.071 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up esphome.binary_sensor +2025-09-30 09:58:23.072 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.074 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.074 INFO (MainThread) [homeassistant.components.light] Setting up esphome.light +2025-09-30 09:58:23.074 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up esphome.binary_sensor +2025-09-30 09:58:23.074 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.076 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved weather-display @ 192.168.16.41 in 0.000s +2025-09-30 09:58:23.077 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved bobacat-display @ 192.168.16.32 in 0.000s +2025-09-30 09:58:23.079 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.079 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.079 INFO (MainThread) [homeassistant.components.sensor] Setting up esphome.sensor +2025-09-30 09:58:23.082 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.082 INFO (MainThread) [homeassistant.components.sensor] Setting up esphome.sensor +2025-09-30 09:58:23.082 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up esphome.binary_sensor +2025-09-30 09:58:23.083 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.089 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.089 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.089 INFO (MainThread) [homeassistant.components.sensor] Setting up esphome.sensor +2025-09-30 09:58:23.091 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.091 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.091 INFO (MainThread) [homeassistant.components.sensor] Setting up esphome.sensor +2025-09-30 09:58:23.096 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.097 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.097 INFO (MainThread) [homeassistant.components.sensor] Setting up esphome.sensor +2025-09-30 09:58:23.098 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved office @ 192.168.16.40 in 0.000s +2025-09-30 09:58:23.099 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved bleclient1 @ 192.168.16.221 in 0.000s +2025-09-30 09:58:23.101 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved btproxy1 @ 192.168.16.156 in 0.000s +2025-09-30 09:58:23.102 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved btproxy3 @ 192.168.16.145 in 0.000s +2025-09-30 09:58:23.103 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved btproxy2 @ 192.168.16.57 in 0.000s +2025-09-30 09:58:23.108 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.108 INFO (MainThread) [homeassistant.components.select] Setting up esphome.select +2025-09-30 09:58:23.108 INFO (MainThread) [homeassistant.components.button] Setting up esphome.button +2025-09-30 09:58:23.108 INFO (MainThread) [homeassistant.components.sensor] Setting up esphome.sensor +2025-09-30 09:58:23.108 INFO (MainThread) [homeassistant.components.number] Setting up esphome.number +2025-09-30 09:58:23.108 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up esphome.binary_sensor +2025-09-30 09:58:23.109 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.118 INFO (MainThread) [homeassistant.components.sensor] Setting up derivative.sensor +2025-09-30 09:58:23.119 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved trainble @ 192.168.16.194 in 0.000s +2025-09-30 09:58:23.122 INFO (MainThread) [homeassistant.components.sensor] Setting up derivative.sensor +2025-09-30 09:58:23.124 INFO (MainThread) [homeassistant.components.update] Setting up esphome.update +2025-09-30 09:58:23.124 INFO (MainThread) [homeassistant.components.camera] Setting up esphome.camera +2025-09-30 09:58:23.125 INFO (MainThread) [homeassistant.components.sensor] Setting up esphome.sensor +2025-09-30 09:58:23.125 INFO (MainThread) [homeassistant.components.switch] Setting up esphome.switch +2025-09-30 09:58:23.132 INFO (MainThread) [homeassistant.components.sensor] Setting up integration.sensor +2025-09-30 09:58:23.135 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully resolved esp32cam @ 192.168.16.142 in 0.000s +2025-09-30 09:58:23.136 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to bobacat-display @ 192.168.16.32 in 0.059s +2025-09-30 09:58:23.137 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to weather-display @ 192.168.16.41 in 0.060s +2025-09-30 09:58:23.137 INFO (MainThread) [homeassistant.components.sensor] Setting up integration.sensor +2025-09-30 09:58:23.145 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to office @ 192.168.16.40 in 0.047s +2025-09-30 09:58:23.148 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to btproxy1 @ 192.168.16.156 in 0.047s +2025-09-30 09:58:23.160 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to btproxy2 @ 192.168.16.57 in 0.057s +2025-09-30 09:58:23.165 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up mqtt.binary_sensor +2025-09-30 09:58:23.176 INFO (MainThread) [homeassistant.components.sensor] Setting up mqtt.sensor +2025-09-30 09:58:23.230 INFO (MainThread) [homeassistant.components.switch] Setting up hacs.switch +2025-09-30 09:58:23.234 INFO (MainThread) [homeassistant.components.update] Setting up hacs.update +2025-09-30 09:58:23.241 INFO (MainThread) [custom_components.hacs] Stage changed: setup +2025-09-30 09:58:23.242 INFO (MainThread) [custom_components.hacs] Stage changed: waiting +2025-09-30 09:58:23.242 INFO (MainThread) [custom_components.hacs] Setup complete, waiting for Home Assistant before startup tasks starts +2025-09-30 09:58:23.243 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with btproxy2 @ 192.168.16.57 in 0.082s +2025-09-30 09:58:23.254 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to btproxy3 @ 192.168.16.145 in 0.153s +2025-09-30 09:58:23.255 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to bleclient1 @ 192.168.16.221 in 0.156s +2025-09-30 09:58:23.260 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up roomba.binary_sensor +2025-09-30 09:58:23.260 INFO (MainThread) [homeassistant.components.sensor] Setting up roomba.sensor +2025-09-30 09:58:23.264 INFO (MainThread) [homeassistant.components.vacuum] Setting up roomba.vacuum +2025-09-30 09:58:23.265 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to trainble @ 192.168.16.194 in 0.146s +2025-09-30 09:58:23.265 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successfully connected to esp32cam @ 192.168.16.142 in 0.130s +2025-09-30 09:58:23.266 INFO (MainThread) [homeassistant.components.notify] Setting up notify.google_assistant_sdk +2025-09-30 09:58:23.272 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with office @ 192.168.16.40 in 0.127s +2025-09-30 09:58:23.281 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with btproxy1 @ 192.168.16.156 in 0.133s +2025-09-30 09:58:23.314 INFO (MainThread) [homeassistant.setup] Setting up script +2025-09-30 09:58:23.321 INFO (MainThread) [homeassistant.setup] Setup of domain script took 0.01 seconds +2025-09-30 09:58:23.416 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with esp32cam @ 192.168.16.142 in 0.151s +2025-09-30 09:58:23.420 INFO (MainThread) [homeassistant.setup] Setting up spook +2025-09-30 09:58:23.420 INFO (MainThread) [homeassistant.setup] Setup of domain spook took 0.00 seconds +2025-09-30 09:58:23.433 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with btproxy3 @ 192.168.16.145 in 0.178s +2025-09-30 09:58:23.439 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with weather-display @ 192.168.16.41 in 0.303s +2025-09-30 09:58:23.442 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up schlage.binary_sensor +2025-09-30 09:58:23.443 INFO (MainThread) [homeassistant.setup] Setting up lock +2025-09-30 09:58:23.443 INFO (MainThread) [homeassistant.setup] Setup of domain lock took 0.00 seconds +2025-09-30 09:58:23.443 INFO (MainThread) [homeassistant.components.lock] Setting up schlage.lock +2025-09-30 09:58:23.444 INFO (MainThread) [homeassistant.components.select] Setting up schlage.select +2025-09-30 09:58:23.444 INFO (MainThread) [homeassistant.components.sensor] Setting up schlage.sensor +2025-09-30 09:58:23.445 INFO (MainThread) [homeassistant.components.switch] Setting up schlage.switch +2025-09-30 09:58:23.449 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with bleclient1 @ 192.168.16.221 in 0.194s +2025-09-30 09:58:23.450 INFO (MainThread) [homeassistant.setup] Setting up bluetooth_adapters +2025-09-30 09:58:23.451 INFO (MainThread) [homeassistant.setup] Setup of domain bluetooth_adapters took 0.00 seconds +2025-09-30 09:58:23.455 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with trainble @ 192.168.16.194 in 0.190s +2025-09-30 09:58:23.465 INFO (MainThread) [homeassistant.setup] Setting up plant +2025-09-30 09:58:23.465 INFO (MainThread) [homeassistant.setup] Setup of domain plant took 0.00 seconds +2025-09-30 09:58:23.501 INFO (MainThread) [homeassistant.setup] Setting up frigate +2025-09-30 09:58:23.501 INFO (MainThread) [custom_components.frigate] +------------------------------------------------------------------- +Frigate +Integration Version: 5.9.4 +This is a custom integration! +If you have any issues with this you need to open an issue here: +https://github.com/blakeblackshear/frigate-hass-integration/issues +------------------------------------------------------------------- + +2025-09-30 09:58:23.507 INFO (MainThread) [homeassistant.setup] Setup of domain frigate took 0.01 seconds +2025-09-30 09:58:23.514 INFO (MainThread) [aioesphomeapi.reconnect_logic] Successful handshake with bobacat-display @ 192.168.16.32 in 0.378s +2025-09-30 09:58:23.526 INFO (MainThread) [homeassistant.setup] Setting up fully_kiosk +2025-09-30 09:58:23.527 INFO (MainThread) [homeassistant.setup] Setup of domain fully_kiosk took 0.00 seconds +2025-09-30 09:58:23.535 INFO (MainThread) [homeassistant.components.notify] Setting up notify.google_mail +2025-09-30 09:58:23.537 INFO (MainThread) [homeassistant.components.sensor] Setting up google_mail.sensor +2025-09-30 09:58:23.563 INFO (SyncWorker_5) [googleapiclient.discovery_cache] file_cache is only supported with oauth2client<4.0.0 +2025-09-30 09:58:23.579 INFO (MainThread) [homeassistant.setup] Setting up private_ble_device +2025-09-30 09:58:23.579 INFO (MainThread) [homeassistant.setup] Setup of domain private_ble_device took 0.00 seconds +2025-09-30 09:58:23.587 INFO (MainThread) [homeassistant.setup] Setting up ibeacon +2025-09-30 09:58:23.588 INFO (MainThread) [homeassistant.setup] Setup of domain ibeacon took 0.00 seconds +2025-09-30 09:58:23.692 INFO (MainThread) [homeassistant.setup] Setting up switchbot +2025-09-30 09:58:23.692 INFO (MainThread) [homeassistant.setup] Setup of domain switchbot took 0.00 seconds +2025-09-30 09:58:23.692 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Forest Hills is online +2025-09-30 09:58:23.693 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Garage is online +2025-09-30 09:58:23.693 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Return is online +2025-09-30 09:58:23.694 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Bedroom is online +2025-09-30 09:58:23.694 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Hallway is online +2025-09-30 09:58:23.694 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Supply is online +2025-09-30 09:58:23.694 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Breezeway is online +2025-09-30 09:58:23.952 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Forest Hills is online +2025-09-30 09:58:24.002 INFO (MainThread) [homeassistant.setup] Setting up homekit_controller +2025-09-30 09:58:24.011 INFO (MainThread) [homeassistant.setup] Setup of domain homekit_controller took 0.01 seconds +2025-09-30 09:58:24.013 INFO (MainThread) [homeassistant.components.number] Setting up plant.number +2025-09-30 09:58:24.017 INFO (MainThread) [homeassistant.components.sensor] Setting up plant.sensor +2025-09-30 09:58:24.019 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.mike_wazowski_soil_moisture external sensor to sensor.third_reality_inc_3rsm0147z_soil_moisture_2 +2025-09-30 09:58:24.019 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.mike_wazowski_temperature external sensor to sensor.third_reality_inc_3rsm0147z_temperature +2025-09-30 09:58:24.019 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.mike_wazowski_air_humidity external sensor to sensor.hestia_humidity +2025-09-30 09:58:24.020 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.mike_wazowski_ppfd_mol external sensor to sensor.mike_wazowski_illuminance +2025-09-30 09:58:24.022 INFO (MainThread) [homeassistant.components.number] Setting up plant.number +2025-09-30 09:58:24.027 INFO (MainThread) [homeassistant.components.sensor] Setting up plant.sensor +2025-09-30 09:58:24.029 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.planty_jr_soil_moisture external sensor to sensor.third_reality_inc_3rsm0147z_soil_moisture +2025-09-30 09:58:24.029 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.planty_jr_temperature external sensor to sensor.third_reality_inc_3rsm0147z_temperature_2 +2025-09-30 09:58:24.030 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.planty_jr_air_humidity external sensor to sensor.meter_058b_humidity +2025-09-30 09:58:24.030 INFO (MainThread) [custom_components.plant.sensor] Setting sensor.planty_jr_ppfd_mol external sensor to sensor.planty_jr_illuminance +2025-09-30 09:58:24.160 INFO (MainThread) [homeassistant.components.sensor] Setting up frigate.sensor +2025-09-30 09:58:24.185 INFO (MainThread) [homeassistant.components.camera] Setting up frigate.camera +2025-09-30 09:58:24.188 INFO (MainThread) [homeassistant.setup] Setting up image +2025-09-30 09:58:24.189 INFO (MainThread) [homeassistant.setup] Setup of domain image took 0.00 seconds +2025-09-30 09:58:24.189 INFO (MainThread) [homeassistant.components.image] Setting up frigate.image +2025-09-30 09:58:24.192 INFO (MainThread) [homeassistant.components.number] Setting up frigate.number +2025-09-30 09:58:24.192 INFO (MainThread) [homeassistant.components.switch] Setting up frigate.switch +2025-09-30 09:58:24.196 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up frigate.binary_sensor +2025-09-30 09:58:24.206 INFO (MainThread) [homeassistant.components.update] Setting up frigate.update +2025-09-30 09:58:24.273 INFO (MainThread) [homeassistant.setup] Setting up template +2025-09-30 09:58:24.283 INFO (MainThread) [homeassistant.setup] Setup of domain template took 0.01 seconds +2025-09-30 09:58:24.283 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.286 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.287 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.293 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.297 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.300 INFO (MainThread) [homeassistant.components.switch] Setting up template.switch +2025-09-30 09:58:24.303 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.312 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.321 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.335 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.343 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.353 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.361 INFO (MainThread) [homeassistant.components.switch] Setting up template.switch +2025-09-30 09:58:24.365 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.374 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.380 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.387 INFO (MainThread) [homeassistant.components.switch] Setting up template.switch +2025-09-30 09:58:24.399 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.402 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.405 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.412 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.413 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.415 INFO (MainThread) [homeassistant.components.button] Setting up template.button +2025-09-30 09:58:24.416 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.418 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.421 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.425 INFO (MainThread) [homeassistant.components.button] Setting up template.button +2025-09-30 09:58:24.426 INFO (MainThread) [homeassistant.components.button] Setting up template.button +2025-09-30 09:58:24.427 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.430 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.447 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.449 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.455 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.458 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.460 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.463 INFO (MainThread) [homeassistant.components.switch] Setting up template.switch +2025-09-30 09:58:24.465 INFO (MainThread) [homeassistant.components.button] Setting up template.button +2025-09-30 09:58:24.466 INFO (MainThread) [homeassistant.components.button] Setting up template.button +2025-09-30 09:58:24.467 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.472 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.475 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.478 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.479 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.484 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up template.binary_sensor +2025-09-30 09:58:24.487 INFO (MainThread) [homeassistant.components.button] Setting up template.button +2025-09-30 09:58:24.488 INFO (MainThread) [homeassistant.components.device_tracker] Setting up private_ble_device.device_tracker +2025-09-30 09:58:24.490 INFO (MainThread) [homeassistant.components.sensor] Setting up private_ble_device.sensor +2025-09-30 09:58:24.493 INFO (MainThread) [homeassistant.components.fan] Setting up template.fan +2025-09-30 09:58:24.494 INFO (MainThread) [homeassistant.components.light] Setting up template.light +2025-09-30 09:58:24.495 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.499 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.499 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.500 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.500 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.501 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.501 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.502 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.502 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.503 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.503 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.504 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.504 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.505 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.505 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.505 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.506 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.506 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.507 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.507 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.508 INFO (MainThread) [homeassistant.components.sensor] Setting up template.sensor +2025-09-30 09:58:24.510 INFO (MainThread) [homeassistant.components.device_tracker] Setting up private_ble_device.device_tracker +2025-09-30 09:58:24.511 INFO (MainThread) [homeassistant.components.sensor] Setting up private_ble_device.sensor +2025-09-30 09:58:24.513 INFO (MainThread) [homeassistant.components.device_tracker] Setting up private_ble_device.device_tracker +2025-09-30 09:58:24.515 INFO (MainThread) [homeassistant.components.sensor] Setting up private_ble_device.sensor +2025-09-30 09:58:24.521 INFO (MainThread) [homeassistant.components.device_tracker] Setting up private_ble_device.device_tracker +2025-09-30 09:58:24.522 INFO (MainThread) [homeassistant.components.sensor] Setting up private_ble_device.sensor +2025-09-30 09:58:24.525 INFO (MainThread) [homeassistant.components.device_tracker] Setting up ibeacon.device_tracker +2025-09-30 09:58:24.525 INFO (MainThread) [homeassistant.components.sensor] Setting up ibeacon.sensor +2025-09-30 09:58:24.691 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up fully_kiosk.binary_sensor +2025-09-30 09:58:24.693 INFO (MainThread) [homeassistant.components.button] Setting up fully_kiosk.button +2025-09-30 09:58:24.694 INFO (MainThread) [homeassistant.components.camera] Setting up fully_kiosk.camera +2025-09-30 09:58:24.695 INFO (MainThread) [homeassistant.components.image] Setting up fully_kiosk.image +2025-09-30 09:58:24.695 INFO (MainThread) [homeassistant.components.media_player] Setting up fully_kiosk.media_player +2025-09-30 09:58:24.696 INFO (MainThread) [homeassistant.components.notify] Setting up fully_kiosk.notify +2025-09-30 09:58:24.697 INFO (MainThread) [homeassistant.components.number] Setting up fully_kiosk.number +2025-09-30 09:58:24.698 INFO (MainThread) [homeassistant.components.sensor] Setting up fully_kiosk.sensor +2025-09-30 09:58:24.700 INFO (MainThread) [homeassistant.components.switch] Setting up fully_kiosk.switch +2025-09-30 09:58:24.820 INFO (MainThread) [homeassistant.components.media_player] Setting up spotify.media_player +2025-09-30 09:58:24.822 INFO (MainThread) [homeassistant.components.sensor] Setting up switchbot.sensor +2025-09-30 09:58:24.850 INFO (MainThread) [homeassistant.components.sensor] Setting up switchbot.sensor +2025-09-30 09:58:24.852 INFO (MainThread) [homeassistant.components.sensor] Setting up switchbot.sensor +2025-09-30 09:58:24.854 INFO (MainThread) [homeassistant.components.sensor] Setting up switchbot.sensor +2025-09-30 09:58:24.857 INFO (MainThread) [homeassistant.components.sensor] Setting up switchbot.sensor +2025-09-30 09:58:24.870 INFO (MainThread) [homeassistant.components.sensor] Setting up switchbot.sensor +2025-09-30 09:58:24.873 INFO (MainThread) [homeassistant.components.sensor] Setting up switchbot.sensor +2025-09-30 09:58:26.126 INFO (MainThread) [homeassistant.setup] Setting up bermuda +2025-09-30 09:58:26.126 INFO (MainThread) [homeassistant.setup] Setup of domain bermuda took 0.00 seconds +2025-09-30 09:58:26.127 INFO (MainThread) [custom_components.bermuda] +------------------------------------------------------------------- +Bermuda BLE Trilateration +Version: 0.8.5 +This is a custom integration! +If you have any issues with this you need to open an issue here: +https://github.com/agittins/bermuda/issues +------------------------------------------------------------------- + +2025-09-30 09:58:27.300 INFO (MainThread) [homeassistant.setup] Setting up spotcast +2025-09-30 09:58:27.308 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up spook.binary_sensor +2025-09-30 09:58:27.308 INFO (MainThread) [homeassistant.components.button] Setting up spook.button +2025-09-30 09:58:27.308 INFO (MainThread) [homeassistant.components.event] Setting up spook.event +2025-09-30 09:58:27.308 INFO (MainThread) [homeassistant.components.number] Setting up spook.number +2025-09-30 09:58:27.308 INFO (MainThread) [homeassistant.components.select] Setting up spook.select +2025-09-30 09:58:27.309 INFO (MainThread) [homeassistant.components.sensor] Setting up spook.sensor +2025-09-30 09:58:27.309 INFO (MainThread) [homeassistant.components.switch] Setting up spook.switch +2025-09-30 09:58:27.312 INFO (MainThread) [homeassistant.setup] Setup of domain spotcast took 0.01 seconds +2025-09-30 09:58:27.322 INFO (MainThread) [homeassistant.components.sensor] Setting up bermuda.sensor +2025-09-30 09:58:27.324 INFO (MainThread) [homeassistant.components.device_tracker] Setting up bermuda.device_tracker +2025-09-30 09:58:27.324 INFO (MainThread) [homeassistant.components.number] Setting up bermuda.number +2025-09-30 09:58:27.330 WARNING (SyncWorker_6) [zhaquirks] Loaded custom quirks. Please contribute them to https://github.com/zigpy/zha-device-handlers +2025-09-30 09:58:27.483 INFO (MainThread) [homeassistant.setup] Setting up time +2025-09-30 09:58:27.483 INFO (MainThread) [homeassistant.setup] Setup of domain time took 0.00 seconds +2025-09-30 09:58:27.484 INFO (MainThread) [homeassistant.components.time] Setting up spook.time +2025-09-30 09:58:28.314 INFO (MainThread) [homeassistant.components.number] Setting up homekit_controller.number +2025-09-30 09:58:28.315 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up homekit_controller.binary_sensor +2025-09-30 09:58:28.317 INFO (MainThread) [homeassistant.components.climate] Setting up homekit_controller.climate +2025-09-30 09:58:28.318 INFO (MainThread) [homeassistant.components.button] Setting up homekit_controller.button +2025-09-30 09:58:28.320 INFO (MainThread) [homeassistant.components.select] Setting up homekit_controller.select +2025-09-30 09:58:28.321 INFO (MainThread) [homeassistant.components.sensor] Setting up homekit_controller.sensor +2025-09-30 09:58:28.709 INFO (MainThread) [homeassistant.components.sensor] Setting up discogs_sync.sensor +2025-09-30 09:58:28.714 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up discogs_sync.binary_sensor +2025-09-30 09:58:28.715 INFO (MainThread) [homeassistant.components.button] Setting up discogs_sync.button +2025-09-30 09:58:28.716 INFO (MainThread) [homeassistant.components.select] Setting up discogs_sync.select +2025-09-30 09:58:29.831 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Return is online +2025-09-30 09:58:31.144 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Return is online +2025-09-30 09:58:36.679 INFO (MainThread) [zigpy.device] [0x0000] Requesting 'Node Descriptor' +2025-09-30 09:58:36.703 INFO (MainThread) [zigpy.device] [0x0000] Got Node Descriptor: NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=0, maximum_buffer_size=80, maximum_incoming_transfer_size=160, server_mask=11265, maximum_outgoing_transfer_size=160, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=True, *is_coordinator=True, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=False, *is_security_capable=False) +2025-09-30 09:58:36.703 INFO (MainThread) [zigpy.device] [0x0000] Discovering endpoints +2025-09-30 09:58:36.716 INFO (MainThread) [zigpy.device] [0x0000] Discovered endpoints: [2, 1] +2025-09-30 09:58:36.716 INFO (MainThread) [zigpy.device] [0x0000] Initializing endpoints [>, >] +2025-09-30 09:58:36.716 INFO (MainThread) [zigpy.endpoint] [0x0000:2] Discovering endpoint information +2025-09-30 09:58:36.732 INFO (MainThread) [zigpy.endpoint] [0x0000:2] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=2, profile=49246, device_type=2080, device_version=0, input_clusters=[0], output_clusters=[]) +2025-09-30 09:58:36.733 INFO (MainThread) [zigpy.endpoint] [0x0000:1] Discovering endpoint information +2025-09-30 09:58:36.749 INFO (MainThread) [zigpy.endpoint] [0x0000:1] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=1024, device_version=0, input_clusters=[0, 6, 10, 25, 1281], output_clusters=[1, 32, 1280, 1282]) +2025-09-30 09:58:36.749 INFO (MainThread) [zigpy.device] [0x0000] Already have model and manufacturer info +2025-09-30 09:58:36.749 INFO (MainThread) [zigpy.device] [0x0000] Discovered basic device information for +2025-09-30 09:58:36.750 INFO (MainThread) [zigpy_znp.zigbee.application] Permitting joins for 0 seconds +2025-09-30 09:58:36.885 INFO (MainThread) [zha.application.gateway] Loading group with id: 0x0002 +2025-09-30 09:58:36.885 INFO (MainThread) [zha.application.discovery] Creating entity : for group Everett's Overhead Light +2025-09-30 09:58:36.887 INFO (MainThread) [zha.application.gateway] Loading group with id: 0xc9bc +2025-09-30 09:58:36.967 INFO (MainThread) [homeassistant.setup] Setting up alarm_control_panel +2025-09-30 09:58:36.967 INFO (MainThread) [homeassistant.setup] Setup of domain alarm_control_panel took 0.00 seconds +2025-09-30 09:58:36.968 INFO (MainThread) [homeassistant.components.alarm_control_panel] Setting up zha.alarm_control_panel +2025-09-30 09:58:36.968 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up zha.binary_sensor +2025-09-30 09:58:36.968 INFO (MainThread) [homeassistant.components.button] Setting up zha.button +2025-09-30 09:58:36.968 INFO (MainThread) [homeassistant.components.climate] Setting up zha.climate +2025-09-30 09:58:36.968 INFO (MainThread) [homeassistant.components.cover] Setting up zha.cover +2025-09-30 09:58:36.968 INFO (MainThread) [homeassistant.components.device_tracker] Setting up zha.device_tracker +2025-09-30 09:58:36.969 INFO (MainThread) [homeassistant.components.fan] Setting up zha.fan +2025-09-30 09:58:36.969 INFO (MainThread) [homeassistant.components.light] Setting up zha.light +2025-09-30 09:58:36.969 INFO (MainThread) [homeassistant.components.lock] Setting up zha.lock +2025-09-30 09:58:36.970 INFO (MainThread) [homeassistant.components.number] Setting up zha.number +2025-09-30 09:58:36.970 INFO (MainThread) [homeassistant.components.select] Setting up zha.select +2025-09-30 09:58:36.970 INFO (MainThread) [homeassistant.components.sensor] Setting up zha.sensor +2025-09-30 09:58:36.970 INFO (MainThread) [homeassistant.components.siren] Setting up zha.siren +2025-09-30 09:58:36.970 INFO (MainThread) [homeassistant.components.switch] Setting up zha.switch +2025-09-30 09:58:36.970 INFO (MainThread) [homeassistant.components.update] Setting up zha.update +2025-09-30 09:58:37.097 INFO (MainThread) [homeassistant.setup] Setting up zha_toolkit +2025-09-30 09:58:37.097 DEBUG (MainThread) [custom_components.zha_toolkit] Setup services from async_setup +2025-09-30 09:58:37.097 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.execute +2025-09-30 09:58:37.097 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.add_group +2025-09-30 09:58:37.098 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.add_to_group +2025-09-30 09:58:37.098 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.all_routes_and_neighbours +2025-09-30 09:58:37.098 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.attr_read +2025-09-30 09:58:37.099 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.attr_write +2025-09-30 09:58:37.099 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.backup +2025-09-30 09:58:37.099 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.bind_group +2025-09-30 09:58:37.099 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.bind_ieee +2025-09-30 09:58:37.100 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.binds_get +2025-09-30 09:58:37.100 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.binds_remove_all +2025-09-30 09:58:37.100 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.conf_report +2025-09-30 09:58:37.100 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.conf_report_read +2025-09-30 09:58:37.101 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_add_key +2025-09-30 09:58:37.101 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_backup +2025-09-30 09:58:37.101 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_clear_keys +2025-09-30 09:58:37.101 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_get_config_value +2025-09-30 09:58:37.101 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_get_ieee_by_nwk +2025-09-30 09:58:37.101 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_get_keys +2025-09-30 09:58:37.102 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_get_policy +2025-09-30 09:58:37.102 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_get_token +2025-09-30 09:58:37.102 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_get_value +2025-09-30 09:58:37.102 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_set_channel +2025-09-30 09:58:37.103 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ezsp_start_mfg +2025-09-30 09:58:37.103 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.get_groups +2025-09-30 09:58:37.103 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.get_routes_and_neighbours +2025-09-30 09:58:37.103 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.get_zll_groups +2025-09-30 09:58:37.104 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ha_set_state +2025-09-30 09:58:37.104 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.zha_devices +2025-09-30 09:58:37.104 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.handle_join +2025-09-30 09:58:37.104 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ieee_ping +2025-09-30 09:58:37.104 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.leave +2025-09-30 09:58:37.105 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.misc_reinitialize +2025-09-30 09:58:37.105 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.misc_settime +2025-09-30 09:58:37.105 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.ota_notify +2025-09-30 09:58:37.105 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.rejoin +2025-09-30 09:58:37.105 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.register_services +2025-09-30 09:58:37.106 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.remove_all_groups +2025-09-30 09:58:37.106 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.remove_from_group +2025-09-30 09:58:37.106 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.remove_group +2025-09-30 09:58:37.106 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.scan_device +2025-09-30 09:58:37.107 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.tuya_magic +2025-09-30 09:58:37.107 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.unbind_coordinator +2025-09-30 09:58:37.107 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.unbind_group +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.zcl_cmd +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.zdo_flood_parent_annce +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.zdo_join_with_code +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.zdo_scan_now +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.zdo_update_nwk_id +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.znp_backup +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.znp_nvram_backup +2025-09-30 09:58:37.108 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.znp_nvram_reset +2025-09-30 09:58:37.109 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.znp_nvram_restore +2025-09-30 09:58:37.109 DEBUG (MainThread) [custom_components.zha_toolkit] Add service zha_toolkit.znp_restore +2025-09-30 09:58:37.109 DEBUG (MainThread) [custom_components.zha_toolkit.utils] Read version from /config/custom_components/zha_toolkit/manifest.json 1757593412.167356<>0.0 +2025-09-30 09:58:37.119 INFO (MainThread) [homeassistant.setup] Setup of domain zha_toolkit took 0.02 seconds +2025-09-30 09:58:37.122 INFO (MainThread) [homeassistant.setup] Setting up zha_device_info +2025-09-30 09:58:37.122 INFO (MainThread) [homeassistant.setup] Setup of domain zha_device_info took 0.00 seconds +2025-09-30 09:58:37.147 INFO (MainThread) [homeassistant.components.sensor] Setting up zha_device_info.sensor +2025-09-30 09:58:37.189 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up zha_device_info.binary_sensor +2025-09-30 09:58:37.530 INFO (MainThread) [homeassistant.setup] Setting up automation +2025-09-30 09:58:37.540 INFO (MainThread) [homeassistant.setup] Setup of domain automation took 0.01 seconds +2025-09-30 09:58:37.557 INFO (MainThread) [homeassistant.bootstrap] Home Assistant initialized in 22.75s +2025-09-30 09:58:37.557 INFO (MainThread) [homeassistant.core] Starting Home Assistant 2025.9.4 +2025-09-30 09:58:37.576 INFO (MainThread) [homeassistant.setup] Setting up google_assistant +2025-09-30 09:58:37.577 INFO (MainThread) [custom_components.hacs] Stage changed: startup +2025-09-30 09:58:37.577 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.577 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.578 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.578 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.578 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.578 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.579 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.579 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.580 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.580 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.581 INFO (MainThread) [homeassistant.components.template.coordinator] Initialized trigger +2025-09-30 09:58:37.637 INFO (MainThread) [custom_components.hacs] Loading removed repositories +2025-09-30 09:58:37.638 INFO (MainThread) [homeassistant.setup] Setup of domain google_assistant took 0.06 seconds +2025-09-30 09:58:37.703 INFO (MainThread) [custom_components.hacs] Starting removal +2025-09-30 09:58:38.078 INFO (MainThread) [custom_components.hacs] Loading known repositories +2025-09-30 09:58:38.267 INFO (MainThread) [custom_components.hacs] Stage changed: running +2025-09-30 09:58:40.152 INFO (SyncWorker_12) [homeassistant.loader] Loaded ipp from homeassistant.components.ipp +2025-09-30 09:58:40.153 INFO (SyncWorker_2) [homeassistant.loader] Loaded apple_tv from homeassistant.components.apple_tv +2025-09-30 09:58:40.243 INFO (MainThread) [homeassistant.components.automation.lock_the_front_door] Initialized trigger Lock the Front Door +2025-09-30 09:58:40.243 INFO (MainThread) [homeassistant.components.automation.bedroom_light] Initialized trigger Bedroom Light +2025-09-30 09:58:40.244 INFO (MainThread) [homeassistant.components.automation.replace_front_door_lock_batteries] Initialized trigger Replace Front Door Lock Batteries +2025-09-30 09:58:40.245 INFO (MainThread) [homeassistant.components.automation.afternoon_living_room_lights] Initialized trigger Living Room Lights On and Off +2025-09-30 09:58:40.246 INFO (MainThread) [homeassistant.components.automation.elinore_bedtime_light] Initialized trigger Elinore Light On and Off +2025-09-30 09:58:40.246 INFO (MainThread) [homeassistant.components.automation.everett_s_light_on_and_off] Initialized trigger Everett's Light On and Off +2025-09-30 09:58:40.247 INFO (MainThread) [homeassistant.components.automation.elinore_s_remote] Initialized trigger Elinore's Remote +2025-09-30 09:58:40.247 INFO (MainThread) [homeassistant.components.automation.everett_s_remote_on] Initialized trigger Everett's Remote +2025-09-30 09:58:40.248 INFO (MainThread) [homeassistant.components.automation.everett_s_light_turned_on] Initialized trigger Kids' Light Turned On +2025-09-30 09:58:40.248 INFO (MainThread) [homeassistant.components.automation.kids_remote_use] Initialized trigger Kids Remote Use +2025-09-30 09:58:40.248 INFO (MainThread) [homeassistant.components.automation.kids_remote_low_battery] Initialized trigger Kids Remote Low Battery +2025-09-30 09:58:40.249 INFO (MainThread) [homeassistant.components.automation.front_door_light] Exterior Lights : Running automation actions +2025-09-30 09:58:40.249 INFO (MainThread) [homeassistant.components.automation.front_door_light] Exterior Lights : Executing step assigning variables +2025-09-30 09:58:40.253 INFO (MainThread) [homeassistant.components.automation.front_door_light] Initialized trigger Exterior Lights +2025-09-30 09:58:40.254 INFO (MainThread) [homeassistant.components.automation.chest_freezer_no_power] Initialized trigger Chest Freezer Status Checks +2025-09-30 09:58:40.254 INFO (MainThread) [homeassistant.components.automation.everett_s_dance_party] Initialized trigger Everett's Dance Party +2025-09-30 09:58:40.254 INFO (MainThread) [homeassistant.components.automation.washer_power_monitoring] Initialized trigger Laundry Notifications +2025-09-30 09:58:40.254 INFO (MainThread) [homeassistant.components.automation.water_heater_leak] Initialized trigger Water Leak Detectors +2025-09-30 09:58:40.255 INFO (MainThread) [homeassistant.components.automation.rtl_433_frequency_switch] Initialized trigger rtl_433 Frequency Switch +2025-09-30 09:58:40.257 INFO (MainThread) [homeassistant.components.automation.automation_36] Initialized trigger Elinore's LED Light Strip +2025-09-30 09:58:40.257 INFO (MainThread) [homeassistant.components.automation.automation_37] Initialized trigger Elinore's Dance Party +2025-09-30 09:58:40.261 INFO (MainThread) [homeassistant.components.automation.everett_s_led_light] Initialized trigger Everett's LED Light Strip +2025-09-30 09:58:40.261 INFO (MainThread) [homeassistant.components.automation.elinore_timer_coordination] Initialized trigger Elinore Timer Coordination +2025-09-30 09:58:40.262 INFO (MainThread) [homeassistant.components.automation.everett_timer_coordination] Initialized trigger Everett Timer Coordination +2025-09-30 09:58:40.262 INFO (MainThread) [homeassistant.components.automation.breezeway_light] Initialized trigger Breezeway Light +2025-09-30 09:58:40.263 INFO (MainThread) [homeassistant.components.automation.kitchen_island_light] Initialized trigger Kitchen Island Light +2025-09-30 09:58:40.263 INFO (MainThread) [homeassistant.components.automation.aqi_alerts] Initialized trigger AQI Alerts +2025-09-30 09:58:40.263 INFO (MainThread) [homeassistant.components.automation.unavailable_devices_alert] Initialized trigger Unavailable Devices Alert +2025-09-30 09:58:40.264 INFO (MainThread) [homeassistant.components.automation.office_ups_battery_charge_status] Initialized trigger Office UPS Battery Charge Status +2025-09-30 09:58:40.264 INFO (MainThread) [homeassistant.components.automation.vacuum_bin_full] Initialized trigger Hygeia Notifications +2025-09-30 09:58:40.264 INFO (MainThread) [homeassistant.components.automation.welcome_home_at_night] Initialized trigger Welcome Home at Night +2025-09-30 09:58:40.264 INFO (MainThread) [homeassistant.components.automation.hestia_target_temperature_changed] Initialized trigger Hestia target temperature changed +2025-09-30 09:58:40.265 INFO (MainThread) [homeassistant.components.automation.quote_and_pokemon_of_the_day_sensor_update] Initialized trigger Of The Day sensors updater +2025-09-30 09:58:40.265 INFO (MainThread) [homeassistant.components.automation.guest_login] Initialized trigger Guest Login +2025-09-30 09:58:40.266 INFO (MainThread) [homeassistant.components.automation.living_room_fan_light] Initialized trigger Living Room Ceiling Fan and Light +2025-09-30 09:58:40.266 INFO (MainThread) [homeassistant.components.automation.bus_reminder] Initialized trigger Bus Reminder +2025-09-30 09:58:40.266 INFO (MainThread) [homeassistant.components.automation.imessage_notifications] Initialized trigger imessage notifications +2025-09-30 09:58:40.266 INFO (MainThread) [homeassistant.components.automation.send_imessage_2] Initialized trigger Send iMessage +2025-09-30 09:58:40.266 INFO (MainThread) [homeassistant.components.automation.teethbrushing] Initialized trigger Teethbrushing +2025-09-30 09:58:40.266 INFO (MainThread) [homeassistant.components.automation.josh_watch_charged] Initialized trigger Josh Watch Charged +2025-09-30 09:58:40.267 INFO (MainThread) [homeassistant.components.automation.christmas_entities] Initialized trigger Christmas Entities +2025-09-30 09:58:40.267 INFO (MainThread) [homeassistant.components.automation.frigate_notifications_unmuter] Initialized trigger Frigate Notifications Unmuter +2025-09-30 09:58:40.267 INFO (MainThread) [homeassistant.components.automation.breezeway_light_decoupled_test] Initialized trigger Fun Fact of the Day +2025-09-30 09:58:40.267 INFO (MainThread) [homeassistant.components.automation.plants] Initialized trigger Plants +2025-09-30 09:58:40.267 INFO (MainThread) [homeassistant.components.automation.unlock_front_door] Initialized trigger Unlock front door +2025-09-30 09:58:40.268 INFO (MainThread) [homeassistant.components.automation.hygeia_vacuum_schedule] Initialized trigger Hygeia Vacuum Schedule +2025-09-30 09:58:40.268 INFO (MainThread) [homeassistant.components.automation.onkyo_receiver_source_selection] Initialized trigger Onkyo Receiver Source Selection +2025-09-30 09:58:40.268 INFO (MainThread) [homeassistant.components.automation.hestia_filter_usage] Initialized trigger Hestia Filter Usage +2025-09-30 09:58:40.271 INFO (MainThread) [homeassistant.components.automation.frigate_notifications_0_14_0_2w] Initialized trigger Frigate Notifications (0.14.0.2w) +2025-09-30 09:58:40.271 INFO (MainThread) [homeassistant.components.automation.basement_tv_notifications] Initialized trigger Basement TV notifications +2025-09-30 09:58:40.272 INFO (MainThread) [homeassistant.components.automation.birdnet_go_detection_check] Initialized trigger Birdnet-Go Detection Check +2025-09-30 09:58:40.273 INFO (MainThread) [homeassistant.components.automation.cat_feeder] Initialized trigger Cat Feeders +2025-09-30 09:58:40.273 INFO (MainThread) [homeassistant.components.automation.cat_counter] Initialized trigger Cat Counter +2025-09-30 09:58:40.273 INFO (MainThread) [homeassistant.components.automation.doorbell_notifications] Initialized trigger Doorbell Notifications +2025-09-30 09:58:40.273 INFO (MainThread) [homeassistant.components.automation.pacifica] Initialized trigger Pacifica +2025-09-30 09:58:45.784 INFO (MainThread) [homeassistant.components.mqtt.client] MQTT client initialized, birth message sent +2025-09-30 09:58:51.878 WARNING (zeroconf-ServiceBrowser-_googlecast._tcp-144) [pychromecast.dial] Failed to determine cast type for host () (services:{MDNSServiceInfo(name='Onkyo-TX-NR656-77fee09703865d8d4fe76314db505429._googlecast._tcp.local.')}) +2025-09-30 09:58:51.878 INFO (zeroconf-ServiceBrowser-_googlecast._tcp-144) [homeassistant.components.cast.helpers] Fetched cast details for unknown model 'Onkyo TX-NR656' manufacturer: 'Unknown manufacturer', type: 'cast'. Please create a bug report at https://github.com/home-assistant/core/issues?q=is%3Aopen+is%3Aissue+label%3A%22integration%3A+cast%22 +2025-09-30 09:59:00.135 INFO (MainThread) [homeassistant.components.automation.hestia_filter_usage] Hestia Filter Usage: Running automation actions +2025-09-30 09:59:18.981 INFO (MainThread) [hass_nabucasa.google_report_state] Connected +2025-09-30 09:59:21.925 ERROR (Thread-14) [pychromecast.socket_client] [Onkyo TX-NR656 E30A9F(192.168.16.81):8009] Failed to connect to service MDNSServiceInfo(name='Onkyo-TX-NR656-77fee09703865d8d4fe76314db505429._googlecast._tcp.local.'), retrying in 5.0s +2025-09-30 09:59:29.302 INFO (MainThread) [homeassistant.components.automation.unavailable_devices_alert] Unavailable Devices Alert: Running automation actions +2025-09-30 09:59:33.735 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Return is online +2025-09-30 10:00:00.370 INFO (MainThread) [homeassistant.helpers.script.trigger_update_coordinator] Trigger Update Coordinator: Running template script +2025-09-30 10:00:00.370 INFO (MainThread) [homeassistant.helpers.script.trigger_update_coordinator] Trigger Update Coordinator: Executing step call service +2025-09-30 10:00:30.163 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:01:23.808 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Supply is online +2025-09-30 10:01:23.810 INFO (MainThread) [habluetooth.wrappers] C5:B3:4D:63:9C:52 - WoSensorTH: Found 4 connection path(s), preferred order: hci0 (44:A3:BB:49:3E:68) (RSSI=-77) (failures=0) (in_progress=0) (slots=5/5 free) (score=-77.0), btproxy3 (D8:3B:DA:A4:50:66) (RSSI=-91) (failures=0) (in_progress=0) (slots=3/3 free) (score=-91.0), bobacat-display (84:FC:E6:70:70:59) (RSSI=-95) (failures=0) (in_progress=0) (slots=3/3 free) (score=-95.0), btproxy2 (0C:B8:15:C4:8E:EE) (RSSI=-99) (failures=0) (in_progress=0) (slots=3/3 free) (score=-99.0) +2025-09-30 10:01:25.179 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:02:00.404 INFO (MainThread) [homeassistant.components.automation.cat_feeder] Cat Feeders: Running automation actions +2025-09-30 10:02:00.406 INFO (MainThread) [homeassistant.components.automation.cat_feeder] Cat Feeders: Choose at step 1: choice 5: Running automation actions +2025-09-30 10:02:00.407 INFO (MainThread) [homeassistant.components.automation.cat_feeder] Cat Feeders: Choose at step 1: choice 5: Executing step clear old unavailable notification first +2025-09-30 10:02:00.568 INFO (MainThread) [homeassistant.components.mobile_app.notify] mobile_app push notification rate limits for josh: 0 sent, 500 allowed, 0 errors, resets in 9:57:59 +2025-09-30 10:02:00.569 INFO (MainThread) [homeassistant.components.automation.cat_feeder] Cat Feeders: Choose at step 1: choice 5: Executing step clear old available notification first +2025-09-30 10:02:00.716 INFO (MainThread) [homeassistant.components.mobile_app.notify] mobile_app push notification rate limits for josh: 0 sent, 500 allowed, 0 errors, resets in 9:57:59 +2025-09-30 10:02:00.716 INFO (MainThread) [homeassistant.components.automation.cat_feeder] Cat Feeders: Choose at step 1: choice 5: Executing step call service +2025-09-30 10:02:00.888 INFO (MainThread) [homeassistant.components.mobile_app.notify] mobile_app push notification rate limits for josh: 0 sent, 500 allowed, 0 errors, resets in 9:57:59 +2025-09-30 10:02:20.471 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:03:00.115 INFO (MainThread) [homeassistant.components.automation.afternoon_living_room_lights] Living Room Lights On and Off: Running automation actions +2025-09-30 10:03:15.489 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:03:17.560 INFO (MainThread) [custom_components.openplantbook.uploader] Plant-sensors data upload initiated +2025-09-30 10:03:21.815 INFO (MainThread) [custom_components.openplantbook.uploader] Uploading data from 4 sensors was successful +2025-09-30 10:03:43.945 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Forest Hills is online +2025-09-30 10:04:19.899 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:05:14.911 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:05:16.680 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Garage is online +2025-09-30 10:06:09.930 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:06:13.653 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Forest Hills is online +2025-09-30 10:07:22.217 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:07:54.283 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Hallway is online +2025-09-30 10:08:17.229 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:09:00.111 INFO (MainThread) [homeassistant.components.automation.hestia_filter_usage] Hestia Filter Usage: Running automation actions +2025-09-30 10:09:21.885 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:09:30.402 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Return is online +2025-09-30 10:10:16.903 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:11:23.706 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Supply is online +2025-09-30 10:11:34.495 INFO (MainThread) [hass_nabucasa.google_report_state] Timeout while waiting to receive message +2025-09-30 10:11:48.315 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Hallway is online +2025-09-30 10:11:59.819 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device HVAC Supply is online +2025-09-30 10:11:59.970 INFO (MainThread) [homeassistant.components.switchbot.coordinator] Device Forest Hills is online +2025-09-30 10:12:10.858 INFO (SyncWorker_0) [homeassistant.loader] Loaded dlna_dms from homeassistant.components.dlna_dms +2025-09-30 10:12:10.859 INFO (SyncWorker_0) [homeassistant.loader] Loaded opower from homeassistant.components.opower +2025-09-30 10:12:32.331 DEBUG (MainThread) [custom_components.lionel_controller] Establishing connection to FC:1F:C3:9F:A5:4A +2025-09-30 10:12:32.332 INFO (MainThread) [habluetooth.wrappers] FC:1F:C3:9F:A5:4A - LC0109BD: Found 4 connection path(s), preferred order: hci0 (44:A3:BB:49:3E:68) (RSSI=-70) (failures=0) (in_progress=0) (slots=5/5 free) (score=-70.0), btproxy2 (0C:B8:15:C4:8E:EE) (RSSI=-87) (failures=0) (in_progress=0) (slots=3/3 free) (score=-87.0), btproxy3 (D8:3B:DA:A4:50:66) (RSSI=-91) (failures=0) (in_progress=0) (slots=3/3 free) (score=-91.0), btproxy1 (30:C6:F7:05:5F:62) (RSSI=-101) (failures=0) (in_progress=0) (slots=3/3 free) (score=-101.0) +2025-09-30 10:12:32.808 DEBUG (MainThread) [custom_components.lionel_controller] Read _model_number: LionChief +2025-09-30 10:12:32.842 DEBUG (MainThread) [custom_components.lionel_controller] Read _serial_number: LC0139836 +2025-09-30 10:12:32.877 DEBUG (MainThread) [custom_components.lionel_controller] Read _firmware_revision: 1.1.0 +2025-09-30 10:12:32.898 DEBUG (MainThread) [custom_components.lionel_controller] Read _hardware_revision: 1.00 +2025-09-30 10:12:32.921 DEBUG (MainThread) [custom_components.lionel_controller] Read _software_revision: 0.0.0 +2025-09-30 10:12:32.943 DEBUG (MainThread) [custom_components.lionel_controller] Read _manufacturer_name: Lionel +2025-09-30 10:12:32.944 INFO (MainThread) [custom_components.lionel_controller] === BLE Service Discovery for FC:1F:C3:9F:A5:4A === +2025-09-30 10:12:32.944 INFO (MainThread) [custom_components.lionel_controller] Found 5 services +2025-09-30 10:12:32.944 INFO (MainThread) [custom_components.lionel_controller] Service 1: Battery Service (UUID: 0000180f-0000-1000-8000-00805f9b34fb) +2025-09-30 10:12:32.944 INFO (MainThread) [custom_components.lionel_controller] Found 0 characteristics in this service +2025-09-30 10:12:32.944 INFO (MainThread) [custom_components.lionel_controller] Service 2: Generic Access Profile (UUID: 00001800-0000-1000-8000-00805f9b34fb) +2025-09-30 10:12:32.944 INFO (MainThread) [custom_components.lionel_controller] Char 1: Central Address Resolution (UUID: 00002aa6-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:32.944 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:32.967 INFO (MainThread) [custom_components.lionel_controller] Value (text): '' +2025-09-30 10:12:32.968 INFO (MainThread) [custom_components.lionel_controller] Char 2: Appearance (UUID: 00002a01-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:32.968 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:32.988 INFO (MainThread) [custom_components.lionel_controller] Value (text): '' +2025-09-30 10:12:32.988 INFO (MainThread) [custom_components.lionel_controller] Char 3: Peripheral Preferred Connection Parameters (UUID: 00002a04-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:32.988 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.011 INFO (MainThread) [custom_components.lionel_controller] Value (hex): 06000c0000009001 +2025-09-30 10:12:33.011 INFO (MainThread) [custom_components.lionel_controller] Char 4: Device Name (UUID: 00002a00-0000-1000-8000-00805f9b34fb) [READ, WRITE] +2025-09-30 10:12:33.011 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.034 INFO (MainThread) [custom_components.lionel_controller] Value (text): 'LC0109BD-4AA5' +2025-09-30 10:12:33.034 INFO (MainThread) [custom_components.lionel_controller] Found 4 characteristics in this service +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Service 3: Generic Attribute Profile (UUID: 00001801-0000-1000-8000-00805f9b34fb) +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Found 0 characteristics in this service +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Service 4: Unknown (UUID: e20a39f4-73f5-4bc4-a12f-17d1ad07a961) +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Char 1: Unknown (UUID: 08590f7e-db05-467e-8757-72f6faeb13d4) [WRITE] +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] *** POTENTIAL LIONCHIEF WRITE CHARACTERISTIC *** +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Char 2: Unknown (UUID: 08590f7e-db05-467e-8757-72f6faeb14d3) [NOTIFY] +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] *** POTENTIAL LIONCHIEF NOTIFY CHARACTERISTIC *** +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Char 3: Unknown (UUID: 08590f7e-db05-467e-8757-72f6faeb14d5) [] +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Char 4: Unknown (UUID: 09590f7e-db05-467e-8757-72f6faeb14d5) [] +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Char 5: Unknown (UUID: 08590f7e-db05-467e-8757-72f6faeb15d4) [WRITE, WRITE-NO-RESP] +2025-09-30 10:12:33.035 INFO (MainThread) [custom_components.lionel_controller] Found 5 characteristics in this service +2025-09-30 10:12:33.036 INFO (MainThread) [custom_components.lionel_controller] Service 5: Device Information (UUID: 0000180a-0000-1000-8000-00805f9b34fb) +2025-09-30 10:12:33.036 INFO (MainThread) [custom_components.lionel_controller] Char 1: Hardware Revision String (UUID: 00002a27-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.036 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.067 INFO (MainThread) [custom_components.lionel_controller] Value (text): '1.00' +2025-09-30 10:12:33.067 INFO (MainThread) [custom_components.lionel_controller] Char 2: Model Number String (UUID: 00002a24-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.067 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.101 INFO (MainThread) [custom_components.lionel_controller] Value (text): 'LionChief' +2025-09-30 10:12:33.101 INFO (MainThread) [custom_components.lionel_controller] Char 3: Manufacturer Name String (UUID: 00002a29-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.101 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.123 INFO (MainThread) [custom_components.lionel_controller] Value (text): 'Lionel' +2025-09-30 10:12:33.123 INFO (MainThread) [custom_components.lionel_controller] Char 4: System ID (UUID: 00002a23-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.123 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.146 INFO (MainThread) [custom_components.lionel_controller] Value (text): 'Y\00\00\00\00V4' +2025-09-30 10:12:33.146 INFO (MainThread) [custom_components.lionel_controller] Char 5: Serial Number String (UUID: 00002a25-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.146 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.167 INFO (MainThread) [custom_components.lionel_controller] Value (text): 'LC0139836' +2025-09-30 10:12:33.168 INFO (MainThread) [custom_components.lionel_controller] Char 6: PnP ID (UUID: 00002a50-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.168 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.202 INFO (MainThread) [custom_components.lionel_controller] Value (text): 'Y\00\00' +2025-09-30 10:12:33.202 INFO (MainThread) [custom_components.lionel_controller] Char 7: Firmware Revision String (UUID: 00002a26-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.202 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.228 INFO (MainThread) [custom_components.lionel_controller] Value (text): '1.1.0' +2025-09-30 10:12:33.228 INFO (MainThread) [custom_components.lionel_controller] Char 8: Software Revision String (UUID: 00002a28-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.228 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.257 INFO (MainThread) [custom_components.lionel_controller] Value (text): '0.0.0' +2025-09-30 10:12:33.257 INFO (MainThread) [custom_components.lionel_controller] Char 9: IEEE 11073-20601 Regulatory Cert. Data List (UUID: 00002a2a-0000-1000-8000-00805f9b34fb) [READ] +2025-09-30 10:12:33.257 DEBUG (MainThread) [custom_components.lionel_controller] Attempting to read characteristic value... +2025-09-30 10:12:33.293 INFO (MainThread) [custom_components.lionel_controller] Value (hex): fe006578706572696d656e74616c +2025-09-30 10:12:33.293 INFO (MainThread) [custom_components.lionel_controller] Found 9 characteristics in this service +2025-09-30 10:12:33.293 INFO (MainThread) [custom_components.lionel_controller] === End BLE Service Discovery === +2025-09-30 10:12:33.293 INFO (MainThread) [custom_components.lionel_controller] 🎯 DISCOVERED LIONCHIEF SERVICE: e20a39f4-73f5-4bc4-a12f-17d1ad07a961 +2025-09-30 10:12:33.293 INFO (MainThread) [custom_components.lionel_controller] 🎯 DISCOVERED WRITE CHARACTERISTIC: 08590f7e-db05-467e-8757-72f6faeb13d4 +2025-09-30 10:12:33.293 INFO (MainThread) [custom_components.lionel_controller] 🎯 DISCOVERED NOTIFY CHARACTERISTIC: 08590f7e-db05-467e-8757-72f6faeb14d3 +2025-09-30 10:12:33.326 INFO (MainThread) [custom_components.lionel_controller] 📡 Set up notifications on 08590f7e-db05-467e-8757-72f6faeb14d3 +2025-09-30 10:12:33.326 INFO (MainThread) [custom_components.lionel_controller] Connected to Lionel train at FC:1F:C3:9F:A5:4A +2025-09-30 10:12:33.326 INFO (MainThread) [custom_components.lionel_controller] Successfully connected to Lionel train at FC:1F:C3:9F:A5:4A +2025-09-30 10:12:33.326 INFO (MainThread) [homeassistant.components.number] Setting up lionel_controller.number +2025-09-30 10:12:33.330 INFO (MainThread) [homeassistant.components.switch] Setting up lionel_controller.switch +2025-09-30 10:12:33.333 INFO (MainThread) [homeassistant.components.button] Setting up lionel_controller.button +2025-09-30 10:12:33.337 INFO (MainThread) [homeassistant.components.binary_sensor] Setting up lionel_controller.binary_sensor diff --git a/hacs.json b/hacs.json new file mode 100644 index 0000000..4eb1470 --- /dev/null +++ b/hacs.json @@ -0,0 +1,7 @@ +{ + "name": "Lionel Train Controller", + "hacs": "1.32.0", + "domains": ["number", "switch", "button", "binary_sensor"], + "homeassistant": "2023.8.0", + "iot_class": "Local Push" +} \ No newline at end of file