Do not call update() in constructor (#8892)

This commit is contained in:
Fabian Affolter 2017-08-08 22:36:59 +02:00 committed by Pascal Vizeli
parent f513f6271e
commit be94f6e939
5 changed files with 25 additions and 23 deletions

View File

@ -4,18 +4,18 @@ Support for custom shell commands to retrieve values.
For more details about this platform, please refer to the documentation at For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.command_line/ https://home-assistant.io/components/binary_sensor.command_line/
""" """
from datetime import timedelta
import logging import logging
from datetime import timedelta
import voluptuous as vol import voluptuous as vol
import homeassistant.helpers.config_validation as cv
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
BinarySensorDevice, DEVICE_CLASSES_SCHEMA, PLATFORM_SCHEMA) BinarySensorDevice, DEVICE_CLASSES_SCHEMA, PLATFORM_SCHEMA)
from homeassistant.components.sensor.command_line import CommandSensorData from homeassistant.components.sensor.command_line import CommandSensorData
from homeassistant.const import ( from homeassistant.const import (
CONF_PAYLOAD_OFF, CONF_PAYLOAD_ON, CONF_NAME, CONF_VALUE_TEMPLATE, CONF_PAYLOAD_OFF, CONF_PAYLOAD_ON, CONF_NAME, CONF_VALUE_TEMPLATE,
CONF_COMMAND, CONF_DEVICE_CLASS) CONF_COMMAND, CONF_DEVICE_CLASS)
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -50,7 +50,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
add_devices([CommandBinarySensor( add_devices([CommandBinarySensor(
hass, data, name, device_class, payload_on, payload_off, hass, data, name, device_class, payload_on, payload_off,
value_template)]) value_template)], True)
class CommandBinarySensor(BinarySensorDevice): class CommandBinarySensor(BinarySensorDevice):
@ -67,7 +67,6 @@ class CommandBinarySensor(BinarySensorDevice):
self._payload_on = payload_on self._payload_on = payload_on
self._payload_off = payload_off self._payload_off = payload_off
self._value_template = value_template self._value_template = value_template
self.update()
@property @property
def name(self): def name(self):

View File

@ -4,18 +4,18 @@ Allows to configure custom shell commands to turn a value for a sensor.
For more details about this platform, please refer to the documentation at For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.command_line/ https://home-assistant.io/components/sensor.command_line/
""" """
from datetime import timedelta
import logging import logging
import subprocess import subprocess
from datetime import timedelta
import voluptuous as vol import voluptuous as vol
import homeassistant.helpers.config_validation as cv
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import ( from homeassistant.const import (
CONF_NAME, CONF_VALUE_TEMPLATE, CONF_UNIT_OF_MEASUREMENT, CONF_COMMAND, CONF_NAME, CONF_VALUE_TEMPLATE, CONF_UNIT_OF_MEASUREMENT, CONF_COMMAND,
STATE_UNKNOWN) STATE_UNKNOWN)
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -42,7 +42,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
value_template.hass = hass value_template.hass = hass
data = CommandSensorData(command) data = CommandSensorData(command)
add_devices([CommandSensor(hass, data, name, unit, value_template)]) add_devices([CommandSensor(hass, data, name, unit, value_template)], True)
class CommandSensor(Entity): class CommandSensor(Entity):
@ -53,10 +53,9 @@ class CommandSensor(Entity):
self._hass = hass self._hass = hass
self.data = data self.data = data
self._name = name self._name = name
self._state = STATE_UNKNOWN self._state = None
self._unit_of_measurement = unit_of_measurement self._unit_of_measurement = unit_of_measurement
self._value_template = value_template self._value_template = value_template
self.update()
@property @property
def name(self): def name(self):

View File

