From cac7f8d1abd25005bb3687734061eda3bf628443 Mon Sep 17 00:00:00 2001 From: Malte Franken Date: Mon, 17 Dec 2018 19:04:58 +1100 Subject: [PATCH] Extended map to support geo location entities (#2337) * initial version of geo location map * configuring entities not required but source is * extending existing map instead of adding a new one * renamed source to geo_location_source; clearer handling of geo location entities vs defined entities * geo location sources must now be an array * code cleanup --- src/panels/lovelace/cards/hui-map-card.js | 37 +++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/hui-map-card.js b/src/panels/lovelace/cards/hui-map-card.js index 32a7631c6d..e6dd8960e6 100644 --- a/src/panels/lovelace/cards/hui-map-card.js +++ b/src/panels/lovelace/cards/hui-map-card.js @@ -111,8 +111,24 @@ class HuiMapCard extends PolymerElement { throw new Error("Error in card configuration."); } - this._configEntities = processConfigEntities(config.entities); + if (!config.entities && !config.geo_location_sources) { + throw new Error( + "Either entities or geo_location_sources must be defined" + ); + } + if (config.entities && !Array.isArray(config.entities)) { + throw new Error("Entities need to be an array"); + } + if ( + config.geo_location_sources && + !Array.isArray(config.geo_location_sources) + ) { + throw new Error("Geo_location_sources needs to be an array"); + } + this._config = config; + this._configGeoLocationSources = config.geo_location_sources; + this._configEntities = config.entities; } getCardSize() { @@ -205,7 +221,24 @@ class HuiMapCard extends PolymerElement { } const mapItems = (this._mapItems = []); - this._configEntities.forEach((entity) => { + let allEntities = []; + if (this._configEntities) { + allEntities = allEntities.concat(this._configEntities); + } + if (this._configGeoLocationSources) { + Object.keys(this.hass.states).forEach((entityId) => { + const stateObj = this.hass.states[entityId]; + if ( + computeStateDomain(stateObj) === "geo_location" && + this._configGeoLocationSources.includes(stateObj.attributes.source) + ) { + allEntities.push(entityId); + } + }); + } + allEntities = processConfigEntities(allEntities); + + allEntities.forEach((entity) => { const entityId = entity.entity; if (!(entityId in hass.states)) { return;