From 93f9f1b32056a6d5ca1a7aa5a7a55fffe27cda1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Haas?= Date: Mon, 22 Jun 2020 16:29:29 +0200 Subject: [PATCH] Add NetdataAlarms sensor to additionally collect alarm information (#34339) --- .../components/netdata/manifest.json | 2 +- homeassistant/components/netdata/sensor.py | 58 +++++++++++++++++++ requirements_all.txt | 2 +- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/netdata/manifest.json b/homeassistant/components/netdata/manifest.json index d1394f5526f..02a5bbddacd 100644 --- a/homeassistant/components/netdata/manifest.json +++ b/homeassistant/components/netdata/manifest.json @@ -2,6 +2,6 @@ "domain": "netdata", "name": "Netdata", "documentation": "https://www.home-assistant.io/integrations/netdata", - "requirements": ["netdata==0.1.2"], + "requirements": ["netdata==0.2.0"], "codeowners": ["@fabaff"] } diff --git a/homeassistant/components/netdata/sensor.py b/homeassistant/components/netdata/sensor.py index 4406734b094..83d70b0742f 100644 --- a/homeassistant/components/netdata/sensor.py +++ b/homeassistant/components/netdata/sensor.py @@ -93,6 +93,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ) ) + dev.append(NetdataAlarms(netdata, name, host, port)) async_add_entities(dev, True) @@ -145,6 +146,62 @@ class NetdataSensor(Entity): ) +class NetdataAlarms(Entity): + """Implementation of a Netdata alarm sensor.""" + + def __init__(self, netdata, name, host, port): + """Initialize the Netdata alarm sensor.""" + self.netdata = netdata + self._state = None + self._name = name + self._host = host + self._port = port + + @property + def name(self): + """Return the name of the sensor.""" + return f"{self._name} Alarms" + + @property + def state(self): + """Return the state of the resources.""" + return self._state + + @property + def icon(self): + """Status symbol if type is symbol.""" + if self._state == "ok": + return "mdi:check" + if self._state == "warning": + return "mdi:alert-outline" + if self._state == "critical": + return "mdi:alert" + return "mdi:crosshairs-question" + + @property + def available(self): + """Could the resource be accessed during the last update call.""" + return self.netdata.available + + async def async_update(self): + """Get the latest alarms from Netdata REST API.""" + await self.netdata.async_update() + alarms = self.netdata.api.alarms["alarms"] + self._state = None + number_of_alarms = len(alarms) + number_of_relevant_alarms = number_of_alarms + + _LOGGER.debug("Host %s has %s alarms", self.name, number_of_alarms) + + for alarm in alarms: + if alarms[alarm]["recipient"] == "silent": + number_of_relevant_alarms = number_of_relevant_alarms - 1 + elif alarms[alarm]["status"] == "CRITICAL": + self._state = "critical" + return + self._state = "ok" if number_of_relevant_alarms == 0 else "warning" + + class NetdataData: """The class for handling the data retrieval.""" @@ -159,6 +216,7 @@ class NetdataData: try: await self.api.get_allmetrics() + await self.api.get_alarms() self.available = True except NetdataError: _LOGGER.error("Unable to retrieve data from Netdata") diff --git a/requirements_all.txt b/requirements_all.txt index 04f9da0a2a9..57b6a40840a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -952,7 +952,7 @@ ndms2_client==0.0.11 nessclient==0.9.15 # homeassistant.components.netdata -netdata==0.1.2 +netdata==0.2.0 # homeassistant.components.discovery # homeassistant.components.ssdp