86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
"""A platform that to monitor Uptime Robot monitors."""
|
|
import logging
|
|
|
|
from pyuptimerobot import UptimeRobot
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.binary_sensor import PLATFORM_SCHEMA, BinarySensorEntity
|
|
from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY
|
|
import homeassistant.helpers.config_validation as cv
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
ATTR_TARGET = "target"
|
|
|
|
ATTRIBUTION = "Data provided by Uptime Robot"
|
|
|
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({vol.Required(CONF_API_KEY): cv.string})
|
|
|
|
|
|
def setup_platform(hass, config, add_entities, discovery_info=None):
|
|
"""Set up the Uptime Robot binary_sensors."""
|
|
|
|
up_robot = UptimeRobot()
|
|
api_key = config.get(CONF_API_KEY)
|
|
monitors = up_robot.getMonitors(api_key)
|
|
|
|
devices = []
|
|
if not monitors or monitors.get("stat") != "ok":
|
|
_LOGGER.error("Error connecting to Uptime Robot")
|
|
return
|
|
|
|
for monitor in monitors["monitors"]:
|
|
devices.append(
|
|
UptimeRobotBinarySensor(
|
|
api_key,
|
|
up_robot,
|
|
monitor["id"],
|
|
monitor["friendly_name"],
|
|
monitor["url"],
|
|
)
|
|
)
|
|
|
|
add_entities(devices, True)
|
|
|
|
|
|
class UptimeRobotBinarySensor(BinarySensorEntity):
|
|
"""Representation of a Uptime Robot binary sensor."""
|
|
|
|
def __init__(self, api_key, up_robot, monitor_id, name, target):
|
|
"""Initialize Uptime Robot the binary sensor."""
|
|
self._api_key = api_key
|
|
self._monitor_id = str(monitor_id)
|
|
self._name = name
|
|
self._target = target
|
|
self._up_robot = up_robot
|
|
self._state = None
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the binary sensor."""
|
|
return self._name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return the state of the binary sensor."""
|
|
return self._state
|
|
|
|
@property
|
|
def device_class(self):
|
|
"""Return the class of this device, from component DEVICE_CLASSES."""
|
|
return "connectivity"
|
|
|
|
@property
|
|
def device_state_attributes(self):
|
|
"""Return the state attributes of the binary sensor."""
|
|
return {ATTR_ATTRIBUTION: ATTRIBUTION, ATTR_TARGET: self._target}
|
|
|
|
def update(self):
|
|
"""Get the latest state of the binary sensor."""
|
|
monitor = self._up_robot.getMonitors(self._api_key, self._monitor_id)
|
|
if not monitor or monitor.get("stat") != "ok":
|
|
_LOGGER.warning("Failed to get new state")
|
|
return
|
|
status = monitor["monitors"][0]["status"]
|
|
self._state = 1 if status == 2 else 0
|