1 """Support for Automation Device Specification (ADS)."""
6 import voluptuous
as vol
12 EVENT_HOMEASSISTANT_STOP,
18 from .const
import CONF_ADS_VAR, DATA_ADS, DOMAIN, AdsType
19 from .hub
import AdsHub
21 _LOGGER = logging.getLogger(__name__)
25 AdsType.BOOL: pyads.PLCTYPE_BOOL,
26 AdsType.BYTE: pyads.PLCTYPE_BYTE,
27 AdsType.INT: pyads.PLCTYPE_INT,
28 AdsType.UINT: pyads.PLCTYPE_UINT,
29 AdsType.SINT: pyads.PLCTYPE_SINT,
30 AdsType.USINT: pyads.PLCTYPE_USINT,
31 AdsType.DINT: pyads.PLCTYPE_DINT,
32 AdsType.UDINT: pyads.PLCTYPE_UDINT,
33 AdsType.WORD: pyads.PLCTYPE_WORD,
34 AdsType.DWORD: pyads.PLCTYPE_DWORD,
35 AdsType.REAL: pyads.PLCTYPE_REAL,
36 AdsType.LREAL: pyads.PLCTYPE_LREAL,
37 AdsType.STRING: pyads.PLCTYPE_STRING,
38 AdsType.TIME: pyads.PLCTYPE_TIME,
39 AdsType.DATE: pyads.PLCTYPE_DATE,
40 AdsType.DATE_AND_TIME: pyads.PLCTYPE_DT,
41 AdsType.TOD: pyads.PLCTYPE_TOD,
44 CONF_ADS_FACTOR =
"factor"
45 CONF_ADS_TYPE =
"adstype"
46 CONF_ADS_VALUE =
"value"
49 SERVICE_WRITE_DATA_BY_NAME =
"write_data_by_name"
51 CONFIG_SCHEMA = vol.Schema(
55 vol.Required(CONF_DEVICE): cv.string,
56 vol.Required(CONF_PORT): cv.port,
57 vol.Optional(CONF_IP_ADDRESS): cv.string,
61 extra=vol.ALLOW_EXTRA,
64 SCHEMA_SERVICE_WRITE_DATA_BY_NAME = vol.Schema(
66 vol.Required(CONF_ADS_TYPE): vol.Coerce(AdsType),
67 vol.Required(CONF_ADS_VALUE): vol.Coerce(int),
68 vol.Required(CONF_ADS_VAR): cv.string,
73 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
74 """Set up the ADS component."""
78 net_id = conf[CONF_DEVICE]
79 ip_address = conf.get(CONF_IP_ADDRESS)
80 port = conf[CONF_PORT]
82 client = pyads.Connection(net_id, port, ip_address)
86 except pyads.ADSError:
88 "Could not connect to ADS host (netid=%s, ip=%s, port=%s)",
95 hass.data[DATA_ADS] = ads
96 hass.bus.listen(EVENT_HOMEASSISTANT_STOP, ads.shutdown)
98 def handle_write_data_by_name(call: ServiceCall) ->
None:
99 """Write a value to the connected ADS device."""
100 ads_var: str = call.data[CONF_ADS_VAR]
101 ads_type: AdsType = call.data[CONF_ADS_TYPE]
102 value: int = call.data[CONF_ADS_VALUE]
105 ads.write_by_name(ads_var, value, ADS_TYPEMAP[ads_type])
106 except pyads.ADSError
as err:
109 hass.services.register(
111 SERVICE_WRITE_DATA_BY_NAME,
112 handle_write_data_by_name,
113 schema=SCHEMA_SERVICE_WRITE_DATA_BY_NAME,
bool setup(HomeAssistant hass, ConfigType config)