core/homeassistant/components/firmata/config_flow.py

57 lines
2.0 KiB
Python

"""Config flow to configure firmata component."""
import logging
from pymata_express.pymata_express_serial import serial
from homeassistant import config_entries
from homeassistant.const import CONF_NAME
from .board import get_board
from .const import CONF_SERIAL_PORT, DOMAIN
_LOGGER = logging.getLogger(__name__)
class FirmataFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a firmata config flow."""
VERSION = 1
async def async_step_import(self, import_config: dict):
"""Import a firmata board as a config entry.
This flow is triggered by `async_setup` for configured boards.
This will execute for any board that does not have a
config entry yet (based on entry_id). It validates a connection
and then adds the entry.
"""
name = f"serial-{import_config[CONF_SERIAL_PORT]}"
import_config[CONF_NAME] = name
# Connect to the board to verify connection and then shutdown
# If either fail then we cannot continue
_LOGGER.debug("Connecting to Firmata board %s to test connection", name)
try:
api = await get_board(import_config)
await api.shutdown()
except RuntimeError as err:
_LOGGER.error("Error connecting to PyMata board %s: %s", name, err)
return self.async_abort(reason="cannot_connect")
except serial.serialutil.SerialTimeoutException as err:
_LOGGER.error(
"Timeout writing to serial port for PyMata board %s: %s", name, err
)
return self.async_abort(reason="cannot_connect")
except serial.serialutil.SerialException as err:
_LOGGER.error(
"Error connecting to serial port for PyMata board %s: %s", name, err
)
return self.async_abort(reason="cannot_connect")
_LOGGER.debug("Connection test to Firmata board %s successful", name)
return self.async_create_entry(
title=import_config[CONF_NAME], data=import_config
)