mirror of
https://github.com/home-assistant/core.git
synced 2025-07-28 07:37:34 +00:00
Add full options to serial sensor platform (#34962)
Improve Serial sensor platform with full options for configuring the serial port. bytesize, parity, stopbits, xonxoff, rtscts, dsrdtr. The default values are unchanged so it is 100% compatible with previous config.
This commit is contained in:
parent
a2896b4764
commit
8ec5e53cf4
@ -17,9 +17,21 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
CONF_SERIAL_PORT = "serial_port"
|
CONF_SERIAL_PORT = "serial_port"
|
||||||
CONF_BAUDRATE = "baudrate"
|
CONF_BAUDRATE = "baudrate"
|
||||||
|
CONF_BYTESIZE = "bytesize"
|
||||||
|
CONF_PARITY = "parity"
|
||||||
|
CONF_STOPBITS = "stopbits"
|
||||||
|
CONF_XONXOFF = "xonxoff"
|
||||||
|
CONF_RTSCTS = "rtscts"
|
||||||
|
CONF_DSRDTR = "dsrdtr"
|
||||||
|
|
||||||
DEFAULT_NAME = "Serial Sensor"
|
DEFAULT_NAME = "Serial Sensor"
|
||||||
DEFAULT_BAUDRATE = 9600
|
DEFAULT_BAUDRATE = 9600
|
||||||
|
DEFAULT_BYTESIZE = serial_asyncio.serial.EIGHTBITS
|
||||||
|
DEFAULT_PARITY = serial_asyncio.serial.PARITY_NONE
|
||||||
|
DEFAULT_STOPBITS = serial_asyncio.serial.STOPBITS_ONE
|
||||||
|
DEFAULT_XONXOFF = False
|
||||||
|
DEFAULT_RTSCTS = False
|
||||||
|
DEFAULT_DSRDTR = False
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
@ -27,6 +39,33 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
|||||||
vol.Optional(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): cv.positive_int,
|
vol.Optional(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): cv.positive_int,
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
||||||
|
vol.Optional(CONF_BYTESIZE, default=DEFAULT_BYTESIZE): vol.In(
|
||||||
|
[
|
||||||
|
serial_asyncio.serial.FIVEBITS,
|
||||||
|
serial_asyncio.serial.SIXBITS,
|
||||||
|
serial_asyncio.serial.SEVENBITS,
|
||||||
|
serial_asyncio.serial.EIGHTBITS,
|
||||||
|
]
|
||||||
|
),
|
||||||
|
vol.Optional(CONF_PARITY, default=DEFAULT_PARITY): vol.In(
|
||||||
|
[
|
||||||
|
serial_asyncio.serial.PARITY_NONE,
|
||||||
|
serial_asyncio.serial.PARITY_EVEN,
|
||||||
|
serial_asyncio.serial.PARITY_ODD,
|
||||||
|
serial_asyncio.serial.PARITY_MARK,
|
||||||
|
serial_asyncio.serial.PARITY_SPACE,
|
||||||
|
]
|
||||||
|
),
|
||||||
|
vol.Optional(CONF_STOPBITS, default=DEFAULT_STOPBITS): vol.In(
|
||||||
|
[
|
||||||
|
serial_asyncio.serial.STOPBITS_ONE,
|
||||||
|
serial_asyncio.serial.STOPBITS_ONE_POINT_FIVE,
|
||||||
|
serial_asyncio.serial.STOPBITS_TWO,
|
||||||
|
]
|
||||||
|
),
|
||||||
|
vol.Optional(CONF_XONXOFF, default=DEFAULT_XONXOFF): cv.boolean,
|
||||||
|
vol.Optional(CONF_RTSCTS, default=DEFAULT_RTSCTS): cv.boolean,
|
||||||
|
vol.Optional(CONF_DSRDTR, default=DEFAULT_DSRDTR): cv.boolean,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -36,12 +75,29 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
|||||||
name = config.get(CONF_NAME)
|
name = config.get(CONF_NAME)
|
||||||
port = config.get(CONF_SERIAL_PORT)
|
port = config.get(CONF_SERIAL_PORT)
|
||||||
baudrate = config.get(CONF_BAUDRATE)
|
baudrate = config.get(CONF_BAUDRATE)
|
||||||
|
bytesize = config.get(CONF_BYTESIZE)
|
||||||
|
parity = config.get(CONF_PARITY)
|
||||||
|
stopbits = config.get(CONF_STOPBITS)
|
||||||
|
xonxoff = config.get(CONF_XONXOFF)
|
||||||
|
rtscts = config.get(CONF_RTSCTS)
|
||||||
|
dsrdtr = config.get(CONF_DSRDTR)
|
||||||
|
|
||||||
value_template = config.get(CONF_VALUE_TEMPLATE)
|
value_template = config.get(CONF_VALUE_TEMPLATE)
|
||||||
if value_template is not None:
|
if value_template is not None:
|
||||||
value_template.hass = hass
|
value_template.hass = hass
|
||||||
|
|
||||||
sensor = SerialSensor(name, port, baudrate, value_template)
|
sensor = SerialSensor(
|
||||||
|
name,
|
||||||
|
port,
|
||||||
|
baudrate,
|
||||||
|
bytesize,
|
||||||
|
parity,
|
||||||
|
stopbits,
|
||||||
|
xonxoff,
|
||||||
|
rtscts,
|
||||||
|
dsrdtr,
|
||||||
|
value_template,
|
||||||
|
)
|
||||||
|
|
||||||
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, sensor.stop_serial_read)
|
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, sensor.stop_serial_read)
|
||||||
async_add_entities([sensor], True)
|
async_add_entities([sensor], True)
|
||||||
@ -50,12 +106,30 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
|||||||
class SerialSensor(Entity):
|
class SerialSensor(Entity):
|
||||||
"""Representation of a Serial sensor."""
|
"""Representation of a Serial sensor."""
|
||||||
|
|
||||||
def __init__(self, name, port, baudrate, value_template):
|
def __init__(
|
||||||
|
self,
|
||||||
|
name,
|
||||||
|
port,
|
||||||
|
baudrate,
|
||||||
|
bytesize,
|
||||||
|
parity,
|
||||||
|
stopbits,
|
||||||
|
xonxoff,
|
||||||
|
rtscts,
|
||||||
|
dsrdtr,
|
||||||
|
value_template,
|
||||||
|
):
|
||||||
"""Initialize the Serial sensor."""
|
"""Initialize the Serial sensor."""
|
||||||
self._name = name
|
self._name = name
|
||||||
self._state = None
|
self._state = None
|
||||||
self._port = port
|
self._port = port
|
||||||
self._baudrate = baudrate
|
self._baudrate = baudrate
|
||||||
|
self._bytesize = bytesize
|
||||||
|
self._parity = parity
|
||||||
|
self._stopbits = stopbits
|
||||||
|
self._xonxoff = xonxoff
|
||||||
|
self._rtscts = rtscts
|
||||||
|
self._dsrdtr = dsrdtr
|
||||||
self._serial_loop_task = None
|
self._serial_loop_task = None
|
||||||
self._template = value_template
|
self._template = value_template
|
||||||
self._attributes = None
|
self._attributes = None
|
||||||
@ -63,17 +137,46 @@ class SerialSensor(Entity):
|
|||||||
async def async_added_to_hass(self):
|
async def async_added_to_hass(self):
|
||||||
"""Handle when an entity is about to be added to Home Assistant."""
|
"""Handle when an entity is about to be added to Home Assistant."""
|
||||||
self._serial_loop_task = self.hass.loop.create_task(
|
self._serial_loop_task = self.hass.loop.create_task(
|
||||||
self.serial_read(self._port, self._baudrate)
|
self.serial_read(
|
||||||
|
self._port,
|
||||||
|
self._baudrate,
|
||||||
|
self._bytesize,
|
||||||
|
self._parity,
|
||||||
|
self._stopbits,
|
||||||
|
self._xonxoff,
|
||||||
|
self._rtscts,
|
||||||
|
self._dsrdtr,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
async def serial_read(self, device, rate, **kwargs):
|
async def serial_read(
|
||||||
|
self,
|
||||||
|
device,
|
||||||
|
baudrate,
|
||||||
|
bytesize,
|
||||||
|
parity,
|
||||||
|
stopbits,
|
||||||
|
xonxoff,
|
||||||
|
rtscts,
|
||||||
|
dsrdtr,
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
"""Read the data from the port."""
|
"""Read the data from the port."""
|
||||||
logged_error = False
|
logged_error = False
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
reader, _ = await serial_asyncio.open_serial_connection(
|
reader, _ = await serial_asyncio.open_serial_connection(
|
||||||
url=device, baudrate=rate, **kwargs
|
url=device,
|
||||||
|
baudrate=baudrate,
|
||||||
|
bytesize=bytesize,
|
||||||
|
parity=parity,
|
||||||
|
stopbits=stopbits,
|
||||||
|
xonxoff=xonxoff,
|
||||||
|
rtscts=rtscts,
|
||||||
|
dsrdtr=dsrdtr,
|
||||||
|
**kwargs,
|
||||||
)
|
)
|
||||||
|
|
||||||
except SerialException as exc:
|
except SerialException as exc:
|
||||||
if not logged_error:
|
if not logged_error:
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user