Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for Automation Device Specification (ADS)."""
2 
3 import logging
4 
5 import pyads
6 import voluptuous as vol
7 
8 from homeassistant.const import (
9  CONF_DEVICE,
10  CONF_IP_ADDRESS,
11  CONF_PORT,
12  EVENT_HOMEASSISTANT_STOP,
13 )
14 from homeassistant.core import HomeAssistant, ServiceCall
16 from homeassistant.helpers.typing import ConfigType
17 
18 from .const import CONF_ADS_VAR, DATA_ADS, DOMAIN, AdsType
19 from .hub import AdsHub
20 
21 _LOGGER = logging.getLogger(__name__)
22 
23 
24 ADS_TYPEMAP = {
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,
42 }
43 
44 CONF_ADS_FACTOR = "factor"
45 CONF_ADS_TYPE = "adstype"
46 CONF_ADS_VALUE = "value"
47 
48 
49 SERVICE_WRITE_DATA_BY_NAME = "write_data_by_name"
50 
51 CONFIG_SCHEMA = vol.Schema(
52  {
53  DOMAIN: vol.Schema(
54  {
55  vol.Required(CONF_DEVICE): cv.string,
56  vol.Required(CONF_PORT): cv.port,
57  vol.Optional(CONF_IP_ADDRESS): cv.string,
58  }
59  )
60  },
61  extra=vol.ALLOW_EXTRA,
62 )
63 
64 SCHEMA_SERVICE_WRITE_DATA_BY_NAME = vol.Schema(
65  {
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,
69  }
70 )
71 
72 
73 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
74  """Set up the ADS component."""
75 
76  conf = config[DOMAIN]
77 
78  net_id = conf[CONF_DEVICE]
79  ip_address = conf.get(CONF_IP_ADDRESS)
80  port = conf[CONF_PORT]
81 
82  client = pyads.Connection(net_id, port, ip_address)
83 
84  try:
85  ads = AdsHub(client)
86  except pyads.ADSError:
87  _LOGGER.error(
88  "Could not connect to ADS host (netid=%s, ip=%s, port=%s)",
89  net_id,
90  ip_address,
91  port,
92  )
93  return False
94 
95  hass.data[DATA_ADS] = ads
96  hass.bus.listen(EVENT_HOMEASSISTANT_STOP, ads.shutdown)
97 
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]
103 
104  try:
105  ads.write_by_name(ads_var, value, ADS_TYPEMAP[ads_type])
106  except pyads.ADSError as err:
107  _LOGGER.error(err)
108 
109  hass.services.register(
110  DOMAIN,
111  SERVICE_WRITE_DATA_BY_NAME,
112  handle_write_data_by_name,
113  schema=SCHEMA_SERVICE_WRITE_DATA_BY_NAME,
114  )
115 
116  return True
bool setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:73