From 82c99f81fca21402cb573b61709546c5694faa8b Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Sun, 5 Feb 2017 06:54:20 +0100 Subject: [PATCH] Fix validation of serial port on windows (#5749) * Fix validation of serial port on windows * Use pyserial to check serial ports. * Check that persistence file ends with either `.json` or `.pickle`. * Change fix to not rely on pyserial * Use generator expr instead of list comprehension --- homeassistant/components/mysensors.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/mysensors.py b/homeassistant/components/mysensors.py index 52b851d1983..4b4f1798d7f 100644 --- a/homeassistant/components/mysensors.py +++ b/homeassistant/components/mysensors.py @@ -7,6 +7,7 @@ https://home-assistant.io/components/sensor.mysensors/ import logging import os import socket +import sys import voluptuous as vol @@ -81,15 +82,37 @@ def has_all_unique_files(value): return value +def is_persistence_file(value): + """Validate that persistence file path ends in either .pickle or .json.""" + if value.endswith(('.json', '.pickle')): + return value + else: + raise vol.Invalid( + '{} does not end in either `.json` or `.pickle`'.format(value)) + + +def is_serial_port(value): + """Validate that value is a windows serial port or a unix device.""" + if sys.platform.startswith('win'): + ports = ('COM{}'.format(idx + 1) for idx in range(256)) + if value in ports: + return value + else: + raise vol.Invalid( + '{} is not a serial port'.format(value)) + else: + return cv.isdevice(value) + + CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ vol.Required(CONF_GATEWAYS): vol.All( cv.ensure_list, has_all_unique_files, [{ vol.Required(CONF_DEVICE): - vol.Any(cv.isdevice, MQTT_COMPONENT, is_socket_address), + vol.Any(MQTT_COMPONENT, is_socket_address, is_serial_port), vol.Optional(CONF_PERSISTENCE_FILE): - vol.All(cv.string, has_parent_dir), + vol.All(cv.string, is_persistence_file, has_parent_dir), vol.Optional( CONF_BAUD_RATE, default=DEFAULT_BAUD_RATE): cv.positive_int,