Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for sending data to Emoncms."""
2 
3 from datetime import timedelta
4 from http import HTTPStatus
5 import logging
6 
7 import requests
8 import voluptuous as vol
9 
10 from homeassistant.const import (
11  CONF_API_KEY,
12  CONF_SCAN_INTERVAL,
13  CONF_URL,
14  CONF_WHITELIST,
15  STATE_UNAVAILABLE,
16  STATE_UNKNOWN,
17 )
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers import state as state_helper
21 from homeassistant.helpers.event import track_point_in_time
22 from homeassistant.helpers.typing import ConfigType
23 from homeassistant.util import dt as dt_util
24 
25 _LOGGER = logging.getLogger(__name__)
26 
27 DOMAIN = "emoncms_history"
28 CONF_INPUTNODE = "inputnode"
29 
30 CONFIG_SCHEMA = vol.Schema(
31  {
32  DOMAIN: vol.Schema(
33  {
34  vol.Required(CONF_API_KEY): cv.string,
35  vol.Required(CONF_URL): cv.string,
36  vol.Required(CONF_INPUTNODE): cv.positive_int,
37  vol.Required(CONF_WHITELIST): cv.entity_ids,
38  vol.Optional(CONF_SCAN_INTERVAL, default=30): cv.positive_int,
39  }
40  )
41  },
42  extra=vol.ALLOW_EXTRA,
43 )
44 
45 
46 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
47  """Set up the Emoncms history component."""
48  conf = config[DOMAIN]
49  whitelist = conf.get(CONF_WHITELIST)
50 
51  def send_data(url, apikey, node, payload):
52  """Send payload data to Emoncms."""
53  try:
54  fullurl = f"{url}/input/post.json"
55  data = {"apikey": apikey, "data": payload}
56  parameters = {"node": node}
57  req = requests.post(
58  fullurl, params=parameters, data=data, allow_redirects=True, timeout=5
59  )
60 
61  except requests.exceptions.RequestException:
62  _LOGGER.error("Error saving data '%s' to '%s'", payload, fullurl)
63 
64  else:
65  if req.status_code != HTTPStatus.OK:
66  _LOGGER.error(
67  "Error saving data %s to %s (http status code = %d)",
68  payload,
69  fullurl,
70  req.status_code,
71  )
72 
73  def update_emoncms(time):
74  """Send whitelisted entities states regularly to Emoncms."""
75  payload_dict = {}
76 
77  for entity_id in whitelist:
78  state = hass.states.get(entity_id)
79 
80  if state is None or state.state in (STATE_UNKNOWN, "", STATE_UNAVAILABLE):
81  continue
82 
83  try:
84  payload_dict[entity_id] = state_helper.state_as_number(state)
85  except ValueError:
86  continue
87 
88  if payload_dict:
89  payload = ",".join(f"{key}:{val}" for key, val in payload_dict.items())
90 
91  send_data(
92  conf.get(CONF_URL),
93  conf.get(CONF_API_KEY),
94  str(conf.get(CONF_INPUTNODE)),
95  f"{{{payload}}}",
96  )
97 
99  hass, update_emoncms, time + timedelta(seconds=conf.get(CONF_SCAN_INTERVAL))
100  )
101 
102  update_emoncms(dt_util.utcnow())
103  return True
def send_data(name, msg)
Definition: __init__.py:75
bool setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:46