|
2 | 2 | import voluptuous as vol |
3 | 3 | from homeassistant import config_entries |
4 | 4 | from homeassistant.core import callback |
5 | | -from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig |
| 5 | +from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig, SelectSelectorMode |
6 | 6 | from homeassistant.const import CONF_NAME |
7 | | -# from homeassistant.exceptions import HomeAssistantError |
8 | | - |
9 | | -from .const import CONF_DEVICE_TYPE, CONF_EXPERIMENTAL, DOMAIN, CONF_PGN_INCLUDE, CONF_PGN_EXCLUDE, CONF_PORT, CONF_IP, CONF_BAUDRATE, CONF_MODE, CONF_SERIAL_PORT, CONF_MODE_TCP, CONF_MODE_USB, CONF_MS_BETWEEN_UPDATES, CONF_EXCLUDE_AIS |
10 | 7 | import logging |
| 8 | +import homeassistant.helpers.config_validation as cv |
| 9 | + |
| 10 | +from .const import ( |
| 11 | + CONF_DEVICE_TYPE, |
| 12 | + CONF_EXPERIMENTAL, |
| 13 | + CONF_MANUFACTURER_CODES_EXCLUDE, |
| 14 | + CONF_MANUFACTURER_CODES_INCLUDE, |
| 15 | + DOMAIN, |
| 16 | + CONF_PGN_INCLUDE, |
| 17 | + CONF_PGN_EXCLUDE, |
| 18 | + CONF_PORT, |
| 19 | + CONF_IP, |
| 20 | + CONF_BAUDRATE, |
| 21 | + CONF_MODE, |
| 22 | + CONF_SERIAL_PORT, |
| 23 | + CONF_MODE_TCP, |
| 24 | + CONF_MODE_USB, |
| 25 | + CONF_MS_BETWEEN_UPDATES, |
| 26 | + CONF_EXCLUDE_AIS, |
| 27 | +) |
11 | 28 |
|
12 | 29 | _LOGGER = logging.getLogger(__name__) |
13 | 30 |
|
14 | | -class NetwrorkDeviceType(Enum): |
| 31 | +MANUFACTURER_CODES = [ |
| 32 | + {"value": "b_and_g", "label": "B & G"}, |
| 33 | + {"value": "garmin", "label": "Garmin"}, |
| 34 | + {"value": "mastervolt", "label": "Mastervolt"}, |
| 35 | + {"value": "victron", "label": "Victron Energy"} |
| 36 | +] |
| 37 | + |
| 38 | +class NetworkDeviceType(Enum): |
15 | 39 | """Enum for device types.""" |
16 | 40 | EBYTE = "EBYTE" |
17 | 41 | ACTISENSE = "Actisense" |
18 | 42 | YACHT_DEVICES = "Yacht Devices" |
19 | | - |
| 43 | + |
| 44 | +def get_manufacturer_selector(name: str) -> SelectSelector: |
| 45 | + """Create a manufacturer selector.""" |
| 46 | + return SelectSelector( |
| 47 | + SelectSelectorConfig( |
| 48 | + options=MANUFACTURER_CODES, |
| 49 | + mode=SelectSelectorMode.DROPDOWN, |
| 50 | + multiple=True, |
| 51 | + translation_key=name, |
| 52 | + ) |
| 53 | + ) |
20 | 54 |
|
21 | 55 | USB_DATA_SCHEMA = vol.Schema( |
22 | 56 | { |
23 | 57 | vol.Required(CONF_SERIAL_PORT, default="/dev/ttyUSB0"): str, |
24 | 58 | vol.Required(CONF_BAUDRATE, default=2000000): int, |
25 | 59 | vol.Optional(CONF_PGN_INCLUDE): str, |
26 | 60 | vol.Optional(CONF_PGN_EXCLUDE): str, |
27 | | - vol.Optional(CONF_EXCLUDE_AIS, default=True): bool, |
28 | 61 | vol.Optional(CONF_MS_BETWEEN_UPDATES, default=5000): int, |
| 62 | + vol.Optional(CONF_EXCLUDE_AIS, default=True): bool, |
| 63 | + vol.Optional(CONF_MANUFACTURER_CODES_INCLUDE): get_manufacturer_selector(CONF_MANUFACTURER_CODES_INCLUDE), |
| 64 | + vol.Optional(CONF_MANUFACTURER_CODES_EXCLUDE): get_manufacturer_selector(CONF_MANUFACTURER_CODES_EXCLUDE), |
29 | 65 | vol.Optional(CONF_EXPERIMENTAL): bool, |
30 | 66 | } |
31 | 67 | ) |
| 68 | + |
32 | 69 | TCP_DATA_SCHEMA = vol.Schema( |
33 | 70 | { |
34 | | - vol.Required(CONF_DEVICE_TYPE, default=NetwrorkDeviceType.EBYTE): vol.In([e.value for e in NetwrorkDeviceType]), |
| 71 | + vol.Required(CONF_DEVICE_TYPE, default=NetworkDeviceType.EBYTE.value): vol.In( |
| 72 | + [e.value for e in NetworkDeviceType] |
| 73 | + ), |
35 | 74 | vol.Required(CONF_IP, default="192.168.0.46"): str, |
36 | 75 | vol.Required(CONF_PORT, default=8881): int, |
37 | 76 | vol.Optional(CONF_PGN_INCLUDE): str, |
38 | 77 | vol.Optional(CONF_PGN_EXCLUDE): str, |
39 | | - vol.Optional(CONF_EXCLUDE_AIS, default=True): bool, |
40 | 78 | vol.Optional(CONF_MS_BETWEEN_UPDATES, default=5000): int, |
| 79 | + vol.Optional(CONF_EXCLUDE_AIS, default=True): bool, |
| 80 | + vol.Optional(CONF_MANUFACTURER_CODES_INCLUDE): get_manufacturer_selector(CONF_MANUFACTURER_CODES_INCLUDE), |
| 81 | + vol.Optional(CONF_MANUFACTURER_CODES_EXCLUDE): get_manufacturer_selector(CONF_MANUFACTURER_CODES_EXCLUDE), |
41 | 82 | vol.Optional(CONF_EXPERIMENTAL): bool, |
42 | 83 | } |
43 | 84 | ) |
@@ -127,6 +168,9 @@ async def async_step_options(self, user_input=None): |
127 | 168 | if CONF_PGN_INCLUDE in user_input and CONF_PGN_EXCLUDE in user_input: |
128 | 169 | errors[CONF_PGN_EXCLUDE] = "include_exclude_only_one" |
129 | 170 |
|
| 171 | + if len(user_input[CONF_MANUFACTURER_CODES_INCLUDE]) != 0 and len(user_input[CONF_MANUFACTURER_CODES_EXCLUDE]) != 0: |
| 172 | + errors[CONF_MANUFACTURER_CODES_EXCLUDE] = "include_exclude_only_one" |
| 173 | + |
130 | 174 | if len(errors) == 0: |
131 | 175 | new_data = self.data | user_input |
132 | 176 | _LOGGER.debug("No errors. Storing data: %s", new_data) |
@@ -178,6 +222,9 @@ async def async_step_init(self, user_input=None): |
178 | 222 | if CONF_PGN_INCLUDE in user_input and CONF_PGN_EXCLUDE in user_input: |
179 | 223 | errors[CONF_PGN_EXCLUDE] = "include_exclude_only_one" |
180 | 224 |
|
| 225 | + if len(user_input[CONF_MANUFACTURER_CODES_INCLUDE]) != 0 and len(user_input[CONF_MANUFACTURER_CODES_EXCLUDE]) != 0: |
| 226 | + errors[CONF_MANUFACTURER_CODES_EXCLUDE] = "include_exclude_only_one" |
| 227 | + |
181 | 228 | if len(errors) == 0: |
182 | 229 | new_data = user_input |
183 | 230 | # merge back the name and mode which are missing from this page |
|
0 commit comments