@ -9,12 +9,13 @@ import subprocess
import voluptuous as vol import voluptuous as vol
from homeassistant.components.switch import (SwitchDevice, PLATFORM_SCHEMA, import homeassistant.helpers.config_validation as cv
ENTITY_ID_FORMAT)
from homeassistant.components.switch import (
SwitchDevice, PLATFORM_SCHEMA, ENTITY_ID_FORMAT)
from homeassistant.const import ( from homeassistant.const import (
CONF_FRIENDLY_NAME, CONF_SWITCHES, CONF_VALUE_TEMPLATE, CONF_COMMAND_OFF, CONF_FRIENDLY_NAME, CONF_SWITCHES, CONF_VALUE_TEMPLATE, CONF_COMMAND_OFF,
CONF_COMMAND_ON, CONF_COMMAND_STATE) CONF_COMMAND_ON, CONF_COMMAND_STATE)
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -80,30 +81,30 @@ class CommandSwitch(SwitchDevice):
@staticmethod @staticmethod
def _switch(command): def _switch(command):
"""Execute the actual commands.""" """Execute the actual commands."""
_LOGGER.info('Running command: %s', command) _LOGGER.info("Running command: %s", command)
success = (subprocess.call(command, shell=True) == 0) success = (subprocess.call(command, shell=True) == 0)
if not success: if not success:
_LOGGER.error('Command failed: %s', command) _LOGGER.error("Command failed: %s", command)
return success return success
@staticmethod @staticmethod
def _query_state_value(command): def _query_state_value(command):
"""Execute state command for return value.""" """Execute state command for return value."""
_LOGGER.info('Running state command: %s', command) _LOGGER.info("Running state command: %s", command)
try: try:
return_value = subprocess.check_output(command, shell=True) return_value = subprocess.check_output(command, shell=True)
return return_value.strip().decode('utf-8') return return_value.strip().decode('utf-8')
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
_LOGGER.error('Command failed: %s', command) _LOGGER.error("Command failed: %s", command)
@staticmethod @staticmethod
def _query_state_code(command): def _query_state_code(command):
"""Execute state command for return code.""" """Execute state command for return code."""
_LOGGER.info('Running state command: %s', command) _LOGGER.info("Running state command: %s", command)
return subprocess.call(command, shell=True) == 0 return subprocess.call(command, shell=True) == 0
@property @property
@ -129,7 +130,7 @@ class CommandSwitch(SwitchDevice):
def _query_state(self): def _query_state(self):
"""Query for state.""" """Query for state."""
if not self._command_state: if not self._command_state:
_LOGGER.error('No state command specified') _LOGGER.error("No state command specified")
return return
if self._value_template: if self._value_template:
return CommandSwitch._query_state_value(self._command_state) return CommandSwitch._query_state_value(self._command_state)
@ -142,7 +143,7 @@ class CommandSwitch(SwitchDevice):
if self._value_template: if self._value_template:
payload = self._value_template.render_with_possible_json_value( payload = self._value_template.render_with_possible_json_value(
payload) payload)
self._state = (payload.lower() == "true") self._state = (payload.lower() == 'true')
def turn_on(self, **kwargs): def turn_on(self, **kwargs):
"""Turn the device on.""" """Turn the device on."""

View File

@ -29,7 +29,7 @@ class TestCommandSensorBinarySensor(unittest.TestCase):
devices = [] devices = []
def add_dev_callback(devs): def add_dev_callback(devs, update):
"""Add callback to add devices.""" """Add callback to add devices."""
for dev in devs: for dev in devs:
devices.append(dev) devices.append(dev)
@ -38,6 +38,7 @@ class TestCommandSensorBinarySensor(unittest.TestCase):
self.assertEqual(1, len(devices)) self.assertEqual(1, len(devices))
entity = devices[0] entity = devices[0]
entity.update()
self.assertEqual('Test', entity.name) self.assertEqual('Test', entity.name)
self.assertEqual(STATE_ON, entity.state) self.assertEqual(STATE_ON, entity.state)
@ -58,7 +59,7 @@ class TestCommandSensorBinarySensor(unittest.TestCase):
entity = command_line.CommandBinarySensor( entity = command_line.CommandBinarySensor(
self.hass, data, 'test', None, '1.0', '0', self.hass, data, 'test', None, '1.0', '0',
template.Template('{{ value | multiply(0.1) }}', self.hass)) template.Template('{{ value | multiply(0.1) }}', self.hass))
entity.update()
self.assertEqual(STATE_ON, entity.state) self.assertEqual(STATE_ON, entity.state)
def test_sensor_off(self): def test_sensor_off(self):
@ -67,5 +68,5 @@ class TestCommandSensorBinarySensor(unittest.TestCase):
entity = command_line.CommandBinarySensor( entity = command_line.CommandBinarySensor(
self.hass, data, 'test', None, '1', '0', None) self.hass, data, 'test', None, '1', '0', None)
entity.update()
self.assertEqual(STATE_OFF, entity.state) self.assertEqual(STATE_OFF, entity.state)

View File

@ -26,7 +26,7 @@ class TestCommandSensorSensor(unittest.TestCase):
} }
devices = [] devices = []
def add_dev_callback(devs): def add_dev_callback(devs, update):
"""Add callback to add devices.""" """Add callback to add devices."""
for dev in devs: for dev in devs:
devices.append(dev) devices.append(dev)
@ -35,6 +35,7 @@ class TestCommandSensorSensor(unittest.TestCase):
self.assertEqual(1, len(devices)) self.assertEqual(1, len(devices))
entity = devices[0] entity = devices[0]
entity.update()
self.assertEqual('Test', entity.name) self.assertEqual('Test', entity.name)
self.assertEqual('in', entity.unit_of_measurement) self.assertEqual('in', entity.unit_of_measurement)
self.assertEqual('5', entity.state) self.assertEqual('5', entity.state)
@ -57,6 +58,7 @@ class TestCommandSensorSensor(unittest.TestCase):
self.hass, data, 'test', 'in', self.hass, data, 'test', 'in',
Template('{{ value | multiply(0.1) }}', self.hass)) Template('{{ value | multiply(0.1) }}', self.hass))
entity.update()
self.assertEqual(5, float(entity.state)) self.assertEqual(5, float(entity.state))
def test_bad_command(self): def test_bad_command(self):