Compare commits

...

860 Commits

Author SHA1 Message Date
Bram Kragten
c1eabeb29f Remove light card for generated mode 2020-01-17 21:53:38 +01:00
Paulus Schoutsen
5ff8fe68ba Alert user when add-on not started (#4485) 2020-01-17 17:02:56 +01:00
David F. Mulcahey
a2a039ebc5 Add group binding to the ZHA config panel and misc. cleanup (#4466)
* clean up zha device card and usage

* group binding tile

* add cluster selection to group binding tile

* fix css class name

* fix filtering

* multiselect for clusters in group binding

* pass narrow to cluster table

* fix tables

* fix device page

* address remaing comments from previous PR

* fix bad cherry-pick

* css cleanup

* consistency

* use properties

* translations

* add confirmation dialog to remove button

* fix css

* review comments

* remove noise
2020-01-17 16:39:57 +01:00
Ian Richardson
1064aed1b0 📝 make some Lovelace UI text more clear (#4500) 2020-01-17 09:54:16 +01:00
Ian Richardson
7025592e8e 🐛 fix picture glance card's camera_view option in editor (#4495) 2020-01-17 09:44:57 +01:00
HomeAssistant Azure
4966354b62 [ci skip] Translation update 2020-01-17 00:32:37 +00:00
David F. Mulcahey
68d6faf4af fix selection check (#4488) 2020-01-16 18:19:01 +01:00
Paulus Schoutsen
e3346483b9 Hide device trackers from generated lovelace (#4487) 2020-01-16 08:57:41 +01:00
HomeAssistant Azure
e8fb79e5ce [ci skip] Translation update 2020-01-16 00:32:40 +00:00
Alexei Chetroi
d612162ab1 Fix ZHA add device path. (#4486) 2020-01-15 20:05:05 +01:00
Bram Kragten
86f8ef3a70 Styling focus menus (#4483)
* Styling menus

* Update ha-config-navigation.ts
2020-01-15 19:41:56 +01:00
Bram Kragten
0e43435362 Don't ask to choose view when only 1 view (#4480) 2020-01-15 09:05:01 -08:00
Bram Kragten
aaefe0b09f Handle unknown state (#4481) 2020-01-15 09:01:59 -08:00
Bram Kragten
bc731a9dc3 Add edit btn to more info for scene, script and automation (#4476) 2020-01-15 09:50:16 +01:00
Bram Kragten
da25701dca Disable adoptedStyleSheets in dev (#4474) 2020-01-15 09:25:17 +01:00
Bram Kragten
21ae483dc9 Styling fixes (#4475) 2020-01-15 09:25:04 +01:00
HomeAssistant Azure
38b6e9ca10 [ci skip] Translation update 2020-01-15 00:32:57 +00:00
Bram Kragten
d31245866c Add DEPRECATED to states ui (#4463)
* Add DEPRECATED to states ui

* unelevated red

* target

* Add msg in info
2020-01-14 06:35:01 -08:00
Bram Kragten
4e08d8f3b3 Fix zha back btn (#4470) 2020-01-14 07:57:00 -05:00
Bram Kragten
1e717ab33e Catch undefined cloudstatus (#4465) 2020-01-14 13:52:23 +01:00
Bram Kragten
995fb4974e Fix translations (#4469) 2020-01-14 13:20:06 +01:00
HomeAssistant Azure
ffb76132f8 [ci skip] Translation update 2020-01-14 00:32:29 +00:00
Bram Kragten
acba3af54b Fix back btn for Polymer (#4467) 2020-01-13 18:21:43 +01:00
Paulus Schoutsen
40ac456937 Force refresh tokens if external app (#4461) 2020-01-13 05:47:08 -08:00
Bram Kragten
5c32413bf7 Onboarding core: Display error message when saving fails (#4462) 2020-01-13 05:31:53 -08:00
Bram Kragten
22792c70c5 Change config panel navigation (#4377)
* Change config panel navigation

* Show active + don't show toolbar?

* Update ha-panel-config.ts

* Change color of menu toolbar

* Update ha-config-router.ts

* Review comments
2020-01-12 17:57:38 +01:00
Krisjanis Lejejs
a8ed87298a Improved map panel and map card to ignore zones when fitting map. (#4447)
* Improved map panel and map card to ignore zones when fitting map. [#1598](https://github.com/home-assistant/home-assistant-polymer/issues/1598)

* Improved map panel and map card to ignore zones when fitting map. [#1598](https://github.com/home-assistant/home-assistant-polymer/issues/1598)

* Improved map panel and map card to ignore zones when fitting map. [#1598](https://github.com/home-assistant/home-assistant-polymer/issues/1598)

* Changed approach and created a different array for zones

* Removed zone key option for markers
2020-01-12 17:56:55 +01:00
Joakim Sørensen
b15270dfe2 Use correct suffix for elevation (#4454)
* Use correct suffix for elevation

* Use correct suffix for elevation
2020-01-12 07:31:59 -08:00
Bram Kragten
58ad949bc8 Virtualize logbook (#4450)
* Virtualize logbook

* Clean

* Update ha-logbook.ts
2020-01-12 13:00:26 +01:00
HomeAssistant Azure
adce40de56 [ci skip] Translation update 2020-01-12 00:33:31 +00:00
Ian Richardson
0f487ae4bf Add tabindex to lovelace elements (#4160)
* tabindex

* use action handler

* circular focus test

* address comment

* add focus styling to other elements

* add focus styling to cards

* style glance card entities

* Add back light/thermo changes that were lost in rebase

* Remove unused import

* lint

* lint

* 💄 tweak focus style for glance entities

* 💄 apply styling to focused state-label-badges
2020-01-11 11:50:43 +01:00
Joakim Sørensen
2848e3a63b Adds CCS var usage to person dialog (#4449) 2020-01-11 11:49:57 +01:00
Bram Kragten
5a172a64c5 Make entry flow dialog modal (#4440)
* Make entry flow dialog modal

* Add close button

* Update dialog-data-entry-flow.ts

* Fix aria-label
2020-01-10 16:40:19 -08:00
HomeAssistant Azure
433aa16ea6 [ci skip] Translation update 2020-01-11 00:32:34 +00:00
HomeAssistant Azure
50cb8cf3cc [ci skip] Translation update 2020-01-10 00:32:38 +00:00
Sean Mooney
4e5406b27b Typo fix in issue template (#4445)
fixes small typo, necesarry = necessary
2020-01-09 09:29:42 -06:00
Franck Nijhof
80eb80619a Add configuration for Lock Threads on closed pull requests (#4443) 2020-01-09 11:40:25 +01:00
Ian Richardson
bf71b3a869 ♻️ convert ha-attributes to lit-element (#4350)
* ♻️ convert ha-attributes to lit-element

* Address comments

* inline items

* 🐛 Fix attribution display logic
2020-01-09 10:22:23 +01:00
HomeAssistant Azure
ff270c4b7d [ci skip] Translation update 2020-01-09 00:32:44 +00:00
David F. Mulcahey
5415068917 Rework the ZHA config panel (#4415)
* convert zha config panel to tabs

* add spacer to prevent combobox from hitting bottom

* break clusters out into their own section

* cleanup buttons

* remove header

* make devices default tab

* convert from tabs to a list view

* convert to table on dashboard

* fix anchor on mobile safari

* cleanup CSS to fix display on mobile

* cleanup card css

* more css cleanup

* fix group page

* remove translations changes

* Update src/panels/config/zha/zha-clusters.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-config-dashboard.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-device-page.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-groups-dashboard.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* review comments

* fix dangling quote after commit suggestion

* css cleanup

* remove flex rules

* remove flex rules

* css  cleanup

* remove dialog per review comments

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-01-08 18:35:21 +01:00
Bram Kragten
357a67c00d Bumped version to 20200108.0 2020-01-08 18:26:20 +01:00
HomeAssistant Azure
cbe4269320 [ci skip] Translation update 2020-01-08 17:25:54 +00:00
Bram Kragten
fbd5185ce2 Add ability to remove Lovelace config (#4430)
* Add ability to remove Lovelace config

* Update hc-lovelace.ts
2020-01-08 18:19:10 +01:00
Bram Kragten
a33cf97e2c Fix moving actions with data (#4438) 2020-01-08 18:18:53 +01:00
Pascal Vizeli
7e7da26543 Update azure-pipelines-translation.yml for Azure Pipelines 2020-01-08 16:54:09 +01:00
Bram Kragten
79058e893b Add alert when Google sync failed (#4435) 2020-01-08 15:59:22 +01:00
Bram Kragten
2eb548bb74 Merge branch 'master' into dev 2020-01-07 20:53:23 +01:00
Bram Kragten
08baf8a757 Bumped version to 20200107.0 2020-01-07 20:50:51 +01:00
Bram Kragten
f02fa6a94b Add multi select to entity registry (#4424)
* Add multi select to entity registry

* Fix filter and sort on status

* Remove unused prop platform

* Review

* Update ha-config-entity-registry.ts
2020-01-07 12:29:42 +01:00
Bram Kragten
2ed6d0e73c Make modal of Lovelace editor dialogs (#4426)
Fixes #4425
2020-01-06 22:25:17 +01:00
David F. Mulcahey
35d9b2ac3c Add the ability to create new Zigbee groups to the ZHA config panel (#4384)
* add group page

* Update src/panels/config/zha/zha-add-group-page.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* fix group name handling

* Update src/panels/config/zha/zha-add-group-page.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-01-06 07:02:47 -05:00
Bram Kragten
18d09c6f04 Add UI for restored entities (#4414)
* Add UI for restored entities

* Add conformation for removal

* Apply suggestions

* Guard
2020-01-03 12:44:25 +01:00
Joakim Sørensen
70b81de49d Force rerender on update/save (#4396)
* Force rerender on update/save

* Fix linting issue

* Define properties by using @property() instead

* Add styles to disabled save button

* Change to use @customElement, and remove _generation as a property.
2020-01-02 21:15:26 +01:00
David Cramer
f0808c1f54 Add ha-subppage toolbar css styles (#4409) 2020-01-02 20:55:43 +01:00
Jay
e779f0747e Change TRIGGER to EXECUTE (#4413)
There's been some confusion among new users about what the `TRIGGER` button does in the automation info popup. `EXECUTE` better represents what pressing that button does since it bypasses conditions and simply runs the action like a script. The automation docs at <https://www.home-assistant.io/docs/automation/action/> also say "The action of an automation rule is what is being executed when a rule fires."
2020-01-02 20:16:39 +01:00
David F. Mulcahey
bdd18775c3 Add group editing to the ZHA config panel (#4382)
* add group editing

* Update src/panels/config/zha/zha-devices-data-table.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-group-page.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-devices-data-table.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-group-page.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-group-page.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/zha/zha-group-page.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* review comments

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-01-02 15:59:18 +01:00
David F. Mulcahey
711d51c022 Disable ZHA device binding buttons when a device to bind isn't selected (#4407)
* only enable buttons when a device is selected

* review comments
2020-01-02 07:24:40 -05:00
David F. Mulcahey
1b0d8bba29 fix area index on ZHA device card (#4406) 2020-01-02 10:50:19 +01:00
Colin Frei
2988cc512f Fix grammatical error (#4403) 2020-01-02 10:28:36 +01:00
Joakim Sørensen
a2f8e5f3e7 Hide protection mode toggle if not usable (#4392) 2020-01-02 10:20:21 +01:00
David F. Mulcahey
680bf06a4b Add group detail view to the ZHA config panel (#4380)
* add group details

* review comments
2019-12-24 10:29:22 -05:00
David F. Mulcahey
ff0b1881e2 Add Zigbee group removal to the ZHA config panel (#4376)
* add remove groups function

* add ability to remove groups

* translations

* review comments

* review comments

* review comments
2019-12-24 08:12:02 -05:00
David F. Mulcahey
de653e1f7b Add Zigbee group viewing to ZHA config panel (#4365)
* add ability to view zigbee groups

* review comments

* remove selectable until used
2019-12-23 10:46:34 -05:00
Bram Kragten
bb41170765 Add language Iban (#4375) 2019-12-23 16:27:41 +01:00
Bram Kragten
0ed2bc93aa Remove uploading translations from Travis (#4374) 2019-12-23 13:39:47 +01:00
Bram Kragten
04770f8ee2 Add language Esperanto (#4373) 2019-12-23 13:39:31 +01:00
Bram Kragten
15a2790b9f Add support to add all device entities to Lovelace (#4356)
* Add support to add all device entities to Lovelace

* Reload config when it was changed while Lovelace was not active

* Localize

* Update ha-panel-lovelace.ts

* Move to device entities card

* Move Lovelace logic to lovelace combine with unused entities

* Unused imports

* Added suggestions and support for YAML mode
2019-12-23 10:39:17 +01:00
Jc2k
83880791b1 Add 'unignore' to DISCOVERY_SOURCES that can be ignored. (#4370) 2019-12-21 17:10:20 +01:00
HomeAssistant Azure
4dca3289f6 [ci skip] Translation update 2019-12-19 16:07:21 +00:00
Pascal Vizeli
083a3ebfc4 Run translation on dev (#4368) 2019-12-19 17:03:05 +01:00
Pascal Vizeli
6117c4e989 Add Auto Translation handling (#4339)
* Add Auto Translation handling

* Cleanup
2019-12-18 16:38:36 +01:00
Bram Kragten
609763e658 Set focus to search when opening add integration dialog (#4357)
* Set focus to search when opening add integration dialog

* Also add to flow form
2019-12-18 16:35:20 +01:00
Bram Kragten
2c57ab60f1 Add ignore discovery button (#4354)
* Add ignore discovery button

* Add seperate list for ignored integrations

* Move translations

* Add zeroconf
2019-12-18 16:22:17 +01:00
Ian Richardson
dd17a153d2 Fire custom LL event (#4361) 2019-12-18 07:40:26 +01:00
Bram Kragten
c2d551bb7c Merge pull request #4341 from bonanitech/patch-2
Upgrade MDI icons to 4.7.95
2019-12-12 17:20:24 +01:00
Mauricio Bonani
e0b1921108 Fix version number 2019-12-09 12:40:11 -05:00
Mauricio Bonani
fcf39ceb96 Upgrade MDI icons to 4.7.95 2019-12-09 12:27:03 -05:00
Mauricio Bonani
3cc979a077 Upgrade MDI icons to 4.7.95 2019-12-09 12:24:36 -05:00
Bram Kragten
9972973774 Merge pull request #4338 from home-assistant/rc
20191204.1
2019-12-09 13:41:33 +01:00
Bram Kragten
20ae32bc26 Bumped version to 20191204.1 2019-12-09 13:03:17 +01:00
Bram Kragten
a29892023b Revert "Add copy entity ID/state/attributes menu button in dev tools/states" (#4337)
* Revert "Add copy entity ID/state/attributes menu button in dev tools/states (#4259)"

This reverts commit 4b56db5255.

* Update package.json
2019-12-09 13:02:41 +01:00
Bram Kragten
b283fec482 Update cloud-google-assistant.ts (#4329) 2019-12-09 13:02:17 +01:00
Bram Kragten
e0116a8236 Fix thingtalk automations creation (#4328) 2019-12-09 13:01:56 +01:00
Bram Kragten
d1990a4bac Revert "Add copy entity ID/state/attributes menu button in dev tools/states" (#4337)
* Revert "Add copy entity ID/state/attributes menu button in dev tools/states (#4259)"

This reverts commit 4b56db5255.

* Update package.json
2019-12-09 12:59:20 +01:00
Bram Kragten
cbba1849e2 Convert script and automation editor to lit (#4327)
* Convert script and automation editor to lit

* Update yarn.lock
2019-12-09 10:59:52 +01:00
Bram Kragten
43393d1647 Update cloud-google-assistant.ts (#4329) 2019-12-09 08:34:36 +01:00
Bram Kragten
b47ee1051c Fix thingtalk automations creation (#4328) 2019-12-07 20:46:04 +01:00
Bram Kragten
393adacc9e Convert automation actions/scripts to Lit (#4324)
* Convert automation actions/scripts to Lit

* Update ha-automation-action-row.ts

* Comments
2019-12-06 12:14:45 +01:00
Bram Kragten
073428849e Convert automation conditions to Lit (#4321)
* Convert automation conditions to Lit

* Split condition editor and row

* Comments

* Update automation.ts

* Update automation.ts
2019-12-05 19:48:06 +01:00
Bram Kragten
e6ac0258e3 Use dynamicElement directive in ha-form (#4317)
* Use dynamicContentDirective

* Turn around

* Remove attributes

* Rename to dynamicElement
2019-12-04 22:58:35 +01:00
Bram Kragten
d7e7798a55 Merge pull request #4318 from home-assistant/dev
20191204.0
2019-12-04 20:02:41 +01:00
Bram Kragten
2557414b11 Merge branch 'master' into dev 2019-12-04 19:30:47 +01:00
Bram Kragten
f7065fbce9 Bumped version to 20191204.0 2019-12-04 19:28:47 +01:00
Bram Kragten
016564eee9 Update translations 2019-12-04 19:22:23 +01:00
Bram Kragten
ff3087c39c Convert automation trigger to litelement (#4315)
* Convert automation trigger to Lit

* Update ha-automation-trigger-row.ts

* dynamicContentDirective

* update

* Lint

* Implement other types
2019-12-04 09:57:47 -08:00
Bram Kragten
239438ee5d Add entity picker to service call action (#4310)
* Add entity picker to service call action

* Use prop instead of attr
2019-12-03 12:30:51 +01:00
Florian Gareis
5458cda31f Add new confim dialog to automation editor (#4255) 2019-12-03 12:21:51 +01:00
Bram Kragten
36f49e66fd Remove empty defaults from time patern trigger automation (#4307) 2019-12-02 11:11:05 -08:00
Bram Kragten
2bafd38ea8 Allow automation actions/scripts to be moved up/down (#4308)
* Allow automation actions/scripts to be moved up/down

* Update index.tsx
2019-12-02 11:10:44 -08:00
Bram Kragten
73b3262491 Fix editing delay action (#4309) 2019-12-02 11:08:38 -08:00
Bram Kragten
808cde033f Update bug_report.md 2019-12-02 17:39:39 +01:00
Bram Kragten
fa8f6b7b91 Add yaml editor to automation actions and scripts (#4306)
* Add yaml editor to automation actions and scripts

* Add types

* Update event.tsx
2019-12-02 14:08:19 +01:00
Bram Kragten
94c120cdb1 Add yaml editor to automation conditions (#4305) 2019-12-02 12:02:35 +01:00
Bram Kragten
7b2be54f8f YAML support for automation triggers (#4289)
* WIP: Add yaml editors to automation

* Fix form overwriting yaml on switching back

* Finish triggers

* prettier
2019-12-02 11:20:09 +01:00
nicop4
4b56db5255 Add copy entity ID/state/attributes menu button in dev tools/states (#4259)
* Added button and js method to copy with copy-to-clipboard library

* Copy entity id working, tooltip added

* copy ok, use ha toast to notify ok

* cleanup code

* add translation

* removed old useless code

* Replaced copy button with menu

* Fix comparison operator & removed commented code

	modifié :         src/panels/developer-tools/state/developer-tools-state.js

* Fix spaces

	modifié :         src/panels/developer-tools/state/developer-tools-state.js

* Improve copy attributes

* only one menu & update translation

* copy attributes in yml format
use paper-icon-item instead of paper-icon-button and add yarn.lock

* removed paper-item
2019-12-02 10:35:49 +01:00
Bram Kragten
93165c9111 Area/multiple devices and name support for thingtalk automations (#4272)
* WIP: Area/multiple devices and name support

* Fix removing devices

* Don't recalc entities for all devices every time

* Use guards

* Update ha-thingtalk-placeholders.ts
2019-12-02 10:30:30 +01:00
Bram Kragten
caa604d5ca Add more aria labels (#4293)
* Add aria labels

* Fix polymer binding
2019-12-02 09:29:02 +01:00
Thomas Lovén
e7e9e2cf85 Allow setting temperature to 0 degrees (#4300) 2019-12-02 09:23:20 +01:00
Bram Kragten
daa04e9973 Fix jumping on iOS when toggle switch (#4275) 2019-11-29 12:41:37 +01:00
Bram Kragten
5355269f5d Check if external app by object (#4280)
* Check if external app by object

* Update core.ts

* Conditional chaining

* add babel optional chaining
2019-11-27 15:44:59 -08:00
Bram Kragten
2665a75250 Don't show hidden scenes (#4285)
* Don't show hidden scenes

* Comments

* computeStateDomain
2019-11-27 15:44:28 -08:00
Bram Kragten
8a39d18323 Bump TypeScript to 3.7 (#4282)
* Bump TypeScript to 3.7

* Update prettier to support ts 3.7

* Prettier

* More prettier

* Even more prettier
2019-11-27 13:51:03 -08:00
Bram Kragten
b8a026397b Don't filter attributes when saving scene (#4278)
* Add cover attributes to scene editor

* Add more

* Remove filtering of attributes

* Update ha-scene-editor.ts
2019-11-27 13:43:46 -08:00
Bram Kragten
bd5fe302eb Revert "Add specific maskable icons (#4283)" (#4284)
This reverts commit de0f1b2b65.
2019-11-27 20:23:58 +01:00
Bram Kragten
de0f1b2b65 Add specific maskable icons (#4283) 2019-11-27 16:43:23 +01:00
Thomas Lovén
defaa2b276 Fix missing semicolons in CSS (#4281)
Introduced in #4269
2019-11-27 13:06:02 +01:00
Bram Kragten
60efe00a1f Fix styling of vaadin elements (#4276) 2019-11-26 16:57:29 +01:00
Davide Varricchio
fe93b993db Change to thermostat card to reflect step_temp on set-temperature (#4221)
* Minor change to thermostat card to reflect step_temp on set-temperature

* Corrected indentation

* Resolved eslint error
2019-11-25 17:42:38 +01:00
Joakim Sørensen
f6afc92d3c Adds "air" at the bottom of the page (#4267)
* Adds "air" at the bottom of the page

* Update src/panels/config/dashboard/ha-config-dashboard.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Add margin to promo
2019-11-25 17:38:08 +01:00
Carlos Gustavo Sarmiento
e4c635c855 Added new CSS property for styling of the app-header component (#4269) 2019-11-25 17:37:33 +01:00
Bram Kragten
a3e59e168f Bumped version to 20191119.6 2019-11-23 21:31:19 +01:00
Thomas Lovén
e56355b406 Bump round-slider version. Fix #4265 (#4266) 2019-11-23 21:30:54 +01:00
Mauricio Bonani
8ef15c50b4 Upgrade MDI icons to 4.6.95 (#4270)
* Upgrade MDI icons to 4.6.95

* Upgrade MDI icons to 4.6.95
2019-11-23 21:26:32 +01:00
Marius
81588469b8 Add secondary-info: last-triggered (#4222)
* Add secondary-info: last-triggered

add last-triggered to the currently available options 'entity-id' and 'last-changed' see:https://www.home-assistant.io/lovelace/entities/#secondary_info

* corrected omission 'attributes'

* added test for attributes.last_triggered

* Update hui-generic-entity-row.ts

* Update hui-generic-entity-row.ts
2019-11-23 21:19:26 +01:00
Joakim Sørensen
70a920af3c Add initial bg color to panels (#4268) 2019-11-23 21:18:54 +01:00
Thomas Lovén
1329e60c89 Bump round-slider version. Fix #4265 (#4266) 2019-11-23 21:12:48 +01:00
Bram Kragten
9b7c095080 Bumped version to 20191119.5 2019-11-21 17:25:50 +01:00
Bram Kragten
654ff99cd1 Bumped version to 20191119.4 2019-11-21 17:04:43 +01:00
Bram Kragten
0511bc360e iOS 9 doesn't support append (#4260) 2019-11-21 17:04:36 +01:00
Bram Kragten
ea9e8cc392 iOS 9 doesn't support append (#4260) 2019-11-21 17:03:35 +01:00
Bram Kragten
8433678371 Bumped version to 20191119.3 2019-11-21 15:22:07 +01:00
Bram Kragten
757bc00854 Fix thermostat card (#4258)
* Fix thermostat card

* Change styling

* Remove margin on mode buttons
2019-11-21 15:21:45 +01:00
Bram Kragten
2551393821 Fix light card (#4257)
* Fix light card

* Remove unused class

* Fix for when entity is not available

* Fix active state
2019-11-21 15:21:20 +01:00
Bram Kragten
0acd41b7f0 Fix thermostat card (#4258)
* Fix thermostat card

* Change styling

* Remove margin on mode buttons
2019-11-21 15:18:16 +01:00
Bram Kragten
85ca73db84 Fix light card (#4257)
* Fix light card

* Remove unused class

* Fix for when entity is not available

* Fix active state
2019-11-21 15:17:55 +01:00
Bram Kragten
444cbd00d9 Update README.md 2019-11-21 15:05:42 +01:00
Bram Kragten
15b500886c Bumped version to 20191119.2 2019-11-20 11:02:01 +01:00
Thomas Lovén
3aac834e72 Version bump round-slider. Fix bad rendering in IE/Edge (#4249) 2019-11-20 11:01:32 +01:00
Thomas Lovén
6edf23b91f Version bump round-slider. Fix bad rendering in IE/Edge (#4249) 2019-11-20 10:55:06 +01:00
Bram Kragten
e445251b02 Bumped version to 20191119.1 2019-11-19 21:08:29 +01:00
Bram Kragten
693151b590 Fix ha-form on edge (#4248) 2019-11-19 21:08:15 +01:00
Bram Kragten
1249c0eea9 Fix ha-form on edge (#4248) 2019-11-19 21:06:52 +01:00
Bram Kragten
3133118870 Update vaadin components (#3571)
* Update vaadin components

* Remove resolution

* Migrate person detail dialog to mwc-dialog

* Fix imports

* Update dialog-person-detail.ts
2019-11-19 11:35:37 -06:00
Bram Kragten
de5c1a0545 Merge pull request #4246 from home-assistant/dev
20191119.0
2019-11-19 13:37:07 +01:00
Bram Kragten
c61e2fb459 Bumped version to 20191119.0 2019-11-19 13:19:33 +01:00
Bram Kragten
64a2a19da3 Update translations 2019-11-19 13:19:27 +01:00
Bram Kragten
74fe1f820c Fix error when no entities (#4244) 2019-11-19 13:16:55 +01:00
Bram Kragten
69929f5dc3 Fix thermostat unavailable (#4245) 2019-11-19 13:16:38 +01:00
Bram Kragten
fcd793fc9e Fix device filtering on mobile (#4243) 2019-11-19 11:41:56 +01:00
Bram Kragten
8a3b1d76a1 Fix removing entity in scene editor (#4241)
Fixes https://github.com/home-assistant/home-assistant-polymer/issues/4237
2019-11-19 00:35:16 +01:00
Thomas Lovén
9f520d7628 Use new scaling features of round-slider (#4172)
* Refresh light card.

* Refresh thermostat card

* Fix paddings

* Fix #4175

* Use action handler

* Address review comments

* Lint

* Padding on percentage

* Remove typo
2019-11-19 00:32:23 +01:00
Bram Kragten
258cfddc3f Remove alias from scene action (#4240)
Fixes https://github.com/home-assistant/home-assistant-polymer/issues/4239
2019-11-19 00:28:35 +01:00
Bram Kragten
3697500402 Fix min value in editor (#4236) 2019-11-19 00:28:08 +01:00
springstan
b4942ad27e Fixed two-part pin code input in Manual Alarm Control Panel (#4213)
* Consolidated code input via clicking GUI pads and using a physical keyboard

* Replaced the querySelector with the query decorator

* Run the query selector once, store its result and reuse it multiple times
2019-11-19 00:27:48 +01:00
Ville Skyttä
1e217e8d2f Support email and url form input types (#4186)
* Support email and url form input types

* Lint

* Lint

* Add types
2019-11-18 18:03:19 +01:00
Bram Kragten
0056237d85 Merge pull request #4233 from home-assistant/dev
20191118.0
2019-11-18 13:08:58 +01:00
Bram Kragten
920ee741f3 Bumped version to 20191118.0 2019-11-18 12:50:11 +01:00
Bram Kragten
6ecc60423f Fix actions not working on touch devices (#4231) 2019-11-18 11:27:44 +01:00
MatthewFlamm
09e7638c89 fix evaluating to false and remove ; (#4228) 2019-11-18 09:00:50 +01:00
Bram Kragten
b82b4a639e Merge pull request #4227 from home-assistant/demo-manifest
Add maskable icon directive to demo manifest
2019-11-18 08:54:07 +01:00
Paulus Schoutsen
d08aa51c16 Add maskable icon directive to demo manifest 2019-11-16 12:09:29 +01:00
Bram Kragten
385ffe6d8f Merge pull request #4226 from home-assistant/dev
20191115.0
2019-11-15 20:21:09 +01:00
Bram Kragten
564e6d4073 Bumped version to 20191115.0 2019-11-15 20:06:35 +01:00
Bram Kragten
a4bd816eb5 Fix localise escaping issue (#4225) 2019-11-15 19:59:47 +01:00
Bram Kragten
13c18a9bb7 Merge pull request #4224 from iantrich/fix-filter-badge
Fix entity-filter-badge update
2019-11-15 19:59:25 +01:00
Ian Richardson
562d7a7cf4 use lastChild 2019-11-15 11:10:47 -06:00
Ian Richardson
89f33a1730 Fix entity-filter-badge update 2019-11-15 09:45:50 -06:00
Bram Kragten
ff7309f5c4 Merge pull request #4218 from home-assistant/dev
20191114.0
2019-11-14 13:47:21 +01:00
Bram Kragten
1c614c855f Bumped version to 20191114.0 2019-11-14 13:28:28 +01:00
Bram Kragten
6a3238951d Updated translations 2019-11-14 13:28:06 +01:00
Bram Kragten
0dab5828fb Add Thingtalk automation generation (#4216)
* thingtalk

* works

* Add device_class support and get placeholders from api

* Update
2019-11-14 13:22:44 +01:00
Joakim Sørensen
d0b9c09f8f Fix person dialog issues (#4210)
* Fix person dialog issues

* Remove repo (should not have been committed...)

* Trigger Travis
2019-11-12 20:30:11 +01:00
Josh McCarty
55f4629256 Wrap the dialog title when using Entity Registry (#4174)
* Wrap the dialog title when using Entity Registry

* Move updated styles to styles()
2019-11-12 14:52:56 +01:00
Joakim Sørensen
004565217e Restructure/reorder configuration dashboard (#4202)
* Reoreder config dashboard

* Changes base translation for config dashboard items to be pleural

* Convert to lit/ts

* remove unneded stuff

* fix child property passes

* Export page configuration

* Apply suggestion

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Change property to CloudStatus
2019-11-10 23:25:13 +01:00
Bram Kragten
c07b39ebde Fix device and entity pickers clear (#4206)
* Fix device and entity pickers clear

* Prevent combobox to open on clear
2019-11-10 13:25:07 -08:00
Bram Kragten
8b17b6ed1c Add attribution and onboarding to voice (#4190)
* Add attribution and onboarding to voice

* Align with backend changes

* Layout + switch to ws for process

* Don't mutate window

* Move speechRecognition

* Add border

* Update ha-voice-command-dialog.ts
2019-11-10 11:30:41 -08:00
Paulus Schoutsen
1d16bdbe54 Merge pull request #4201 from home-assistant/lokalise
Update lokalise cli to version 2 + fix replacing localise vars
2019-11-10 11:30:08 -08:00
Joakim Sørensen
9e2a0c77d5 Adds clear value handler (#4205)
* Adds clear value handler

* Add the same to device picker
2019-11-10 19:23:27 +01:00
Joakim Sørensen
4f41508110 Adds timestamp device_class for sensor (#4204) 2019-11-10 18:41:33 +01:00
Joakim Sørensen
eaedb2e5ae Checked button colors (#4203)
* split switch-checked-color into 2 vars like the unchecked variant

* Apply new css vars

* revert accidental delete

* revert demo changes

* revert property change
2019-11-10 18:40:36 +01:00
Bram Kragten
75ad1f51a9 Update translations_upload_base 2019-11-09 23:49:26 +01:00
Bram Kragten
142175c6ab Update lokalise cli to version 2 + fix replacing localise vars 2019-11-09 23:47:58 +01:00
Joakim Sørensen
f1980d6bcf Fixes history graph card defaults (#4198) 2019-11-09 17:30:08 +01:00
Joakim Sørensen
5a7b5200fe Change correct localization string (#4197)
* Change correct localization string

* Update en.json
2019-11-09 17:29:14 +01:00
Joakim Sørensen
d284d53b93 Reload buttons (#4194)
* Change base translation for ui.panel.config.server_control.section.reloading.core

* Give each btn a new card-action div
2019-11-08 14:39:21 -08:00
Bram Kragten
bc01df42d8 Merge pull request #4193 from home-assistant/dev
20191108.0
2019-11-08 17:41:58 +01:00
Bram Kragten
901752bec3 Update translations (#4192) 2019-11-08 17:12:48 +01:00
Bram Kragten
e3ef3cfae1 Bumped version to 20191108.0 2019-11-08 17:12:28 +01:00
Paulus Schoutsen
ab476d2f1b Add conversation ID to voice dialog (#4189) 2019-11-07 12:21:37 -08:00
Bram Kragten
5ca82fd39c Fix mobile support for voice dialog (#4154)
* Fix mobile support for voice dialog

* Update ha-voice-command-dialog.ts

* typo

* Add extra data functions

* Start listening for choice

* Remove extra data logic
2019-11-04 12:34:59 -08:00
Bram Kragten
da35c263d2 Add scene editor (#4164)
* Add scene editor

* Update ha-config-scene.ts

* Update en.json

* Update ha-scene-editor.ts

* Partial comments

* Types

* 1 more

* Comments

* Lint

* Update ha-device-picker.ts

* Update ha-device-card.ts
2019-11-04 12:07:09 -08:00
Bram Kragten
2a617a9639 Revert "Add Netatmo specific states" (#4171) 2019-11-01 20:35:35 +01:00
springstan
c730aab28f Translated config flow form and steps (#4140)
* Translated config flow form and steps

* Moved translation from config_entry to config_flow

* Renamed translation key from not_all_fields_required to not_all_required_fields
2019-11-01 20:34:10 +01:00
Ian Richardson
274c2016c0 action-handler (#4115)
* action-handler

* comments

* address comments

* finish conversion

* move haptics

* address comments

* lint

* keyup

* double enter

* address comments

* keyup
2019-11-01 13:15:11 -05:00
Bram Kragten
9b3891f778 Fix state-label-badge override name (#4166) 2019-11-01 12:54:14 -05:00
Bram Kragten
b705de956e Fix hassio build (#4167) 2019-11-01 17:42:36 +01:00
Ian Richardson
e37201f84f enter is registering as double_tap (#4161)
* enter is registering as double_tap

* Update long-press-directive.ts

* Update long-press-directive.ts
2019-11-01 16:39:53 +01:00
springstan
f53eea81c4 Translated a bunch of strings (#4137)
* Translated customization page
 - added translation key-value pairs to en.json
 - translated form-customize, customize-icon and its key-value

* Translated mutliple pages:
 - devices
 - entity-registry
 - config-entry
 - dashboard -> hint to advanced mode toggle

* Translated custom panel confirm message

* Added translation for no entries in logbook

* Updated translation keys, tested and removed ha-types file translations

* Removed setting an if to true for testing

* Use template literal instead of string concatenation
2019-11-01 16:12:49 +01:00
springstan
0fa8db1682 Translated unused entities, device registry page and domain toggler dialog (#4141)
* Translated device registry and domain toggler dialog

* Translated unused entities page

* Extracted unused_entities keys and created new section for domain_toggler

* Moved unknow_error and area_picker_label into devices section
2019-11-01 16:07:18 +01:00
Bram Kragten
46f5224e70 Migrate voice command dialog (#4150)
* Migrate voice command dialog

* Cleanup

* Correct types

* Added animation when listening and we should talk back right? :'-)

* Set recognition to english

* Comments

* Update on change of hass
2019-10-29 14:59:35 -07:00
Bram Kragten
12be2a9775 Merge branch 'master' into dev 2019-10-29 15:14:04 +01:00
springstan
6196bbdc5e Translated hui-editor and hui-root pages (#4142) 2019-10-29 13:15:47 +01:00
Marianne Hval
b41f4777d4 More descriptive delete/move buttons + red delete (#4145) 2019-10-29 13:13:30 +01:00
springstan
f2812bc706 Translated automation and script editor (#4146) 2019-10-29 13:12:35 +01:00
Bram Kragten
04500bc237 Merge pull request #4148 from springstan/addTitleAttributeConfigUIMode
Added title attributes and translated them in Configure UI Mode
2019-10-29 13:07:43 +01:00
Bram Kragten
2a6b877cf1 Bumped version to 20191025.1 2019-10-29 12:58:20 +01:00
Bram Kragten
c3896a4613 Only do haptic on entity interactions 2019-10-29 12:56:52 +01:00
Bram Kragten
c6fb896fe4 Merge pull request #4152 from home-assistant/haptics
Only do haptic on entity interactions
2019-10-29 12:53:44 +01:00
Bram Kragten
669fbb7e77 Only do haptic on entity interactions 2019-10-29 12:37:25 +01:00
springstan
971865e4f9 Added title attributes and translated them in Configure UI Mode 2019-10-28 20:13:24 +01:00
Paulus Schoutsen
9078e41855 Clarify tslint disable 2019-10-28 10:45:58 -07:00
Bram Kragten
466c48a7d0 Merge pull request #4128 from Twanislas/netatmo-states-translation
Add Netatmo specific states
2019-10-28 15:51:42 +01:00
Bram Kragten
31a047ce9e Merge pull request #4136 from home-assistant/dev
20191025.0
2019-10-25 17:44:34 +02:00
Bram Kragten
bd24ffa5d0 Bumped version to 20191025.0 2019-10-25 17:12:30 +02:00
Bram Kragten
99f4bd7398 Updated translations 2019-10-25 17:12:22 +02:00
Bram Kragten
417177b097 Merge pull request #4135 from home-assistant/entity-reg-1-col
Change entity reg table to full width
2019-10-25 17:08:43 +02:00
Bram Kragten
c407cab501 Change entity reg table to full width 2019-10-25 16:54:42 +02:00
Bram Kragten
044cf22f47 Fix variable column widths (#4127) 2019-10-24 09:43:28 -07:00
Bram Kragten
75aa940d44 Merge pull request #4129 from home-assistant/delete-view-btn
Fix styling delete view btn
2019-10-24 17:32:04 +02:00
Bram Kragten
7be8080726 Fix styling delete view btn 2019-10-24 12:32:59 +02:00
Antoine Rahier
13fbc813cd Add Netatmo thermostat states 2019-10-24 11:20:06 +02:00
Antoine Rahier
44d1458229 Revert "Add Netatmo specific states"
Wrong file !

This reverts commit f06f3ee2e5.
2019-10-24 11:16:41 +02:00
Antoine Rahier
f06f3ee2e5 Add Netatmo specific states 2019-10-24 11:09:42 +02:00
Bram Kragten
a889a02e15 Merge pull request #4123 from iantrich/aria-ts-translations
translated most aria-labels in ts files
2019-10-24 10:34:46 +02:00
Ian Richardson
6bf3d6a689 lint 2019-10-23 23:20:54 -05:00
Ian Richardson
1d7dcca495 translated most aria-labels in ts files 2019-10-23 23:02:58 -05:00
Bram Kragten
ad8f049570 Merge pull request #4117 from home-assistant/dev
20191023.0
2019-10-23 21:36:21 +02:00
Bram Kragten
73c56a68b6 Bumped version to 20191023.0 2019-10-23 21:16:25 +02:00
Bram Kragten
b34b52f305 Update translations 2019-10-23 21:16:03 +02:00
Ian Richardson
39d052273d support actions on rows (#4023)
* support actions on rows

* address comments

* add type

* pointer events

* move action area to row name to avoid handler competition

* add action to state-badge as well

* correct type

* address comments

* handle 'enter' in long-press and make entities state-badge selecatable
2019-10-23 10:30:09 -07:00
Bram Kragten
e435b9153b Clean up device card (#4108) 2019-10-22 16:11:56 -07:00
Bram Kragten
0792278927 Fix more integrations message (#4106)
* Fix more integrations message

* Period outside link
2019-10-22 16:10:42 -07:00
Josh McCarty
06d59b3cde Adds a white background to the QR code for MFA (#4107) 2019-10-23 00:04:09 +02:00
Josh McCarty
1e7497ad33 Revise hassio update card design (#4041)
* Revise hassio update card design

See https://github.com/home-assistant/home-assistant-polymer/issues/3916

* Remove available text; use secondary text color instead of yellow/orange

* Less bold text for update header
2019-10-22 23:06:18 +02:00
Ian Richardson
49d0f2359b add sensor card to first demo (#4035)
* add sensor card to first demo

* Change to temperature sensor
2019-10-22 14:43:34 -05:00
Timmo
bb73039205 Confirmation Dialog (#4053)
*  Add confirmation dialog

*  Add confirmation dialog to service calls

* 🔨 Change returned value

*  Add confirmation dialog to integration remove

*  Add to entity registry

*  Add to delete card and add translation

*  Add to views deletion

* 🔨 Remove async

* 🔨 Fix min-width for smaller screens

* 🔨 Remove async

* Fix wrong merge

* Update ha-config-entry-page.ts
2019-10-22 21:20:41 +02:00
Bram Kragten
d4d6b7e2ce Fix delete button styling in hui-edit-view (#4102) 2019-10-22 21:17:55 +02:00
Drake Loud
7b5201599d added title to view configuation (#4037)
* added title to view configuation

* replacing let with const

* added localization change

* updated view config title

* linter updates

* Prettier updates
2019-10-22 10:27:36 +02:00
springstan
11c08e9a69 Added view title to heading of Lovelace Add Card picker (#4083)
* Added view title to heading of Lovelace Add Card picker

* Fixed building error, cleaned up code

* Changed _view to _viewConfig and added check for undefined _cardConfig

* Added else if for undefined _cardConfig, added else for manual cards

* Used template literal instead of string concatenation
2019-10-22 10:24:25 +02:00
aquarium
731bb176f7 Fix link to translation documentation (#4098) 2019-10-22 08:43:14 +02:00
Phi Dong
b0fce93de8 Fix issue where long states do not wrap (#4101) 2019-10-22 08:39:37 +02:00
Paulus Schoutsen
fdbe89e87e Fix develop build 2019-10-21 16:51:54 -07:00
Ian Richardson
a8d0a2293f revert lovelace selectable text (#4095) 2019-10-21 16:45:15 -07:00
Paulus Schoutsen
8ac278bc59 Remove unused deps 2019-10-21 16:33:03 -07:00
Paulus Schoutsen
70d6c6b902 Refactor Webpack build scripts (#4093)
* Refactor Webpack build scripts

* Add Gallery too

* Fix icons

* Update travis
2019-10-21 15:02:54 -07:00
Drake Loud
0621218e16 Changed button to text (#4067)
* Changed button to text

* Moved styles to hui-edit-view

* prettier updates
2019-10-21 23:32:15 +02:00
Bram Kragten
2424376fba Change ha-device-picker to combo box + improve name handling + show area (#4089)
* Change ha-device-picker to combo box + improve name handling + show area

* unused import
2019-10-21 12:40:16 -07:00
Bram Kragten
3973374f3f Add positive_time_period_dict to ha-form (#4090)
* Add positive_time_period_dict to ha-form

* select input on focus

* Update ha-form-positive_time_period_dict.ts
2019-10-21 12:36:26 -07:00
Ian Richardson
c25a38b82f add actions to state-badge element and state-label-badge (default Lovelace badge type) (#4028)
* add actions to state-badge element

* address comments

state-label-badge no longer handles clicks
added actions to hui-state-label-badge
moved ha-badges-card to Lit
2019-10-21 14:03:01 -05:00
Ian Richardson
3c0ba1d7eb Convert more-info-sun to Lit (#4075)
* Convert more-info-sun to Lit

* address comments
2019-10-21 13:04:22 -05:00
Ian Richardson
be678b02c5 Convert more-info-weather to LitElement (#4073)
* Convert more-info-weather to LitElement

* address comments

* add shouldUpdate
2019-10-21 13:04:08 -05:00
Ian Richardson
0078b48e3c card level themes (#4057)
* card level themes

weather-forecast
shopping-list
plant-status
markdown
alarm-panel

* fix markdown

* address comments

also added picture cards

* update updated

* address comments

* address comments
2019-10-21 12:38:06 -05:00
springstan
540f1d9bce Fix for Zone icon visibility on Map panel and Lovelace Map card (#4085)
* Set icon color to black in ha-panel-map.js

* Changed icon color depending on dark mode in lovelace map card

* Fixed build error by swapping var for let and const

* Replaced hardcoded style with the light and dark classes
2019-10-21 17:45:40 +02:00
Bram Kragten
5e3cb812ec Fix yaml name collision in card editor (#4079)
* Fix `yaml` name collision

* Add types for js-yaml change to named imports
2019-10-21 17:36:09 +02:00
aquarium
6d10a5dd4c Split data table background color into separate theme variable (#4031)
* Split data table background color into separate theme variable

* Remove reference to MDC in data table theme variable name
2019-10-21 09:27:06 +02:00
Sean Mooney
96d14b7ab7 Changed outdated "GUI editor" reference to "visual editor" (#4068)
Changed warning text from "GUI editor" to "visual editor" to match the updated naming being used in card editors.
2019-10-20 15:10:07 +02:00
Phi Dong
b96b026905 Add hovers (title attrs) to buttons on integrations config entry (#4059)
* Add integration specific titles to config buttons

* Rename tranlation var to integration, move button labels inline
2019-10-20 15:02:11 +02:00
Paulus Schoutsen
c25f2d3941 Move compression from Webpack to Gulp (#4074) 2019-10-20 14:42:20 +02:00
Paulus Schoutsen
785453aa79 Clean up mixins (#4076)
* Clean up mixins

* Lint
2019-10-20 14:31:58 +02:00
Phi Dong
4dbf5327bd Update snapshot actions to be a list (#4045)
* Update snapshot actions to be a list

* Update text of delete button to warning color
2019-10-19 18:03:22 +02:00
springstan
603240c467 Translated developer tools info page (#4054)
* Translated developer tools info page

* Added set or remove as a variable in translation of key default_ui
2019-10-19 17:59:57 +02:00
Paulus Schoutsen
bbc3e7d93f Make updateHass not async (#4060) 2019-10-19 17:18:56 +02:00
Ian Richardson
fbee4937a0 add icon option to entities card name (#4024)
* add icon option to entities card name

* account for only icon

* address comments
2019-10-19 14:25:14 +02:00
Phi Dong
0a77728652 Move Home Assistant and version on info page into h2 (#4061) 2019-10-19 14:24:28 +02:00
Phi Dong
e3ed0cf436 Hide save on card configuration if no card is picked (#4062) 2019-10-19 14:18:59 +02:00
Bram Kragten
d05dc2e4dc Bring back babel (#3974)
* Bring back babel

* bump preset env

* Remove empty TS properties in mixins
2019-10-19 14:06:04 +02:00
Paulus Schoutsen
c437cd3865 Use only decorators (#4058)
* Use only decorators

* Remove unused imports
2019-10-18 22:50:27 -07:00
springstan
442171169b Translated developer tools template page (#4050) 2019-10-18 23:05:07 +02:00
springstan
cc12dbb6ee Translated developer tools services page (#4049)
* Translated developer tools services page

* Changed translation parameter from error to data
2019-10-18 23:04:43 +02:00
springstan
60b3a960ae Translated developer tools mqtt page (#4052) 2019-10-18 23:04:26 +02:00
shbatm
5a957c3c9e Add width property to light card to fix #3964 (#3972)
* Add width property to light card to fix #3964

* Update Light Card Name CSS

* Update css per review
2019-10-18 22:58:25 +02:00
Ian Richardson
be4d431dc3 more-info dialog for counter (#4038)
* more-info dialog for counter

* address comments
2019-10-18 14:55:53 -05:00
Ian Richardson
0005c75091 fix double tap on glance entity (#4051) 2019-10-18 21:08:12 +02:00
springstan
880b382a16 Translated developer tools logs page (#4046)
* Translated developer tools logs page

* Changed translation key from load_log to load_full_log
2019-10-18 17:43:04 +02:00
Ian Richardson
d012512a79 add feature request template (#4026) 2019-10-18 17:01:41 +02:00
springstan
e2ac842690 Translated developer tools state page (#4039)
* Translated developer tools state page

* Fixed merge error by updating used icon in developer-tools-state.js
2019-10-18 16:33:11 +02:00
Ian Richardson
67d8d48855 translate view editor and explain panel mode (#4043) 2019-10-18 16:28:31 +02:00
Bram Kragten
00f2d36cb5 Migrate ha-form to lit (#4000)
* Migrate ha-form to lit

* Fix import path

* Update

* add default, change suffix, fix import

* Fix select
2019-10-18 16:08:34 +02:00
springstan
035057b185 Made thermostat history graph localizable (#4004)
* Made thermostat history graph localizable

* Changed string concatenation with white spaces from .join() to template literal

* Used variables in translations instead of template literals

* Update src/translations/en.json

Removed unnecessary space in heating value

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>
2019-10-17 23:28:12 +02:00
springstan
982966c8d9 Translated developer tools events page (#4033)
* Translated developer tools events page

* Implemented translations (alert on empty event type, notification on firing an event), Removed unnecessary translation key-value pairs

* Added falsely removed key-value pairs
2019-10-17 23:17:39 +02:00
Ian Richardson
f5e3a9ad40 Convert thermostat to round-slider (#3734)
* Convert to round-slider

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3622
Closes https://github.com/home-assistant/home-assistant-polymer/issues/2756

* scaling

* address review comments

* css tweaks

* remove jquery

* address comments

* simplify set-temperature

* handle long name

* remove increased handleSize

* address comments

* address comments

* address comments

* address comment

* need coffee
2019-10-17 21:00:39 +02:00
Ian Richardson
141c3f1ea4 add confirmation option to actions (#4006)
* add confirmation option to actions

* address comments
2019-10-16 11:03:36 -05:00
Ian Richardson
4ea483e3de Switch theme (#4017)
* introduce ha-switch theming

* fix typo

* remove comment
2019-10-16 17:08:28 +02:00
Josh McCarty
8eca956cd1 Uses information-outline icon for entity more info link (#4016) 2019-10-16 16:53:25 +02:00
Ian Richardson
c9242a5075 Custom badges (#3867)
* custom badges

* incremental

* functional

* cleanup

* cleanup

* address review comments

* address more comments

* address review comments

* address review comments

* cleanup

* address review comments

* address comments

* address comments

* fix entity-filter

* set hass once

* hass
2019-10-16 16:09:13 +02:00
Ian Richardson
df29a5becb Add double tap action (#3879)
* add dbltap_action

* apply to picture-glance

* types and boolean

* fix typo

* simplify double tap logic

* extract hasDoubleClick functionality

* address comments

* address comments

* double_tap_action
2019-10-16 08:57:05 -05:00
Ian Richardson
fb589337f8 display card errors with yaml config (#4018) 2019-10-16 09:22:57 +02:00
Ian Richardson
ea5ee6189d filter system users from Person editor (#3958)
* filter system users from Person editor

* address review comments

* address comments

* address comments
2019-10-15 19:19:46 -05:00
Josh McCarty
a39e47cced Updates alarm more-info dialog button styles to match lovelace card (#3955)
* Updates alarm more-info dialog button styles to match lovelace card

* Use flex for controlling button size

* Limit max-width of alarm buttons

This matches the width of the code input field
2019-10-15 21:04:29 +02:00
Ian Richardson
49d69f65ad add show_state option for picture-glance entities (#3937)
* add states option below picture-glance entities

* address review comments
2019-10-15 09:49:03 +02:00
Marcus Fredlund
424d677bcb Alarm Panel card: number buttons outline and adjusted padding and font-size fixing #2812 (#3991)
* outline on alarm panel buttons

* Fix for font-size before mwc-button is working.

* suggested edits from review

* changed to just outline

* Remove base-unit
2019-10-14 21:29:37 +02:00
springstan
59e4cdc62a Added integration name to System Options dialog (#3996)
* Added integration name to System Options dialog

* Passed integration name into translation string

* Translated integration name

* Added option for no translation
2019-10-14 21:28:44 +02:00
Bram Kragten
9d3dfad98c Update integration-badge.ts (#4001) 2019-10-14 21:28:13 +02:00
Erik Montnemery
555b746f4b Allow device actions to specify extra fields (#4002)
* Allow device actions to specify extra fields

* Typing etc.

* Use deviceAutomationsEqual to compare automations
2019-10-14 21:27:51 +02:00
Bram Kragten
ce6a97d065 Merge pull request #3995 from scop/customize-yaml-message
Improve customize.yaml non-inclusion warning message
2019-10-14 21:27:07 +02:00
Ville Skyttä
88567df36d Prettier 2019-10-14 22:03:28 +03:00
Bram Kragten
f55cbd9e9a Merge pull request #3999 from home-assistant/dev
20191014.0
2019-10-14 11:01:07 +02:00
Bram Kragten
7d00cc1eff Merge branch 'master' into dev 2019-10-14 10:28:17 +02:00
Bram Kragten
29301ddee7 Bumped version to 20191014.0 2019-10-14 10:22:13 +02:00
Bram Kragten
978b773968 Update translations 2019-10-14 10:21:56 +02:00
springstan
4f30cae6aa Translated Advanced mode toggle (#3997) 2019-10-13 22:39:08 +02:00
Ville Skyttä
5f29b66a8d Further tweak the message 2019-10-13 21:15:06 +03:00
springstan
b94da1bd19 Added note about more integrations to bottom of Set up new integration dialog (#3992)
* Added note about more integrations to bottom of Set up new integration dialog

* Fixed note about more integration by encapsulating it in one paragraph
2019-10-13 15:57:24 +02:00
Franck Nijhof
f9b0a0fc13 Fixes documentation URL for HTML5 push notifications (#3993) 2019-10-13 13:34:34 +02:00
Sven
300ffdae04 Add no devices available hint to person editor (#3906)
* Add no devices available hint to person editor (#3731)

* Fix device_tracker check and adjust messages

* fix lint

* Add location, fix memoize usage, hide entity picker and update text

* Move links to a list
2019-10-13 13:22:37 +02:00
Tom Raithel
476525e0d4 Remove 'Pick script to edit' headline from script editor (#3873)
Fixes #3829
2019-10-13 13:18:43 +02:00
Ville Skyttä
edecf9d58f Improve customize.yaml non-inclusion warning message
Link to relevant docs, note that changes won't be applied after a
restart if the include isn't in place (changes _do_ actually affect the
current runtime configuration and are persisted in customize.yaml).
2019-10-13 14:07:02 +03:00
Sean Mooney
38bf2e116b Update ISSUE_TEMPLATE.md (#3987)
Now that ui-schema repo is merged here and there's a feature request label, I think this line is no longer necessary.

 `- This is for bugs only. Feature and enhancement requests should go in our community forum: https://community.home-assistant.io/c/feature-requests`
2019-10-12 23:14:51 -07:00
Paulus Schoutsen
0719c4d1ae Add cache headers to demo and cast (#3982)
* Add cache headers to demo and cast

* Demo only to copy static from frontend public folder

* Update headers

* Update demo headers

* Update cast headers

* Update _headers

* Update _headers
2019-10-12 23:12:01 -07:00
Bram Kragten
12840231be Add code mirror editors to the dev-tools data fields (#3981)
* Add yaml code mirror editor to the dev-tools yaml fields

* Add jinja2 editor on dev template

* Migrate to UpdatingElement, review comments

* update cm, add types

* types

* dev tools mqtt
2019-10-12 12:33:51 -07:00
Bram Kragten
4728c12225 Update google cloud card (#3978)
* Update google cloud card

* Oops
2019-10-11 08:48:56 -07:00
Bram Kragten
90526ac563 Migrate entity registry to data-table (#3965)
* Migrate entity registry to data-table

* icons

* Styling

* Review comments

* fix not selector

* typos + move columns out of class

* Localize + comments

* Fucked up the rebase
2019-10-11 14:55:45 +02:00
Hayley McIldoon
6f7ea03e35 Remove redundant text in Cloud panel #3824 (#3967) 2019-10-11 14:55:12 +02:00
Erik Montnemery
78900e05ad Allow device conditions to specify extra fields (#3973) 2019-10-11 13:16:54 +02:00
Ian Richardson
495f4aa19c ability to hide tabs (#3811)
* ability to hide tabs

* address review comments

* address review comments

* address review comments

* review comments
2019-10-11 13:14:34 +02:00
Bram Kragten
88c480759f Convert YAMLTextArea to code mirror editor (#3980)
* Convert YAMLTextArea to code mirror editor

* Review comments

* Clean up
2019-10-10 21:58:21 +02:00
Josh McCarty
ab75365636 Move alexa state reporting switch position for consistency (#3953) 2019-10-10 10:51:58 +02:00
Tom Raithel
0266617c71 Remove overflow attribute from view column (#3971)
Fixes #3253
2019-10-10 10:50:46 +02:00
Mauricio Bonani
aef45c5043 Upgrade MDI icons to 4.5.95 (#3977)
* Upgrade MDI icons to 4.5.95

* Upgrade MDI icons to 4.5.95
2019-10-10 09:44:10 +02:00
Hayley McIldoon
deeb0146c7 Renamed Toggle Editor button #3617 (#3968) 2019-10-09 23:03:46 +02:00
Bram Kragten
5dea674f20 Merge pull request #3975 from home-assistant/rc
20191002.2
2019-10-09 22:19:34 +02:00
Bram Kragten
646fe34d09 Bumped version to 20191002.2 2019-10-09 21:57:58 +02:00
Ian Richardson
c67907aa58 simplify 2019-10-09 21:54:58 +02:00
Ian Richardson
e78f4c5ace picture-glance: check for entity state change 2019-10-09 21:54:34 +02:00
Bram Kragten
e891fdc3eb Save orig value + some cleanup 2019-10-09 21:53:48 +02:00
Erik
95a258c2a5 Allow device triggers to specify extra fields 2019-10-09 21:53:30 +02:00
Bram Kragten
f1fabd09a6 Merge pull request #3970 from emontnemery/automation_device_action_form
Allow device triggers to specify extra fields
2019-10-09 21:48:57 +02:00
Bram Kragten
0d77bdaf32 Merge pull request #3949 from iantrich/fix-glance-state_image
picture-glance: check for entity state change
2019-10-09 21:48:05 +02:00
Bram Kragten
320be2e5d9 Convert integration entry page to data table (#3963)
* Convert integration entry page to data table

* Simplify device-card

In a future PR this has to be changed further

* Center no devices text

* Review comments
2019-10-09 08:48:41 -07:00
Bram Kragten
6a098ad0b5 Save orig value + some cleanup 2019-10-09 13:34:34 +02:00
Erik
e895e91a11 Allow device triggers to specify extra fields 2019-10-09 07:41:25 +02:00
Paulus Schoutsen
fc3f7ca4b2 Mark Persian as right to left. 2019-10-08 10:24:21 -07:00
Bram Kragten
1f09d848c5 Merge pull request #3961 from home-assistant/rc
20191002.1
2019-10-08 17:55:43 +02:00
Bram Kragten
4d794f6088 Hide empty blocks on device page (#3950)
* Hide empty blocks on device page

* lint

* Rename entities on device rename

* check if entity_id is valid

* clarify var name

* Review comments

* Use regex to replace not allowed chars

* Align with backend
2019-10-08 17:54:17 +02:00
Bram Kragten
9ad7f0dbac Hide empty blocks on device page (#3950)
* Hide empty blocks on device page

* lint

* Rename entities on device rename

* check if entity_id is valid

* clarify var name

* Review comments

* Use regex to replace not allowed chars

* Align with backend
2019-10-08 08:53:31 -07:00
Bram Kragten
9f39610153 Update translations 2019-10-08 16:13:52 +02:00
Bram Kragten
12d8a04c15 Update translations 2019-10-08 16:13:06 +02:00
Bram Kragten
73b0f5949e Fix updating entity id in entity-registry-dialog (#3962) 2019-10-08 12:28:49 +02:00
Bram Kragten
0f7a3887a7 Fix updating entity id in entity-registry-dialog (#3962) 2019-10-08 12:27:29 +02:00
Bram Kragten
ac75ce038a Bumped version to 20191002.1 2019-10-08 10:33:16 +02:00
Bram Kragten
8de9a73741 Add report state toggle for Google (#3855) 2019-10-08 10:28:37 +02:00
Bram Kragten
ef51f29e28 Add report state toggle for Google (#3855) 2019-10-08 10:25:57 +02:00
Ian Richardson
b61bbee35a fix media row secondary info (#3957) 2019-10-08 10:10:37 +02:00
Markus Nigbur
64dd8c463d Changed the states-ui toggle button to unobstrusive text link. (#3959) 2019-10-08 10:01:51 +02:00
akargl
d2a95e9f06 Add default text to Markdown card editor (#3960) 2019-10-08 09:58:37 +02:00
Timmo
0cb0525516 Add localized names to card editor (#3941)
* 🔨 Add localized names to card editor

* ✏️ Rename alarm_panel to alarm-panel

* ✏️ Proper case

* 🔨 Move to else

* 🔨 Remove name and object from card picker
2019-10-07 20:17:12 +02:00
Ian Richardson
dcaf4fdfe2 add title option to stack cards (#3839) 2019-10-07 10:17:52 +02:00
ottersen
0c13757910 Correct usage of Zigbee vs ZigBee #1 (#3938)
ref clarification by Zigbee Alliance of correct usage of "Zigbee" vs "ZigBee"

https://twitter.com/Frenck/status/1178239254713061377
2019-10-07 09:55:31 +02:00
ottersen
0cdcd74c9d Correct usage of Zigbee vs ZigBee #2 (#3939)
ref clarification by Zigbee Alliance of correct usage of "Zigbee" vs "ZigBee"

https://twitter.com/Frenck/status/1178239254713061377
2019-10-07 09:55:18 +02:00
Phi Dong
db3968399f Add intro to OZW log z-wave config section (#3935) 2019-10-07 09:53:37 +02:00
Malte Franken
7494a49238 Normalize longitude to the range between -180 to +180 degrees (#3872)
* normalize longitude to the range between -180 to +180 degrees

* only normalize longitude if out of valid range
2019-10-07 09:49:00 +02:00
Ian Richardson
55d2a3c8b1 simplify 2019-10-06 23:16:14 -05:00
Ian Richardson
be4e45c22c picture-glance: check for entity state change 2019-10-06 23:08:14 -05:00
Matthew Donoughe
efb28d337a editor support for scene script action (#3942)
Script support added in home-assistant/home-assistant#27223
2019-10-05 15:14:37 -07:00
Phi Dong
edd77e1f32 Exclude persistent_notifications domain when computing unused entities (#3936) 2019-10-05 14:01:00 +02:00
Bram Kragten
848dd7e071 Fixes to script localization (#3930)
* Fixes

* fix toast
2019-10-04 21:46:32 +02:00
Bram Kragten
59d4a4247a Fix whitespace error in services (#3880) 2019-10-04 17:21:43 +02:00
Jens Vanhooydonck
ba79633758 HA Cloud overflow wrap (#3905)
* Overflow of Remote Control URL

* Overflow wrap of certificate information

Closes #2982

* Changed styling to class break-word

* Changed break-work to class

* Update src/panels/config/cloud/account/cloud-remote-pref.ts

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>
2019-10-04 16:46:01 +02:00
Charles Garwood
860973bdbd Add localization to ZHA panel (#3881)
* Add localization for ZHA config panel

* Additional ZHA panel localization
2019-10-04 14:07:49 +02:00
Sven
d4d897e79e Make cloud account panel translatable (#3875)
* Add localization to cloud login & register (#3844)

* Add localization to cloud account (#3844)

* Add localization to cloud forgot password (#3844)

* fix lint errors

* Update src/panels/config/cloud/account/cloud-account.js

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* Update src/panels/config/cloud/register/cloud-register.js

Co-Authored-By: Bram Kragten <mail@bramkragten.nl>

* fix issues pointed out in review

* fix code style issue

* Add localization for dialogs, alexa and google

* fix exposed entities name
2019-10-04 13:14:53 +02:00
Bram Kragten
4850f3d588 Fix whitespace error in services (#3880) 2019-10-04 12:35:49 +02:00
Bram Kragten
8bc53c235f Fix styling system options (#3877) 2019-10-04 12:04:27 +02:00
Charles Garwood
c74793b1d5 Add link to Z-Wave panel docs (#3874) 2019-10-03 20:51:37 +02:00
Marcel Brückner
56bac8a8c1 Make script editor translatable (#3866)
* Make script editor's script picker translatable (home-assistant/home-assistant-polymer#3848)

* Make script editor translatable (home-assistant/home-assistant-polymer#3848)

* Fix linting errors (home-assistant/home-assistant-polymer#3866)

* Fix linting errors (home-assistant/home-assistant-polymer#3866)

* Move unsaved_confirm translation key to common section (home-assistant/home-assistant-polymer#3866)

Instead of adding the same text multiple times for every section, add a common section to indicate reusable translations.

* Add variable to localization text

* Use JavaScript instead of Polymer data binding
2019-10-03 20:31:53 +02:00
Sven
184575fd54 Add localization to persons config page (#3846) (#3871) 2019-10-03 14:38:34 +02:00
Sven
e148559d3e Add localization to user config page (#3845) (#3869) 2019-10-03 12:22:45 +02:00
Phi Dong
95b76dbb85 Fix issue where help icon overlapped with header text on mobile devices (#3868) 2019-10-03 11:50:36 +02:00
Bram Kragten
496bb9dc39 Merge pull request #3864 from home-assistant/dev
20191002.0
2019-10-02 22:46:27 +02:00
Bram Kragten
351ba3e701 Merge branch 'master' into dev 2019-10-02 22:31:00 +02:00
Bram Kragten
260f428bc6 Bumped version to 20191002.0 2019-10-02 22:25:49 +02:00
Bram Kragten
3622514131 Fix dark switch for map card editor (#3856) 2019-10-02 21:26:48 +02:00
Bram Kragten
391b2dcf6a Align background with tiles (#3858) 2019-10-02 21:25:59 +02:00
Bram Kragten
a02bf1fd48 Allow yaml in dev states (#3859)
* Allow yaml in dev states

* remove json
2019-10-02 21:25:38 +02:00
Bram Kragten
4cf9472bf4 Allow yaml in dev services (#3860)
* Allow yaml in dev services

* remove json
2019-10-02 21:23:37 +02:00
Bram Kragten
74d1de7313 Allow yaml in dev events (#3861)
* Allow yaml in dev events

* remove json
2019-10-02 21:22:06 +02:00
Bram Kragten
cd6fd6a46c Allow yaml in script and automation (#3862)
* Allow yaml in script and automation

* Restore defaults

* Rename class

* Catch errors in constructor

* Update yaml_textarea.tsx
2019-10-02 21:21:13 +02:00
Bram Kragten
a6dda90b13 Default hide disabled entities from entity registry (#3863)
* Default hide disabled entities from entity registry

* localize

* Use memoize
2019-10-02 21:20:47 +02:00
Bram Kragten
7add8a2ea0 Guard for null badges (#3841)
* Guard for null badges

* Check for null badges on load and save
2019-10-02 09:29:36 -07:00
Bram Kragten
b927a3ef29 Add entity registry functions to device page (#3843)
* Add entity registry functions to device page

* Move update/remove logic to dialog

* Hide disabled entities by default
2019-10-02 09:23:42 -07:00
Ian Richardson
76d3218130 Allow user selection of text in Lovelace (#3605)
* Allow user selection of text in Lovelace

Closes https://github.com/home-assistant/home-assistant-polymer/issues/2110

* set negative tabindex

This appears to work locally, but pushing it up to try on the demo to be sure

* toggle class for android

* apply suggestions
2019-10-02 13:33:16 +02:00
Franck Nijhof
8b6d8f9086 Update documentation link URL for integrations (#3857) 2019-10-02 13:23:41 +02:00
Bram Kragten
ffaecb29b7 Update translations 2019-10-02 12:58:11 +02:00
Ian Richardson
fa74295c0b add actions to picture-glance entities (#3807)
* add actions to picture-glance

* remove unnecessary entity property

* Update hui-picture-glance-card.ts
2019-10-02 11:22:33 +02:00
Bram Kragten
ea50d486da Fix some styling of ha-switch (#3842)
If content is slotted it will get some margin to the toggle like the old switch.
2019-10-01 11:17:10 -07:00
Bram Kragten
3cf4b890b6 Remove local mdc-datatable (#3840)
With version 3.2.0 of mdc-datatable they removed the ts files from the published package, so we can now use it again.
2019-10-01 11:34:25 +02:00
Sean Mooney
313b984a53 Add missing domain icons (#3836)
`persistent_notification` and `zone` were both missing domain icons.
2019-10-01 10:11:44 +02:00
Bram Kragten
7d09e29d60 Use filter worker in data-table (#3808)
* Filter worker

Doesn't work

* Remove template for worker

* Move files

* Sort to worker + debounce filter

* Improve performance

* Update ha-data-table.ts
2019-09-30 15:53:48 -07:00
Ian Richardson
7e979f0cf1 add image option to entities card (#3832) 2019-09-30 22:25:09 +02:00
Ian Richardson
64366dc99a fix alignment of switches positioned absolutely (#3812)
* fix alignment of switches positioned absolutely

* wrap switches

* remove !important
2019-09-30 21:27:19 +02:00
Ian Richardson
c69585db98 add state_filter to picture cards (#3791) 2019-09-30 09:49:11 +02:00
Bram Kragten
2dd5cd586b Add a setting for vibration (#3813)
* Add a setting for vibration

* Update en.json
2019-09-27 10:23:30 +02:00
Bram Kragten
05a258c886 Add hassio supervisor and os update notice (#3798)
* Add hassio supervisor and os update notice

* Cleanup

* Update hassio-dashboard.ts

* Fix styling

* Check if system has HassOs

* Remove unused import
2019-09-26 13:47:34 +02:00
Bram Kragten
f4bd42dfd4 Add name to picture entity struct (#3809) 2019-09-25 23:37:54 +02:00
Bram Kragten
41e5e7c1ae Update yarn.lock 2019-09-25 22:41:17 +02:00
Ian Richardson
95dfcafce3 UI Editor for picture-glance card (#3709)
* UI Editor for picture-glance card

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3700

* address review comments

* address review comments

* fallback to yaml if state image used

* push default changes

* default image for config

* Update hui-picture-glance-card-editor.ts
2019-09-25 15:38:26 -05:00
Bram Kragten
111d1afc21 Fix firefox overflow (#3806)
* Fix firefox overflow

MIght fix...

* Add comment

* Align
2019-09-25 21:52:21 +02:00
Ian Richardson
886c6dd88c Expand entity-filter options (#3692)
* Expand entity-filter options

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3543

Adds the following to `state_filter`:
- `operator` option. Specify operator to use in comparison.
- `value` option. Specify value to compare against.
- `attribute` option.  Specify attribute to use instead of state in comparison.

e.g.
```yaml
type: entity-filter
state_filter:
  - "on"
  - operator: ">"
    value: 90
entities:
  - sensor.water_leak
  - sensor.outside_temp
  - entity: sensor.humidity_and_temp
    state_filter:
      operator: ">"
      value: 50
      attribute: humidity
```

* Update evaluate-filter.ts

* verify state_filter exists on card or each entity

* address review comments

* apply Bram's suggestion

* address review comments

* cleanup
2019-09-24 10:34:57 +02:00
On Freund
38b817bd67 Green shade in climate history for platforms that don't support hvac_action (#3787)
* Green shade in climate history for platforms that don't support HVAC_ACTION

* The presence of hvac_action can change over time

* Move static condition out of anon function
2019-09-24 10:34:13 +02:00
Ian Richardson
c59b6626f2 UI editor for history-graph (#3782)
* UI editor for history-graph

* add translations
2019-09-24 10:00:52 +02:00
Ian Richardson
2cc196e3fb cleanup editors (#3786)
* cleanup editors

* address review comments
2019-09-23 17:11:45 -05:00
Erik Montnemery
a08884fed6 Add support for and and or conditions to the automation editor. (#3724)
* Add support for `and` and `or` conditions in automations

* Remove debug prints, fix lint errors

* Fix

* Merge `and` and `or` conditions

* Add missing file
2019-09-23 14:07:57 -07:00
Bram Kragten
2fe4a02b6b Add support for panels to cast (#3796)
* Add panel support to cast

* Set background
2019-09-23 14:03:45 -07:00
Paulus Schoutsen
7c793c1cdb Bumped version to 20190919.1 2019-09-23 13:17:48 -07:00
Bram Kragten
a0b848acc4 Bring back babel for ES5 builds (#3797)
* Bring back babel for ES5 builds

* Remove ts from babel
2019-09-23 13:17:44 -07:00
Bram Kragten
a1b9a092d0 Bring back babel for ES5 builds (#3797)
* Bring back babel for ES5 builds

* Remove ts from babel
2019-09-23 13:15:12 -07:00
Bram Kragten
993d390ea5 Add device automation options to device page (#3776)
* Add device automation options to device page

* Update

* Fill automation editor with data

* Update ha-automation-editor.ts

* Remove dupe deps

* Fix imports
2019-09-23 14:13:44 +02:00
Ian Richardson
1f4d359050 Replace all default exports in common/ with named exports (#3790) 2019-09-23 10:57:47 +02:00
Ian Richardson
f871387fa6 new action: url (#3773)
* new action: url

Takes a `url_path` option.
Closes https://github.com/home-assistant/ui-schema/issues/249
I'm experience the issue described here with my string values in the action-editor: https://github.com/home-assistant/home-assistant-polymer/issues/2645. Have not been able to track down where the issue is.

* Fix losing config on init

* fix action-editor
2019-09-22 21:56:29 +02:00
Ian Richardson
9a92ed31f6 picture entity editor fix (#3783)
* forgot to push commit

* resolve broken build
2019-09-21 22:42:46 -05:00
Ian Richardson
37129adfab UI Editor for picture-entity card (#3708)
* UI Editor for picture-entity card

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3699

* address review comments

* translations
2019-09-21 22:15:30 -05:00
Paulus Schoutsen
ec52e71c71 Upgrade some deps (#3780)
* Upgrade TS

* Remove unused uglifyjs webpack plugin

* Upgrade some webpack stuff
2019-09-21 11:59:51 +02:00
Ian Richardson
5e28e1b320 Switch paper-toggle-button to mwc-switch (#3683)
* Switch paper-toggle-button to mwc-switch

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3352

* ha-switch

* apply not-checked theming

Thanks @bramkragten!

* address review comments
2019-09-21 11:59:27 +02:00
Ian Richardson
9a7eb3d406 light-card: icon option (#3771)
* light-card: icon option

closes https://github.com/home-assistant/home-assistant-polymer/issues/3768

* add theme select label property

* address review comments
2019-09-20 16:10:14 -05:00
Erik Montnemery
eee0c2e53f Add support for automation description (#3723)
* Add support for automation annotation

* Update label and add placeholder

* Rename annotation to description

* Adress review comments, fix lint errors
2019-09-20 08:19:38 -07:00
Bram Kragten
145259e82f Add Language Urdu (#3750)
* Add Urdu

* Changed name to native name
2019-09-19 16:27:54 -07:00
Bram Kragten
d0cc4c2715 Move views to own folder + use update vs updated in panel view (#3761)
* Move views to own folder + use update vs updated in panel view

* updated -> update
2019-09-19 09:10:02 -07:00
Paulus Schoutsen
4d97a47e08 Merge pull request #3770 from home-assistant/dev
20190919.0
2019-09-19 09:01:35 -07:00
Paulus Schoutsen
4ef5a8da70 Bumped version to 20190919.0 2019-09-19 08:59:57 -07:00
Paulus Schoutsen
cdfd0afdf4 Update translations 2019-09-19 08:59:23 -07:00
Bram Kragten
d250a931e6 fix continue integration flow (#3766)
* fix continue integration flow

* Remove test button
2019-09-19 08:57:17 -07:00
Bram Kragten
cd2b92a449 Show toast on success save entity settings (#3763) 2019-09-19 08:53:16 -07:00
Bram Kragten
c617cb5b12 Align behaviour state badge (#3767) 2019-09-19 08:53:00 -07:00
Paulus Schoutsen
e7ac95e314 Merge pull request #3757 from home-assistant/dev
20190918.1
2019-09-18 13:02:58 -07:00
Paulus Schoutsen
7bab9cb464 Remove unused templates attributes from demo 2019-09-18 13:02:45 -07:00
Paulus Schoutsen
bb5ab958c1 Bumped version to 20190918.1 2019-09-18 12:52:25 -07:00
Paulus Schoutsen
2d92ffaa4d Update translations 2019-09-18 12:52:20 -07:00
Mauricio Bonani
7a7a0f772a Upgrade MDI icons to 4.4.95 (#3755)
* Upgrade MDI icons to 4.4.95

* Upgrade MDI icons to 4.4.95
2019-09-18 12:38:45 -07:00
Paulus Schoutsen
c898db5010 Fixes to device page (#3756)
* Fixes to device page

* Cache page with data page
2019-09-18 12:38:27 -07:00
Bram Kragten
b6fbf4da3a Cast: Show error message instead of number (#3752)
* Cast: Show error message instead of number

* Update hc-main.ts
2019-09-18 09:33:58 -07:00
Bram Kragten
0bfc61629e Fix save button more info settings (#3751)
Would be blue on blue on mobile
2019-09-18 09:23:09 -07:00
Ian Richardson
e594fcfc42 lower unavailable font-size (#3746)
Closes https://github.com/home-assistant/home-assistant-polymer/issues/3745
2019-09-18 17:19:42 +02:00
Bram Kragten
84ed6d8fb3 Merge pull request #3748 from home-assistant/dev
20190918.0
2019-09-18 14:22:53 +02:00
Bram Kragten
31ae115062 Fix set theme on panel (#3749) 2019-09-18 14:12:54 +02:00
Bram Kragten
fca885a17a Bumped version to 20190918.0 2019-09-18 13:56:01 +02:00
Bram Kragten
29dff42de4 Make panel-view it's own component (#3747)
* Make panel-view it's own component

* Convert to updatingelement
2019-09-18 13:54:21 +02:00
Bram Kragten
f5b3a82922 Merge pull request #3742 from home-assistant/dev
20190917.2
2019-09-17 21:13:48 +02:00
Bram Kragten
54beaad7e5 Bumped version to 20190917.2 2019-09-17 21:00:13 +02:00
Bram Kragten
e30f9d4a66 Add device config page (#3695)
* Add device config page

* Remove unused imports

* Revert a lot

Make the PR smaller

* Change columns add battery level

* memoize

* don't bubble

* Add mobile view

* fix filter mobile

* Comments
2019-09-17 20:59:43 +02:00
Bram Kragten
27264b27a9 Fix (#3741) 2019-09-17 09:50:51 -07:00
Bram Kragten
2b1f9460a8 Fix styling mwc-button (#3740) 2019-09-17 09:06:53 -07:00
Bram Kragten
4641cd65ca Merge pull request #3739 from home-assistant/dev
20190917.1
2019-09-17 14:18:45 +02:00
Bram Kragten
1f6fe5dfcf Bumped version to 20190917.1 2019-09-17 14:12:46 +02:00
Bram Kragten
058b4ba658 Fix theme rgb creation (#3738) 2019-09-17 14:08:48 +02:00
Bram Kragten
24baa87b18 Merge pull request #3736 from home-assistant/dev
20190917.0
2019-09-17 08:00:51 +02:00
Bram Kragten
fad2f1790f Update translations (#3735) 2019-09-17 07:50:38 +02:00
Bram Kragten
8fd8274d15 Bumped version to 20190917.0 2019-09-17 07:49:52 +02:00
Bram Kragten
f4f1e24ad5 Generate rgb theme vars (#3728)
* Create rgb theme vars

* Check if key is rgb and revert paper

* Update apply_themes_on_element.ts

* paper-card > card
2019-09-17 07:46:53 +02:00
Paulus Schoutsen
42626ba2f8 Upgrade set-value (#3733) 2019-09-17 07:46:22 +02:00
Bram Kragten
29ab04fc7a Add subscribe mixin (#3710)
* Add subscribe mixin

* Update src/mixins/subscribe-mixin.ts

Co-Authored-By: Paulus Schoutsen <balloob@gmail.com>

* Update src/mixins/subscribe-mixin.ts

Co-Authored-By: Paulus Schoutsen <balloob@gmail.com>

* Update subscribe-mixin.ts

* Update subscribe-mixin.ts

* Add properties

* Fix
2019-09-17 07:45:56 +02:00
Bram Kragten
722e9bcda7 Hide columns in unused entities on mobile (#3719)
* Hide columns in unused entities on mobile

* Update hui-unused-entities.ts

* Fix

* Update hui-unused-entities.ts
2019-09-17 07:45:21 +02:00
Paulus Schoutsen
065e42c8fd Fix Cast race condition (#3732) 2019-09-17 07:42:25 +02:00
Bram Kragten
bf343647d4 Fix background on panel (#3713)
* Fix background on panel

* Make themes work on panel

* fix for tabs-hidden

* and still not gone...
2019-09-16 15:03:16 -06:00
Bram Kragten
3b51e55f2d Update logs on activate tab (#3716)
* Update logs on activate tab

* Only update if we already loaded data
2019-09-16 13:56:22 -06:00
Bram Kragten
125616aa99 Merge pull request #3727 from PDekker/patch-1
Update cover_icon.ts
2019-09-16 20:50:16 +02:00
Bram Kragten
1341fe9ae9 Open more info in unused entities (#3714)
* Open more info in unused entities

* Only make entity column open more info
2019-09-16 11:09:07 -06:00
Bram Kragten
b195df0bfa Merge pull request #3704 from iantrich/light-min
Set minimum brightness of slider to 1%
2019-09-16 15:53:11 +02:00
Bram Kragten
1109d18576 Merge pull request #3718 from DB-CL/dev
Update slider's min/max when thermostat gets updated
2019-09-16 15:45:17 +02:00
Bram Kragten
b1a6580afb Merge pull request #3720 from SeanPM5/patch-1
Add documentation link on Events panel
2019-09-16 14:08:46 +02:00
PDekker
1d95b9d779 Update src/common/entity/cover_icon.ts
Co-Authored-By: Bram Kragten <mail@bramkragten.nl>
2019-09-16 14:01:47 +02:00
PDekker
202782e741 Update cover_icon.ts
Add new icons for existing device types
2019-09-16 11:39:09 +02:00
Sean Mooney
a4663d438c prettier fix, hopefully third time's a charm? 2019-09-15 00:53:28 -04:00
Sean Mooney
eab3e6091a Update developer-tools-event.js 2019-09-15 00:31:36 -04:00
Sean Mooney
6627a96a05 Add documentation link on Events panel
adds a link to events documentation which contains helpful information for using this tool.
2019-09-14 23:32:13 -04:00
Erik Montnemery
16ae52c321 Fix regression in device automation from #3643 (#3717) 2019-09-14 07:02:43 -06:00
Bram Kragten
9792572370 chnage order dev tools (#3715) 2019-09-14 07:00:44 -06:00
Bram Kragten
4bb65b8ae1 Make data table and checkbox themeable (#3712)
Added rgb vars, not sure we want to go that way, but otherwise we will get a lot of styles...
2019-09-14 06:56:16 -06:00
DBCL
2f3b399450 Please the linter 2019-09-13 23:27:28 +02:00
DBCL
3e98b8e4f1 Add min/max changes on thermostat update 2019-09-13 22:58:43 +02:00
Ian Richardson
493198f530 Set minimum brightness of slider to 1%
Closes #3693
2019-09-12 13:38:18 -05:00
Paulus Schoutsen
ce9e3ae9e9 Merge pull request #3690 from home-assistant/dev
20190911.1
2019-09-11 13:04:39 -06:00
Paulus Schoutsen
a2c2f6a1e2 Bumped version to 20190911.1 2019-09-11 13:00:59 -06:00
Bram Kragten
b46c9406ff Add ha-data-table (#3647)
* Work in progress

* add sorting

implemented in unused entities to try it

* implement sorting

* fix

* Refactor

* Default sort, filterable, id

* Fix

* Add local mdc-data-table + comments + fixes

* Move mdc-data-tabel

So our linters won't complain...
2019-09-11 12:59:27 -06:00
Ian Richardson
9f213cf055 Don't display slider if light doesn't support brightness (#3684)
Closes https://github.com/home-assistant/home-assistant-polymer/issues/3542
2019-09-11 12:47:48 -06:00
Bram Kragten
3254478d05 Remove wct-browser-legacy (#3686) 2019-09-11 12:46:57 -06:00
Bram Kragten
e78fb35593 Merge pull request #3688 from home-assistant/dev
20190911.0
2019-09-11 13:43:09 +02:00
Bram Kragten
321b852079 Bumped version to 20190911.0 2019-09-11 13:00:33 +02:00
Bram Kragten
8b44998e1f Update translations (#3687) 2019-09-11 12:59:53 +02:00
Paulus Schoutsen
4aeca70f49 Upgrade HAWS to 4.4.0 (#3682) 2019-09-10 21:27:44 -07:00
gregod
7912f0bf9e Set rel noopener and noreferrer on external links in markdown (#3666)
* Set rel noopener and noreferrer on external links in markdown

* Update ha-markdown.ts

* Update ha-markdown.ts
2019-09-10 13:44:02 -07:00
Paulus Schoutsen
abc849f623 Remove Polymer CLI (#3681) 2019-09-10 13:08:21 -07:00
Bram Kragten
e6671299fe Filter html from translations (#3665)
* Filter html from translations

* Error when html found
2019-09-10 20:18:57 +02:00
Bram Kragten
8c5beb0042 Replace paper-fab with ha-fab (#3678)
* Replace paper-fab with ha-fab

...which is based on mwc-fab

* comment
2019-09-10 20:17:11 +02:00
Thomas Lovén
eba3c535bf Fix unclickable light in light-card. Fix #3679 (#3680) 2019-09-10 10:22:26 -07:00
Ian Richardson
34d50f0c90 Add image option to glance card entities (#3673)
* Add image option to glance card entities

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3021

* properly order override
2019-09-09 22:14:12 -07:00
Ian Richardson
9eae637814 Only allow admin to edit UI config (#3674)
Closes https://github.com/home-assistant/home-assistant-polymer/issues/3084
2019-09-09 22:13:45 -07:00
Ian Richardson
a29d598027 revert stop effect change (#3672)
Appears to be platform specific
2019-09-09 20:39:21 -07:00
Erik Montnemery
5448cbf1c5 Add device actions to automation editor. (#3637)
* Add device actions to automation editor.

* Copy automation on selection

* Fix types

* Remove device from device action schema
2019-09-09 12:01:58 -07:00
Ian Richardson
f2999c30f3 Filter null badges (#3645)
* Convert weather-forecast to LitElement

Part of https://github.com/home-assistant/home-assistant-polymer/issues/2095

Not sure how RTL works and how to apply it.

Also, thinking I should update if the forecast changes and not just the state. Input?

* Revert "Convert weather-forecast to LitElement"

This reverts commit e1893b0a83.

* Filter out null badges

Closes https://github.com/home-assistant/home-assistant-polymer/issues/2974

* address review comments

* Update hui-view.ts
2019-09-09 11:31:20 -05:00
Ian Richardson
8a710202f1 Stop effect in more-info-light (#3636)
* Convert weather-forecast to LitElement

Part of https://github.com/home-assistant/home-assistant-polymer/issues/2095

Not sure how RTL works and how to apply it.

Also, thinking I should update if the forecast changes and not just the state. Input?

* Revert "Convert weather-forecast to LitElement"

This reverts commit e1893b0a83.

* Add stop effect button

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3619

* address review comments

* cleanup
2019-09-09 14:10:20 +02:00
Bram Kragten
11f917d5f8 Add vibration (#3588)
* Add vibration

I don't have a device that supports vibrate, and can't find a list of patterns, maybe someone can make some nice patterns?

* listen event

* Mixin

* move logic to mixin
2019-09-09 14:08:52 +02:00
Bram Kragten
2d8d6119bd Merge pull request #3663 from home-assistant/remove-babel
Remove babel
2019-09-09 09:54:17 +02:00
Paulus Schoutsen
1a5ae99c42 Update ESLint 2019-09-08 23:51:30 -07:00
Paulus Schoutsen
c4d888f060 Whitelist tags/attributes instead of allow-all (#3657) 2019-09-08 23:47:28 -07:00
Paulus Schoutsen
594ee7ce9b Update build scripts 2019-09-08 23:39:37 -07:00
Paulus Schoutsen
7f10bcbfd1 Drop Babel 2019-09-08 23:39:22 -07:00
Paulus Schoutsen
fe31f532b6 Update ESLint (#3664) 2019-09-08 23:38:58 -07:00
Bram Kragten
7e7158b816 Pick unused entities for lovelace cards (#3614)
* Pick unused entities for lovelace cards

* Type

* Table layout for unused entities

* properties

* remove unused import

* mwc-button

Need to find a way to set the color

* add icons to pick view dialog

* Comments

* Lint

* Restore unused entities for yaml mode

* Remove _elements

* decorators, types, comments

* flexbox + comments

* remove unused import
2019-09-08 13:43:28 -07:00
dependabot[bot]
e19c210af2 Bump jquery from 3.3.1 to 3.4.0 (#3652)
Bumps [jquery](https://github.com/jquery/jquery) from 3.3.1 to 3.4.0.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Commits](https://github.com/jquery/jquery/compare/3.3.1...3.4.0)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-08 11:58:11 -07:00
dependabot[bot]
a2f23c068b Bump lodash.mergewith from 4.6.1 to 4.6.2 (#3654)
Bumps [lodash.mergewith](https://github.com/lodash/lodash) from 4.6.1 to 4.6.2.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-08 11:55:12 -07:00
dependabot[bot]
205e12150f Bump lodash.template from 4.4.0 to 4.5.0 (#3653)
Bumps [lodash.template](https://github.com/lodash/lodash) from 4.4.0 to 4.5.0.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.4.0...4.5.0)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-08 11:55:03 -07:00
dependabot[bot]
b7ea66c30f Bump eslint-utils from 1.3.1 to 1.4.2 (#3651)
Bumps [eslint-utils](https://github.com/mysticatea/eslint-utils) from 1.3.1 to 1.4.2.
- [Release notes](https://github.com/mysticatea/eslint-utils/releases)
- [Commits](https://github.com/mysticatea/eslint-utils/compare/v1.3.1...v1.4.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-08 11:54:37 -07:00
Paulus Schoutsen
11ac8e4b08 Convert preact to tsx (#3643) 2019-09-08 11:54:17 -07:00
Bram Kragten
d5f0ae8ae2 Merge pull request #3655 from home-assistant/dev
20190908.0
2019-09-08 20:53:20 +02:00
Bram Kragten
4c37c76a8f Merge branch 'dev' 2019-09-08 20:48:25 +02:00
Thomas Lovén
cdfc3f8faf Use new round sliders for light card (#3634)
* Use new round sliders for light card

* Remove _roundSliderstyle
2019-09-08 11:47:36 -07:00
dependabot[bot]
44ca37c1dc Bump mixin-deep from 1.3.1 to 1.3.2 (#3650)
Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2.
- [Release notes](https://github.com/jonschlinkert/mixin-deep/releases)
- [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-08 11:44:34 -07:00
dependabot[bot]
535308bf96 Bump js-yaml from 3.13.0 to 3.13.1 (#3649)
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.13.0 to 3.13.1.
- [Release notes](https://github.com/nodeca/js-yaml/releases)
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.13.0...3.13.1)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-08 11:44:27 -07:00
Bram Kragten
6328f15032 Bumped version to 20190908.0 2019-09-08 20:16:10 +02:00
Erik Montnemery
2f96a096f7 Device automations: Rename name to entity_name, introduce subtype (#3644) 2019-09-08 20:12:56 +02:00
Ian Richardson
cbd01f2d68 Create more-for timer with action buttons (#3621)
* Create more-for timer with action buttons

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3594

* center actions

* Address review comments

* address review comments
2019-09-06 22:13:05 -05:00
Paulus Schoutsen
2ff4d0fa4b Do not allow SVG by default (#3640) 2019-09-06 17:36:28 -07:00
Shahen Hovhannisyan
3aba2e3408 feat(translations): Added Armenian language (#3616)
* feat(translations): Added Armenian language

* fix(translations): Corrected nativeName

* fix(armenian/hy): Corrected language code

* chore(translationsMetadata): Sorted by alphabetic order
2019-09-06 14:11:27 -07:00
Mauricio Bonani
b473c9c2aa Upgrade MDI icons to 4.3.95 (#3639)
* Upgrade MDI icons to 4.3.95

* Upgrade MDI icons to 4.3.95
2019-09-06 14:37:51 -05:00
Bram Kragten
b97e24283c Clarify title of the dialog (#3629)
* Clarify title of the dialog

* translate
2019-09-06 16:36:58 +02:00
Ian Richardson
c8d3293ae9 Throttle updates for entity-filter (#3551)
* Throttle updates for entity-filter

* throttle element config sets

* apply changes

* apply review changes
2019-09-06 11:48:39 +02:00
Ian Richardson
8e0c39e451 Convert weather-forecast to LitElement (#3623)
* Convert weather-forecast to LitElement

Part of https://github.com/home-assistant/home-assistant-polymer/issues/2095

Not sure how RTL works and how to apply it.

Also, thinking I should update if the forecast changes and not just the state. Input?

* Revert "Convert weather-forecast to LitElement"

This reverts commit e1893b0a83.

* Convert weather-forecast to LitElement

Part of https://github.com/home-assistant/home-assistant-polymer/issues/2095

Not sure how RTL works and how to apply it.

Also, thinking I should update if the forecast changes and not just the state. Input?

* address review comments and add types

* address review comments
2019-09-05 20:26:35 -07:00
Ian Richardson
46968bb565 Timestamp unavailable (#3635)
* Convert weather-forecast to LitElement

Part of https://github.com/home-assistant/home-assistant-polymer/issues/2095

Not sure how RTL works and how to apply it.

Also, thinking I should update if the forecast changes and not just the state. Input?

* Revert "Convert weather-forecast to LitElement"

This reverts commit e1893b0a83.

* Don't try to show unavailable timestamp

Closes https://github.com/home-assistant/home-assistant-polymer/issues/2956
2019-09-05 16:01:24 -07:00
Erik Montnemery
011219b727 Add device conditions to automation editor. (#3595)
* Add device conditions to automation editor.

* Fix inheritance shizzle

* Make device automation lists simple lists, not dicts

* Really make device automation lists simple lists

* Add few types

* Fix types
2019-09-05 15:43:14 -07:00
Bram Kragten
9205837b67 Create hui-views-list component (#3631)
And use for move card view
2019-09-05 11:17:19 -07:00
Bram Kragten
4eed3508ce Update cloud-google-pref.ts (#3628) 2019-09-05 09:47:39 -07:00
Bram Kragten
460a56aa0a Fill example data for services in dev tools (#3596)
* Fill example data

* Align indents

* Comments
2019-09-05 06:57:17 -07:00
Bram Kragten
3927eb53ac Fix translations (#3626) 2019-09-05 06:53:27 -07:00
Ian Richardson
2a596666c8 Move light brightness below icon (#3607)
* Move light brightness below icon

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3606

* remove border and white text coloring
2019-09-04 12:57:06 -07:00
Bram Kragten
0008a100f4 Fill state details when entity selected (#3615) 2019-09-04 10:05:49 -07:00
David F. Mulcahey
164e433592 ZHA device info dialog (#3529)
* zha device info dialog

* cleanup

* quick hack to make this work

* remove hack

* add mixin for zha device info dialog

* fix potential exception

* cleanup

* review comments

* lint

* remove unused import

* lint

* review coments

* review comments

* translations and css
2019-09-04 09:40:47 -07:00
Bram Kragten
abb9190c98 20190904.0 (#3613)
* Alarm codes (#3566)

* Handle alarm codes from keyboard input

Closes https://github.com/home-assistant/home-assistant-polymer/issues/2602

* remove friendly_name changes

* remove unnecessary TS check

* Update azure-pipelines-release.yml for Azure Pipelines

* Don't remove `hvac_action` from history attributes (#3570)

So it can be used to plot a fill when active in the graph.

* Update the map when making config changes (#3568)

* Add haptic feedback to handle click (#3569)

* Filter camera service entities (#3583)

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3582

* Notification drawer RTL support (#3580)

* add exceptional icon (#3572)

* Add options to badges (#3552)

* Add options to badges

name
icon
entity_picture

* lint

* lint

* rename entityPicture to image

* Align styling cast buttons (#3579)

* Align styling cast buttons

* Split dev constants

* Ignore dev_const

* Update README.md

* Move lovelace background settings to theme (#3561)

* Move lovelace background settings to theme

While being backwards compatible

* Also update cast

* Don't allow overwrite of english lang (#3590)

* Update hui-card-options.ts (#3591)

* Fix display of no triggers text if no device is selected or device has no triggers (#3592)

* Fix timing issue in external auth (#3587)

* Fix timing issue in external auth

* add await 0

* Show toast on successfull save (#3576)

* Show toast on successfull save

We need to make a list of places where this could benefit the user experience.

* Helper method

* Rename

* handle unavailable lights (#3549)

* handle unavailable lights

* unavailable overlay

* extract unavailable overlay

* Option to display last changed in glance-card (#3584)

* Option to display last changed in glance-card

Closes https://github.com/home-assistant/ui-schema/issues/110

* move show_last_changed to entity-level

* address review comments

* Filter alerts in services (#3598)

Closes https://github.com/home-assistant/home-assistant-polymer/issues/3597

* Add exceptional in weather to translations (#3599)

* Add MQTT subscribe to dev tools (#3589)

* Add mqtt subscribe to dev tools

* Update mqtt-subscribe-card.ts

* Comments

* type

* Wrap long attributes in more-info-default (#3601)

Can likely be applied in many other places

Closes https://github.com/home-assistant/home-assistant-polymer/issues/2811

* Bumped version to 20190904.0 (#3612)
2019-09-04 14:21:03 +02:00
Bram Kragten
c4fca84ded Bumped version to 20190904.0 (#3612) 2019-09-04 13:51:52 +02:00
Ian Richardson
48a010563e Wrap long attributes in more-info-default (#3601)
Can likely be applied in many other places

Closes https://github.com/home-assistant/home-assistant-polymer/issues/2811
2019-09-04 09:37:21 +02:00
Bram Kragten
4378904243 Add MQTT subscribe to dev tools (#3589)
* Add mqtt subscribe to dev tools

* Update mqtt-subscribe-card.ts

* Comments

* type
2019-09-03 15:57:54 -07:00
MatthewFlamm
ba66bf88d3 Add exceptional in weather to translations (#3599) 2019-09-03 22:51:46 +02:00
Ian Richardson
5282a6504a Filter alerts in services (#3598)
Closes https://github.com/home-assistant/home-assistant-polymer/issues/3597
2019-09-03 22:23:10 +02:00
Ian Richardson
4f3abe1025 Option to display last changed in glance-card (#3584)
* Option to display last changed in glance-card

Closes https://github.com/home-assistant/ui-schema/issues/110

* move show_last_changed to entity-level

* address review comments
2019-09-03 22:12:21 +02:00
Ian Richardson
5bcba95c25 handle unavailable lights (#3549)
* handle unavailable lights

* unavailable overlay

* extract unavailable overlay
2019-09-03 14:35:37 -05:00
Bram Kragten
a9c9d4ca51 Show toast on successfull save (#3576)
* Show toast on successfull save

We need to make a list of places where this could benefit the user experience.

* Helper method

* Rename
2019-09-03 20:33:10 +02:00
Bram Kragten
f00ad84c16 Fix timing issue in external auth (#3587)
* Fix timing issue in external auth

* add await 0
2019-09-03 20:32:43 +02:00
Erik Montnemery
3b2e02562c Fix display of no triggers text if no device is selected or device has no triggers (#3592) 2019-09-03 10:55:42 -07:00
Bram Kragten
7bc947ffb0 Update hui-card-options.ts (#3591) 2019-09-03 10:26:26 -07:00
Bram Kragten
15564a1b26 Don't allow overwrite of english lang (#3590) 2019-09-03 10:26:04 -07:00
Bram Kragten
753e069323 Move lovelace background settings to theme (#3561)
* Move lovelace background settings to theme

While being backwards compatible

* Also update cast
2019-09-03 13:13:29 +02:00
Bram Kragten
b37a0e2d43 Align styling cast buttons (#3579)
* Align styling cast buttons

* Split dev constants

* Ignore dev_const

* Update README.md
2019-09-03 12:56:11 +02:00
Ian Richardson
87b35010e0 Add options to badges (#3552)
* Add options to badges

name
icon
entity_picture

* lint

* lint

* rename entityPicture to image
2019-09-03 11:33:07 +02:00
MatthewFlamm
4e383e3e67 add exceptional icon (#3572) 2019-09-03 11:31:54 +02:00
Yosi Levy
0e82178973 Notification drawer RTL support (#3580) 2019-09-03 11:31:08 +02:00
Ian Richardson
fe2046c6cd Filter camera service entities (#3583)
Closes https://github.com/home-assistant/home-assistant-polymer/issues/3582
2019-09-03 10:02:34 +02:00
Bram Kragten
af0304bf78 Add haptic feedback to handle click (#3569) 2019-09-02 21:18:47 -07:00
Bram Kragten
fcd206e94b Update the map when making config changes (#3568) 2019-09-02 21:17:03 -07:00
Bram Kragten
cf7a300614 Don't remove hvac_action from history attributes (#3570)
So it can be used to plot a fill when active in the graph.
2019-09-02 09:10:48 -07:00
Pascal Vizeli
a97ce49f0b Update azure-pipelines-release.yml for Azure Pipelines 2019-09-02 14:36:26 +02:00
Ian Richardson
5bfdc98217 Alarm codes (#3566)
* Handle alarm codes from keyboard input

Closes https://github.com/home-assistant/home-assistant-polymer/issues/2602

* remove friendly_name changes

* remove unnecessary TS check
2019-09-01 22:23:37 -07:00
Paulus Schoutsen
b022128031 Merge pull request #3567 from home-assistant/dev
20190901.0
2019-09-01 22:18:43 -07:00
Bram Kragten
1bc2e6fc17 Use tslib and importHelpers (#3559) 2019-09-01 22:00:32 -07:00
Ian Richardson
6b5c9efb39 Break long strings in notifications (#3557) 2019-09-01 22:00:14 -07:00
Ian Richardson
be0c035ba1 Don't open more-info from integrations dashboard (#3556) 2019-09-01 21:59:57 -07:00
Bram Kragten
12173388a0 Split Logs from info tab in dev tools (#3560)
* Split Logs from info tab in dev tools

* lint

* Remove border above logs
2019-09-01 21:53:12 -07:00
Ian Richardson
ba0d7cb156 Present confirmation for server restarts/stops (#3564)
Closes https://github.com/home-assistant/home-assistant-polymer/issues/3233
2019-09-01 21:51:35 -07:00
Ian Richardson
c3e29e359a Show alarm's friendly_name if set (#3565)
Closes https://github.com/home-assistant/home-assistant-polymer/issues/3459
2019-09-01 21:51:01 -07:00
Paulus Schoutsen
6259e45128 Bumped version to 20190901.0 2019-09-01 21:48:41 -07:00
Paulus Schoutsen
6998cce8eb Update translations 2019-09-01 21:48:37 -07:00
Erik Montnemery
f43abb5a9d Support device triggers in automation editor (#3514)
* Support device trigger in automation editor

* Fix review comments, improve usability.

* Lint

* Lint

* Improve styling, address review comments

* Fix support for unknown stored automation

* Fix

* Lint

* Lint

* Index trigger by key, not by object

* Fix no trigger case

* Fix typing

* Move trigger translations to backend

* Rename WS command to device_automation/trigger/list

* Tweak

* Update src/data/device_automation.ts

Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>

* Address review comments

* Fix..

* Simplify ha-device-trigger-picker

* Fix changing device
2019-09-01 21:45:47 -07:00
Ian Richardson
a7fdbc069b Update fan direction (#3547)
* Handle current_direction in more-info-fan

* remove current_direction changes

* add forward/reverse to translations
2019-08-30 17:29:17 -07:00
Paulus Schoutsen
b154903691 Merge pull request #3537 from home-assistant/dev
20190828.0
2019-08-28 13:43:20 -07:00
Mauricio Bonani
15a88385c2 Upgrade MDI icons to 4.2.95 (#3533)
* Upgrade MDI icons to 4.2.95

* Upgrade MDI icons to 4.2.95
2019-08-28 13:42:18 -07:00
Paulus Schoutsen
6ddf364093 Bumped version to 20190828.0 2019-08-28 13:41:37 -07:00
Paulus Schoutsen
fccb97ede8 Update translations 2019-08-28 13:41:34 -07:00
Sean Mooney
cfc6bf4da9 Remove duplicate word from onboarding error (#3535)
Someone shared an error message in Discord and I noticed it mentioned the word "loading" twice in a row. This removes the duplicate word from the alert.
2019-08-28 13:37:58 -07:00
Thomas Lovén
02e250cd04 Fix for double taps in iOS 13 beta (#3523)
See home-assistant/home-assistant-polymer#3510 for more info.
2019-08-28 13:37:30 -07:00
Paulus Schoutsen
d29eacb268 Merge pull request #3530 from home-assistant/dev
20190825.0
2019-08-25 22:24:24 -07:00
Paulus Schoutsen
62ae7df097 Bumped version to 20190825.0 2019-08-25 22:20:44 -07:00
Paulus Schoutsen
0d43bef600 Update translations 2019-08-25 22:20:35 -07:00
Paulus Schoutsen
3709c13975 Increase touch target of menu button with notifications (#3527) 2019-08-25 22:08:49 -07:00
Paulus Schoutsen
b624b363bd Fix LL menu (#3528) 2019-08-25 21:51:47 -07:00
Paulus Schoutsen
d841cc92ef Slightly simplify markdown API 2019-08-24 12:55:40 -07:00
Paulus Schoutsen
cdcafe9e6f Run markdown in web worker (#3524)
* Run markdown in web worker

* Set global object
2019-08-24 12:48:57 -07:00
Paulus Schoutsen
a66960fa00 Add context to comment 2019-08-24 12:42:38 -07:00
Paulus Schoutsen
38cc7b1090 Fix advanced mode not representing state correctly (#3519) 2019-08-24 09:55:49 -07:00
Paulus Schoutsen
ac443c2fa0 Merge pull request #3515 from home-assistant/dev
20190822.0
2019-08-22 15:05:43 -07:00
Paulus Schoutsen
ee0388708f Bumped version to 20190822.0 2019-08-22 15:04:09 -07:00
Paulus Schoutsen
0717a3dadd Update translations 2019-08-22 15:04:06 -07:00
Paulus Schoutsen
6b0b66af99 Fix text areas not working in Preact (#3513) 2019-08-22 12:24:42 -07:00
Paulus Schoutsen
7e5f28b3cc Fix required fields with default values (#3512) 2019-08-22 12:21:21 -07:00
Paulus Schoutsen
c9307ab76a Merge pull request #3507 from home-assistant/dev
20190821.0
2019-08-21 14:14:38 -07:00
Paulus Schoutsen
ecfbfbf56b Bumped version to 20190821.0 2019-08-21 14:13:32 -07:00
Paulus Schoutsen
9b321124bb Update translations 2019-08-21 14:13:27 -07:00
Paulus Schoutsen
512b76f450 Update MDI 2019-08-21 14:12:43 -07:00
Thomas Lovén
5de8c713c8 Lovelace markdown card - fix race condition, add variables to template (#3505)
* Fix connection race, add variables

* Update src/panels/lovelace/cards/hui-markdown-card.ts

* Lint
2019-08-21 14:03:40 -07:00
Paulus Schoutsen
7482059373 Merge pull request #3504 from home-assistant/dev
20190820.1
2019-08-20 16:19:52 -07:00
Paulus Schoutsen
f64062d17b Bumped version to 20190820.1 2019-08-20 16:19:16 -07:00
Paulus Schoutsen
afd6fddad7 Update translations 2019-08-20 16:19:03 -07:00
Paulus Schoutsen
e8ad975212 Fix onboarding (#3503)
* Fix onboarding

* Lint
2019-08-20 16:18:26 -07:00
Paulus Schoutsen
831b23347e Merge pull request #3502 from home-assistant/dev
20190820.0
2019-08-20 00:14:18 -07:00
Paulus Schoutsen
5edee41c5b Add system options UI (#3501)
* Add system options UI

* Tweak translation
2019-08-20 00:09:33 -07:00
Paulus Schoutsen
c04a091f59 Bumped version to 20190820.0 2019-08-20 00:07:25 -07:00
Paulus Schoutsen
3bbd45079c Update translations 2019-08-20 00:07:21 -07:00
Paulus Schoutsen
01da25d2d6 Allow disabling entity in entity registry (#3496)
* Allow disabling entitiy in entity registry

* Make strings translatable

* Update dialog-entity-registry-detail.ts

* Change to enabled
2019-08-19 23:59:32 -07:00
Paulus Schoutsen
355e3d7911 Migrate integrations page to TypeScript (#3500) 2019-08-19 15:12:57 -07:00
Thomas Lovén
6c109c15ef Add buttons to move entities (#3499) 2019-08-19 14:17:49 -07:00
Thomas Lovén
c542b242fe Fix gui-editor resizing problem (#3498) 2019-08-19 13:19:56 -07:00
Yosi Levy
bcb26bd960 Force ltr again in info panel (#3494) 2019-08-15 21:27:36 -07:00
Paulus Schoutsen
3a3c705343 Merge pull request #3492 from home-assistant/dev
20190815.0
2019-08-15 14:03:35 -07:00
Paulus Schoutsen
46f3a38b7c Bumped version to 20190815.0 2019-08-15 13:36:03 -07:00
Paulus Schoutsen
864175bde9 Update translations 2019-08-15 13:36:00 -07:00
Paulus Schoutsen
f458bdffe0 Add support for options flows (#3491) 2019-08-15 13:34:26 -07:00
Paulus Schoutsen
200e099035 Refactor config flow dialog to make it reusable (#3488)
* Refactor config flow dialog to make it reusable

* More refactor

* forgot to save

* Render labels correcetly
2019-08-15 09:03:54 -07:00
Mauricio Bonani
07b8518162 Upgrade MDI icons to 4.0.96 (#3490)
* Upgrade MDI icons to 4.0.96

* Upgrade MDI icons to 4.0.96
2019-08-15 08:45:35 -07:00
Paulus Schoutsen
b3525abf21 Upgrade lit-html (#3485) 2019-08-15 08:45:17 -07:00
Paulus Schoutsen
f7bb85d332 Do not use toggleAttribute (#3484) 2019-08-12 12:52:59 -07:00
Paulus Schoutsen
b8a18a27a4 Update release script 2019-08-12 12:48:34 -07:00
Yosi Levy
88bea10b26 Fix ha-sidebar for RTL (#3469)
* Fix menu alignments, icon, profile alignment in collapsed and expanded mode

* Refactor

* Lint exclude

* Refactor + lint ignore

* Fixed RTL calc location

* Refactored ifs
2019-08-12 10:44:51 -07:00
Yosi Levy
807dff99af RTL arrow problems (#3467)
* Updated style check since load sequence must have changed

* Refactored to timeout

* Added comment
2019-08-12 10:31:23 -07:00
Seb Ruiz
9fa8544972 Add relevant device_class icons for Cover entity (#3482)
* Add relevant cover icons for supported device classes

* Remove icon which doesn't have closed/open state

* Remove umbrella icon for awnings
2019-08-12 09:11:59 -07:00
Paulus Schoutsen
806e70b6c9 Merge pull request #3480 from home-assistant/dev
20190811.0
2019-08-11 21:17:04 -07:00
Paulus Schoutsen
204bd803bf Add reload scene button (#3476) 2019-08-11 20:52:58 -07:00
Paulus Schoutsen
52712f65c2 Bumped version to 20190811.0 2019-08-11 20:52:24 -07:00
Paulus Schoutsen
8c3f8656fe Update translations 2019-08-11 20:52:19 -07:00
Thomas Lovén
1f3a5b1396 Template markdown card (#3451)
* Render templates in markdown card

* Add manual entity_id option

* Linting

* Address review comments

* Address review comments

* Address review comments

* Address review comments

* Tweak disconnect function

* Remove cardSize instance variable

* Fix demo
2019-08-10 12:55:32 -07:00
Thomas Lovén
c15629b81b Various changes to card editor. (#3265)
* Various changes to card editor.

* Avoid crashing on bad yaml when creating a new card

* Address review comments

* Revert interface change

* Avoid config loops. Nicer error behavior.
2019-08-10 12:14:35 -07:00
Paulus Schoutsen
ef3892de92 Re-apply theme if backend theme changes (#3471) 2019-08-10 11:38:39 -07:00
Paulus Schoutsen
47d6bb69b0 Fix setting view background (#3470) 2019-08-09 16:26:33 -07:00
Paulus Schoutsen
f10fab7e22 Fix hass.io icon order (#3462) 2019-08-09 15:53:46 -07:00
Bram Kragten
e2dfac48d0 Cast View 0 + show active (#3466)
* View 0 + show active

* Fix view 0 receiver

* Type

select doesn't seem to be used?
2019-08-09 15:34:09 -07:00
Paulus Schoutsen
53f5a29151 Remove stale comment 2019-08-09 15:24:28 -07:00
Paulus Schoutsen
a042cd2d48 Fix icon build 2019-08-09 13:15:58 -07:00
Paulus Schoutsen
8533f9372f Upgrade MDI icons to 3.9.97 2019-08-09 11:40:23 -07:00
Paulus Schoutsen
a4e96a4f3f Update translations 2019-08-09 10:59:13 -07:00
Pascal Vizeli
fa40135a27 Build wheels from release & Templates 2019-08-08 11:22:48 +02:00
Paulus Schoutsen
d85f9f9021 Convert profile page to Lit/TS (#3449)
* Convert profile page to Lit/TS

* Lint
2019-08-07 14:35:31 -07:00
Thomas Lovén
dc2ee2e63f Enable ha-icons in markdown card (#3458)
* Allow ha-icon in markdown

* Please the linter

* Remove allowSvg

* Remove lasts allow-svgs
2019-08-07 14:35:17 -07:00
Paulus Schoutsen
f3729759b7 Update FAQ 2019-08-06 16:47:27 -07:00
Frederik Gladhorn
f108e279cd Add script/setup (#3437)
script/setup did not exist, despite being mentioned in the readme.
Create it and let it call bootstrap.
2019-08-06 15:36:35 -07:00
Paulus Schoutsen
8dce24ddfc Tweak upload script 2019-08-06 09:56:07 -07:00
Paulus Schoutsen
d2e780dda2 Better track pageview 2019-08-06 09:36:22 -07:00
Paulus Schoutsen
c382768008 Update GA to always track / 2019-08-06 09:34:45 -07:00
Paulus Schoutsen
f369045f35 Set correct GA code 2019-08-06 08:49:57 -07:00
Paulus Schoutsen
17921c18b6 Add GA to receiver 2019-08-06 08:44:47 -07:00
Paulus Schoutsen
42c6cecf89 Merge pull request #3461 from home-assistant/dev
20190805.0
2019-08-05 22:31:25 -07:00
Paulus Schoutsen
4799fdee9c Bumped version to 20190805.0 2019-08-05 22:22:35 -07:00
Paulus Schoutsen
2049687590 Update translations 2019-08-05 22:22:31 -07:00
Paulus Schoutsen
aca5ae9f67 Fix Cast demo (#3460) 2019-08-05 22:21:54 -07:00
Paulus Schoutsen
de04f60821 Merge pull request #3457 from home-assistant/dev
20190804.0
2019-08-04 22:37:45 -07:00
Paulus Schoutsen
98b882d599 Bumped version to 20190804.0 2019-08-04 22:26:27 -07:00
Paulus Schoutsen
5b02a43c3f Update translations 2019-08-04 22:26:20 -07:00
Paulus Schoutsen
2da844a1fb Home Assistant Cast 2019-08-04 22:25:43 -07:00
Charles Garwood
0544027c38 Fix zwave-node-values component (#3452)
* Fix zwave-node-values

* lint
2019-08-03 11:19:25 -07:00
Paulus Schoutsen
2389f92448 Fix playerObj undefined. Fixes #2915 2019-08-03 11:17:31 -07:00
Paulus Schoutsen
1f13c00937 Merge pull request #3450 from home-assistant/dev
20190801.0
2019-08-01 13:41:22 -07:00
Paulus Schoutsen
2fda2ee742 Suggest a view path when user enters a title when creating a view (#3448)
* Suggest a view path when user enters a title when creating a view

* Lint
2019-08-01 13:33:28 -07:00
Paulus Schoutsen
17a3affb6f Remove conversation because it's not part of default config (#3444) 2019-08-01 13:32:13 -07:00
Paulus Schoutsen
f6be398fb9 Bumped version to 20190801.0 2019-08-01 13:31:46 -07:00
Paulus Schoutsen
87e24d658b Update translations 2019-08-01 13:31:41 -07:00
Paulus Schoutsen
abf70c3a3e Better deal with YAML updated message (#3447) 2019-08-01 11:52:43 -07:00
Paulus Schoutsen
b9afa69ee5 Handle unavailable climate (#3446) 2019-08-01 09:02:20 -07:00
Charles Garwood
d9628fd9a2 Convert zwave-node-config to lit/ts (#3434)
* Convert zwave-node-config to lit/ts

* Add translations

* lint round 1

* lint round 2

* . all the properties and fix missing types

* Clean up bad prettier auto-style

* set header property instead of attribute
2019-08-01 08:32:20 -07:00
Paulus Schoutsen
a617eac284 Merge pull request #3443 from home-assistant/dev
20190731.0
2019-07-31 11:06:58 -07:00
Paulus Schoutsen
7d90429fa9 Bumped version to 20190731.0 2019-07-31 10:51:22 -07:00
Paulus Schoutsen
fa6d0949a2 Update translations 2019-07-31 10:50:26 -07:00
Marijn Pool
aab967798a Split General Config and Server Control (#3418)
* Initial split of core and server control config

* Changed Typescript to Javascript

* Show Server controls without Advanced Mode

* Update en.json
2019-07-31 10:41:54 -07:00
Sean Mooney
c523bae2c8 Use accent color for notification badge again (#3442)
This fixes https://github.com/home-assistant/home-assistant-polymer/issues/3414 by changing the notification badge to use `accent-color` variable (same behavior as it was prior to 0.96 overhaul). I make extensive use of persistent_notifications and agree with that issue - the color change has made it a little harder to notice now. 

Before and after of how it looks on the default theme:
![badge](https://i.imgur.com/VHnyzQb.png)

The other reason I feel this makes sense, is that `accent-color` is already used in "mobile mode" dot (pic below), so this brings some consistency.
![mobile-badge](https://i.imgur.com/EOvtZGJ.jpg)

If this was an intentional change, feel free to reject/close this.
2019-07-31 09:11:24 -07:00
Thomas Lovén
b77372fc9a Display history-graph entries in the order they were specified (#3436) 2019-07-30 11:55:37 -07:00
Paulus Schoutsen
70b06861d1 Add file for custom card support (#3440) 2019-07-30 11:47:01 -07:00
Paulus Schoutsen
b158f15d93 Lovelace tweaks (#3439) 2019-07-30 10:37:21 -07:00
Paulus Schoutsen
4edcd5f2ef Simplify demo (#3438) 2019-07-30 10:37:12 -07:00
Paulus Schoutsen
689e37782e Ignore LL updates for a second in YAML mode (#3433) 2019-07-26 20:30:54 -07:00
Paulus Schoutsen
dcfed5d7e1 weblink target (#3431) 2019-07-26 15:09:32 -07:00
Paulus Schoutsen
54ea6176aa Extract is navigation click (#3432) 2019-07-26 14:55:08 -07:00
Paulus Schoutsen
a91bb3cdbb Add label to ha-entity-picker (#3430) 2019-07-26 14:54:50 -07:00
Paulus Schoutsen
6abbe72e4d Lovelace cleanups (#3427)
* Improvements

* Add types CAF

* Fix demo switching

* Do not set background color in hui-view
2019-07-26 11:06:16 -07:00
Paulus Schoutsen
dae0ecce6a Hide preset=none (#3419)
* Hide preset=none

* Add const to commit
2019-07-25 10:14:29 -07:00
Paulus Schoutsen
c3118eada9 Show notification indicator in forced mobile mode (#3420) 2019-07-25 10:14:20 -07:00
Paulus Schoutsen
0f6d0b164f Add aria labels to cover controls (#3421) 2019-07-25 10:14:13 -07:00
Paulus Schoutsen
87293e4b15 Add more labels (#3422) 2019-07-25 10:14:05 -07:00
David F. Mulcahey
ff80eef25d Update ZHA device card (#3411)
* add ability to subscribe to individual updates

* catch changes on area, device name and entity ids

* subscribe directly

* remove entity registry change

* add type

* remove device subscription
2019-07-24 20:05:33 -07:00
Paulus Schoutsen
973c190bb6 Merge pull request #3408 from home-assistant/dev
20190721.1
2019-07-21 12:57:30 -07:00
Paulus Schoutsen
0cd263c532 Bumped version to 20190721.1 2019-07-21 12:45:27 -07:00
Paulus Schoutsen
3c366b2b85 Move hassio down (#3407) 2019-07-21 12:20:55 -07:00
Paulus Schoutsen
a59f0086b5 Fix proper script closing tag (#3405) 2019-07-21 12:20:37 -07:00
Paulus Schoutsen
1f1a3acc03 Fix styling notifications (#3404) 2019-07-21 12:10:47 -07:00
Paulus Schoutsen
d09cf9c8ab Close script tag (#3403) 2019-07-21 11:46:40 -07:00
Paulus Schoutsen
f32eb971a4 Properly close script tag 2019-07-21 11:30:57 -07:00
Paulus Schoutsen
56c08a1d07 Close the drawer when picking a panel when in forced narrow mode (#3402) 2019-07-21 11:07:26 -07:00
Paulus Schoutsen
a44b1d01ed Merge pull request #3401 from home-assistant/dev
20190721.0
2019-07-21 09:55:40 -07:00
Paulus Schoutsen
2fd75742f1 Bumped version to 20190721.0 2019-07-21 09:55:03 -07:00
Paulus Schoutsen
70b18344b6 Update translations 2019-07-21 09:54:59 -07:00
Paulus Schoutsen
5ec58a723e properly store width (#3400) 2019-07-21 09:54:12 -07:00
Paulus Schoutsen
8dd44bca32 Merge pull request #3399 from home-assistant/dev
20190720.0
2019-07-20 17:55:41 -07:00
Paulus Schoutsen
dcb975c8ce Bumped version to 20190720.0 2019-07-20 17:34:03 -07:00
Paulus Schoutsen
ea0a0f510d Update translations 2019-07-20 17:33:59 -07:00
Paulus Schoutsen
9476557aee Remove automatically including preset None (#3398) 2019-07-20 17:32:35 -07:00
Paulus Schoutsen
4555bd4240 Add a force mobile mode on desktop (#3394)
* Add a force mobile mode

* Fix columns on LL

* Update text

* Move it above the push notifications

* Hide notification count when sidebar expanded and count=0
2019-07-20 17:30:25 -07:00
Paulus Schoutsen
75c7445dd9 Show a tooltip when hovering sidebar items in compact mode (#3393)
* Show a tooltip when hovering sidebar items in compact mode

* Use div for tooltip
2019-07-20 10:31:13 -07:00
Paulus Schoutsen
da741238d2 Various climate improvements (#3389)
* Sort HVAC modes

* Add translations for HVAC action

* Show hvac_action if available
2019-07-19 15:51:47 -07:00
Paulus Schoutsen
3d0c994b9a Sidebar iteration (#3392)
* Remove hover effect

* Reuse render panel func

* Show notification badge on the right in expanded mode
2019-07-19 15:51:37 -07:00
Paulus Schoutsen
ab4b4796c0 Merge pull request #3388 from home-assistant/dev
20190719.0
2019-07-19 09:42:24 -07:00
Paulus Schoutsen
a7077dbcb4 Bumped version to 20190719.0 2019-07-19 09:29:42 -07:00
Paulus Schoutsen
a66013ecd7 Update translations 2019-07-19 09:29:38 -07:00
Nikolay Vasilchuk
8265a55838 Fix target_temperature_step (#3386)
* target_temp_step fix

* Fix undefined

* Small fix

* Linter fix

* Linter fix
2019-07-19 09:20:08 -07:00
Paulus Schoutsen
95d6cbd130 Merge pull request #3385 from home-assistant/dev
20190718.0
2019-07-18 14:07:04 -07:00
Paulus Schoutsen
1ee9811644 Bumped version to 20190718.0 2019-07-18 14:06:10 -07:00
Paulus Schoutsen
99c5f2a88a Update translations 2019-07-18 14:06:07 -07:00
Paulus Schoutsen
cdfd9cea5c Fix shade for HVAC action on graph (#3380) 2019-07-18 14:03:04 -07:00
Joakim Plate
4f2b82d787 Fix missing end tag (#3378)
* Fix missing end tag

* Prettify file
2019-07-18 09:36:15 -07:00
Charles Garwood
3fd0ee9d75 Convert zwave-values to ts & add translation strings (#3367)
* Convert zwave-values to ts & add translation strings

* lint

* Change some common translation strings to live under "common" instead of "values"

* Cleanup & address review comments
2019-07-17 20:26:45 -07:00
Paulus Schoutsen
c7f7e72340 Merge pull request #3377 from home-assistant/dev
20190717.1
2019-07-17 15:10:22 -07:00
Paulus Schoutsen
1205322342 Bumped version to 20190717.1 2019-07-17 15:09:26 -07:00
Joakim Plate
4cefb9715c Make sure sliderType is set first (#3376)
* Make sure sliderType is set first

* No need for a separate name
2019-07-17 15:08:51 -07:00
Paulus Schoutsen
35b38db57f Merge branch 'master' into dev 2019-07-17 15:08:31 -07:00
Paulus Schoutsen
4f72eb5416 Remove check 2019-07-17 13:01:12 -07:00
Paulus Schoutsen
f3d1a421f4 Update pipeline 2019-07-17 13:00:34 -07:00
Paulus Schoutsen
f3c24dc0b3 Remove tsc check 2019-07-17 12:41:07 -07:00
Paulus Schoutsen
e4cbdc29a2 Update azure-pipelines-release.yml 2019-07-17 12:33:46 -07:00
Paulus Schoutsen
c985977efc Update pipeline 2019-07-17 12:17:52 -07:00
Paulus Schoutsen
8fb991c5ce Merge remote-tracking branch 'origin/dev' 2019-07-17 12:15:52 -07:00
Paulus Schoutsen
210c63ad14 Bumped version to 20190717.0 2019-07-17 12:15:13 -07:00
Paulus Schoutsen
8167b05cad Update translations 2019-07-17 12:15:12 -07:00
Paulus Schoutsen
e5a916032a Merge pull request #3375 from home-assistant/dev
20190717.0
2019-07-17 12:09:36 -07:00
Paulus Schoutsen
56745b3723 Set up CI with Azure Pipelines
[skip ci]
2019-07-17 11:50:07 -07:00
Paulus Schoutsen
ddf2c6cc0f Add Azure pipelines for release 2019-07-17 11:48:50 -07:00
Joakim Plate
84df2bd531 Make sure slider type updates with changes to temperatures (#3374) 2019-07-17 11:32:22 -07:00
Paulus Schoutsen
42c3e3e46c Differentiate Heat/Cool (#3371) 2019-07-16 23:51:15 -07:00
Paulus Schoutsen
5141e0e923 Merge pull request #3370 from home-assistant/fixes-yo
Fixes yo
2019-07-16 22:56:10 -07:00
Paulus Schoutsen
b87c94e395 Fix typing 2019-07-16 22:41:47 -07:00
Paulus Schoutsen
55aa5a0d12 Scroll device list when goes out of screen. Fixes #3343 2019-07-16 21:43:15 -07:00
Paulus Schoutsen
eaaeb10c6d Store width before searching to avoid jumping 2019-07-16 21:34:12 -07:00
Paulus Schoutsen
567769be5a Use hass icons for search input 2019-07-16 21:33:09 -07:00
Paulus Schoutsen
3ebb30bd48 Only show advanced mode toggle for admins. Fixes #3369 2019-07-16 20:43:05 -07:00
Paulus Schoutsen
09a19d2e7f Allow scrolling notification drawer. Fixes 3366 2019-07-16 20:38:35 -07:00
Paulus Schoutsen
fabc49d17e Fix theme color in dev index.html 2019-07-16 20:36:40 -07:00
Paulus Schoutsen
00e9155546 Merge pull request #3368 from home-assistant/dev
20190715.0
2019-07-15 13:50:25 -07:00
Paulus Schoutsen
8238b700b0 Update translations uno mas 2019-07-15 13:38:44 -07:00
Paulus Schoutsen
5ff33224ed Remove unused keys 2019-07-15 13:15:50 -07:00
Paulus Schoutsen
07dee9c5bb Update translations 2019-07-15 13:11:37 -07:00
Paulus Schoutsen
9eaeafdd6a Bumped version to 20190715.0 2019-07-15 13:05:11 -07:00
Paulus Schoutsen
beb1fe1e64 Update translations 2019-07-15 13:05:06 -07:00
Timmo
cdb2a1a424 Integrations - Add Search (#3361)
*  Add search to flow picker

* 🔨 Autofocus

* 🔨 squash extra space

* Update src/dialogs/config-flow/step-flow-pick-handler.ts

Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>

* Update src/dialogs/config-flow/step-flow-pick-handler.ts

Co-Authored-By: Paulus Schoutsen <paulus@home-assistant.io>
2019-07-14 13:47:33 -07:00
Paulus Schoutsen
8bbc442b7e Correctly check frontend version (#3365) 2019-07-14 13:30:50 -07:00
Sean Mooney
7a12cbf96e Add link to Alexa skill on Cloud page (#3364)
This adds a direct link to the Home Assistant Alexa skill, which is more convenient than telling the user to search for it themselves. On mobile devices it can open the skill directly in the Alexa app which is nice.

Also tweaked the wording from "activate" to "enable" since that is what Amazon uses.
2019-07-12 23:45:27 -07:00
Paulus Schoutsen
e36454f08f Fix token card not showing (#3362) 2019-07-12 22:36:36 -07:00
Timmo
3865c1943c 🔨 Fix mqtt dev tools missing class (#3359) 2019-07-12 15:31:38 -07:00
Paulus Schoutsen
e7e3edfd97 Merge pull request #3358 from home-assistant/dev
20190712.0
2019-07-12 14:58:22 -07:00
Paulus Schoutsen
4bdc82f0ed Bumped version to 20190712.0 2019-07-12 14:44:22 -07:00
Paulus Schoutsen
8e3b41885d Update translations 2019-07-12 14:44:07 -07:00
Paulus Schoutsen
8f3d5fdb7d Fix scrollbar on Firefox (#3357) 2019-07-12 14:42:56 -07:00
Timmo
f258aa2818 Replace standard browser scrollbar for overview and sidebar (#3350)
* 📜 Replace standard browser scrollbar for overview and sidebar

* 🔨 Remove from main
2019-07-12 13:08:51 -07:00
Charles Garwood
b4dd971829 Z-Wave Config Panel Updates (#3349)
* Display network status, hide buttons if network is stopped.

* travis/lint updates

* Review comments

* Add translations

* lint

* Missed a translation

* lint again...

* Fix unsubscribe function?

* lint again

* Remove state_str

* Code review comments

* fix for lit re-rendering & possible undefined value
2019-07-12 13:07:50 -07:00
Sean Mooney
e99d6f8e6a Fix incorrect tooltip on Add Person button (#3355)
The tooltip for the add person button incorrectly says "Create Area" when hovered. This should fix it, I think.
2019-07-12 12:07:46 -07:00
Paulus Schoutsen
cc969e547c Add frontend version to info (#3354) 2019-07-12 11:18:01 -07:00
Paulus Schoutsen
0e1ae3926b Merge pull request #3348 from home-assistant/dev
20190710.0
2019-07-10 10:35:46 -07:00
Charles Garwood
60c2bcc483 Convert Z-Wave panel to TS/Lit (#3345)
* Convert zwave-network to typescript/lit

* Convert zwave-network to ts/lit

* Updates per code review

* missed one (hass? => hass!)

* Remove constructor
2019-07-10 10:26:17 -07:00
Paulus Schoutsen
5d8e34e8be Show menu button when Hassio supervisor UI runs on old HA (#3347) 2019-07-10 10:10:56 -07:00
Paulus Schoutsen
14a430a059 Bumped version to 20190710.0 2019-07-10 09:36:44 -07:00
Paulus Schoutsen
4ae347949a Update translations 2019-07-10 09:36:35 -07:00
Paulus Schoutsen
cdd007cc54 Ensure load order (#3346) 2019-07-10 09:27:25 -07:00
Paulus Schoutsen
2929db5ba4 Fix fonts precaching (#3338)
* Fix font urls

* Don't zopfli nonexisting fonts
2019-07-10 08:18:04 -07:00
Paulus Schoutsen
628692b2e9 Do not cache onboarding page (#3337) 2019-07-10 08:17:51 -07:00
Paulus Schoutsen
7cfdc24a8c Fix test translations (#3339) 2019-07-10 08:17:41 -07:00
Paulus Schoutsen
1c69aa122b Merge pull request #3334 from home-assistant/dev
20190705.0
2019-07-05 16:09:33 -07:00
Paulus Schoutsen
25afb73ed7 Bumped version to 20190705.0 2019-07-05 15:25:01 -07:00
Paulus Schoutsen
5b5384032d Update translations 2019-07-05 15:25:01 -07:00
Jérôme W
a9d221147f Fix timer stops updating when changing views in LL (#3248)
* Fix timer stops updating when changing views in LL

* Test if _config exists in connectedCallback()

* Update hui-timer-entity-row.ts
2019-07-05 15:22:29 -07:00
Paulus Schoutsen
4fdbec93b3 Migrate for climate 1.0 (#3333)
* Migrate for climate 1.0

* Update demo

* Fix gallery

* Add preset to thermostat card

* Fix climate entity row
2019-07-05 15:13:53 -07:00
Thomas Lovén
0a8703ad0a Allow selecting text in error-card (#3330)
* Allow selecting text in error-card

* Still use default cursor
2019-07-02 20:28:39 -07:00
Paulus Schoutsen
ddc11c1b12 Merge pull request #3329 from home-assistant/dev
20190702.0
2019-07-02 10:33:40 -07:00
Paulus Schoutsen
317f43277e Bumped version to 20190702.0 2019-07-02 10:32:43 -07:00
Paulus Schoutsen
bf90642c9b Update translations 2019-07-02 10:32:40 -07:00
Paulus Schoutsen
6f77992387 Random fixes (#3328)
* Fix scroll into view on first load

* Do not crash when deleting script/automation

* Disable swipe on notification drawer
2019-07-02 10:31:48 -07:00
David F. Mulcahey
deaccd6cd4 Add info to ZHA device card (#3327)
* add zha domain icon

* update device card
2019-07-02 10:13:59 -07:00
Paulus Schoutsen
d7371ace6a Sidebar improvements (#3325)
* Do not contract sidebar when undocking sidebar

* Do not hide text until fully contracted

* Cancel hover expanding on tablets

* Open notifications on the left

* Set property before opening

* Fix check for support scroll if needed
2019-07-01 10:35:10 -07:00
Paulus Schoutsen
453b1000c1 Merge branch 'dev' 2019-06-30 23:03:58 -07:00
Paulus Schoutsen
8c1aff7505 Check supported func properly 2019-06-30 23:03:51 -07:00
Paulus Schoutsen
adf002c154 Merge branch 'dev' 2019-06-30 23:02:58 -07:00
Paulus Schoutsen
ed7b81e7a4 Hide scrollbars on sidebar during expanding 2019-06-30 23:02:48 -07:00
Paulus Schoutsen
c0f6ee6a32 Merge branch 'dev' 2019-06-30 22:52:44 -07:00
Paulus Schoutsen
9408df6099 Fix Firefox 2019-06-30 22:52:31 -07:00
Paulus Schoutsen
157bfd6f80 Space out sidebar 2019-06-30 22:21:37 -07:00
Paulus Schoutsen
99da7ebfe6 Merge branch 'dev' 2019-06-30 21:58:32 -07:00
Paulus Schoutsen
6911df9ac4 Fix sidebar in Safari 2019-06-30 21:58:02 -07:00
Paulus Schoutsen
8daeaab40b Merge pull request #3324 from home-assistant/dev
20190630.0
2019-06-30 15:20:33 -07:00
Paulus Schoutsen
45c3c78b31 Bumped version to 20190630.0 2019-06-30 15:15:56 -07:00
Paulus Schoutsen
a64a35b861 Update translations 2019-06-30 15:15:52 -07:00
Paulus Schoutsen
5a25627219 Stop playing video when more info is closed (#3318) 2019-06-30 15:14:42 -07:00
Paulus Schoutsen
203b14613f Show a notification dot on toggle menu button in narrow mode (#3323)
* Show a notification dot on toggle menu button in narrow mode

* Fix lint

* Move menu button to sidebar

* Fix height sidebar
2019-06-30 15:02:53 -07:00
Paulus Schoutsen
0a7cb39500 Add transition delay to sidebar expand 2019-06-28 14:46:54 -07:00
Paulus Schoutsen
42e75e7cdf Move notifications to the sidebar (#3317)
* Move notifications to the sidebar

* Close when navigating

* Lint
2019-06-28 14:23:29 -07:00
Paulus Schoutsen
58e6be12af Add developer tools panel (#3313) 2019-06-28 08:34:29 -07:00
Paulus Schoutsen
618d25ce48 Fix person showing value in badge 2019-06-28 08:28:52 -07:00
Paulus Schoutsen
9974510067 Merge pull request #3311 from home-assistant/dev
20190627.0
2019-06-27 17:56:22 -07:00
Paulus Schoutsen
2faa0c5979 Bumped version to 20190627.0 2019-06-27 17:48:44 -07:00
Paulus Schoutsen
1479647062 Update translations 2019-06-27 17:48:38 -07:00
Paulus Schoutsen
3becefaf8b Add a couple of labels (#3310)
* Add a couple of labels

* Add some more labels
2019-06-27 17:47:19 -07:00
Paulus Schoutsen
e804e62e66 Add advanced mode (#3298)
* Add advanced mode

* Move advanced mode to profile

* Add promo for advanced mode
2019-06-27 16:17:32 -07:00
Paulus Schoutsen
2c3cc1fbc7 experimental sidebar (#3306)
* experimental sidebar

* Change default docked sidebar to true

* remove delay

* Push things down

* Speed up animation

* Always open on big screens

* Move things around

* Final tweaks

* Lint

* Don't open on hover logo
2019-06-27 15:23:05 -07:00
Paulus Schoutsen
58cc76ab5a Merge pull request #3305 from home-assistant/dev
20190626.0
2019-06-26 09:10:32 -07:00
Paulus Schoutsen
5783cdb0d2 Bumped version to 20190626.0 2019-06-26 09:05:00 -07:00
Paulus Schoutsen
4f07caebc6 Update translations 2019-06-26 09:04:56 -07:00
Paulus Schoutsen
c4b75b4534 Fix typo in font definition (#3304) 2019-06-25 23:39:50 -07:00
Paulus Schoutsen
ae82eabaec Fix link colors in hassio addon view 2019-06-25 13:08:11 -07:00
Paulus Schoutsen
f8d3e55fe0 Fix home zone so it doesn't overlap the city name 2019-06-25 10:17:26 -07:00
Paulus Schoutsen
1462db0a76 Merge pull request #3303 from home-assistant/dev
20190624.1
2019-06-24 22:15:47 -07:00
Paulus Schoutsen
86b36fb76b Bumped version to 20190624.1 2019-06-24 22:06:35 -07:00
Paulus Schoutsen
c6194622b1 Update translations 2019-06-24 22:06:14 -07:00
Paulus Schoutsen
be5c3efb23 Fix source maps 2019-06-24 22:05:34 -07:00
Paulus Schoutsen
999c243c94 Better error report on Alexa (#3302) 2019-06-24 17:36:12 -07:00
Paulus Schoutsen
483f82e554 Add demo sw (#3301) 2019-06-24 10:39:27 -07:00
Paulus Schoutsen
e91f4567c2 Merge pull request #3300 from home-assistant/dev
20190624.0
2019-06-24 08:26:03 -07:00
Paulus Schoutsen
029467139d Bumped version to 20190624.0 2019-06-24 08:14:17 -07:00
Paulus Schoutsen
29649abe3d Update translations 2019-06-24 08:14:12 -07:00
Mauricio Bonani
266c80320b Upgrade mdi to 3.7.95 (#3299)
* Update yarn.lock

* Update package.json
2019-06-22 18:18:28 -07:00
Paulus Schoutsen
ae51300446 Revert Polymer to 3.1 (#3297)
* Revert Polymer to 3.1

* Only install 1 polymer
2019-06-22 12:36:30 -07:00
Thomas Lovén
cbdb222f72 Import extra_html_url using js instead of deprecated link tags (#3288)
* import extra_html_url using js instead of deprecated link tags

* Import modules instead

* Address comment

* Rename variables for es5 scripts

* Address comments
2019-06-21 20:55:53 -07:00
Paulus Schoutsen
98c419ff03 Switch to woff2 fonts (#3296) 2019-06-21 12:48:20 -07:00
Paulus Schoutsen
88b9348a81 Add map to demo (#3295) 2019-06-21 11:05:01 -07:00
Paulus Schoutsen
3e8606781e Fix typo 2019-06-21 09:31:15 -07:00
Paulus Schoutsen
875afbd7ae Merge pull request #3294 from home-assistant/dev
20190620.0
2019-06-20 23:52:08 -07:00
Paulus Schoutsen
3139b914d7 Bumped version to 20190620.0 2019-06-20 23:43:45 -07:00
Paulus Schoutsen
212a44b6ae Update translations 2019-06-20 23:43:39 -07:00
Paulus Schoutsen
60551168a2 Update demo (#3292)
* Update demo

* Kill homebridge hidden

* Add missing air translation

* Hide demo card with localStorage.hide_demo_card

* adjust size of demo card if hidden

* disable lint rule
2019-06-20 23:40:56 -07:00
Robbie Trencheny
32d9a6884f Add some aria-labels for use with fastlane snapshot (#3293) 2019-06-20 23:16:50 -07:00
Mauricio Bonani
7002ab27c0 Upgrade mdi to 3.6.95 (#3291)
* Update package.json

* Update yarn.lock
2019-06-20 14:45:43 -07:00
Bram Kragten
15c101109e Update hui-map-card.ts (#3289) 2019-06-20 08:34:34 -07:00
Paulus Schoutsen
316fed953a Merge pull request #3286 from home-assistant/dev
20190619.0
2019-06-19 16:21:38 -07:00
Paulus Schoutsen
93934449c0 Bumped version to 20190619.0 2019-06-19 16:11:45 -07:00
Paulus Schoutsen
894a25c98e Update translations 2019-06-19 16:11:41 -07:00
Paulus Schoutsen
90f0d9fa00 Add button for Alexa to sync entities (#3284)
* Add button for Alexa to sync entities

* Lint
2019-06-19 11:43:17 -07:00
Paulus Schoutsen
83889a8fd7 Filter met during onboarding (#3285)
* Filter met during onboarding

* Hide temp values with no value
2019-06-19 11:42:46 -07:00
Paulus Schoutsen
4cfc429e75 Hide unused entities in the demo 2019-06-18 11:59:51 -07:00
Paulus Schoutsen
2df829b79d Hide unused entities in the demo 2019-06-18 11:57:21 -07:00
Paulus Schoutsen
7baf6382ac Merge pull request #3282 from home-assistant/dev
20190618.0
2019-06-18 11:47:21 -07:00
Paulus Schoutsen
7d1f689ed9 Bumped version to 20190618.0 2019-06-18 11:21:56 -07:00
Paulus Schoutsen
4f448553f6 Update translations 2019-06-18 11:21:52 -07:00
David F. Mulcahey
dd56671974 Add NWK to ZHA device card and fix search again (#3278)
* add nwk to device info

* fix search again
2019-06-18 11:14:37 -07:00
Paulus Schoutsen
d8e0fd0ba5 Limit demo card mobile (#3281)
* Limit demo card on mobile

* Remove unused deps

* Remove tabs from ARS demo

* Set title to Home Assistant
2019-06-18 10:44:11 -07:00
Paulus Schoutsen
a9320d4baf Fix import 2019-06-17 20:12:29 -07:00
Kevin Cooper
42475becf1 Fix for more-info-alarm_control_panel when using code_arm_required (#3052)
* Fix for more-infoalarm_control_panel when using code_arm_required

* Update more-info-alarm_control_panel.js
2019-06-17 15:08:14 -07:00
Justin Bassett
c30aca8484 Dark Mode for Map Card (#3250)
* Ability to change tile set from light_all to dark_all through card config.

* Use correct boolean.

* Fix possible undefined.

* Use correct value.
2019-06-14 20:37:34 -07:00
Paulus Schoutsen
25bdf50737 Use users location 2019-06-14 15:25:41 -07:00
Paulus Schoutsen
4a60479b74 Merge branch 'dev' 2019-06-14 15:09:54 -07:00
Paulus Schoutsen
f6d651304c Fix demo 2019-06-14 15:09:42 -07:00
Paulus Schoutsen
85990c20ed Merge pull request #3275 from home-assistant/dev
20190614.0
2019-06-14 14:40:40 -07:00
Paulus Schoutsen
8ea98023a5 Bumped version to 20190614.0 2019-06-14 13:41:39 -07:00
Paulus Schoutsen
acceaea410 Update translations 2019-06-14 13:41:33 -07:00
Paulus Schoutsen
d609155022 Make setView not async (#3274) 2019-06-14 13:40:16 -07:00
Paulus Schoutsen
1add5077af Add Alexa report state (#3272) 2019-06-14 13:30:35 -07:00
Paulus Schoutsen
a9cac343b0 Preload LL (#3273)
* Preload LL

* Remove using observer
2019-06-14 13:30:20 -07:00
Paulus Schoutsen
1b441a752e Manage Alexa entities (#3269)
* Reorg cloud components

* Allow managing Alexa entities in the UI

* Use observer

* Update mwc version

* Tweak some UI
2019-06-13 11:57:56 -07:00
Ofek Ashery
03fee95f68 Allow to copy text in the notifications panel (#3257) 2019-06-12 21:01:14 -07:00
Paulus Schoutsen
7fa4b18843 Group managed entities (#3268) 2019-06-12 21:00:41 -07:00
Paulus Schoutsen
7b0fb949fd Upgrade some deps (#3266)
* Upgrade some deps

* Fix linting
2019-06-12 17:29:16 -07:00
Paulus Schoutsen
df10cff842 Add loading screen when external step done (#3261) 2019-06-11 15:19:12 -07:00
Penny Wood
8b93af1b56 Via Hub Rename (#3254) 2019-06-11 08:36:48 -07:00
Tor Arne Vestbø
a396a4e666 Pass credentials (cookies e.g.) when loading JavaScript assets (#3259)
The behavior of 'crossorigin' without a value is the same as
anonymous, which means user credentials such as cookies,
client-side SSL certificates or HTTP authentication will
not be passed on.

We want the preload links to work even when they are behind
a proxy that requires an authentication cookie, such as
Cloudflare Access (CF_Authorization), so we need to explicitly
send credentials with the "use-credentials" value.

ES modules are always fetched with CORS, with anonymous being
the default. Some browsers (Chromium) will realize that the
request is to the same origin, and send credentials anyways,
while others (Safari) will not, so we need to explicitly send
credentials to make sure they load in all cases.

See https://jakearchibald.com/2017/es-modules-in-browsers/
2019-06-10 13:41:59 -07:00
Paulus Schoutsen
8f278ec4bc Merge pull request #3247 from home-assistant/dev
20190604.0
2019-06-04 08:50:01 -07:00
Paulus Schoutsen
032ebce0bc Bumped version to 20190604.0 2019-06-04 08:48:41 -07:00
Paulus Schoutsen
bb60b42f98 Update translations 2019-06-04 08:48:37 -07:00
Paulus Schoutsen
21ed717287 Link to beta release notes for beta release in hassio (#3243) 2019-06-04 08:47:40 -07:00
Paulus Schoutsen
2d056bad81 Allow picking location on a map (#3244)
* Allow picking location on a map

* Add some better defaults

* Close connection before navigation
2019-06-04 08:47:02 -07:00
Paulus Schoutsen
8297e9e215 Merge pull request #3242 from home-assistant/dev
20190602.0
2019-06-02 13:52:11 -07:00
Paulus Schoutsen
4ccf450ad4 Bumped version to 20190602.0 2019-06-02 13:45:20 -07:00
Paulus Schoutsen
fc056869a7 Update translations 2019-06-02 13:45:16 -07:00
Paulus Schoutsen
0bd5ff34d4 Google banner background to support incorrect themes (#3241) 2019-06-02 13:44:01 -07:00
Paulus Schoutsen
ffd272d3fe Fix refreshing cloud prefs after changing Google prefs (#3240) 2019-06-02 13:37:55 -07:00
Paulus Schoutsen
1eee186e79 Fix toast on Firefox (#3239) 2019-06-02 16:13:10 +02:00
833 changed files with 119163 additions and 63580 deletions

View File

@@ -1,6 +1,7 @@
{
"extends": ["airbnb-base", "prettier"],
"parserOptions": {
"ecmaVersion": "2020",
"ecmaFeatures": {
"jsx": true,
"modules": true

View File

@@ -1,12 +1,9 @@
{
"extends": "./.eslintrc-hound.json",
"plugins": [
"react"
],
"plugins": ["react"],
"env": {
"browser": true
},
"parser": "babel-eslint",
"rules": {
"import/no-unresolved": 2,
"linebreak-style": 0,

View File

@@ -1,11 +1,24 @@
---
name: Bug report
about: Create a report to help us improve
title: ""
labels: bug
assignees: ""
---
<!-- READ THIS FIRST:
- If you need additional help with this template please refer to https://www.home-assistant.io/help/reporting_issues/
- Make sure you are running the latest version of Home Assistant before reporting an issue: https://github.com/home-assistant/home-assistant/releases
- This is for bugs only. Feature and enhancement requests should go in our community forum: https://community.home-assistant.io/c/feature-requests
- Provide as many details as possible. Do not delete any text from this template!
-->
**Checklist:**
- [ ] I updated to the latest version available
- [ ] I cleared the cache of my browser
**Home Assistant release with the issue:**
<!--
- Frontend -> Developer tools -> Info
- Or use this command: hass --version
@@ -14,22 +27,50 @@
**Last working Home Assistant release (if known):**
**UI (States or Lovelace UI?):**
<!--
- Frontend -> Developer tools -> Info
-->
**Browser and Operating System:**
<!--
Provide details about what browser (and version) you are seeing the issue in. And also which operating system this is on. If possible try to replicate the issue in other browsers and include your findings here.
-->
**Description of problem:**
<!--
Explain what the issue is, and how things should look/behave. If possible provide a screenshot with a description.
Explain what the issue is, and what is the current behaviour. If possible provide a screenshot with a description.
-->
**Expected behaviour:**
<!--
Explain how things should look/behave. If possible provide a screenshot with a description.
-->
**Relevant config:**
<!--
Give the config of both the integration that is used, the Lovelace config, scene, automation or otherwise relevant configuration.
-->
**Steps to reproduce this problem:**
<!--
Sum up all steps that are necessary to reproduce this bug.
For example:
1. Add a climate integration
2. Navigate to Lovelace
3. Click more info of the climate entity
4. Set the hvac action to heat
5. Set the temperature higher than the current temperature
6. Set the hvac action to cool
-->
**Javascript errors shown in the web inspector (if applicable):**
```
```

View File

@@ -0,0 +1,19 @@
---
name: Feature request
about: Suggest an idea for this project
title: ""
labels: feature request
assignees: ""
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

27
.github/lock.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 1
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: 2020-01-01
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
exemptLabels: []
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: false
# Assign `resolved` as the reason for locking. Set to `false` to disable
setLockReason: false
# Limit to only `issues` or `pulls`
only: pulls
# Optionally, specify configuration settings just for `issues` or `pulls`
issues:
daysUntilLock: 30

3
.gitignore vendored
View File

@@ -25,6 +25,9 @@ dist
.vscode/*
!.vscode/extensions.json
# Cast dev settings
src/cast/dev_const.ts
# Secrets
.lokalise_token
yarn-error.log

View File

@@ -8,19 +8,11 @@ install: yarn install
script:
- npm run build
- hassio/script/build_hassio
# Because else eslint fails because hassio has cleaned that build
- ./node_modules/.bin/gulp gen-icons-app
- npm run test
# - xvfb-run wct --module-resolution=node --npm
# - 'if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct --module-resolution=node --npm --plugin sauce; fi'
services:
- docker
before_deploy:
- 'docker pull lokalise/lokalise-cli@sha256:2198814ebddfda56ee041a4b427521757dd57f75415ea9693696a64c550cef21'
deploy:
provider: script
script: script/travis_deploy
'on':
branch: master
dist: trusty
addons:
sauce_connect: true

View File

@@ -2,9 +2,9 @@
This is the repository for the official [Home Assistant](https://home-assistant.io) frontend.
[![Screenshot of the frontend](https://raw.githubusercontent.com/home-assistant/home-assistant-polymer/master/docs/screenshot.png)](https://home-assistant.io/demo/)
[![Screenshot of the frontend](https://raw.githubusercontent.com/home-assistant/home-assistant-polymer/master/docs/screenshot.png)](https://demo.home-assistant.io/)
- [View demo of the Polymer frontend](https://home-assistant.io/demo/)
- [View demo of Home Assistant](https://demo.home-assistant.io/)
- [More information about Home Assistant](https://home-assistant.io)
- [Frontend development instructions](https://developers.home-assistant.io/docs/en/frontend_index.html)
@@ -31,3 +31,5 @@ It is possible to compile the project and/or run commands in the development env
## License
Home Assistant is open-source and Apache 2 licensed. Feel free to browse the repository, learn and reuse parts in your own projects.
We use [BrowserStack](https://www.browserstack.com) to test Home Assistant on a large variation of devices.

View File

@@ -0,0 +1,64 @@
# https://dev.azure.com/home-assistant
trigger:
batch: true
tags:
include:
- "*"
pr: none
variables:
- name: versionWheels
value: '1.3-3.7-alpine3.10'
- name: versionNode
value: '12.1'
- group: twine
resources:
repositories:
- repository: azure
type: github
name: 'home-assistant/ci-azure'
endpoint: 'home-assistant'
stages:
- stage: "Validate"
jobs:
- template: templates/azp-job-version.yaml@azure
- stage: "Build"
jobs:
- job: "ReleasePython"
pool:
vmImage: "ubuntu-latest"
steps:
- task: UsePythonVersion@0
displayName: "Use Python 3.7"
inputs:
versionSpec: "3.7"
- task: NodeTool@0
displayName: "Use Node $(versionNode)"
inputs:
versionSpec: "$(versionNode)"
- script: pip install twine wheel
displayName: "Install tools"
- script: |
export TWINE_USERNAME="$(twineUser)"
export TWINE_PASSWORD="$(twinePassword)"
script/release
displayName: "Build and release package"
- template: templates/azp-job-wheels.yaml@azure
parameters:
builderVersion: '$(versionWheels)'
builderApk: 'build-base'
wheelsLocal: true
preBuild:
- task: NodeTool@0
displayName: "Use Node $(versionNode)"
inputs:
versionSpec: "$(versionNode)"
- script: |
set -e
yarn install
script/build_frontend

View File

@@ -0,0 +1,70 @@
# https://dev.azure.com/home-assistant
trigger:
batch: true
branches:
include:
- dev
paths:
include:
- translations/en.json
pr: none
schedules:
- cron: "30 0 * * *"
displayName: "translation update"
branches:
include:
- dev
always: true
variables:
- group: translation
resources:
repositories:
- repository: azure
type: github
name: 'home-assistant/ci-azure'
endpoint: 'home-assistant'
jobs:
- job: 'Upload'
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
displayName: 'Use Node 12.x'
inputs:
versionSpec: '12.x'
- script: |
export LOKALISE_TOKEN="$(lokaliseToken)"
export AZURE_BRANCH="$(Build.SourceBranchName)"
./script/translations_upload_base
displayName: 'Upload Translation'
- job: 'Download'
dependsOn:
- 'Upload'
condition: or(eq(variables['Build.Reason'], 'Schedule'), eq(variables['Build.Reason'], 'Manual'))
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
displayName: 'Use Node 12.x'
inputs:
versionSpec: '12.x'
- template: templates/azp-step-git-init.yaml@azure
- script: |
export LOKALISE_TOKEN="$(lokaliseToken)"
export AZURE_BRANCH="$(Build.SourceBranchName)"
npm install
./script/translations_download
displayName: 'Download Translation'
- script: |
git checkout dev
git add translation
git commit -am "[ci skip] Translation update"
git push
displayName: 'Update translation'

View File

@@ -33,6 +33,7 @@ module.exports.babelLoaderConfig = ({ latestBuild }) => {
pragma: "h",
},
],
"@babel/plugin-proposal-optional-chaining",
[
require("@babel/plugin-proposal-decorators").default,
{ decoratorsBeforeExport: true },

6
build-scripts/env.js Normal file
View File

@@ -0,0 +1,6 @@
module.exports = {
isProdBuild: process.env.NODE_ENV === "production",
isStatsBuild: process.env.STATS === "1",
isTravis: process.env.TRAVIS === "true",
isNetlify: process.env.NETLIFY === "true",
};

View File

@@ -1,10 +1,13 @@
// Run HA develop mode
const gulp = require("gulp");
const envVars = require("../env");
require("./clean.js");
require("./translations.js");
require("./gen-icons.js");
require("./gather-static.js");
require("./compress.js");
require("./webpack.js");
require("./service-worker.js");
require("./entry-html.js");
@@ -18,7 +21,7 @@ gulp.task(
"clean",
gulp.parallel(
"gen-service-worker-dev",
"gen-icons",
gulp.parallel("gen-icons-app", "gen-icons-mdi"),
"gen-pages-dev",
"gen-index-app-dev",
gulp.series("create-test-translation", "build-translations")
@@ -35,13 +38,11 @@ gulp.task(
process.env.NODE_ENV = "production";
},
"clean",
gulp.parallel("gen-icons", "build-translations"),
gulp.parallel("gen-icons-app", "gen-icons-mdi", "build-translations"),
"copy-static",
gulp.parallel(
"webpack-prod-app",
// Do not compress static files in CI, it's SLOW.
...(process.env.CI === "true" ? [] : ["compress-static"])
),
"webpack-prod-app",
...// Don't compress running tests
(envVars.isTravis ? [] : ["compress-app"]),
gulp.parallel(
"gen-pages-prod",
"gen-index-app-prod",

View File

@@ -0,0 +1,41 @@
const gulp = require("gulp");
require("./clean.js");
require("./translations.js");
require("./gen-icons.js");
require("./gather-static.js");
require("./webpack.js");
require("./service-worker.js");
require("./entry-html.js");
gulp.task(
"develop-cast",
gulp.series(
async function setEnv() {
process.env.NODE_ENV = "development";
},
"clean-cast",
gulp.parallel(
"gen-icons-app",
"gen-icons-mdi",
"gen-index-cast-dev",
"build-translations"
),
"copy-static-cast",
"webpack-dev-server-cast"
)
);
gulp.task(
"build-cast",
gulp.series(
async function setEnv() {
process.env.NODE_ENV = "production";
},
"clean-cast",
gulp.parallel("gen-icons-app", "gen-icons-mdi", "build-translations"),
"copy-static-cast",
"webpack-prod-cast",
"gen-index-cast-prod"
)
);

View File

@@ -1,6 +1,39 @@
const del = require("del");
const gulp = require("gulp");
const config = require("../paths");
require("./translations");
gulp.task("clean", () => del([config.root, config.build_dir]));
gulp.task("clean-demo", () => del([config.demo_root, config.build_dir]));
gulp.task(
"clean",
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
return del([config.root, config.build_dir]);
})
);
gulp.task(
"clean-demo",
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
return del([config.demo_root, config.build_dir]);
})
);
gulp.task(
"clean-cast",
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
return del([config.cast_root, config.build_dir]);
})
);
gulp.task(
"clean-hassio",
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
return del([config.hassio_root, config.build_dir]);
})
);
gulp.task(
"clean-gallery",
gulp.parallel("clean-translations", function cleanOutputAndBuildDir() {
return del([config.gallery_root, config.build_dir]);
})
);

View File

@@ -0,0 +1,38 @@
// Tasks to compress
const gulp = require("gulp");
const zopfli = require("gulp-zopfli-green");
const merge = require("merge-stream");
const path = require("path");
const paths = require("../paths");
gulp.task("compress-app", function compressApp() {
const jsLatest = gulp
.src(path.resolve(paths.output, "**/*.js"))
.pipe(zopfli())
.pipe(gulp.dest(paths.output));
const jsEs5 = gulp
.src(path.resolve(paths.output_es5, "**/*.js"))
.pipe(zopfli())
.pipe(gulp.dest(paths.output_es5));
const polyfills = gulp
.src(path.resolve(paths.static, "polyfills/*.js"))
.pipe(zopfli())
.pipe(gulp.dest(path.resolve(paths.static, "polyfills")));
const translations = gulp
.src(path.resolve(paths.static, "translations/*.json"))
.pipe(zopfli())
.pipe(gulp.dest(path.resolve(paths.static, "translations")));
return merge(jsLatest, jsEs5, polyfills, translations);
});
gulp.task("compress-hassio", function compressApp() {
return gulp
.src(path.resolve(paths.hassio_root, "**/*.js"))
.pipe(zopfli())
.pipe(gulp.dest(paths.hassio_root));
});

View File

@@ -1,4 +1,4 @@
// Run HA develop mode
// Run demo develop mode
const gulp = require("gulp");
require("./clean.js");
@@ -17,7 +17,8 @@ gulp.task(
},
"clean-demo",
gulp.parallel(
"gen-icons",
"gen-icons-app",
"gen-icons-mdi",
"gen-icons-demo",
"gen-index-demo-dev",
"build-translations"
@@ -34,7 +35,12 @@ gulp.task(
process.env.NODE_ENV = "production";
},
"clean-demo",
gulp.parallel("gen-icons", "gen-icons-demo", "build-translations"),
gulp.parallel(
"gen-icons-app",
"gen-icons-mdi",
"gen-icons-demo",
"build-translations"
),
"copy-static-demo",
"webpack-prod-demo",
"gen-index-demo-prod"

View File

@@ -0,0 +1,73 @@
const del = require("del");
const gulp = require("gulp");
const mapStream = require("map-stream");
const inDir = "translations";
const downloadDir = inDir + "/downloads";
const tasks = [];
function hasHtml(data) {
return /<[a-z][\s\S]*>/i.test(data);
}
function recursiveCheckHasHtml(file, data, errors, recKey) {
Object.keys(data).forEach(function(key) {
if (typeof data[key] === "object") {
const nextRecKey = recKey ? `${recKey}.${key}` : key;
recursiveCheckHasHtml(file, data[key], errors, nextRecKey);
} else if (hasHtml(data[key])) {
errors.push(`HTML found in ${file.path} at key ${recKey}.${key}`);
}
});
}
function checkHtml() {
const errors = [];
return mapStream(function(file, cb) {
const content = file.contents;
let error;
if (content) {
if (hasHtml(String(content))) {
const data = JSON.parse(String(content));
recursiveCheckHasHtml(file, data, errors);
if (errors.length > 0) {
error = errors.join("\r\n");
}
}
}
cb(error, file);
});
}
let taskName = "clean-downloaded-translations";
gulp.task(taskName, function() {
return del([`${downloadDir}/**`]);
});
tasks.push(taskName);
taskName = "check-translations-html";
gulp.task(taskName, function() {
return gulp.src(`${downloadDir}/*.json`).pipe(checkHtml());
});
tasks.push(taskName);
taskName = "move-downloaded-translations";
gulp.task(taskName, function() {
return gulp.src(`${downloadDir}/*.json`).pipe(gulp.dest(inDir));
});
tasks.push(taskName);
taskName = "check-downloaded-translations";
gulp.task(
taskName,
gulp.series(
"check-translations-html",
"move-downloaded-translations",
"clean-downloaded-translations"
)
);
tasks.push(taskName);
module.exports = tasks;

View File

@@ -11,9 +11,6 @@ const config = require("../paths.js");
const templatePath = (tpl) =>
path.resolve(config.polymer_dir, "src/html/", `${tpl}.html.template`);
const demoTemplatePath = (tpl) =>
path.resolve(config.demo_dir, "src/html/", `${tpl}.html.template`);
const readFile = (pth) => fs.readFileSync(pth).toString();
const renderTemplate = (pth, data = {}, pathFunc = templatePath) => {
@@ -22,7 +19,19 @@ const renderTemplate = (pth, data = {}, pathFunc = templatePath) => {
};
const renderDemoTemplate = (pth, data = {}) =>
renderTemplate(pth, data, demoTemplatePath);
renderTemplate(pth, data, (tpl) =>
path.resolve(config.demo_dir, "src/html/", `${tpl}.html.template`)
);
const renderCastTemplate = (pth, data = {}) =>
renderTemplate(pth, data, (tpl) =>
path.resolve(config.cast_dir, "src/html/", `${tpl}.html.template`)
);
const renderGalleryTemplate = (pth, data = {}) =>
renderTemplate(pth, data, (tpl) =>
path.resolve(config.gallery_dir, "src/html/", `${tpl}.html.template`)
);
const minifyHtml = (content) =>
minify(content, {
@@ -86,7 +95,7 @@ gulp.task("gen-index-app-dev", (done) => {
es5CoreJS: "/frontend_es5/core.js",
es5CustomPanelJS: "/frontend_es5/custom-panel.js",
es5HassIconsJS: "/frontend_es5/hass-icons.js",
});
}).replace(/#THEMEC/g, "{{ theme_color }}");
fs.outputFileSync(path.resolve(config.root, "index.html"), content);
done();
@@ -113,17 +122,64 @@ gulp.task("gen-index-app-prod", (done) => {
done();
});
gulp.task("gen-index-demo-dev", (done) => {
// In dev mode we don't mangle names, so we hardcode urls. That way we can
// run webpack as last in watch mode, which blocks output.
const content = renderDemoTemplate("index", {
latestDemoJS: "/frontend_latest/main.js",
es5Compatibility: "/frontend_es5/compatibility.js",
es5DemoJS: "/frontend_es5/main.js",
gulp.task("gen-index-cast-dev", (done) => {
const contentReceiver = renderCastTemplate("receiver", {
latestReceiverJS: "/frontend_latest/receiver.js",
});
fs.outputFileSync(
path.resolve(config.cast_root, "receiver.html"),
contentReceiver
);
fs.outputFileSync(path.resolve(config.demo_root, "index.html"), content);
const contentFAQ = renderCastTemplate("launcher-faq", {
latestLauncherJS: "/frontend_latest/launcher.js",
es5LauncherJS: "/frontend_es5/launcher.js",
});
fs.outputFileSync(path.resolve(config.cast_root, "faq.html"), contentFAQ);
const contentLauncher = renderCastTemplate("launcher", {
latestLauncherJS: "/frontend_latest/launcher.js",
es5LauncherJS: "/frontend_es5/launcher.js",
});
fs.outputFileSync(
path.resolve(config.cast_root, "index.html"),
contentLauncher
);
done();
});
gulp.task("gen-index-cast-prod", (done) => {
const latestManifest = require(path.resolve(
config.cast_output,
"manifest.json"
));
const es5Manifest = require(path.resolve(
config.cast_output_es5,
"manifest.json"
));
const contentReceiver = renderCastTemplate("receiver", {
latestReceiverJS: latestManifest["receiver.js"],
});
fs.outputFileSync(
path.resolve(config.cast_root, "receiver.html"),
contentReceiver
);
const contentFAQ = renderCastTemplate("launcher-faq", {
latestLauncherJS: latestManifest["launcher.js"],
es5LauncherJS: es5Manifest["launcher.js"],
});
fs.outputFileSync(path.resolve(config.cast_root, "faq.html"), contentFAQ);
const contentLauncher = renderCastTemplate("launcher", {
latestLauncherJS: latestManifest["launcher.js"],
es5LauncherJS: es5Manifest["launcher.js"],
});
fs.outputFileSync(
path.resolve(config.cast_root, "index.html"),
contentLauncher
);
done();
});
@@ -156,8 +212,33 @@ gulp.task("gen-index-demo-prod", (done) => {
es5Compatibility: es5Manifest["compatibility.js"],
es5DemoJS: es5Manifest["main.js"],
});
const minified = minifyHtml(content).replace(/#THEMEC/g, "{{ theme_color }}");
const minified = minifyHtml(content);
fs.outputFileSync(path.resolve(config.demo_root, "index.html"), minified);
done();
});
gulp.task("gen-index-gallery-dev", (done) => {
// In dev mode we don't mangle names, so we hardcode urls. That way we can
// run webpack as last in watch mode, which blocks output.
const content = renderGalleryTemplate("index", {
latestGalleryJS: "./entrypoint.js",
});
fs.outputFileSync(path.resolve(config.gallery_root, "index.html"), content);
done();
});
gulp.task("gen-index-gallery-prod", (done) => {
const latestManifest = require(path.resolve(
config.gallery_output,
"manifest.json"
));
const content = renderGalleryTemplate("index", {
latestGalleryJS: latestManifest["entrypoint.js"],
});
const minified = minifyHtml(content);
fs.outputFileSync(path.resolve(config.gallery_root, "index.html"), minified);
done();
});

View File

@@ -0,0 +1,38 @@
// Run demo develop mode
const gulp = require("gulp");
require("./clean.js");
require("./translations.js");
require("./gen-icons.js");
require("./gather-static.js");
require("./webpack.js");
require("./service-worker.js");
require("./entry-html.js");
gulp.task(
"develop-gallery",
gulp.series(
async function setEnv() {
process.env.NODE_ENV = "development";
},
"clean-gallery",
gulp.parallel("gen-icons-app", "gen-icons-app", "build-translations"),
"copy-static-gallery",
"gen-index-gallery-dev",
"webpack-dev-server-gallery"
)
);
gulp.task(
"build-gallery",
gulp.series(
async function setEnv() {
process.env.NODE_ENV = "production";
},
"clean-gallery",
gulp.parallel("gen-icons-app", "gen-icons-mdi", "build-translations"),
"copy-static-gallery",
"webpack-prod-gallery",
"gen-index-gallery-prod"
)
);

View File

@@ -2,9 +2,8 @@
const gulp = require("gulp");
const path = require("path");
const cpx = require("cpx");
const fs = require("fs-extra");
const zopfli = require("gulp-zopfli-green");
const merge = require("merge-stream");
const paths = require("../paths");
const npmPath = (...parts) =>
@@ -48,25 +47,22 @@ function copyPolyfills(staticDir) {
function copyFonts(staticDir) {
const staticPath = genStaticPath(staticDir);
// Local fonts
fs.copySync(npmPath("@polymer/font-roboto-local/fonts"), staticPath("fonts"));
cpx.copySync(
npmPath("roboto-fontface/fonts/roboto/*.woff2"),
staticPath("fonts/roboto")
);
}
function compressStatic(staticDir) {
function copyMapPanel(staticDir) {
const staticPath = genStaticPath(staticDir);
const fonts = gulp
.src(staticPath("fonts/**/*.ttf"))
.pipe(zopfli())
.pipe(gulp.dest(staticPath("fonts")));
const polyfills = gulp
.src(staticPath("polyfills/*.js"))
.pipe(zopfli())
.pipe(gulp.dest(staticPath("polyfills")));
const translations = gulp
.src(staticPath("translations/*.json"))
.pipe(zopfli())
.pipe(gulp.dest(staticPath("translations")));
return merge(fonts, polyfills, translations);
copyFileDir(
npmPath("leaflet/dist/leaflet.css"),
staticPath("images/leaflet/")
);
fs.copySync(
npmPath("leaflet/dist/images"),
staticPath("images/leaflet/images/")
);
}
gulp.task("copy-static", (done) => {
@@ -84,27 +80,46 @@ gulp.task("copy-static", (done) => {
npmPath("react-big-calendar/lib/css/react-big-calendar.css"),
staticPath("panels/calendar/")
);
copyFileDir(
npmPath("leaflet/dist/leaflet.css"),
staticPath("images/leaflet/")
);
fs.copySync(
npmPath("leaflet/dist/images"),
staticPath("images/leaflet/images/")
);
copyMapPanel(staticDir);
done();
});
gulp.task("compress-static", () => compressStatic(paths.static));
gulp.task("copy-static-demo", (done) => {
// Copy app static files
fs.copySync(polyPath("public"), paths.demo_root);
fs.copySync(
polyPath("public/static"),
path.resolve(paths.demo_root, "static")
);
// Copy demo static files
fs.copySync(path.resolve(paths.demo_dir, "public"), paths.demo_root);
copyPolyfills(paths.demo_static);
copyMapPanel(paths.demo_static);
copyFonts(paths.demo_static);
copyTranslations(paths.demo_static);
done();
});
gulp.task("copy-static-cast", (done) => {
// Copy app static files
fs.copySync(polyPath("public/static"), paths.cast_static);
// Copy cast static files
fs.copySync(path.resolve(paths.cast_dir, "public"), paths.cast_root);
copyMapPanel(paths.cast_static);
copyFonts(paths.cast_static);
copyTranslations(paths.cast_static);
done();
});
gulp.task("copy-static-gallery", (done) => {
// Copy app static files
fs.copySync(polyPath("public/static"), paths.gallery_static);
// Copy gallery static files
fs.copySync(path.resolve(paths.gallery_dir, "public"), paths.gallery_root);
copyMapPanel(paths.gallery_static);
copyFonts(paths.gallery_static);
copyTranslations(paths.gallery_static);
done();
});

View File

@@ -22,6 +22,7 @@ const BUILT_IN_PANEL_ICONS = [
"mailbox", // Mailbox
"tooltip-account", // Map
"cart", // Shopping List
"hammer", // developer-tools
];
// Given an icon name, load the SVG file
@@ -56,18 +57,6 @@ function generateIconset(iconsetName, iconNames) {
return `<ha-iconset-svg name="${iconsetName}" size="24"><svg><defs>${iconDefs}</defs></svg></ha-iconset-svg>`;
}
// Generate the full MDI iconset
function genMDIIcons() {
const meta = JSON.parse(
fs.readFileSync(path.resolve(ICON_PACKAGE_PATH, META_PATH), "UTF-8")
);
const iconNames = meta.map((iconInfo) => iconInfo.name);
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR);
}
fs.writeFileSync(MDI_OUTPUT_PATH, generateIconset("mdi", iconNames));
}
// Helper function to map recursively over files in a folder and it's subfolders
function mapFiles(startPath, filter, mapFunc) {
const files = fs.readdirSync(startPath);
@@ -100,24 +89,27 @@ function findIcons(searchPath, iconsetName) {
return icons;
}
function genHassIcons() {
gulp.task("gen-icons-mdi", (done) => {
const meta = JSON.parse(
fs.readFileSync(path.resolve(ICON_PACKAGE_PATH, META_PATH), "UTF-8")
);
const iconNames = meta.map((iconInfo) => iconInfo.name);
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR);
}
fs.writeFileSync(MDI_OUTPUT_PATH, generateIconset("mdi", iconNames));
done();
});
gulp.task("gen-icons-app", (done) => {
const iconNames = findIcons("./src", "hass");
BUILT_IN_PANEL_ICONS.forEach((name) => iconNames.add(name));
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR);
}
fs.writeFileSync(HASS_OUTPUT_PATH, generateIconset("hass", iconNames));
}
gulp.task("gen-icons-mdi", (done) => {
genMDIIcons();
done();
});
gulp.task("gen-icons-hass", (done) => {
genHassIcons();
done();
});
gulp.task("gen-icons", gulp.series("gen-icons-hass", "gen-icons-mdi"));
gulp.task("gen-icons-demo", (done) => {
const iconNames = findIcons(path.resolve(paths.demo_dir, "./src"), "hademo");
@@ -128,8 +120,21 @@ gulp.task("gen-icons-demo", (done) => {
done();
});
module.exports = {
findIcons,
generateIconset,
genMDIIcons,
};
gulp.task("gen-icons-hassio", (done) => {
const iconNames = findIcons(
path.resolve(paths.hassio_dir, "./src"),
"hassio"
);
// Find hassio icons inside HA main repo.
for (const item of findIcons(
path.resolve(paths.polymer_dir, "./src"),
"hassio"
)) {
iconNames.add(item);
}
fs.writeFileSync(
path.resolve(paths.hassio_dir, "hassio-icons.html"),
generateIconset("hassio", iconNames)
);
done();
});

View File

@@ -0,0 +1,34 @@
const gulp = require("gulp");
const envVars = require("../env");
require("./clean.js");
require("./gen-icons.js");
require("./webpack.js");
require("./compress.js");
gulp.task(
"develop-hassio",
gulp.series(
async function setEnv() {
process.env.NODE_ENV = "development";
},
"clean-hassio",
gulp.parallel("gen-icons-hassio", "gen-icons-mdi"),
"webpack-watch-hassio"
)
);
gulp.task(
"build-hassio",
gulp.series(
async function setEnv() {
process.env.NODE_ENV = "production";
},
"clean-hassio",
gulp.parallel("gen-icons-hassio", "gen-icons-mdi"),
"webpack-prod-hassio",
...// Don't compress running tests
(envVars.isTravis ? [] : ["compress-hassio"])
)
);

View File

@@ -15,6 +15,10 @@ gulp.task("gen-service-worker-dev", (done) => {
writeSW(
`
console.debug('Service worker disabled in development');
self.addEventListener('install', (event) => {
self.skipWaiting();
});
`
);
done();

View File

@@ -34,7 +34,9 @@ const TRANSLATION_FRAGMENTS = [
"profile",
"shopping-list",
"page-authorize",
"page-demo",
"page-onboarding",
"developer-tools",
];
const tasks = [];
@@ -43,11 +45,10 @@ function recursiveFlatten(prefix, data) {
let output = {};
Object.keys(data).forEach(function(key) {
if (typeof data[key] === "object") {
output = Object.assign(
{},
output,
recursiveFlatten(prefix + key + ".", data[key])
);
output = {
...output,
...recursiveFlatten(prefix + key + ".", data[key]),
};
} else {
output[prefix + key] = data[key];
}
@@ -97,18 +98,16 @@ function recursiveEmpty(data) {
* @link https://docs.lokalise.co/article/KO5SZWLLsy-key-referencing
*/
const re_key_reference = /\[%key:([^%]+)%\]/;
function lokalise_transform(data, original) {
function lokaliseTransform(data, original, file) {
const output = {};
Object.entries(data).forEach(([key, value]) => {
if (value instanceof Object) {
output[key] = lokalise_transform(value, original);
output[key] = lokaliseTransform(value, original, file);
} else {
output[key] = value.replace(re_key_reference, (match, key) => {
const replace = key.split("::").reduce((tr, k) => tr[k], original);
if (typeof replace !== "string") {
throw Error(
`Invalid key placeholder ${key} in src/translations/en.json`
);
throw Error(`Invalid key placeholder ${key} in ${file.path}`);
}
return replace;
});
@@ -123,18 +122,28 @@ gulp.task(taskName, function() {
});
tasks.push(taskName);
taskName = "create-test-metadata";
gulp.task(taskName, function(cb) {
fs.writeFile(
workDir + "/testMetadata.json",
JSON.stringify({
test: {
nativeName: "Test",
},
}),
cb
);
gulp.task("ensure-translations-build-dir", (done) => {
if (!fs.existsSync(workDir)) {
fs.mkdirSync(workDir);
}
done();
});
taskName = "create-test-metadata";
gulp.task(
taskName,
gulp.series("ensure-translations-build-dir", function writeTestMetaData(cb) {
fs.writeFile(
workDir + "/testMetadata.json",
JSON.stringify({
test: {
nativeName: "Test",
},
}),
cb
);
})
);
tasks.push(taskName);
taskName = "create-test-translation";
@@ -171,7 +180,7 @@ gulp.task(
.src("src/translations/en.json")
.pipe(
transform(function(data, file) {
return lokalise_transform(data, data);
return lokaliseTransform(data, data, file);
})
)
.pipe(rename("translationMaster.json"))
@@ -186,6 +195,11 @@ gulp.task(
gulp.series("build-master-translation", function() {
return gulp
.src([inDir + "/*.json", workDir + "/test.json"], { allowEmpty: true })
.pipe(
transform(function(data, file) {
return lokaliseTransform(data, data, file);
})
)
.pipe(
foreach(function(stream, file) {
// For each language generate a merged json file. It begins with the master
@@ -202,7 +216,7 @@ gulp.task(
const lang = subtags.slice(0, i).join("-");
if (lang === "test") {
src.push(workDir + "/test.json");
} else {
} else if (lang !== "en") {
src.push(inDir + "/" + lang + ".json");
}
}

View File

@@ -1,11 +1,39 @@
// Tasks to run webpack.
const gulp = require("gulp");
const path = require("path");
const webpack = require("webpack");
const WebpackDevServer = require("webpack-dev-server");
const log = require("fancy-log");
const paths = require("../paths");
const { createAppConfig, createDemoConfig } = require("../webpack");
const {
createAppConfig,
createDemoConfig,
createCastConfig,
createHassioConfig,
createGalleryConfig,
} = require("../webpack");
const bothBuilds = (createConfigFunc, params) => [
createConfigFunc({ ...params, latestBuild: true }),
createConfigFunc({ ...params, latestBuild: false }),
];
const runDevServer = ({
compiler,
contentBase,
port,
listenHost = "localhost",
}) =>
new WebpackDevServer(compiler, {
open: true,
watchContentBase: true,
contentBase,
}).listen(port, listenHost, function(err) {
if (err) {
throw err;
}
// Server listening
log("[webpack-dev-server]", `http://localhost:${port}`);
});
const handler = (done) => (err, stats) => {
if (err) {
@@ -28,20 +56,11 @@ const handler = (done) => (err, stats) => {
};
gulp.task("webpack-watch-app", () => {
const compiler = webpack([
createAppConfig({
isProdBuild: false,
latestBuild: true,
isStatsBuild: false,
}),
createAppConfig({
isProdBuild: false,
latestBuild: false,
isStatsBuild: false,
}),
]);
compiler.watch({}, handler());
// we are not calling done, so this command will run forever
webpack(bothBuilds(createAppConfig, { isProdBuild: false })).watch(
{},
handler()
);
});
gulp.task(
@@ -49,47 +68,17 @@ gulp.task(
() =>
new Promise((resolve) =>
webpack(
[
createAppConfig({
isProdBuild: true,
latestBuild: true,
isStatsBuild: false,
}),
createAppConfig({
isProdBuild: true,
latestBuild: false,
isStatsBuild: false,
}),
],
bothBuilds(createAppConfig, { isProdBuild: true }),
handler(resolve)
)
)
);
gulp.task("webpack-dev-server-demo", () => {
const compiler = webpack([
createDemoConfig({
isProdBuild: false,
latestBuild: false,
isStatsBuild: false,
}),
createDemoConfig({
isProdBuild: false,
latestBuild: true,
isStatsBuild: false,
}),
]);
new WebpackDevServer(compiler, {
open: true,
watchContentBase: true,
contentBase: path.resolve(paths.demo_dir, "dist"),
}).listen(8080, "localhost", function(err) {
if (err) {
throw err;
}
// Server listening
log("[webpack-dev-server]", "http://localhost:8080");
runDevServer({
compiler: webpack(bothBuilds(createDemoConfig, { isProdBuild: false })),
contentBase: paths.demo_root,
port: 8090,
});
});
@@ -98,18 +87,82 @@ gulp.task(
() =>
new Promise((resolve) =>
webpack(
[
createDemoConfig({
isProdBuild: true,
latestBuild: false,
isStatsBuild: false,
}),
createDemoConfig({
isProdBuild: true,
latestBuild: true,
isStatsBuild: false,
}),
],
bothBuilds(createDemoConfig, {
isProdBuild: true,
}),
handler(resolve)
)
)
);
gulp.task("webpack-dev-server-cast", () => {
runDevServer({
compiler: webpack(bothBuilds(createCastConfig, { isProdBuild: false })),
contentBase: paths.cast_root,
port: 8080,
// Accessible from the network, because that's how Cast hits it.
listenHost: "0.0.0.0",
});
});
gulp.task(
"webpack-prod-cast",
() =>
new Promise((resolve) =>
webpack(
bothBuilds(createCastConfig, {
isProdBuild: true,
}),
handler(resolve)
)
)
);
gulp.task("webpack-watch-hassio", () => {
// we are not calling done, so this command will run forever
webpack(
createHassioConfig({
isProdBuild: false,
latestBuild: false,
})
).watch({}, handler());
});
gulp.task(
"webpack-prod-hassio",
() =>
new Promise((resolve) =>
webpack(
createHassioConfig({
isProdBuild: true,
latestBuild: false,
}),
handler(resolve)
)
)
);
gulp.task("webpack-dev-server-gallery", () => {
runDevServer({
compiler: webpack(
createGalleryConfig({ latestBuild: true, isProdBuild: false })
),
contentBase: paths.gallery_root,
port: 8100,
});
});
gulp.task(
"webpack-prod-gallery",
() =>
new Promise((resolve) =>
webpack(
createGalleryConfig({
isProdBuild: true,
latestBuild: true,
}),
handler(resolve)
)
)

View File

@@ -14,4 +14,19 @@ module.exports = {
demo_static: path.resolve(__dirname, "../demo/dist/static"),
demo_output: path.resolve(__dirname, "../demo/dist/frontend_latest"),
demo_output_es5: path.resolve(__dirname, "../demo/dist/frontend_es5"),
cast_dir: path.resolve(__dirname, "../cast"),
cast_root: path.resolve(__dirname, "../cast/dist"),
cast_static: path.resolve(__dirname, "../cast/dist/static"),
cast_output: path.resolve(__dirname, "../cast/dist/frontend_latest"),
cast_output_es5: path.resolve(__dirname, "../cast/dist/frontend_es5"),
gallery_dir: path.resolve(__dirname, "../gallery"),
gallery_root: path.resolve(__dirname, "../gallery/dist"),
gallery_output: path.resolve(__dirname, "../gallery/dist/frontend_latest"),
gallery_static: path.resolve(__dirname, "../gallery/dist/static"),
hassio_dir: path.resolve(__dirname, "../hassio"),
hassio_root: path.resolve(__dirname, "../hassio/build"),
hassio_publicPath: "/api/hassio/app/",
};

View File

@@ -3,8 +3,6 @@ const fs = require("fs");
const path = require("path");
const TerserPlugin = require("terser-webpack-plugin");
const WorkboxPlugin = require("workbox-webpack-plugin");
const CompressionPlugin = require("compression-webpack-plugin");
const zopfli = require("@gfx/zopfli");
const ManifestPlugin = require("webpack-manifest-plugin");
const paths = require("./paths.js");
const { babelLoaderConfig } = require("./babel.js");
@@ -17,206 +15,246 @@ if (!version) {
}
version = version[0];
const genMode = (isProdBuild) => (isProdBuild ? "production" : "development");
const genDevTool = (isProdBuild) =>
isProdBuild ? "cheap-source-map" : "inline-cheap-module-source-map";
const genFilename = (isProdBuild, dontHash = new Set()) => ({ chunk }) => {
if (!isProdBuild || dontHash.has(chunk.name)) {
return `${chunk.name}.js`;
}
return `${chunk.name}.${chunk.hash.substr(0, 8)}.js`;
};
const genChunkFilename = (isProdBuild, isStatsBuild) =>
isProdBuild && !isStatsBuild ? "chunk.[chunkhash].js" : "[name].chunk.js";
const resolve = {
extensions: [".ts", ".js", ".json", ".tsx"],
alias: {
react: "preact-compat",
"react-dom": "preact-compat",
// Not necessary unless you consume a module using `createClass`
"create-react-class": "preact-compat/lib/create-react-class",
// Not necessary unless you consume a module requiring `react-dom-factories`
"react-dom-factories": "preact-compat/lib/react-dom-factories",
},
};
const cssLoader = {
test: /\.css$/,
use: "raw-loader",
};
const htmlLoader = {
test: /\.(html)$/,
use: {
loader: "html-loader",
options: {
exportAsEs6Default: true,
},
},
};
const plugins = [
// Ignore moment.js locales
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
// Color.js is bloated, it contains all color definitions for all material color sets.
new webpack.NormalModuleReplacementPlugin(
/@polymer\/paper-styles\/color\.js$/,
path.resolve(paths.polymer_dir, "src/util/empty.js")
),
// Ignore roboto pointing at CDN. We use local font-roboto-local.
new webpack.NormalModuleReplacementPlugin(
/@polymer\/font-roboto\/roboto\.js$/,
path.resolve(paths.polymer_dir, "src/util/empty.js")
),
// Ignore mwc icons pointing at CDN.
new webpack.NormalModuleReplacementPlugin(
/@material\/mwc-icon\/mwc-icon-font\.js$/,
path.resolve(paths.polymer_dir, "src/util/empty.js")
),
];
const optimization = (latestBuild) => ({
minimizer: [
new TerserPlugin({
cache: true,
parallel: true,
extractComments: true,
terserOptions: {
safari10: true,
ecma: latestBuild ? undefined : 5,
},
}),
],
});
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
const isCI = process.env.CI === "true";
// Create an object mapping browser urls to their paths during build
const translationMetadata = require("../build-translations/translationMetadata.json");
const workBoxTranslationsTemplatedURLs = {};
const englishFP = translationMetadata["translations"]["en"]["fingerprints"];
Object.keys(englishFP).forEach((key) => {
workBoxTranslationsTemplatedURLs[
`/static/translations/${englishFP[key]}`
] = `build-translations/output/${key}.json`;
});
const entry = {
app: "./src/entrypoints/app.ts",
authorize: "./src/entrypoints/authorize.ts",
onboarding: "./src/entrypoints/onboarding.ts",
core: "./src/entrypoints/core.ts",
compatibility: "./src/entrypoints/compatibility.ts",
"custom-panel": "./src/entrypoints/custom-panel.ts",
"hass-icons": "./src/entrypoints/hass-icons.ts",
};
const createWebpackConfig = ({
entry,
outputRoot,
defineOverlay,
isProdBuild,
latestBuild,
isStatsBuild,
}) => {
return {
mode: genMode(isProdBuild),
devtool: genDevTool(isProdBuild),
mode: isProdBuild ? "production" : "development",
devtool: isProdBuild ? "source-map" : "inline-cheap-module-source-map",
entry,
module: {
rules: [babelLoaderConfig({ latestBuild }), cssLoader, htmlLoader],
rules: [
babelLoaderConfig({ latestBuild }),
{
test: /\.css$/,
use: "raw-loader",
},
{
test: /\.(html)$/,
use: {
loader: "html-loader",
options: {
exportAsEs6Default: true,
},
},
},
],
},
optimization: optimization(latestBuild),
plugins: [
new ManifestPlugin(),
new webpack.DefinePlugin({
__DEV__: JSON.stringify(!isProdBuild),
__DEMO__: false,
__BUILD__: JSON.stringify(latestBuild ? "latest" : "es5"),
__VERSION__: JSON.stringify(version),
__STATIC_PATH__: "/static/",
"process.env.NODE_ENV": JSON.stringify(
isProdBuild ? "production" : "development"
),
}),
...plugins,
isProdBuild &&
!isCI &&
!isStatsBuild &&
new CompressionPlugin({
optimization: {
minimizer: [
new TerserPlugin({
cache: true,
exclude: [/\.js\.map$/, /\.LICENSE$/, /\.py$/, /\.txt$/],
algorithm(input, compressionOptions, callback) {
return zopfli.gzip(input, compressionOptions, callback);
parallel: true,
extractComments: true,
sourceMap: true,
terserOptions: {
safari10: true,
ecma: latestBuild ? undefined : 5,
},
}),
latestBuild &&
new WorkboxPlugin.InjectManifest({
swSrc: "./src/entrypoints/service-worker-hass.js",
swDest: "service_worker.js",
importWorkboxFrom: "local",
include: [/\.js$/],
templatedURLs: {
...workBoxTranslationsTemplatedURLs,
"/static/icons/favicon-192x192.png":
"public/icons/favicon-192x192.png",
"/static/fonts/roboto/Roboto-Light.ttf":
"node_modules/@polymer/font-roboto-local/fonts/roboto/Roboto-Light.ttf",
"/static/fonts/roboto/Roboto-Medium.ttf":
"node_modules/@polymer/font-roboto-local/fonts/roboto/Roboto-Medium.ttf",
"/static/fonts/roboto/Roboto-Regular.ttf":
"node_modules/@polymer/font-roboto-local/fonts/roboto/Roboto-Regular.ttf",
"/static/fonts/roboto/Roboto-Bold.ttf":
"node_modules/@polymer/font-roboto-local/fonts/roboto/Roboto-Bold.ttf",
},
}),
].filter(Boolean),
output: {
filename: genFilename(isProdBuild),
chunkFilename: genChunkFilename(isProdBuild, isStatsBuild),
path: latestBuild ? paths.output : paths.output_es5,
publicPath: latestBuild ? "/frontend_latest/" : "/frontend_es5/",
],
},
resolve,
};
};
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
return {
mode: genMode(isProdBuild),
devtool: genDevTool(isProdBuild),
entry: {
main: "./demo/src/entrypoint.ts",
compatibility: "./src/entrypoints/compatibility.ts",
},
module: {
rules: [babelLoaderConfig({ latestBuild }), cssLoader, htmlLoader],
},
optimization: optimization(latestBuild),
plugins: [
new ManifestPlugin(),
new webpack.DefinePlugin({
__DEV__: !isProdBuild,
__BUILD__: JSON.stringify(latestBuild ? "latest" : "es5"),
__VERSION__: JSON.stringify("DEMO"),
__DEMO__: true,
__VERSION__: JSON.stringify(version),
__DEMO__: false,
__STATIC_PATH__: "/static/",
"process.env.NODE_ENV": JSON.stringify(
isProdBuild ? "production" : "development"
),
...defineOverlay,
}),
...plugins,
// Ignore moment.js locales
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
// Color.js is bloated, it contains all color definitions for all material color sets.
new webpack.NormalModuleReplacementPlugin(
/@polymer\/paper-styles\/color\.js$/,
path.resolve(paths.polymer_dir, "src/util/empty.js")
),
// Ignore roboto pointing at CDN. We use local font-roboto-local.
new webpack.NormalModuleReplacementPlugin(
/@polymer\/font-roboto\/roboto\.js$/,
path.resolve(paths.polymer_dir, "src/util/empty.js")
),
// Ignore mwc icons pointing at CDN.
new webpack.NormalModuleReplacementPlugin(
/@material\/mwc-icon\/mwc-icon-font\.js$/,
path.resolve(paths.polymer_dir, "src/util/empty.js")
),
].filter(Boolean),
resolve,
resolve: {
extensions: [".ts", ".js", ".json"],
alias: {
react: "preact-compat",
"react-dom": "preact-compat",
// Not necessary unless you consume a module using `createClass`
"create-react-class": "preact-compat/lib/create-react-class",
// Not necessary unless you consume a module requiring `react-dom-factories`
"react-dom-factories": "preact-compat/lib/react-dom-factories",
},
},
output: {
filename: genFilename(isProdBuild),
chunkFilename: genChunkFilename(isProdBuild, isStatsBuild),
filename: ({ chunk }) => {
const dontHash = new Set();
if (!isProdBuild || dontHash.has(chunk.name)) {
return `${chunk.name}.js`;
}
return `${chunk.name}.${chunk.hash.substr(0, 8)}.js`;
},
chunkFilename:
isProdBuild && !isStatsBuild
? "chunk.[chunkhash].js"
: "[name].chunk.js",
path: path.resolve(
paths.demo_root,
outputRoot,
latestBuild ? "frontend_latest" : "frontend_es5"
),
publicPath: latestBuild ? "/frontend_latest/" : "/frontend_es5/",
// For workerize loader
globalObject: "self",
},
};
};
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
const config = createWebpackConfig({
entry: {
app: "./src/entrypoints/app.ts",
authorize: "./src/entrypoints/authorize.ts",
onboarding: "./src/entrypoints/onboarding.ts",
core: "./src/entrypoints/core.ts",
compatibility: "./src/entrypoints/compatibility.ts",
"custom-panel": "./src/entrypoints/custom-panel.ts",
"hass-icons": "./src/entrypoints/hass-icons.ts",
},
outputRoot: paths.root,
isProdBuild,
latestBuild,
isStatsBuild,
});
if (latestBuild) {
// Create an object mapping browser urls to their paths during build
const translationMetadata = require("../build-translations/translationMetadata.json");
const workBoxTranslationsTemplatedURLs = {};
const englishFP = translationMetadata.translations.en.fingerprints;
Object.keys(englishFP).forEach((key) => {
workBoxTranslationsTemplatedURLs[
`/static/translations/${englishFP[key]}`
] = `build-translations/output/${key}.json`;
});
config.plugins.push(
new WorkboxPlugin.InjectManifest({
swSrc: "./src/entrypoints/service-worker-hass.js",
swDest: "service_worker.js",
importWorkboxFrom: "local",
include: [/\.js$/],
templatedURLs: {
...workBoxTranslationsTemplatedURLs,
"/static/icons/favicon-192x192.png":
"public/icons/favicon-192x192.png",
"/static/fonts/roboto/Roboto-Light.woff2":
"node_modules/roboto-fontface/fonts/roboto/Roboto-Light.woff2",
"/static/fonts/roboto/Roboto-Medium.woff2":
"node_modules/roboto-fontface/fonts/roboto/Roboto-Medium.woff2",
"/static/fonts/roboto/Roboto-Regular.woff2":
"node_modules/roboto-fontface/fonts/roboto/Roboto-Regular.woff2",
"/static/fonts/roboto/Roboto-Bold.woff2":
"node_modules/roboto-fontface/fonts/roboto/Roboto-Bold.woff2",
},
})
);
}
return config;
};
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
return createWebpackConfig({
entry: {
main: path.resolve(paths.demo_dir, "src/entrypoint.ts"),
compatibility: path.resolve(
paths.polymer_dir,
"src/entrypoints/compatibility.ts"
),
},
outputRoot: paths.demo_root,
defineOverlay: {
__VERSION__: JSON.stringify(`DEMO-${version}`),
__DEMO__: true,
},
isProdBuild,
latestBuild,
isStatsBuild,
});
};
const createCastConfig = ({ isProdBuild, latestBuild }) => {
const entry = {
launcher: path.resolve(paths.cast_dir, "src/launcher/entrypoint.ts"),
};
if (latestBuild) {
entry.receiver = path.resolve(paths.cast_dir, "src/receiver/entrypoint.ts");
}
return createWebpackConfig({
entry,
outputRoot: paths.cast_root,
isProdBuild,
latestBuild,
});
};
const createHassioConfig = ({ isProdBuild, latestBuild }) => {
if (latestBuild) {
throw new Error("Hass.io does not support latest build!");
}
const config = createWebpackConfig({
entry: {
entrypoint: path.resolve(paths.hassio_dir, "src/entrypoint.js"),
},
outputRoot: "",
isProdBuild,
latestBuild,
});
config.output.path = paths.hassio_root;
config.output.publicPath = paths.hassio_publicPath;
return config;
};
const createGalleryConfig = ({ isProdBuild, latestBuild }) => {
if (!latestBuild) {
throw new Error("Gallery only supports latest build!");
}
const config = createWebpackConfig({
entry: {
entrypoint: path.resolve(paths.gallery_dir, "src/entrypoint.js"),
},
outputRoot: paths.gallery_root,
isProdBuild,
latestBuild,
});
return config;
};
module.exports = {
resolve,
plugins,
optimization,
createAppConfig,
createDemoConfig,
createCastConfig,
createHassioConfig,
createGalleryConfig,
};

56
cast/README.md Normal file
View File

@@ -0,0 +1,56 @@
# Home Assistant Cast
Home Assistant Cast is made up of two separate applications:
- Chromecast receiver application that can connect to Home Assistant and display relevant information.
- Launcher website that allows users to authorize with their Home Assistant installation and launch the receiver app on their Chromecast.
## Development
- Run `script/develop_cast` to launch the Cast receiver dev server. Keep this running.
- Navigate to http://localhost:8080 to start the launcher
- Debug the receiver running on the Chromecast via [chrome://inspect/#devices](chrome://inspect/#devices)
## Setting up development environment
### Registering development cast app
- Go to https://cast.google.com/publish and enroll your account for the Google Cast SDK (costs \$5)
- Register your Chromecast as a testing device by entering the serial
- Add new application -> Custom Receiver
- Name: Home Assistant Dev
- Receiver Application URL: http://IP-OF-DEV-MACHINE:8080/receiver.html
- Guest Mode: off
- Google Case for Audio: off
### Setting dev variables
Open `src/cast/dev_const.ts` and change `CAST_DEV_APP_ID` to the ID of the app you just created. And set the `CAST_DEV_HASS_URL` to the url of you development machine.
### Changing configuration
In `configuration.yaml`, configure CORS for the HTTP integration:
```yaml
http:
cors_allowed_origins:
- https://cast.home-assistant.io
- http://IP-OF-DEV-MACHINE:8080
```
## Running development
```bash
cd cast
script/develop_cast
```
The launcher application will be accessible at [http://localhost:8080](http://localhost:8080) and the receiver application will be accessible at [http://localhost:8080/receiver.html](http://localhost:8080/receiver.html) (but only works if accessed by a Chromecast).
### Developing cast widgets in HA ui
If your work involves interaction with the Cast parts from the normal Home Assistant UI, you will need to have that development script running too (`script/develop`).
### Developing the cast demo
The cast demo is triggered from the Home Assistant demo. To work on that, you will also need to run the development script for the demo (`script/develop_demo`).

20
cast/public/_headers Normal file
View File

@@ -0,0 +1,20 @@
/*
Cache-Control: public, max-age: 0, s-maxage=3600, must-revalidate
Content-Security-Policy: form-action https:
Feature-Policy: vibrate 'none'; geolocation 'none'; midi 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; vibrate 'none'; payment 'none'
Referrer-Policy: no-referrer-when-downgrade
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
/images/*
Cache-Control: public, max-age: 604800, s-maxage=604800
/manifest.json
Cache-Control: public, max-age: 3600, s-maxage=3600
/frontend_es5/*
Cache-Control: public, max-age: 604800, s-maxage=604800
/frontend_latest/*
Cache-Control: public, max-age: 604800, s-maxage=604800

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

18
cast/public/manifest.json Normal file
View File

@@ -0,0 +1,18 @@
{
"background_color": "#FFFFFF",
"description": "Show Home Assistant on your Chromecast or Google Assistant devices with a screen.",
"dir": "ltr",
"display": "standalone",
"icons": [
{
"src": "/images/ha-cast-icon.png",
"sizes": "512x512",
"type": "image/png"
}
],
"lang": "en-US",
"name": "Home Assistant Cast",
"short_name": "HA Cast",
"start_url": "/?homescreen=1",
"theme_color": "#03A9F4"
}

View File

@@ -0,0 +1,3 @@
self.addEventListener("fetch", function(event) {
event.respondWith(fetch(event.request));
});

9
cast/script/build_cast Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
# Build the cast receiver
# Stop on errors
set -e
cd "$(dirname "$0")/../.."
./node_modules/.bin/gulp build-cast

9
cast/script/develop_cast Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/sh
# Develop the cast receiver
# Stop on errors
set -e
cd "$(dirname "$0")/../.."
./node_modules/.bin/gulp develop-cast

5
cast/script/upload Executable file
View File

@@ -0,0 +1,5 @@
# Run it twice, second time we just delete.
aws s3 sync dist s3://cast.home-assistant.io --acl public-read
# Don't delete as it might break open sites that need to load code splitted things.
# aws s3 sync dist s3://cast.home-assistant.io --acl public-read --delete
# Todo : update JS first, HTML last.

View File

@@ -0,0 +1,261 @@
<!DOCTYPE html>
<html>
<head>
<title>Home Assistant Cast - FAQ</title>
<link rel="icon" href="/images/ha-cast-icon.png" type="image/png" />
<%= renderTemplate('_style_base') %>
<style>
body {
background-color: #e5e5e5;
}
</style>
<meta property="fb:app_id" content="338291289691179" />
<meta property="og:title" content="FAQ - Home Assistant Cast" />
<meta property="og:site_name" content="Home Assistant Cast" />
<meta property="og:url" content="https://cast.home-assistant.io/" />
<meta property="og:type" content="website" />
<meta
property="og:description"
content="Frequently asked questions about Home Assistant Cast."
/>
<meta
property="og:image"
content="https://cast.home-assistant.io/images/google-nest-hub.png"
/>
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@home_assistant" />
<meta name="twitter:title" content="FAQ - Home Assistant Cast" />
<meta
name="twitter:description"
content="Frequently asked questions about Home Assistant Cast."
/>
<meta
name="twitter:image"
content="https://cast.home-assistant.io/images/google-nest-hub.png"
/>
</head>
<body>
<%= renderTemplate('_js_base') %>
<script type="module" crossorigin="use-credentials">
import "<%= latestLauncherJS %>";
</script>
<script nomodule>
(function() {
// // Safari 10.1 supports type=module but ignores nomodule, so we add this check.
if (!isS101) {
_ls("/static/polyfills/custom-elements-es5-adapter.js");
_ls("<%= es5LauncherJS %>");
}
})();
</script>
<hc-layout subtitle="FAQ">
<style>
a {
color: var(--primary-color);
}
</style>
<div class="card-content">
<p><a href="/">&laquo; Back to Home Assistant Cast</a></p>
</div>
<div class="section-header">What is Home Assistant Cast?</div>
<div class="card-content">
<p>
Home Assistant Cast allows you to show your Home Assistant data on a
Chromecast device and allows you to interact with Home Assistant on
Google Assistant devices with a screen.
</p>
</div>
<div class="section-header">
What are the Home Assistant Cast requirements?
</div>
<div class="card-content">
<p>
Home Assistant Cast requires a Home Assistant installation that is
accessible via HTTPS (the url starts with "https://").
</p>
</div>
<div class="section-header">What is Home Assistant?</div>
<div class="card-content">
<p>
Home Assistant is worlds biggest open source home automation platform
with a focus on privacy and local control. You can install Home
Assistant for free.
</p>
<p>
<a href="https://www.home-assistant.io" target="_blank"
>Visit the Home Assistant website.</a
>
</p>
</div>
<div class="section-header" id="https">
Why does my Home Assistant needs to be served using HTTPS?
</div>
<div class="card-content">
<p>
The Chromecast only works with websites served over HTTPS. This means
that the Home Assistant Cast app that runs on your Chromecast is
served over HTTPS. Websites served over HTTPS are restricted on what
content can be accessed on websites served over HTTP. This is called
mixed active content (<a
href="https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content#Mixed_active_content"
target="_blank"
>learn more @ MDN</a
>).
</p>
<p>
The easiest way to get your Home Assistant installation served over
HTTPS is by signing up for
<a href="https://www.nabucasa.com" target="_blank"
>Home Assistant Cloud by Nabu Casa</a
>.
</p>
</div>
<div class="section-header" id="https">
Why does Home Assistant Cast require me to authorize my Home Assistant
instance?
</div>
<div class="card-content">
<p>
You're currently looking at the Home Assistant Cast launcher
application. This is a standalone application to launch Home Assistant
Cast on your Chromecast. Because Chromecasts do not allow us to log in
to Home Assistant, we need to supply authentication to it from the
launcher. This authentication is obtained when you authorize your
instance. Your authentication credentials will remain in your browser
and on your Cast device.
</p>
<p>
Your authentication credentials or Home Assistant url are never sent
to the Cloud. You can validate this behavior in
<a
href="https://github.com/home-assistant/home-assistant-polymer/tree/dev/cast"
target="_blank"
>the source code</a
>.
</p>
<p>
The launcher application exists to make it possible to use Home
Assistant Cast with older versions of Home Assistant.
</p>
<p>
Starting with Home Assistant 0.97, Home Assistant Cast is also built
into the Lovelace UI as a special entities card row. Since the
Lovelace UI already has authentication, you will be able to start
casting right away.
</p>
</div>
<div class="section-header">Wat does Home Assistant Cast do?</div>
<div class="card-content">
<p>
Home Assistant Cast is a receiver application for the Chromecast. When
loaded, it will make a direct connection to your Home Assistant
instance.
</p>
<p>
Home Assistant Cast is able to render any of your Lovelace views on
your Chromecast. Things that work in Lovelace in Home Assistant will
work in Home Assistant Cast:
</p>
<ul>
<li>Render Lovelace views, including custom cards</li>
<li>
Real-time data stream will ensure the UI always shows the latest
state of your house
</li>
<li>Navigate between views using navigate actions or weblinks</li>
<li>
Instant updates of the casted Lovelace UI when you update your
Lovelace configuration.
</li>
</ul>
<p>Things that currently do not work:</p>
<ul>
<li>
Live videostreams using the streaming integration
</li>
<li>Specifying a view with a single card with "panel: true".</li>
</ul>
</div>
<div class="section-header" id="https">
How do I change what is shown on my Chromecast?
</div>
<div class="card-content">
<p>
Home Assistant Cast allows you to show your Lovelace view on your
Chromecast. So to edit what is shown, you need to edit your Lovelace
UI.
</p>
<p>
To edit your Lovelace UI, open Home Assistant, click on the three-dot
menu in the top right and click on "Configure UI".
</p>
</div>
<div class="section-header" id="browser">
What browsers are supported?
</div>
<div class="card-content">
<p>
Chromecast is a technology developed by Google, and is available on:
</p>
<ul>
<li>Google Chrome (all platforms except on iOS)</li>
<li>
Microsoft Edge (all platforms,
<a href="https://www.microsoftedgeinsider.com" target="_blank"
>dev and canary builds only</a
>)
</li>
</ul>
</div>
<div class="section-header">Why do some custom cards not work?</div>
<div class="card-content">
<p>
Home Assistant needs to be configured to allow Home Assistant Cast to
load custom cards. Starting with Home Assistant 0.97, this is done
automatically. If you are on an older version, or have manually
configured CORS for the HTTP integration, add the following to your
configuration.yaml file:
</p>
<pre>
http:
cors_allowed_origins:
- https://cast.home-assistant.io</pre
>
<p>
Some custom cards rely on things that are only available in the normal
Home Assistant interface. This requires an update by the custom card
developer.
</p>
<p>
If you're a custom card developer: the most common mistake is that
LitElement is extracted from an element that is not available on the
page.
</p>
</div>
</hc-layout>
<script>
var _gaq = [["_setAccount", "UA-57927901-9"], ["_trackPageview"]];
(function(d, t) {
var g = d.createElement(t),
s = d.getElementsByTagName(t)[0];
g.src =
("https:" == location.protocol ? "//ssl" : "//www") +
".google-analytics.com/ga.js";
s.parentNode.insertBefore(g, s);
})(document, "script");
</script>
</body>
</html>

View File

@@ -0,0 +1,54 @@
<!DOCTYPE html>
<html>
<head>
<title>Home Assistant Cast</title>
<link rel="manifest" href="/manifest.json" />
<link rel="icon" href="/images/ha-cast-icon.png" type="image/png" />
<%= renderTemplate('_style_base') %>
<style>
body {
background-color: #e5e5e5;
}
</style>
<meta property="fb:app_id" content="338291289691179">
<meta property="og:title" content="Home Assistant Cast">
<meta property="og:site_name" content="Home Assistant Cast">
<meta property="og:url" content="https://cast.home-assistant.io/">
<meta property="og:type" content="website">
<meta property="og:description" content="Show Home Assistant on your Chromecast or Google Assistant devices with a screen.">
<meta property="og:image" content="https://cast.home-assistant.io/images/google-nest-hub.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@home_assistant">
<meta name="twitter:title" content="Home Assistant Cast">
<meta name="twitter:description" content="Show Home Assistant on your Chromecast or Google Assistant devices with a screen.">
<meta name="twitter:image" content="https://cast.home-assistant.io/images/google-nest-hub.png">
</head>
<body>
<%= renderTemplate('_js_base') %>
<hc-connect></hc-connect>
<script type="module" crossorigin="use-credentials">
import "<%= latestLauncherJS %>";
</script>
<script nomodule>
(function() {
// // Safari 10.1 supports type=module but ignores nomodule, so we add this check.
if (!isS101) {
_ls("/static/polyfills/custom-elements-es5-adapter.js");
_ls("<%= es5LauncherJS %>");
}
})();
</script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-57927901-9', 'auto');
ga('send', 'pageview', location.pathname.includes("auth_callback") === -1 ? location.pathname : "/");
</script>
</body>
</html>

View File

@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<script src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script type="module" src="<%= latestReceiverJS %>"></script>
<%= renderTemplate('_style_base') %>
<style>
body {
background-color: white;
font-size: initial;
}
</style>
<script>
var _gaq=[['_setAccount','UA-57927901-10'],['_trackPageview']];
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
s.parentNode.insertBefore(g,s)}(document,'script'));
</script>
</html>

View File

@@ -0,0 +1,5 @@
import "../../../src/resources/ha-style";
import "../../../src/resources/roboto";
import "../../../src/components/ha-iconset-svg";
import "../../../src/resources/hass-icons";
import "./layout/hc-connect";

View File

@@ -0,0 +1,282 @@
import {
customElement,
LitElement,
property,
TemplateResult,
html,
CSSResult,
css,
} from "lit-element";
import { Connection, Auth } from "home-assistant-js-websocket";
import "@polymer/iron-icon";
import "@polymer/paper-listbox/paper-listbox";
import "@polymer/paper-item/paper-icon-item";
import "../../../../src/components/ha-icon";
import {
enableWrite,
askWrite,
saveTokens,
} from "../../../../src/common/auth/token_storage";
import {
ensureConnectedCastSession,
castSendShowLovelaceView,
} from "../../../../src/cast/receiver_messages";
import "../../../../src/layouts/loading-screen";
import { CastManager } from "../../../../src/cast/cast_manager";
import {
LovelaceConfig,
getLovelaceCollection,
} from "../../../../src/data/lovelace";
import "./hc-layout";
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
import { toggleAttribute } from "../../../../src/common/dom/toggle_attribute";
@customElement("hc-cast")
class HcCast extends LitElement {
@property() public auth!: Auth;
@property() public connection!: Connection;
@property() public castManager!: CastManager;
@property() private askWrite = false;
@property() private lovelaceConfig?: LovelaceConfig | null;
protected render(): TemplateResult | void {
if (this.lovelaceConfig === undefined) {
return html`
<loading-screen></loading-screen>>
`;
}
const error =
this.castManager.castState === "NO_DEVICES_AVAILABLE"
? html`
<p>
There were no suitable Chromecast devices to cast to found.
</p>
`
: undefined;
return html`
<hc-layout .auth=${this.auth} .connection=${this.connection}>
${this.askWrite
? html`
<p class="question action-item">
Stay logged in?
<span>
<mwc-button @click=${this._handleSaveTokens}>
YES
</mwc-button>
<mwc-button @click=${this._handleSkipSaveTokens}>
NO
</mwc-button>
</span>
</p>
`
: ""}
${error
? html`
<div class="card-content">${error}</div>
`
: !this.castManager.status
? html`
<p class="center-item">
<mwc-button raised @click=${this._handleLaunch}>
<iron-icon icon="hass:cast"></iron-icon>
Start Casting
</mwc-button>
</p>
`
: html`
<div class="section-header">PICK A VIEW</div>
<paper-listbox
attr-for-selected="data-path"
.selected=${this.castManager.status.lovelacePath || ""}
>
${(this.lovelaceConfig
? this.lovelaceConfig.views
: [generateDefaultViewConfig([], [], [], {}, () => "")]
).map(
(view, idx) => html`
<paper-icon-item
@click=${this._handlePickView}
data-path=${view.path || idx}
>
${view.icon
? html`
<ha-icon
.icon=${view.icon}
slot="item-icon"
></ha-icon>
`
: ""}
${view.title || view.path}
</paper-icon-item>
`
)}
</paper-listbox>
`}
<div class="card-actions">
${this.castManager.status
? html`
<mwc-button @click=${this._handleLaunch}>
<iron-icon icon="hass:cast-connected"></iron-icon>
Manage
</mwc-button>
`
: ""}
<div class="spacer"></div>
<mwc-button @click=${this._handleLogout}>Log out</mwc-button>
</div>
</hc-layout>
`;
}
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
const llColl = getLovelaceCollection(this.connection);
// We first do a single refresh because we need to check if there is LL
// configuration.
llColl.refresh().then(
() => {
llColl.subscribe((config) => {
this.lovelaceConfig = config;
});
},
async () => {
this.lovelaceConfig = null;
}
);
this.askWrite = askWrite();
this.castManager.addEventListener("state-changed", () => {
this.requestUpdate();
});
this.castManager.addEventListener("connection-changed", () => {
this.requestUpdate();
});
}
protected updated(changedProps) {
super.updated(changedProps);
toggleAttribute(
this,
"hide-icons",
this.lovelaceConfig
? !this.lovelaceConfig.views.some((view) => view.icon)
: true
);
}
private async _handleSkipSaveTokens() {
this.askWrite = false;
}
private async _handleSaveTokens() {
enableWrite();
this.askWrite = false;
}
private _handleLaunch() {
this.castManager.requestSession();
}
private async _handlePickView(ev: Event) {
const path = (ev.currentTarget as any).getAttribute("data-path");
await ensureConnectedCastSession(this.castManager!, this.auth!);
castSendShowLovelaceView(this.castManager, path);
}
private async _handleLogout() {
try {
await this.auth.revoke();
saveTokens(null);
if (this.castManager.castSession) {
this.castManager.castContext.endCurrentSession(true);
}
this.connection.close();
location.reload();
} catch (err) {
alert("Unable to log out!");
}
}
static get styles(): CSSResult {
return css`
.center-item {
display: flex;
justify-content: space-around;
}
.action-item {
display: flex;
align-items: center;
justify-content: space-between;
}
.question {
position: relative;
padding: 8px 16px;
}
.question:before {
border-radius: 4px;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
pointer-events: none;
content: "";
background-color: var(--primary-color);
opacity: 0.12;
will-change: opacity;
}
.connection,
.connection a {
color: var(--secondary-text-color);
}
mwc-button iron-icon {
margin-right: 8px;
height: 18px;
}
paper-listbox {
padding-top: 0;
}
paper-listbox ha-icon {
padding: 12px;
color: var(--secondary-text-color);
}
paper-icon-item {
cursor: pointer;
}
paper-icon-item[disabled] {
cursor: initial;
}
:host([hide-icons]) paper-icon-item {
--paper-item-icon-width: 0px;
}
.spacer {
flex: 1;
}
.card-content a {
color: var(--primary-color);
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"hc-cast": HcCast;
}
}

View File

@@ -0,0 +1,333 @@
import {
LitElement,
customElement,
property,
TemplateResult,
html,
CSSResult,
css,
} from "lit-element";
import {
getAuth,
createConnection,
Auth,
getAuthOptions,
ERR_HASS_HOST_REQUIRED,
ERR_INVALID_HTTPS_TO_HTTP,
Connection,
ERR_CANNOT_CONNECT,
ERR_INVALID_AUTH,
} from "home-assistant-js-websocket";
import "@polymer/iron-icon";
import "@material/mwc-button";
import "@polymer/paper-input/paper-input";
import {
loadTokens,
saveTokens,
} from "../../../../src/common/auth/token_storage";
import "../../../../src/layouts/loading-screen";
import { CastManager, getCastManager } from "../../../../src/cast/cast_manager";
import "./hc-layout";
import { castSendShowDemo } from "../../../../src/cast/receiver_messages";
import { registerServiceWorker } from "../../../../src/util/register-service-worker";
const seeFAQ = (qid) => html`
See <a href="./faq.html${qid ? `#${qid}` : ""}">the FAQ</a> for more
information.
`;
const translateErr = (err) =>
err === ERR_CANNOT_CONNECT
? "Unable to connect"
: err === ERR_HASS_HOST_REQUIRED
? "Please enter a Home Assistant URL."
: err === ERR_INVALID_HTTPS_TO_HTTP
? html`
Cannot connect to Home Assistant instances over "http://".
${seeFAQ("https")}
`
: `Unknown error (${err}).`;
const INTRO = html`
<p>
Home Assistant Cast allows you to cast your Home Assistant installation to
Chromecast video devices and to Google Assistant devices with a screen.
</p>
<p>
For more information, see the
<a href="./faq.html">frequently asked questions</a>.
</p>
`;
@customElement("hc-connect")
export class HcConnect extends LitElement {
@property() private loading = false;
// If we had stored credentials but we cannot connect,
// show a screen asking retry or logout.
@property() private cannotConnect = false;
@property() private error?: string | TemplateResult;
@property() private auth?: Auth;
@property() private connection?: Connection;
@property() private castManager?: CastManager | null;
private openDemo = false;
protected render(): TemplateResult | void {
if (this.cannotConnect) {
const tokens = loadTokens();
return html`
<hc-layout>
<div class="card-content">
Unable to connect to ${tokens!.hassUrl}.
</div>
<div class="card-actions">
<a href="/">
<mwc-button>
Retry
</mwc-button>
</a>
<div class="spacer"></div>
<mwc-button @click=${this._handleLogout}>Log out</mwc-button>
</div>
</hc-layout>
`;
}
if (this.castManager === undefined || this.loading) {
return html`
<loading-screen></loading-screen>
`;
}
if (this.castManager === null) {
return html`
<hc-layout>
<div class="card-content">
${INTRO}
<p class="error">
The Cast API is not available in your browser.
${seeFAQ("browser")}
</p>
</div>
</hc-layout>
`;
}
if (!this.auth) {
return html`
<hc-layout>
<div class="card-content">
${INTRO}
<p>
To get started, enter your Home Assistant URL and click authorize.
If you want a preview instead, click the show demo button.
</p>
<p>
<paper-input
label="Home Assistant URL"
placeholder="https://abcdefghijklmnop.ui.nabu.casa"
@keydown=${this._handleInputKeyDown}
></paper-input>
</p>
${this.error
? html`
<p class="error">${this.error}</p>
`
: ""}
</div>
<div class="card-actions">
<mwc-button @click=${this._handleDemo}>
Show Demo
<iron-icon
.icon=${this.castManager.castState === "CONNECTED"
? "hass:cast-connected"
: "hass:cast"}
></iron-icon>
</mwc-button>
<div class="spacer"></div>
<mwc-button @click=${this._handleConnect}>Authorize</mwc-button>
</div>
</hc-layout>
`;
}
return html`
<hc-cast
.connection=${this.connection}
.auth=${this.auth}
.castManager=${this.castManager}
></hc-cast>
`;
}
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
import("./hc-cast");
getCastManager().then(
async (mgr) => {
this.castManager = mgr;
mgr.addEventListener("connection-changed", () => {
this.requestUpdate();
});
mgr.addEventListener("state-changed", () => {
if (this.openDemo && mgr.castState === "CONNECTED" && !this.auth) {
castSendShowDemo(mgr);
}
});
if (location.search.indexOf("auth_callback=1") !== -1) {
this._tryConnection("auth-callback");
} else if (loadTokens()) {
this._tryConnection("saved-tokens");
}
},
() => {
this.castManager = null;
}
);
registerServiceWorker(false);
}
private async _handleDemo() {
this.openDemo = true;
if (this.castManager!.status && !this.castManager!.status.showDemo) {
castSendShowDemo(this.castManager!);
} else {
this.castManager!.requestSession();
}
}
private _handleInputKeyDown(ev: KeyboardEvent) {
// Handle pressing enter.
if (ev.keyCode === 13) {
this._handleConnect();
}
}
private async _handleConnect() {
const inputEl = this.shadowRoot!.querySelector("paper-input")!;
const value = inputEl.value || "";
this.error = undefined;
if (value === "") {
this.error = "Please enter a Home Assistant URL.";
return;
} else if (value.indexOf("://") === -1) {
this.error =
"Please enter your full URL, including the protocol part (https://).";
return;
}
let url: URL;
try {
url = new URL(value);
} catch (err) {
this.error = "Invalid URL";
return;
}
if (url.protocol === "http:" && url.hostname !== "localhost") {
this.error = translateErr(ERR_INVALID_HTTPS_TO_HTTP);
return;
}
await this._tryConnection("user-request", `${url.protocol}//${url.host}`);
}
private async _tryConnection(
init: "auth-callback" | "user-request" | "saved-tokens",
hassUrl?: string
) {
const options: getAuthOptions = {
saveTokens,
loadTokens: () => Promise.resolve(loadTokens()),
};
if (hassUrl) {
options.hassUrl = hassUrl;
}
let auth: Auth;
try {
this.loading = true;
auth = await getAuth(options);
} catch (err) {
if (init === "saved-tokens" && err === ERR_CANNOT_CONNECT) {
this.cannotConnect = true;
return;
}
this.error = translateErr(err);
this.loading = false;
return;
} finally {
// Clear url if we have a auth callback in url.
if (location.search.includes("auth_callback=1")) {
history.replaceState(null, "", location.pathname);
}
}
let conn: Connection;
try {
conn = await createConnection({ auth });
} catch (err) {
// In case of saved tokens, silently solve problems.
if (init === "saved-tokens") {
if (err === ERR_CANNOT_CONNECT) {
this.cannotConnect = true;
} else if (err === ERR_INVALID_AUTH) {
saveTokens(null);
}
} else {
this.error = translateErr(err);
}
return;
} finally {
this.loading = false;
}
this.auth = auth;
this.connection = conn;
this.castManager!.auth = auth;
}
private async _handleLogout() {
try {
saveTokens(null);
location.reload();
} catch (err) {
alert("Unable to log out!");
}
}
static get styles(): CSSResult {
return css`
.card-content a {
color: var(--primary-color);
}
.card-actions a {
text-decoration: none;
}
.error {
color: red;
font-weight: bold;
}
.error a {
color: darkred;
}
mwc-button iron-icon {
margin-left: 8px;
}
.spacer {
flex: 1;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"hc-connect": HcConnect;
}
}

View File

@@ -0,0 +1,166 @@
import {
customElement,
LitElement,
TemplateResult,
html,
CSSResult,
css,
property,
} from "lit-element";
import {
Auth,
Connection,
HassUser,
getUser,
} from "home-assistant-js-websocket";
import "../../../../src/components/ha-card";
@customElement("hc-layout")
class HcLayout extends LitElement {
@property() public subtitle?: string | undefined;
@property() public auth?: Auth;
@property() public connection?: Connection;
@property() public user?: HassUser;
protected render(): TemplateResult | void {
return html`
<ha-card>
<div class="layout">
<img class="hero" src="/images/google-nest-hub.png" />
<div class="card-header">
Home Assistant Cast${this.subtitle ? ` ${this.subtitle}` : ""}
${this.auth
? html`
<div class="subtitle">
<a href=${this.auth.data.hassUrl} target="_blank"
>${this.auth.data.hassUrl.substr(
this.auth.data.hassUrl.indexOf("//") + 2
)}</a
>
${this.user
? html`
${this.user.name}
`
: ""}
</div>
`
: ""}
</div>
<slot></slot>
</div>
</ha-card>
<div class="footer">
<a href="./faq.html">Frequently Asked Questions</a> Found a bug? Let
@balloob know
<!-- <a
href="https://github.com/home-assistant/home-assistant-polymer/issues"
target="_blank"
>Let us know!</a
> -->
</div>
`;
}
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
if (this.connection) {
getUser(this.connection).then((user) => {
this.user = user;
});
}
}
static get styles(): CSSResult {
return css`
:host {
display: flex;
min-height: 100%;
align-items: center;
justify-content: center;
flex-direction: column;
}
ha-card {
display: flex;
width: 100%;
max-width: 500px;
}
.layout {
display: flex;
flex-direction: column;
}
.card-header {
color: var(--ha-card-header-color, --primary-text-color);
font-family: var(--ha-card-header-font-family, inherit);
font-size: var(--ha-card-header-font-size, 24px);
letter-spacing: -0.012em;
line-height: 32px;
padding: 24px 16px 16px;
display: block;
}
.subtitle {
font-size: 14px;
color: var(--secondary-text-color);
line-height: initial;
}
.subtitle a {
color: var(--secondary-text-color);
}
:host ::slotted(.card-content:not(:first-child)),
slot:not(:first-child)::slotted(.card-content) {
padding-top: 0px;
margin-top: -8px;
}
:host ::slotted(.section-header) {
font-weight: 500;
padding: 4px 16px;
text-transform: uppercase;
}
:host ::slotted(.card-content) {
padding: 16px;
flex: 1;
}
:host ::slotted(.card-actions) {
border-top: 1px solid #e8e8e8;
padding: 5px 16px;
display: flex;
}
img {
width: 100%;
}
.footer {
text-align: center;
font-size: 12px;
padding: 8px 0 24px;
color: var(--secondary-text-color);
}
.footer a {
color: var(--secondary-text-color);
}
@media all and (max-width: 500px) {
:host {
justify-content: flex-start;
min-height: 90%;
margin-bottom: 30px;
}
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"hc-layout": HcLayout;
}
}

View File

@@ -0,0 +1 @@
export const castContext = cast.framework.CastReceiverContext.getInstance();

View File

@@ -0,0 +1,141 @@
import { Entity, convertEntities } from "../../../../src/fake_data/entity";
export const castDemoEntities: () => Entity[] = () =>
convertEntities({
"light.reading_light": {
entity_id: "light.reading_light",
state: "on",
attributes: {
friendly_name: "Reading Light",
},
},
"light.ceiling": {
entity_id: "light.ceiling",
state: "on",
attributes: {
friendly_name: "Ceiling lights",
},
},
"light.standing_lamp": {
entity_id: "light.standing_lamp",
state: "off",
attributes: {
friendly_name: "Standing Lamp",
},
},
"sensor.temperature_inside": {
entity_id: "sensor.temperature_inside",
state: "22.7",
attributes: {
battery_level: 78,
unit_of_measurement: "\u00b0C",
friendly_name: "Inside",
device_class: "temperature",
},
},
"sensor.temperature_outside": {
entity_id: "sensor.temperature_outside",
state: "31.4",
attributes: {
battery_level: 53,
unit_of_measurement: "\u00b0C",
friendly_name: "Outside",
device_class: "temperature",
},
},
"person.arsaboo": {
entity_id: "person.arsaboo",
state: "not_home",
attributes: {
radius: 50,
friendly_name: "Arsaboo",
latitude: 52.3579946,
longitude: 4.8664597,
entity_picture: "/images/arsaboo.jpg",
},
},
"person.melody": {
entity_id: "person.melody",
state: "not_home",
attributes: {
radius: 50,
friendly_name: "Melody",
latitude: 52.3408927,
longitude: 4.8711073,
entity_picture: "/images/melody.jpg",
},
},
"zone.home": {
entity_id: "zone.home",
state: "zoning",
attributes: {
hidden: true,
latitude: 52.3631339,
longitude: 4.8903147,
radius: 100,
friendly_name: "Home",
icon: "hass:home",
},
},
"input_number.harmonyvolume": {
entity_id: "input_number.harmonyvolume",
state: "18.0",
attributes: {
initial: 30,
min: 1,
max: 100,
step: 1,
mode: "slider",
friendly_name: "Volume",
icon: "hass:volume-high",
},
},
"climate.upstairs": {
entity_id: "climate.upstairs",
state: "auto",
attributes: {
current_temperature: 24,
min_temp: 15,
max_temp: 30,
temperature: null,
target_temp_high: 26,
target_temp_low: 18,
fan_mode: "auto",
fan_modes: ["auto", "on"],
hvac_modes: ["auto", "cool", "heat", "off"],
aux_heat: "off",
actual_humidity: 30,
fan: "on",
operation: "fan",
fan_min_on_time: 10,
friendly_name: "Upstairs",
supported_features: 27,
preset_mode: "away",
preset_modes: ["home", "away", "eco", "sleep"],
},
},
"climate.downstairs": {
entity_id: "climate.downstairs",
state: "auto",
attributes: {
current_temperature: 22,
min_temp: 15,
max_temp: 30,
temperature: null,
target_temp_high: 24,
target_temp_low: 20,
fan_mode: "auto",
fan_modes: ["auto", "on"],
hvac_modes: ["auto", "cool", "heat", "off"],
aux_heat: "off",
actual_humidity: 30,
fan: "on",
operation: "fan",
fan_min_on_time: 10,
friendly_name: "Downstairs",
supported_features: 27,
preset_mode: "home",
preset_modes: ["home", "away", "eco", "sleep"],
},
},
});

View File

@@ -0,0 +1,93 @@
import {
LovelaceConfig,
LovelaceCardConfig,
} from "../../../../src/data/lovelace";
import { castContext } from "../cast_context";
export const castDemoLovelace: () => LovelaceConfig = () => {
const touchSupported = castContext.getDeviceCapabilities()
.touch_input_supported;
return {
views: [
{
path: "overview",
cards: [
{
type: "markdown",
title: "Home Assistant Cast",
content: `With Home Assistant you can easily create interfaces (just like this one) which can be shown on Chromecast devices connected to TVs or Google Assistant devices with a screen.${
touchSupported
? "\n\nYou are able to interact with this demo using the touch screen."
: "\n\nOn a Google Nest Hub you are able to interact with Home Assistant Cast via the touch screen."
}`,
},
{
type: touchSupported ? "entities" : "glance",
title: "Living Room",
entities: [
"light.reading_light",
"light.ceiling",
"light.standing_lamp",
"input_number.harmonyvolume",
],
},
{
cards: [
{
graph: "line",
type: "sensor",
entity: "sensor.temperature_inside",
},
{
graph: "line",
type: "sensor",
entity: "sensor.temperature_outside",
},
],
type: "horizontal-stack",
},
{
type: "map",
entities: ["person.arsaboo", "person.melody", "zone.home"],
aspect_ratio: touchSupported ? "16:9.3" : "16:11",
},
touchSupported && {
type: "entities",
entities: [
{
type: "weblink",
url: "/lovelace/climate",
name: "Climate controls",
icon: "hass:arrow-right",
},
],
},
].filter(Boolean) as LovelaceCardConfig[],
},
{
path: "climate",
cards: [
{
type: "thermostat",
entity: "climate.downstairs",
},
{
type: "entities",
entities: [
{
type: "weblink",
url: "/lovelace/overview",
name: "Back",
icon: "hass:arrow-left",
},
],
},
{
type: "thermostat",
entity: "climate.upstairs",
},
],
},
],
};
};

View File

@@ -0,0 +1,42 @@
import "../../../src/resources/custom-card-support";
import { castContext } from "./cast_context";
import { ReceivedMessage } from "./types";
import { HassMessage } from "../../../src/cast/receiver_messages";
import { HcMain } from "./layout/hc-main";
import { CAST_NS } from "../../../src/cast/const";
const controller = new HcMain();
document.body.append(controller);
const options = new cast.framework.CastReceiverOptions();
options.disableIdleTimeout = true;
options.customNamespaces = {
// @ts-ignore
[CAST_NS]: cast.framework.system.MessageType.JSON,
};
// The docs say we need to set options.touchScreenOptimizeApp = true
// https://developers.google.com/cast/docs/caf_receiver/customize_ui#accessing_ui_controls
// This doesn't work.
// @ts-ignore
options.touchScreenOptimizedApp = true;
// The class reference say we can set a uiConfig in options to set it
// https://developers.google.com/cast/docs/reference/caf_receiver/cast.framework.CastReceiverOptions#uiConfig
// This doesn't work either.
// @ts-ignore
options.uiConfig = new cast.framework.ui.UiConfig();
// @ts-ignore
options.uiConfig.touchScreenOptimizedApp = true;
castContext.addCustomMessageListener(
CAST_NS,
// @ts-ignore
(ev: ReceivedMessage<HassMessage>) => {
const msg = ev.data;
msg.senderId = ev.senderId;
controller.processIncomingMessage(msg);
}
);
castContext.start(options);

View File

@@ -0,0 +1,56 @@
import { HassElement } from "../../../../src/state/hass-element";
import "./hc-lovelace";
import { customElement, TemplateResult, html, property } from "lit-element";
import {
MockHomeAssistant,
provideHass,
} from "../../../../src/fake_data/provide_hass";
import { HomeAssistant } from "../../../../src/types";
import { LovelaceConfig } from "../../../../src/data/lovelace";
import { castDemoEntities } from "../demo/cast-demo-entities";
import { castDemoLovelace } from "../demo/cast-demo-lovelace";
import { mockHistory } from "../../../../demo/src/stubs/history";
@customElement("hc-demo")
class HcDemo extends HassElement {
@property() public lovelacePath!: string;
@property() private _lovelaceConfig?: LovelaceConfig;
protected render(): TemplateResult | void {
if (!this._lovelaceConfig) {
return html``;
}
return html`
<hc-lovelace
.hass=${this.hass}
.lovelaceConfig=${this._lovelaceConfig}
.viewPath=${this.lovelacePath}
></hc-lovelace>
`;
}
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
this._initialize();
}
private async _initialize() {
const initial: Partial<MockHomeAssistant> = {
// Override updateHass so that the correct hass lifecycle methods are called
updateHass: (hassUpdate: Partial<HomeAssistant>) =>
this._updateHass(hassUpdate),
};
const hass = (this.hass = provideHass(this, initial));
mockHistory(hass);
hass.addEntities(castDemoEntities());
this._lovelaceConfig = castDemoLovelace();
}
}
declare global {
interface HTMLElementTagNameMap {
"hc-demo": HcDemo;
}
}

View File

@@ -0,0 +1,66 @@
import {
LitElement,
TemplateResult,
html,
customElement,
CSSResult,
css,
property,
} from "lit-element";
import { HomeAssistant } from "../../../../src/types";
@customElement("hc-launch-screen")
class HcLaunchScreen extends LitElement {
@property() public hass?: HomeAssistant;
@property() public error?: string;
protected render(): TemplateResult | void {
return html`
<div class="container">
<img
src="https://www.home-assistant.io/images/blog/2018-09-thinking-big/social.png"
/>
<div class="status">
${this.hass ? "Connected" : "Not Connected"}
${this.error
? html`
<p>Error: ${this.error}</p>
`
: ""}
</div>
</div>
`;
}
static get styles(): CSSResult {
return css`
:host {
display: block;
height: 100vh;
padding-top: 64px;
background-color: white;
font-size: 24px;
}
.container {
display: flex;
flex-direction: column;
text-align: center;
}
img {
width: 717px;
height: 376px;
display: block;
margin: 0 auto;
}
.status {
padding-right: 54px;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"hc-launch-screen": HcLaunchScreen;
}
}

View File

@@ -0,0 +1,119 @@
import {
LitElement,
TemplateResult,
html,
customElement,
CSSResult,
css,
property,
} from "lit-element";
import { LovelaceConfig } from "../../../../src/data/lovelace";
import "../../../../src/panels/lovelace/views/hui-view";
import "../../../../src/panels/lovelace/views/hui-panel-view";
import { HomeAssistant } from "../../../../src/types";
import { Lovelace } from "../../../../src/panels/lovelace/types";
import "./hc-launch-screen";
@customElement("hc-lovelace")
class HcLovelace extends LitElement {
@property() public hass!: HomeAssistant;
@property() public lovelaceConfig!: LovelaceConfig;
@property() public viewPath?: string | number;
protected render(): TemplateResult | void {
const index = this._viewIndex;
if (index === undefined) {
return html`
<hc-launch-screen
.hass=${this.hass}
.error=${`Unable to find a view with path ${this.viewPath}`}
></hc-launch-screen>
`;
}
const lovelace: Lovelace = {
config: this.lovelaceConfig,
editMode: false,
enableFullEditMode: () => undefined,
mode: "storage",
language: "en",
saveConfig: async () => undefined,
deleteConfig: async () => undefined,
setEditMode: () => undefined,
};
return this.lovelaceConfig.views[index].panel
? html`
<hui-panel-view
.hass=${this.hass}
.config=${this.lovelaceConfig.views[index]}
></hui-panel-view>
`
: html`
<hui-view
.hass=${this.hass}
.lovelace=${lovelace}
.index=${index}
columns="2"
></hui-view>
`;
}
protected updated(changedProps) {
super.updated(changedProps);
if (changedProps.has("viewPath") || changedProps.has("lovelaceConfig")) {
const index = this._viewIndex;
if (index !== undefined) {
const configBackground =
this.lovelaceConfig.views[index].background ||
this.lovelaceConfig.background;
if (configBackground) {
(this.shadowRoot!.querySelector(
"hui-view, hui-panel-view"
) as HTMLElement)!.style.setProperty(
"--lovelace-background",
configBackground
);
}
}
}
}
private get _viewIndex() {
const selectedView = this.viewPath;
const selectedViewInt = parseInt(selectedView as string, 10);
for (let i = 0; i < this.lovelaceConfig.views.length; i++) {
if (
this.lovelaceConfig.views[i].path === selectedView ||
i === selectedViewInt
) {
return i;
}
}
return undefined;
}
static get styles(): CSSResult {
return css`
:host {
min-height: 100vh;
display: flex;
flex-direction: column;
box-sizing: border-box;
background: var(--primary-background-color);
}
:host > * {
flex: 1;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"hc-lovelace": HcLovelace;
}
}

View File

@@ -0,0 +1,250 @@
import {
getAuth,
createConnection,
UnsubscribeFunc,
} from "home-assistant-js-websocket";
import { customElement, TemplateResult, html, property } from "lit-element";
import { HassElement } from "../../../../src/state/hass-element";
import {
HassMessage,
ConnectMessage,
ShowLovelaceViewMessage,
GetStatusMessage,
ShowDemoMessage,
} from "../../../../src/cast/receiver_messages";
import {
LovelaceConfig,
getLovelaceCollection,
} from "../../../../src/data/lovelace";
import "./hc-launch-screen";
import { castContext } from "../cast_context";
import { CAST_NS } from "../../../../src/cast/const";
import { ReceiverStatusMessage } from "../../../../src/cast/sender_messages";
import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources";
import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click";
@customElement("hc-main")
export class HcMain extends HassElement {
@property() private _showDemo = false;
@property() private _lovelaceConfig?: LovelaceConfig;
@property() private _lovelacePath: string | number | null = null;
@property() private _error?: string;
private _unsubLovelace?: UnsubscribeFunc;
public processIncomingMessage(msg: HassMessage) {
if (msg.type === "connect") {
this._handleConnectMessage(msg);
} else if (msg.type === "show_lovelace_view") {
this._handleShowLovelaceMessage(msg);
} else if (msg.type === "get_status") {
this._handleGetStatusMessage(msg);
} else if (msg.type === "show_demo") {
this._handleShowDemo(msg);
} else {
// tslint:disable-next-line: no-console
console.warn("unknown msg type", msg);
}
}
protected render(): TemplateResult | void {
if (this._showDemo) {
return html`
<hc-demo .lovelacePath=${this._lovelacePath}></hc-demo>
`;
}
if (
!this._lovelaceConfig ||
this._lovelacePath === null ||
// Guard against part of HA not being loaded yet.
(this.hass &&
(!this.hass.states || !this.hass.config || !this.hass.services))
) {
return html`
<hc-launch-screen
.hass=${this.hass}
.error=${this._error}
></hc-launch-screen>
`;
}
return html`
<hc-lovelace
.hass=${this.hass}
.lovelaceConfig=${this._lovelaceConfig}
.viewPath=${this._lovelacePath}
></hc-lovelace>
`;
}
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
import("../second-load");
window.addEventListener("location-changed", () => {
if (location.pathname.startsWith("/lovelace/")) {
this._lovelacePath = location.pathname.substr(10);
this._sendStatus();
}
});
document.body.addEventListener("click", (ev) => {
const href = isNavigationClick(ev);
if (href && href.startsWith("/lovelace/")) {
this._lovelacePath = href.substr(10);
this._sendStatus();
}
});
}
private _sendStatus(senderId?: string) {
const status: ReceiverStatusMessage = {
type: "receiver_status",
connected: !!this.hass,
showDemo: this._showDemo,
};
if (this.hass) {
status.hassUrl = this.hass.auth.data.hassUrl;
status.lovelacePath = this._lovelacePath!;
}
if (senderId) {
this.sendMessage(senderId, status);
} else {
for (const sender of castContext.getSenders()) {
this.sendMessage(sender.id, status);
}
}
}
private async _handleGetStatusMessage(msg: GetStatusMessage) {
this._sendStatus(msg.senderId!);
}
private async _handleConnectMessage(msg: ConnectMessage) {
let auth;
try {
auth = await getAuth({
loadTokens: async () => ({
hassUrl: msg.hassUrl,
clientId: msg.clientId,
refresh_token: msg.refreshToken,
access_token: "",
expires: 0,
expires_in: 0,
}),
});
} catch (err) {
this._error = this._getErrorMessage(err);
return;
}
let connection;
try {
connection = await createConnection({ auth });
} catch (err) {
this._error = this._getErrorMessage(err);
return;
}
if (this.hass) {
this.hass.connection.close();
}
this.initializeHass(auth, connection);
this._error = undefined;
this._sendStatus();
}
private async _handleShowLovelaceMessage(msg: ShowLovelaceViewMessage) {
// We should not get this command before we are connected.
// Means a client got out of sync. Let's send status to them.
if (!this.hass) {
this._sendStatus(msg.senderId!);
this._error = "Cannot show Lovelace because we're not connected.";
return;
}
if (!this._unsubLovelace) {
const llColl = getLovelaceCollection(this.hass!.connection);
// We first do a single refresh because we need to check if there is LL
// configuration.
try {
await llColl.refresh();
this._unsubLovelace = llColl.subscribe((lovelaceConfig) =>
this._handleNewLovelaceConfig(lovelaceConfig)
);
} catch (err) {
// Generate a Lovelace config.
this._unsubLovelace = () => undefined;
const { generateLovelaceConfigFromHass } = await import(
"../../../../src/panels/lovelace/common/generate-lovelace-config"
);
this._handleNewLovelaceConfig(
await generateLovelaceConfigFromHass(this.hass!)
);
}
}
this._showDemo = false;
this._lovelacePath = msg.viewPath;
if (castContext.getDeviceCapabilities().touch_input_supported) {
this._breakFree();
}
this._sendStatus();
}
private _handleNewLovelaceConfig(lovelaceConfig: LovelaceConfig) {
castContext.setApplicationState(lovelaceConfig.title!);
this._lovelaceConfig = lovelaceConfig;
if (lovelaceConfig.resources) {
loadLovelaceResources(
lovelaceConfig.resources,
this.hass!.auth.data.hassUrl
);
}
}
private _handleShowDemo(_msg: ShowDemoMessage) {
import("./hc-demo").then(() => {
this._showDemo = true;
this._lovelacePath = "overview";
this._sendStatus();
if (castContext.getDeviceCapabilities().touch_input_supported) {
this._breakFree();
}
});
}
private _getErrorMessage(error: number): string {
switch (error) {
case 1:
return "Unable to connect to the Home Assistant websocket API.";
case 2:
return "The supplied authentication is invalid.";
case 3:
return "The connection to Home Assistant was lost.";
case 4:
return "Missing hassUrl. This is required.";
case 5:
return "Home Assistant needs to be served over https:// to use with Home Assistant Cast.";
default:
return "Unknown Error";
}
}
private _breakFree() {
const controls = document.body.querySelector("touch-controls");
if (controls) {
controls.remove();
}
document.body.setAttribute("style", "overflow-y: auto !important");
}
private sendMessage(senderId: string, response: any) {
castContext.sendCustomMessage(CAST_NS, senderId, response);
}
}
declare global {
interface HTMLElementTagNameMap {
"hc-main": HcMain;
}
}

View File

@@ -0,0 +1,5 @@
import "web-animations-js/web-animations-next-lite.min";
import "../../../src/resources/hass-icons";
import "../../../src/resources/roboto";
import "../../../src/components/ha-iconset-svg";
import "./layout/hc-lovelace";

View File

@@ -0,0 +1,6 @@
export interface ReceivedMessage<T> {
gj: boolean;
data: T;
senderId: string;
type: "message";
}

11
cast/webpack.config.js Normal file
View File

@@ -0,0 +1,11 @@
const { createCastConfig } = require("../build-scripts/webpack.js");
const { isProdBuild } = require("../build-scripts/env.js");
// File just used for stats builds
const latestBuild = true;
module.exports = createCastConfig({
isProdBuild,
latestBuild,
});

18
demo/public/_headers Normal file
View File

@@ -0,0 +1,18 @@
/*
Cache-Control: public, max-age: 0, s-maxage=3600, must-revalidate
Content-Security-Policy: form-action https:
Referrer-Policy: no-referrer-when-downgrade
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
/api/*
Cache-Control: public, max-age: 604800, s-maxage=604800
/assets/*
Cache-Control: public, max-age: 604800, s-maxage=604800
/frontend_es5/*
Cache-Control: public, max-age: 604800, s-maxage=604800
/frontend_latest/*
Cache-Control: public, max-age: 604800, s-maxage=604800

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -7,22 +7,26 @@
{
"src": "/static/icons/favicon-192x192.png",
"sizes": "192x192",
"type": "image/png"
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "/static/icons/favicon-384x384.png",
"sizes": "384x384",
"type": "image/png"
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "/static/icons/favicon-512x512.png",
"sizes": "512x512",
"type": "image/png"
"type": "image/png",
"purpose": "maskable any"
},
{
"src": "/static/icons/favicon-1024x1024.png",
"sizes": "1024x1024",
"type": "image/png"
"type": "image/png",
"purpose": "maskable any"
}
],
"lang": "en-US",

View File

@@ -0,0 +1,3 @@
self.addEventListener("fetch", function(event) {
event.respondWith(fetch(event.request));
});

View File

@@ -1,91 +1,75 @@
import { Entity, convertEntities } from "../../../../src/fake_data/entity";
import { convertEntities } from "../../../../src/fake_data/entity";
import { DemoConfig } from "../types";
export const demoEntitiesArsaboo: () => Entity[] = () =>
export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
convertEntities({
"zone.home": {
entity_id: "zone.home",
state: "zoning",
attributes: {
hidden: true,
latitude: 52.3631339,
longitude: 4.8903147,
radius: 200,
friendly_name: "Home",
icon: "hademo:home",
},
last_changed: "2019-01-22T16:59:56.243651+00:00",
last_updated: "2019-01-22T16:59:56.243651+00:00",
context: { id: "a1b962da6bc54aad9d8e921e47c7ba87", user_id: null },
},
"zone.buckhead": {
"zone.uva": {
entity_id: "zone.buckhead",
state: "zoning",
attributes: {
hidden: true,
radius: 200,
friendly_name: "Buckhead",
radius: 400,
friendly_name: "UvA",
icon: "hademo:school",
latitude: 52.3558182,
longitude: 4.9535376,
},
last_changed: "2019-01-22T16:59:56.243765+00:00",
last_updated: "2019-01-22T16:59:56.243765+00:00",
context: { id: "ed52190b694c458e8dc5bb733fc553ee", user_id: null },
},
"zone.downtown": {
entity_id: "zone.downtown",
state: "zoning",
"person.arsaboo": {
entity_id: "person.arsaboo",
state: "not_home",
attributes: {
hidden: true,
radius: 200,
friendly_name: "Downtown",
icon: "hademo:school",
radius: 50,
friendly_name: "Arsaboo",
latitude: 52.3579946,
longitude: 4.8664597,
entity_picture: "/assets/arsaboo/images/arsaboo.jpg",
},
},
"person.melody": {
entity_id: "person.melody",
state: "not_home",
attributes: {
radius: 50,
friendly_name: "Melody",
latitude: 52.3408927,
longitude: 4.8711073,
entity_picture: "/assets/arsaboo/images/melody.jpg",
},
last_changed: "2019-01-22T16:59:56.243873+00:00",
last_updated: "2019-01-22T16:59:56.243873+00:00",
context: { id: "9114964fdecd424ca96f60cfa8864422", user_id: null },
},
"sensor.livingroom_temp_rounded": {
entity_id: "sensor.livingroom_temp_rounded",
state: "66",
state: "21",
attributes: {
friendly_name: "Living room temperature",
homebridge_hidden: true,
},
last_changed: "2019-01-22T18:23:58.615703+00:00",
last_updated: "2019-01-22T18:23:58.615703+00:00",
context: { id: "d8720a928ed645838679c2b5edc5e2fd", user_id: null },
},
"sensor.study_temp_rounded": {
entity_id: "sensor.study_temp_rounded",
state: "67",
state: "23",
attributes: {
friendly_name: "Study temperature",
homebridge_hidden: true,
},
last_changed: "2019-01-22T19:17:17.881894+00:00",
last_updated: "2019-01-22T19:17:17.881894+00:00",
context: { id: "9e25fd2c4032461f83df3ed778fc031e", user_id: null },
},
"sensor.sonos_audio_in": {
entity_id: "sensor.sonos_audio_in",
state: "Paused",
attributes: {
friendly_name: "Sonos Audio-in",
icon: "hademo:volume-high",
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:14.678332+00:00",
last_updated: "2019-01-22T17:00:14.678332+00:00",
context: { id: "072d120e6d584e4d88e3222196b27e4d", user_id: null },
},
"sensor.living_room": {
entity_id: "sensor.living_room",
state: "PowerOff",
state: "YouTube",
attributes: {
friendly_name: "Harmony Activity",
homebridge_hidden: true,
friendly_name: "Harmony",
entity_picture: "/assets/arsaboo/icons/Harmony.png",
},
last_changed: "2019-01-22T17:00:14.722625+00:00",
last_updated: "2019-01-22T17:00:14.722625+00:00",
context: { id: "8a3e097e681740cca0f82905dd9f84b6", user_id: null },
},
"sensor.total_tv_time": {
entity_id: "sensor.total_tv_time",
@@ -93,13 +77,11 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
attributes: {
value: "25m",
unit_of_measurement: "h",
friendly_name: "Total TV Time",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.total_tv_time"
),
icon: "hademo:chart-line",
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:14.938049+00:00",
last_updated: "2019-01-22T17:00:14.938049+00:00",
context: { id: "22b23e84bd7d4acfb97653fbb68ad6ef", user_id: null },
},
"climate.upstairs": {
entity_id: "climate.upstairs",
@@ -112,26 +94,20 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
target_temp_high: 24,
target_temp_low: 20,
fan_mode: "auto",
fan_list: ["auto", "on"],
operation_mode: "auto",
operation_list: ["auto", "auxHeatOnly", "cool", "heat", "off"],
hold_mode: null,
away_mode: "off",
fan_modes: ["auto", "on"],
hvac_modes: ["auto", "cool", "heat", "off"],
aux_heat: "off",
actual_humidity: 30,
fan: "on",
climate_mode: "Day",
operation: "fan",
climate_list: ["Away", "Sleep", "Day", "Home"],
fan_min_on_time: 10,
friendly_name: "Upstairs",
supported_features: 3575,
homebridge_hidden: true,
entity_picture: "/assets/arsaboo/icons/Ecobee.png",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.names.upstairs"
),
supported_features: 27,
preset_mode: "away",
preset_modes: ["home", "away", "eco", "sleep"],
},
last_changed: "2019-01-22T16:59:56.810867+00:00",
last_updated: "2019-01-22T19:33:14.146114+00:00",
context: { id: "211635d7bddb468d927d18cee9f795cf", user_id: null },
},
"input_boolean.abodeupdate": {
entity_id: "input_boolean.abodeupdate",
@@ -139,16 +115,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
attributes: {
friendly_name: "Abode Updates",
icon: "hademo:security",
homebridge_hidden: true,
templates: {
icon_color:
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
},
emulated_hue_hidden: false,
},
last_changed: "2019-01-22T16:59:56.881638+00:00",
last_updated: "2019-01-22T16:59:56.881638+00:00",
context: { id: "7565c5becbca495c91550822d3284249", user_id: null },
},
"input_boolean.tv": {
entity_id: "input_boolean.tv",
@@ -156,15 +123,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
attributes: {
friendly_name: "TV",
icon: "hademo:television",
homebridge_hidden: false,
templates: {
icon_color:
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
},
},
last_changed: "2019-01-22T16:59:56.882562+00:00",
last_updated: "2019-01-22T16:59:56.882562+00:00",
context: { id: "0ac79c8674b242be968d08791e6b5932", user_id: null },
},
"input_boolean.homeautomation": {
entity_id: "input_boolean.homeautomation",
@@ -172,15 +131,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
attributes: {
friendly_name: "Home Automation",
icon: "hass:home-automation",
homebridge_hidden: true,
templates: {
icon_color:
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
},
},
last_changed: "2019-01-22T16:59:56.883106+00:00",
last_updated: "2019-01-22T16:59:56.883106+00:00",
context: { id: "c6eb55b9528c49f181f624b38c9e2744", user_id: null },
},
"input_boolean.tvtime": {
entity_id: "input_boolean.tvtime",
@@ -188,59 +139,46 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
attributes: {
friendly_name: "TV Time",
icon: "hademo:television-guide",
homebridge_hidden: true,
templates: {
icon:
"if (state === 'on') return 'hademo:television-classic'; return 'hademo:television-classic-off';\n",
icon_color:
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
},
},
last_changed: "2019-01-22T16:59:56.883309+00:00",
last_updated: "2019-01-22T16:59:56.883309+00:00",
context: { id: "5fdf8af8eb214e65ade4e3aeff3dd34b", user_id: null },
},
"input_select.livingroomharmony": {
entity_id: "input_select.livingroomharmony",
state: "PowerOff",
state: "YouTube",
attributes: {
options: [
"PowerOff",
"Watch Fire TV",
"Youtube",
"YouTube",
"SATV",
"Watch Apple TV",
],
friendly_name: "Harmony Activity",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.activity"
),
icon: "hademo:remote",
},
last_changed: "2019-01-22T16:59:56.884366+00:00",
last_updated: "2019-01-22T16:59:56.884366+00:00",
context: { id: "0f58b582c976468da868054edf770f92", user_id: null },
},
"input_select.hdmiswitcher": {
entity_id: "input_select.hdmiswitcher",
state: "Shield",
attributes: {
options: ["AppleTV", "FireTV", "Shield"],
friendly_name: "HDMI Switcher",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.hdmi_switcher"
),
icon: "hademo:remote",
},
last_changed: "2019-01-22T16:59:56.884597+00:00",
last_updated: "2019-01-22T16:59:56.884597+00:00",
context: { id: "20071b60a5a84a10b48a218f1cad67e7", user_id: null },
},
"input_select.hdmiinput": {
entity_id: "input_select.hdmiinput",
state: "InputHdmi4",
attributes: {
options: ["InputHdmi1", "InputHdmi2", "InputHDMI3", "InputHdmi4"],
friendly_name: "HDMI Input",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.hdmi_input"
),
icon: "hademo:remote",
},
last_changed: "2019-01-22T16:59:56.884850+00:00",
last_updated: "2019-01-22T16:59:56.884850+00:00",
context: { id: "d807dee60854436f81ef374ab8267bd1", user_id: null },
},
"input_number.harmonyvolume": {
entity_id: "input_number.harmonyvolume",
@@ -251,23 +189,21 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
max: 100,
step: 1,
mode: "slider",
friendly_name: "Volume",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.volume"
),
icon: "hademo:volume-high",
},
last_changed: "2019-01-22T17:00:16.104666+00:00",
last_updated: "2019-01-22T17:00:16.104666+00:00",
context: { id: "46df627202ed4c3981ad140e06bcc578", user_id: null },
},
"script.tv_off": {
entity_id: "script.tv_off",
state: "off",
attributes: {
last_triggered: null,
friendly_name: "Turn Television off",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.turn_tv_off"
),
},
last_changed: "2019-01-22T16:59:57.074073+00:00",
last_updated: "2019-01-22T16:59:57.074073+00:00",
context: { id: "618e16fb9dba4dde9c40feda1f10bcc9", user_id: null },
},
"sensor.usdinr": {
entity_id: "sensor.usdinr",
@@ -279,11 +215,19 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
unit_of_measurement: "INR",
friendly_name: "USDINR",
icon: "hademo:currency-usd",
homebridge_hidden: true,
},
last_changed: "2019-01-22T18:25:11.582558+00:00",
last_updated: "2019-01-22T18:25:11.582558+00:00",
context: { id: "7737cf1420d241d8afb3f016179c133c", user_id: null },
},
"sensor.study_temp": {
entity_id: "sensor.study_temp",
state: "20.9",
attributes: {
unit_of_measurement: "°C",
device_class: "temperature",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.names.temperature_study"
),
icon: "hademo:thermometer",
},
},
"cover.garagedoor": {
entity_id: "cover.garagedoor",
@@ -292,27 +236,10 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
friendly_name: "Garage Door",
icon: "hademo:garage",
supported_features: 11,
homebridge_hidden: false,
homebridge_cover_type: "garage_door",
},
last_changed: "2019-01-22T19:31:05.399638+00:00",
last_updated: "2019-01-22T19:31:05.399638+00:00",
context: { id: "6ce1bded3a1c4601a4bc8e8c3823cc9f", user_id: null },
},
"light.master_lights": {
entity_id: "light.master_lights",
state: "off",
attributes: {
min_mireds: 153,
max_mireds: 500,
friendly_name: "Master Lights",
supported_features: 63,
homebridge_hidden: true,
},
last_changed: "2019-01-22T16:59:57.423884+00:00",
last_updated: "2019-01-22T16:59:57.423884+00:00",
context: { id: "b2f91c5772a346b7a24cb28386276cca", user_id: null },
},
"light.living_room_lights": {
entity_id: "light.living_room_lights",
state: "off",
@@ -321,22 +248,14 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
max_mireds: 400,
friendly_name: "Living Room Lights",
supported_features: 55,
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:05.573457+00:00",
last_updated: "2019-01-22T17:00:05.573457+00:00",
context: { id: "bbcc2a67b73a42a280f905c5de1d120d", user_id: null },
},
"switch.security_armed": {
entity_id: "switch.security_armed",
state: "off",
attributes: {
friendly_name: "Home Security Arm",
homebridge_hidden: true,
},
last_changed: "2019-01-22T19:29:19.871240+00:00",
last_updated: "2019-01-22T19:29:19.871240+00:00",
context: { id: "2d370c236dc84c6ba4510fa9b537d926", user_id: null },
},
"light.kitchen_lights": {
entity_id: "light.kitchen_lights",
@@ -344,67 +263,16 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
attributes: {
friendly_name: "Kitchen lights",
supported_features: 1,
homebridge_hidden: false,
emulated_hue_hidden: false,
emulated_hue_name: "Kitchen lights",
},
last_changed: "2019-01-22T16:59:57.294651+00:00",
last_updated: "2019-01-22T16:59:57.294651+00:00",
context: { id: "84a69e03a3b14de29e6753fb10889da7", user_id: null },
},
"light.hue_color_lamp_1": {
entity_id: "light.hue_color_lamp_1",
state: "off",
attributes: {
min_mireds: 153,
max_mireds: 500,
friendly_name: "Master 1",
supported_features: 63,
homebridge_hidden: true,
},
last_changed: "2019-01-22T16:59:57.421788+00:00",
last_updated: "2019-01-22T16:59:57.421788+00:00",
context: { id: "573a69eccae942d5a4b9870c3585429f", user_id: null },
},
"light.hue_color_lamp_2": {
entity_id: "light.hue_color_lamp_2",
state: "off",
attributes: {
min_mireds: 153,
max_mireds: 500,
friendly_name: "Master 2",
supported_features: 63,
homebridge_hidden: true,
},
last_changed: "2019-01-22T16:59:57.422442+00:00",
last_updated: "2019-01-22T16:59:57.422442+00:00",
context: { id: "19ae7cae5143419991ae92a7a3bda423", user_id: null },
},
"light.hue_color_lamp_3": {
entity_id: "light.hue_color_lamp_3",
state: "off",
attributes: {
min_mireds: 153,
max_mireds: 500,
friendly_name: "Master 3",
supported_features: 63,
homebridge_hidden: true,
},
last_changed: "2019-01-22T16:59:57.423068+00:00",
last_updated: "2019-01-22T16:59:57.423068+00:00",
context: { id: "75d3c44287804191bdd86b967125d7a9", user_id: null },
},
"sensor.plexspy": {
entity_id: "sensor.plexspy",
state: "0",
attributes: {
unit_of_measurement: "Watching",
friendly_name: "PlexSpy",
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:00.185247+00:00",
last_updated: "2019-01-22T17:00:00.185247+00:00",
context: { id: "07a3c87af6c54b35914c529acf4e60bb", user_id: null },
},
"binary_sensor.ring_front_door_ding": {
entity_id: "binary_sensor.ring_front_door_ding",
@@ -416,11 +284,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
timezone: "America/New_York",
friendly_name: "Front Door Ding",
device_class: "occupancy",
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:03.255653+00:00",
last_updated: "2019-01-22T18:24:03.677589+00:00",
context: { id: "d7508c32f2c346d5950e725b422d6695", user_id: null },
},
"sensor.ring_front_door_last_motion": {
entity_id: "sensor.ring_front_door_last_motion",
@@ -439,11 +303,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
category: "motion",
friendly_name: "Front Door Last Motion",
icon: "hademo:history",
homebridge_hidden: true,
},
last_changed: "2019-01-22T18:22:33.829681+00:00",
last_updated: "2019-01-22T18:23:04.162733+00:00",
context: { id: "2ca6046f7da2486988032576da8dc475", user_id: null },
},
"camera.patio": {
entity_id: "camera.patio",
@@ -457,9 +317,6 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
"/api/camera_proxy/camera.patio?token=cbd8dfac9efb441f19168e271cb8629b0372d0c1f721353394b23ed0202013b0",
supported_features: 0,
},
last_changed: "2019-01-22T17:00:03.259908+00:00",
last_updated: "2019-01-22T19:35:30.063163+00:00",
context: { id: "dc4051275fa84f9ba9a6db3190d07992", user_id: null },
},
"camera.porch": {
entity_id: "camera.porch",
@@ -473,9 +330,6 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
"/api/camera_proxy/camera.porch?token=479b332e0a7cad4c58e0fb98a1ecb7942e3b225190adb93a1341edfa7daf45b0",
supported_features: 0,
},
last_changed: "2019-01-22T19:32:38.491230+00:00",
last_updated: "2019-01-22T19:35:30.064062+00:00",
context: { id: "4f09dc684f6d4a87990c8b821cf0f49a", user_id: null },
},
"camera.backyard": {
entity_id: "camera.backyard",
@@ -489,9 +343,6 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
"/api/camera_proxy/camera.backyard?token=9381b2e4edd1bb21e868e2193f5d132a5fae153ce4f458451d979a02712b4642",
supported_features: 0,
},
last_changed: "2019-01-22T17:00:03.261698+00:00",
last_updated: "2019-01-22T19:35:30.064857+00:00",
context: { id: "010e1d23a42b4218a90c43c20cffa71f", user_id: null },
},
"camera.driveway": {
entity_id: "camera.driveway",
@@ -505,22 +356,6 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
"/api/camera_proxy/camera.driveway?token=ac38bf88c2c5896eed66ae15739a3e726677f92d79e0d57f83f726ac28bda746",
supported_features: 0,
},
last_changed: "2019-01-22T19:32:38.618521+00:00",
last_updated: "2019-01-22T19:35:30.065677+00:00",
context: { id: "ed8e123e97994bf1b3798bb7c8d7bb85", user_id: null },
},
"light.gateway_light_34ce00813670": {
entity_id: "light.gateway_light_34ce00813670",
state: "off",
attributes: {
friendly_name: "Gateway light",
supported_features: 17,
homebridge_hidden: true,
emulated_hue_hidden: false,
},
last_changed: "2019-01-22T17:00:03.343398+00:00",
last_updated: "2019-01-22T17:00:03.343398+00:00",
context: { id: "395a958263074e9eaebb582be34e46db", user_id: null },
},
"alarm_control_panel.abode_alarm": {
entity_id: "alarm_control_panel.abode_alarm",
@@ -534,12 +369,8 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
cellular_backup: false,
friendly_name: "Abode Alarm",
icon: "hademo:security",
homebridge_hidden: false,
entity_picture: "/assets/arsaboo/icons/Abode.jpg",
},
last_changed: "2019-01-22T19:29:19.864324+00:00",
last_updated: "2019-01-22T19:29:19.864324+00:00",
context: { id: "562080ae942046f0a9f0a9959bd493e8", user_id: null },
},
"binary_sensor.ring_front_door_motion": {
entity_id: "binary_sensor.ring_front_door_motion",
@@ -551,11 +382,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
timezone: "America/New_York",
friendly_name: "Front Door Motion",
device_class: "motion",
homebridge_hidden: true,
},
last_changed: "2019-01-22T18:24:14.683620+00:00",
last_updated: "2019-01-22T18:24:14.683620+00:00",
context: { id: "99bd1f8a0ef848b39293c846d3cf9ff4", user_id: null },
},
"binary_sensor.motion_sensor_158d00016daecc": {
entity_id: "binary_sensor.motion_sensor_158d00016daecc",
@@ -565,11 +392,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
battery_level: 43,
friendly_name: "Living Room Occupancy",
device_class: "motion",
homebridge_hidden: false,
},
last_changed: "2019-01-22T19:36:42.441431+00:00",
last_updated: "2019-01-22T19:36:42.441431+00:00",
context: { id: "95e6019573da458dac144f521517ce9f", user_id: null },
},
"binary_sensor.door_window_sensor_158d0001bf26df": {
entity_id: "binary_sensor.door_window_sensor_158d0001bf26df",
@@ -579,11 +402,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
battery_level: 45,
friendly_name: "Garage Entry Door",
device_class: "door",
homebridge_hidden: true,
},
last_changed: "2019-01-22T19:31:03.412180+00:00",
last_updated: "2019-01-22T19:31:03.412180+00:00",
context: { id: "9cc9a481b6be439c93856b347402e4ac", user_id: null },
},
"binary_sensor.motion_sensor_158d0001a1f2ab": {
entity_id: "binary_sensor.motion_sensor_158d0001a1f2ab",
@@ -593,53 +412,9 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
battery_level: 49,
friendly_name: "Guest Room Occupancy",
device_class: "motion",
homebridge_hidden: false,
},
last_changed: "2019-01-22T17:00:03.630369+00:00",
last_updated: "2019-01-22T17:00:03.630369+00:00",
context: { id: "2acd91071ed2421a81cdb862af6b03db", user_id: null },
},
"binary_sensor.water_leak_sensor_158d0001d77800": {
entity_id: "binary_sensor.water_leak_sensor_158d0001d77800",
state: "off",
attributes: {
battery_level: 41,
friendly_name: "Laundry Water Leak",
device_class: "moisture",
homebridge_hidden: false,
},
last_changed: "2019-01-22T17:00:03.632708+00:00",
last_updated: "2019-01-22T17:00:03.632708+00:00",
context: { id: "252f80524c284844a9e47013c0f94ada", user_id: null },
},
"binary_sensor.motion_sensor_158d00016c53bf": {
entity_id: "binary_sensor.motion_sensor_158d00016c53bf",
state: "off",
attributes: {
"No motion since": 0,
battery_level: 43,
friendly_name: "Master Occupancy",
device_class: "motion",
homebridge_hidden: false,
},
last_changed: "2019-01-22T17:00:03.635223+00:00",
last_updated: "2019-01-22T17:00:03.635223+00:00",
context: { id: "5c112c0a7a91492ba1d7eac30ed4ecf5", user_id: null },
},
"binary_sensor.motion_sensor_158d00016612af": {
entity_id: "binary_sensor.motion_sensor_158d00016612af",
state: "off",
attributes: {
"No motion since": 0,
battery_level: 41,
friendly_name: "Upstairs Occupancy",
device_class: "motion",
homebridge_hidden: false,
},
last_changed: "2019-01-22T17:00:03.636514+00:00",
last_updated: "2019-01-22T17:00:03.636514+00:00",
context: { id: "fe418536af56428e9e8ab3724580e631", user_id: null },
},
"binary_sensor.front_door": {
entity_id: "binary_sensor.front_door",
state: "off",
@@ -651,11 +426,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
device_type: "Door Contact",
friendly_name: "Front Door",
device_class: "door",
homebridge_hidden: true,
},
last_changed: "2019-01-22T19:31:27.023892+00:00",
last_updated: "2019-01-22T19:31:27.023892+00:00",
context: { id: "6e10573f7d7b470ea0a74f2d00475800", user_id: null },
},
"binary_sensor.back_door": {
entity_id: "binary_sensor.back_door",
@@ -668,11 +439,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
device_type: "Door Contact",
friendly_name: "Back Door",
device_class: "door",
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:03.642051+00:00",
last_updated: "2019-01-22T17:00:03.642051+00:00",
context: { id: "a2e7acd74b8646d2b32e40d7a1db4cf1", user_id: null },
},
"media_player.family_room_2": {
entity_id: "media_player.family_room_2",
@@ -681,12 +448,15 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
volume_level: 0.18,
is_volume_muted: false,
media_content_type: "music",
media_duration: 155,
media_duration: 300,
media_position: 0,
media_position_updated_at: "2019-05-09T16:21:57.112Z",
media_title: "Ek Ladki Ko Dekha Toh Aisa Laga - Title Track",
media_artist: "Rochak Kohli",
media_album_name: "Ek Ladki Ko Dekha Toh Aisa Laga",
media_position_updated_at: new Date(
// 23 seconds in
new Date().getTime() - 23000
).toISOString(),
media_title: "I Wasn't Born To Follow",
media_artist: "The Byrds",
media_album_name: "The Notorious Byrd Brothers",
source_list: [
"Bollywood Hindi Hits",
"Bollywood Radio and Beyond",
@@ -704,15 +474,13 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
sonos_group: ["media_player.family_room_2"],
night_sound: false,
speech_enhance: false,
friendly_name: "Family Room",
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.names.family_room"
),
entity_picture:
"/api/media_player_proxy/media_player.family_room_2?token=be41a86e2a360761d67c36a010b09654b730deec092016ee92aafef79b1978ff&cache=e03d22fb103202e7",
supported_features: 64063,
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:04.802095+00:00",
last_updated: "2019-01-22T17:00:04.802095+00:00",
context: { id: "a4dfb3301f2149758368952e080d3247", user_id: null },
},
"sensor.ring_front_door_last_ding": {
entity_id: "sensor.ring_front_door_last_ding",
@@ -731,25 +499,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
category: "ding",
friendly_name: "Front Door Last Ding",
icon: "hademo:history",
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:04.444969+00:00",
last_updated: "2019-01-22T17:00:04.444969+00:00",
context: { id: "8ae2198d1fd446f48ebdbcbb10c9bcde", user_id: null },
},
"light.lifxnrkitchen": {
entity_id: "light.lifxnrkitchen",
state: "off",
attributes: {
min_mireds: 111,
max_mireds: 400,
friendly_name: "LifxnrKitchen",
supported_features: 55,
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:05.570989+00:00",
last_updated: "2019-01-22T17:00:05.570989+00:00",
context: { id: "67f4c61e3a354ea99097bd5f43a88490", user_id: null },
},
"light.lifx5": {
entity_id: "light.lifx5",
@@ -759,56 +509,7 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
max_mireds: 400,
friendly_name: "Garage lights",
supported_features: 55,
homebridge_hidden: false,
emulated_hue_hidden: false,
emulated_hue_name: "Garage Lights",
},
last_changed: "2019-01-22T17:00:05.580826+00:00",
last_updated: "2019-01-22T17:00:05.580826+00:00",
context: { id: "86f413dff85b44a491305279fa7f8939", user_id: null },
},
"light.lifxnrguest": {
entity_id: "light.lifxnrguest",
state: "off",
attributes: {
min_mireds: 111,
max_mireds: 400,
friendly_name: "LifxnrGuest",
supported_features: 55,
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:05.587119+00:00",
last_updated: "2019-01-22T17:00:05.587119+00:00",
context: { id: "8ee6c032fd784171a509a93c7a33197e", user_id: null },
},
"light.lifx3": {
entity_id: "light.lifx3",
state: "off",
attributes: {
min_mireds: 111,
max_mireds: 400,
friendly_name: "Lifx3",
supported_features: 55,
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:05.587973+00:00",
last_updated: "2019-01-22T17:00:05.587973+00:00",
context: { id: "8ad5cc04e437477fa495ecf7de36a7b8", user_id: null },
},
"sensor.illumination_158d00016c53bf": {
entity_id: "sensor.illumination_158d00016c53bf",
state: "10",
attributes: {
battery_level: 43,
unit_of_measurement: "lx",
friendly_name: "Master Brightness",
device_class: "illuminance",
homebridge_hidden: true,
icon: "hademo:brightness-7",
},
last_changed: "2019-01-22T19:34:01.373772+00:00",
last_updated: "2019-01-22T19:34:01.373772+00:00",
context: { id: "2582b7ad576746b1b3ade68adb64c878", user_id: null },
},
"sensor.alok_to_home": {
entity_id: "sensor.alok_to_home",
@@ -823,13 +524,11 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
duration: "44 mins",
distance: "34.3 mi",
unit_of_measurement: "min",
friendly_name: "Commute to Home",
homebridge_hidden: true,
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.commute_home"
),
icon: "hademo:car",
},
last_changed: "2019-01-22T17:00:15.963892+00:00",
last_updated: "2019-01-22T17:00:15.963892+00:00",
context: { id: "16e423e342274086b26b15de787cea3c", user_id: null },
},
"sensor.morning_commute": {
entity_id: "sensor.morning_commute",
@@ -844,74 +543,24 @@ export const demoEntitiesArsaboo: () => Entity[] = () =>
duration: "37 mins",
distance: "30.2 mi",
unit_of_measurement: "min",
friendly_name: "Morning Commute",
homebridge_hidden: true,
friendly_name: localize(
"ui.panel.page-demo.config.arsaboo.labels.morning_commute"
),
icon: "hademo:car",
},
last_changed: "2019-01-22T17:00:16.142799+00:00",
last_updated: "2019-01-22T17:00:16.142799+00:00",
context: { id: "fc0ee1d25cc941ce9ead8a8cefdf3df9", user_id: null },
},
"switch.wemoswitch": {
entity_id: "switch.wemoswitch",
state: "on",
attributes: { friendly_name: "WeMoSwitch", homebridge_hidden: true },
last_changed: "2019-01-22T17:00:22.455617+00:00",
last_updated: "2019-01-22T17:00:22.455617+00:00",
context: { id: "d5ddc6e4c88f436ab372934934c8675e", user_id: null },
},
"switch.wemoinsight": {
entity_id: "switch.wemoinsight",
state: "off",
attributes: {
state_detail: "off",
on_latest_time: "00d 00h 00m 17s",
on_today_time: "00d 00h 00m 00s",
on_total_time: "00d 21h 49m 35s",
power_threshold_w: 2,
friendly_name: "WeMoInsight",
homebridge_hidden: true,
},
last_changed: "2019-01-22T17:00:22.397783+00:00",
last_updated: "2019-01-22T17:00:22.492778+00:00",
context: { id: "1ff8d42d21084350acbdb6002551fc61", user_id: null },
},
"switch.driveway": {
entity_id: "switch.driveway",
state: "off",
attributes: {
friendly_name: "Driveway Light",
homebridge_hidden: false,
templates: {
icon_color:
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
icon:
"if (state === 'on') return 'hademo:lightbulb-on'; return 'hademo:lightbulb';\n",
},
emulated_hue_hidden: false,
emulated_hue_name: "Driveway Light",
},
last_changed: "2019-01-22T17:00:22.398939+00:00",
last_updated: "2019-01-22T17:00:22.398939+00:00",
context: { id: "422aaa88552048fba49ad02c698d878e", user_id: null },
},
"switch.wemoporch": {
entity_id: "switch.wemoporch",
state: "off",
attributes: {
friendly_name: "Porch Lights",
homebridge_hidden: false,
templates: {
icon_color:
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
icon:
"if (state === 'on') return 'hademo:lightbulb-on'; return 'hademo:lightbulb';\n",
},
emulated_hue_hidden: false,
emulated_hue_name: "Porch Lights",
},
last_changed: "2019-01-22T17:00:22.435345+00:00",
last_updated: "2019-01-22T17:00:22.435345+00:00",
context: { id: "fdbe1a67cfc64adc8bfafeb84bcd12ad", user_id: null },
},
});

File diff suppressed because it is too large Load Diff

View File

@@ -3,10 +3,22 @@ import { Lovelace } from "../../../src/panels/lovelace/types";
import { DemoConfig } from "./types";
export const demoConfigs: Array<() => Promise<DemoConfig>> = [
() => import("./arsaboo").then((mod) => mod.demoArsaboo),
() => import("./teachingbirds").then((mod) => mod.demoTeachingbirds),
() => import("./kernehed").then((mod) => mod.demoKernehed),
() => import("./jimpower").then((mod) => mod.demoJimpower),
() =>
import(/* webpackChunkName: "arsaboo" */ "./arsaboo").then(
(mod) => mod.demoArsaboo
),
() =>
import(/* webpackChunkName: "teachingbirds" */ "./teachingbirds").then(
(mod) => mod.demoTeachingbirds
),
() =>
import(/* webpackChunkName: "kernehed" */ "./kernehed").then(
(mod) => mod.demoKernehed
),
() =>
import(/* webpackChunkName: "jimpower" */ "./jimpower").then(
(mod) => mod.demoJimpower
),
];
export let selectedDemoConfigIndex: number = 0;
@@ -25,7 +37,7 @@ export const setDemoConfig = async (
selectedDemoConfigIndex = index;
selectedDemoConfig = confProm;
hass.addEntities(config.entities(), true);
lovelace.saveConfig(config.lovelace());
hass.addEntities(config.entities(hass.localize), true);
lovelace.saveConfig(config.lovelace(hass.localize));
hass.mockTheme(config.theme());
};

View File

@@ -1,6 +1,7 @@
import { Entity, convertEntities } from "../../../../src/fake_data/entity";
import { convertEntities } from "../../../../src/fake_data/entity";
import { DemoConfig } from "../types";
export const demoEntitiesJimpower: () => Entity[] = () =>
export const demoEntitiesJimpower: DemoConfig["entities"] = () =>
convertEntities({
"zone.powertec": {
entity_id: "zone.powertec",
@@ -11,9 +12,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Powertec",
icon: "mdi:briefcase",
},
last_changed: "2019-01-14T08:56:59.430813+00:00",
last_updated: "2019-01-14T08:56:59.430813+00:00",
context: { id: "c1120d64a06142dab9d7c34fd7d937e6", user_id: null },
},
"zone.kindy": {
entity_id: "zone.kindy",
@@ -24,9 +22,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Kindy",
icon: "mdi:school",
},
last_changed: "2019-01-14T08:56:59.430969+00:00",
last_updated: "2019-01-14T08:56:59.430969+00:00",
context: { id: "a4218f348e5f4a7cbdfdd25874d10570", user_id: null },
},
"zone.stocklands": {
entity_id: "zone.stocklands",
@@ -37,9 +32,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Stocklands",
icon: "mdi:cart",
},
last_changed: "2019-01-14T08:56:59.431095+00:00",
last_updated: "2019-01-14T08:56:59.431095+00:00",
context: { id: "689e63e51bd44de5bd93087c82cfa984", user_id: null },
},
"zone.parlour": {
entity_id: "zone.parlour",
@@ -50,9 +42,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Parlour",
icon: "mdi:coffee",
},
last_changed: "2019-01-14T08:56:59.431219+00:00",
last_updated: "2019-01-14T08:56:59.431219+00:00",
context: { id: "fd7e2e644cc54f368bc4d7105fc504a4", user_id: null },
},
"zone.work_home_beacon_25mins": {
entity_id: "zone.work_home_beacon_25mins",
@@ -63,9 +52,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Work Home Beacon 25mins",
icon: "mdi:car",
},
last_changed: "2019-01-14T08:56:59.431340+00:00",
last_updated: "2019-01-14T08:56:59.431340+00:00",
context: { id: "3dd3290258974c57a20d847905ac4035", user_id: null },
},
"zone.work_home_beacon_15mins": {
entity_id: "zone.work_home_beacon_15mins",
@@ -76,9 +62,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Work Home Beacon 15mins",
icon: "mdi:car",
},
last_changed: "2019-01-14T08:56:59.431463+00:00",
last_updated: "2019-01-14T08:56:59.431463+00:00",
context: { id: "a46b76ccc3ed4e19b32ed0ae1487e0c3", user_id: null },
},
"zone.work_home_beacon_5mins": {
entity_id: "zone.work_home_beacon_5mins",
@@ -89,9 +72,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Work Home Beacon 5mins",
icon: "mdi:car",
},
last_changed: "2019-01-14T08:56:59.431585+00:00",
last_updated: "2019-01-14T08:56:59.431585+00:00",
context: { id: "4059a802ae224f4e83d7f22f5946f6fb", user_id: null },
},
"zone.darwin": {
entity_id: "zone.darwin",
@@ -102,9 +82,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Darwin",
icon: "mdi:airplane",
},
last_changed: "2019-01-14T08:56:59.431704+00:00",
last_updated: "2019-01-14T08:56:59.431704+00:00",
context: { id: "d1b9cc62453e48d78fac4de7eceac848", user_id: null },
},
"zone.brisbane": {
entity_id: "zone.brisbane",
@@ -115,9 +92,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Brisbane",
icon: "mdi:car",
},
last_changed: "2019-01-14T08:56:59.431821+00:00",
last_updated: "2019-01-14T08:56:59.431821+00:00",
context: { id: "db90c5f4e13240dfb028265f2a0c6ab2", user_id: null },
},
"zone.sydney": {
entity_id: "zone.sydney",
@@ -128,9 +102,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Sydney",
icon: "mdi:airplane",
},
last_changed: "2019-01-14T08:56:59.432543+00:00",
last_updated: "2019-01-14T08:56:59.432543+00:00",
context: { id: "b558af0f406241f2b5e0338eec3e34a8", user_id: null },
},
"zone.melbourne": {
entity_id: "zone.melbourne",
@@ -141,9 +112,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Melbourne",
icon: "mdi:airplane",
},
last_changed: "2019-01-14T08:56:59.432673+00:00",
last_updated: "2019-01-14T08:56:59.432673+00:00",
context: { id: "b864ec85733e46949bc9b20bb1d4fa46", user_id: null },
},
"zone.perth": {
entity_id: "zone.perth",
@@ -154,9 +122,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Perth",
icon: "mdi:airplane",
},
last_changed: "2019-01-14T08:56:59.432794+00:00",
last_updated: "2019-01-14T08:56:59.432794+00:00",
context: { id: "d450738483f74e2194c7d52dc540cc70", user_id: null },
},
"zone.adelaide": {
entity_id: "zone.adelaide",
@@ -167,9 +132,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Adelaide",
icon: "mdi:airplane",
},
last_changed: "2019-01-14T08:56:59.432912+00:00",
last_updated: "2019-01-14T08:56:59.432912+00:00",
context: { id: "9964d216d1e841c88f7c847d21cdaeac", user_id: null },
},
"zone.tasmania": {
entity_id: "zone.tasmania",
@@ -180,9 +142,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Tasmania",
icon: "mdi:airplane",
},
last_changed: "2019-01-14T08:56:59.433033+00:00",
last_updated: "2019-01-14T08:56:59.433033+00:00",
context: { id: "097127a6a4c1420dbb7f714cdb47769b", user_id: null },
},
"zone.uk": {
entity_id: "zone.uk",
@@ -193,9 +152,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "UK",
icon: "mdi:earth",
},
last_changed: "2019-01-14T08:56:59.433150+00:00",
last_updated: "2019-01-14T08:56:59.433150+00:00",
context: { id: "dff58ae59b9048ecbdded5dbdfc8edc8", user_id: null },
},
"zone.france": {
entity_id: "zone.france",
@@ -206,9 +162,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "France",
icon: "mdi:earth",
},
last_changed: "2019-01-14T08:56:59.433279+00:00",
last_updated: "2019-01-14T08:56:59.433279+00:00",
context: { id: "f0dbc9fe806a452481080de7df6e8b06", user_id: null },
},
"zone.netherlands": {
entity_id: "zone.netherlands",
@@ -219,9 +172,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Netherlands",
icon: "mdi:earth",
},
last_changed: "2019-01-14T08:56:59.433395+00:00",
last_updated: "2019-01-14T08:56:59.433395+00:00",
context: { id: "4d59ecf66b434bb48fa116e9e263617f", user_id: null },
},
"zone.switzerland": {
entity_id: "zone.switzerland",
@@ -232,9 +182,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Switzerland",
icon: "mdi:earth",
},
last_changed: "2019-01-14T08:56:59.433511+00:00",
last_updated: "2019-01-14T08:56:59.433511+00:00",
context: { id: "eaf56c63c2fa4b64bc2d9f57c299fd4e", user_id: null },
},
"zone.italy": {
entity_id: "zone.italy",
@@ -245,9 +192,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Italy",
icon: "mdi:earth",
},
last_changed: "2019-01-14T08:56:59.433628+00:00",
last_updated: "2019-01-14T08:56:59.433628+00:00",
context: { id: "8d2af1ca5e064a9a859261375357420f", user_id: null },
},
"zone.home": {
entity_id: "zone.home",
@@ -258,9 +202,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Kingia Castle",
icon: "mdi:home",
},
last_changed: "2019-01-14T08:56:59.433746+00:00",
last_updated: "2019-01-14T08:56:59.433746+00:00",
context: { id: "87c9fa771f9943bd9b91957e2fd2bb17", user_id: null },
},
"sensor.lower_temperature": {
entity_id: "sensor.lower_temperature",
@@ -275,9 +216,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Downstairs Temperature",
icon: "mdi:sofa",
},
last_changed: "2019-01-18T19:27:15.224071+00:00",
last_updated: "2019-01-18T19:27:15.224071+00:00",
context: { id: "d2efd90df9214a55b2fb52d3d547af54", user_id: null },
},
"sensor.upstairs_temperature": {
entity_id: "sensor.upstairs_temperature",
@@ -292,9 +230,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Upstairs Temperature",
icon: "mdi:hotel",
},
last_changed: "2019-01-18T19:23:10.307890+00:00",
last_updated: "2019-01-18T19:23:10.307890+00:00",
context: { id: "aeead40329e14918a5f4024f57a4b8ba", user_id: null },
},
"sensor.next_bus": {
entity_id: "sensor.next_bus",
@@ -304,9 +239,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Time to Next Bus",
icon: "mdi:bus-clock",
},
last_changed: "2019-01-18T19:28:01.035644+00:00",
last_updated: "2019-01-18T19:28:01.035644+00:00",
context: { id: "4aa5848850ae44e48c1159bc1ba48e9c", user_id: null },
},
"sensor.battery_tina": {
entity_id: "sensor.battery_tina",
@@ -317,9 +249,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:battery-charging",
device_class: "battery",
},
last_changed: "2019-01-18T19:26:45.464947+00:00",
last_updated: "2019-01-18T19:26:45.464947+00:00",
context: { id: "1d657ffd7bb344b8bf06ff22836bdba6", user_id: null },
},
"sensor.battery_james": {
entity_id: "sensor.battery_james",
@@ -330,9 +259,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "",
device_class: "battery",
},
last_changed: "2019-01-18T12:17:52.040153+00:00",
last_updated: "2019-01-18T18:58:35.848089+00:00",
context: { id: "81f5a90f05e24d3795e2e99c80b4ce15", user_id: null },
},
"sensor.james": {
entity_id: "sensor.james",
@@ -342,9 +268,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:walk",
entity_picture: "/local/james.jpg",
},
last_changed: "2019-01-18T06:31:24.315507+00:00",
last_updated: "2019-01-18T06:31:24.315507+00:00",
context: { id: "e24c5331fdca4055829f5905f9006377", user_id: null },
},
"sensor.tina": {
entity_id: "sensor.tina",
@@ -354,17 +277,11 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:walk",
entity_picture: "/local/tina.jpg",
},
last_changed: "2019-01-18T03:12:11.415222+00:00",
last_updated: "2019-01-18T03:12:11.415222+00:00",
context: { id: "97c677519d2c41258e09754742b1a661", user_id: null },
},
"sensor.aqi": {
entity_id: "sensor.aqi",
state: "20",
attributes: { friendly_name: "Air Quality Index" },
last_changed: "2019-01-18T18:57:27.696759+00:00",
last_updated: "2019-01-18T18:57:27.696759+00:00",
context: { id: "96a025a4d52849efbe53b4790ab0584d", user_id: null },
},
"sensor.bom_temp": {
entity_id: "sensor.bom_temp",
@@ -374,97 +291,61 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Gold Coast Temperature",
device_class: "temperature",
},
last_changed: "2019-01-18T19:05:22.110622+00:00",
last_updated: "2019-01-18T19:05:22.110622+00:00",
context: { id: "a793308a4653496fa5676fe42725d7b7", user_id: null },
},
"sensor.forks": {
entity_id: "sensor.forks",
state: "32",
attributes: { friendly_name: "forks" },
last_changed: "2019-01-17T01:58:06.790553+00:00",
last_updated: "2019-01-17T01:58:06.790553+00:00",
context: { id: "06af241838484b9596881681be5a4012", user_id: null },
},
"sensor.stars_last_week": {
entity_id: "sensor.stars_last_week",
state: "0",
attributes: { friendly_name: "Last Week" },
last_changed: "2019-01-14T08:58:04.014555+00:00",
last_updated: "2019-01-14T08:58:04.014555+00:00",
context: { id: "4aa610a907e849efa8b32a78e807fce3", user_id: null },
},
"sensor.issues": {
entity_id: "sensor.issues",
state: "26",
attributes: { friendly_name: "issues" },
last_changed: "2019-01-16T07:57:51.055084+00:00",
last_updated: "2019-01-16T07:57:51.055084+00:00",
context: { id: "8cb53830772549eface4d8737b3f766f", user_id: null },
},
"sensor.stars": {
entity_id: "sensor.stars",
state: "282",
attributes: { friendly_name: "stars" },
last_changed: "2019-01-16T21:58:01.522658+00:00",
last_updated: "2019-01-16T21:58:01.522658+00:00",
context: { id: "6943e39111ea49629262802740195c3d", user_id: null },
},
"sensor.stars_this_month": {
entity_id: "sensor.stars_this_month",
state: "12",
attributes: { friendly_name: "This Month" },
last_changed: "2019-01-16T21:58:01.559398+00:00",
last_updated: "2019-01-16T21:58:01.559398+00:00",
context: { id: "e6ddf5e4348842c2966bac17d82930fd", user_id: null },
},
"sensor.stars_last_month": {
entity_id: "sensor.stars_last_month",
state: "0",
attributes: { friendly_name: "Last Month" },
last_changed: "2019-01-14T08:58:04.022654+00:00",
last_updated: "2019-01-14T08:58:04.022654+00:00",
context: { id: "0cf396f4f5b34243824b3c8221017ddf", user_id: null },
},
"sensor.git_stars_next_dif": {
entity_id: "sensor.git_stars_next_dif",
state: "45",
attributes: { friendly_name: "Next Target" },
last_changed: "2019-01-18T08:58:36.490901+00:00",
last_updated: "2019-01-18T08:58:36.490901+00:00",
context: { id: "78c815150be545ab9d515988ac537f06", user_id: null },
},
"sensor.git_stars_last_dif": {
entity_id: "sensor.git_stars_last_dif",
state: "31",
attributes: { friendly_name: "Next Target" },
last_changed: "2019-01-17T21:58:23.379460+00:00",
last_updated: "2019-01-17T21:58:23.379460+00:00",
context: { id: "6dd2104a5e86400ebc9c448fe8557574", user_id: null },
},
"sensor.subscribers": {
entity_id: "sensor.subscribers",
state: "32",
attributes: { friendly_name: "subscribers" },
last_changed: "2019-01-15T12:57:30.802676+00:00",
last_updated: "2019-01-15T12:57:30.802676+00:00",
context: { id: "17585750a5cb4a4db64bcae7d52d8899", user_id: null },
},
"sensor.stars_this_week": {
entity_id: "sensor.stars_this_week",
state: "12",
attributes: { friendly_name: "This Week" },
last_changed: "2019-01-16T21:58:01.556195+00:00",
last_updated: "2019-01-16T21:58:01.556195+00:00",
context: { id: "aa97170544654051860768b744d7b748", user_id: null },
},
"sensor.git_stars_trend_dif": {
entity_id: "sensor.git_stars_trend_dif",
state: "1486",
attributes: { friendly_name: "Trending Target" },
last_changed: "2019-01-17T17:58:22.314538+00:00",
last_updated: "2019-01-17T17:58:22.314538+00:00",
context: { id: "35d95c7dc5c543dab6e9c808f62b711c", user_id: null },
},
"binary_sensor.james_bag_status": {
entity_id: "binary_sensor.james_bag_status",
@@ -474,9 +355,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:briefcase",
device_class: "connectivity",
},
last_changed: "2019-01-14T21:12:17.037576+00:00",
last_updated: "2019-01-14T21:12:17.037576+00:00",
context: { id: "f5c6084b5e9c4d6e9e0734a4a6dbd85e", user_id: null },
},
"binary_sensor.tina_gps_status": {
entity_id: "binary_sensor.tina_gps_status",
@@ -486,9 +364,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:crosshairs-gps",
device_class: "connectivity",
},
last_changed: "2019-01-18T03:12:11.391690+00:00",
last_updated: "2019-01-18T03:12:11.391690+00:00",
context: { id: "4940a85adbb24fbd8472f4b647a4372f", user_id: null },
},
"binary_sensor.tina_ble_status": {
entity_id: "binary_sensor.tina_ble_status",
@@ -498,9 +373,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:bluetooth-audio",
device_class: "connectivity",
},
last_changed: "2019-01-14T08:58:04.037535+00:00",
last_updated: "2019-01-14T08:58:04.037535+00:00",
context: { id: "5c4a4e92e0ab4d1898783feeb895e12a", user_id: null },
},
"binary_sensor.james_car_status": {
entity_id: "binary_sensor.james_car_status",
@@ -510,9 +382,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:car-side",
device_class: "connectivity",
},
last_changed: "2019-01-14T21:11:24.613784+00:00",
last_updated: "2019-01-14T21:11:24.613784+00:00",
context: { id: "e808b25e595346fcb06a365ee1fd49ff", user_id: null },
},
"binary_sensor.james_ble_status": {
entity_id: "binary_sensor.james_ble_status",
@@ -522,9 +391,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:bluetooth-audio",
device_class: "connectivity",
},
last_changed: "2019-01-14T20:45:44.607734+00:00",
last_updated: "2019-01-14T20:45:44.607734+00:00",
context: { id: "9663630a8bd24ee3a269bb6e7d4ab024", user_id: null },
},
"binary_sensor.tina_keys_status": {
entity_id: "binary_sensor.tina_keys_status",
@@ -534,9 +400,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:key",
device_class: "connectivity",
},
last_changed: "2019-01-14T08:58:04.041286+00:00",
last_updated: "2019-01-14T08:58:04.041286+00:00",
context: { id: "48d44191df8841f5bc2f4d148db269c1", user_id: null },
},
"binary_sensor.james_keys_status": {
entity_id: "binary_sensor.james_keys_status",
@@ -546,9 +409,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:key",
device_class: "connectivity",
},
last_changed: "2019-01-14T21:11:07.377711+00:00",
last_updated: "2019-01-14T21:11:07.377711+00:00",
context: { id: "a965c2cf10b54e328a75db3de2833a02", user_id: null },
},
"binary_sensor.james_gps_status": {
entity_id: "binary_sensor.james_gps_status",
@@ -558,9 +418,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:crosshairs-gps",
device_class: "connectivity",
},
last_changed: "2019-01-18T06:31:24.293839+00:00",
last_updated: "2019-01-18T06:31:24.293839+00:00",
context: { id: "800d6eef0ce141448c9f576ee43c0672", user_id: null },
},
"binary_sensor.garage": {
entity_id: "binary_sensor.garage",
@@ -570,33 +427,21 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:garage",
device_class: "door",
},
last_changed: "2019-01-18T05:32:29.053625+00:00",
last_updated: "2019-01-18T05:32:29.053625+00:00",
context: { id: "bf35d862a2214198a0f7a945eabf36d2", user_id: null },
},
"binary_sensor.recycle": {
entity_id: "binary_sensor.recycle",
state: "off",
attributes: { friendly_name: "Recycle", icon: "mdi:recycle" },
last_changed: "2019-01-14T08:57:00.348349+00:00",
last_updated: "2019-01-14T08:58:04.463267+00:00",
context: { id: "76ef24942b0b4822bde851fc9e5e1b37", user_id: null },
},
"binary_sensor.trash": {
entity_id: "binary_sensor.trash",
state: "off",
attributes: { friendly_name: "Trash", icon: "mdi:delete" },
last_changed: "2019-01-15T14:00:01.040666+00:00",
last_updated: "2019-01-15T14:00:01.040666+00:00",
context: { id: "7bb9aaeb1b6b41e3be746e200a452318", user_id: null },
},
"binary_sensor.alarm": {
entity_id: "binary_sensor.alarm",
state: "off",
attributes: { friendly_name: "Alarm", icon: "mdi:security-home" },
last_changed: "2019-01-14T08:57:00.349685+00:00",
last_updated: "2019-01-18T11:17:13.014318+00:00",
context: { id: "16fd03ae798d4abc8d3ca6189b9a9e19", user_id: null },
},
"binary_sensor.windows": {
entity_id: "binary_sensor.windows",
@@ -606,9 +451,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:window-open",
device_class: "window",
},
last_changed: "2019-01-18T09:04:17.995330+00:00",
last_updated: "2019-01-18T09:04:17.995330+00:00",
context: { id: "38e6c51af4a643a1aaffacc473459d66", user_id: null },
},
"binary_sensor.doors": {
entity_id: "binary_sensor.doors",
@@ -618,9 +460,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:door-closed",
device_class: "door",
},
last_changed: "2019-01-18T19:17:16.499271+00:00",
last_updated: "2019-01-18T19:17:16.499271+00:00",
context: { id: "debe9843a732402bb62f8ee16e47fe26", user_id: null },
},
"binary_sensor.lights": {
entity_id: "binary_sensor.lights",
@@ -630,9 +469,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
icon: "mdi:lightbulb",
device_class: "light",
},
last_changed: "2019-01-18T18:59:16.225881+00:00",
last_updated: "2019-01-18T18:59:16.225881+00:00",
context: { id: "d4895a1468b34208b62a33c403ee049e", user_id: null },
},
"alarm_control_panel.ha_alarm": {
entity_id: "alarm_control_panel.ha_alarm",
@@ -643,12 +479,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "HA Alarm",
icon: "mdi:security-home",
},
last_changed: "2019-01-18T18:59:16.103038+00:00",
last_updated: "2019-01-18T18:59:16.103038+00:00",
context: {
id: "c4e3fa0f7f29431087bcef1a6f55fc3b",
user_id: "c6d308d516b841e68b14427624fd13e0",
},
},
"binary_sensor.door_window_sensor_158d0001e73c09": {
entity_id: "binary_sensor.door_window_sensor_158d0001e73c09",
@@ -659,9 +489,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Back Door Sensor",
device_class: "door",
},
last_changed: "2019-01-18T19:17:16.489053+00:00",
last_updated: "2019-01-18T19:17:16.489053+00:00",
context: { id: "8ddde2fbee0f4dacaed736752d30da79", user_id: null },
},
"binary_sensor.door_window_sensor_158d0001e73af4": {
entity_id: "binary_sensor.door_window_sensor_158d0001e73af4",
@@ -672,9 +499,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Kitchen Window",
device_class: "window",
},
last_changed: "2019-01-14T08:57:08.943587+00:00",
last_updated: "2019-01-18T04:42:35.215550+00:00",
context: { id: "6013ffc2e9c446319d1fca6795138a20", user_id: null },
},
"binary_sensor.motion_sensor_158d00022c2f21": {
entity_id: "binary_sensor.motion_sensor_158d00022c2f21",
@@ -685,9 +509,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Staircase Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T19:28:25.428449+00:00",
last_updated: "2019-01-18T19:28:25.428449+00:00",
context: { id: "c1236d8e2b3c4e5eb1c08f8b68996f3e", user_id: null },
},
"binary_sensor.door_window_sensor_158d0001e73a73": {
entity_id: "binary_sensor.door_window_sensor_158d0001e73a73",
@@ -698,9 +519,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Jackson Window",
device_class: "window",
},
last_changed: "2019-01-17T10:24:42.962509+00:00",
last_updated: "2019-01-17T10:24:42.962509+00:00",
context: { id: "19262eecf0d746c89c992350ea3187bf", user_id: null },
},
"binary_sensor.motion_sensor_158d000201351c": {
entity_id: "binary_sensor.motion_sensor_158d000201351c",
@@ -711,9 +529,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Jackson Room Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T19:26:18.055694+00:00",
last_updated: "2019-01-18T19:28:11.133616+00:00",
context: { id: "aed85caae799477ab769c878d2fc3aa0", user_id: null },
},
"binary_sensor.door_window_sensor_158d0001e73aad": {
entity_id: "binary_sensor.door_window_sensor_158d0001e73aad",
@@ -724,9 +539,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Hudson Window",
device_class: "window",
},
last_changed: "2019-01-18T05:29:44.504900+00:00",
last_updated: "2019-01-18T05:29:44.504900+00:00",
context: { id: "72facb8dbed94e978cfcd6ad60da21e7", user_id: null },
},
"binary_sensor.motion_sensor_158d0002006d46": {
entity_id: "binary_sensor.motion_sensor_158d0002006d46",
@@ -737,9 +549,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Hudson Room Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T19:27:20.044976+00:00",
last_updated: "2019-01-18T19:28:01.700029+00:00",
context: { id: "121952f287dc41868870891690b7ab18", user_id: null },
},
"binary_sensor.door_window_sensor_158d0001e74875": {
entity_id: "binary_sensor.door_window_sensor_158d0001e74875",
@@ -750,9 +559,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Bathroom Window",
device_class: "window",
},
last_changed: "2019-01-18T09:04:17.963573+00:00",
last_updated: "2019-01-18T16:07:38.652287+00:00",
context: { id: "83ce1b87de414a23a1223d3721712b15", user_id: null },
},
"binary_sensor.motion_sensor_158d000200e4ab": {
entity_id: "binary_sensor.motion_sensor_158d000200e4ab",
@@ -763,9 +569,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Bathroom Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T17:04:51.065363+00:00",
last_updated: "2019-01-18T17:33:37.358909+00:00",
context: { id: "bb4d6ec2c1634194a843b93cc64474a2", user_id: null },
},
"binary_sensor.motion_sensor_158d0001e5d118": {
entity_id: "binary_sensor.motion_sensor_158d0001e5d118",
@@ -776,9 +579,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Living Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T19:28:32.639483+00:00",
last_updated: "2019-01-18T19:28:32.639483+00:00",
context: { id: "19858190bb284f9280cc521ee5ea7a08", user_id: null },
},
"binary_sensor.motion_sensor_158d0001e63803": {
entity_id: "binary_sensor.motion_sensor_158d0001e63803",
@@ -789,9 +589,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Bedroom Motion Densor",
device_class: "motion",
},
last_changed: "2019-01-18T19:27:20.031506+00:00",
last_updated: "2019-01-18T19:28:05.990986+00:00",
context: { id: "3907daecb7fe49638b3d4dcbf716050a", user_id: null },
},
"binary_sensor.door_window_sensor_158d0001f36741": {
entity_id: "binary_sensor.door_window_sensor_158d0001f36741",
@@ -802,9 +599,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Bedroom Window",
device_class: "window",
},
last_changed: "2019-01-18T09:36:45.480842+00:00",
last_updated: "2019-01-18T09:41:44.724656+00:00",
context: { id: "52bfda25d7fe4945a07c1b667909afde", user_id: null },
},
"binary_sensor.motion_sensor_158d000200ea5b": {
entity_id: "binary_sensor.motion_sensor_158d000200ea5b",
@@ -815,9 +609,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Patio Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T19:02:44.124615+00:00",
last_updated: "2019-01-18T19:20:41.377013+00:00",
context: { id: "bd79ecfe99884ecfaff483569412332a", user_id: null },
},
"binary_sensor.water_leak_sensor_158d00026e26dc": {
entity_id: "binary_sensor.water_leak_sensor_158d00026e26dc",
@@ -827,9 +618,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Kitchen Leak Sensor",
device_class: "moisture",
},
last_changed: "2019-01-14T08:57:08.966446+00:00",
last_updated: "2019-01-15T21:46:47.375891+00:00",
context: { id: "f4bfeb155fed4da5a84911c8e4f382b9", user_id: null },
},
"binary_sensor.door_window_sensor_158d000225432d": {
entity_id: "binary_sensor.door_window_sensor_158d000225432d",
@@ -840,9 +628,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Patio Door Sensor",
device_class: "door",
},
last_changed: "2019-01-18T11:08:54.826953+00:00",
last_updated: "2019-01-18T11:08:54.826953+00:00",
context: { id: "3be61e6b08df4539bb5be17c46c57eb2", user_id: null },
},
"binary_sensor.door_window_sensor_158d00022016b2": {
entity_id: "binary_sensor.door_window_sensor_158d00022016b2",
@@ -853,9 +638,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Front Door Sensor",
device_class: "door",
},
last_changed: "2019-01-18T11:15:37.170616+00:00",
last_updated: "2019-01-18T11:15:37.170616+00:00",
context: { id: "18dee29b96d9475587974e9fe23b041b", user_id: null },
},
"binary_sensor.motion_sensor_158d0001e5d147": {
entity_id: "binary_sensor.motion_sensor_158d0001e5d147",
@@ -866,9 +648,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Entrance Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T11:17:30.719455+00:00",
last_updated: "2019-01-18T11:45:26.680090+00:00",
context: { id: "de0b26c1d7494de8a5af973e6f098d7c", user_id: null },
},
"binary_sensor.smoke_sensor_158d0001b8ddc7": {
entity_id: "binary_sensor.smoke_sensor_158d0001b8ddc7",
@@ -879,9 +658,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Downstairs Smoke Detector",
device_class: "smoke",
},
last_changed: "2019-01-14T08:57:08.972973+00:00",
last_updated: "2019-01-14T08:57:08.972973+00:00",
context: { id: "55a958822b534c8ea67f2def2380c0c2", user_id: null },
},
"binary_sensor.smoke_sensor_158d0001b8deba": {
entity_id: "binary_sensor.smoke_sensor_158d0001b8deba",
@@ -892,9 +668,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Upstairs Smoke Detector",
device_class: "smoke",
},
last_changed: "2019-01-14T08:57:08.973800+00:00",
last_updated: "2019-01-14T08:57:08.973800+00:00",
context: { id: "a4df1a6a2fcd431f9fc374562317f43a", user_id: null },
},
"binary_sensor.motion_sensor_158d0001e5cf11": {
entity_id: "binary_sensor.motion_sensor_158d0001e5cf11",
@@ -905,9 +678,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Playroom Motion Sensor",
device_class: "motion",
},
last_changed: "2019-01-18T19:21:57.159579+00:00",
last_updated: "2019-01-18T19:24:56.764707+00:00",
context: { id: "c811022df9274ebf84fd14b005b58d55", user_id: null },
},
"binary_sensor.water_leak_sensor_158d0002338651": {
entity_id: "binary_sensor.water_leak_sensor_158d0002338651",
@@ -917,9 +687,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "Bathroom Leak Sensor",
device_class: "moisture",
},
last_changed: "2019-01-14T08:57:08.975457+00:00",
last_updated: "2019-01-14T08:57:08.975457+00:00",
context: { id: "402512d782014da9ac2fd57e2c984f40", user_id: null },
},
"sensor.us_air_pollution_level_2": {
entity_id: "sensor.us_air_pollution_level_2",
@@ -931,9 +698,6 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "U.S. Air Pollution Level",
icon: "mdi:emoticon-excited",
},
last_changed: "2019-01-15T04:59:09.009635+00:00",
last_updated: "2019-01-15T04:59:09.009635+00:00",
context: { id: "5ba0cfab9733498eb1ccf06d8c88cb67", user_id: null },
},
"sensor.us_main_pollutant_2": {
entity_id: "sensor.us_main_pollutant_2",
@@ -947,8 +711,5 @@ export const demoEntitiesJimpower: () => Entity[] = () =>
friendly_name: "U.S. Main Pollutant",
icon: "mdi:chemical-weapon",
},
last_changed: "2019-01-15T04:49:08.675430+00:00",
last_updated: "2019-01-15T04:49:08.675430+00:00",
context: { id: "15f2b232efd94c5fbeef00a51bb4dd41", user_id: null },
},
});

View File

@@ -1,7 +1,7 @@
import { LovelaceConfig } from "../../../../src/data/lovelace";
import "../../custom-cards/card-modder";
import { DemoConfig } from "../types";
export const demoLovelaceJimpower: () => LovelaceConfig = () => ({
export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
name: "Kingia Castle",
resources: [
// {

View File

@@ -23,27 +23,24 @@ export const demoThemeJimpower = () => ({
"paper-listbox-background-color": "#2E333A",
"table-row-background-color": "#353840",
"paper-grey-50": "var(--primary-text-color)",
"paper-toggle-button-checked-button-color": "var(--accent-color)",
"switch-checked-color": "var(--accent-color)",
"paper-dialog-background-color": "#434954",
"secondary-text-color": "#5294E2",
"google-red-500": "#E45E65",
"divider-color": "rgba(0, 0, 0, .12)",
"paper-toggle-button-unchecked-ink-color": "var(--disabled-text-color)",
"google-green-500": "#39E949",
"paper-toggle-button-unchecked-button-color": "var(--disabled-text-color)",
"switch-unchecked-button-color": "var(--disabled-text-color)",
"label-badge-border-color": "green",
"paper-listbox-color": "var(--primary-color)",
"paper-slider-disabled-secondary-color": "var(--disabled-text-color)",
"paper-toggle-button-checked-ink-color": "var(--accent-color)",
"paper-card-background-color": "#434954",
"label-badge-text-color": "var(--primary-text-color)",
"paper-slider-knob-start-color": "var(--accent-color)",
"paper-toggle-button-unchecked-bar-color": "var(--disabled-text-color)",
"switch-unchecked-track-color": "var(--disabled-text-color)",
"dark-primary-color": "var(--accent-color)",
"paper-slider-secondary-color": "var(--secondary-background-color)",
"paper-slider-pin-color": "var(--accent-color)",
"paper-item-icon-active-color": "#F9C536",
"accent-color": "#E45E65",
"paper-toggle-button-checked-bar-color": "var(--accent-color)",
"table-row-alternative-background-color": "#3E424B",
});

View File

@@ -1,6 +1,7 @@
import { Entity, convertEntities } from "../../../../src/fake_data/entity";
import { convertEntities } from "../../../../src/fake_data/entity";
import { DemoConfig } from "../types";
export const demoEntitiesKernehed: () => Entity[] = () =>
export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
convertEntities({
"zone.anna": {
entity_id: "zone.anna",
@@ -11,9 +12,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Anna",
icon: "mdi:home-variant",
},
last_changed: "2019-01-18T15:51:22.731926+00:00",
last_updated: "2019-01-18T15:51:22.731926+00:00",
context: { id: "77f8305e96e24d8ebbac1d52a394f725", user_id: null },
},
"zone.peak_hq": {
entity_id: "zone.peak_hq",
@@ -24,9 +22,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "PEAK HQ",
icon: "mdi:briefcase",
},
last_changed: "2019-01-18T15:51:22.732676+00:00",
last_updated: "2019-01-18T15:51:22.732676+00:00",
context: { id: "10a51d25775144ca84d19aa1fec3f473", user_id: null },
},
"zone.bellas_jobb": {
entity_id: "zone.bellas_jobb",
@@ -37,9 +32,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Bellas jobb",
icon: "mdi:briefcase",
},
last_changed: "2019-01-18T15:51:22.733288+00:00",
last_updated: "2019-01-18T15:51:22.733288+00:00",
context: { id: "c8001f0ab45f43a2b66af3dc849aca36", user_id: null },
},
"zone.geab": {
entity_id: "zone.geab",
@@ -50,9 +42,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "GEAB",
icon: "mdi:briefcase",
},
last_changed: "2019-01-18T15:51:22.733871+00:00",
last_updated: "2019-01-18T15:51:22.733871+00:00",
context: { id: "57ba8b28976649ae90ff3d0652daa551", user_id: null },
},
"zone.mamma": {
entity_id: "zone.mamma",
@@ -63,9 +52,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Mamma",
icon: "mdi:home-variant",
},
last_changed: "2019-01-18T15:51:22.735150+00:00",
last_updated: "2019-01-18T15:51:22.735150+00:00",
context: { id: "ebeb9fa7177746ddb5edd43d076b5209", user_id: null },
},
"zone.skolan": {
entity_id: "zone.skolan",
@@ -76,9 +62,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Skolan",
icon: "mdi:school",
},
last_changed: "2019-01-18T15:51:22.735883+00:00",
last_updated: "2019-01-18T15:51:22.735883+00:00",
context: { id: "70c93139b05e465e9d7f3645f473061c", user_id: null },
},
"zone.ica_fjallbacken": {
entity_id: "zone.ica_fjallbacken",
@@ -89,9 +72,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "ICA Fj\u00e4llbacken",
icon: "mdi:cart",
},
last_changed: "2019-01-18T15:51:22.736498+00:00",
last_updated: "2019-01-18T15:51:22.736498+00:00",
context: { id: "d17736ee569d4b9ab92c608bad43c14d", user_id: null },
},
"zone.tempo": {
entity_id: "zone.tempo",
@@ -102,9 +82,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Tempo",
icon: "mdi:cart",
},
last_changed: "2019-01-18T15:51:22.737081+00:00",
last_updated: "2019-01-18T15:51:22.737081+00:00",
context: { id: "e3917e5da14443ea8da81abcb9e3f0d1", user_id: null },
},
"zone.home": {
entity_id: "zone.home",
@@ -115,25 +92,16 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Hem",
icon: "mdi:home",
},
last_changed: "2019-01-18T15:51:22.737655+00:00",
last_updated: "2019-01-18T15:51:22.737655+00:00",
context: { id: "d04a42c532614232bfebbbe6c27395eb", user_id: null },
},
"sensor.total_clients_wireless": {
entity_id: "sensor.total_clients_wireless",
state: "18",
attributes: { friendly_name: "Total clients", icon: "mdi:account-group" },
last_changed: "2019-01-18T16:00:34.285208+00:00",
last_updated: "2019-01-18T16:00:34.285208+00:00",
context: { id: "6e6fe5b3265948289e7817ca7dc74bea", user_id: null },
},
"sensor.zwave_battery_front_door": {
entity_id: "sensor.zwave_battery_front_door",
state: "63",
attributes: { friendly_name: "Battery", icon: "mdi:battery-60" },
last_changed: "2019-01-18T15:55:28.392149+00:00",
last_updated: "2019-01-18T15:55:28.392149+00:00",
context: { id: "eb2f5a4c8d534e83b2bcc7f87e8a9851", user_id: null },
},
"sensor.oskar_devices": {
entity_id: "sensor.oskar_devices",
@@ -142,9 +110,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Oskar",
entity_picture: "/assets/kernehed/oscar.jpg",
},
last_changed: "2019-01-18T15:53:16.145962+00:00",
last_updated: "2019-01-18T15:53:16.145962+00:00",
context: { id: "0e20cf8e4fef40839e4c06921d95b139", user_id: null },
},
"sensor.bella_devices": {
entity_id: "sensor.bella_devices",
@@ -153,9 +118,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Bella",
entity_picture: "/assets/kernehed/bella.jpg",
},
last_changed: "2019-01-18T15:53:16.152450+00:00",
last_updated: "2019-01-18T15:53:16.152450+00:00",
context: { id: "43b2512b239f46efbdcc4241c3140b06", user_id: null },
},
"sensor.oskar_bluetooth": {
entity_id: "sensor.oskar_bluetooth",
@@ -164,9 +126,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Oskar",
entity_picture: "/assets/kernehed/oscar.jpg",
},
last_changed: "2019-01-18T16:04:26.642398+00:00",
last_updated: "2019-01-18T16:04:26.642398+00:00",
context: { id: "7d3de12e4c424bdf9242fa3128fc0a7f", user_id: null },
},
"sensor.battery_oskar": {
entity_id: "sensor.battery_oskar",
@@ -176,9 +135,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "oskar batteri",
device_class: "battery",
},
last_changed: "2019-01-18T15:54:50.511369+00:00",
last_updated: "2019-01-18T15:54:50.511369+00:00",
context: { id: "566a01d2fbf8482c9d295405aea3ef18", user_id: null },
},
"sensor.battery_bella": {
entity_id: "sensor.battery_bella",
@@ -188,9 +144,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "bella batteri",
device_class: "battery",
},
last_changed: "2019-01-18T15:53:16.248139+00:00",
last_updated: "2019-01-18T15:53:16.248139+00:00",
context: { id: "0daeaca38b584becb17ddeaff6c0821e", user_id: null },
},
"binary_sensor.unifi_camera": {
entity_id: "binary_sensor.unifi_camera",
@@ -199,9 +152,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "R\u00f6relsesensor kamera",
icon: "mdi:walk",
},
last_changed: "2019-01-18T15:51:25.599307+00:00",
last_updated: "2019-01-18T15:51:25.599307+00:00",
context: { id: "6c34816433ac4e4a8fb1d66586ff8312", user_id: null },
},
"sensor.db_size": {
entity_id: "sensor.db_size",
@@ -211,9 +161,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "DB size",
icon: "mdi:database",
},
last_changed: "2019-01-18T16:02:26.081784+00:00",
last_updated: "2019-01-18T16:02:26.081784+00:00",
context: { id: "185f9f7391a7470e95f591c3278012f7", user_id: null },
},
"input_select.christmas_pattern": {
entity_id: "input_select.christmas_pattern",
@@ -236,9 +183,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Choose pattern:",
icon: "mdi:snowflake",
},
last_changed: "2019-01-18T15:51:27.137496+00:00",
last_updated: "2019-01-18T15:51:27.137496+00:00",
context: { id: "17f2d1bc9ec345589b135d3c5d45f485", user_id: null },
},
"input_select.christmas_palette": {
entity_id: "input_select.christmas_palette",
@@ -258,9 +202,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Choose palette:",
icon: "mdi:vanish",
},
last_changed: "2019-01-18T15:51:27.138686+00:00",
last_updated: "2019-01-18T15:51:27.138686+00:00",
context: { id: "4eecf1f28d744100aef459c9262ebff8", user_id: null },
},
"binary_sensor.harmony_hub": {
entity_id: "binary_sensor.harmony_hub",
@@ -274,17 +215,11 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:remote",
},
last_changed: "2019-01-18T15:51:29.431080+00:00",
last_updated: "2019-01-18T16:01:40.417721+00:00",
context: { id: "28f6ae7c0f834c41858bb6c08d4baabf", user_id: null },
},
"switch.rest_julbelysning": {
entity_id: "switch.rest_julbelysning",
state: "on",
attributes: { friendly_name: "Julbelysning" },
last_changed: "2019-01-18T15:53:16.345017+00:00",
last_updated: "2019-01-18T15:53:16.345017+00:00",
context: { id: "0252d0bce23c4329a2beb62094d3cfe7", user_id: null },
},
"binary_sensor.ubiquiti_nvr": {
entity_id: "binary_sensor.ubiquiti_nvr",
@@ -298,9 +233,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:server-network",
},
last_changed: "2019-01-18T15:51:38.352047+00:00",
last_updated: "2019-01-18T16:01:49.078087+00:00",
context: { id: "02c4f1b1cc3447748cf7956311b27e6f", user_id: null },
},
"binary_sensor.server_1": {
entity_id: "binary_sensor.server_1",
@@ -314,9 +246,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:server-network",
},
last_changed: "2019-01-18T15:51:46.562111+00:00",
last_updated: "2019-01-18T16:01:44.857908+00:00",
context: { id: "8b3645c1acbb418f8594b30bffd8df04", user_id: null },
},
"binary_sensor.windows_server": {
entity_id: "binary_sensor.windows_server",
@@ -330,9 +259,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:server-network",
},
last_changed: "2019-01-18T15:51:51.945544+00:00",
last_updated: "2019-01-18T16:02:00.100310+00:00",
context: { id: "84fc4435143243a398235928f4d46c1c", user_id: null },
},
"binary_sensor.ubiquiti_controller": {
entity_id: "binary_sensor.ubiquiti_controller",
@@ -346,9 +272,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:server-network",
},
last_changed: "2019-01-18T15:52:00.042894+00:00",
last_updated: "2019-01-18T16:02:04.175934+00:00",
context: { id: "92d789cb452147d5b0d433f7495e1b21", user_id: null },
},
"binary_sensor.server_2": {
entity_id: "binary_sensor.server_2",
@@ -362,9 +285,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:server-network",
},
last_changed: "2019-01-18T15:52:08.637459+00:00",
last_updated: "2019-01-18T16:02:33.942666+00:00",
context: { id: "6215707ffd1d42ad9f72a40317cb2472", user_id: null },
},
"alarm_control_panel.kernehed_manison": {
entity_id: "alarm_control_panel.kernehed_manison",
@@ -531,9 +451,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
},
friendly_name: "Our Manison",
},
last_changed: "2019-01-18T15:52:08.647500+00:00",
last_updated: "2019-01-18T15:52:08.647500+00:00",
context: { id: "d7d20117f8dc430699f85ebe49d00345", user_id: null },
},
"sensor.qbittorrent_down_speed": {
entity_id: "sensor.qbittorrent_down_speed",
@@ -543,17 +460,11 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Nedladdning",
icon: "mdi:file-download",
},
last_changed: "2019-01-18T15:52:08.782929+00:00",
last_updated: "2019-01-18T15:52:08.782929+00:00",
context: { id: "a680b2cbf5d64b98b0a37595a1939197", user_id: null },
},
"sensor.qbittorrent_status": {
entity_id: "sensor.qbittorrent_status",
state: "idle",
attributes: { friendly_name: "Status", icon: "mdi:resistor" },
last_changed: "2019-01-18T15:56:54.148361+00:00",
last_updated: "2019-01-18T15:56:54.148361+00:00",
context: { id: "e7675363c274496eaa23346ff3383772", user_id: null },
},
"sensor.qbittorrent_up_speed": {
entity_id: "sensor.qbittorrent_up_speed",
@@ -563,9 +474,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Uppladdning",
icon: "mdi:file-upload",
},
last_changed: "2019-01-18T15:52:08.872888+00:00",
last_updated: "2019-01-18T15:52:08.872888+00:00",
context: { id: "cfb7424d3c54429baab49ef3dda53a33", user_id: null },
},
"sensor.pi_hole_ads_blocked_today": {
entity_id: "sensor.pi_hole_ads_blocked_today",
@@ -576,9 +484,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Pi-Hole Ads Blocked Today",
icon: "mdi:close-octagon-outline",
},
last_changed: "2019-01-18T16:03:05.284888+00:00",
last_updated: "2019-01-18T16:03:05.284888+00:00",
context: { id: "d9191530bc94401ca88a2a1aff07387d", user_id: null },
},
"sensor.pi_hole_dns_unique_clients": {
entity_id: "sensor.pi_hole_dns_unique_clients",
@@ -589,9 +494,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Pi-Hole DNS Unique Clients",
icon: "mdi:account-outline",
},
last_changed: "2019-01-18T15:52:09.605689+00:00",
last_updated: "2019-01-18T15:52:09.605689+00:00",
context: { id: "e9f0c3578ff4454fb53121d99c606e74", user_id: null },
},
"sensor.pi_hole_dns_queries_today": {
entity_id: "sensor.pi_hole_dns_queries_today",
@@ -602,9 +504,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Pi-Hole DNS Queries Today",
icon: "mdi:comment-question-outline",
},
last_changed: "2019-01-18T16:03:05.274660+00:00",
last_updated: "2019-01-18T16:03:05.274660+00:00",
context: { id: "dab495be096549438bca2bb5078e41c1", user_id: null },
},
"sensor.memory_free": {
entity_id: "sensor.memory_free",
@@ -614,9 +513,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Memory free",
icon: "mdi:memory",
},
last_changed: "2019-01-18T16:05:09.553687+00:00",
last_updated: "2019-01-18T16:05:09.553687+00:00",
context: { id: "8a208015f2c74ed39bada502922d0d0d", user_id: null },
},
"sensor.processor_use": {
entity_id: "sensor.processor_use",
@@ -626,9 +522,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Processor use",
icon: "mdi:memory",
},
last_changed: "2019-01-18T16:05:09.793229+00:00",
last_updated: "2019-01-18T16:05:09.793229+00:00",
context: { id: "c5f93e10c82a431a95f85587a5e8ce95", user_id: null },
},
"binary_sensor.gaming_pc": {
entity_id: "binary_sensor.gaming_pc",
@@ -642,9 +535,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:laptop",
},
last_changed: "2019-01-18T15:52:19.270243+00:00",
last_updated: "2019-01-18T16:02:25.800945+00:00",
context: { id: "46211ef0d63e4d75b521cf9ffe121b06", user_id: null },
},
"sensor.speedtest_download": {
entity_id: "sensor.speedtest_download",
@@ -661,9 +551,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Speedtest Download",
icon: "mdi:speedometer",
},
last_changed: "2019-01-18T16:01:02.379273+00:00",
last_updated: "2019-01-18T16:01:02.379273+00:00",
context: { id: "820da4cd237c49eb83dd1f2ad109882a", user_id: null },
},
"sensor.speedtest_upload": {
entity_id: "sensor.speedtest_upload",
@@ -680,9 +567,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Speedtest Upload",
icon: "mdi:speedometer",
},
last_changed: "2019-01-18T16:01:02.722583+00:00",
last_updated: "2019-01-18T16:01:02.722583+00:00",
context: { id: "f390680ee9b44e6aa1ae44ece757f329", user_id: null },
},
"sensor.speedtest_ping": {
entity_id: "sensor.speedtest_ping",
@@ -699,9 +583,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Speedtest Ping",
icon: "mdi:speedometer",
},
last_changed: "2019-01-18T16:01:02.809026+00:00",
last_updated: "2019-01-18T16:01:02.809026+00:00",
context: { id: "a81bd7b4f4f748b290b2156e4b43b919", user_id: null },
},
"sensor.last_boot": {
entity_id: "sensor.last_boot",
@@ -712,9 +593,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
icon: "mdi:clock",
device_class: "timestamp",
},
last_changed: "2019-01-18T15:52:24.128311+00:00",
last_updated: "2019-01-18T15:52:24.128311+00:00",
context: { id: "5d0f7cdb75074973aa06d08e3680ebbf", user_id: null },
},
"sensor.plex": {
entity_id: "sensor.plex",
@@ -724,9 +602,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Plex",
icon: "mdi:plex",
},
last_changed: "2019-01-18T15:52:24.140024+00:00",
last_updated: "2019-01-18T15:52:24.140024+00:00",
context: { id: "2f992b87ce544a489bbf2d8929b0e4a2", user_id: null },
},
"binary_sensor.teamspeak": {
entity_id: "binary_sensor.teamspeak",
@@ -740,9 +615,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:server-network",
},
last_changed: "2019-01-18T15:52:28.615587+00:00",
last_updated: "2019-01-18T16:02:21.732951+00:00",
context: { id: "73ca74db48e74164b2aeaadc6cce5d34", user_id: null },
},
"sensor.disk_free_home": {
entity_id: "sensor.disk_free_home",
@@ -752,9 +624,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Disk free /home",
icon: "mdi:harddisk",
},
last_changed: "2019-01-18T16:02:03.575620+00:00",
last_updated: "2019-01-18T16:02:03.575620+00:00",
context: { id: "02f4dad30931408081c02e89bafa1171", user_id: null },
},
"weather.smhi_vader": {
entity_id: "weather.smhi_vader",
@@ -835,9 +704,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
cloudiness: 25,
friendly_name: "V\u00e4der",
},
last_changed: "2019-01-18T15:52:33.173548+00:00",
last_updated: "2019-01-18T15:52:33.173548+00:00",
context: { id: "1c85566e7912415eb124dd9834a4f906", user_id: null },
},
"binary_sensor.ubiquiti_switch": {
entity_id: "binary_sensor.ubiquiti_switch",
@@ -851,9 +717,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:nas",
},
last_changed: "2019-01-18T15:52:35.266657+00:00",
last_updated: "2019-01-18T16:02:29.854283+00:00",
context: { id: "dc9ba8c7aa194d2bbe84331506d8320f", user_id: null },
},
"binary_sensor.entre_kamera": {
entity_id: "binary_sensor.entre_kamera",
@@ -867,9 +730,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "connectivity",
icon: "mdi:cctv",
},
last_changed: "2019-01-18T15:52:45.321631+00:00",
last_updated: "2019-01-18T16:01:55.993590+00:00",
context: { id: "511076d91fb94bafaae7d5ebe08bfee7", user_id: null },
},
"sensor.bella_tid_till_hem": {
entity_id: "sensor.bella_tid_till_hem",
@@ -886,9 +746,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Antal minuter hem",
icon: "mdi:timer",
},
last_changed: "2019-01-18T15:53:19.161560+00:00",
last_updated: "2019-01-18T15:53:19.161560+00:00",
context: { id: "3da5acfb211d47afb9c744a6ba135344", user_id: null },
},
"sensor.oskar_tid_till_hem": {
entity_id: "sensor.oskar_tid_till_hem",
@@ -906,9 +763,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "Antal minuter hem",
icon: "mdi:timer",
},
last_changed: "2019-01-18T15:53:19.197183+00:00",
last_updated: "2019-01-18T15:53:19.197183+00:00",
context: { id: "cade22f8710648868dd55a9d562ebe76", user_id: null },
},
"lock.polycontrol_danalock_v3_btze_locked": {
entity_id: "lock.polycontrol_danalock_v3_btze_locked",
@@ -920,9 +774,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
value_id: "72057594513489920",
friendly_name: "Frontdoor",
},
last_changed: "2019-01-18T15:53:36.058341+00:00",
last_updated: "2019-01-18T15:53:36.058341+00:00",
context: { id: "e12f4a5ee7864b95bde4d5da1c8753b9", user_id: null },
},
"binary_sensor.front_door_sensor": {
entity_id: "binary_sensor.front_door_sensor",
@@ -934,9 +785,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "opening",
icon: "mdi:door",
},
last_changed: "2019-01-18T16:03:19.907644+00:00",
last_updated: "2019-01-18T16:03:19.907644+00:00",
context: { id: "5c9724de70d249218710cd48d662383a", user_id: null },
},
"binary_sensor.altan_motion_sensor": {
entity_id: "binary_sensor.altan_motion_sensor",
@@ -947,9 +795,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "altan_motion_sensor",
device_class: "motion",
},
last_changed: "2019-01-18T16:02:09.208632+00:00",
last_updated: "2019-01-18T16:02:09.208632+00:00",
context: { id: "fa3835c018ab4f2caa5fc7a629765ce1", user_id: null },
},
"binary_sensor.back_door_sensor": {
entity_id: "binary_sensor.back_door_sensor",
@@ -961,9 +806,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "opening",
icon: "mdi:door",
},
last_changed: "2019-01-18T16:02:09.221573+00:00",
last_updated: "2019-01-18T16:02:09.221573+00:00",
context: { id: "79b24786327f402d98039fc7f64a5cac", user_id: null },
},
"binary_sensor.badrumssensor": {
entity_id: "binary_sensor.badrumssensor",
@@ -974,9 +816,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "badrumssensor",
device_class: "motion",
},
last_changed: "2019-01-18T16:02:09.230201+00:00",
last_updated: "2019-01-18T16:02:09.230201+00:00",
context: { id: "d717171f27ac4788baf5a01aa76103cb", user_id: null },
},
"binary_sensor.trapp_motion_sensor": {
entity_id: "binary_sensor.trapp_motion_sensor",
@@ -989,9 +828,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "motion",
icon: "mdi:walk",
},
last_changed: "2019-01-18T16:05:22.880965+00:00",
last_updated: "2019-01-18T16:05:22.880965+00:00",
context: { id: "930f8a9f68044b9e9081d446bac41dec", user_id: null },
},
"binary_sensor.tvattstugan_motion_sensor": {
entity_id: "binary_sensor.tvattstugan_motion_sensor",
@@ -1004,9 +840,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "motion",
icon: "mdi:walk",
},
last_changed: "2019-01-18T16:05:18.681492+00:00",
last_updated: "2019-01-18T16:05:18.681492+00:00",
context: { id: "5203da025f024e6fa3f23d51e49a6792", user_id: null },
},
"binary_sensor.dorrklockan": {
entity_id: "binary_sensor.dorrklockan",
@@ -1018,9 +851,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "opening",
icon: "mdi:bell",
},
last_changed: "2019-01-18T16:03:12.046042+00:00",
last_updated: "2019-01-18T16:03:12.046042+00:00",
context: { id: "fdfdad57b15c456687f610a65e3ef4cb", user_id: null },
},
"binary_sensor.skafferiet_motion_sensor": {
entity_id: "binary_sensor.skafferiet_motion_sensor",
@@ -1032,9 +862,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "motion",
icon: "mdi:walk",
},
last_changed: "2019-01-18T16:02:09.287461+00:00",
last_updated: "2019-01-18T16:02:09.287461+00:00",
context: { id: "51facd375f354ae5aef8c343d6e76290", user_id: null },
},
"binary_sensor.kallaren_motion_sensor": {
entity_id: "binary_sensor.kallaren_motion_sensor",
@@ -1047,9 +874,6 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
device_class: "motion",
icon: "mdi:walk",
},
last_changed: "2019-01-18T16:05:17.181070+00:00",
last_updated: "2019-01-18T16:05:17.181070+00:00",
context: { id: "56df28bb79234daba64d61ae7daf0f54", user_id: null },
},
"binary_sensor.banksensor": {
entity_id: "binary_sensor.banksensor",
@@ -1061,8 +885,5 @@ export const demoEntitiesKernehed: () => Entity[] = () =>
friendly_name: "B\u00e4nksensor",
device_class: "motion",
},
last_changed: "2019-01-18T16:05:03.828041+00:00",
last_updated: "2019-01-18T16:05:03.828041+00:00",
context: { id: "a270883993b04d90bee5c27180c43cb8", user_id: null },
},
});

View File

@@ -1,6 +1,6 @@
import { LovelaceConfig } from "../../../../src/data/lovelace";
import { DemoConfig } from "../types";
export const demoLovelaceKernehed: () => LovelaceConfig = () => ({
export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
name: "Hem",
resources: [
// {

View File

@@ -24,27 +24,24 @@ export const demoThemeKernehed = () => ({
"paper-listbox-background-color": "#141414",
"table-row-background-color": "#292929",
"paper-grey-50": "var(--primary-text-color)",
"paper-toggle-button-checked-button-color": "var(--accent-color)",
"switch-checked-color": "var(--accent-color)",
"paper-dialog-background-color": "#292929",
"secondary-text-color": "#b58e31",
"google-red-500": "#b58e31",
"divider-color": "rgba(0, 0, 0, .12)",
"paper-toggle-button-unchecked-ink-color": "var(--disabled-text-color)",
"google-green-500": "#2980b9",
"paper-toggle-button-unchecked-button-color": "var(--disabled-text-color)",
"switch-unchecked-button-color": "var(--disabled-text-color)",
"label-badge-border-color": "green",
"paper-listbox-color": "#777777",
"paper-slider-disabled-secondary-color": "var(--disabled-text-color)",
"paper-toggle-button-checked-ink-color": "var(--accent-color)",
"paper-card-background-color": "#292929",
"label-badge-text-color": "var(--primary-text-color)",
"paper-slider-knob-start-color": "var(--accent-color)",
"paper-toggle-button-unchecked-bar-color": "var(--disabled-text-color)",
"switch-unchecked-track-color": "var(--disabled-text-color)",
"dark-primary-color": "var(--accent-color)",
"paper-slider-secondary-color": "var(--secondary-background-color)",
"paper-slider-pin-color": "var(--accent-color)",
"paper-item-icon-active-color": "#b58e31",
"accent-color": "#2980b9",
"paper-toggle-button-checked-bar-color": "var(--accent-color)",
"table-row-alternative-background-color": "#292929",
});

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +1,7 @@
import { LovelaceConfig } from "../../../../src/data/lovelace";
import { DemoConfig } from "../types";
export const demoLovelaceTeachingbirds: () => LovelaceConfig = () => ({
export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
title: "Home",
resources: [
// {
// url: "/local/lovelace/mini-media-player.js?v=0.6",
// type: "module",
// },
// {
// url: "/local/lovelace/slider-entity-row.js?v=d6da75",
// type: "js",
// },
// {
// url: "/local/lovelace/monster-card.js?v=0.2.3",
// type: "js",
// },
// {
// url: "/local/lovelace/tracker-card.js?v=0.1.5",
// type: "js",
// },
// {
// url: "/local/lovelace/home-setter.js?v=0.0.1",
// type: "js",
// },
],
views: [
{
cards: [
@@ -1201,484 +1179,5 @@ export const demoLovelaceTeachingbirds: () => LovelaceConfig = () => ({
title: "Info",
icon: "mdi:lan",
},
// {
// cards: [
// {
// cards: [
// {
// entities: [
// "switch.dafang_night_mode",
// "light.isa_ceiling_light",
// "switch.dafang_h264_rtsp_server",
// ],
// camera_image: "camera.upstairs",
// type: "picture-glance",
// title: "Upstairs",
// },
// {
// entities: [
// {
// tap_action: {
// action: "call-service",
// service: "script.dafang_down",
// },
// entity: "script.dafang_down",
// },
// {
// tap_action: {
// action: "toggle",
// },
// entity: "script.dafang_up",
// },
// {
// tap_action: {
// action: "toggle",
// },
// entity: "script.dafang_left",
// },
// {
// tap_action: {
// action: "toggle",
// },
// entity: "script.dafang_right",
// },
// {
// entity: "script.dafang_calibrate",
// hold_action: {
// action: "toggle",
// },
// tap_action: {
// action: "none",
// },
// icon: "mdi:reload",
// },
// ],
// show_name: false,
// type: "glance",
// show_state: false,
// },
// {
// type: "picture-entity",
// entity: "camera.motion_dafang",
// },
// ],
// type: "vertical-stack",
// },
// {
// cards: [
// {
// entities: [
// "light.living_room_ceiling_light_level",
// "light.living_room_spotlights_level",
// ],
// camera_image: "camera.back_door",
// type: "picture-glance",
// title: "Back door",
// },
// {
// entities: [
// {
// entity: "script.sannce_down",
// tap_action: {
// action: "toggle",
// },
// icon: "mdi:chevron-down",
// },
// {
// entity: "script.sannce_up",
// tap_action: {
// action: "toggle",
// },
// icon: "mdi:chevron-up",
// },
// {
// entity: "script.sannce_left",
// tap_action: {
// action: "toggle",
// },
// icon: "mdi:chevron-left",
// },
// {
// entity: "script.sannce_right",
// tap_action: {
// action: "toggle",
// },
// icon: "mdi:chevron-right",
// },
// {
// entity: "script.sannce_calibrate",
// hold_action: {
// action: "toggle",
// },
// tap_action: {
// action: "none",
// },
// icon: "mdi:reload",
// },
// ],
// show_name: false,
// type: "glance",
// show_state: false,
// },
// {
// type: "picture-entity",
// entity: "camera.motion_sannce",
// },
// ],
// type: "vertical-stack",
// },
// {
// cards: [
// {
// entities: ["sensor.ring_front_door_battery"],
// camera_image: "camera.front_door",
// title: "Latest Motion Front Door",
// show_state: false,
// type: "picture-glance",
// entity: "camera.front_door",
// },
// ],
// type: "vertical-stack",
// },
// ],
// path: "cameras",
// title: "Cameras",
// icon: "mdi:cctv",
// },
// {
// cards: [
// {
// cards: [
// {
// entities: [
// {
// name: "Road temp",
// entity: "sensor.trafikverket_alta_road_temperature",
// },
// {
// entity: "sensor.homesolna_travel_time",
// name: "Solna",
// icon: "mdi:car",
// },
// {
// entity: "sensor.homec9_travel_time",
// name: "C9",
// icon: "mdi:car",
// },
// ],
// type: "glance",
// },
// {
// cards: [
// {
// entity: "camera.tpl_skvaltan",
// type: "picture-entity",
// show_state: false,
// },
// {
// entity: "camera.tpl_nacka",
// type: "picture-entity",
// show_state: false,
// },
// ],
// type: "horizontal-stack",
// },
// {
// cards: [
// {
// entity: "camera.vikdalen",
// type: "picture-entity",
// show_state: false,
// },
// {
// entity: "camera.tpl_kvarnholmen",
// type: "picture-entity",
// show_state: false,
// },
// ],
// type: "horizontal-stack",
// },
// {
// cards: [
// {
// entity: "camera.marinstaden",
// type: "picture-entity",
// show_state: false,
// },
// {
// entity: "camera.svindersvik",
// type: "picture-entity",
// show_state: false,
// },
// ],
// type: "horizontal-stack",
// },
// {
// cards: [
// {
// entity: "camera.sicklatunneln",
// type: "picture-entity",
// show_state: false,
// },
// {
// entity: "camera.tpl_grondal",
// type: "picture-entity",
// show_state: false,
// },
// ],
// type: "horizontal-stack",
// },
// ],
// type: "vertical-stack",
// },
// ],
// path: "traffic",
// title: "Traffic info",
// icon: "mdi:car",
// },
// {
// cards: [
// {
// filter: {
// include: [
// {
// entity_id: "input_boolean.ad_*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "Appdaemon Apps",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.cats*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "Cats",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.house*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "House",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.lights*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "Lights",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.presence*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "Presence",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.security*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "Security",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.system*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "System",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.temperature*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "Temperature",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "automation.tts*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "TTS",
// },
// show_empty: false,
// },
// {
// filter: {
// include: [
// {
// entity_id: "alert.*",
// },
// ],
// },
// type: "custom:monster-card",
// card: {
// show_header_toggle: false,
// type: "entities",
// title: "Alerts",
// },
// show_empty: false,
// },
// ],
// path: "automations",
// title: "Automations",
// icon: "mdi:flash-auto",
// },
{
cards: [
{
cards: [
{
entities: [
{
url: "https://www.home-assistant.io/",
type: "weblink",
name: "Home Assistant",
icon: "mdi:home-assistant",
},
{
url: "https://rc--home-assistant-docs.netlify.com/",
type: "weblink",
name: "Home Assistant Beta",
icon: "mdi:home-assistant",
},
{
url:
"https://github.com/home-assistant/home-assistant-polymer/releases",
type: "weblink",
name: "Lovelace release notes",
icon: "mdi:home-heart",
},
{
url: "https://s3.amazonaws.com/hassio-version/stable.json",
type: "weblink",
name: "Hassio build",
icon: "mdi:home-assistant",
},
{
url:
"https://github.com/dresden-elektronik/deconz-rest-plugin/releases",
type: "weblink",
name: "Deconz release notes",
icon: "mdi:home-assistant",
},
],
show_header_toggle: false,
type: "entities",
title: "Links",
},
],
type: "vertical-stack",
},
// {
// cards: [
// {
// type: "custom:home-setter",
// pages: [
// {
// path: "lovelace/home",
// name: "Default",
// },
// {
// path: "lovelace/dashboard",
// name: "Dashboard",
// },
// ],
// },
// {
// title: null,
// type: "custom:tracker-card",
// trackers: [
// "sensor.custom_card_tracker",
// "sensor.custom_component_tracker",
// ],
// },
// ],
// type: "vertical-stack",
// },
],
path: "settings",
title: "Settings",
icon: "mdi:cogs",
},
],
});

View File

@@ -12,8 +12,7 @@ export const demoThemeTeachingbirds = () => ({
"paper-slider-knob-color": "var(--primary-color)",
"paper-listbox-color": "#FFFFFF",
"paper-toggle-button-checked-bar-color": "var(--light-primary-color)",
"paper-toggle-button-checked-ink-color": "var(--dark-primary-color)",
"paper-toggle-button-unchecked-bar-color": "var(--primary-text-color)",
"switch-unchecked-track-color": "var(--primary-text-color)",
"paper-card-background-color": "#4e4e4e",
"label-badge-text-color": "var(--text-primary-color)",
"primary-background-color": "#303030",
@@ -22,7 +21,7 @@ export const demoThemeTeachingbirds = () => ({
"secondary-background-color": "#2b2b2b",
"paper-slider-knob-start-color": "var(--primary-color)",
"paper-item-icon-active-color": "#d8bf50",
"paper-toggle-button-checked-button-color": "var(--primary-color)",
"switch-checked-color": "var(--primary-color)",
"secondary-text-color": "#389638",
"disabled-text-color": "#545454",
"paper-item-icon_-_color": "var(--primary-text-color)",

View File

@@ -1,12 +1,13 @@
import { LovelaceConfig } from "../../../src/data/lovelace";
import { Entity } from "../../../src/fake_data/entity";
import { LocalizeFunc } from "../../../src/common/translations/localize";
export interface DemoConfig {
index?: number;
name: string;
authorName: string;
authorUrl: string;
lovelace: () => LovelaceConfig;
entities: () => Entity[];
lovelace: (localize: LocalizeFunc) => LovelaceConfig;
entities: (localize: LocalizeFunc) => Entity[];
theme: () => { [key: string]: string } | null;
}

View File

@@ -53,7 +53,7 @@ class CardModder extends LitElement {
for (var k in this._config.style) {
if (window.cardTools.hasTemplate(this._config.style[k]))
this.templated.push(k);
this.card.style.setProperty(k, '');
this.card.style.setProperty(k, "");
target.style.setProperty(
k,
window.cardTools.parseTemplate(this._config.style[k])

View File

@@ -161,8 +161,8 @@ if (!window.cardTools) {
};
cardTools.longpress = (element) => {
customElements.whenDefined("long-press").then(() => {
const longpress = document.body.querySelector("long-press");
customElements.whenDefined("action-handler").then(() => {
const longpress = document.body.querySelector("action-handler");
longpress.bind(element);
});
return element;

View File

@@ -0,0 +1,113 @@
import {
html,
LitElement,
TemplateResult,
customElement,
property,
css,
CSSResult,
} from "lit-element";
import "../../../src/components/ha-icon";
import {
EntityRow,
CastConfig,
} from "../../../src/panels/lovelace/entity-rows/types";
import { HomeAssistant } from "../../../src/types";
import { CastManager } from "../../../src/cast/cast_manager";
import { castSendShowDemo } from "../../../src/cast/receiver_messages";
@customElement("cast-demo-row")
class CastDemoRow extends LitElement implements EntityRow {
public hass!: HomeAssistant;
@property() private _castManager?: CastManager | null;
public setConfig(_config: CastConfig): void {
// No config possible.
}
protected render(): TemplateResult | void {
if (
!this._castManager ||
this._castManager.castState === "NO_DEVICES_AVAILABLE"
) {
return html``;
}
return html`
<ha-icon icon="hademo:television"></ha-icon>
<div class="flex">
<div class="name">Show Chromecast interface</div>
<google-cast-launcher></google-cast-launcher>
</div>
`;
}
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
import("../../../src/cast/cast_manager").then(({ getCastManager }) =>
getCastManager().then((mgr) => {
this._castManager = mgr;
mgr.addEventListener("state-changed", () => {
this.requestUpdate();
});
mgr.castContext.addEventListener(
cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
(ev) => {
// On Android, opening a new session always results in SESSION_RESUMED.
// So treat both as the same.
if (
ev.sessionState === "SESSION_STARTED" ||
ev.sessionState === "SESSION_RESUMED"
) {
castSendShowDemo(mgr);
}
}
);
})
);
}
protected updated(changedProps) {
super.updated(changedProps);
this.style.display = this._castManager ? "" : "none";
}
static get styles(): CSSResult {
return css`
:host {
display: flex;
align-items: center;
}
ha-icon {
padding: 8px;
color: var(--paper-item-icon-color);
}
.flex {
flex: 1;
overflow: hidden;
margin-left: 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
.name {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
google-cast-launcher {
cursor: pointer;
display: inline-block;
height: 24px;
width: 24px;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"cast-demo-row": CastDemoRow;
}
}

View File

@@ -1,17 +1,8 @@
import {
LitElement,
html,
CSSResult,
css,
PropertyDeclarations,
} from "lit-element";
import { LitElement, html, CSSResult, css, property } from "lit-element";
import { until } from "lit-html/directives/until";
import "@polymer/paper-icon-button";
import "@material/mwc-button";
import "@polymer/paper-spinner/paper-spinner-lite";
import "../../../src/components/ha-card";
import "../../../src/components/ha-paper-icon-button-next";
import "../../../src/components/ha-paper-icon-button-prev";
import { LovelaceCard, Lovelace } from "../../../src/panels/lovelace/types";
import { LovelaceCardConfig } from "../../../src/data/lovelace";
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
@@ -23,20 +14,13 @@ import {
} from "../configs/demo-configs";
export class HADemoCard extends LitElement implements LovelaceCard {
public lovelace?: Lovelace;
public hass?: MockHomeAssistant;
private _switching?: boolean;
static get properties(): PropertyDeclarations {
return {
lovelace: {},
hass: {},
_switching: {},
};
}
@property() public lovelace?: Lovelace;
@property() public hass!: MockHomeAssistant;
@property() private _switching?: boolean;
private _hidden = localStorage.hide_demo_card;
public getCardSize() {
return 2;
return this._hidden ? 0 : 2;
}
public setConfig(
@@ -46,14 +30,13 @@ export class HADemoCard extends LitElement implements LovelaceCard {
) {}
protected render() {
if (this._hidden) {
return;
}
return html`
<ha-card>
<div class="picker">
<ha-paper-icon-button-prev
@click=${this._prevConfig}
.disabled=${this._switching}
></ha-paper-icon-button-prev>
<div>
<div class="label">
${this._switching
? html`
<paper-spinner-lite active></paper-spinner-lite>
@@ -63,9 +46,12 @@ export class HADemoCard extends LitElement implements LovelaceCard {
(conf) => html`
${conf.name}
<small>
by
<a target="_blank" href="${conf.authorUrl}">
${conf.authorName}
${this.hass.localize(
"ui.panel.page-demo.cards.demo.demo_by",
"name",
conf.authorName
)}
</a>
</small>
`
@@ -73,30 +59,29 @@ export class HADemoCard extends LitElement implements LovelaceCard {
""
)}
</div>
<ha-paper-icon-button-next
@click=${this._nextConfig}
.disabled=${this._switching}
></ha-paper-icon-button-next>
<mwc-button @click=${this._nextConfig} .disabled=${this._switching}>
${this.hass.localize("ui.panel.page-demo.cards.demo.next_demo")}
</mwc-button>
</div>
<div class="content">
Welcome home! You've reached the Home Assistant demo where we showcase
the best UIs created by our community.
<div class="content small-hidden">
${this.hass.localize("ui.panel.page-demo.cards.demo.introduction")}
</div>
<div class="actions">
<div class="actions small-hidden">
<a href="https://www.home-assistant.io" target="_blank">
<mwc-button>Learn more about Home Assistant</mwc-button>
<mwc-button>
${this.hass.localize("ui.panel.page-demo.cards.demo.learn_more")}
</mwc-button>
</a>
</div>
</ha-card>
`;
}
private _prevConfig() {
this._updateConfig(
selectedDemoConfigIndex > 0
? selectedDemoConfigIndex - 1
: demoConfigs.length - 1
);
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
if (this._hidden) {
this.style.display = "none";
}
}
private _nextConfig() {
@@ -110,7 +95,7 @@ export class HADemoCard extends LitElement implements LovelaceCard {
private async _updateConfig(index: number) {
this._switching = true;
try {
await setDemoConfig(this.hass!, this.lovelace!, index);
await setDemoConfig(this.hass, this.lovelace!, index);
} catch (err) {
alert("Failed to switch config :-(");
} finally {
@@ -125,6 +110,10 @@ export class HADemoCard extends LitElement implements LovelaceCard {
color: var(--primary-color);
}
.actions a {
text-decoration: none;
}
.content {
padding: 16px;
}
@@ -136,17 +125,27 @@ export class HADemoCard extends LitElement implements LovelaceCard {
height: 60px;
}
.picker div {
text-align: center;
.picker mwc-button {
margin-right: 8px;
}
.picker small {
.label {
padding-left: 16px;
}
.label small {
display: block;
}
.actions {
padding-left: 8px;
}
@media only screen and (max-width: 500px) {
.small-hidden {
display: none;
}
}
`,
];
}

View File

@@ -12,5 +12,7 @@ import "./resources/hademo-icons";
/* polyfill for paper-dropdown */
setTimeout(() => {
import(/* webpackChunkName: "polyfill-web-animations-next" */ "web-animations-js/web-animations-next-lite.min");
import(
/* webpackChunkName: "polyfill-web-animations-next" */ "web-animations-js/web-animations-next-lite.min"
);
}, 1000);

View File

@@ -16,6 +16,8 @@ import { mockEvents } from "./stubs/events";
import { mockMediaPlayer } from "./stubs/media_player";
import { HomeAssistant } from "../../src/types";
import { mockFrontend } from "./stubs/frontend";
import { mockPersistentNotification } from "./stubs/persistent_notification";
import { isNavigationClick } from "../../src/common/dom/is-navigation-click";
class HaDemo extends HomeAssistantAppEl {
protected async _initialize() {
@@ -27,7 +29,13 @@ class HaDemo extends HomeAssistantAppEl {
};
const hass = (this.hass = provideHass(this, initial));
mockLovelace(hass);
const localizePromise =
// @ts-ignore
this._loadFragmentTranslations(hass.language, "page-demo").then(
() => this.hass!.localize
);
mockLovelace(hass, localizePromise);
mockAuth(hass);
mockTranslations(hass);
mockHistory(hass);
@@ -37,60 +45,30 @@ class HaDemo extends HomeAssistantAppEl {
mockEvents(hass);
mockMediaPlayer(hass);
mockFrontend(hass);
selectedDemoConfig.then((conf) => {
hass.addEntities(conf.entities());
if (conf.theme) {
hass.mockTheme(conf.theme());
mockPersistentNotification(hass);
// Once config is loaded AND localize, set entities and apply theme.
Promise.all([selectedDemoConfig, localizePromise]).then(
([conf, localize]) => {
hass.addEntities(conf.entities(localize));
if (conf.theme) {
hass.mockTheme(conf.theme());
}
}
});
);
// Taken from polymer/pwa-helpers. BSD-3 licensed
document.body.addEventListener(
"click",
(e) => {
if (
e.defaultPrevented ||
e.button !== 0 ||
e.metaKey ||
e.ctrlKey ||
e.shiftKey
) {
return;
}
const href = isNavigationClick(e);
const anchor = e
.composedPath()
.filter((n) => (n as HTMLElement).tagName === "A")[0] as
| HTMLAnchorElement
| undefined;
if (
!anchor ||
anchor.target ||
anchor.hasAttribute("download") ||
anchor.getAttribute("rel") === "external"
) {
return;
}
let href = anchor.href;
if (!href || href.indexOf("mailto:") !== -1) {
return;
}
const location = window.location;
const origin =
location.origin || location.protocol + "//" + location.host;
if (href.indexOf(origin) !== 0) {
return;
}
href = href.substr(origin.length);
if (href === "#") {
if (!href) {
return;
}
e.preventDefault();
navigate(this as any, href);
navigate(this, href);
},
{ capture: true }
);

View File

@@ -7,13 +7,13 @@
<link rel="mask-icon" href="/static/icons/mask-icon.svg" color="#03a9f4" />
<link
rel="preload"
href="/static/fonts/roboto/Roboto-Regular.ttf"
href="/static/fonts/roboto/Roboto-Regular.woff2"
as="font"
crossorigin
/>
<link
rel="preload"
href="/static/fonts/roboto/Roboto-Medium.ttf"
href="/static/fonts/roboto/Roboto-Medium.woff2"
as="font"
crossorigin
/>
@@ -87,7 +87,7 @@
#ha-init-skeleton::before {
display: block;
content: "";
height: 112px;
height: 64px;
background-color: #03a9f4;
}
</style>

View File

@@ -65,74 +65,79 @@ const generateHistory = (state, deltas) => {
const incrementalUnits = ["clients", "queries", "ads"];
export const mockHistory = (mockHass: MockHomeAssistant) => {
mockHass.mockAPI(new RegExp("history/period/.+"), (
hass,
// @ts-ignore
method,
path,
// @ts-ignore
parameters
) => {
const params = parseQuery<HistoryQueryParams>(path.split("?")[1]);
const entities = params.filter_entity_id.split(",");
mockHass.mockAPI(
new RegExp("history/period/.+"),
(
hass,
// @ts-ignore
method,
path,
// @ts-ignore
parameters
) => {
const params = parseQuery<HistoryQueryParams>(path.split("?")[1]);
const entities = params.filter_entity_id.split(",");
const results: HassEntity[][] = [];
const results: HassEntity[][] = [];
for (const entityId of entities) {
const state = hass.states[entityId];
for (const entityId of entities) {
const state = hass.states[entityId];
if (!state) {
continue;
}
if (!state) {
continue;
}
if (!state.attributes.unit_of_measurement) {
results.push(generateHistory(state, [state.state]));
continue;
}
if (!state.attributes.unit_of_measurement) {
results.push(generateHistory(state, [state.state]));
continue;
}
const numberState = Number(state.state);
const numberState = Number(state.state);
if (isNaN(numberState)) {
// tslint:disable-next-line
console.log(
"Ignoring state with unparsable state but with a unit",
entityId,
state
if (isNaN(numberState)) {
// tslint:disable-next-line
console.log(
"Ignoring state with unparsable state but with a unit",
entityId,
state
);
continue;
}
const statesToGenerate = 15;
let genFunc;
if (incrementalUnits.includes(state.attributes.unit_of_measurement)) {
let initial = Math.floor(
numberState * 0.4 + numberState * Math.random() * 0.2
);
const diff = Math.max(
1,
Math.floor((numberState - initial) / statesToGenerate)
);
genFunc = () => {
initial += diff;
return Math.min(numberState, initial);
};
} else {
const diff = Math.floor(
numberState * (numberState > 80 ? 0.05 : 0.5)
);
genFunc = () =>
numberState - diff + Math.floor(Math.random() * 2 * diff);
}
results.push(
generateHistory(
{
entity_id: state.entity_id,
attributes: state.attributes,
},
Array.from({ length: statesToGenerate }, genFunc)
)
);
continue;
}
const statesToGenerate = 15;
let genFunc;
if (incrementalUnits.includes(state.attributes.unit_of_measurement)) {
let initial = Math.floor(
numberState * 0.4 + numberState * Math.random() * 0.2
);
const diff = Math.max(
1,
Math.floor((numberState - initial) / statesToGenerate)
);
genFunc = () => {
initial += diff;
return Math.min(numberState, initial);
};
} else {
const diff = Math.floor(numberState * (numberState > 80 ? 0.05 : 0.5));
genFunc = () =>
numberState - diff + Math.floor(Math.random() * 2 * diff);
}
results.push(
generateHistory(
{
entity_id: state.entity_id,
attributes: state.attributes,
},
Array.from({ length: statesToGenerate }, genFunc)
)
);
return results;
}
return results;
});
);
};

View File

@@ -1,15 +1,21 @@
import "../custom-cards/ha-demo-card";
import "../custom-cards/cast-demo-row";
// Not duplicate, one is for typing.
// tslint:disable-next-line
import { HADemoCard } from "../custom-cards/ha-demo-card";
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
import { selectedDemoConfig } from "../configs/demo-configs";
import { LocalizeFunc } from "../../../src/common/translations/localize";
export const mockLovelace = (hass: MockHomeAssistant) => {
selectedDemoConfig.then((config) => hass.addEntities(config.entities()));
export const mockLovelace = (
hass: MockHomeAssistant,
localizePromise: Promise<LocalizeFunc>
) => {
hass.mockWS("lovelace/config", () =>
selectedDemoConfig.then((config) => config.lovelace())
Promise.all([
selectedDemoConfig,
localizePromise,
]).then(([config, localize]) => config.lovelace(localize))
);
hass.mockWS("lovelace/config/save", () => Promise.resolve());

View File

@@ -0,0 +1,16 @@
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
import { PersistentNotification } from "../../../src/data/persistent_notification";
export const mockPersistentNotification = (hass: MockHomeAssistant) => {
hass.mockWS("persistent_notification/get", () =>
Promise.resolve([
{
created_at: new Date().toISOString(),
message: "There was motion detected in the backyard.",
notification_id: "demo-1",
title: "Motion Detected!",
status: "unread",
},
] as PersistentNotification[])
);
};

View File

@@ -97,7 +97,7 @@ export const mockTranslations = (hass: MockHomeAssistant) => {
"component.nest.config.abort.authorize_url_timeout":
"Timeout generating authorize url.",
"component.nest.config.abort.no_flows":
"You need to configure Nest before being able to authenticate with it. [Please read the instructions](https://www.home-assistant.io/components/nest/).",
"You need to configure Nest before being able to authenticate with it. [Please read the instructions](https://www.home-assistant.io/integrations/nest/).",
"component.nest.config.error.internal_error":
"Internal error validating code",
"component.nest.config.error.invalid_code": "Invalid code",
@@ -199,7 +199,7 @@ export const mockTranslations = (hass: MockHomeAssistant) => {
"component.point.config.abort.external_setup":
"Point successfully configured from another flow.",
"component.point.config.abort.no_flows":
"You need to configure Point before being able to authenticate with it. [Please read the instructions](https://www.home-assistant.io/components/point/).",
"You need to configure Point before being able to authenticate with it. [Please read the instructions](https://www.home-assistant.io/integrations/point/).",
"component.point.config.create_entry.default":
"Successfully authenticated with Minut for your Point device(s)",
"component.point.config.error.follow_link":

View File

@@ -1,10 +1,9 @@
const { createDemoConfig } = require("../build-scripts/webpack.js");
const { isProdBuild, isStatsBuild } = require("../build-scripts/env.js");
// This file exists because we haven't migrated the stats script yet
// File just used for stats builds
const isProdBuild = process.env.NODE_ENV === "production";
const isStatsBuild = process.env.STATS === "1";
const latestBuild = false;
const latestBuild = true;
module.exports = createDemoConfig({
isProdBuild,

View File

@@ -1,18 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#2157BC">
<title>HAGallery</title>
<script src='./main.js' async></script>
<style>
body {
font-family: Roboto, Noto, sans-serif;
margin: 0;
padding: 0;
}
</style>
</head>
<body></body>
</html>

View File

@@ -4,14 +4,6 @@
# Stop on errors
set -e
cd "$(dirname "$0")/.."
cd "$(dirname "$0")/../.."
OUTPUT_DIR=dist
rm -rf $OUTPUT_DIR
cd ..
./node_modules/.bin/gulp build-translations gen-icons
cd gallery
NODE_ENV=production ../node_modules/.bin/webpack -p --config webpack.config.js
./node_modules/.bin/gulp build-gallery

View File

@@ -4,10 +4,6 @@
# Stop on errors
set -e
cd "$(dirname "$0")/.."
cd "$(dirname "$0")/../.."
cd ..
./node_modules/.bin/gulp build-translations gen-icons
cd gallery
../node_modules/.bin/webpack-dev-server
./node_modules/.bin/gulp develop-gallery

View File

@@ -1,6 +1,6 @@
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import JsYaml from "js-yaml";
import { safeLoad } from "js-yaml";
import { createCardElement } from "../../../src/panels/lovelace/common/create-card-element";
@@ -62,7 +62,7 @@ class DemoCard extends PolymerElement {
card.removeChild(card.lastChild);
}
const el = createCardElement(JsYaml.safeLoad(config.config)[0]);
const el = createCardElement(safeLoad(config.config)[0]);
el.hass = this.hass;
card.appendChild(el);
}

View File

@@ -1,9 +1,9 @@
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "@polymer/paper-toggle-button/paper-toggle-button";
import "./demo-card";
import "../../../src/components/ha-switch";
class DemoCards extends PolymerElement {
static get template() {
@@ -26,9 +26,9 @@ class DemoCards extends PolymerElement {
</style>
<app-toolbar>
<div class="filters">
<paper-toggle-button checked="{{_showConfig}}"
>Show config</paper-toggle-button
>
<ha-switch checked="[[_showConfig]]" on-change="_showConfigToggled">
Show config
</ha-switch>
</div>
</app-toolbar>
<div class="cards">
@@ -53,6 +53,10 @@ class DemoCards extends PolymerElement {
},
};
}
_showConfigToggled(ev) {
this._showConfig = ev.target.checked;
}
}
customElements.define("demo-cards", DemoCards);

View File

@@ -1,9 +1,9 @@
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "@polymer/paper-toggle-button/paper-toggle-button";
import "./demo-more-info";
import "../../../src/components/ha-switch";
class DemoMoreInfos extends PolymerElement {
static get template() {
@@ -26,9 +26,7 @@ class DemoMoreInfos extends PolymerElement {
</style>
<app-toolbar>
<div class="filters">
<paper-toggle-button checked="{{_showConfig}}"
>Show entity</paper-toggle-button
>
<ha-switch checked="{{_showConfig}}">Show entity</ha-switch>
</div>
</app-toolbar>
<div class="cards">

View File

@@ -36,7 +36,7 @@ export default {
attributes: {
title: "Welcome Home!",
message:
"Here are some resources to get started:\n\n - [Configuring Home Assistant](https://home-assistant.io/getting-started/configuration/)\n - [Available components](https://home-assistant.io/components/)\n - [Troubleshooting your configuration](https://home-assistant.io/docs/configuration/troubleshooting/)\n - [Getting help](https://home-assistant.io/help/)\n\nTo not see this card popup in the future, edit your config in\n`configuration.yaml` and disable the `introduction` component.",
"Here are some resources to get started:\n\n - [Configuring Home Assistant](https://home-assistant.io/getting-started/configuration/)\n - [Available integrations](https://home-assistant.io/integrations/)\n - [Troubleshooting your configuration](https://home-assistant.io/docs/configuration/troubleshooting/)\n - [Getting help](https://home-assistant.io/help/)\n\nTo not see this card popup in the future, edit your config in\n`configuration.yaml` and disable the `introduction` integration.",
},
last_changed: "2018-07-19T10:44:45.922241+00:00",
last_updated: "2018-07-19T10:44:45.922241+00:00",

View File

@@ -14,14 +14,14 @@ const ENTITIES = [
target_temp_high: 75,
target_temp_low: 70,
fan_mode: "Auto Low",
fan_list: ["On Low", "On High", "Auto Low", "Auto High", "Off"],
operation_mode: "auto",
operation_list: ["heat", "cool", "auto", "off"],
hold_mode: "home",
fan_modes: ["On Low", "On High", "Auto Low", "Auto High", "Off"],
hvac_modes: ["heat", "cool", "auto", "off"],
swing_mode: "Auto",
swing_list: ["Auto", "1", "2", "3", "Off"],
swing_modes: ["Auto", "1", "2", "3", "Off"],
friendly_name: "Ecobee",
supported_features: 1014,
supported_features: 59,
preset_mode: "eco",
preset_modes: ["away", "eco"],
}),
getEntity("climate", "nest", "heat", {
current_temperature: 17,
@@ -29,14 +29,12 @@ const ENTITIES = [
max_temp: 25,
temperature: 19,
fan_mode: "Auto Low",
fan_list: ["On Low", "On High", "Auto Low", "Auto High", "Off"],
operation_mode: "heat",
operation_list: ["heat", "cool", "auto", "off"],
hold_mode: "home",
fan_modes: ["On Low", "On High", "Auto Low", "Auto High", "Off"],
hvac_modes: ["heat", "cool", "auto", "off"],
swing_mode: "Auto",
swing_list: ["Auto", "1", "2", "3", "Off"],
swing_modes: ["Auto", "1", "2", "3", "Off"],
friendly_name: "Nest",
supported_features: 1014,
supported_features: 43,
}),
];

View File

@@ -2,7 +2,8 @@ import { html, LitElement, TemplateResult } from "lit-element";
import "@material/mwc-button";
import "../../../src/components/ha-card";
import { longPress } from "../../../src/panels/lovelace/common/directives/long-press-directive";
import { actionHandler } from "../../../src/panels/lovelace/common/directives/action-handler-directive";
import { ActionHandlerEvent } from "../../../src/data/lovelace";
export class DemoUtilLongPress extends LitElement {
protected render(): TemplateResult | void {
@@ -12,9 +13,8 @@ export class DemoUtilLongPress extends LitElement {
() => html`
<ha-card>
<mwc-button
@ha-click="${this._handleTap}"
@ha-hold="${this._handleHold}"
.longPress="${longPress()}"
@action=${this._handleAction}
.actionHandler=${actionHandler({})}
>
(long) press me!
</mwc-button>
@@ -28,12 +28,8 @@ export class DemoUtilLongPress extends LitElement {
`;
}
private _handleTap(ev: Event) {
this._addValue(ev, "tap");
}
private _handleHold(ev: Event) {
this._addValue(ev, "hold");
private _handleAction(ev: ActionHandlerEvent) {
this._addValue(ev, ev.detail.action!);
}
private _addValue(ev: Event, value: string) {

View File

@@ -56,7 +56,7 @@ class HaGallery extends PolymerElement {
color: var(--primary-color);
}
a paper-item {
a {
color: var(--primary-text-color);
text-decoration: none;
}
@@ -138,12 +138,22 @@ class HaGallery extends PolymerElement {
</template>
</div>
</app-header-layout>
<notification-manager id='notifications'></notification-manager>
<notification-manager hass=[[_fakeHass]] id='notifications'></notification-manager>
`;
}
static get properties() {
return {
_fakeHass: {
type: Object,
// Just enough for computeRTL
value: {
language: "en",
translationMetadata: {
translations: {},
},
},
},
_demo: {
type: String,
value: document.location.hash.substr(1),

View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<meta name="theme-color" content="#2157BC" />
<title>HAGallery</title>
<script type="module" src="<%= latestGalleryJS %>"></script>
<style>
body {
font-family: Roboto, Noto, sans-serif;
margin: 0;
padding: 0;
}
</style>
</head>
<body></body>
</html>

View File

@@ -1,7 +1,7 @@
const path = require("path");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const { createGalleryConfig } = require("../build-scripts/webpack.js");
const { babelLoaderConfig } = require("../build-scripts/babel.js");
const webpackBase = require("../build-scripts/webpack.js");
const isProd = process.env.NODE_ENV === "production";
const chunkFilename = isProd ? "chunk.[chunkhash].js" : "[name].chunk.js";
@@ -9,58 +9,64 @@ const buildPath = path.resolve(__dirname, "dist");
const publicPath = isProd ? "./" : "http://localhost:8080/";
const latestBuild = true;
module.exports = {
mode: isProd ? "production" : "development",
// Disabled in prod while we make Home Assistant able to serve the right files.
// Was source-map
devtool: isProd ? "none" : "inline-source-map",
entry: "./src/entrypoint.js",
module: {
rules: [
babelLoaderConfig({ latestBuild }),
{
test: /\.css$/,
use: "raw-loader",
},
{
test: /\.(html)$/,
use: {
loader: "html-loader",
options: {
exportAsEs6Default: true,
module.exports = createGalleryConfig({
latestBuild: true,
});
const bla = () => {
const oldExports = {
mode: isProd ? "production" : "development",
// Disabled in prod while we make Home Assistant able to serve the right files.
// Was source-map
devtool: isProd ? "none" : "inline-source-map",
entry: "./src/entrypoint.js",
module: {
rules: [
babelLoaderConfig({ latestBuild }),
{
test: /\.css$/,
use: "raw-loader",
},
{
test: /\.(html)$/,
use: {
loader: "html-loader",
options: {
exportAsEs6Default: true,
},
},
},
},
],
},
optimization: webpackBase.optimization(latestBuild),
plugins: [
new CopyWebpackPlugin([
"public",
{ from: "../public", to: "static" },
{ from: "../build-translations/output", to: "static/translations" },
{
from: "../node_modules/leaflet/dist/leaflet.css",
to: "static/images/leaflet/",
},
{
from: "../node_modules/@polymer/font-roboto-local/fonts",
to: "static/fonts",
},
{
from: "../node_modules/leaflet/dist/images",
to: "static/images/leaflet/",
},
]),
].filter(Boolean),
resolve: webpackBase.resolve,
output: {
filename: "[name].js",
chunkFilename: chunkFilename,
path: buildPath,
publicPath,
},
devServer: {
contentBase: "./public",
},
],
},
optimization: webpackBase.optimization(latestBuild),
plugins: [
new CopyWebpackPlugin([
"public",
{ from: "../public", to: "static" },
{ from: "../build-translations/output", to: "static/translations" },
{
from: "../node_modules/leaflet/dist/leaflet.css",
to: "static/images/leaflet/",
},
{
from: "../node_modules/roboto-fontface/fonts/roboto/*.woff2",
to: "static/fonts/roboto/",
},
{
from: "../node_modules/leaflet/dist/images",
to: "static/images/leaflet/",
},
]),
].filter(Boolean),
resolve: webpackBase.resolve,
output: {
filename: "[name].js",
chunkFilename: chunkFilename,
path: buildPath,
publicPath,
},
devServer: {
contentBase: "./public",
},
};
};

Some files were not shown because too many files have changed in this diff Show More