From 1ea215ecd518870526e4bec22ed5610de84b09a5 Mon Sep 17 00:00:00 2001 From: Jack Gaino Date: Sun, 13 Aug 2017 14:22:33 -0400 Subject: [PATCH 1/3] Added continue-on-errors, added value template --- homeassistant/components/sensor/snmp.py | 46 +++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/sensor/snmp.py b/homeassistant/components/sensor/snmp.py index 361ce55142678..96b7cf27500a1 100644 --- a/homeassistant/components/sensor/snmp.py +++ b/homeassistant/components/sensor/snmp.py @@ -13,7 +13,8 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.helpers.entity import Entity from homeassistant.const import ( - CONF_HOST, CONF_NAME, CONF_PORT, CONF_UNIT_OF_MEASUREMENT) + CONF_HOST, CONF_NAME, CONF_PORT, CONF_UNIT_OF_MEASUREMENT, STATE_UNKNOWN, + CONF_VALUE_TEMPLATE) REQUIREMENTS = ['pysnmp==4.3.9'] @@ -22,6 +23,8 @@ CONF_BASEOID = 'baseoid' CONF_COMMUNITY = 'community' CONF_VERSION = 'version' +CONF_ACCEPT_ERRORS = 'accept_errors' +CONF_DEFAULT_VALUE = 'default_value' DEFAULT_COMMUNITY = 'public' DEFAULT_HOST = 'localhost' @@ -45,6 +48,9 @@ vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, vol.Optional(CONF_VERSION, default=DEFAULT_VERSION): vol.In(SNMP_VERSIONS), + vol.Optional(CONF_ACCEPT_ERRORS, default=False): cv.boolean, + vol.Optional(CONF_DEFAULT_VALUE): cv.string, + vol.Optional(CONF_VALUE_TEMPLATE): cv.template }) @@ -61,6 +67,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None): baseoid = config.get(CONF_BASEOID) unit = config.get(CONF_UNIT_OF_MEASUREMENT) version = config.get(CONF_VERSION) + accept_errors = config.get(CONF_ACCEPT_ERRORS) + default_value = config.get(CONF_DEFAULT_VALUE) + value_template = config.get(CONF_VALUE_TEMPLATE) + + if value_template is not None: + value_template.hass = hass errindication, _, _, _ = next( getCmd(SnmpEngine(), @@ -69,23 +81,24 @@ def setup_platform(hass, config, add_devices, discovery_info=None): ContextData(), ObjectType(ObjectIdentity(baseoid)))) - if errindication: + if errindication and not accept_errors: _LOGGER.error("Please check the details in the configuration file") return False else: - data = SnmpData(host, port, community, baseoid, version) - add_devices([SnmpSensor(data, name, unit)], True) + data = SnmpData(host, port, community, baseoid, version, accept_errors, default_value) + add_devices([SnmpSensor(data, name, unit, value_template)], True) class SnmpSensor(Entity): """Representation of a SNMP sensor.""" - def __init__(self, data, name, unit_of_measurement): + def __init__(self, data, name, unit_of_measurement, value_template): """Initialize the sensor.""" self.data = data self._name = name self._state = None self._unit_of_measurement = unit_of_measurement + self._value_template = value_template @property def name(self): @@ -105,19 +118,29 @@ def unit_of_measurement(self): def update(self): """Get the latest data and updates the states.""" self.data.update() - self._state = self.data.value + value = self.data.value + + if value is None: + value = STATE_UNKNOWN + elif self._value_template is not None: + value = self._value_template.render_with_possible_json_value( + value, STATE_UNKNOWN) + + self._state = value class SnmpData(object): """Get the latest data and update the states.""" - def __init__(self, host, port, community, baseoid, version): + def __init__(self, host, port, community, baseoid, version, accept_errors, default_value): """Initialize the data object.""" self._host = host self._port = port self._community = community self._baseoid = baseoid self._version = SNMP_VERSIONS[version] + self._accept_errors = accept_errors + self._default_value = default_value self.value = None def update(self): @@ -133,11 +156,14 @@ def update(self): ObjectType(ObjectIdentity(self._baseoid))) ) - if errindication: + if errindication and not self._accept_errors: _LOGGER.error("SNMP error: %s", errindication) - elif errstatus: + elif errstatus and not self._accept_errors: _LOGGER.error("SNMP error: %s at %s", errstatus.prettyPrint(), errindex and restable[-1][int(errindex) - 1] or '?') + elif (errindication or errstatus) and self._accept_errors: + self.value = self._default_value else: for resrow in restable: - self.value = resrow[-1] + self.value = str(resrow[-1]) + From 2d9b13082a455f4339d2c7f09cdbb008e9c853c1 Mon Sep 17 00:00:00 2001 From: Jack Gaino Date: Sun, 13 Aug 2017 16:04:38 -0400 Subject: [PATCH 2/3] Refactored long lines --- homeassistant/components/sensor/snmp.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/sensor/snmp.py b/homeassistant/components/sensor/snmp.py index 96b7cf27500a1..08969f5dd6e81 100644 --- a/homeassistant/components/sensor/snmp.py +++ b/homeassistant/components/sensor/snmp.py @@ -85,14 +85,17 @@ def setup_platform(hass, config, add_devices, discovery_info=None): _LOGGER.error("Please check the details in the configuration file") return False else: - data = SnmpData(host, port, community, baseoid, version, accept_errors, default_value) + data = SnmpData( + host, port, community, baseoid,version, accept_errors, + default_value) add_devices([SnmpSensor(data, name, unit, value_template)], True) class SnmpSensor(Entity): """Representation of a SNMP sensor.""" - def __init__(self, data, name, unit_of_measurement, value_template): + def __init__(self, data, name, unit_of_measurement, + value_template): """Initialize the sensor.""" self.data = data self._name = name @@ -132,7 +135,8 @@ def update(self): class SnmpData(object): """Get the latest data and update the states.""" - def __init__(self, host, port, community, baseoid, version, accept_errors, default_value): + def __init__(self, host, port, community, baseoid, version, accept_errors, + default_value): """Initialize the data object.""" self._host = host self._port = port From 8946cfbac2b50552aaf396a040cd7fc8e247560b Mon Sep 17 00:00:00 2001 From: Jack Gaino Date: Sun, 13 Aug 2017 16:06:25 -0400 Subject: [PATCH 3/3] Fixed whitespace issues --- homeassistant/components/sensor/snmp.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/snmp.py b/homeassistant/components/sensor/snmp.py index 08969f5dd6e81..aeb4587f3df7b 100644 --- a/homeassistant/components/sensor/snmp.py +++ b/homeassistant/components/sensor/snmp.py @@ -86,7 +86,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): return False else: data = SnmpData( - host, port, community, baseoid,version, accept_errors, + host, port, community, baseoid, version, accept_errors, default_value) add_devices([SnmpSensor(data, name, unit, value_template)], True) @@ -170,4 +170,3 @@ def update(self): else: for resrow in restable: self.value = str(resrow[-1]) -