diff --git a/homeassistant/components/apcupsd.py b/homeassistant/components/apcupsd.py
index 867208305b0..72db3e06dee 100644
--- a/homeassistant/components/apcupsd.py
+++ b/homeassistant/components/apcupsd.py
@@ -32,7 +32,7 @@ VALUE_ONLINE = 'ONLINE'
CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({
- vol.Required(CONF_HOST, default=DEFAULT_HOST): cv.string,
+ vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
}),
}, extra=vol.ALLOW_EXTRA)
diff --git a/homeassistant/components/climate/ecobee.py b/homeassistant/components/climate/ecobee.py
index da4b29dfe92..2417a8562ce 100644
--- a/homeassistant/components/climate/ecobee.py
+++ b/homeassistant/components/climate/ecobee.py
@@ -181,7 +181,7 @@ class Thermostat(ClimateDevice):
else:
operation = status
return {
- "humidity": self.thermostat['runtime']['actualHumidity'],
+ "actual_humidity": self.thermostat['runtime']['actualHumidity'],
"fan": self.fan,
"mode": self.mode,
"operation": operation,
diff --git a/homeassistant/components/climate/homematic.py b/homeassistant/components/climate/homematic.py
index be81bb9326e..e51ad5e67a5 100644
--- a/homeassistant/components/climate/homematic.py
+++ b/homeassistant/components/climate/homematic.py
@@ -101,7 +101,7 @@ class HMThermostat(homematic.HMDevice, ClimateDevice):
for mode, state in HM_STATE_MAP.items():
if state == operation_mode:
code = getattr(self._hmdevice, mode, 0)
- self._hmdevice.STATE = code
+ self._hmdevice.MODE = code
@property
def min_temp(self):
diff --git a/homeassistant/components/climate/zwave.py b/homeassistant/components/climate/zwave.py
index c8425ab4e8c..530e3ea028f 100755
--- a/homeassistant/components/climate/zwave.py
+++ b/homeassistant/components/climate/zwave.py
@@ -12,7 +12,7 @@ from homeassistant.components.climate import ClimateDevice
from homeassistant.components.zwave import (
ATTR_NODE_ID, ATTR_VALUE_ID, ZWaveDeviceEntity)
from homeassistant.components import zwave
-from homeassistant.const import (TEMP_FAHRENHEIT, TEMP_CELSIUS)
+from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT
_LOGGER = logging.getLogger(__name__)
@@ -59,11 +59,11 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
_LOGGER.debug("No discovery_info=%s or no NETWORK=%s",
discovery_info, zwave.NETWORK)
return
-
+ temp_unit = hass.config.units.temperature_unit
node = zwave.NETWORK.nodes[discovery_info[ATTR_NODE_ID]]
value = node.values[discovery_info[ATTR_VALUE_ID]]
value.set_change_verified(False)
- add_devices([ZWaveClimate(value)])
+ add_devices([ZWaveClimate(value, temp_unit)])
_LOGGER.debug("discovery_info=%s and zwave.NETWORK=%s",
discovery_info, zwave.NETWORK)
@@ -73,7 +73,7 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
"""Represents a ZWave Climate device."""
# pylint: disable=too-many-public-methods, too-many-instance-attributes
- def __init__(self, value):
+ def __init__(self, value, temp_unit):
"""Initialize the zwave climate device."""
from openzwave.network import ZWaveNetwork
from pydispatch import dispatcher
@@ -87,7 +87,8 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
self._fan_list = None
self._current_swing_mode = None
self._swing_list = None
- self._unit = None
+ self._unit = temp_unit
+ _LOGGER.debug("temp_unit is %s", self._unit)
self._zxt_120 = None
self.update_properties()
# register listener
@@ -115,18 +116,6 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
def update_properties(self):
"""Callback on data change for the registered node/value pair."""
- # Set point
- for value in self._node.get_values(
- class_id=COMMAND_CLASS_THERMOSTAT_SETPOINT).values():
- self._unit = value.units
- if self.current_operation is not None:
- if SET_TEMP_TO_INDEX.get(self._current_operation) \
- != value.index:
- continue
- if self._zxt_120:
- continue
- self._target_temperature = int(value.data)
-
# Operation Mode
for value in self._node.get_values(
class_id=COMMAND_CLASS_THERMOSTAT_MODE).values():
@@ -140,6 +129,7 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
class_id=COMMAND_CLASS_SENSOR_MULTILEVEL).values():
if value.label == 'Temperature':
self._current_temperature = int(value.data)
+ self._unit = value.units
# Fan Mode
for value in self._node.get_values(
class_id=COMMAND_CLASS_THERMOSTAT_FAN_MODE).values():
@@ -158,6 +148,17 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
_LOGGER.debug("self._swing_list=%s", self._swing_list)
_LOGGER.debug("self._current_swing_mode=%s",
self._current_swing_mode)
+ # Set point
+ for value in self._node.get_values(
+ class_id=COMMAND_CLASS_THERMOSTAT_SETPOINT).values():
+ if self.current_operation is not None and \
+ self.current_operation != 'Off':
+ if SET_TEMP_TO_INDEX.get(self._current_operation) \
+ != value.index:
+ continue
+ if self._zxt_120:
+ continue
+ self._target_temperature = int(value.data)
@property
def should_poll(self):
@@ -187,14 +188,12 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice):
@property
def unit_of_measurement(self):
"""Return the unit of measurement."""
- unit = self._unit
- if unit == 'C':
+ if self._unit == 'C':
return TEMP_CELSIUS
- elif unit == 'F':
+ elif self._unit == 'F':
return TEMP_FAHRENHEIT
else:
- _LOGGER.exception("unit_of_measurement=%s is not valid",
- unit)
+ return self._unit
@property
def current_temperature(self):
diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py
index 3f08c7ff229..876a8b46cfa 100644
--- a/homeassistant/components/cover/__init__.py
+++ b/homeassistant/components/cover/__init__.py
@@ -61,6 +61,7 @@ SERVICE_TO_METHOD = {
SERVICE_STOP_COVER: {'method': 'stop_cover'},
SERVICE_OPEN_COVER_TILT: {'method': 'open_cover_tilt'},
SERVICE_CLOSE_COVER_TILT: {'method': 'close_cover_tilt'},
+ SERVICE_STOP_COVER_TILT: {'method': 'stop_cover_tilt'},
SERVICE_SET_COVER_TILT_POSITION: {
'method': 'set_cover_tilt_position',
'schema': COVER_SET_COVER_TILT_POSITION_SCHEMA},
diff --git a/homeassistant/components/cover/homematic.py b/homeassistant/components/cover/homematic.py
index cab6b51e645..fd68ac3d265 100644
--- a/homeassistant/components/cover/homematic.py
+++ b/homeassistant/components/cover/homematic.py
@@ -11,7 +11,7 @@ properly configured.
import logging
from homeassistant.const import STATE_UNKNOWN
from homeassistant.components.cover import CoverDevice,\
- ATTR_CURRENT_POSITION
+ ATTR_POSITION
import homeassistant.components.homematic as homematic
_LOGGER = logging.getLogger(__name__)
@@ -41,16 +41,16 @@ class HMCover(homematic.HMDevice, CoverDevice):
None is unknown, 0 is closed, 100 is fully open.
"""
if self.available:
- return int((1 - self._hm_get_state()) * 100)
+ return int(self._hm_get_state() * 100)
return None
def set_cover_position(self, **kwargs):
"""Move the cover to a specific position."""
if self.available:
- if ATTR_CURRENT_POSITION in kwargs:
- position = float(kwargs[ATTR_CURRENT_POSITION])
+ if ATTR_POSITION in kwargs:
+ position = float(kwargs[ATTR_POSITION])
position = min(100, max(0, position))
- level = (100 - position) / 100.0
+ level = position / 100.0
self._hmdevice.set_level(level, self._channel)
@property
diff --git a/homeassistant/components/cover/mqtt.py b/homeassistant/components/cover/mqtt.py
index dd6b10e244d..b47bcf124e1 100644
--- a/homeassistant/components/cover/mqtt.py
+++ b/homeassistant/components/cover/mqtt.py
@@ -97,12 +97,16 @@ class MqttCover(CoverDevice):
hass, value_template, payload)
if payload == self._state_open:
self._state = False
+ _LOGGER.warning("state=%s", int(self._state))
self.update_ha_state()
elif payload == self._state_closed:
self._state = True
self.update_ha_state()
elif payload.isnumeric() and 0 <= int(payload) <= 100:
- self._state = int(payload)
+ if int(payload) > 0:
+ self._state = False
+ else:
+ self._state = True
self._position = int(payload)
self.update_ha_state()
else:
@@ -129,11 +133,7 @@ class MqttCover(CoverDevice):
@property
def is_closed(self):
"""Return if the cover is closed."""
- if self.current_cover_position is not None:
- if self.current_cover_position > 0:
- return False
- else:
- return True
+ return self._state
@property
def current_cover_position(self):
diff --git a/homeassistant/components/cover/zwave.py b/homeassistant/components/cover/zwave.py
index 83d55001fe2..d7ebfb834e8 100644
--- a/homeassistant/components/cover/zwave.py
+++ b/homeassistant/components/cover/zwave.py
@@ -96,6 +96,8 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice):
@property
def is_closed(self):
"""Return if the cover is closed."""
+ if self.current_cover_position is None:
+ return None
if self.current_cover_position > 0:
return False
else:
diff --git a/homeassistant/components/device_tracker/__init__.py b/homeassistant/components/device_tracker/__init__.py
index b260eccd7d1..a4f65ab4ea4 100644
--- a/homeassistant/components/device_tracker/__init__.py
+++ b/homeassistant/components/device_tracker/__init__.py
@@ -388,7 +388,8 @@ def load_config(path: str, hass: HomeAssistantType, consider_home: timedelta):
try:
return [
Device(hass, consider_home, device.get('track', False),
- str(dev_id).lower(), str(device.get('mac')).upper(),
+ str(dev_id).lower(), None if device.get('mac') is None
+ else str(device.get('mac')).upper(),
device.get('name'), device.get('picture'),
device.get('gravatar'),
device.get(CONF_AWAY_HIDE, DEFAULT_AWAY_HIDE))
diff --git a/homeassistant/components/device_tracker/bluetooth_le_tracker.py b/homeassistant/components/device_tracker/bluetooth_le_tracker.py
index 6576f46bad7..ce8a535ff57 100644
--- a/homeassistant/components/device_tracker/bluetooth_le_tracker.py
+++ b/homeassistant/components/device_tracker/bluetooth_le_tracker.py
@@ -2,16 +2,19 @@
import logging
from datetime import timedelta
+import voluptuous as vol
from homeassistant.helpers.event import track_point_in_utc_time
from homeassistant.components.device_tracker import (
YAML_DEVICES,
CONF_TRACK_NEW,
CONF_SCAN_INTERVAL,
DEFAULT_SCAN_INTERVAL,
+ PLATFORM_SCHEMA,
load_config,
)
import homeassistant.util as util
import homeassistant.util.dt as dt_util
+import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
@@ -19,6 +22,11 @@ REQUIREMENTS = ['gattlib==0.20150805']
BLE_PREFIX = 'BLE_'
MIN_SEEN_NEW = 5
+CONF_SCAN_DURATION = "scan_duration"
+
+PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
+ vol.Optional(CONF_SCAN_DURATION, default=10): cv.positive_int
+})
def setup_scanner(hass, config, see):
@@ -51,12 +59,13 @@ def setup_scanner(hass, config, see):
"""Discover Bluetooth LE devices."""
_LOGGER.debug("Discovering Bluetooth LE devices")
service = DiscoveryService()
- devices = service.discover(10)
+ devices = service.discover(duration)
_LOGGER.debug("Bluetooth LE devices discovered = %s", devices)
return devices
yaml_path = hass.config.path(YAML_DEVICES)
+ duration = config.get(CONF_SCAN_DURATION)
devs_to_track = []
devs_donot_track = []
@@ -65,11 +74,13 @@ def setup_scanner(hass, config, see):
# to 0
for device in load_config(yaml_path, hass, 0):
# check if device is a valid bluetooth device
- if device.mac and device.mac[:3].upper() == BLE_PREFIX:
+ if device.mac and device.mac[:4].upper() == BLE_PREFIX:
if device.track:
- devs_to_track.append(device.mac[3:])
+ _LOGGER.debug("Adding %s to BLE tracker", device.mac)
+ devs_to_track.append(device.mac[4:])
else:
- devs_donot_track.append(device.mac[3:])
+ _LOGGER.debug("Adding %s to BLE do not track", device.mac)
+ devs_donot_track.append(device.mac[4:])
# if track new devices is true discover new devices
# on every scan.
@@ -96,7 +107,7 @@ def setup_scanner(hass, config, see):
if track_new:
for address in devs:
if address not in devs_to_track and \
- address not in devs_donot_track:
+ address not in devs_donot_track:
_LOGGER.info("Discovered Bluetooth LE device %s", address)
see_device(address, devs[address], new_device=True)
diff --git a/homeassistant/components/fan/insteon_hub.py b/homeassistant/components/fan/insteon_hub.py
deleted file mode 100644
index 4d65ee1f02b..00000000000
--- a/homeassistant/components/fan/insteon_hub.py
+++ /dev/null
@@ -1,66 +0,0 @@
-"""
-Support for Insteon FanLinc.
-
-For more details about this platform, please refer to the documentation at
-https://home-assistant.io/components/fan.insteon/
-"""
-
-import logging
-
-from homeassistant.components.fan import (FanEntity, SUPPORT_SET_SPEED,
- SPEED_OFF, SPEED_LOW, SPEED_MED,
- SPEED_HIGH)
-from homeassistant.components.insteon_hub import (InsteonDevice, INSTEON,
- filter_devices)
-from homeassistant.const import STATE_UNKNOWN
-
-_LOGGER = logging.getLogger(__name__)
-
-DEVICE_CATEGORIES = [
- {
- 'DevCat': 1,
- 'SubCat': [46]
- }
-]
-
-DEPENDENCIES = ['insteon_hub']
-
-
-def setup_platform(hass, config, add_devices, discovery_info=None):
- """Setup the Insteon Hub fan platform."""
- devs = []
- for device in filter_devices(INSTEON.devices, DEVICE_CATEGORIES):
- devs.append(InsteonFanDevice(device))
- add_devices(devs)
-
-
-class InsteonFanDevice(InsteonDevice, FanEntity):
- """Represet an insteon fan device."""
-
- def __init__(self, node: object) -> None:
- """Initialize the device."""
- super(InsteonFanDevice, self).__init__(node)
- self.speed = STATE_UNKNOWN # Insteon hub can't get state via REST
-
- def turn_on(self, speed: str=None):
- """Turn the fan on."""
- self.set_speed(speed if speed else SPEED_MED)
-
- def turn_off(self):
- """Turn the fan off."""
- self.set_speed(SPEED_OFF)
-
- def set_speed(self, speed: str) -> None:
- """Set the fan speed."""
- if self._send_command('fan', payload={'speed', speed}):
- self.speed = speed
-
- @property
- def supported_features(self) -> int:
- """Get the supported features for device."""
- return SUPPORT_SET_SPEED
-
- @property
- def speed_list(self) -> list:
- """Get the available speeds for the fan."""
- return [SPEED_OFF, SPEED_LOW, SPEED_MED, SPEED_HIGH]
diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py
index 5fce36f45b1..b1bd204e1ce 100644
--- a/homeassistant/components/frontend/version.py
+++ b/homeassistant/components/frontend/version.py
@@ -2,7 +2,7 @@
FINGERPRINTS = {
"core.js": "1fd10c1fcdf56a61f60cf861d5a0368c",
- "frontend.html": "88c97d278de3320278da6c32fe9e7d61",
+ "frontend.html": "610cc799225ede933a9894b64bb35717",
"mdi.html": "710b84acc99b32514f52291aba9cd8e8",
"panels/ha-panel-dev-event.html": "3cc881ae8026c0fba5aa67d334a3ab2b",
"panels/ha-panel-dev-info.html": "34e2df1af32e60fffcafe7e008a92169",
diff --git a/homeassistant/components/frontend/www_static/core.js.gz b/homeassistant/components/frontend/www_static/core.js.gz
index 847c937ec81..5accff51795 100644
Binary files a/homeassistant/components/frontend/www_static/core.js.gz and b/homeassistant/components/frontend/www_static/core.js.gz differ
diff --git a/homeassistant/components/frontend/www_static/frontend.html b/homeassistant/components/frontend/www_static/frontend.html
index 128248ce62e..367b8d15a5a 100644
--- a/homeassistant/components/frontend/www_static/frontend.html
+++ b/homeassistant/components/frontend/www_static/frontend.html
@@ -1,5 +1,5 @@
[[_text]]
![[[stateObj.entityDisplay]]]([[cameraFeedSrc]])
[[stateObj.entityDisplay]](Error loading image)
[[stateObj.entityDisplay]]
[[computeTargetTemperature(stateObj)]]
Currently: [[stateObj.attributes.current_temperature]] [[stateObj.attributes.unit_of_measurement]]

[[stateObj.stateDisplay]]
[[_charCounterStr]][[errorMessage]]
[[item]][[computePrimaryText(stateObj, isPlaying)]]
[[secondaryText]]
[[computeTargetTemperature(stateObj)]]
Currently: [[stateObj.attributes.current_temperature]] [[stateObj.attributes.unit_of_measurement]]
[[stateObj.entityDisplay]][[computeTitle(states, groupEntity)]]
To install Home Assistant, run:
pip3 install homeassistant
hass --open-ui
Here are some resources to get started.
To remove this card, edit your config in configuration.yaml
and disable the introduction
component. [[stateObj.entityDisplay]]
[[playerObj.primaryText]]
[[playerObj.secondaryText]]
[[stateObj.state]]
DISMISS[[computeTitle(views, locationName)]]
[[locationName]][[item.entityDisplay]] {{text}}
No state history found.
[[formatAttribute(attribute)]]
[[getAttributeValue(stateObj, attribute)]]
[[itemCaption(item)]]
[[itemValue(item)]]
Elevation
[[stateObj.attributes.elevation]]
Last Action
[[stateObj.attributes.last_action]]
[[caption]]
![[[stateObj.entityDisplay]]]([[computeCameraImageUrl(hass, stateObj)]])
{{finalTranscript}} [[interimTranscript]] …
\ No newline at end of file
+var r=t.propertyDataFromStyles(n._styles,this),i=!this.__notStyleScopeCacheable;i&&(r.key.customStyle=this.customStyle,e=n._styleCache.retrieve(this.is,r.key,this._styles));var a=Boolean(e);a?this._styleProperties=e._styleProperties:this._computeStyleProperties(r.properties),this._computeOwnStyleProperties(),a||(e=o.retrieve(this.is,this._ownStyleProperties,this._styles));var l=Boolean(e)&&!a,h=this._applyStyleProperties(e);a||(h=h&&s?h.cloneNode(!0):h,e={style:h,_scopeSelector:this._scopeSelector,_styleProperties:this._styleProperties},i&&(r.key.customStyle={},this.mixin(r.key.customStyle,this.customStyle),n._styleCache.store(this.is,e,r.key,this._styles)),l||o.store(this.is,Object.create(e),this._ownStyleProperties,this._styles))},_computeStyleProperties:function(e){var n=this._findStyleHost();n._styleProperties||n._computeStyleProperties();var r=Object.create(n._styleProperties),s=t.hostAndRootPropertiesForScope(this);this.mixin(r,s.hostProps),e=e||t.propertyDataFromStyles(n._styles,this).properties,this.mixin(r,e),this.mixin(r,s.rootProps),t.mixinCustomStyle(r,this.customStyle),t.reify(r),this._styleProperties=r},_computeOwnStyleProperties:function(){for(var e,t={},n=0;n0&&l.push(t);return[{removed:a,added:l}]}},Polymer.Collection.get=function(e){return Polymer._collections.get(e)||new Polymer.Collection(e)},Polymer.Collection.applySplices=function(e,t){var n=Polymer._collections.get(e);return n?n._applySplices(t):null},Polymer({is:"dom-repeat",extends:"template",_template:null,properties:{items:{type:Array},as:{type:String,value:"item"},indexAs:{type:String,value:"index"},sort:{type:Function,observer:"_sortChanged"},filter:{type:Function,observer:"_filterChanged"},observe:{type:String,observer:"_observeChanged"},delay:Number,renderedItemCount:{type:Number,notify:!0,readOnly:!0},initialCount:{type:Number,observer:"_initializeChunking"},targetFramerate:{type:Number,value:20},_targetFrameTime:{type:Number,computed:"_computeFrameTime(targetFramerate)"}},behaviors:[Polymer.Templatizer],observers:["_itemsChanged(items.*)"],created:function(){this._instances=[],this._pool=[],this._limit=1/0;var e=this;this._boundRenderChunk=function(){e._renderChunk()}},detached:function(){this.__isDetached=!0;for(var e=0;e=0;t--){var n=this._instances[t];n.isPlaceholder&&t=this._limit&&(n=this._downgradeInstance(t,n.__key__)),e[n.__key__]=t,n.isPlaceholder||n.__setProperty(this.indexAs,t,!0)}this._pool.length=0,this._setRenderedItemCount(this._instances.length),this.fire("dom-change"),this._tryRenderChunk()},_applyFullRefresh:function(){var e,t=this.collection;if(this._sortFn)e=t?t.getKeys():[];else{e=[];var n=this.items;if(n)for(var r=0;r=r;a--)this._detachAndRemoveInstance(a)},_numericSort:function(e,t){return e-t},_applySplicesUserSort:function(e){for(var t,n,r=this.collection,s={},i=0;i=0;i--){var h=a[i];void 0!==h&&this._detachAndRemoveInstance(h)}var c=this;if(l.length){this._filterFn&&(l=l.filter(function(e){return c._filterFn(r.getItem(e))})),l.sort(function(e,t){return c._sortFn(r.getItem(e),r.getItem(t))});var u=0;for(i=0;i>1,a=this._instances[o].__key__,l=this._sortFn(n.getItem(a),r);if(l<0)e=o+1;else{if(!(l>0)){i=o;break}s=o-1}}return i<0&&(i=s+1),this._insertPlaceholder(i,t),i},_applySplicesArrayOrder:function(e){for(var t,n=0;n=0?(e=this.as+"."+e.substring(n+1),i._notifyPath(e,t,!0)):i.__setProperty(this.as,t,!0))}},itemForElement:function(e){var t=this.modelForElement(e);return t&&t[this.as]},keyForElement:function(e){var t=this.modelForElement(e);return t&&t.__key__},indexForElement:function(e){var t=this.modelForElement(e);return t&&t[this.indexAs]}}),Polymer({is:"array-selector",_template:null,properties:{items:{type:Array,observer:"clearSelection"},multi:{type:Boolean,value:!1,observer:"clearSelection"},selected:{type:Object,notify:!0},selectedItem:{type:Object,notify:!0},toggle:{type:Boolean,value:!1}},clearSelection:function(){if(Array.isArray(this.selected))for(var e=0;e
[[_text]]
![[[stateObj.entityDisplay]]]([[cameraFeedSrc]])
[[stateObj.entityDisplay]](Error loading image)
[[stateObj.entityDisplay]]
[[computeTargetTemperature(stateObj)]]
Currently: [[stateObj.attributes.current_temperature]] [[stateObj.attributes.unit_of_measurement]]

[[stateObj.stateDisplay]]
[[_charCounterStr]][[errorMessage]]
[[item]][[computePrimaryText(stateObj, isPlaying)]]
[[secondaryText]]
[[computeTargetTemperature(stateObj)]]
Currently: [[stateObj.attributes.current_temperature]] [[stateObj.attributes.unit_of_measurement]]
[[stateObj.entityDisplay]][[computeTitle(states, groupEntity)]]
To install Home Assistant, run:
pip3 install homeassistant
hass --open-ui
Here are some resources to get started.
To remove this card, edit your config in configuration.yaml
and disable the introduction
component. [[stateObj.entityDisplay]]
[[playerObj.primaryText]]
[[playerObj.secondaryText]]
[[stateObj.state]]
DISMISS[[computeTitle(views, locationName)]]
[[locationName]][[item.entityDisplay]] {{text}}
No state history found.
[[formatAttribute(attribute)]]
[[getAttributeValue(stateObj, attribute)]]
[[itemCaption(item)]]
[[itemValue(item)]]
Elevation
[[stateObj.attributes.elevation]]
Last Action
[[stateObj.attributes.last_action]]
[[caption]]
![[[stateObj.entityDisplay]]]([[computeCameraImageUrl(hass, stateObj)]])
{{finalTranscript}} [[interimTranscript]] …