* Update pyrainbird to version 0.2.0 to fix zone number issue: - home-assistant/home-assistant/issues/24519 - jbarrancos/pyrainbird/issues/5 - https://community.home-assistant.io/t/rainbird-zone-switches-5-8-dont-correspond/104705 * requirements_all.txt regenerated * code formatting * pyrainbird version 0.3.0 * zone id * rainsensor return state * updating rainsensor * new version of pyrainbird * binary sensor state * quiet in check format * is_on instead of state for binary_sensor * no unit of measurement for binary sensor * no monitored conditions config * get keys of dict directly * removed redundant update of state * simplified switch * right states for switch * raindelay sensor * raindelay sensor * binary sensor state * binary sensor state * reorganized imports * doc on public method * reformatted * add irrigation service to rain bird, which allows you to set the duration * rebased on konikvranik and solved some feedback * add irrigation service to rain bird * sensor types to constants * synchronized register service * patform discovery * binary sensor as wrapper to sensor * version 0.4.0 * new config approach * sensors cleanup * bypass if no zones found * platform schema removed * Change config schema to list of controllers some small code improvements as suggested in CR: - dictionary acces by [] - just return instead of return False - import order - no optional parameter name * some small code improvements as suggested in CR: - supported platforms in constant - just return instead of return False - removed unused constant * No single controller configuration Co-Authored-By: Martin Hjelmare <marhje52@kth.se> * pyrainbird 0.4.1 * individual switch configuration * imports order * generate default name out of entity * trigger time required for controller * incorporated CR remarks: - constant fo rzones - removed SCAN_INTERVAL - detection of success on initialization - removed underscore - refactored if/else - empty line on end of file - hass as first parameter * import of library on top * refactored * Update homeassistant/components/rainbird/__init__.py Co-Authored-By: Martin Hjelmare <marhje52@kth.se> * validate time and set defaults * set defaults on right place * pylint bypass * iterate over values * codeowner * reverted changes: * irrigation time just as positive integer. Making it complex does make sense * zone edfaults fullfiled at runtime. There is no information about available zones in configuration time. * codeowners updated * accept timedelta in irrigation time * simplified time calculation * call total_seconds * irrigation time as seconds. * simplified schema
91 lines
2.6 KiB
Python
91 lines
2.6 KiB
Python
"""Support for Rain Bird Irrigation system LNK WiFi Module."""
|
|
import logging
|
|
|
|
from pyrainbird import RainbirdController
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components import binary_sensor, sensor, switch
|
|
from homeassistant.const import (
|
|
CONF_FRIENDLY_NAME,
|
|
CONF_HOST,
|
|
CONF_PASSWORD,
|
|
CONF_TRIGGER_TIME,
|
|
)
|
|
from homeassistant.helpers import discovery
|
|
import homeassistant.helpers.config_validation as cv
|
|
|
|
CONF_ZONES = "zones"
|
|
|
|
SUPPORTED_PLATFORMS = [switch.DOMAIN, sensor.DOMAIN, binary_sensor.DOMAIN]
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
RAINBIRD_CONTROLLER = "controller"
|
|
DATA_RAINBIRD = "rainbird"
|
|
DOMAIN = "rainbird"
|
|
|
|
SENSOR_TYPE_RAINDELAY = "raindelay"
|
|
SENSOR_TYPE_RAINSENSOR = "rainsensor"
|
|
# sensor_type [ description, unit, icon ]
|
|
SENSOR_TYPES = {
|
|
SENSOR_TYPE_RAINSENSOR: ["Rainsensor", None, "mdi:water"],
|
|
SENSOR_TYPE_RAINDELAY: ["Raindelay", None, "mdi:water-off"],
|
|
}
|
|
|
|
TRIGGER_TIME_SCHEMA = vol.All(
|
|
cv.time_period, cv.positive_timedelta, lambda td: (td.total_seconds() // 60)
|
|
)
|
|
|
|
ZONE_SCHEMA = vol.Schema(
|
|
{
|
|
vol.Optional(CONF_FRIENDLY_NAME): cv.string,
|
|
vol.Optional(CONF_TRIGGER_TIME): TRIGGER_TIME_SCHEMA,
|
|
}
|
|
)
|
|
CONTROLLER_SCHEMA = vol.Schema(
|
|
{
|
|
vol.Required(CONF_HOST): cv.string,
|
|
vol.Required(CONF_PASSWORD): cv.string,
|
|
vol.Required(CONF_TRIGGER_TIME): TRIGGER_TIME_SCHEMA,
|
|
vol.Optional(CONF_ZONES): vol.Schema({cv.positive_int: ZONE_SCHEMA}),
|
|
}
|
|
)
|
|
CONFIG_SCHEMA = vol.Schema(
|
|
{DOMAIN: vol.Schema(vol.All(cv.ensure_list, [CONTROLLER_SCHEMA]))},
|
|
extra=vol.ALLOW_EXTRA,
|
|
)
|
|
|
|
|
|
def setup(hass, config):
|
|
"""Set up the Rain Bird component."""
|
|
|
|
hass.data[DATA_RAINBIRD] = []
|
|
success = False
|
|
for controller_config in config[DOMAIN]:
|
|
success = success or _setup_controller(hass, controller_config, config)
|
|
|
|
return success
|
|
|
|
|
|
def _setup_controller(hass, controller_config, config):
|
|
"""Set up a controller."""
|
|
server = controller_config[CONF_HOST]
|
|
password = controller_config[CONF_PASSWORD]
|
|
controller = RainbirdController(server, password)
|
|
position = len(hass.data[DATA_RAINBIRD])
|
|
try:
|
|
controller.get_serial_number()
|
|
except Exception as exc: # pylint: disable=W0703
|
|
_LOGGER.error("Unable to setup controller: %s", exc)
|
|
return False
|
|
hass.data[DATA_RAINBIRD].append(controller)
|
|
_LOGGER.debug("Rain Bird Controller %d set to: %s", position, server)
|
|
for platform in SUPPORTED_PLATFORMS:
|
|
discovery.load_platform(
|
|
hass,
|
|
platform,
|
|
DOMAIN,
|
|
{RAINBIRD_CONTROLLER: position, **controller_config},
|
|
config,
|
|
)
|
|
return True
|