mirror of
https://github.com/home-assistant/frontend.git
synced 2025-08-17 13:19:26 +00:00
Compare commits
3 Commits
20210818.0
...
template-e
Author | SHA1 | Date | |
---|---|---|---|
![]() |
72bf0c918a | ||
![]() |
419f5d13bf | ||
![]() |
16549b3404 |
@@ -4,7 +4,7 @@
|
|||||||
"dockerfile": "Dockerfile",
|
"dockerfile": "Dockerfile",
|
||||||
"context": ".."
|
"context": ".."
|
||||||
},
|
},
|
||||||
"appPort": "8124:8123",
|
"appPort": 8123,
|
||||||
"context": "..",
|
"context": "..",
|
||||||
"postCreateCommand": "script/bootstrap",
|
"postCreateCommand": "script/bootstrap",
|
||||||
"extensions": [
|
"extensions": [
|
||||||
@@ -26,9 +26,6 @@
|
|||||||
"[typescript]": {
|
"[typescript]": {
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
"[javascript]": {
|
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
||||||
},
|
|
||||||
"files.trimTrailingWhitespace": true
|
"files.trimTrailingWhitespace": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
119
.eslintrc.json
119
.eslintrc.json
@@ -4,7 +4,8 @@
|
|||||||
"plugin:@typescript-eslint/recommended",
|
"plugin:@typescript-eslint/recommended",
|
||||||
"plugin:wc/recommended",
|
"plugin:wc/recommended",
|
||||||
"plugin:lit/recommended",
|
"plugin:lit/recommended",
|
||||||
"prettier"
|
"prettier",
|
||||||
|
"prettier/@typescript-eslint"
|
||||||
],
|
],
|
||||||
"parser": "@typescript-eslint/parser",
|
"parser": "@typescript-eslint/parser",
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
@@ -28,89 +29,63 @@
|
|||||||
"__BUILD__": false,
|
"__BUILD__": false,
|
||||||
"__VERSION__": false,
|
"__VERSION__": false,
|
||||||
"__STATIC_PATH__": false,
|
"__STATIC_PATH__": false,
|
||||||
"Polymer": true
|
"Polymer": true,
|
||||||
|
"webkitSpeechRecognition": false,
|
||||||
|
"ResizeObserver": false
|
||||||
},
|
},
|
||||||
"env": {
|
"env": {
|
||||||
"browser": true,
|
"browser": true,
|
||||||
"es6": true
|
"es6": true
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
"class-methods-use-this": "off",
|
"class-methods-use-this": 0,
|
||||||
"new-cap": "off",
|
"new-cap": 0,
|
||||||
"prefer-template": "off",
|
"prefer-template": 0,
|
||||||
"object-shorthand": "off",
|
"object-shorthand": 0,
|
||||||
"func-names": "off",
|
"func-names": 0,
|
||||||
"no-underscore-dangle": "off",
|
"prefer-arrow-callback": 0,
|
||||||
"strict": "off",
|
"no-underscore-dangle": 0,
|
||||||
"no-plusplus": "off",
|
"strict": 0,
|
||||||
"no-bitwise": "error",
|
"prefer-spread": 0,
|
||||||
"comma-dangle": "off",
|
"no-plusplus": 0,
|
||||||
"vars-on-top": "off",
|
"no-bitwise": 2,
|
||||||
"no-continue": "off",
|
"comma-dangle": 0,
|
||||||
"no-param-reassign": "off",
|
"vars-on-top": 0,
|
||||||
"no-multi-assign": "off",
|
"no-continue": 0,
|
||||||
"no-console": "error",
|
"no-param-reassign": 0,
|
||||||
"radix": "off",
|
"no-multi-assign": 0,
|
||||||
"no-alert": "off",
|
"no-console": 2,
|
||||||
"no-nested-ternary": "off",
|
"radix": 0,
|
||||||
"prefer-destructuring": "off",
|
"no-alert": 0,
|
||||||
|
"no-return-await": 0,
|
||||||
|
"no-nested-ternary": 0,
|
||||||
|
"prefer-destructuring": 0,
|
||||||
"no-restricted-globals": [2, "event"],
|
"no-restricted-globals": [2, "event"],
|
||||||
"prefer-promise-reject-errors": "off",
|
"prefer-promise-reject-errors": 0,
|
||||||
"import/prefer-default-export": "off",
|
"import/order": 0,
|
||||||
"import/no-default-export": "off",
|
"import/prefer-default-export": 0,
|
||||||
"import/no-unresolved": "off",
|
"import/no-unresolved": 0,
|
||||||
"import/no-cycle": "off",
|
"import/no-cycle": 0,
|
||||||
"import/extensions": [
|
"import/extensions": [
|
||||||
"error",
|
2,
|
||||||
"ignorePackages",
|
"ignorePackages",
|
||||||
{ "ts": "never", "js": "never" }
|
{ "ts": "never", "js": "never" }
|
||||||
],
|
],
|
||||||
"no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"],
|
"no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"],
|
||||||
"object-curly-newline": "off",
|
"object-curly-newline": 0,
|
||||||
"default-case": "off",
|
"default-case": 0,
|
||||||
"wc/no-self-class": "off",
|
"wc/no-self-class": 0,
|
||||||
"no-shadow": "off",
|
"no-shadow": 0,
|
||||||
"@typescript-eslint/camelcase": "off",
|
"@typescript-eslint/camelcase": 0,
|
||||||
"@typescript-eslint/ban-ts-comment": "off",
|
"@typescript-eslint/ban-ts-comment": 0,
|
||||||
"@typescript-eslint/no-use-before-define": "off",
|
"@typescript-eslint/no-use-before-define": 0,
|
||||||
"@typescript-eslint/no-non-null-assertion": "off",
|
"@typescript-eslint/no-non-null-assertion": 0,
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": 0,
|
||||||
"@typescript-eslint/explicit-function-return-type": "off",
|
"@typescript-eslint/no-unused-vars": 0,
|
||||||
"@typescript-eslint/explicit-module-boundary-types": "off",
|
"@typescript-eslint/explicit-function-return-type": 0,
|
||||||
"@typescript-eslint/no-shadow": ["error"],
|
"@typescript-eslint/explicit-module-boundary-types": 0,
|
||||||
"@typescript-eslint/naming-convention": [
|
"@typescript-eslint/no-shadow": ["error"]
|
||||||
"off",
|
|
||||||
{
|
|
||||||
"selector": "default",
|
|
||||||
"format": ["camelCase", "snake_case"],
|
|
||||||
"leadingUnderscore": "allow",
|
|
||||||
"trailingUnderscore": "allow"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"selector": ["variable"],
|
|
||||||
"format": ["camelCase", "snake_case", "UPPER_CASE"],
|
|
||||||
"leadingUnderscore": "allow",
|
|
||||||
"trailingUnderscore": "allow"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"selector": "typeLike",
|
|
||||||
"format": ["PascalCase"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"@typescript-eslint/no-unused-vars": "off",
|
|
||||||
"unused-imports/no-unused-vars": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"vars": "all",
|
|
||||||
"varsIgnorePattern": "^_",
|
|
||||||
"args": "after-used",
|
|
||||||
"argsIgnorePattern": "^_",
|
|
||||||
"ignoreRestSiblings": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"unused-imports/no-unused-imports": "error",
|
|
||||||
"lit/attribute-value-entities": "off"
|
|
||||||
},
|
},
|
||||||
"plugins": ["disable", "unused-imports"],
|
"plugins": ["disable", "import", "lit", "prettier", "@typescript-eslint"],
|
||||||
"processor": "disable/disable"
|
"processor": "disable/disable"
|
||||||
}
|
}
|
||||||
|
@@ -74,12 +74,12 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Problem-relevant frontend configuration
|
## Problem-relevant configuration
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
An example configuration that caused the problem for you, e.g. the YAML configuration
|
An example configuration that caused the problem for you. Fill this out even
|
||||||
of the used cards. Fill this out even if it seems unimportant to you. Please be sure
|
if it seems unimportant to you. Please be sure to remove personal information
|
||||||
to remove personal information like passwords, private URLs and other credentials.
|
like passwords, private URLs and other credentials.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
@@ -89,7 +89,7 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
|||||||
## Javascript errors shown in your browser console/inspector
|
## Javascript errors shown in your browser console/inspector
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
If you come across any Javascript or other error logs, e.g. in your browser
|
If you come across any javascript or other error logs, e.g., in your browser
|
||||||
console/inspector please provide them.
|
console/inspector please provide them.
|
||||||
-->
|
-->
|
||||||
|
|
121
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
121
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,121 +0,0 @@
|
|||||||
name: Report a bug with the UI, Frontend or Lovelace
|
|
||||||
description: Report an issue related to the Home Assistant frontend.
|
|
||||||
labels: bug
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Make sure you are running the [latest version of Home Assistant][releases] before reporting an issue.
|
|
||||||
|
|
||||||
If you have a feature or enhancement request for the frontend, please [start an discussion][fr] instead of creating an issue.
|
|
||||||
|
|
||||||
**Please not not report issues for custom Lovelace cards.**
|
|
||||||
|
|
||||||
[fr]: https://github.com/home-assistant/frontend/discussions
|
|
||||||
[releases]: https://github.com/home-assistant/home-assistant/releases
|
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Checklist
|
|
||||||
description: Please verify that you've followed these steps
|
|
||||||
options:
|
|
||||||
- label: I have updated to the latest available Home Assistant version.
|
|
||||||
required: true
|
|
||||||
- label: I have cleared the cache of my browser.
|
|
||||||
required: true
|
|
||||||
- label: I have tried a different browser to see if it is related to my browser.
|
|
||||||
required: true
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
## The problem
|
|
||||||
- type: textarea
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
attributes:
|
|
||||||
label: Describe the issue you are experiencing
|
|
||||||
description: Provide a clear and concise description of what the bug is.
|
|
||||||
- type: textarea
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
attributes:
|
|
||||||
label: Describe the behavior you expected
|
|
||||||
description: Describe what you expected to happen or it should look/behave.
|
|
||||||
- type: textarea
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
attributes:
|
|
||||||
label: Steps to reproduce the issue
|
|
||||||
description: |
|
|
||||||
Please tell us exactly how to reproduce your issue.
|
|
||||||
Provide clear and concise step by step instructions and add code snippets if needed.
|
|
||||||
value: |
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
...
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
## Environment
|
|
||||||
- type: input
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
attributes:
|
|
||||||
label: What version of Home Assistant Core has the issue?
|
|
||||||
placeholder: core-
|
|
||||||
description: >
|
|
||||||
Can be found in the Configuration panel -> Info.
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: What was the last working version of Home Assistant Core?
|
|
||||||
placeholder: core-
|
|
||||||
description: >
|
|
||||||
If known, otherwise leave blank.
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: In which browser are you experiencing the issue with?
|
|
||||||
placeholder: Google Chrome 88.0.4324.150
|
|
||||||
description: >
|
|
||||||
Provide the full name and don't forget to add the version!
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: Which operating system are you using to run this browser?
|
|
||||||
placeholder: macOS Big Sur (1.11)
|
|
||||||
description: >
|
|
||||||
Don't forget to add the version!
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
# Details
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: State of relevant entities
|
|
||||||
description: >
|
|
||||||
If your issue is about how an entity is shown in the UI, please add the
|
|
||||||
state and attributes for all situations. You can find this information
|
|
||||||
at Developer Tools -> States.
|
|
||||||
render: txt
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Problem-relevant frontend configuration
|
|
||||||
description: >
|
|
||||||
An example configuration that caused the problem for you, e.g., the YAML
|
|
||||||
configuration of the used cards. Fill this out even if it seems
|
|
||||||
unimportant to you. Please be sure to remove personal information like
|
|
||||||
passwords, private URLs and other credentials.
|
|
||||||
render: yaml
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Javascript errors shown in your browser console/inspector
|
|
||||||
description: >
|
|
||||||
If you come across any Javascript or other error logs, e.g., in your
|
|
||||||
browser console/inspector please provide them.
|
|
||||||
render: txt
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Additional information
|
|
||||||
description: >
|
|
||||||
If you have any additional information for us, use the field below.
|
|
||||||
Please note, you can attach screenshots or screen recordings here, by
|
|
||||||
dragging and dropping files in the field below.
|
|
82
.github/workflows/ci.yaml
vendored
82
.github/workflows/ci.yaml
vendored
@@ -10,21 +10,26 @@ on:
|
|||||||
- dev
|
- dev
|
||||||
- master
|
- master
|
||||||
|
|
||||||
env:
|
|
||||||
NODE_VERSION: 14
|
|
||||||
NODE_OPTIONS: --max_old_space_size=4096
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Set up Node ${{ env.NODE_VERSION }}
|
- name: Setting up Node.js
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: 12.x
|
||||||
cache: yarn
|
- name: Get yarn cache path
|
||||||
|
id: yarn-cache-dir-path
|
||||||
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||||
|
- name: Fetching Yarn cache
|
||||||
|
uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
env:
|
env:
|
||||||
@@ -32,40 +37,54 @@ jobs:
|
|||||||
- name: Build resources
|
- name: Build resources
|
||||||
run: ./node_modules/.bin/gulp gen-icons-json build-translations gather-gallery-demos
|
run: ./node_modules/.bin/gulp gen-icons-json build-translations gather-gallery-demos
|
||||||
- name: Run eslint
|
- name: Run eslint
|
||||||
run: yarn run lint:eslint
|
run: ./node_modules/.bin/eslint '{**/src,src}/**/*.{js,ts,html}' --ignore-path .gitignore
|
||||||
- name: Run tsc
|
- name: Run tsc
|
||||||
run: yarn run lint:types
|
run: ./node_modules/.bin/tsc
|
||||||
- name: Run prettier
|
|
||||||
run: yarn run lint:prettier
|
|
||||||
- name: Check for duplicate dependencies
|
|
||||||
run: yarn dedupe --check
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Set up Node ${{ env.NODE_VERSION }}
|
- name: Setting up Node.js
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: 12.x
|
||||||
cache: yarn
|
- name: Get yarn cache path
|
||||||
|
id: yarn-cache-dir-path
|
||||||
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||||
|
- name: Fetching Yarn cache
|
||||||
|
uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
env:
|
env:
|
||||||
CI: true
|
CI: true
|
||||||
- name: Run Mocha
|
- name: Run Mocha
|
||||||
run: yarn run mocha
|
run: npm run mocha
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [lint, test]
|
needs: [lint, test]
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Set up Node ${{ env.NODE_VERSION }}
|
- name: Setting up Node.js
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: 12.x
|
||||||
cache: yarn
|
- name: Get yarn cache path
|
||||||
|
id: yarn-cache-dir-path
|
||||||
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||||
|
- name: Fetching Yarn cache
|
||||||
|
uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
env:
|
env:
|
||||||
@@ -80,11 +99,20 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Set up Node ${{ env.NODE_VERSION }}
|
- name: Setting up Node.js
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: 12.x
|
||||||
cache: yarn
|
- name: Get yarn cache path
|
||||||
|
id: yarn-cache-dir-path
|
||||||
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||||
|
- name: Fetching Yarn cache
|
||||||
|
uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
env:
|
env:
|
||||||
|
22
.github/workflows/demo.yaml
vendored
22
.github/workflows/demo.yaml
vendored
@@ -4,22 +4,26 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- dev
|
- dev
|
||||||
|
|
||||||
env:
|
|
||||||
NODE_VERSION: 14
|
|
||||||
NODE_OPTIONS: --max_old_space_size=4096
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Set up Node ${{ env.NODE_VERSION }}
|
- name: Setting up Node.js
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: 12.x
|
||||||
cache: yarn
|
- name: Get yarn cache path
|
||||||
|
id: yarn-cache-dir-path
|
||||||
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||||
|
- name: Fetching Yarn cache
|
||||||
|
uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install
|
run: yarn install
|
||||||
env:
|
env:
|
||||||
|
19
.github/workflows/netflify.yml
vendored
19
.github/workflows/netflify.yml
vendored
@@ -1,19 +0,0 @@
|
|||||||
name: Netlify
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 * * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
trigger_builds:
|
|
||||||
name: Trigger netlify build preview
|
|
||||||
runs-on: "ubuntu-latest"
|
|
||||||
steps:
|
|
||||||
- name: Trigger Cast build
|
|
||||||
run: curl -X POST -d {} https://api.netlify.com/build_hooks/${{ secrets.NETLIFY_CAST_DEV_BUILD_HOOK }}
|
|
||||||
|
|
||||||
- name: Trigger Demo build
|
|
||||||
run: curl -X POST -d {} https://api.netlify.com/build_hooks/${{ secrets.NETLIFY_DEMO_DEV_BUILD_HOOK }}
|
|
||||||
|
|
||||||
- name: Trigger Gallery build
|
|
||||||
run: curl -X POST -d {} https://api.netlify.com/build_hooks/${{ secrets.NETLIFY_GALLERY_DEV_BUILD_HOOK }}
|
|
92
.github/workflows/release.yaml
vendored
92
.github/workflows/release.yaml
vendored
@@ -1,92 +0,0 @@
|
|||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types:
|
|
||||||
- published
|
|
||||||
|
|
||||||
env:
|
|
||||||
PYTHON_VERSION: 3.8
|
|
||||||
NODE_VERSION: 14
|
|
||||||
NODE_OPTIONS: --max_old_space_size=4096
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout the repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Verify version
|
|
||||||
uses: home-assistant/actions/helpers/verify-version@master
|
|
||||||
|
|
||||||
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
with:
|
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
|
||||||
|
|
||||||
- name: Set up Node ${{ env.NODE_VERSION }}
|
|
||||||
uses: actions/setup-node@v2
|
|
||||||
with:
|
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
|
||||||
cache: yarn
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: yarn install
|
|
||||||
|
|
||||||
- name: Download Translations
|
|
||||||
run: ./script/translations_download
|
|
||||||
env:
|
|
||||||
LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
|
|
||||||
- name: Build and release package
|
|
||||||
run: |
|
|
||||||
python3 -m pip install twine
|
|
||||||
export TWINE_USERNAME="__token__"
|
|
||||||
export TWINE_PASSWORD="${{ secrets.TWINE_TOKEN }}"
|
|
||||||
|
|
||||||
script/release
|
|
||||||
|
|
||||||
wheels-init:
|
|
||||||
name: Init wheels build
|
|
||||||
needs: release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Generate requirements.txt
|
|
||||||
run: |
|
|
||||||
# Sleep to give pypi time to populate the new version across mirrors
|
|
||||||
sleep 240
|
|
||||||
version=$(echo "${{ github.ref }}" | awk -F"/" '{print $NF}' )
|
|
||||||
echo "home-assistant-frontend==$version" > ./requirements.txt
|
|
||||||
|
|
||||||
- name: Upload requirements.txt
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: requirements
|
|
||||||
path: ./requirements.txt
|
|
||||||
|
|
||||||
build-wheels:
|
|
||||||
name: Build wheels for ${{ matrix.arch }}
|
|
||||||
needs: wheels-init
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
arch: ["aarch64", "armhf", "armv7", "amd64", "i386"]
|
|
||||||
tag:
|
|
||||||
- "3.8-alpine3.12"
|
|
||||||
- "3.9-alpine3.13"
|
|
||||||
steps:
|
|
||||||
- name: Download requirements.txt
|
|
||||||
uses: actions/download-artifact@v2
|
|
||||||
with:
|
|
||||||
name: requirements
|
|
||||||
|
|
||||||
- name: Build wheels
|
|
||||||
uses: home-assistant/wheels@master
|
|
||||||
with:
|
|
||||||
tag: ${{ matrix.tag }}
|
|
||||||
arch: ${{ matrix.arch }}
|
|
||||||
wheels-host: ${{ secrets.WHEELS_HOST }}
|
|
||||||
wheels-key: ${{ secrets.WHEELS_KEY }}
|
|
||||||
wheels-user: wheels
|
|
||||||
requirements: "requirements.txt"
|
|
25
.github/workflows/translations.yaml
vendored
25
.github/workflows/translations.yaml
vendored
@@ -1,25 +0,0 @@
|
|||||||
name: Translations
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- dev
|
|
||||||
paths:
|
|
||||||
- src/translations/en.json
|
|
||||||
|
|
||||||
env:
|
|
||||||
NODE_VERSION: 14
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
upload:
|
|
||||||
name: Upload
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout the repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Upload Translations
|
|
||||||
run: |
|
|
||||||
export LOKALISE_TOKEN="${{ secrets.LOKALISE_TOKEN }}"
|
|
||||||
|
|
||||||
./script/translations_upload_base
|
|
27
.gitignore
vendored
27
.gitignore
vendored
@@ -1,23 +1,10 @@
|
|||||||
.DS_Store
|
|
||||||
.reify-cache
|
|
||||||
|
|
||||||
# build
|
|
||||||
build
|
build
|
||||||
build-translations/*
|
build-translations/*
|
||||||
hass_frontend/*
|
|
||||||
dist
|
|
||||||
|
|
||||||
# yarn
|
|
||||||
.yarn/*
|
|
||||||
!.yarn/patches
|
|
||||||
!.yarn/releases
|
|
||||||
!.yarn/plugins
|
|
||||||
!.yarn/sdks
|
|
||||||
!.yarn/versions
|
|
||||||
.pnp.*
|
|
||||||
node_modules/*
|
node_modules/*
|
||||||
yarn-error.log
|
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
|
.DS_Store
|
||||||
|
hass_frontend/*
|
||||||
|
.reify-cache
|
||||||
|
|
||||||
# Python stuff
|
# Python stuff
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
@@ -27,8 +14,11 @@ npm-debug.log
|
|||||||
# venv stuff
|
# venv stuff
|
||||||
pyvenv.cfg
|
pyvenv.cfg
|
||||||
pip-selfcheck.json
|
pip-selfcheck.json
|
||||||
venv/*
|
venv
|
||||||
.venv
|
.venv
|
||||||
|
lib
|
||||||
|
bin
|
||||||
|
dist
|
||||||
|
|
||||||
# vscode
|
# vscode
|
||||||
.vscode/*
|
.vscode/*
|
||||||
@@ -41,8 +31,9 @@ src/cast/dev_const.ts
|
|||||||
|
|
||||||
# Secrets
|
# Secrets
|
||||||
.lokalise_token
|
.lokalise_token
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
# asdf
|
#asdf
|
||||||
.tool-versions
|
.tool-versions
|
||||||
|
|
||||||
# Home Assistant config
|
# Home Assistant config
|
||||||
|
6
.hound.yml
Normal file
6
.hound.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
jshint:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
eslint:
|
||||||
|
enabled: true
|
||||||
|
config_file: .eslintrc-hound.json
|
@@ -1,4 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
require: "test-mocha/testconf.js",
|
|
||||||
timeout: 10000,
|
|
||||||
};
|
|
File diff suppressed because one or more lines are too long
@@ -1,29 +0,0 @@
|
|||||||
diff --git a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js
|
|
||||||
index d92179f7fd5315203f870a6963e871dc8ddf6c0c..362e284121b97e0fba0925225777aebc32e26b8d 100644
|
|
||||||
--- a/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js
|
|
||||||
+++ b/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js
|
|
||||||
@@ -1,14 +1,15 @@
|
|
||||||
-let _ET, ET;
|
|
||||||
+let _ET;
|
|
||||||
+let ET;
|
|
||||||
export default async function EventTarget() {
|
|
||||||
- return ET || init();
|
|
||||||
+ return ET || init();
|
|
||||||
}
|
|
||||||
async function init() {
|
|
||||||
- _ET = window.EventTarget;
|
|
||||||
- try {
|
|
||||||
- new _ET();
|
|
||||||
- }
|
|
||||||
- catch (_a) {
|
|
||||||
- _ET = (await import('event-target-shim')).EventTarget;
|
|
||||||
- }
|
|
||||||
- return (ET = _ET);
|
|
||||||
+ _ET = window.EventTarget;
|
|
||||||
+ try {
|
|
||||||
+ new _ET();
|
|
||||||
+ } catch (_a) {
|
|
||||||
+ _ET = (await import("event-target-shim")).default.EventTarget;
|
|
||||||
+ }
|
|
||||||
+ return (ET = _ET);
|
|
||||||
}
|
|
@@ -1,34 +0,0 @@
|
|||||||
diff --git a/lib/legacy/class.js b/lib/legacy/class.js
|
|
||||||
index aee2511be1cd9bf900ee552bc98190c1631c57c0..f2f499d68bf52034cac9c28307c99e8ce6b8417d 100644
|
|
||||||
--- a/lib/legacy/class.js
|
|
||||||
+++ b/lib/legacy/class.js
|
|
||||||
@@ -304,17 +304,23 @@ function GenerateClassFromInfo(info, Base, behaviors) {
|
|
||||||
// only proceed if the generated class' prototype has not been registered.
|
|
||||||
const generatedProto = PolymerGenerated.prototype;
|
|
||||||
if (!generatedProto.hasOwnProperty(JSCompiler_renameProperty('__hasRegisterFinished', generatedProto))) {
|
|
||||||
- generatedProto.__hasRegisterFinished = true;
|
|
||||||
+ // make sure legacy lifecycle is called on the *element*'s prototype
|
|
||||||
+ // and not the generated class prototype; if the element has been
|
|
||||||
+ // extended, these are *not* the same.
|
|
||||||
+ const proto = Object.getPrototypeOf(this);
|
|
||||||
+ // Only set flag when generated prototype itself is registered,
|
|
||||||
+ // as this element may be extended from, and needs to run `registered`
|
|
||||||
+ // on all behaviors on the subclass as well.
|
|
||||||
+ if (proto === generatedProto) {
|
|
||||||
+ generatedProto.__hasRegisterFinished = true;
|
|
||||||
+ }
|
|
||||||
// ensure superclass is registered first.
|
|
||||||
super._registered();
|
|
||||||
// copy properties onto the generated class lazily if we're optimizing,
|
|
||||||
- if (legacyOptimizations) {
|
|
||||||
+ if (legacyOptimizations && !Object.hasOwnProperty(generatedProto, '__hasCopiedProperties')) {
|
|
||||||
+ generatedProto.__hasCopiedProperties = true;
|
|
||||||
copyPropertiesToProto(generatedProto);
|
|
||||||
}
|
|
||||||
- // make sure legacy lifecycle is called on the *element*'s prototype
|
|
||||||
- // and not the generated class prototype; if the element has been
|
|
||||||
- // extended, these are *not* the same.
|
|
||||||
- const proto = Object.getPrototypeOf(this);
|
|
||||||
let list = lifecycle.beforeRegister;
|
|
||||||
if (list) {
|
|
||||||
for (let i=0; i < list.length; i++) {
|
|
File diff suppressed because one or more lines are too long
8
.yarn/plugins/@yarnpkg/plugin-typescript.cjs
vendored
8
.yarn/plugins/@yarnpkg/plugin-typescript.cjs
vendored
File diff suppressed because one or more lines are too long
55
.yarn/releases/yarn-2.4.2.cjs
vendored
55
.yarn/releases/yarn-2.4.2.cjs
vendored
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
|
|||||||
nodeLinker: node-modules
|
|
||||||
|
|
||||||
plugins:
|
|
||||||
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
|
|
||||||
spec: "@yarnpkg/plugin-typescript"
|
|
||||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
|
||||||
spec: "@yarnpkg/plugin-interactive-tools"
|
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-2.4.2.cjs
|
|
@@ -14,7 +14,7 @@ This is the repository for the official [Home Assistant](https://home-assistant.
|
|||||||
- Development: [Instructions](https://developers.home-assistant.io/docs/frontend/development/)
|
- Development: [Instructions](https://developers.home-assistant.io/docs/frontend/development/)
|
||||||
- Production build: `script/build_frontend`
|
- Production build: `script/build_frontend`
|
||||||
- Gallery: `cd gallery && script/develop_gallery`
|
- Gallery: `cd gallery && script/develop_gallery`
|
||||||
- Supervisor: [Instructions](https://developers.home-assistant.io/docs/supervisor/developing)
|
- Hass.io: [Instructions](https://developers.home-assistant.io/docs/en/hassio_hass.html)
|
||||||
|
|
||||||
## Frontend development
|
## Frontend development
|
||||||
|
|
||||||
|
30
azure-pipelines-netlify.yml
Normal file
30
azure-pipelines-netlify.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# https://dev.azure.com/home-assistant
|
||||||
|
|
||||||
|
trigger: none
|
||||||
|
pr: none
|
||||||
|
schedules:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
displayName: "build preview"
|
||||||
|
branches:
|
||||||
|
include:
|
||||||
|
- dev
|
||||||
|
always: true
|
||||||
|
variables:
|
||||||
|
- group: netlify
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
- job: 'Netlify_preview'
|
||||||
|
pool:
|
||||||
|
vmImage: 'ubuntu-latest'
|
||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
# Cast
|
||||||
|
curl -X POST -d {} https://api.netlify.com/build_hooks/${NETLIFY_CAST}
|
||||||
|
|
||||||
|
# Demo
|
||||||
|
curl -X POST -d {} https://api.netlify.com/build_hooks/${NETLIFY_DEMO}
|
||||||
|
|
||||||
|
# Gallery
|
||||||
|
curl -X POST -d {} https://api.netlify.com/build_hooks/${NETLIFY_GALLERY}
|
||||||
|
displayName: 'Trigger netlify build preview'
|
59
azure-pipelines-release.yml
Normal file
59
azure-pipelines-release.yml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# https://dev.azure.com/home-assistant
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
batch: true
|
||||||
|
tags:
|
||||||
|
include:
|
||||||
|
- "*"
|
||||||
|
pr: none
|
||||||
|
variables:
|
||||||
|
- name: versionWheels
|
||||||
|
value: '1.10.1-3.7-alpine3.11'
|
||||||
|
- 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"
|
||||||
|
- stage: "Wheels"
|
||||||
|
jobs:
|
||||||
|
- template: templates/azp-job-wheels.yaml@azure
|
||||||
|
parameters:
|
||||||
|
builderVersion: '$(versionWheels)'
|
||||||
|
wheelsRequirement: 'requirement.txt'
|
||||||
|
preBuild:
|
||||||
|
- script: |
|
||||||
|
sleep 240
|
||||||
|
echo "home-assistant-frontend==$(Build.SourceBranchName)" > requirement.txt
|
70
azure-pipelines-translation.yml
Normal file
70
azure-pipelines-translation.yml
Normal 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: "frontend 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'
|
@@ -1,39 +0,0 @@
|
|||||||
# Bundling Home Assistant Frontend
|
|
||||||
|
|
||||||
The Home Assistant build pipeline contains various steps to prepare a build.
|
|
||||||
|
|
||||||
- Generating icon files to be included
|
|
||||||
- Generating translation files to be included
|
|
||||||
- Converting TypeScript, CSS and JSON files to JavaScript
|
|
||||||
- Bundling
|
|
||||||
- Minifying the files
|
|
||||||
- Generating the HTML entrypoint files
|
|
||||||
- Generating the service worker
|
|
||||||
- Compressing the files
|
|
||||||
|
|
||||||
## Converting files
|
|
||||||
|
|
||||||
Currently in Home Assistant we use a bundler to convert TypeScript, CSS and JSON files to JavaScript files that the browser understands.
|
|
||||||
|
|
||||||
We currently rely on Webpack but also have experimental Rollup support. Both of these programs bundle the converted files in both production and development.
|
|
||||||
|
|
||||||
For development, bundling is optional. We just want to get the right files in the browser.
|
|
||||||
|
|
||||||
Responsibilities of the converter during development:
|
|
||||||
|
|
||||||
- Convert TypeScript to JavaScript
|
|
||||||
- Convert CSS to JavaScript that sets the content as the default export
|
|
||||||
- Convert JSON to JavaScript that sets the content as the default export
|
|
||||||
- Make sure import, dynamic import and web worker references work
|
|
||||||
- Add extensions where missing
|
|
||||||
- Resolve absolute package imports
|
|
||||||
- Filter out specific imports/packages
|
|
||||||
- Replace constants with values
|
|
||||||
|
|
||||||
In production, the following responsibilities are added:
|
|
||||||
|
|
||||||
- Minify HTML
|
|
||||||
- Bundle multiple imports so that the browser can fetch less files
|
|
||||||
- Generate a second version that is ES5 compatible
|
|
||||||
|
|
||||||
Configuration for all these steps are specified in [bundle.js](bundle.js).
|
|
@@ -1,170 +0,0 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const path = require("path");
|
|
||||||
|
|
||||||
// Currently only supports CommonJS modules, as require is synchronous. `import` would need babel running asynchronous.
|
|
||||||
module.exports = function inlineConstants(babel, options, cwd) {
|
|
||||||
const t = babel.types;
|
|
||||||
|
|
||||||
if (!Array.isArray(options.modules)) {
|
|
||||||
throw new TypeError(
|
|
||||||
"babel-plugin-inline-constants: expected a `modules` array to be passed"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.resolveExtensions && !Array.isArray(options.resolveExtensions)) {
|
|
||||||
throw new TypeError(
|
|
||||||
"babel-plugin-inline-constants: expected `resolveExtensions` to be an array"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ignoreModuleNotFound = options.ignoreModuleNotFound;
|
|
||||||
const resolveExtensions = options.resolveExtensions;
|
|
||||||
|
|
||||||
const hasRelativeModules = options.modules.some(
|
|
||||||
(module) => module.startsWith(".") || module.startsWith("/")
|
|
||||||
);
|
|
||||||
|
|
||||||
const modules = Object.fromEntries(
|
|
||||||
options.modules.map((module) => {
|
|
||||||
const absolute = module.startsWith(".")
|
|
||||||
? require.resolve(module, { paths: [cwd] })
|
|
||||||
: module;
|
|
||||||
// eslint-disable-next-line import/no-dynamic-require
|
|
||||||
return [absolute, require(absolute)];
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
const toLiteral = (value) => {
|
|
||||||
if (typeof value === "string") {
|
|
||||||
return t.stringLiteral(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof value === "number") {
|
|
||||||
return t.numericLiteral(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof value === "boolean") {
|
|
||||||
return t.booleanLiteral(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value === null) {
|
|
||||||
return t.nullLiteral();
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(
|
|
||||||
"babel-plugin-inline-constants: cannot handle non-literal `" + value + "`"
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const resolveAbsolute = (value, state, resolveExtensionIndex) => {
|
|
||||||
if (!state.filename) {
|
|
||||||
throw new TypeError(
|
|
||||||
"babel-plugin-inline-constants: expected a `filename` to be set for files"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (resolveExtensions && resolveExtensionIndex !== undefined) {
|
|
||||||
value += resolveExtensions[resolveExtensionIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return require.resolve(value, { paths: [path.dirname(state.filename)] });
|
|
||||||
} catch (error) {
|
|
||||||
if (
|
|
||||||
error.code === "MODULE_NOT_FOUND" &&
|
|
||||||
resolveExtensions &&
|
|
||||||
(resolveExtensionIndex === undefined ||
|
|
||||||
resolveExtensionIndex < resolveExtensions.length - 1)
|
|
||||||
) {
|
|
||||||
const resolveExtensionIdx = (resolveExtensionIndex || -1) + 1;
|
|
||||||
return resolveAbsolute(value, state, resolveExtensionIdx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error.code === "MODULE_NOT_FOUND" && ignoreModuleNotFound) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const importDeclaration = (p, state) => {
|
|
||||||
if (p.node.type !== "ImportDeclaration") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const absolute =
|
|
||||||
hasRelativeModules && p.node.source.value.startsWith(".")
|
|
||||||
? resolveAbsolute(p.node.source.value, state)
|
|
||||||
: p.node.source.value;
|
|
||||||
|
|
||||||
if (!absolute || !(absolute in modules)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const module = modules[absolute];
|
|
||||||
|
|
||||||
for (const specifier of p.node.specifiers) {
|
|
||||||
if (
|
|
||||||
specifier.type === "ImportDefaultSpecifier" &&
|
|
||||||
specifier.local &&
|
|
||||||
specifier.local.type === "Identifier"
|
|
||||||
) {
|
|
||||||
if (!("default" in module)) {
|
|
||||||
throw new Error(
|
|
||||||
"babel-plugin-inline-constants: cannot access default export from `" +
|
|
||||||
p.node.source.value +
|
|
||||||
"`"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const variableValue = toLiteral(module.default);
|
|
||||||
const variable = t.variableDeclarator(
|
|
||||||
t.identifier(specifier.local.name),
|
|
||||||
variableValue
|
|
||||||
);
|
|
||||||
|
|
||||||
p.insertBefore({
|
|
||||||
type: "VariableDeclaration",
|
|
||||||
kind: "const",
|
|
||||||
declarations: [variable],
|
|
||||||
});
|
|
||||||
} else if (
|
|
||||||
specifier.type === "ImportSpecifier" &&
|
|
||||||
specifier.imported &&
|
|
||||||
specifier.imported.type === "Identifier" &&
|
|
||||||
specifier.local &&
|
|
||||||
specifier.local.type === "Identifier"
|
|
||||||
) {
|
|
||||||
if (!(specifier.imported.name in module)) {
|
|
||||||
throw new Error(
|
|
||||||
"babel-plugin-inline-constants: cannot access `" +
|
|
||||||
specifier.imported.name +
|
|
||||||
"` from `" +
|
|
||||||
p.node.source.value +
|
|
||||||
"`"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const variableValue = toLiteral(module[specifier.imported.name]);
|
|
||||||
const variable = t.variableDeclarator(
|
|
||||||
t.identifier(specifier.local.name),
|
|
||||||
variableValue
|
|
||||||
);
|
|
||||||
|
|
||||||
p.insertBefore({
|
|
||||||
type: "VariableDeclaration",
|
|
||||||
kind: "const",
|
|
||||||
declarations: [variable],
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
throw new Error("Cannot handle specifier `" + specifier.type + "`");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.remove();
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
visitor: {
|
|
||||||
ImportDeclaration: importDeclaration,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
@@ -1,10 +1,11 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const env = require("./env.js");
|
const env = require("./env.js");
|
||||||
const paths = require("./paths.js");
|
const paths = require("./paths.js");
|
||||||
|
|
||||||
// Files from NPM Packages that should not be imported
|
// Files from NPM Packages that should not be imported
|
||||||
module.exports.ignorePackages = ({ latestBuild }) => [
|
module.exports.ignorePackages = ({ latestBuild }) => [
|
||||||
|
// Bloats bundle and it's not used.
|
||||||
|
path.resolve(require.resolve("moment"), "../locale"),
|
||||||
// Part of yaml.js and only used for !!js functions that we don't use
|
// Part of yaml.js and only used for !!js functions that we don't use
|
||||||
require.resolve("esprima"),
|
require.resolve("esprima"),
|
||||||
];
|
];
|
||||||
@@ -18,8 +19,7 @@ module.exports.emptyPackages = ({ latestBuild }) =>
|
|||||||
require.resolve("@polymer/paper-styles/default-theme.js"),
|
require.resolve("@polymer/paper-styles/default-theme.js"),
|
||||||
// Loads stuff from a CDN
|
// Loads stuff from a CDN
|
||||||
require.resolve("@polymer/font-roboto/roboto.js"),
|
require.resolve("@polymer/font-roboto/roboto.js"),
|
||||||
require.resolve("@vaadin/vaadin-material-styles/typography.js"),
|
require.resolve("@vaadin/vaadin-material-styles/font-roboto.js"),
|
||||||
require.resolve("@vaadin/vaadin-material-styles/font-icons.js"),
|
|
||||||
// Compatibility not needed for latest builds
|
// Compatibility not needed for latest builds
|
||||||
latestBuild &&
|
latestBuild &&
|
||||||
// wrapped in require.resolve so it blows up if file no longer exists
|
// wrapped in require.resolve so it blows up if file no longer exists
|
||||||
@@ -44,36 +44,24 @@ module.exports.definedVars = ({ isProdBuild, latestBuild, defineOverlay }) => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
module.exports.terserOptions = (latestBuild) => ({
|
module.exports.terserOptions = (latestBuild) => ({
|
||||||
safari10: !latestBuild,
|
safari10: true,
|
||||||
ecma: latestBuild ? undefined : 5,
|
ecma: latestBuild ? undefined : 5,
|
||||||
output: { comments: false },
|
output: { comments: false },
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports.babelOptions = ({ latestBuild }) => ({
|
module.exports.babelOptions = ({ latestBuild }) => ({
|
||||||
babelrc: false,
|
babelrc: false,
|
||||||
compact: false,
|
|
||||||
presets: [
|
presets: [
|
||||||
!latestBuild && [
|
!latestBuild && [
|
||||||
"@babel/preset-env",
|
require("@babel/preset-env").default,
|
||||||
{
|
{
|
||||||
useBuiltIns: "entry",
|
useBuiltIns: "entry",
|
||||||
corejs: "3.15",
|
corejs: "3.6",
|
||||||
bugfixes: true,
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
"@babel/preset-typescript",
|
require("@babel/preset-typescript").default,
|
||||||
].filter(Boolean),
|
].filter(Boolean),
|
||||||
plugins: [
|
plugins: [
|
||||||
[
|
|
||||||
path.resolve(
|
|
||||||
paths.polymer_dir,
|
|
||||||
"build-scripts/babel-plugins/inline-constants-plugin.js"
|
|
||||||
),
|
|
||||||
{
|
|
||||||
modules: ["@mdi/js"],
|
|
||||||
ignoreModuleNotFound: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
// Part of ES2018. Converts {...a, b: 2} to Object.assign({}, a, {b: 2})
|
// Part of ES2018. Converts {...a, b: 2} to Object.assign({}, a, {b: 2})
|
||||||
!latestBuild && [
|
!latestBuild && [
|
||||||
"@babel/plugin-proposal-object-rest-spread",
|
"@babel/plugin-proposal-object-rest-spread",
|
||||||
@@ -84,18 +72,23 @@ module.exports.babelOptions = ({ latestBuild }) => ({
|
|||||||
"@babel/plugin-syntax-dynamic-import",
|
"@babel/plugin-syntax-dynamic-import",
|
||||||
"@babel/plugin-proposal-optional-chaining",
|
"@babel/plugin-proposal-optional-chaining",
|
||||||
"@babel/plugin-proposal-nullish-coalescing-operator",
|
"@babel/plugin-proposal-nullish-coalescing-operator",
|
||||||
["@babel/plugin-proposal-decorators", { decoratorsBeforeExport: true }],
|
[
|
||||||
["@babel/plugin-proposal-private-methods", { loose: true }],
|
require("@babel/plugin-proposal-decorators").default,
|
||||||
["@babel/plugin-proposal-private-property-in-object", { loose: true }],
|
{ decoratorsBeforeExport: true },
|
||||||
["@babel/plugin-proposal-class-properties", { loose: true }],
|
],
|
||||||
|
[
|
||||||
|
require("@babel/plugin-proposal-class-properties").default,
|
||||||
|
{ loose: true },
|
||||||
|
],
|
||||||
].filter(Boolean),
|
].filter(Boolean),
|
||||||
exclude: [
|
|
||||||
// \\ for Windows, / for Mac OS and Linux
|
|
||||||
/node_modules[\\/]core-js/,
|
|
||||||
/node_modules[\\/]webpack[\\/]buildin/,
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Are already ES5, cause warnings when babelified.
|
||||||
|
module.exports.babelExclude = () => [
|
||||||
|
require.resolve("@mdi/js/mdi.js"),
|
||||||
|
require.resolve("hls.js"),
|
||||||
|
];
|
||||||
|
|
||||||
const outputPath = (outputRoot, latestBuild) =>
|
const outputPath = (outputRoot, latestBuild) =>
|
||||||
path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5");
|
path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5");
|
||||||
|
|
||||||
@@ -124,7 +117,7 @@ BundleConfig {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
module.exports.config = {
|
module.exports.config = {
|
||||||
app({ isProdBuild, latestBuild, isStatsBuild, isWDS }) {
|
app({ isProdBuild, latestBuild, isStatsBuild }) {
|
||||||
return {
|
return {
|
||||||
entry: {
|
entry: {
|
||||||
service_worker: "./src/entrypoints/service_worker.ts",
|
service_worker: "./src/entrypoints/service_worker.ts",
|
||||||
@@ -139,7 +132,6 @@ module.exports.config = {
|
|||||||
isProdBuild,
|
isProdBuild,
|
||||||
latestBuild,
|
latestBuild,
|
||||||
isStatsBuild,
|
isStatsBuild,
|
||||||
isWDS,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const paths = require("./paths.js");
|
const paths = require("./paths.js");
|
||||||
@@ -7,9 +6,6 @@ module.exports = {
|
|||||||
useRollup() {
|
useRollup() {
|
||||||
return process.env.ROLLUP === "1";
|
return process.env.ROLLUP === "1";
|
||||||
},
|
},
|
||||||
useWDS() {
|
|
||||||
return process.env.WDS === "1";
|
|
||||||
},
|
|
||||||
isProdBuild() {
|
isProdBuild() {
|
||||||
return (
|
return (
|
||||||
process.env.NODE_ENV === "production" || module.exports.isStatsBuild()
|
process.env.NODE_ENV === "production" || module.exports.isStatsBuild()
|
||||||
|
@@ -12,7 +12,6 @@ require("./webpack.js");
|
|||||||
require("./service-worker.js");
|
require("./service-worker.js");
|
||||||
require("./entry-html.js");
|
require("./entry-html.js");
|
||||||
require("./rollup.js");
|
require("./rollup.js");
|
||||||
require("./wds.js");
|
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"develop-app",
|
"develop-app",
|
||||||
@@ -29,11 +28,7 @@ gulp.task(
|
|||||||
"build-translations"
|
"build-translations"
|
||||||
),
|
),
|
||||||
"copy-static-app",
|
"copy-static-app",
|
||||||
env.useWDS()
|
env.useRollup() ? "rollup-watch-app" : "webpack-watch-app"
|
||||||
? "wds-watch-app"
|
|
||||||
: env.useRollup()
|
|
||||||
? "rollup-watch-app"
|
|
||||||
: "webpack-watch-app"
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -47,8 +42,8 @@ gulp.task(
|
|||||||
gulp.parallel("gen-icons-json", "build-translations"),
|
gulp.parallel("gen-icons-json", "build-translations"),
|
||||||
"copy-static-app",
|
"copy-static-app",
|
||||||
env.useRollup() ? "rollup-prod-app" : "webpack-prod-app",
|
env.useRollup() ? "rollup-prod-app" : "webpack-prod-app",
|
||||||
// Don't compress running tests
|
...// Don't compress running tests
|
||||||
...(env.isTest() ? [] : ["compress-app"]),
|
(env.isTest() ? [] : ["compress-app"]),
|
||||||
gulp.parallel(
|
gulp.parallel(
|
||||||
"gen-pages-prod",
|
"gen-pages-prod",
|
||||||
"gen-index-app-prod",
|
"gen-index-app-prod",
|
||||||
|
@@ -19,7 +19,6 @@ const renderTemplate = (pth, data = {}, pathFunc = templatePath) => {
|
|||||||
return compiled({
|
return compiled({
|
||||||
...data,
|
...data,
|
||||||
useRollup: env.useRollup(),
|
useRollup: env.useRollup(),
|
||||||
useWDS: env.useWDS(),
|
|
||||||
renderTemplate,
|
renderTemplate,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -91,23 +90,10 @@ gulp.task("gen-pages-prod", (done) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("gen-index-app-dev", (done) => {
|
gulp.task("gen-index-app-dev", (done) => {
|
||||||
let latestAppJS, latestCoreJS, latestCustomPanelJS;
|
|
||||||
|
|
||||||
if (env.useWDS()) {
|
|
||||||
latestAppJS = "http://localhost:8000/src/entrypoints/app.ts";
|
|
||||||
latestCoreJS = "http://localhost:8000/src/entrypoints/core.ts";
|
|
||||||
latestCustomPanelJS =
|
|
||||||
"http://localhost:8000/src/entrypoints/custom-panel.ts";
|
|
||||||
} else {
|
|
||||||
latestAppJS = "/frontend_latest/app.js";
|
|
||||||
latestCoreJS = "/frontend_latest/core.js";
|
|
||||||
latestCustomPanelJS = "/frontend_latest/custom-panel.js";
|
|
||||||
}
|
|
||||||
|
|
||||||
const content = renderTemplate("index", {
|
const content = renderTemplate("index", {
|
||||||
latestAppJS,
|
latestAppJS: "/frontend_latest/app.js",
|
||||||
latestCoreJS,
|
latestCoreJS: "/frontend_latest/core.js",
|
||||||
latestCustomPanelJS,
|
latestCustomPanelJS: "/frontend_latest/custom-panel.js",
|
||||||
|
|
||||||
es5AppJS: "/frontend_es5/app.js",
|
es5AppJS: "/frontend_es5/app.js",
|
||||||
es5CoreJS: "/frontend_es5/core.js",
|
es5CoreJS: "/frontend_es5/core.js",
|
||||||
@@ -302,23 +288,15 @@ gulp.task("gen-index-hassio-prod", async () => {
|
|||||||
|
|
||||||
function writeHassioEntrypoint(latestEntrypoint, es5Entrypoint) {
|
function writeHassioEntrypoint(latestEntrypoint, es5Entrypoint) {
|
||||||
fs.mkdirSync(paths.hassio_output_root, { recursive: true });
|
fs.mkdirSync(paths.hassio_output_root, { recursive: true });
|
||||||
// Safari 12 and below does not have a compliant ES2015 implementation of template literals, so we ship ES5
|
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
path.resolve(paths.hassio_output_root, "entrypoint.js"),
|
path.resolve(paths.hassio_output_root, "entrypoint.js"),
|
||||||
`
|
`
|
||||||
function loadES5() {
|
try {
|
||||||
|
new Function("import('${latestEntrypoint}')")();
|
||||||
|
} catch (err) {
|
||||||
var el = document.createElement('script');
|
var el = document.createElement('script');
|
||||||
el.src = '${es5Entrypoint}';
|
el.src = '${es5Entrypoint}';
|
||||||
document.body.appendChild(el);
|
document.body.appendChild(el);
|
||||||
}
|
|
||||||
if (/.*Version\\/(?:11|12)(?:\\.\\d+)*.*Safari\\//.test(navigator.userAgent)) {
|
|
||||||
loadES5();
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
new Function("import('${latestEntrypoint}')")();
|
|
||||||
} catch (err) {
|
|
||||||
loadES5();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
{ encoding: "utf-8" }
|
{ encoding: "utf-8" }
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
const gulp = require("gulp");
|
const gulp = require("gulp");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
const cpx = require("cpx");
|
||||||
const fs = require("fs-extra");
|
const fs = require("fs-extra");
|
||||||
const paths = require("../paths");
|
const paths = require("../paths");
|
||||||
|
|
||||||
@@ -12,10 +13,8 @@ const polyPath = (...parts) => path.resolve(paths.polymer_dir, ...parts);
|
|||||||
const copyFileDir = (fromFile, toDir) =>
|
const copyFileDir = (fromFile, toDir) =>
|
||||||
fs.copySync(fromFile, path.join(toDir, path.basename(fromFile)));
|
fs.copySync(fromFile, path.join(toDir, path.basename(fromFile)));
|
||||||
|
|
||||||
const genStaticPath =
|
const genStaticPath = (staticDir) => (...parts) =>
|
||||||
(staticDir) =>
|
path.resolve(staticDir, ...parts);
|
||||||
(...parts) =>
|
|
||||||
path.resolve(staticDir, ...parts);
|
|
||||||
|
|
||||||
function copyTranslations(staticDir) {
|
function copyTranslations(staticDir) {
|
||||||
const staticPath = genStaticPath(staticDir);
|
const staticPath = genStaticPath(staticDir);
|
||||||
@@ -63,12 +62,9 @@ function copyLoaderJS(staticDir) {
|
|||||||
function copyFonts(staticDir) {
|
function copyFonts(staticDir) {
|
||||||
const staticPath = genStaticPath(staticDir);
|
const staticPath = genStaticPath(staticDir);
|
||||||
// Local fonts
|
// Local fonts
|
||||||
fs.copySync(
|
cpx.copySync(
|
||||||
npmPath("roboto-fontface/fonts/roboto/"),
|
npmPath("roboto-fontface/fonts/roboto/*.woff2"),
|
||||||
staticPath("fonts/roboto/"),
|
staticPath("fonts/roboto")
|
||||||
{
|
|
||||||
filter: (src) => !src.includes(".") || src.endsWith(".woff2"),
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,11 +85,6 @@ gulp.task("copy-translations-app", async () => {
|
|||||||
copyTranslations(staticDir);
|
copyTranslations(staticDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("copy-translations-supervisor", async () => {
|
|
||||||
const staticDir = paths.hassio_output_static;
|
|
||||||
copyTranslations(staticDir);
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("copy-static-app", async () => {
|
gulp.task("copy-static-app", async () => {
|
||||||
const staticDir = paths.app_output_static;
|
const staticDir = paths.app_output_static;
|
||||||
// Basic static files
|
// Basic static files
|
||||||
|
@@ -10,8 +10,6 @@ require("./gen-icons-json.js");
|
|||||||
require("./webpack.js");
|
require("./webpack.js");
|
||||||
require("./compress.js");
|
require("./compress.js");
|
||||||
require("./rollup.js");
|
require("./rollup.js");
|
||||||
require("./gather-static.js");
|
|
||||||
require("./translations.js");
|
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"develop-hassio",
|
"develop-hassio",
|
||||||
@@ -22,8 +20,6 @@ gulp.task(
|
|||||||
"clean-hassio",
|
"clean-hassio",
|
||||||
"gen-icons-json",
|
"gen-icons-json",
|
||||||
"gen-index-hassio-dev",
|
"gen-index-hassio-dev",
|
||||||
"build-supervisor-translations",
|
|
||||||
"copy-translations-supervisor",
|
|
||||||
env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio"
|
env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -36,8 +32,6 @@ gulp.task(
|
|||||||
},
|
},
|
||||||
"clean-hassio",
|
"clean-hassio",
|
||||||
"gen-icons-json",
|
"gen-icons-json",
|
||||||
"build-supervisor-translations",
|
|
||||||
"copy-translations-supervisor",
|
|
||||||
env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio",
|
env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio",
|
||||||
"gen-index-hassio-prod",
|
"gen-index-hassio-prod",
|
||||||
...// Don't compress running tests
|
...// Don't compress running tests
|
||||||
|
@@ -33,10 +33,21 @@ String.prototype.rsplit = function (sep, maxsplit) {
|
|||||||
: split;
|
: split;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Panel translations which should be split from the core translations.
|
// Panel translations which should be split from the core translations. These
|
||||||
const TRANSLATION_FRAGMENTS = Object.keys(
|
// should mirror the fragment definitions in polymer.json, so that we load
|
||||||
require("../../src/translations/en.json").ui.panel
|
// additional resources at equivalent points.
|
||||||
);
|
const TRANSLATION_FRAGMENTS = [
|
||||||
|
"config",
|
||||||
|
"history",
|
||||||
|
"logbook",
|
||||||
|
"mailbox",
|
||||||
|
"profile",
|
||||||
|
"shopping-list",
|
||||||
|
"page-authorize",
|
||||||
|
"page-demo",
|
||||||
|
"page-onboarding",
|
||||||
|
"developer-tools",
|
||||||
|
];
|
||||||
|
|
||||||
function recursiveFlatten(prefix, data) {
|
function recursiveFlatten(prefix, data) {
|
||||||
let output = {};
|
let output = {};
|
||||||
@@ -266,7 +277,6 @@ gulp.task(taskName, function () {
|
|||||||
TRANSLATION_FRAGMENTS.forEach((fragment) => {
|
TRANSLATION_FRAGMENTS.forEach((fragment) => {
|
||||||
delete data.ui.panel[fragment];
|
delete data.ui.panel[fragment];
|
||||||
});
|
});
|
||||||
delete data.supervisor;
|
|
||||||
return data;
|
return data;
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
@@ -343,62 +353,6 @@ gulp.task(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("build-translation-fragment-supervisor", function () {
|
|
||||||
return gulp
|
|
||||||
.src(fullDir + "/*.json")
|
|
||||||
.pipe(transform((data) => data.supervisor))
|
|
||||||
.pipe(gulp.dest(workDir + "/supervisor"));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("build-translation-flatten-supervisor", function () {
|
|
||||||
return gulp
|
|
||||||
.src(workDir + "/supervisor/*.json")
|
|
||||||
.pipe(
|
|
||||||
transform(function (data) {
|
|
||||||
// Polymer.AppLocalizeBehavior requires flattened json
|
|
||||||
return flatten(data);
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(gulp.dest(outDir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("build-translation-write-metadata", function writeMetadata() {
|
|
||||||
return gulp
|
|
||||||
.src(
|
|
||||||
[
|
|
||||||
path.join(paths.translations_src, "translationMetadata.json"),
|
|
||||||
workDir + "/testMetadata.json",
|
|
||||||
workDir + "/translationFingerprints.json",
|
|
||||||
],
|
|
||||||
{ allowEmpty: true }
|
|
||||||
)
|
|
||||||
.pipe(merge({}))
|
|
||||||
.pipe(
|
|
||||||
transform(function (data) {
|
|
||||||
const newData = {};
|
|
||||||
Object.entries(data).forEach(([key, value]) => {
|
|
||||||
// Filter out translations without native name.
|
|
||||||
if (value.nativeName) {
|
|
||||||
newData[key] = value;
|
|
||||||
} else {
|
|
||||||
console.warn(
|
|
||||||
`Skipping language ${key}. Native name was not translated.`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return newData;
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(
|
|
||||||
transform((data) => ({
|
|
||||||
fragments: TRANSLATION_FRAGMENTS,
|
|
||||||
translations: data,
|
|
||||||
}))
|
|
||||||
)
|
|
||||||
.pipe(rename("translationMetadata.json"))
|
|
||||||
.pipe(gulp.dest(workDir));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"build-translations",
|
"build-translations",
|
||||||
gulp.series(
|
gulp.series(
|
||||||
@@ -410,20 +364,42 @@ gulp.task(
|
|||||||
gulp.parallel(...splitTasks),
|
gulp.parallel(...splitTasks),
|
||||||
"build-flattened-translations",
|
"build-flattened-translations",
|
||||||
"build-translation-fingerprints",
|
"build-translation-fingerprints",
|
||||||
"build-translation-write-metadata"
|
function writeMetadata() {
|
||||||
)
|
return gulp
|
||||||
);
|
.src(
|
||||||
|
[
|
||||||
gulp.task(
|
path.join(paths.translations_src, "translationMetadata.json"),
|
||||||
"build-supervisor-translations",
|
workDir + "/testMetadata.json",
|
||||||
gulp.series(
|
workDir + "/translationFingerprints.json",
|
||||||
"clean-translations",
|
],
|
||||||
"ensure-translations-build-dir",
|
{ allowEmpty: true }
|
||||||
"build-master-translation",
|
)
|
||||||
"build-merged-translations",
|
.pipe(merge({}))
|
||||||
"build-translation-fragment-supervisor",
|
.pipe(
|
||||||
"build-translation-flatten-supervisor",
|
transform(function (data) {
|
||||||
"build-translation-fingerprints",
|
const newData = {};
|
||||||
"build-translation-write-metadata"
|
Object.entries(data).forEach(([key, value]) => {
|
||||||
|
// Filter out translations without native name.
|
||||||
|
if (data[key].nativeName) {
|
||||||
|
newData[key] = data[key];
|
||||||
|
} else {
|
||||||
|
console.warn(
|
||||||
|
`Skipping language ${key}. Native name was not translated.`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (data[key]) newData[key] = value;
|
||||||
|
});
|
||||||
|
return newData;
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.pipe(
|
||||||
|
transform((data) => ({
|
||||||
|
fragments: TRANSLATION_FRAGMENTS,
|
||||||
|
translations: data,
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
.pipe(rename("translationMetadata.json"))
|
||||||
|
.pipe(gulp.dest(workDir));
|
||||||
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@@ -1,11 +0,0 @@
|
|||||||
// Tasks to run Rollup
|
|
||||||
const gulp = require("gulp");
|
|
||||||
const { startDevServer } = require("@web/dev-server");
|
|
||||||
|
|
||||||
gulp.task("wds-watch-app", () => {
|
|
||||||
startDevServer({
|
|
||||||
config: {
|
|
||||||
watch: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
@@ -1,5 +1,4 @@
|
|||||||
// Tasks to run webpack.
|
// Tasks to run webpack.
|
||||||
const fs = require("fs");
|
|
||||||
const gulp = require("gulp");
|
const gulp = require("gulp");
|
||||||
const webpack = require("webpack");
|
const webpack = require("webpack");
|
||||||
const WebpackDevServer = require("webpack-dev-server");
|
const WebpackDevServer = require("webpack-dev-server");
|
||||||
@@ -19,13 +18,6 @@ const bothBuilds = (createConfigFunc, params) => [
|
|||||||
createConfigFunc({ ...params, latestBuild: false }),
|
createConfigFunc({ ...params, latestBuild: false }),
|
||||||
];
|
];
|
||||||
|
|
||||||
const isWsl =
|
|
||||||
fs.existsSync("/proc/version") &&
|
|
||||||
fs
|
|
||||||
.readFileSync("/proc/version", "utf-8")
|
|
||||||
.toLocaleLowerCase()
|
|
||||||
.includes("microsoft");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {{
|
* @param {{
|
||||||
* compiler: import("webpack").Compiler,
|
* compiler: import("webpack").Compiler,
|
||||||
@@ -55,7 +47,7 @@ const runDevServer = ({
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
const doneHandler = (done) => (err, stats) => {
|
const handler = (done) => (err, stats) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
log.error(err.stack || err);
|
log.error(err.stack || err);
|
||||||
if (err.details) {
|
if (err.details) {
|
||||||
@@ -75,27 +67,11 @@ const doneHandler = (done) => (err, stats) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const prodBuild = (conf) =>
|
|
||||||
new Promise((resolve) => {
|
|
||||||
webpack(
|
|
||||||
conf,
|
|
||||||
// Resolve promise when done. Because we pass a callback, webpack closes itself
|
|
||||||
doneHandler(resolve)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("webpack-watch-app", () => {
|
gulp.task("webpack-watch-app", () => {
|
||||||
// This command will run forever because we don't close compiler
|
// we are not calling done, so this command will run forever
|
||||||
webpack(
|
webpack(createAppConfig({ isProdBuild: false, latestBuild: true })).watch(
|
||||||
process.env.ES5
|
{ ignored: /build-translations/ },
|
||||||
? bothBuilds(createAppConfig, { isProdBuild: false })
|
handler()
|
||||||
: createAppConfig({ isProdBuild: false, latestBuild: true })
|
|
||||||
).watch(
|
|
||||||
{
|
|
||||||
ignored: /build-translations/,
|
|
||||||
poll: isWsl,
|
|
||||||
},
|
|
||||||
doneHandler()
|
|
||||||
);
|
);
|
||||||
gulp.watch(
|
gulp.watch(
|
||||||
path.join(paths.translations_src, "en.json"),
|
path.join(paths.translations_src, "en.json"),
|
||||||
@@ -103,12 +79,15 @@ gulp.task("webpack-watch-app", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-prod-app", () =>
|
gulp.task(
|
||||||
prodBuild(
|
"webpack-prod-app",
|
||||||
bothBuilds(createAppConfig, {
|
() =>
|
||||||
isProdBuild: true,
|
new Promise((resolve) =>
|
||||||
})
|
webpack(
|
||||||
)
|
bothBuilds(createAppConfig, { isProdBuild: true }),
|
||||||
|
handler(resolve)
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-dev-server-demo", () => {
|
gulp.task("webpack-dev-server-demo", () => {
|
||||||
@@ -119,12 +98,17 @@ gulp.task("webpack-dev-server-demo", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-prod-demo", () =>
|
gulp.task(
|
||||||
prodBuild(
|
"webpack-prod-demo",
|
||||||
bothBuilds(createDemoConfig, {
|
() =>
|
||||||
isProdBuild: true,
|
new Promise((resolve) =>
|
||||||
})
|
webpack(
|
||||||
)
|
bothBuilds(createDemoConfig, {
|
||||||
|
isProdBuild: true,
|
||||||
|
}),
|
||||||
|
handler(resolve)
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-dev-server-cast", () => {
|
gulp.task("webpack-dev-server-cast", () => {
|
||||||
@@ -137,35 +121,41 @@ gulp.task("webpack-dev-server-cast", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-prod-cast", () =>
|
gulp.task(
|
||||||
prodBuild(
|
"webpack-prod-cast",
|
||||||
bothBuilds(createCastConfig, {
|
() =>
|
||||||
isProdBuild: true,
|
new Promise((resolve) =>
|
||||||
})
|
webpack(
|
||||||
)
|
bothBuilds(createCastConfig, {
|
||||||
|
isProdBuild: true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
handler(resolve)
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-watch-hassio", () => {
|
gulp.task("webpack-watch-hassio", () => {
|
||||||
// This command will run forever because we don't close compiler
|
// we are not calling done, so this command will run forever
|
||||||
webpack(
|
webpack(
|
||||||
createHassioConfig({
|
createHassioConfig({
|
||||||
isProdBuild: false,
|
isProdBuild: false,
|
||||||
latestBuild: true,
|
latestBuild: true,
|
||||||
})
|
})
|
||||||
).watch({ ignored: /build-translations/, poll: isWsl }, doneHandler());
|
).watch({}, handler());
|
||||||
|
|
||||||
gulp.watch(
|
|
||||||
path.join(paths.translations_src, "en.json"),
|
|
||||||
gulp.series("build-supervisor-translations", "copy-translations-supervisor")
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-prod-hassio", () =>
|
gulp.task(
|
||||||
prodBuild(
|
"webpack-prod-hassio",
|
||||||
bothBuilds(createHassioConfig, {
|
() =>
|
||||||
isProdBuild: true,
|
new Promise((resolve) =>
|
||||||
})
|
webpack(
|
||||||
)
|
bothBuilds(createHassioConfig, {
|
||||||
|
isProdBuild: true,
|
||||||
|
}),
|
||||||
|
handler(resolve)
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-dev-server-gallery", () => {
|
gulp.task("webpack-dev-server-gallery", () => {
|
||||||
@@ -177,11 +167,17 @@ gulp.task("webpack-dev-server-gallery", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-prod-gallery", () =>
|
gulp.task(
|
||||||
prodBuild(
|
"webpack-prod-gallery",
|
||||||
createGalleryConfig({
|
() =>
|
||||||
isProdBuild: true,
|
new Promise((resolve) =>
|
||||||
latestBuild: true,
|
webpack(
|
||||||
})
|
createGalleryConfig({
|
||||||
)
|
isProdBuild: true,
|
||||||
|
latestBuild: true,
|
||||||
|
}),
|
||||||
|
|
||||||
|
handler(resolve)
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
@@ -35,7 +34,6 @@ module.exports = {
|
|||||||
|
|
||||||
hassio_dir: path.resolve(__dirname, "../hassio"),
|
hassio_dir: path.resolve(__dirname, "../hassio"),
|
||||||
hassio_output_root: path.resolve(__dirname, "../hassio/build"),
|
hassio_output_root: path.resolve(__dirname, "../hassio/build"),
|
||||||
hassio_output_static: path.resolve(__dirname, "../hassio/build/static"),
|
|
||||||
hassio_output_latest: path.resolve(
|
hassio_output_latest: path.resolve(
|
||||||
__dirname,
|
__dirname,
|
||||||
"../hassio/build/frontend_latest"
|
"../hassio/build/frontend_latest"
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
const path = require("path");
|
||||||
|
|
||||||
module.exports = function (userOptions = {}) {
|
module.exports = function (userOptions = {}) {
|
||||||
// Files need to be absolute paths.
|
// Files need to be absolute paths.
|
||||||
// This only works if the file has no exports
|
// This only works if the file has no exports
|
||||||
|
@@ -1,10 +1,9 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
|
||||||
const commonjs = require("@rollup/plugin-commonjs");
|
const commonjs = require("@rollup/plugin-commonjs");
|
||||||
const resolve = require("@rollup/plugin-node-resolve");
|
const resolve = require("@rollup/plugin-node-resolve");
|
||||||
const json = require("@rollup/plugin-json");
|
const json = require("@rollup/plugin-json");
|
||||||
const babel = require("@rollup/plugin-babel").babel;
|
const babel = require("rollup-plugin-babel");
|
||||||
const replace = require("@rollup/plugin-replace");
|
const replace = require("@rollup/plugin-replace");
|
||||||
const visualizer = require("rollup-plugin-visualizer");
|
const visualizer = require("rollup-plugin-visualizer");
|
||||||
const { string } = require("rollup-plugin-string");
|
const { string } = require("rollup-plugin-string");
|
||||||
@@ -32,103 +31,116 @@ const createRollupConfig = ({
|
|||||||
isStatsBuild,
|
isStatsBuild,
|
||||||
publicPath,
|
publicPath,
|
||||||
dontHash,
|
dontHash,
|
||||||
isWDS,
|
}) => {
|
||||||
}) => ({
|
return {
|
||||||
/**
|
/**
|
||||||
* @type { import("rollup").InputOptions }
|
* @type { import("rollup").InputOptions }
|
||||||
*/
|
*/
|
||||||
inputOptions: {
|
inputOptions: {
|
||||||
input: entry,
|
input: entry,
|
||||||
// Some entry points contain no JavaScript. This setting silences a warning about that.
|
// Some entry points contain no JavaScript. This setting silences a warning about that.
|
||||||
// https://rollupjs.org/guide/en/#preserveentrysignatures
|
// https://rollupjs.org/guide/en/#preserveentrysignatures
|
||||||
preserveEntrySignatures: false,
|
preserveEntrySignatures: false,
|
||||||
plugins: [
|
plugins: [
|
||||||
ignore({
|
ignore({
|
||||||
files: bundle.emptyPackages({ latestBuild }),
|
files: bundle.emptyPackages({ latestBuild }),
|
||||||
}),
|
}),
|
||||||
resolve({
|
resolve({
|
||||||
extensions,
|
extensions,
|
||||||
preferBuiltins: false,
|
preferBuiltins: false,
|
||||||
browser: true,
|
browser: true,
|
||||||
rootDir: paths.polymer_dir,
|
rootDir: paths.polymer_dir,
|
||||||
}),
|
}),
|
||||||
commonjs(),
|
commonjs({
|
||||||
json(),
|
namedExports: {
|
||||||
babel({
|
"js-yaml": ["safeDump", "safeLoad"],
|
||||||
...bundle.babelOptions({ latestBuild }),
|
},
|
||||||
extensions,
|
}),
|
||||||
babelHelpers: isWDS ? "inline" : "bundled",
|
json(),
|
||||||
}),
|
babel({
|
||||||
string({
|
...bundle.babelOptions({ latestBuild }),
|
||||||
// Import certain extensions as strings
|
extensions,
|
||||||
include: [path.join(paths.polymer_dir, "node_modules/**/*.css")],
|
exclude: bundle.babelExclude(),
|
||||||
}),
|
}),
|
||||||
replace(bundle.definedVars({ isProdBuild, latestBuild, defineOverlay })),
|
string({
|
||||||
!isWDS &&
|
// Import certain extensions as strings
|
||||||
|
include: [path.join(paths.polymer_dir, "node_modules/**/*.css")],
|
||||||
|
}),
|
||||||
|
replace(
|
||||||
|
bundle.definedVars({ isProdBuild, latestBuild, defineOverlay })
|
||||||
|
),
|
||||||
manifest({
|
manifest({
|
||||||
publicPath,
|
publicPath,
|
||||||
}),
|
}),
|
||||||
!isWDS && worker(),
|
worker(),
|
||||||
!isWDS && dontHashPlugin({ dontHash }),
|
dontHashPlugin({ dontHash }),
|
||||||
!isWDS && isProdBuild && terser(bundle.terserOptions(latestBuild)),
|
isProdBuild && terser(bundle.terserOptions(latestBuild)),
|
||||||
!isWDS &&
|
|
||||||
isStatsBuild &&
|
isStatsBuild &&
|
||||||
visualizer({
|
visualizer({
|
||||||
// https://github.com/btd/rollup-plugin-visualizer#options
|
// https://github.com/btd/rollup-plugin-visualizer#options
|
||||||
open: true,
|
open: true,
|
||||||
sourcemap: true,
|
sourcemap: true,
|
||||||
}),
|
}),
|
||||||
].filter(Boolean),
|
],
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* @type { import("rollup").OutputOptions }
|
* @type { import("rollup").OutputOptions }
|
||||||
*/
|
*/
|
||||||
outputOptions: {
|
outputOptions: {
|
||||||
// https://rollupjs.org/guide/en/#outputdir
|
// https://rollupjs.org/guide/en/#outputdir
|
||||||
dir: outputPath,
|
dir: outputPath,
|
||||||
// https://rollupjs.org/guide/en/#outputformat
|
// https://rollupjs.org/guide/en/#outputformat
|
||||||
format: latestBuild ? "es" : "systemjs",
|
format: latestBuild ? "es" : "systemjs",
|
||||||
// https://rollupjs.org/guide/en/#outputexternallivebindings
|
// https://rollupjs.org/guide/en/#outputexternallivebindings
|
||||||
externalLiveBindings: false,
|
externalLiveBindings: false,
|
||||||
// https://rollupjs.org/guide/en/#outputentryfilenames
|
// https://rollupjs.org/guide/en/#outputentryfilenames
|
||||||
// https://rollupjs.org/guide/en/#outputchunkfilenames
|
// https://rollupjs.org/guide/en/#outputchunkfilenames
|
||||||
// https://rollupjs.org/guide/en/#outputassetfilenames
|
// https://rollupjs.org/guide/en/#outputassetfilenames
|
||||||
entryFileNames:
|
entryFileNames:
|
||||||
isProdBuild && !isStatsBuild ? "[name]-[hash].js" : "[name].js",
|
isProdBuild && !isStatsBuild ? "[name]-[hash].js" : "[name].js",
|
||||||
chunkFileNames: isProdBuild && !isStatsBuild ? "c.[hash].js" : "[name].js",
|
chunkFileNames:
|
||||||
assetFileNames: isProdBuild && !isStatsBuild ? "a.[hash].js" : "[name].js",
|
isProdBuild && !isStatsBuild ? "c.[hash].js" : "[name].js",
|
||||||
// https://rollupjs.org/guide/en/#outputsourcemap
|
assetFileNames:
|
||||||
sourcemap: isProdBuild ? true : "inline",
|
isProdBuild && !isStatsBuild ? "a.[hash].js" : "[name].js",
|
||||||
},
|
// https://rollupjs.org/guide/en/#outputsourcemap
|
||||||
});
|
sourcemap: isProdBuild ? true : "inline",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild, isWDS }) =>
|
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
|
||||||
createRollupConfig(
|
return createRollupConfig(
|
||||||
bundle.config.app({
|
bundle.config.app({
|
||||||
isProdBuild,
|
isProdBuild,
|
||||||
latestBuild,
|
latestBuild,
|
||||||
isStatsBuild,
|
isStatsBuild,
|
||||||
isWDS,
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) =>
|
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
|
||||||
createRollupConfig(
|
return createRollupConfig(
|
||||||
bundle.config.demo({
|
bundle.config.demo({
|
||||||
isProdBuild,
|
isProdBuild,
|
||||||
latestBuild,
|
latestBuild,
|
||||||
isStatsBuild,
|
isStatsBuild,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const createCastConfig = ({ isProdBuild, latestBuild }) =>
|
const createCastConfig = ({ isProdBuild, latestBuild }) => {
|
||||||
createRollupConfig(bundle.config.cast({ isProdBuild, latestBuild }));
|
return createRollupConfig(bundle.config.cast({ isProdBuild, latestBuild }));
|
||||||
|
};
|
||||||
|
|
||||||
const createHassioConfig = ({ isProdBuild, latestBuild }) =>
|
const createHassioConfig = ({ isProdBuild, latestBuild }) => {
|
||||||
createRollupConfig(bundle.config.hassio({ isProdBuild, latestBuild }));
|
return createRollupConfig(bundle.config.hassio({ isProdBuild, latestBuild }));
|
||||||
|
};
|
||||||
|
|
||||||
const createGalleryConfig = ({ isProdBuild, latestBuild }) =>
|
const createGalleryConfig = ({ isProdBuild, latestBuild }) => {
|
||||||
createRollupConfig(bundle.config.gallery({ isProdBuild, latestBuild }));
|
return createRollupConfig(
|
||||||
|
bundle.config.gallery({ isProdBuild, latestBuild })
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createAppConfig,
|
createAppConfig,
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
|
|
||||||
|
@@ -1,10 +1,9 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
const webpack = require("webpack");
|
const webpack = require("webpack");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const TerserPlugin = require("terser-webpack-plugin");
|
const TerserPlugin = require("terser-webpack-plugin");
|
||||||
const { WebpackManifestPlugin } = require("webpack-manifest-plugin");
|
const ManifestPlugin = require("webpack-manifest-plugin");
|
||||||
const paths = require("./paths.js");
|
const paths = require("./paths.js");
|
||||||
const bundle = require("./bundle.js");
|
const bundle = require("./bundle");
|
||||||
const log = require("fancy-log");
|
const log = require("fancy-log");
|
||||||
|
|
||||||
class LogStartCompilePlugin {
|
class LogStartCompilePlugin {
|
||||||
@@ -37,7 +36,6 @@ const createWebpackConfig = ({
|
|||||||
const ignorePackages = bundle.ignorePackages({ latestBuild });
|
const ignorePackages = bundle.ignorePackages({ latestBuild });
|
||||||
return {
|
return {
|
||||||
mode: isProdBuild ? "production" : "development",
|
mode: isProdBuild ? "production" : "development",
|
||||||
target: ["web", latestBuild ? "es2017" : "es5"],
|
|
||||||
devtool: isProdBuild
|
devtool: isProdBuild
|
||||||
? "cheap-module-source-map"
|
? "cheap-module-source-map"
|
||||||
: "eval-cheap-module-source-map",
|
: "eval-cheap-module-source-map",
|
||||||
@@ -47,18 +45,15 @@ const createWebpackConfig = ({
|
|||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
test: /\.m?js$|\.ts$/,
|
test: /\.m?js$|\.ts$/,
|
||||||
|
exclude: bundle.babelExclude(),
|
||||||
use: {
|
use: {
|
||||||
loader: "babel-loader",
|
loader: "babel-loader",
|
||||||
options: {
|
options: bundle.babelOptions({ latestBuild }),
|
||||||
...bundle.babelOptions({ latestBuild }),
|
|
||||||
cacheDirectory: !isProdBuild,
|
|
||||||
cacheCompression: false,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.css$/,
|
test: /\.css$/,
|
||||||
type: "asset/source",
|
use: "raw-loader",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -70,11 +65,9 @@ const createWebpackConfig = ({
|
|||||||
terserOptions: bundle.terserOptions(latestBuild),
|
terserOptions: bundle.terserOptions(latestBuild),
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
moduleIds: isProdBuild && !isStatsBuild ? "deterministic" : "named",
|
|
||||||
chunkIds: isProdBuild && !isStatsBuild ? "deterministic" : "named",
|
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new WebpackManifestPlugin({
|
new ManifestPlugin({
|
||||||
// Only include the JS of entrypoints
|
// Only include the JS of entrypoints
|
||||||
filter: (file) => file.isInitial && !file.name.endsWith(".map"),
|
filter: (file) => file.isInitial && !file.name.endsWith(".map"),
|
||||||
}),
|
}),
|
||||||
@@ -100,7 +93,6 @@ const createWebpackConfig = ({
|
|||||||
? path.resolve(context, resource)
|
? path.resolve(context, resource)
|
||||||
: require.resolve(resource);
|
: require.resolve(resource);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.error(
|
console.error(
|
||||||
"Error in Home Assistant ignore plugin",
|
"Error in Home Assistant ignore plugin",
|
||||||
resource,
|
resource,
|
||||||
@@ -118,25 +110,47 @@ const createWebpackConfig = ({
|
|||||||
new RegExp(bundle.emptyPackages({ latestBuild }).join("|")),
|
new RegExp(bundle.emptyPackages({ latestBuild }).join("|")),
|
||||||
path.resolve(paths.polymer_dir, "src/util/empty.js")
|
path.resolve(paths.polymer_dir, "src/util/empty.js")
|
||||||
),
|
),
|
||||||
|
// We need to change the import of the polyfill for EventTarget, so we replace the polyfill file with our customized one
|
||||||
|
new webpack.NormalModuleReplacementPlugin(
|
||||||
|
new RegExp(
|
||||||
|
require.resolve(
|
||||||
|
"lit-virtualizer/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js"
|
||||||
|
)
|
||||||
|
),
|
||||||
|
path.resolve(paths.polymer_dir, "src/resources/EventTarget-ponyfill.js")
|
||||||
|
),
|
||||||
!isProdBuild && new LogStartCompilePlugin(),
|
!isProdBuild && new LogStartCompilePlugin(),
|
||||||
].filter(Boolean),
|
].filter(Boolean),
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: [".ts", ".js", ".json"],
|
extensions: [".ts", ".js", ".json"],
|
||||||
alias: {
|
|
||||||
"lit/decorators$": "lit/decorators.js",
|
|
||||||
"lit/directive$": "lit/directive.js",
|
|
||||||
"lit/polyfill-support$": "lit/polyfill-support.js",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
filename: ({ chunk }) => {
|
filename: ({ chunk }) => {
|
||||||
if (!isProdBuild || isStatsBuild || dontHash.has(chunk.name)) {
|
if (!isProdBuild || dontHash.has(chunk.name)) {
|
||||||
return `${chunk.name}.js`;
|
return `${chunk.name}.js`;
|
||||||
}
|
}
|
||||||
return `${chunk.name}.${chunk.hash.substr(0, 8)}.js`;
|
return `${chunk.name}.${chunk.hash.substr(0, 8)}.js`;
|
||||||
},
|
},
|
||||||
|
environment: {
|
||||||
|
// The environment supports arrow functions ('() => { ... }').
|
||||||
|
arrowFunction: latestBuild,
|
||||||
|
// The environment supports BigInt as literal (123n).
|
||||||
|
bigIntLiteral: false,
|
||||||
|
// The environment supports const and let for variable declarations.
|
||||||
|
const: latestBuild,
|
||||||
|
// The environment supports destructuring ('{ a, b } = obj').
|
||||||
|
destructuring: latestBuild,
|
||||||
|
// The environment supports an async import() function to import EcmaScript modules.
|
||||||
|
dynamicImport: latestBuild,
|
||||||
|
// The environment supports 'for of' iteration ('for (const x of array) { ... }').
|
||||||
|
forOf: latestBuild,
|
||||||
|
// The environment supports ECMAScript Module syntax to import ECMAScript modules (import ... from '...').
|
||||||
|
module: latestBuild,
|
||||||
|
},
|
||||||
chunkFilename:
|
chunkFilename:
|
||||||
isProdBuild && !isStatsBuild ? "[chunkhash:8].js" : "[id].chunk.js",
|
isProdBuild && !isStatsBuild
|
||||||
|
? "chunk.[chunkhash].js"
|
||||||
|
: "[name].chunk.js",
|
||||||
path: outputPath,
|
path: outputPath,
|
||||||
publicPath,
|
publicPath,
|
||||||
// To silence warning in worker plugin
|
// To silence warning in worker plugin
|
||||||
@@ -145,24 +159,33 @@ const createWebpackConfig = ({
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild }) =>
|
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
|
||||||
createWebpackConfig(
|
return createWebpackConfig(
|
||||||
bundle.config.app({ isProdBuild, latestBuild, isStatsBuild })
|
bundle.config.app({ isProdBuild, latestBuild, isStatsBuild })
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) =>
|
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
|
||||||
createWebpackConfig(
|
return createWebpackConfig(
|
||||||
bundle.config.demo({ isProdBuild, latestBuild, isStatsBuild })
|
bundle.config.demo({ isProdBuild, latestBuild, isStatsBuild })
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const createCastConfig = ({ isProdBuild, latestBuild }) =>
|
const createCastConfig = ({ isProdBuild, latestBuild }) => {
|
||||||
createWebpackConfig(bundle.config.cast({ isProdBuild, latestBuild }));
|
return createWebpackConfig(bundle.config.cast({ isProdBuild, latestBuild }));
|
||||||
|
};
|
||||||
|
|
||||||
const createHassioConfig = ({ isProdBuild, latestBuild }) =>
|
const createHassioConfig = ({ isProdBuild, latestBuild }) => {
|
||||||
createWebpackConfig(bundle.config.hassio({ isProdBuild, latestBuild }));
|
return createWebpackConfig(
|
||||||
|
bundle.config.hassio({ isProdBuild, latestBuild })
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const createGalleryConfig = ({ isProdBuild, latestBuild }) =>
|
const createGalleryConfig = ({ isProdBuild, latestBuild }) => {
|
||||||
createWebpackConfig(bundle.config.gallery({ isProdBuild, latestBuild }));
|
return createWebpackConfig(
|
||||||
|
bundle.config.gallery({ isProdBuild, latestBuild })
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createAppConfig,
|
createAppConfig,
|
||||||
|
@@ -139,7 +139,7 @@
|
|||||||
Your authentication credentials or Home Assistant url are never sent
|
Your authentication credentials or Home Assistant url are never sent
|
||||||
to the Cloud. You can validate this behavior in
|
to the Cloud. You can validate this behavior in
|
||||||
<a
|
<a
|
||||||
href="https://github.com/home-assistant/frontend/tree/dev/cast"
|
href="https://github.com/home-assistant/home-assistant-polymer/tree/dev/cast"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>the source code</a
|
>the source code</a
|
||||||
>.
|
>.
|
||||||
|
@@ -1,9 +1,16 @@
|
|||||||
import "@material/mwc-button/mwc-button";
|
|
||||||
import "@polymer/paper-item/paper-icon-item";
|
import "@polymer/paper-item/paper-icon-item";
|
||||||
import "@polymer/paper-listbox/paper-listbox";
|
import "@polymer/paper-listbox/paper-listbox";
|
||||||
import { Auth, Connection } from "home-assistant-js-websocket";
|
import { Auth, Connection } from "home-assistant-js-websocket";
|
||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, property, state } from "lit/decorators";
|
css,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
property,
|
||||||
|
internalProperty,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
import { CastManager } from "../../../../src/cast/cast_manager";
|
import { CastManager } from "../../../../src/cast/cast_manager";
|
||||||
import {
|
import {
|
||||||
castSendShowLovelaceView,
|
castSendShowLovelaceView,
|
||||||
@@ -25,6 +32,7 @@ import {
|
|||||||
import "../../../../src/layouts/hass-loading-screen";
|
import "../../../../src/layouts/hass-loading-screen";
|
||||||
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
||||||
import "./hc-layout";
|
import "./hc-layout";
|
||||||
|
import "@material/mwc-button/mwc-button";
|
||||||
|
|
||||||
@customElement("hc-cast")
|
@customElement("hc-cast")
|
||||||
class HcCast extends LitElement {
|
class HcCast extends LitElement {
|
||||||
@@ -34,19 +42,21 @@ class HcCast extends LitElement {
|
|||||||
|
|
||||||
@property() public castManager!: CastManager;
|
@property() public castManager!: CastManager;
|
||||||
|
|
||||||
@state() private askWrite = false;
|
@internalProperty() private askWrite = false;
|
||||||
|
|
||||||
@state() private lovelaceConfig?: LovelaceConfig | null;
|
@internalProperty() private lovelaceConfig?: LovelaceConfig | null;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
protected render(): TemplateResult {
|
||||||
if (this.lovelaceConfig === undefined) {
|
if (this.lovelaceConfig === undefined) {
|
||||||
return html`<hass-loading-screen no-toolbar></hass-loading-screen>`;
|
return html` <hass-loading-screen no-toolbar></hass-loading-screen>> `;
|
||||||
}
|
}
|
||||||
|
|
||||||
const error =
|
const error =
|
||||||
this.castManager.castState === "NO_DEVICES_AVAILABLE"
|
this.castManager.castState === "NO_DEVICES_AVAILABLE"
|
||||||
? html`
|
? html`
|
||||||
<p>There were no suitable Chromecast devices to cast to found.</p>
|
<p>
|
||||||
|
There were no suitable Chromecast devices to cast to found.
|
||||||
|
</p>
|
||||||
`
|
`
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
@@ -196,7 +206,7 @@ class HcCast extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResult {
|
||||||
return css`
|
return css`
|
||||||
.center-item {
|
.center-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@@ -11,8 +11,15 @@ import {
|
|||||||
getAuth,
|
getAuth,
|
||||||
getAuthOptions,
|
getAuthOptions,
|
||||||
} from "home-assistant-js-websocket";
|
} from "home-assistant-js-websocket";
|
||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, state } from "lit/decorators";
|
css,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
internalProperty,
|
||||||
|
} from "lit-element";
|
||||||
import { CastManager, getCastManager } from "../../../../src/cast/cast_manager";
|
import { CastManager, getCastManager } from "../../../../src/cast/cast_manager";
|
||||||
import { castSendShowDemo } from "../../../../src/cast/receiver_messages";
|
import { castSendShowDemo } from "../../../../src/cast/receiver_messages";
|
||||||
import {
|
import {
|
||||||
@@ -53,19 +60,19 @@ const INTRO = html`
|
|||||||
|
|
||||||
@customElement("hc-connect")
|
@customElement("hc-connect")
|
||||||
export class HcConnect extends LitElement {
|
export class HcConnect extends LitElement {
|
||||||
@state() private loading = false;
|
@internalProperty() private loading = false;
|
||||||
|
|
||||||
// If we had stored credentials but we cannot connect,
|
// If we had stored credentials but we cannot connect,
|
||||||
// show a screen asking retry or logout.
|
// show a screen asking retry or logout.
|
||||||
@state() private cannotConnect = false;
|
@internalProperty() private cannotConnect = false;
|
||||||
|
|
||||||
@state() private error?: string | TemplateResult;
|
@internalProperty() private error?: string | TemplateResult;
|
||||||
|
|
||||||
@state() private auth?: Auth;
|
@internalProperty() private auth?: Auth;
|
||||||
|
|
||||||
@state() private connection?: Connection;
|
@internalProperty() private connection?: Connection;
|
||||||
|
|
||||||
@state() private castManager?: CastManager | null;
|
@internalProperty() private castManager?: CastManager | null;
|
||||||
|
|
||||||
private openDemo = false;
|
private openDemo = false;
|
||||||
|
|
||||||
@@ -79,7 +86,9 @@ export class HcConnect extends LitElement {
|
|||||||
</div>
|
</div>
|
||||||
<div class="card-actions">
|
<div class="card-actions">
|
||||||
<a href="/">
|
<a href="/">
|
||||||
<mwc-button> Retry </mwc-button>
|
<mwc-button>
|
||||||
|
Retry
|
||||||
|
</mwc-button>
|
||||||
</a>
|
</a>
|
||||||
<div class="spacer"></div>
|
<div class="spacer"></div>
|
||||||
<mwc-button @click=${this._handleLogout}>Log out</mwc-button>
|
<mwc-button @click=${this._handleLogout}>Log out</mwc-button>
|
||||||
@@ -290,7 +299,7 @@ export class HcConnect extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResult {
|
||||||
return css`
|
return css`
|
||||||
.card-content a {
|
.card-content a {
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
|
@@ -4,8 +4,15 @@ import {
|
|||||||
getUser,
|
getUser,
|
||||||
HassUser,
|
HassUser,
|
||||||
} from "home-assistant-js-websocket";
|
} from "home-assistant-js-websocket";
|
||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, property } from "lit/decorators";
|
css,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
property,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
import "../../../../src/components/ha-card";
|
import "../../../../src/components/ha-card";
|
||||||
|
|
||||||
@customElement("hc-layout")
|
@customElement("hc-layout")
|
||||||
@@ -62,7 +69,7 @@ class HcLayout extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResult {
|
||||||
return css`
|
return css`
|
||||||
:host {
|
:host {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -91,12 +98,8 @@ class HcLayout extends LitElement {
|
|||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
padding: 24px 16px 16px;
|
padding: 24px 16px 16px;
|
||||||
display: block;
|
display: block;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero {
|
|
||||||
border-radius: 4px 4px 0 0;
|
|
||||||
}
|
|
||||||
.subtitle {
|
.subtitle {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: var(--secondary-text-color);
|
color: var(--secondary-text-color);
|
||||||
|
@@ -5,8 +5,8 @@ import {
|
|||||||
import { castContext } from "../cast_context";
|
import { castContext } from "../cast_context";
|
||||||
|
|
||||||
export const castDemoLovelace: () => LovelaceConfig = () => {
|
export const castDemoLovelace: () => LovelaceConfig = () => {
|
||||||
const touchSupported =
|
const touchSupported = castContext.getDeviceCapabilities()
|
||||||
castContext.getDeviceCapabilities().touch_input_supported;
|
.touch_input_supported;
|
||||||
return {
|
return {
|
||||||
views: [
|
views: [
|
||||||
{
|
{
|
||||||
|
@@ -1,5 +1,10 @@
|
|||||||
import { html, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, property, state } from "lit/decorators";
|
customElement,
|
||||||
|
html,
|
||||||
|
property,
|
||||||
|
internalProperty,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
import { mockHistory } from "../../../../demo/src/stubs/history";
|
import { mockHistory } from "../../../../demo/src/stubs/history";
|
||||||
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
||||||
import {
|
import {
|
||||||
@@ -16,7 +21,7 @@ import "./hc-lovelace";
|
|||||||
class HcDemo extends HassElement {
|
class HcDemo extends HassElement {
|
||||||
@property({ attribute: false }) public lovelacePath!: string;
|
@property({ attribute: false }) public lovelacePath!: string;
|
||||||
|
|
||||||
@state() private _lovelaceConfig?: LovelaceConfig;
|
@internalProperty() private _lovelaceConfig?: LovelaceConfig;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
protected render(): TemplateResult {
|
||||||
if (!this._lovelaceConfig) {
|
if (!this._lovelaceConfig) {
|
||||||
@@ -33,10 +38,10 @@ class HcDemo extends HassElement {
|
|||||||
|
|
||||||
protected firstUpdated(changedProps) {
|
protected firstUpdated(changedProps) {
|
||||||
super.firstUpdated(changedProps);
|
super.firstUpdated(changedProps);
|
||||||
this._initializeHass();
|
this._initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async _initializeHass() {
|
private async _initialize() {
|
||||||
const initial: Partial<MockHomeAssistant> = {
|
const initial: Partial<MockHomeAssistant> = {
|
||||||
// Override updateHass so that the correct hass lifecycle methods are called
|
// Override updateHass so that the correct hass lifecycle methods are called
|
||||||
updateHass: (hassUpdate: Partial<HomeAssistant>) =>
|
updateHass: (hassUpdate: Partial<HomeAssistant>) =>
|
||||||
|
@@ -1,5 +1,12 @@
|
|||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, property } from "lit/decorators";
|
css,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
property,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
import { HomeAssistant } from "../../../../src/types";
|
import { HomeAssistant } from "../../../../src/types";
|
||||||
|
|
||||||
@customElement("hc-launch-screen")
|
@customElement("hc-launch-screen")
|
||||||
@@ -22,7 +29,7 @@ class HcLaunchScreen extends LitElement {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResult {
|
||||||
return css`
|
return css`
|
||||||
:host {
|
:host {
|
||||||
display: block;
|
display: block;
|
||||||
|
@@ -1,5 +1,12 @@
|
|||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, property } from "lit/decorators";
|
css,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
property,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
||||||
import { Lovelace } from "../../../../src/panels/lovelace/types";
|
import { Lovelace } from "../../../../src/panels/lovelace/types";
|
||||||
import "../../../../src/panels/lovelace/views/hui-view";
|
import "../../../../src/panels/lovelace/views/hui-view";
|
||||||
@@ -28,12 +35,11 @@ class HcLovelace extends LitElement {
|
|||||||
}
|
}
|
||||||
const lovelace: Lovelace = {
|
const lovelace: Lovelace = {
|
||||||
config: this.lovelaceConfig,
|
config: this.lovelaceConfig,
|
||||||
rawConfig: this.lovelaceConfig,
|
|
||||||
editMode: false,
|
editMode: false,
|
||||||
urlPath: this.urlPath!,
|
urlPath: this.urlPath!,
|
||||||
enableFullEditMode: () => undefined,
|
enableFullEditMode: () => undefined,
|
||||||
mode: "storage",
|
mode: "storage",
|
||||||
locale: this.hass.locale,
|
language: "en",
|
||||||
saveConfig: async () => undefined,
|
saveConfig: async () => undefined,
|
||||||
deleteConfig: async () => undefined,
|
deleteConfig: async () => undefined,
|
||||||
setEditMode: () => undefined,
|
setEditMode: () => undefined,
|
||||||
@@ -84,11 +90,10 @@ class HcLovelace extends LitElement {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResult {
|
||||||
return css`
|
return css`
|
||||||
:host {
|
:host {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
height: 0;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
@@ -3,8 +3,12 @@ import {
|
|||||||
getAuth,
|
getAuth,
|
||||||
UnsubscribeFunc,
|
UnsubscribeFunc,
|
||||||
} from "home-assistant-js-websocket";
|
} from "home-assistant-js-websocket";
|
||||||
import { html, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, state } from "lit/decorators";
|
customElement,
|
||||||
|
html,
|
||||||
|
internalProperty,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
import { CAST_NS } from "../../../../src/cast/const";
|
import { CAST_NS } from "../../../../src/cast/const";
|
||||||
import {
|
import {
|
||||||
ConnectMessage,
|
ConnectMessage,
|
||||||
@@ -32,13 +36,13 @@ let resourcesLoaded = false;
|
|||||||
|
|
||||||
@customElement("hc-main")
|
@customElement("hc-main")
|
||||||
export class HcMain extends HassElement {
|
export class HcMain extends HassElement {
|
||||||
@state() private _showDemo = false;
|
@internalProperty() private _showDemo = false;
|
||||||
|
|
||||||
@state() private _lovelaceConfig?: LovelaceConfig;
|
@internalProperty() private _lovelaceConfig?: LovelaceConfig;
|
||||||
|
|
||||||
@state() private _lovelacePath: string | number | null = null;
|
@internalProperty() private _lovelacePath: string | number | null = null;
|
||||||
|
|
||||||
@state() private _error?: string;
|
@internalProperty() private _error?: string;
|
||||||
|
|
||||||
private _unsubLovelace?: UnsubscribeFunc;
|
private _unsubLovelace?: UnsubscribeFunc;
|
||||||
|
|
||||||
@@ -217,17 +221,11 @@ export class HcMain extends HassElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async _generateLovelaceConfig() {
|
private async _generateLovelaceConfig() {
|
||||||
const { generateLovelaceDashboardStrategy } = await import(
|
const { generateLovelaceConfigFromHass } = await import(
|
||||||
"../../../../src/panels/lovelace/strategies/get-strategy"
|
"../../../../src/panels/lovelace/common/generate-lovelace-config"
|
||||||
);
|
);
|
||||||
this._handleNewLovelaceConfig(
|
this._handleNewLovelaceConfig(
|
||||||
await generateLovelaceDashboardStrategy(
|
await generateLovelaceConfigFromHass(this.hass!)
|
||||||
{
|
|
||||||
hass: this.hass!,
|
|
||||||
narrow: false,
|
|
||||||
},
|
|
||||||
"original-states"
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import "web-animations-js/web-animations-next-lite.min";
|
import "web-animations-js/web-animations-next-lite.min";
|
||||||
import "../../../src/resources/ha-style";
|
|
||||||
import "../../../src/resources/roboto";
|
import "../../../src/resources/roboto";
|
||||||
|
import "../../../src/resources/ha-style";
|
||||||
import "./layout/hc-lovelace";
|
import "./layout/hc-lovelace";
|
||||||
|
@@ -54,8 +54,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
|||||||
state: "21",
|
state: "21",
|
||||||
attributes: {
|
attributes: {
|
||||||
friendly_name: "Living room temperature",
|
friendly_name: "Living room temperature",
|
||||||
device_class: "temperature",
|
|
||||||
unit_of_measurement: "°C",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"sensor.study_temp_rounded": {
|
"sensor.study_temp_rounded": {
|
||||||
@@ -63,8 +61,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
|||||||
state: "23",
|
state: "23",
|
||||||
attributes: {
|
attributes: {
|
||||||
friendly_name: "Study temperature",
|
friendly_name: "Study temperature",
|
||||||
device_class: "temperature",
|
|
||||||
unit_of_measurement: "°C",
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"sensor.living_room": {
|
"sensor.living_room": {
|
||||||
@@ -246,15 +242,11 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
|||||||
|
|
||||||
"light.living_room_lights": {
|
"light.living_room_lights": {
|
||||||
entity_id: "light.living_room_lights",
|
entity_id: "light.living_room_lights",
|
||||||
state: "on",
|
state: "off",
|
||||||
attributes: {
|
attributes: {
|
||||||
min_mireds: 111,
|
min_mireds: 111,
|
||||||
max_mireds: 400,
|
max_mireds: 400,
|
||||||
brightness: 175,
|
|
||||||
color_temp: 300,
|
|
||||||
supported_color_modes: ["brightness", "color_temp"],
|
|
||||||
friendly_name: "Living Room Lights",
|
friendly_name: "Living Room Lights",
|
||||||
color_mode: "color_temp",
|
|
||||||
supported_features: 55,
|
supported_features: 55,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -267,27 +259,13 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
|||||||
},
|
},
|
||||||
"light.kitchen_lights": {
|
"light.kitchen_lights": {
|
||||||
entity_id: "light.kitchen_lights",
|
entity_id: "light.kitchen_lights",
|
||||||
state: "on",
|
|
||||||
attributes: {
|
|
||||||
min_mireds: 111,
|
|
||||||
max_mireds: 400,
|
|
||||||
brightness: 200,
|
|
||||||
rgb_color: [255, 175, 96],
|
|
||||||
supported_color_modes: ["brightness", "color_temp", "rgb"],
|
|
||||||
color_mode: "rgb",
|
|
||||||
friendly_name: "Kitchen Lights",
|
|
||||||
supported_features: 55,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"light.lifx5": {
|
|
||||||
entity_id: "light.lifx5",
|
|
||||||
state: "off",
|
state: "off",
|
||||||
attributes: {
|
attributes: {
|
||||||
supported_color_modes: ["brightness"],
|
friendly_name: "Kitchen lights",
|
||||||
friendly_name: "Garage Lights",
|
|
||||||
supported_features: 1,
|
supported_features: 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensor.plexspy": {
|
"sensor.plexspy": {
|
||||||
entity_id: "sensor.plexspy",
|
entity_id: "sensor.plexspy",
|
||||||
state: "0",
|
state: "0",
|
||||||
@@ -500,6 +478,16 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
|||||||
icon: "hademo:history",
|
icon: "hademo:history",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"light.lifx5": {
|
||||||
|
entity_id: "light.lifx5",
|
||||||
|
state: "on",
|
||||||
|
attributes: {
|
||||||
|
min_mireds: 111,
|
||||||
|
max_mireds: 400,
|
||||||
|
friendly_name: "Garage lights",
|
||||||
|
supported_features: 55,
|
||||||
|
},
|
||||||
|
},
|
||||||
"sensor.alok_to_home": {
|
"sensor.alok_to_home": {
|
||||||
entity_id: "sensor.alok_to_home",
|
entity_id: "sensor.alok_to_home",
|
||||||
state: "41",
|
state: "41",
|
||||||
|
@@ -12,7 +12,6 @@ export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
{
|
{
|
||||||
type: "entities",
|
type: "entities",
|
||||||
title: localize("ui.panel.page-demo.config.arsaboo.labels.lights"),
|
title: localize("ui.panel.page-demo.config.arsaboo.labels.lights"),
|
||||||
state_color: true,
|
|
||||||
entities: [
|
entities: [
|
||||||
{
|
{
|
||||||
entity: "light.kitchen_lights",
|
entity: "light.kitchen_lights",
|
||||||
@@ -29,11 +28,6 @@ export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: "Energy distribution today",
|
|
||||||
type: "energy-distribution",
|
|
||||||
link_dashboard: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
type: "thermostat",
|
type: "thermostat",
|
||||||
entity: "climate.upstairs",
|
entity: "climate.upstairs",
|
||||||
@@ -118,7 +112,8 @@ export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
||||||
},
|
},
|
||||||
state_filter: {
|
state_filter: {
|
||||||
on: "brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
on:
|
||||||
|
"brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
||||||
off: "brightness(80%) saturate(0.8)",
|
off: "brightness(80%) saturate(0.8)",
|
||||||
},
|
},
|
||||||
style: {
|
style: {
|
||||||
@@ -200,7 +195,8 @@ export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
||||||
},
|
},
|
||||||
state_filter: {
|
state_filter: {
|
||||||
on: "brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
on:
|
||||||
|
"brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
||||||
off: "brightness(80%) saturate(0.8)",
|
off: "brightness(80%) saturate(0.8)",
|
||||||
},
|
},
|
||||||
style: {
|
style: {
|
||||||
@@ -280,7 +276,8 @@ export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
||||||
},
|
},
|
||||||
state_filter: {
|
state_filter: {
|
||||||
on: "brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
on:
|
||||||
|
"brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
||||||
off: "brightness(80%) saturate(0.8)",
|
off: "brightness(80%) saturate(0.8)",
|
||||||
},
|
},
|
||||||
style: {
|
style: {
|
||||||
@@ -317,7 +314,8 @@ export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
on: "/assets/arsaboo/icons/light_bulb_on.png",
|
||||||
},
|
},
|
||||||
state_filter: {
|
state_filter: {
|
||||||
on: "brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
on:
|
||||||
|
"brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)",
|
||||||
off: "brightness(80%) saturate(0.8)",
|
off: "brightness(80%) saturate(0.8)",
|
||||||
},
|
},
|
||||||
style: {
|
style: {
|
||||||
|
@@ -1,20 +1,32 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
import { Lovelace } from "../../../src/panels/lovelace/types";
|
import { Lovelace } from "../../../src/panels/lovelace/types";
|
||||||
import { energyEntities } from "../stubs/entities";
|
|
||||||
import { DemoConfig } from "./types";
|
import { DemoConfig } from "./types";
|
||||||
|
|
||||||
export const demoConfigs: Array<() => Promise<DemoConfig>> = [
|
export const demoConfigs: Array<() => Promise<DemoConfig>> = [
|
||||||
() => import("./arsaboo").then((mod) => mod.demoArsaboo),
|
() =>
|
||||||
() => import("./teachingbirds").then((mod) => mod.demoTeachingbirds),
|
import(/* webpackChunkName: "arsaboo" */ "./arsaboo").then(
|
||||||
() => import("./kernehed").then((mod) => mod.demoKernehed),
|
(mod) => mod.demoArsaboo
|
||||||
() => import("./jimpower").then((mod) => mod.demoJimpower),
|
),
|
||||||
|
() =>
|
||||||
|
import(/* webpackChunkName: "teachingbirds" */ "./teachingbirds").then(
|
||||||
|
(mod) => mod.demoTeachingbirds
|
||||||
|
),
|
||||||
|
() =>
|
||||||
|
import(/* webpackChunkName: "kernehed" */ "./kernehed").then(
|
||||||
|
(mod) => mod.demoKernehed
|
||||||
|
),
|
||||||
|
() =>
|
||||||
|
import(/* webpackChunkName: "jimpower" */ "./jimpower").then(
|
||||||
|
(mod) => mod.demoJimpower
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
// eslint-disable-next-line import/no-mutable-exports
|
// eslint-disable-next-line import/no-mutable-exports
|
||||||
export let selectedDemoConfigIndex = 0;
|
export let selectedDemoConfigIndex = 0;
|
||||||
// eslint-disable-next-line import/no-mutable-exports
|
// eslint-disable-next-line import/no-mutable-exports
|
||||||
export let selectedDemoConfig: Promise<DemoConfig> =
|
export let selectedDemoConfig: Promise<DemoConfig> = demoConfigs[
|
||||||
demoConfigs[selectedDemoConfigIndex]();
|
selectedDemoConfigIndex
|
||||||
|
]();
|
||||||
|
|
||||||
export const setDemoConfig = async (
|
export const setDemoConfig = async (
|
||||||
hass: MockHomeAssistant,
|
hass: MockHomeAssistant,
|
||||||
@@ -28,7 +40,6 @@ export const setDemoConfig = async (
|
|||||||
selectedDemoConfig = confProm;
|
selectedDemoConfig = confProm;
|
||||||
|
|
||||||
hass.addEntities(config.entities(hass.localize), true);
|
hass.addEntities(config.entities(hass.localize), true);
|
||||||
hass.addEntities(energyEntities());
|
|
||||||
lovelace.saveConfig(config.lovelace(hass.localize));
|
lovelace.saveConfig(config.lovelace(hass.localize));
|
||||||
hass.mockTheme(config.theme());
|
hass.mockTheme(config.theme());
|
||||||
};
|
};
|
||||||
|
@@ -653,7 +653,7 @@ export const demoEntitiesJimpower: DemoConfig["entities"] = () =>
|
|||||||
entity_id: "binary_sensor.smoke_sensor_158d0001b8ddc7",
|
entity_id: "binary_sensor.smoke_sensor_158d0001b8ddc7",
|
||||||
state: "off",
|
state: "off",
|
||||||
attributes: {
|
attributes: {
|
||||||
density: 0,
|
Density: 0,
|
||||||
battery_level: 59,
|
battery_level: 59,
|
||||||
friendly_name: "Downstairs Smoke Detector",
|
friendly_name: "Downstairs Smoke Detector",
|
||||||
device_class: "smoke",
|
device_class: "smoke",
|
||||||
@@ -663,7 +663,7 @@ export const demoEntitiesJimpower: DemoConfig["entities"] = () =>
|
|||||||
entity_id: "binary_sensor.smoke_sensor_158d0001b8deba",
|
entity_id: "binary_sensor.smoke_sensor_158d0001b8deba",
|
||||||
state: "off",
|
state: "off",
|
||||||
attributes: {
|
attributes: {
|
||||||
density: 0,
|
Density: 0,
|
||||||
battery_level: 65,
|
battery_level: 65,
|
||||||
friendly_name: "Upstairs Smoke Detector",
|
friendly_name: "Upstairs Smoke Detector",
|
||||||
device_class: "smoke",
|
device_class: "smoke",
|
||||||
|
@@ -3,7 +3,49 @@ import { DemoConfig } from "../types";
|
|||||||
|
|
||||||
export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
||||||
name: "Kingia Castle",
|
name: "Kingia Castle",
|
||||||
resources: [],
|
resources: [
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/dark-sky-weather-card.js?v=4",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/mini-media-player-bundle.js?v=0.9.8",
|
||||||
|
// type: "module",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/tracker-card.js?v=0.1.5",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/surveillance-card.js?v=0.0.1",
|
||||||
|
// type: "module",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/mini-graph-card-bundle.js?v=0.1.0",
|
||||||
|
// type: "module",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/slider-entity-row.js?v=d6da75",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url:
|
||||||
|
// "/local/custom_ui/compact-custom-header/compact-custom-header.js?v=0.2.7",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/waze-card.js?v=1.1.1",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/circle-sensor-card.js?v=1.2.0",
|
||||||
|
// type: "module",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom_ui/monster-card.js?v=0.2.3",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
],
|
||||||
views: [
|
views: [
|
||||||
{
|
{
|
||||||
cards: [
|
cards: [
|
||||||
@@ -561,6 +603,89 @@ export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
cards: [
|
cards: [
|
||||||
|
// {
|
||||||
|
// style: {
|
||||||
|
// "background-image": 'url("/assets/jimpower/cardbackK.png")',
|
||||||
|
// "background-size": "100% 400px",
|
||||||
|
// "box-shadow": "3px 3px rgba(0,0,0,0.4)",
|
||||||
|
// "background-repeat": "no-repeat",
|
||||||
|
// color: "#999999",
|
||||||
|
// "border-radius": "20px",
|
||||||
|
// border: "solid 1px rgba(100,100,100,0.3)",
|
||||||
|
// "background-color": "rgba(50,50,50,0.3)",
|
||||||
|
// },
|
||||||
|
// type: "custom:card-modder",
|
||||||
|
// card: {
|
||||||
|
// entity_visibility: "sensor.dark_sky_visibility",
|
||||||
|
// entity_sun: "sun.sun",
|
||||||
|
// entity_daily_summary:
|
||||||
|
// "sensor.bom_gc_forecast_detailed_summary_0",
|
||||||
|
// entity_temperature: "sensor.bom_temp",
|
||||||
|
// entity_forecast_high_temp_3:
|
||||||
|
// "sensor.bom_gc_forecast_max_temp_c_3",
|
||||||
|
// entity_forecast_high_temp_2:
|
||||||
|
// "sensor.bom_gc_forecast_max_temp_c_2",
|
||||||
|
// entity_forecast_high_temp_5:
|
||||||
|
// "sensor.bom_gc_forecast_max_temp_c_5",
|
||||||
|
// entity_forecast_high_temp_4:
|
||||||
|
// "sensor.bom_gc_forecast_max_temp_c_4",
|
||||||
|
// entity_wind_speed: "sensor.bom_wind_sp",
|
||||||
|
// entity_forecast_icon_4: "sensor.dark_sky_icon_4",
|
||||||
|
// entity_forecast_icon_5: "sensor.dark_sky_icon_5",
|
||||||
|
// entity_forecast_icon_2: "sensor.dark_sky_icon_2",
|
||||||
|
// entity_forecast_icon_3: "sensor.dark_sky_icon_3",
|
||||||
|
// entity_forecast_icon_1: "sensor.dark_sky_icon_1",
|
||||||
|
// entity_forecast_high_temp_1:
|
||||||
|
// "sensor.bom_gc_forecast_max_temp_c_1",
|
||||||
|
// entity_wind_bearing: "sensor.bom_wind_bear",
|
||||||
|
// entity_forecast_low_temp_2:
|
||||||
|
// "sensor.bom_gc_forecast_min_temp_c_2",
|
||||||
|
// entity_forecast_low_temp_3:
|
||||||
|
// "sensor.bom_gc_forecast_min_temp_c_3",
|
||||||
|
// entity_pressure: "sensor.bom_pres",
|
||||||
|
// entity_forecast_low_temp_1:
|
||||||
|
// "sensor.bom_gc_forecast_min_temp_c_1",
|
||||||
|
// entity_forecast_low_temp_4:
|
||||||
|
// "sensor.bom_gc_forecast_min_temp_c_4",
|
||||||
|
// entity_forecast_low_temp_5:
|
||||||
|
// "sensor.bom_gc_forecast_min_temp_c_5",
|
||||||
|
// entity_humidity: "sensor.bom_humd",
|
||||||
|
// type: "custom:dark-sky-weather-card",
|
||||||
|
// entity_current_conditions: "sensor.dark_sky_icon",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// style: {
|
||||||
|
// "background-image": 'url("/assets/jimpower/home/waze_5.png")',
|
||||||
|
// "background-size": "100% 400px",
|
||||||
|
// "box-shadow": "3px 3px rgba(0,0,0,0.4)",
|
||||||
|
// "background-repeat": "no-repeat",
|
||||||
|
// "border-radius": "20px",
|
||||||
|
// border: "solid 1px rgba(100,100,100,0.3)",
|
||||||
|
// "background-color": "rgba(50,50,50,0.3)",
|
||||||
|
// },
|
||||||
|
// type: "custom:card-modder",
|
||||||
|
// card: {
|
||||||
|
// entities: [
|
||||||
|
// {
|
||||||
|
// name: "James",
|
||||||
|
// zone: "zone.home",
|
||||||
|
// entity: "sensor.james_to_home",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: "Tina",
|
||||||
|
// zone: "zone.home",
|
||||||
|
// entity: "sensor.tina_to_home",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: "Work",
|
||||||
|
// zone: "zone.powertec",
|
||||||
|
// entity: "sensor.commute_to_work",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// type: "custom:waze-card",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
style: {
|
style: {
|
||||||
"border-radius": "20px",
|
"border-radius": "20px",
|
||||||
@@ -597,8 +722,46 @@ export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
|||||||
],
|
],
|
||||||
type: "vertical-stack",
|
type: "vertical-stack",
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// cards: [
|
||||||
|
// {
|
||||||
|
// style: {
|
||||||
|
// "border-radius": "20px",
|
||||||
|
// color: "#999999",
|
||||||
|
// "box-shadow": "3px 3px rgba(0,0,0,0.4)",
|
||||||
|
// border: "solid 1px rgba(100,100,100,0.3)",
|
||||||
|
// },
|
||||||
|
// type: "custom:card-modder",
|
||||||
|
// card: {
|
||||||
|
// type: "picture-entity",
|
||||||
|
// entity: "camera.bom_radar",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// // {
|
||||||
|
// // style: {
|
||||||
|
// // "background-image": 'url("/assets/jimpower/cardbackK.png")',
|
||||||
|
// // "background-size": "100% 525px",
|
||||||
|
// // "box-shadow": "3px 3px rgba(0,0,0,0.4)",
|
||||||
|
// // "background-repeat": "no-repeat",
|
||||||
|
// // color: "#999999",
|
||||||
|
// // "border-radius": "20px",
|
||||||
|
// // border: "solid 1px rgba(100,100,100,0.3)",
|
||||||
|
// // "background-color": "rgba(50,50,50,0.3)",
|
||||||
|
// // },
|
||||||
|
// // type: "custom:card-modder",
|
||||||
|
// // card: {
|
||||||
|
// // title: null,
|
||||||
|
// // type: "custom:tracker-card",
|
||||||
|
// // trackers: [
|
||||||
|
// // "sensor.custom_card_tracker",
|
||||||
|
// // "sensor.custom_component_tracker",
|
||||||
|
// // ],
|
||||||
|
// // },
|
||||||
|
// // },
|
||||||
|
// ],
|
||||||
|
// type: "vertical-stack",
|
||||||
|
// },
|
||||||
],
|
],
|
||||||
path: "home",
|
|
||||||
icon: "mdi:castle",
|
icon: "mdi:castle",
|
||||||
name: "Home",
|
name: "Home",
|
||||||
background:
|
background:
|
||||||
@@ -718,13 +881,26 @@ export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
|||||||
card: {
|
card: {
|
||||||
image: "/assets/jimpower/security/air_8.jpg",
|
image: "/assets/jimpower/security/air_8.jpg",
|
||||||
elements: [
|
elements: [
|
||||||
|
{
|
||||||
|
image:
|
||||||
|
"https://www.airvisual.com/assets/aqi/ic-face-1-green.svg",
|
||||||
|
type: "image",
|
||||||
|
style: {
|
||||||
|
width: "80px",
|
||||||
|
top: "30%",
|
||||||
|
left: "12%",
|
||||||
|
transform: "none",
|
||||||
|
height: "80px",
|
||||||
|
},
|
||||||
|
entity: "sensor.us_air_pollution_level_2",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
style: {
|
style: {
|
||||||
color: "hsl(120, 41%, 39%)",
|
color: "hsl(120, 41%, 39%)",
|
||||||
top: "50%",
|
top: "50%",
|
||||||
"font-weight": 600,
|
"font-weight": 600,
|
||||||
"font-size": "50px",
|
"font-size": "20px",
|
||||||
left: "30%",
|
left: "44%",
|
||||||
},
|
},
|
||||||
type: "state-label",
|
type: "state-label",
|
||||||
entity: "sensor.us_air_pollution_level_2",
|
entity: "sensor.us_air_pollution_level_2",
|
||||||
@@ -744,7 +920,7 @@ export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
|||||||
style: {
|
style: {
|
||||||
color: "white",
|
color: "white",
|
||||||
top: "80%",
|
top: "80%",
|
||||||
left: "48%",
|
left: "52%",
|
||||||
},
|
},
|
||||||
type: "state-icon",
|
type: "state-icon",
|
||||||
entity: "sensor.us_main_pollutant_2",
|
entity: "sensor.us_main_pollutant_2",
|
||||||
@@ -1235,7 +1411,6 @@ export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
|||||||
type: "vertical-stack",
|
type: "vertical-stack",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
path: "security",
|
|
||||||
icon: "hass:shield-home",
|
icon: "hass:shield-home",
|
||||||
name: "Security",
|
name: "Security",
|
||||||
background:
|
background:
|
||||||
|
@@ -101,12 +101,7 @@ export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
|
|||||||
"sensor.zwave_battery_front_door": {
|
"sensor.zwave_battery_front_door": {
|
||||||
entity_id: "sensor.zwave_battery_front_door",
|
entity_id: "sensor.zwave_battery_front_door",
|
||||||
state: "63",
|
state: "63",
|
||||||
attributes: {
|
attributes: { friendly_name: "Battery", icon: "mdi:battery-60" },
|
||||||
friendly_name: "Battery",
|
|
||||||
icon: "mdi:battery-60",
|
|
||||||
unit_of_measurement: "%",
|
|
||||||
device_class: "battery",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
"sensor.oskar_devices": {
|
"sensor.oskar_devices": {
|
||||||
entity_id: "sensor.oskar_devices",
|
entity_id: "sensor.oskar_devices",
|
||||||
@@ -169,7 +164,7 @@ export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
|
|||||||
},
|
},
|
||||||
"input_select.christmas_pattern": {
|
"input_select.christmas_pattern": {
|
||||||
entity_id: "input_select.christmas_pattern",
|
entity_id: "input_select.christmas_pattern",
|
||||||
state: "Rainbow",
|
state: "None",
|
||||||
attributes: {
|
attributes: {
|
||||||
options: [
|
options: [
|
||||||
"None",
|
"None",
|
||||||
@@ -191,7 +186,7 @@ export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
|
|||||||
},
|
},
|
||||||
"input_select.christmas_palette": {
|
"input_select.christmas_palette": {
|
||||||
entity_id: "input_select.christmas_palette",
|
entity_id: "input_select.christmas_palette",
|
||||||
state: "Party",
|
state: "None",
|
||||||
attributes: {
|
attributes: {
|
||||||
options: [
|
options: [
|
||||||
"None",
|
"None",
|
||||||
@@ -462,7 +457,7 @@ export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
|
|||||||
state: "0.0",
|
state: "0.0",
|
||||||
attributes: {
|
attributes: {
|
||||||
unit_of_measurement: "kB/s",
|
unit_of_measurement: "kB/s",
|
||||||
friendly_name: "Downloading",
|
friendly_name: "Nedladdning",
|
||||||
icon: "mdi:file-download",
|
icon: "mdi:file-download",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -476,7 +471,7 @@ export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
|
|||||||
state: "0.0",
|
state: "0.0",
|
||||||
attributes: {
|
attributes: {
|
||||||
unit_of_measurement: "kB/s",
|
unit_of_measurement: "kB/s",
|
||||||
friendly_name: "Uploading",
|
friendly_name: "Uppladdning",
|
||||||
icon: "mdi:file-upload",
|
icon: "mdi:file-upload",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@@ -2,7 +2,44 @@ import { DemoConfig } from "../types";
|
|||||||
|
|
||||||
export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
||||||
name: "Hem",
|
name: "Hem",
|
||||||
resources: [],
|
resources: [
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/monster-card.js",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/mini-media-player-bundle.js?v=0.9.8",
|
||||||
|
// type: "module",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/slideshow-card.js?=1.1.0",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/fold-entity-row.js?v=3ae2c4",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/swipe-card/swipe-card.js?v=2.0.0",
|
||||||
|
// type: "module",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/upcoming-media-card/upcoming-media-card.js",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/tracker-card.js?v=0.1.5",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/card-tools.js?v=6ce5d0",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// url: "/local/custom-lovelace/krisinfo.js?=0.0.1",
|
||||||
|
// type: "js",
|
||||||
|
// },
|
||||||
|
],
|
||||||
views: [
|
views: [
|
||||||
{
|
{
|
||||||
cards: [
|
cards: [
|
||||||
@@ -27,7 +64,7 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
style: {
|
style: {
|
||||||
color: "white",
|
color: "white",
|
||||||
top: "93%",
|
top: "93%",
|
||||||
left: "85%",
|
left: "90%",
|
||||||
},
|
},
|
||||||
type: "state-label",
|
type: "state-label",
|
||||||
entity: "sensor.battery_oskar",
|
entity: "sensor.battery_oskar",
|
||||||
@@ -50,7 +87,7 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
{
|
{
|
||||||
style: {
|
style: {
|
||||||
color: "white",
|
color: "white",
|
||||||
top: "93%",
|
top: "92%",
|
||||||
left: "20%",
|
left: "20%",
|
||||||
},
|
},
|
||||||
type: "state-label",
|
type: "state-label",
|
||||||
@@ -59,8 +96,8 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
{
|
{
|
||||||
style: {
|
style: {
|
||||||
color: "white",
|
color: "white",
|
||||||
top: "93%",
|
top: "92%",
|
||||||
left: "85%",
|
left: "90%",
|
||||||
},
|
},
|
||||||
type: "state-label",
|
type: "state-label",
|
||||||
entity: "sensor.battery_bella",
|
entity: "sensor.battery_bella",
|
||||||
@@ -68,7 +105,7 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
{
|
{
|
||||||
style: {
|
style: {
|
||||||
color: "white",
|
color: "white",
|
||||||
top: "93%",
|
top: "92%",
|
||||||
left: "55%",
|
left: "55%",
|
||||||
},
|
},
|
||||||
type: "state-label",
|
type: "state-label",
|
||||||
@@ -94,6 +131,78 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
type: "entities",
|
type: "entities",
|
||||||
title: "Lock",
|
title: "Lock",
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// filter: {
|
||||||
|
// exclude: [
|
||||||
|
// {
|
||||||
|
// state: "not_home",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// include: [
|
||||||
|
// {
|
||||||
|
// entity_id: "device_tracker.annasiphone",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "device_tracker.iphone_2",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// },
|
||||||
|
// type: "custom:monster-card",
|
||||||
|
// card: {
|
||||||
|
// show_header_toggle: false,
|
||||||
|
// type: "entities",
|
||||||
|
// title: "G\u00e4ster",
|
||||||
|
// },
|
||||||
|
// show_empty: false,
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// filter: {
|
||||||
|
// exclude: [
|
||||||
|
// {
|
||||||
|
// state: "Inget",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// state: "i.u.",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// include: [
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_al",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_alm",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_salg_vide",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_bjork",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_bok",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_ek",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_grabo",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_gras",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id: "sensor.pollen_hassel",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// },
|
||||||
|
// type: "custom:monster-card",
|
||||||
|
// card: {
|
||||||
|
// show_header_toggle: false,
|
||||||
|
// type: "entities",
|
||||||
|
// title: "Pollenniv\u00e5er",
|
||||||
|
// },
|
||||||
|
// show_empty: false,
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
cards: [
|
cards: [
|
||||||
{
|
{
|
||||||
@@ -117,6 +226,10 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
],
|
],
|
||||||
type: "vertical-stack",
|
type: "vertical-stack",
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// url: "https://embed.windy.com/embed2.html",
|
||||||
|
// type: "iframe",
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
entities: [
|
entities: [
|
||||||
{
|
{
|
||||||
@@ -150,7 +263,6 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
],
|
],
|
||||||
type: "glance",
|
type: "glance",
|
||||||
show_state: false,
|
show_state: false,
|
||||||
columns: 4,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
entities: ["sensor.oskar_bluetooth"],
|
entities: ["sensor.oskar_bluetooth"],
|
||||||
@@ -158,6 +270,32 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
type: "entities",
|
type: "entities",
|
||||||
title: "Occupancy",
|
title: "Occupancy",
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// filter: {
|
||||||
|
// exclude: [
|
||||||
|
// {
|
||||||
|
// state: false,
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// include: [
|
||||||
|
// {
|
||||||
|
// entity_id:
|
||||||
|
// "binary_sensor.fibaro_system_unknown_type0c02_id1003_sensor_2",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// entity_id:
|
||||||
|
// "binary_sensor.fibaro_system_unknown_type0c02_id1003_sensor_3",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// },
|
||||||
|
// type: "custom:monster-card",
|
||||||
|
// card: {
|
||||||
|
// show_header_toggle: false,
|
||||||
|
// type: "entities",
|
||||||
|
// title: "Brandvarnare",
|
||||||
|
// },
|
||||||
|
// show_empty: false,
|
||||||
|
// },
|
||||||
{
|
{
|
||||||
type: "weather-forecast",
|
type: "weather-forecast",
|
||||||
entity: "weather.smhi_vader",
|
entity: "weather.smhi_vader",
|
||||||
@@ -240,9 +378,41 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
"binary_sensor.windows_server",
|
"binary_sensor.windows_server",
|
||||||
"binary_sensor.teamspeak",
|
"binary_sensor.teamspeak",
|
||||||
"binary_sensor.harmony_hub",
|
"binary_sensor.harmony_hub",
|
||||||
|
// {
|
||||||
|
// style: {
|
||||||
|
// height: "1px",
|
||||||
|
// width: "85%",
|
||||||
|
// "margin-left": "auto",
|
||||||
|
// background: "#62717b",
|
||||||
|
// "margin-right": "auto",
|
||||||
|
// },
|
||||||
|
// type: "divider",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// items: ["sensor.uptime_router", "sensor.installerad_routeros"],
|
||||||
|
// head: {
|
||||||
|
// entity: "binary_sensor.router",
|
||||||
|
// },
|
||||||
|
// type: "custom:fold-entity-row",
|
||||||
|
// group_config: {
|
||||||
|
// icon: "mdi:router",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// items: [
|
||||||
|
// "sensor.uptime_router_server",
|
||||||
|
// "sensor.installerad_routeros_server",
|
||||||
|
// ],
|
||||||
|
// head: {
|
||||||
|
// entity: "binary_sensor.router_server",
|
||||||
|
// },
|
||||||
|
// type: "custom:fold-entity-row",
|
||||||
|
// group_config: {
|
||||||
|
// icon: "mdi:router",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
],
|
],
|
||||||
show_header_toggle: false,
|
show_header_toggle: false,
|
||||||
state_color: true,
|
|
||||||
type: "entities",
|
type: "entities",
|
||||||
title: "Network",
|
title: "Network",
|
||||||
},
|
},
|
||||||
@@ -252,10 +422,29 @@ export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
|||||||
"binary_sensor.ubiquiti_switch",
|
"binary_sensor.ubiquiti_switch",
|
||||||
"binary_sensor.ubiquiti_nvr",
|
"binary_sensor.ubiquiti_nvr",
|
||||||
"binary_sensor.entre_kamera",
|
"binary_sensor.entre_kamera",
|
||||||
|
// {
|
||||||
|
// items: ["sensor.uptime_ap_1"],
|
||||||
|
// head: {
|
||||||
|
// entity: "binary_sensor.accesspunkt_1",
|
||||||
|
// },
|
||||||
|
// type: "custom:fold-entity-row",
|
||||||
|
// group_config: {
|
||||||
|
// icon: "router-wireless",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// items: ["sensor.uptime_ap_2"],
|
||||||
|
// head: {
|
||||||
|
// entity: "binary_sensor.accesspunkt_2",
|
||||||
|
// },
|
||||||
|
// type: "custom:fold-entity-row",
|
||||||
|
// group_config: {
|
||||||
|
// icon: "router-wireless",
|
||||||
|
// },
|
||||||
|
// },
|
||||||
"sensor.total_clients_wireless",
|
"sensor.total_clients_wireless",
|
||||||
],
|
],
|
||||||
show_header_toggle: false,
|
show_header_toggle: false,
|
||||||
state_color: true,
|
|
||||||
type: "entities",
|
type: "entities",
|
||||||
title: "Ubiquiti",
|
title: "Ubiquiti",
|
||||||
},
|
},
|
||||||
|
@@ -980,7 +980,8 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
icon: "mdi:account-off",
|
icon: "mdi:account-off",
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
templates: {
|
templates: {
|
||||||
icon: "if (state === 'on') return 'mdi:account'; else if (state === 'off') return 'mdi:account-off';\n",
|
icon:
|
||||||
|
"if (state === 'on') return 'mdi:account'; else if (state === 'off') return 'mdi:account-off';\n",
|
||||||
icon_color:
|
icon_color:
|
||||||
"if (state === 'on') return 'rgb(56, 150, 56)'; else if (state === 'off') return 'rgb(249, 251, 255)';\n",
|
"if (state === 'on') return 'rgb(56, 150, 56)'; else if (state === 'off') return 'rgb(249, 251, 255)';\n",
|
||||||
},
|
},
|
||||||
@@ -1004,7 +1005,8 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
icon: "mdi:account-multiple-minus",
|
icon: "mdi:account-multiple-minus",
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
templates: {
|
templates: {
|
||||||
icon: "if (state === 'on') return 'mdi:account-group'; else if (state === 'off') return 'mdi:account-multiple-minus';\n",
|
icon:
|
||||||
|
"if (state === 'on') return 'mdi:account-group'; else if (state === 'off') return 'mdi:account-multiple-minus';\n",
|
||||||
icon_color:
|
icon_color:
|
||||||
"if (state === 'on') return 'rgb(56, 150, 56)'; else if (state === 'off') return 'rgb(249, 251, 255)';\n",
|
"if (state === 'on') return 'rgb(56, 150, 56)'; else if (state === 'off') return 'rgb(249, 251, 255)';\n",
|
||||||
},
|
},
|
||||||
@@ -1112,9 +1114,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
min_mireds: 153,
|
min_mireds: 153,
|
||||||
max_mireds: 500,
|
max_mireds: 500,
|
||||||
brightness: 63,
|
brightness: 63,
|
||||||
color_temp: 200,
|
|
||||||
supported_color_modes: ["brightness", "color_temp", "rgb"],
|
|
||||||
color_mode: "color_temp",
|
|
||||||
friendly_name: "Upstairs lights",
|
friendly_name: "Upstairs lights",
|
||||||
supported_features: 63,
|
supported_features: 63,
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
@@ -1126,7 +1125,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
attributes: {
|
attributes: {
|
||||||
friendly_name: "Walk in closet lights",
|
friendly_name: "Walk in closet lights",
|
||||||
supported_features: 41,
|
supported_features: 41,
|
||||||
supported_color_modes: ["brightness", "color_temp"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:wall-sconce",
|
icon: "mdi:wall-sconce",
|
||||||
},
|
},
|
||||||
@@ -1138,8 +1136,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
brightness: 254,
|
brightness: 254,
|
||||||
friendly_name: "Outdoor lights",
|
friendly_name: "Outdoor lights",
|
||||||
supported_features: 41,
|
supported_features: 41,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
color_mode: "brightness",
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:wall-sconce",
|
icon: "mdi:wall-sconce",
|
||||||
},
|
},
|
||||||
@@ -1152,8 +1148,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
max_mireds: 500,
|
max_mireds: 500,
|
||||||
brightness: 128,
|
brightness: 128,
|
||||||
color_temp: 366,
|
color_temp: 366,
|
||||||
supported_color_modes: ["brightness", "color_temp", "rgb"],
|
|
||||||
color_mode: "color_temp",
|
|
||||||
effect_list: ["colorloop"],
|
effect_list: ["colorloop"],
|
||||||
friendly_name: "Downstairs lights",
|
friendly_name: "Downstairs lights",
|
||||||
supported_features: 63,
|
supported_features: 63,
|
||||||
@@ -1313,7 +1307,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
attributes: {
|
attributes: {
|
||||||
min_mireds: 153,
|
min_mireds: 153,
|
||||||
max_mireds: 500,
|
max_mireds: 500,
|
||||||
supported_color_modes: ["brightness", "color_temp"],
|
|
||||||
is_deconz_group: false,
|
is_deconz_group: false,
|
||||||
friendly_name: "Bedside Lamp",
|
friendly_name: "Bedside Lamp",
|
||||||
supported_features: 63,
|
supported_features: 63,
|
||||||
@@ -1327,7 +1320,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
attributes: {
|
attributes: {
|
||||||
min_mireds: 153,
|
min_mireds: 153,
|
||||||
max_mireds: 500,
|
max_mireds: 500,
|
||||||
supported_color_modes: ["brightness", "color_temp"],
|
|
||||||
is_deconz_group: false,
|
is_deconz_group: false,
|
||||||
friendly_name: "Floorlamp Reading Light",
|
friendly_name: "Floorlamp Reading Light",
|
||||||
supported_features: 43,
|
supported_features: 43,
|
||||||
@@ -1343,8 +1335,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
max_mireds: 500,
|
max_mireds: 500,
|
||||||
brightness: 128,
|
brightness: 128,
|
||||||
color_temp: 366,
|
color_temp: 366,
|
||||||
supported_color_modes: ["brightness", "color_temp", "rgb"],
|
|
||||||
color_mode: "color_temp",
|
|
||||||
effect_list: ["colorloop"],
|
effect_list: ["colorloop"],
|
||||||
is_deconz_group: false,
|
is_deconz_group: false,
|
||||||
friendly_name: "Hallway window light",
|
friendly_name: "Hallway window light",
|
||||||
@@ -1359,7 +1349,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
attributes: {
|
attributes: {
|
||||||
brightness: 77,
|
brightness: 77,
|
||||||
is_deconz_group: false,
|
is_deconz_group: false,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
friendly_name: "Isa Ceiling Light",
|
friendly_name: "Isa Ceiling Light",
|
||||||
supported_features: 41,
|
supported_features: 41,
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
@@ -1374,8 +1363,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
max_mireds: 500,
|
max_mireds: 500,
|
||||||
brightness: 150,
|
brightness: 150,
|
||||||
color_temp: 366,
|
color_temp: 366,
|
||||||
supported_color_modes: ["brightness", "color_temp"],
|
|
||||||
color_mode: "color_temp",
|
|
||||||
effect_list: ["colorloop"],
|
effect_list: ["colorloop"],
|
||||||
is_deconz_group: false,
|
is_deconz_group: false,
|
||||||
friendly_name: "Floorlamp",
|
friendly_name: "Floorlamp",
|
||||||
@@ -1390,7 +1377,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
attributes: {
|
attributes: {
|
||||||
friendly_name: "Bedroom Ceiling Light",
|
friendly_name: "Bedroom Ceiling Light",
|
||||||
supported_features: 41,
|
supported_features: 41,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:ceiling-light",
|
icon: "mdi:ceiling-light",
|
||||||
},
|
},
|
||||||
@@ -1401,7 +1387,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
attributes: {
|
attributes: {
|
||||||
friendly_name: "Nightlight",
|
friendly_name: "Nightlight",
|
||||||
supported_features: 17,
|
supported_features: 17,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:lamp",
|
icon: "mdi:lamp",
|
||||||
},
|
},
|
||||||
@@ -1768,7 +1753,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
power_consumption: 2.2,
|
power_consumption: 2.2,
|
||||||
friendly_name: "Upstairs Hallway Light",
|
friendly_name: "Upstairs Hallway Light",
|
||||||
supported_features: 33,
|
supported_features: 33,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:ceiling-light",
|
icon: "mdi:ceiling-light",
|
||||||
},
|
},
|
||||||
@@ -1784,7 +1768,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
power_consumption: 0,
|
power_consumption: 0,
|
||||||
friendly_name: "Dining Room Light",
|
friendly_name: "Dining Room Light",
|
||||||
supported_features: 33,
|
supported_features: 33,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:ceiling-light",
|
icon: "mdi:ceiling-light",
|
||||||
},
|
},
|
||||||
@@ -1800,7 +1783,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
power_consumption: 0,
|
power_consumption: 0,
|
||||||
friendly_name: "Living room Spotlights",
|
friendly_name: "Living room Spotlights",
|
||||||
supported_features: 33,
|
supported_features: 33,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:track-light",
|
icon: "mdi:track-light",
|
||||||
},
|
},
|
||||||
@@ -1817,7 +1799,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
power_consumption: 2.5,
|
power_consumption: 2.5,
|
||||||
friendly_name: "Passage Lights",
|
friendly_name: "Passage Lights",
|
||||||
supported_features: 33,
|
supported_features: 33,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:track-light",
|
icon: "mdi:track-light",
|
||||||
},
|
},
|
||||||
@@ -1862,7 +1843,6 @@ export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
|||||||
power_consumption: 37.4,
|
power_consumption: 37.4,
|
||||||
friendly_name: "Kitchen Lights",
|
friendly_name: "Kitchen Lights",
|
||||||
supported_features: 33,
|
supported_features: 33,
|
||||||
supported_color_modes: ["brightness"],
|
|
||||||
custom_ui_state_card: "state-card-custom-ui",
|
custom_ui_state_card: "state-card-custom-ui",
|
||||||
icon: "mdi:track-light",
|
icon: "mdi:track-light",
|
||||||
},
|
},
|
||||||
|
@@ -215,7 +215,6 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
|
|||||||
card: {
|
card: {
|
||||||
type: "glance",
|
type: "glance",
|
||||||
show_state: false,
|
show_state: false,
|
||||||
columns: 4,
|
|
||||||
},
|
},
|
||||||
state_filter: ["on"],
|
state_filter: ["on"],
|
||||||
},
|
},
|
||||||
@@ -440,43 +439,57 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
|
|||||||
type: "horizontal-stack",
|
type: "horizontal-stack",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "grid",
|
|
||||||
columns: 2,
|
|
||||||
cards: [
|
cards: [
|
||||||
{
|
{
|
||||||
graph: "line",
|
cards: [
|
||||||
type: "sensor",
|
{
|
||||||
entity: "sensor.temperature_bedroom",
|
graph: "line",
|
||||||
|
type: "sensor",
|
||||||
|
entity: "sensor.temperature_bedroom",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
graph: "line",
|
||||||
|
type: "sensor",
|
||||||
|
name: "S's room",
|
||||||
|
entity: "sensor.temperature_stefan",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
type: "horizontal-stack",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
graph: "line",
|
cards: [
|
||||||
type: "sensor",
|
{
|
||||||
name: "S's room",
|
graph: "line",
|
||||||
entity: "sensor.temperature_stefan",
|
type: "sensor",
|
||||||
|
entity: "sensor.temperature_passage",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
graph: "line",
|
||||||
|
type: "sensor",
|
||||||
|
name: "Bathroom",
|
||||||
|
entity: "sensor.temperature_downstairs_bathroom",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
type: "horizontal-stack",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
graph: "line",
|
cards: [
|
||||||
type: "sensor",
|
{
|
||||||
entity: "sensor.temperature_passage",
|
graph: "line",
|
||||||
},
|
type: "sensor",
|
||||||
{
|
entity: "sensor.temperature_storage",
|
||||||
graph: "line",
|
},
|
||||||
type: "sensor",
|
{
|
||||||
name: "Bathroom",
|
graph: "line",
|
||||||
entity: "sensor.temperature_downstairs_bathroom",
|
type: "sensor",
|
||||||
},
|
name: "Refrigerator",
|
||||||
{
|
entity: "sensor.refrigerator",
|
||||||
graph: "line",
|
},
|
||||||
type: "sensor",
|
],
|
||||||
entity: "sensor.temperature_storage",
|
type: "horizontal-stack",
|
||||||
},
|
|
||||||
{
|
|
||||||
graph: "line",
|
|
||||||
type: "sensor",
|
|
||||||
name: "Refrigerator",
|
|
||||||
entity: "sensor.refrigerator",
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
type: "vertical-stack",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
entities: [
|
entities: [
|
||||||
@@ -795,6 +808,67 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
|
|||||||
],
|
],
|
||||||
type: "vertical-stack",
|
type: "vertical-stack",
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// cards: [
|
||||||
|
// {
|
||||||
|
// entities: [
|
||||||
|
// {
|
||||||
|
// hide_when_off: true,
|
||||||
|
// toggle: true,
|
||||||
|
// type: "custom:slider-entity-row",
|
||||||
|
// name: "Bedside",
|
||||||
|
// entity: "light.bedside_lamp",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// hide_when_off: true,
|
||||||
|
// toggle: true,
|
||||||
|
// type: "custom:slider-entity-row",
|
||||||
|
// name: "Bedroom",
|
||||||
|
// entity: "light.bedroom_ceiling_light",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// hide_when_off: true,
|
||||||
|
// toggle: true,
|
||||||
|
// type: "custom:slider-entity-row",
|
||||||
|
// name: "Isa",
|
||||||
|
// entity: "light.isa_ceiling_light",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// hide_when_off: true,
|
||||||
|
// toggle: true,
|
||||||
|
// type: "custom:slider-entity-row",
|
||||||
|
// name: "Upstairs hallway",
|
||||||
|
// entity: "light.upstairs_hallway_ceiling_light_level",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// hide_when_off: true,
|
||||||
|
// toggle: true,
|
||||||
|
// type: "custom:slider-entity-row",
|
||||||
|
// name: "Nightlight",
|
||||||
|
// entity: "light.gateway_light_34ce008bfc4b",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// hide_when_off: true,
|
||||||
|
// toggle: true,
|
||||||
|
// type: "custom:slider-entity-row",
|
||||||
|
// name: "Walk in closet",
|
||||||
|
// entity: "light.walk_in_closet_lights",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// hide_when_off: true,
|
||||||
|
// toggle: false,
|
||||||
|
// type: "custom:slider-entity-row",
|
||||||
|
// name: "Stefan",
|
||||||
|
// entity: "light.stefan_lightstrip",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// show_header_toggle: false,
|
||||||
|
// type: "entities",
|
||||||
|
// title: "Upstairs",
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
// type: "vertical-stack",
|
||||||
|
// },
|
||||||
],
|
],
|
||||||
path: "lights",
|
path: "lights",
|
||||||
title: "Lights",
|
title: "Lights",
|
||||||
@@ -844,6 +918,10 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
|
|||||||
name: "Dafang",
|
name: "Dafang",
|
||||||
icon: "mdi:webcam",
|
icon: "mdi:webcam",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "IR Hallway",
|
||||||
|
entity: "sensor.system_ir_blaster",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "IR Bedroom",
|
name: "IR Bedroom",
|
||||||
entity: "sensor.system_ir_blaster_bedroom",
|
entity: "sensor.system_ir_blaster_bedroom",
|
||||||
@@ -862,7 +940,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
|
|||||||
"sensor.system_ring_chime",
|
"sensor.system_ring_chime",
|
||||||
],
|
],
|
||||||
type: "glance",
|
type: "glance",
|
||||||
columns: 4,
|
columns: 5,
|
||||||
show_state: false,
|
show_state: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@@ -9,5 +9,5 @@ export interface DemoConfig {
|
|||||||
authorUrl: string;
|
authorUrl: string;
|
||||||
lovelace: (localize: LocalizeFunc) => LovelaceConfig;
|
lovelace: (localize: LocalizeFunc) => LovelaceConfig;
|
||||||
entities: (localize: LocalizeFunc) => Entity[];
|
entities: (localize: LocalizeFunc) => Entity[];
|
||||||
theme: () => Record<string, string> | null;
|
theme: () => { [key: string]: string } | null;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
import { LitElement } from "lit";
|
import { LitElement } from "lit-element";
|
||||||
import "./card-tools";
|
import "./card-tools";
|
||||||
|
|
||||||
class CardModder extends LitElement {
|
class CardModder extends LitElement {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
import { html, LitElement } from "lit";
|
import { html, LitElement } from "lit-element";
|
||||||
|
|
||||||
if (!window.cardTools) {
|
if (!window.cardTools) {
|
||||||
const version = 0.2;
|
const version = 0.2;
|
||||||
|
@@ -1,5 +1,12 @@
|
|||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, state } from "lit/decorators";
|
css,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
internalProperty,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
import { CastManager } from "../../../src/cast/cast_manager";
|
import { CastManager } from "../../../src/cast/cast_manager";
|
||||||
import { castSendShowDemo } from "../../../src/cast/receiver_messages";
|
import { castSendShowDemo } from "../../../src/cast/receiver_messages";
|
||||||
import "../../../src/components/ha-icon";
|
import "../../../src/components/ha-icon";
|
||||||
@@ -13,7 +20,7 @@ import { HomeAssistant } from "../../../src/types";
|
|||||||
class CastDemoRow extends LitElement implements LovelaceRow {
|
class CastDemoRow extends LitElement implements LovelaceRow {
|
||||||
public hass!: HomeAssistant;
|
public hass!: HomeAssistant;
|
||||||
|
|
||||||
@state() private _castManager?: CastManager | null;
|
@internalProperty() private _castManager?: CastManager | null;
|
||||||
|
|
||||||
public setConfig(_config: CastConfig): void {
|
public setConfig(_config: CastConfig): void {
|
||||||
// No config possible.
|
// No config possible.
|
||||||
@@ -66,7 +73,7 @@ class CastDemoRow extends LitElement implements LovelaceRow {
|
|||||||
this.style.display = this._castManager ? "" : "none";
|
this.style.display = this._castManager ? "" : "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResult {
|
||||||
return css`
|
return css`
|
||||||
:host {
|
:host {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@@ -1,7 +1,14 @@
|
|||||||
import "@material/mwc-button";
|
import "@material/mwc-button";
|
||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { property, state } from "lit/decorators";
|
css,
|
||||||
import { until } from "lit/directives/until";
|
CSSResult,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
property,
|
||||||
|
internalProperty,
|
||||||
|
TemplateResult,
|
||||||
|
} from "lit-element";
|
||||||
|
import { until } from "lit-html/directives/until";
|
||||||
import "../../../src/components/ha-card";
|
import "../../../src/components/ha-card";
|
||||||
import "../../../src/components/ha-circular-progress";
|
import "../../../src/components/ha-circular-progress";
|
||||||
import { LovelaceCardConfig } from "../../../src/data/lovelace";
|
import { LovelaceCardConfig } from "../../../src/data/lovelace";
|
||||||
@@ -19,7 +26,7 @@ export class HADemoCard extends LitElement implements LovelaceCard {
|
|||||||
|
|
||||||
@property({ attribute: false }) public hass!: MockHomeAssistant;
|
@property({ attribute: false }) public hass!: MockHomeAssistant;
|
||||||
|
|
||||||
@state() private _switching = false;
|
@internalProperty() private _switching?: boolean;
|
||||||
|
|
||||||
private _hidden = localStorage.hide_demo_card;
|
private _hidden = localStorage.hide_demo_card;
|
||||||
|
|
||||||
@@ -27,7 +34,12 @@ export class HADemoCard extends LitElement implements LovelaceCard {
|
|||||||
return this._hidden ? 0 : 2;
|
return this._hidden ? 0 : 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public setConfig(_config: LovelaceCardConfig) {}
|
public setConfig(
|
||||||
|
// @ts-ignore
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
config: LovelaceCardConfig
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||||
|
) {}
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
protected render(): TemplateResult {
|
||||||
if (this._hidden) {
|
if (this._hidden) {
|
||||||
@@ -101,7 +113,7 @@ export class HADemoCard extends LitElement implements LovelaceCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResult[] {
|
||||||
return [
|
return [
|
||||||
css`
|
css`
|
||||||
a {
|
a {
|
||||||
|
@@ -1,9 +1,13 @@
|
|||||||
|
import "../../src/resources/safari-14-attachshadow-patch";
|
||||||
|
import "@polymer/polymer/lib/elements/dom-if";
|
||||||
|
import "@polymer/polymer/lib/elements/dom-repeat";
|
||||||
import "../../src/resources/ha-style";
|
import "../../src/resources/ha-style";
|
||||||
import "../../src/resources/roboto";
|
import "../../src/resources/roboto";
|
||||||
import "../../src/resources/safari-14-attachshadow-patch";
|
|
||||||
import "./ha-demo";
|
import "./ha-demo";
|
||||||
|
|
||||||
/* polyfill for paper-dropdown */
|
/* polyfill for paper-dropdown */
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
import("web-animations-js/web-animations-next-lite.min");
|
import(
|
||||||
|
/* webpackChunkName: "polyfill-web-animations-next" */ "web-animations-js/web-animations-next-lite.min"
|
||||||
|
);
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
// Compat needs to be first import
|
|
||||||
import "../../src/resources/compatibility";
|
import "../../src/resources/compatibility";
|
||||||
import { isNavigationClick } from "../../src/common/dom/is-navigation-click";
|
import { isNavigationClick } from "../../src/common/dom/is-navigation-click";
|
||||||
import { navigate } from "../../src/common/navigate";
|
import { navigate } from "../../src/common/navigate";
|
||||||
@@ -20,15 +19,11 @@ import { mockShoppingList } from "./stubs/shopping_list";
|
|||||||
import { mockSystemLog } from "./stubs/system_log";
|
import { mockSystemLog } from "./stubs/system_log";
|
||||||
import { mockTemplate } from "./stubs/template";
|
import { mockTemplate } from "./stubs/template";
|
||||||
import { mockTranslations } from "./stubs/translations";
|
import { mockTranslations } from "./stubs/translations";
|
||||||
import { mockEnergy } from "./stubs/energy";
|
|
||||||
import { mockConfig } from "./stubs/config";
|
|
||||||
import { energyEntities } from "./stubs/entities";
|
|
||||||
import { mockForecastSolar } from "./stubs/forecast_solar";
|
|
||||||
|
|
||||||
class HaDemo extends HomeAssistantAppEl {
|
class HaDemo extends HomeAssistantAppEl {
|
||||||
protected async _initializeHass() {
|
protected async _initialize() {
|
||||||
const initial: Partial<MockHomeAssistant> = {
|
const initial: Partial<MockHomeAssistant> = {
|
||||||
panelUrl: (this as any)._panelUrl,
|
panelUrl: (this as any).panelUrl,
|
||||||
// Override updateHass so that the correct hass lifecycle methods are called
|
// Override updateHass so that the correct hass lifecycle methods are called
|
||||||
updateHass: (hassUpdate: Partial<HomeAssistant>) =>
|
updateHass: (hassUpdate: Partial<HomeAssistant>) =>
|
||||||
this._updateHass(hassUpdate),
|
this._updateHass(hassUpdate),
|
||||||
@@ -51,13 +46,8 @@ class HaDemo extends HomeAssistantAppEl {
|
|||||||
mockEvents(hass);
|
mockEvents(hass);
|
||||||
mockMediaPlayer(hass);
|
mockMediaPlayer(hass);
|
||||||
mockFrontend(hass);
|
mockFrontend(hass);
|
||||||
mockEnergy(hass);
|
|
||||||
mockForecastSolar(hass);
|
|
||||||
mockConfig(hass);
|
|
||||||
mockPersistentNotification(hass);
|
mockPersistentNotification(hass);
|
||||||
|
|
||||||
hass.addEntities(energyEntities());
|
|
||||||
|
|
||||||
// Once config is loaded AND localize, set entities and apply theme.
|
// Once config is loaded AND localize, set entities and apply theme.
|
||||||
Promise.all([selectedDemoConfig, localizePromise]).then(
|
Promise.all([selectedDemoConfig, localizePromise]).then(
|
||||||
([conf, localize]) => {
|
([conf, localize]) => {
|
||||||
@@ -79,7 +69,7 @@ class HaDemo extends HomeAssistantAppEl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
navigate(href);
|
navigate(this, href);
|
||||||
},
|
},
|
||||||
{ capture: true }
|
{ capture: true }
|
||||||
);
|
);
|
||||||
|
@@ -1,41 +0,0 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
|
||||||
|
|
||||||
export const mockConfig = (hass: MockHomeAssistant) => {
|
|
||||||
hass.mockAPI("config/config_entries/entry", () => [
|
|
||||||
{
|
|
||||||
entry_id: "co2signal",
|
|
||||||
domain: "co2signal",
|
|
||||||
title: "CO2 Signal",
|
|
||||||
source: "user",
|
|
||||||
state: "loaded",
|
|
||||||
supports_options: false,
|
|
||||||
supports_unload: true,
|
|
||||||
pref_disable_new_entities: false,
|
|
||||||
pref_disable_polling: false,
|
|
||||||
disabled_by: null,
|
|
||||||
reason: null,
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
hass.mockWS("config/entity_registry/list", () => [
|
|
||||||
{
|
|
||||||
config_entry_id: "co2signal",
|
|
||||||
device_id: "co2signal",
|
|
||||||
area_id: null,
|
|
||||||
disabled_by: null,
|
|
||||||
entity_id: "sensor.co2_intensity",
|
|
||||||
name: null,
|
|
||||||
icon: null,
|
|
||||||
platform: "co2signal",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
config_entry_id: "co2signal",
|
|
||||||
device_id: "co2signal",
|
|
||||||
area_id: null,
|
|
||||||
disabled_by: null,
|
|
||||||
entity_id: "sensor.grid_fossil_fuel_percentage",
|
|
||||||
name: null,
|
|
||||||
icon: null,
|
|
||||||
platform: "co2signal",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
};
|
|
@@ -1,83 +0,0 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
|
||||||
|
|
||||||
export const mockEnergy = (hass: MockHomeAssistant) => {
|
|
||||||
hass.mockWS("energy/get_prefs", () => ({
|
|
||||||
energy_sources: [
|
|
||||||
{
|
|
||||||
type: "grid",
|
|
||||||
flow_from: [
|
|
||||||
{
|
|
||||||
stat_energy_from: "sensor.energy_consumption_tarif_1",
|
|
||||||
stat_cost: "sensor.energy_consumption_tarif_1_cost",
|
|
||||||
entity_energy_from: "sensor.energy_consumption_tarif_1",
|
|
||||||
entity_energy_price: null,
|
|
||||||
number_energy_price: null,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
stat_energy_from: "sensor.energy_consumption_tarif_2",
|
|
||||||
stat_cost: "sensor.energy_consumption_tarif_2_cost",
|
|
||||||
entity_energy_from: "sensor.energy_consumption_tarif_2",
|
|
||||||
entity_energy_price: null,
|
|
||||||
number_energy_price: null,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
flow_to: [
|
|
||||||
{
|
|
||||||
stat_energy_to: "sensor.energy_production_tarif_1",
|
|
||||||
stat_compensation: "sensor.energy_production_tarif_1_compensation",
|
|
||||||
entity_energy_to: "sensor.energy_production_tarif_1",
|
|
||||||
entity_energy_price: null,
|
|
||||||
number_energy_price: null,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
stat_energy_to: "sensor.energy_production_tarif_2",
|
|
||||||
stat_compensation: "sensor.energy_production_tarif_2_compensation",
|
|
||||||
entity_energy_to: "sensor.energy_production_tarif_2",
|
|
||||||
entity_energy_price: null,
|
|
||||||
number_energy_price: null,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
cost_adjustment_day: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "solar",
|
|
||||||
stat_energy_from: "sensor.solar_production",
|
|
||||||
config_entry_solar_forecast: ["solar_forecast"],
|
|
||||||
},
|
|
||||||
/* {
|
|
||||||
type: "battery",
|
|
||||||
stat_energy_from: "sensor.battery_output",
|
|
||||||
stat_energy_to: "sensor.battery_input",
|
|
||||||
}, */
|
|
||||||
{
|
|
||||||
type: "gas",
|
|
||||||
stat_energy_from: "sensor.energy_gas",
|
|
||||||
stat_cost: "sensor.energy_gas_cost",
|
|
||||||
entity_energy_from: "sensor.energy_gas",
|
|
||||||
entity_energy_price: null,
|
|
||||||
number_energy_price: null,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
device_consumption: [
|
|
||||||
{
|
|
||||||
stat_consumption: "sensor.energy_car",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
stat_consumption: "sensor.energy_ac",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
stat_consumption: "sensor.energy_washing_machine",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
stat_consumption: "sensor.energy_dryer",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
stat_consumption: "sensor.energy_heat_pump",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
stat_consumption: "sensor.energy_boiler",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}));
|
|
||||||
hass.mockWS("energy/info", () => ({ cost_sensors: [] }));
|
|
||||||
};
|
|
@@ -1,178 +0,0 @@
|
|||||||
import { convertEntities } from "../../../src/fake_data/entity";
|
|
||||||
|
|
||||||
export const energyEntities = () =>
|
|
||||||
convertEntities({
|
|
||||||
"sensor.grid_fossil_fuel_percentage": {
|
|
||||||
entity_id: "sensor.grid_fossil_fuel_percentage",
|
|
||||||
state: "88.6",
|
|
||||||
attributes: {
|
|
||||||
unit_of_measurement: "%",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.solar_production": {
|
|
||||||
entity_id: "sensor.solar_production",
|
|
||||||
state: "88.6",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Solar",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.battery_input": {
|
|
||||||
entity_id: "sensor.battery_input",
|
|
||||||
state: "4",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Battery Input",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.battery_output": {
|
|
||||||
entity_id: "sensor.battery_output",
|
|
||||||
state: "3",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Battery Output",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_consumption_tarif_1": {
|
|
||||||
entity_id: "sensor.energy_consumption_tarif_1 ",
|
|
||||||
state: "88.6",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Grid consumption low tariff",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_consumption_tarif_2": {
|
|
||||||
entity_id: "sensor.energy_consumption_tarif_2",
|
|
||||||
state: "88.6",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Grid consumption high tariff",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_production_tarif_1": {
|
|
||||||
entity_id: "sensor.energy_production_tarif_1",
|
|
||||||
state: "88.6",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Returned to grid low tariff",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_production_tarif_2": {
|
|
||||||
entity_id: "sensor.energy_production_tarif_2",
|
|
||||||
state: "88.6",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Returned to grid high tariff",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_consumption_tarif_1_cost": {
|
|
||||||
entity_id: "sensor.energy_consumption_tarif_1_cost",
|
|
||||||
state: "2",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
unit_of_measurement: "EUR",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_consumption_tarif_2_cost": {
|
|
||||||
entity_id: "sensor.energy_consumption_tarif_2_cost",
|
|
||||||
state: "2",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
unit_of_measurement: "EUR",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_production_tarif_1_compensation": {
|
|
||||||
entity_id: "sensor.energy_production_tarif_1_compensation",
|
|
||||||
state: "2",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
unit_of_measurement: "EUR",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_production_tarif_2_compensation": {
|
|
||||||
entity_id: "sensor.energy_production_tarif_2_compensation",
|
|
||||||
state: "2",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
unit_of_measurement: "EUR",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_gas_cost": {
|
|
||||||
entity_id: "sensor.energy_gas_cost",
|
|
||||||
state: "2",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
unit_of_measurement: "EUR",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_gas": {
|
|
||||||
entity_id: "sensor.energy_gas",
|
|
||||||
state: "4",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Gas",
|
|
||||||
unit_of_measurement: "m³",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_car": {
|
|
||||||
entity_id: "sensor.energy_car",
|
|
||||||
state: "4",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Electric car",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_ac": {
|
|
||||||
entity_id: "sensor.energy_ac",
|
|
||||||
state: "3",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Air conditioning",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_washing_machine": {
|
|
||||||
entity_id: "sensor.energy_washing_machine",
|
|
||||||
state: "6",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Washing machine",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_dryer": {
|
|
||||||
entity_id: "sensor.energy_dryer",
|
|
||||||
state: "5.5",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Dryer",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_heat_pump": {
|
|
||||||
entity_id: "sensor.energy_heat_pump",
|
|
||||||
state: "6",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Heat pump",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"sensor.energy_boiler": {
|
|
||||||
entity_id: "sensor.energy_boiler",
|
|
||||||
state: "7",
|
|
||||||
attributes: {
|
|
||||||
last_reset: "1970-01-01T00:00:00:00+00",
|
|
||||||
friendly_name: "Boiler",
|
|
||||||
unit_of_measurement: "kWh",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
@@ -1,55 +0,0 @@
|
|||||||
import { format, startOfToday, startOfTomorrow } from "date-fns";
|
|
||||||
import { ForecastSolarForecast } from "../../../src/data/forecast_solar";
|
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
|
||||||
|
|
||||||
export const mockForecastSolar = (hass: MockHomeAssistant) => {
|
|
||||||
const todayString = format(startOfToday(), "yyyy-MM-dd");
|
|
||||||
const tomorrowString = format(startOfTomorrow(), "yyyy-MM-dd");
|
|
||||||
hass.mockWS(
|
|
||||||
"forecast_solar/forecasts",
|
|
||||||
(): Record<string, ForecastSolarForecast> => ({
|
|
||||||
solar_forecast: {
|
|
||||||
wh_hours: {
|
|
||||||
[`${todayString}T06:00:00`]: 0,
|
|
||||||
[`${todayString}T06:23:00`]: 6,
|
|
||||||
[`${todayString}T06:45:00`]: 39,
|
|
||||||
[`${todayString}T07:00:00`]: 28,
|
|
||||||
[`${todayString}T08:00:00`]: 208,
|
|
||||||
[`${todayString}T09:00:00`]: 352,
|
|
||||||
[`${todayString}T10:00:00`]: 544,
|
|
||||||
[`${todayString}T11:00:00`]: 748,
|
|
||||||
[`${todayString}T12:00:00`]: 1259,
|
|
||||||
[`${todayString}T13:00:00`]: 1361,
|
|
||||||
[`${todayString}T14:00:00`]: 1373,
|
|
||||||
[`${todayString}T15:00:00`]: 1370,
|
|
||||||
[`${todayString}T16:00:00`]: 1186,
|
|
||||||
[`${todayString}T17:00:00`]: 937,
|
|
||||||
[`${todayString}T18:00:00`]: 652,
|
|
||||||
[`${todayString}T19:00:00`]: 370,
|
|
||||||
[`${todayString}T20:00:00`]: 155,
|
|
||||||
[`${todayString}T21:48:00`]: 24,
|
|
||||||
[`${todayString}T22:36:00`]: 0,
|
|
||||||
[`${tomorrowString}T06:01:00`]: 0,
|
|
||||||
[`${tomorrowString}T06:23:00`]: 9,
|
|
||||||
[`${tomorrowString}T06:45:00`]: 47,
|
|
||||||
[`${tomorrowString}T07:00:00`]: 48,
|
|
||||||
[`${tomorrowString}T08:00:00`]: 473,
|
|
||||||
[`${tomorrowString}T09:00:00`]: 827,
|
|
||||||
[`${tomorrowString}T10:00:00`]: 1153,
|
|
||||||
[`${tomorrowString}T11:00:00`]: 1413,
|
|
||||||
[`${tomorrowString}T12:00:00`]: 1590,
|
|
||||||
[`${tomorrowString}T13:00:00`]: 1652,
|
|
||||||
[`${tomorrowString}T14:00:00`]: 1612,
|
|
||||||
[`${tomorrowString}T15:00:00`]: 1438,
|
|
||||||
[`${tomorrowString}T16:00:00`]: 1149,
|
|
||||||
[`${tomorrowString}T17:00:00`]: 830,
|
|
||||||
[`${tomorrowString}T18:00:00`]: 542,
|
|
||||||
[`${tomorrowString}T19:00:00`]: 311,
|
|
||||||
[`${tomorrowString}T20:00:00`]: 140,
|
|
||||||
[`${tomorrowString}T21:47:00`]: 22,
|
|
||||||
[`${tomorrowString}T22:34:00`]: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
);
|
|
||||||
};
|
|
@@ -1,6 +1,4 @@
|
|||||||
import { addHours, differenceInHours, endOfDay } from "date-fns";
|
|
||||||
import { HassEntity } from "home-assistant-js-websocket";
|
import { HassEntity } from "home-assistant-js-websocket";
|
||||||
import { StatisticValue } from "../../../src/data/history";
|
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
interface HistoryQueryParams {
|
interface HistoryQueryParams {
|
||||||
@@ -66,219 +64,17 @@ const generateHistory = (state, deltas) => {
|
|||||||
|
|
||||||
const incrementalUnits = ["clients", "queries", "ads"];
|
const incrementalUnits = ["clients", "queries", "ads"];
|
||||||
|
|
||||||
const generateMeanStatistics = (
|
|
||||||
id: string,
|
|
||||||
start: Date,
|
|
||||||
end: Date,
|
|
||||||
initValue: number,
|
|
||||||
maxDiff: number
|
|
||||||
) => {
|
|
||||||
const statistics: StatisticValue[] = [];
|
|
||||||
let currentDate = new Date(start);
|
|
||||||
currentDate.setMinutes(0, 0, 0);
|
|
||||||
let lastVal = initValue;
|
|
||||||
const now = new Date();
|
|
||||||
while (end > currentDate && currentDate < now) {
|
|
||||||
const delta = Math.random() * maxDiff;
|
|
||||||
const mean = lastVal + delta;
|
|
||||||
statistics.push({
|
|
||||||
statistic_id: id,
|
|
||||||
start: currentDate.toISOString(),
|
|
||||||
mean,
|
|
||||||
min: mean - Math.random() * maxDiff,
|
|
||||||
max: mean + Math.random() * maxDiff,
|
|
||||||
last_reset: "1970-01-01T00:00:00+00:00",
|
|
||||||
state: mean,
|
|
||||||
sum: null,
|
|
||||||
});
|
|
||||||
lastVal = mean;
|
|
||||||
currentDate = addHours(currentDate, 1);
|
|
||||||
}
|
|
||||||
return statistics;
|
|
||||||
};
|
|
||||||
|
|
||||||
const generateSumStatistics = (
|
|
||||||
id: string,
|
|
||||||
start: Date,
|
|
||||||
end: Date,
|
|
||||||
initValue: number,
|
|
||||||
maxDiff: number
|
|
||||||
) => {
|
|
||||||
const statistics: StatisticValue[] = [];
|
|
||||||
let currentDate = new Date(start);
|
|
||||||
currentDate.setMinutes(0, 0, 0);
|
|
||||||
let sum = initValue;
|
|
||||||
const now = new Date();
|
|
||||||
while (end > currentDate && currentDate < now) {
|
|
||||||
const add = Math.random() * maxDiff;
|
|
||||||
sum += add;
|
|
||||||
statistics.push({
|
|
||||||
statistic_id: id,
|
|
||||||
start: currentDate.toISOString(),
|
|
||||||
mean: null,
|
|
||||||
min: null,
|
|
||||||
max: null,
|
|
||||||
last_reset: "1970-01-01T00:00:00+00:00",
|
|
||||||
state: initValue + sum,
|
|
||||||
sum,
|
|
||||||
});
|
|
||||||
currentDate = addHours(currentDate, 1);
|
|
||||||
}
|
|
||||||
return statistics;
|
|
||||||
};
|
|
||||||
|
|
||||||
const generateCurvedStatistics = (
|
|
||||||
id: string,
|
|
||||||
start: Date,
|
|
||||||
end: Date,
|
|
||||||
initValue: number,
|
|
||||||
maxDiff: number,
|
|
||||||
metered: boolean
|
|
||||||
) => {
|
|
||||||
const statistics: StatisticValue[] = [];
|
|
||||||
let currentDate = new Date(start);
|
|
||||||
currentDate.setMinutes(0, 0, 0);
|
|
||||||
let sum = initValue;
|
|
||||||
const hours = differenceInHours(end, start) - 1;
|
|
||||||
let i = 0;
|
|
||||||
let half = false;
|
|
||||||
const now = new Date();
|
|
||||||
while (end > currentDate && currentDate < now) {
|
|
||||||
const add = Math.random() * maxDiff;
|
|
||||||
sum += i * add;
|
|
||||||
statistics.push({
|
|
||||||
statistic_id: id,
|
|
||||||
start: currentDate.toISOString(),
|
|
||||||
mean: null,
|
|
||||||
min: null,
|
|
||||||
max: null,
|
|
||||||
last_reset: "1970-01-01T00:00:00+00:00",
|
|
||||||
state: initValue + sum,
|
|
||||||
sum: metered ? sum : null,
|
|
||||||
});
|
|
||||||
currentDate = addHours(currentDate, 1);
|
|
||||||
if (!half && i > hours / 2) {
|
|
||||||
half = true;
|
|
||||||
}
|
|
||||||
i += half ? -1 : 1;
|
|
||||||
}
|
|
||||||
return statistics;
|
|
||||||
};
|
|
||||||
|
|
||||||
const statisticsFunctions: Record<
|
|
||||||
string,
|
|
||||||
(id: string, start: Date, end: Date) => StatisticValue[]
|
|
||||||
> = {
|
|
||||||
"sensor.energy_consumption_tarif_1": (id: string, start: Date, end: Date) => {
|
|
||||||
const morningEnd = new Date(start.getTime() + 10 * 60 * 60 * 1000);
|
|
||||||
const morningLow = generateSumStatistics(id, start, morningEnd, 0, 0.7);
|
|
||||||
const eveningStart = new Date(start.getTime() + 20 * 60 * 60 * 1000);
|
|
||||||
const morningFinalVal = morningLow.length
|
|
||||||
? morningLow[morningLow.length - 1].sum!
|
|
||||||
: 0;
|
|
||||||
const empty = generateSumStatistics(
|
|
||||||
id,
|
|
||||||
morningEnd,
|
|
||||||
eveningStart,
|
|
||||||
morningFinalVal,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
const eveningLow = generateSumStatistics(
|
|
||||||
id,
|
|
||||||
eveningStart,
|
|
||||||
end,
|
|
||||||
morningFinalVal,
|
|
||||||
0.7
|
|
||||||
);
|
|
||||||
return [...morningLow, ...empty, ...eveningLow];
|
|
||||||
},
|
|
||||||
"sensor.energy_consumption_tarif_2": (id: string, start: Date, end: Date) => {
|
|
||||||
const morningEnd = new Date(start.getTime() + 9 * 60 * 60 * 1000);
|
|
||||||
const eveningStart = new Date(start.getTime() + 20 * 60 * 60 * 1000);
|
|
||||||
const highTarif = generateSumStatistics(
|
|
||||||
id,
|
|
||||||
morningEnd,
|
|
||||||
eveningStart,
|
|
||||||
0,
|
|
||||||
0.3
|
|
||||||
);
|
|
||||||
const highTarifFinalVal = highTarif.length
|
|
||||||
? highTarif[highTarif.length - 1].sum!
|
|
||||||
: 0;
|
|
||||||
const morning = generateSumStatistics(id, start, morningEnd, 0, 0);
|
|
||||||
const evening = generateSumStatistics(
|
|
||||||
id,
|
|
||||||
eveningStart,
|
|
||||||
end,
|
|
||||||
highTarifFinalVal,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
return [...morning, ...highTarif, ...evening];
|
|
||||||
},
|
|
||||||
"sensor.energy_production_tarif_1": (id, start, end) =>
|
|
||||||
generateSumStatistics(id, start, end, 0, 0),
|
|
||||||
"sensor.energy_production_tarif_1_compensation": (id, start, end) =>
|
|
||||||
generateSumStatistics(id, start, end, 0, 0),
|
|
||||||
"sensor.energy_production_tarif_2": (id, start, end) => {
|
|
||||||
const productionStart = new Date(start.getTime() + 9 * 60 * 60 * 1000);
|
|
||||||
const productionEnd = new Date(start.getTime() + 21 * 60 * 60 * 1000);
|
|
||||||
const dayEnd = new Date(endOfDay(productionEnd));
|
|
||||||
const production = generateCurvedStatistics(
|
|
||||||
id,
|
|
||||||
productionStart,
|
|
||||||
productionEnd,
|
|
||||||
0,
|
|
||||||
0.15,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
const productionFinalVal = production.length
|
|
||||||
? production[production.length - 1].sum!
|
|
||||||
: 0;
|
|
||||||
const morning = generateSumStatistics(id, start, productionStart, 0, 0);
|
|
||||||
const evening = generateSumStatistics(
|
|
||||||
id,
|
|
||||||
productionEnd,
|
|
||||||
dayEnd,
|
|
||||||
productionFinalVal,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
const rest = generateSumStatistics(id, dayEnd, end, productionFinalVal, 1);
|
|
||||||
return [...morning, ...production, ...evening, ...rest];
|
|
||||||
},
|
|
||||||
"sensor.solar_production": (id, start, end) => {
|
|
||||||
const productionStart = new Date(start.getTime() + 7 * 60 * 60 * 1000);
|
|
||||||
const productionEnd = new Date(start.getTime() + 23 * 60 * 60 * 1000);
|
|
||||||
const dayEnd = new Date(endOfDay(productionEnd));
|
|
||||||
const production = generateCurvedStatistics(
|
|
||||||
id,
|
|
||||||
productionStart,
|
|
||||||
productionEnd,
|
|
||||||
0,
|
|
||||||
0.3,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
const productionFinalVal = production.length
|
|
||||||
? production[production.length - 1].sum!
|
|
||||||
: 0;
|
|
||||||
const morning = generateSumStatistics(id, start, productionStart, 0, 0);
|
|
||||||
const evening = generateSumStatistics(
|
|
||||||
id,
|
|
||||||
productionEnd,
|
|
||||||
dayEnd,
|
|
||||||
productionFinalVal,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
const rest = generateSumStatistics(id, dayEnd, end, productionFinalVal, 2);
|
|
||||||
return [...morning, ...production, ...evening, ...rest];
|
|
||||||
},
|
|
||||||
"sensor.grid_fossil_fuel_percentage": (id, start, end) =>
|
|
||||||
generateMeanStatistics(id, start, end, 35, 1.3),
|
|
||||||
};
|
|
||||||
|
|
||||||
export const mockHistory = (mockHass: MockHomeAssistant) => {
|
export const mockHistory = (mockHass: MockHomeAssistant) => {
|
||||||
mockHass.mockAPI(
|
mockHass.mockAPI(
|
||||||
new RegExp("history/period/.+"),
|
new RegExp("history/period/.+"),
|
||||||
(hass, _method, path, _parameters) => {
|
(
|
||||||
|
hass,
|
||||||
|
// @ts-ignore
|
||||||
|
method,
|
||||||
|
path,
|
||||||
|
// @ts-ignore
|
||||||
|
parameters
|
||||||
|
) => {
|
||||||
const params = parseQuery<HistoryQueryParams>(path.split("?")[1]);
|
const params = parseQuery<HistoryQueryParams>(path.split("?")[1]);
|
||||||
const entities = params.filter_entity_id.split(",");
|
const entities = params.filter_entity_id.split(",");
|
||||||
|
|
||||||
@@ -299,7 +95,7 @@ export const mockHistory = (mockHass: MockHomeAssistant) => {
|
|||||||
const numberState = Number(state.state);
|
const numberState = Number(state.state);
|
||||||
|
|
||||||
if (isNaN(numberState)) {
|
if (isNaN(numberState)) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line
|
||||||
console.log(
|
console.log(
|
||||||
"Ignoring state with unparsable state but with a unit",
|
"Ignoring state with unparsable state but with a unit",
|
||||||
entityId,
|
entityId,
|
||||||
@@ -344,40 +140,4 @@ export const mockHistory = (mockHass: MockHomeAssistant) => {
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
mockHass.mockWS("history/list_statistic_ids", () => []);
|
|
||||||
mockHass.mockWS(
|
|
||||||
"history/statistics_during_period",
|
|
||||||
({ statistic_ids, start_time, end_time }, hass) => {
|
|
||||||
const start = new Date(start_time);
|
|
||||||
const end = end_time ? new Date(end_time) : new Date();
|
|
||||||
|
|
||||||
const statistics: Record<string, StatisticValue[]> = {};
|
|
||||||
|
|
||||||
statistic_ids.forEach((id: string) => {
|
|
||||||
if (id in statisticsFunctions) {
|
|
||||||
statistics[id] = statisticsFunctions[id](id, start, end);
|
|
||||||
} else {
|
|
||||||
const entityState = hass.states[id];
|
|
||||||
const state = entityState ? Number(entityState.state) : 1;
|
|
||||||
statistics[id] =
|
|
||||||
entityState && "last_reset" in entityState.attributes
|
|
||||||
? generateSumStatistics(
|
|
||||||
id,
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
state,
|
|
||||||
state * (state > 80 ? 0.01 : 0.05)
|
|
||||||
)
|
|
||||||
: generateMeanStatistics(
|
|
||||||
id,
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
state,
|
|
||||||
state * (state > 80 ? 0.05 : 0.1)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return statistics;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
@@ -10,9 +10,10 @@ export const mockLovelace = (
|
|||||||
localizePromise: Promise<LocalizeFunc>
|
localizePromise: Promise<LocalizeFunc>
|
||||||
) => {
|
) => {
|
||||||
hass.mockWS("lovelace/config", () =>
|
hass.mockWS("lovelace/config", () =>
|
||||||
Promise.all([selectedDemoConfig, localizePromise]).then(
|
Promise.all([
|
||||||
([config, localize]) => config.lovelace(localize)
|
selectedDemoConfig,
|
||||||
)
|
localizePromise,
|
||||||
|
]).then(([config, localize]) => config.lovelace(localize))
|
||||||
);
|
);
|
||||||
|
|
||||||
hass.mockWS("lovelace/config/save", () => Promise.resolve());
|
hass.mockWS("lovelace/config/save", () => Promise.resolve());
|
||||||
|
@@ -6,7 +6,7 @@ export const mockTemplate = (hass: MockHomeAssistant) => {
|
|||||||
body: { message: "Template dev tool does not work in the demo." },
|
body: { message: "Template dev tool does not work in the demo." },
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
hass.mockWS("render_template", (msg, _hass, onChange) => {
|
hass.mockWS("render_template", (msg, onChange) => {
|
||||||
onChange!({
|
onChange!({
|
||||||
result: msg.template,
|
result: msg.template,
|
||||||
listeners: { all: false, domains: [], entities: [], time: false },
|
listeners: { all: false, domains: [], entities: [], time: false },
|
||||||
|
@@ -3,6 +3,8 @@ import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
|||||||
export const mockTranslations = (hass: MockHomeAssistant) => {
|
export const mockTranslations = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS(
|
hass.mockWS(
|
||||||
"frontend/get_translations",
|
"frontend/get_translations",
|
||||||
(/* msg: {language: string, category: string} */) => ({ resources: {} })
|
(/* msg: {language: string, category: string} */) => {
|
||||||
|
return { resources: {} };
|
||||||
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
/* eslint-plugin-disable lit */
|
/* eslint-plugin-disable lit */
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { load } from "js-yaml";
|
import { safeLoad } from "js-yaml";
|
||||||
import { createCardElement } from "../../../src/panels/lovelace/create-element/create-card-element";
|
import { createCardElement } from "../../../src/panels/lovelace/create-element/create-card-element";
|
||||||
|
|
||||||
class DemoCard extends PolymerElement {
|
class DemoCard extends PolymerElement {
|
||||||
@@ -15,35 +15,25 @@ class DemoCard extends PolymerElement {
|
|||||||
margin: 0 0 20px;
|
margin: 0 0 20px;
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
}
|
}
|
||||||
h2 small {
|
|
||||||
font-size: 0.5em;
|
|
||||||
color: var(--primary-text-color);
|
|
||||||
}
|
|
||||||
#card {
|
#card {
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
}
|
}
|
||||||
pre {
|
pre {
|
||||||
width: 400px;
|
width: 400px;
|
||||||
margin: 0 16px;
|
margin: 16px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
color: var(--primary-text-color);
|
|
||||||
}
|
}
|
||||||
@media only screen and (max-width: 800px) {
|
@media only screen and (max-width: 800px) {
|
||||||
.root {
|
.root {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
pre {
|
pre {
|
||||||
margin: 16px 0;
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<h2>
|
<h2>[[config.heading]]</h2>
|
||||||
[[config.heading]]
|
|
||||||
<template is="dom-if" if="[[_size]]">
|
|
||||||
<small>(size [[_size]])</small>
|
|
||||||
</template>
|
|
||||||
</h2>
|
|
||||||
<div class="root">
|
<div class="root">
|
||||||
<div id="card"></div>
|
<div id="card"></div>
|
||||||
<template is="dom-if" if="[[showConfig]]">
|
<template is="dom-if" if="[[showConfig]]">
|
||||||
@@ -64,9 +54,6 @@ class DemoCard extends PolymerElement {
|
|||||||
observer: "_configChanged",
|
observer: "_configChanged",
|
||||||
},
|
},
|
||||||
showConfig: Boolean,
|
showConfig: Boolean,
|
||||||
_size: {
|
|
||||||
type: Number,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,19 +67,8 @@ class DemoCard extends PolymerElement {
|
|||||||
card.removeChild(card.lastChild);
|
card.removeChild(card.lastChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
const el = this._createCardElement(load(config.config)[0]);
|
const el = this._createCardElement(safeLoad(config.config)[0]);
|
||||||
card.appendChild(el);
|
card.appendChild(el);
|
||||||
this._getSize(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
async _getSize(el) {
|
|
||||||
await customElements.whenDefined(el.localName);
|
|
||||||
|
|
||||||
if (!("getCardSize" in el)) {
|
|
||||||
this._size = undefined;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._size = await el.getCardSize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_createCardElement(cardConfig) {
|
_createCardElement(cardConfig) {
|
||||||
|
@@ -2,10 +2,10 @@ import "@polymer/app-layout/app-toolbar/app-toolbar";
|
|||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
/* eslint-plugin-disable lit */
|
/* eslint-plugin-disable lit */
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
|
|
||||||
import "../../../src/components/ha-formfield";
|
|
||||||
import "../../../src/components/ha-switch";
|
import "../../../src/components/ha-switch";
|
||||||
|
import "../../../src/components/ha-formfield";
|
||||||
import "./demo-card";
|
import "./demo-card";
|
||||||
|
import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
|
||||||
|
|
||||||
class DemoCards extends PolymerElement {
|
class DemoCards extends PolymerElement {
|
||||||
static get template() {
|
static get template() {
|
||||||
|
@@ -2,62 +2,58 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
|
|||||||
/* eslint-plugin-disable lit */
|
/* eslint-plugin-disable lit */
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import "../../../src/components/ha-card";
|
import "../../../src/components/ha-card";
|
||||||
import "../../../src/dialogs/more-info/more-info-content";
|
|
||||||
import "../../../src/state-summary/state-card-content";
|
import "../../../src/state-summary/state-card-content";
|
||||||
|
import "../../../src/dialogs/more-info/more-info-content";
|
||||||
|
|
||||||
class DemoMoreInfo extends PolymerElement {
|
class DemoMoreInfo extends PolymerElement {
|
||||||
static get template() {
|
static get template() {
|
||||||
return html`
|
return html`
|
||||||
<style>
|
<style>
|
||||||
.root {
|
:host {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-items: start;
|
||||||
}
|
}
|
||||||
#card {
|
|
||||||
max-width: 400px;
|
|
||||||
width: 100vw;
|
|
||||||
}
|
|
||||||
ha-card {
|
ha-card {
|
||||||
width: 352px;
|
width: 333px;
|
||||||
padding: 20px 24px;
|
padding: 20px 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
state-card-content {
|
state-card-content {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
width: 400px;
|
width: 400px;
|
||||||
margin: 0 16px;
|
margin: 16px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
color: var(--primary-text-color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 800px) {
|
@media only screen and (max-width: 800px) {
|
||||||
.root {
|
:host {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
pre {
|
pre {
|
||||||
margin: 16px 0;
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="root">
|
<ha-card>
|
||||||
<div id="card">
|
<state-card-content
|
||||||
<ha-card>
|
state-obj="[[_stateObj]]"
|
||||||
<state-card-content
|
hass="[[hass]]"
|
||||||
state-obj="[[_stateObj]]"
|
in-dialog
|
||||||
hass="[[hass]]"
|
></state-card-content>
|
||||||
in-dialog
|
|
||||||
></state-card-content>
|
|
||||||
|
|
||||||
<more-info-content
|
<more-info-content
|
||||||
hass="[[hass]]"
|
hass="[[hass]]"
|
||||||
state-obj="[[_stateObj]]"
|
state-obj="[[_stateObj]]"
|
||||||
></more-info-content>
|
></more-info-content>
|
||||||
</ha-card>
|
</ha-card>
|
||||||
</div>
|
<template is="dom-if" if="[[showConfig]]">
|
||||||
<template is="dom-if" if="[[showConfig]]">
|
<pre>[[_jsonEntity(_stateObj)]]</pre>
|
||||||
<pre>[[_jsonEntity(_stateObj)]]</pre>
|
</template>
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,8 +2,6 @@ import "@polymer/app-layout/app-toolbar/app-toolbar";
|
|||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
/* eslint-plugin-disable lit */
|
/* eslint-plugin-disable lit */
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
|
|
||||||
import "../../../src/components/ha-formfield";
|
|
||||||
import "../../../src/components/ha-switch";
|
import "../../../src/components/ha-switch";
|
||||||
import "./demo-more-info";
|
import "./demo-more-info";
|
||||||
|
|
||||||
@@ -11,10 +9,6 @@ class DemoMoreInfos extends PolymerElement {
|
|||||||
static get template() {
|
static get template() {
|
||||||
return html`
|
return html`
|
||||||
<style>
|
<style>
|
||||||
#container {
|
|
||||||
min-height: calc(100vh - 128px);
|
|
||||||
background: var(--primary-background-color);
|
|
||||||
}
|
|
||||||
.cards {
|
.cards {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
@@ -29,31 +23,20 @@ class DemoMoreInfos extends PolymerElement {
|
|||||||
.filters {
|
.filters {
|
||||||
margin-left: 60px;
|
margin-left: 60px;
|
||||||
}
|
}
|
||||||
ha-formfield {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
<app-toolbar>
|
<app-toolbar>
|
||||||
<div class="filters">
|
<div class="filters">
|
||||||
<ha-formfield label="Show entities">
|
<ha-switch checked="{{_showConfig}}">Show entity</ha-switch>
|
||||||
<ha-switch checked="[[_showConfig]]" on-change="_showConfigToggled">
|
|
||||||
</ha-switch>
|
|
||||||
</ha-formfield>
|
|
||||||
<ha-formfield label="Dark theme">
|
|
||||||
<ha-switch on-change="_darkThemeToggled"> </ha-switch>
|
|
||||||
</ha-formfield>
|
|
||||||
</div>
|
</div>
|
||||||
</app-toolbar>
|
</app-toolbar>
|
||||||
<div id="container">
|
<div class="cards">
|
||||||
<div class="cards">
|
<template is="dom-repeat" items="[[entities]]">
|
||||||
<template is="dom-repeat" items="[[entities]]">
|
<demo-more-info
|
||||||
<demo-more-info
|
entity-id="[[item]]"
|
||||||
entity-id="[[item]]"
|
show-config="[[_showConfig]]"
|
||||||
show-config="[[_showConfig]]"
|
hass="[[hass]]"
|
||||||
hass="[[hass]]"
|
></demo-more-info>
|
||||||
></demo-more-info>
|
</template>
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
@@ -68,16 +51,6 @@ class DemoMoreInfos extends PolymerElement {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
_showConfigToggled(ev) {
|
|
||||||
this._showConfig = ev.target.checked;
|
|
||||||
}
|
|
||||||
|
|
||||||
_darkThemeToggled(ev) {
|
|
||||||
applyThemesOnElement(this.$.container, { themes: {} }, "default", {
|
|
||||||
dark: ev.target.checked,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("demo-more-infos", DemoMoreInfos);
|
customElements.define("demo-more-infos", DemoMoreInfos);
|
||||||
|
@@ -7,8 +7,8 @@ export const createMediaPlayerEntities = () => [
|
|||||||
media_title: "I Wanna Be A Hippy (Flamman & Abraxas Radio Mix)",
|
media_title: "I Wanna Be A Hippy (Flamman & Abraxas Radio Mix)",
|
||||||
media_artist: "Technohead",
|
media_artist: "Technohead",
|
||||||
// Pause + Seek + Volume Set + Volume Mute + Previous Track + Next Track + Play Media +
|
// Pause + Seek + Volume Set + Volume Mute + Previous Track + Next Track + Play Media +
|
||||||
// Select Source + Stop + Clear + Play + Shuffle Set
|
// Select Source + Stop + Clear + Play + Shuffle Set + Browse Media
|
||||||
supported_features: 64063,
|
supported_features: 195135,
|
||||||
entity_picture: "/images/album_cover_2.jpg",
|
entity_picture: "/images/album_cover_2.jpg",
|
||||||
media_duration: 300,
|
media_duration: 300,
|
||||||
media_position: 50,
|
media_position: 50,
|
||||||
@@ -24,8 +24,8 @@ export const createMediaPlayerEntities = () => [
|
|||||||
media_title: "I Wanna Be A Hippy (Flamman & Abraxas Radio Mix)",
|
media_title: "I Wanna Be A Hippy (Flamman & Abraxas Radio Mix)",
|
||||||
media_artist: "Technohead",
|
media_artist: "Technohead",
|
||||||
// Pause + Seek + Volume Set + Volume Mute + Previous Track + Next Track + Play Media +
|
// Pause + Seek + Volume Set + Volume Mute + Previous Track + Next Track + Play Media +
|
||||||
// Select Source + Stop + Clear + Play + Shuffle Set + Browse Media
|
// Select Source + Stop + Clear + Play + Shuffle Set
|
||||||
supported_features: 195135,
|
supported_features: 64063,
|
||||||
entity_picture: "/images/album_cover.jpg",
|
entity_picture: "/images/album_cover.jpg",
|
||||||
media_duration: 300,
|
media_duration: 300,
|
||||||
media_position: 0,
|
media_position: 0,
|
||||||
|
@@ -1,72 +0,0 @@
|
|||||||
import { getEntity } from "../../../src/fake_data/entity";
|
|
||||||
|
|
||||||
export const createPlantEntities = () => [
|
|
||||||
getEntity("plant", "lemon_tree", "ok", {
|
|
||||||
problem: "none",
|
|
||||||
sensors: {
|
|
||||||
moisture: "sensor.lemon_tree_moisture",
|
|
||||||
battery: "sensor.lemon_tree_battery",
|
|
||||||
temperature: "sensor.lemon_tree_temperature",
|
|
||||||
conductivity: "sensor.lemon_tree_conductivity",
|
|
||||||
brightness: "sensor.lemon_tree_brightness",
|
|
||||||
},
|
|
||||||
unit_of_measurement_dict: {
|
|
||||||
temperature: "°C",
|
|
||||||
moisture: "%",
|
|
||||||
brightness: "lx",
|
|
||||||
battery: "%",
|
|
||||||
conductivity: "μS/cm",
|
|
||||||
},
|
|
||||||
moisture: 54,
|
|
||||||
battery: 95,
|
|
||||||
temperature: 15.6,
|
|
||||||
conductivity: 1,
|
|
||||||
brightness: 12,
|
|
||||||
max_brightness: 20,
|
|
||||||
friendly_name: "Lemon Tree",
|
|
||||||
}),
|
|
||||||
getEntity("plant", "apple_tree", "ok", {
|
|
||||||
problem: "brightness",
|
|
||||||
sensors: {
|
|
||||||
moisture: "sensor.apple_tree_moisture",
|
|
||||||
battery: "sensor.apple_tree_battery",
|
|
||||||
temperature: "sensor.apple_tree_temperature",
|
|
||||||
conductivity: "sensor.apple_tree_conductivity",
|
|
||||||
brightness: "sensor.apple_tree_brightness",
|
|
||||||
},
|
|
||||||
unit_of_measurement_dict: {
|
|
||||||
temperature: "°C",
|
|
||||||
moisture: "%",
|
|
||||||
brightness: "lx",
|
|
||||||
battery: "%",
|
|
||||||
conductivity: "μS/cm",
|
|
||||||
},
|
|
||||||
moisture: 54,
|
|
||||||
battery: 2,
|
|
||||||
temperature: 15.6,
|
|
||||||
conductivity: 1,
|
|
||||||
brightness: 25,
|
|
||||||
max_brightness: 20,
|
|
||||||
friendly_name: "Apple Tree",
|
|
||||||
}),
|
|
||||||
getEntity("plant", "sunflowers", "ok", {
|
|
||||||
problem: "moisture, temperature, conductivity",
|
|
||||||
sensors: {
|
|
||||||
moisture: "sensor.sunflowers_moisture",
|
|
||||||
temperature: "sensor.sunflowers_temperature",
|
|
||||||
conductivity: "sensor.sunflowers_conductivity",
|
|
||||||
brightness: "sensor.sunflowers_brightness",
|
|
||||||
},
|
|
||||||
unit_of_measurement_dict: {
|
|
||||||
temperature: "°C",
|
|
||||||
moisture: "%",
|
|
||||||
brightness: "lx",
|
|
||||||
conductivity: "μS/cm",
|
|
||||||
},
|
|
||||||
moisture: 54,
|
|
||||||
temperature: 15.6,
|
|
||||||
conductivity: 1,
|
|
||||||
brightness: 25,
|
|
||||||
entity_picture: "/images/sunflowers.jpg",
|
|
||||||
}),
|
|
||||||
];
|
|
@@ -1,349 +0,0 @@
|
|||||||
import { DemoTrace } from "./types";
|
|
||||||
|
|
||||||
export const basicTrace: DemoTrace = {
|
|
||||||
trace: {
|
|
||||||
last_step: "action/2",
|
|
||||||
run_id: "0",
|
|
||||||
state: "stopped",
|
|
||||||
timestamp: {
|
|
||||||
start: "2021-03-25T04:36:51.223693+00:00",
|
|
||||||
finish: "2021-03-25T04:36:51.266132+00:00",
|
|
||||||
},
|
|
||||||
trigger: "state of input_boolean.toggle_1",
|
|
||||||
domain: "automation",
|
|
||||||
item_id: "1615419646544",
|
|
||||||
trace: {
|
|
||||||
"trigger/0": [
|
|
||||||
{
|
|
||||||
path: "trigger/0",
|
|
||||||
timestamp: "2021-03-25T04:36:51.223693+00:00",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"condition/0": [
|
|
||||||
{
|
|
||||||
path: "condition/0",
|
|
||||||
timestamp: "2021-03-25T04:36:51.228243+00:00",
|
|
||||||
changed_variables: {
|
|
||||||
trigger: {
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
from_state: {
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
state: "on",
|
|
||||||
attributes: {
|
|
||||||
editable: true,
|
|
||||||
friendly_name: "Toggle 1",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-24T19:03:59.141440+00:00",
|
|
||||||
last_updated: "2021-03-24T19:03:59.141440+00:00",
|
|
||||||
context: {
|
|
||||||
id: "5d0918eb379214d07554bdab6a08bcff",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
to_state: {
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
state: "off",
|
|
||||||
attributes: {
|
|
||||||
editable: true,
|
|
||||||
friendly_name: "Toggle 1",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-25T04:36:51.220696+00:00",
|
|
||||||
last_updated: "2021-03-25T04:36:51.220696+00:00",
|
|
||||||
context: {
|
|
||||||
id: "664d6d261450a9ecea6738e97269a149",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: "d1b4e89da01445fa8bc98e39fac477ca",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
for: null,
|
|
||||||
attribute: null,
|
|
||||||
description: "state of input_boolean.toggle_1",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
result: {
|
|
||||||
result: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/0": [
|
|
||||||
{
|
|
||||||
path: "action/0",
|
|
||||||
timestamp: "2021-03-25T04:36:51.243018+00:00",
|
|
||||||
changed_variables: {
|
|
||||||
trigger: {
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
from_state: {
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
state: "on",
|
|
||||||
attributes: {
|
|
||||||
editable: true,
|
|
||||||
friendly_name: "Toggle 1",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-24T19:03:59.141440+00:00",
|
|
||||||
last_updated: "2021-03-24T19:03:59.141440+00:00",
|
|
||||||
context: {
|
|
||||||
id: "5d0918eb379214d07554bdab6a08bcff",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
to_state: {
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
state: "off",
|
|
||||||
attributes: {
|
|
||||||
editable: true,
|
|
||||||
friendly_name: "Toggle 1",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-25T04:36:51.220696+00:00",
|
|
||||||
last_updated: "2021-03-25T04:36:51.220696+00:00",
|
|
||||||
context: {
|
|
||||||
id: "664d6d261450a9ecea6738e97269a149",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: "d1b4e89da01445fa8bc98e39fac477ca",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
for: null,
|
|
||||||
attribute: null,
|
|
||||||
description: "state of input_boolean.toggle_1",
|
|
||||||
},
|
|
||||||
context: {
|
|
||||||
id: "6cfcae368e7b3686fad6c59e83ae76c9",
|
|
||||||
parent_id: "664d6d261450a9ecea6738e97269a149",
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
result: {
|
|
||||||
params: {
|
|
||||||
domain: "input_boolean",
|
|
||||||
service: "toggle",
|
|
||||||
service_data: {},
|
|
||||||
target: {
|
|
||||||
entity_id: ["input_boolean.toggle_4"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
running_script: false,
|
|
||||||
limit: 10,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/1": [
|
|
||||||
{
|
|
||||||
path: "action/1",
|
|
||||||
timestamp: "2021-03-25T04:36:51.252406+00:00",
|
|
||||||
result: {
|
|
||||||
choice: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/1/choose/0": [
|
|
||||||
{
|
|
||||||
path: "action/1/choose/0",
|
|
||||||
timestamp: "2021-03-25T04:36:51.254569+00:00",
|
|
||||||
result: {
|
|
||||||
result: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/1/choose/0/conditions/0": [
|
|
||||||
{
|
|
||||||
path: "action/1/choose/0/conditions/0",
|
|
||||||
timestamp: "2021-03-25T04:36:51.254697+00:00",
|
|
||||||
result: {
|
|
||||||
result: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/1/choose/0/sequence/0": [
|
|
||||||
{
|
|
||||||
path: "action/1/choose/0/sequence/0",
|
|
||||||
timestamp: "2021-03-25T04:36:51.257360+00:00",
|
|
||||||
result: {
|
|
||||||
params: {
|
|
||||||
domain: "input_boolean",
|
|
||||||
service: "toggle",
|
|
||||||
service_data: {},
|
|
||||||
target: {
|
|
||||||
entity_id: ["input_boolean.toggle_2"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
running_script: false,
|
|
||||||
limit: 10,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/1/choose/0/sequence/1": [
|
|
||||||
{
|
|
||||||
path: "action/1/choose/0/sequence/1",
|
|
||||||
timestamp: "2021-03-25T04:36:51.260658+00:00",
|
|
||||||
result: {
|
|
||||||
params: {
|
|
||||||
domain: "input_boolean",
|
|
||||||
service: "toggle",
|
|
||||||
service_data: {},
|
|
||||||
target: {
|
|
||||||
entity_id: ["input_boolean.toggle_3"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
running_script: false,
|
|
||||||
limit: 10,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/2": [
|
|
||||||
{
|
|
||||||
path: "action/2",
|
|
||||||
timestamp: "2021-03-25T04:36:51.264159+00:00",
|
|
||||||
result: {
|
|
||||||
params: {
|
|
||||||
domain: "input_boolean",
|
|
||||||
service: "toggle",
|
|
||||||
service_data: {},
|
|
||||||
target: {
|
|
||||||
entity_id: ["input_boolean.toggle_4"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
running_script: false,
|
|
||||||
limit: 10,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
|
|
||||||
config: {
|
|
||||||
id: "1615419646544",
|
|
||||||
alias: "Ensure Party mode",
|
|
||||||
description: "",
|
|
||||||
trigger: [
|
|
||||||
{
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
condition: [
|
|
||||||
{
|
|
||||||
condition: "template",
|
|
||||||
alias: "Test if Paulus is home",
|
|
||||||
value_template: "{{ true }}",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
action: [
|
|
||||||
{
|
|
||||||
service: "input_boolean.toggle",
|
|
||||||
target: {
|
|
||||||
entity_id: "input_boolean.toggle_4",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
choose: [
|
|
||||||
{
|
|
||||||
alias: "If toggle 3 is on",
|
|
||||||
conditions: [
|
|
||||||
{
|
|
||||||
condition: "template",
|
|
||||||
value_template:
|
|
||||||
"{{ is_state('input_boolean.toggle_3', 'on') }}",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
sequence: [
|
|
||||||
{
|
|
||||||
service: "input_boolean.toggle",
|
|
||||||
alias: "Toggle 2 while 3 is on",
|
|
||||||
target: {
|
|
||||||
entity_id: "input_boolean.toggle_2",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
service: "input_boolean.toggle",
|
|
||||||
alias: "Toggle 3",
|
|
||||||
target: {
|
|
||||||
entity_id: "input_boolean.toggle_3",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
default: [
|
|
||||||
{
|
|
||||||
service: "input_boolean.toggle",
|
|
||||||
alias: "Toggle 2",
|
|
||||||
target: {
|
|
||||||
entity_id: "input_boolean.toggle_2",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
service: "input_boolean.toggle",
|
|
||||||
target: {
|
|
||||||
entity_id: "input_boolean.toggle_4",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
mode: "single",
|
|
||||||
},
|
|
||||||
context: {
|
|
||||||
id: "6cfcae368e7b3686fad6c59e83ae76c9",
|
|
||||||
parent_id: "664d6d261450a9ecea6738e97269a149",
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
script_execution: "finished",
|
|
||||||
},
|
|
||||||
logbookEntries: [
|
|
||||||
{
|
|
||||||
name: "Ensure Party mode",
|
|
||||||
message: "has been triggered by state of input_boolean.toggle_1",
|
|
||||||
source: "state of input_boolean.toggle_1",
|
|
||||||
entity_id: "automation.toggle_toggles",
|
|
||||||
context_id: "6cfcae368e7b3686fad6c59e83ae76c9",
|
|
||||||
when: "2021-03-25T04:36:51.240832+00:00",
|
|
||||||
domain: "automation",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
when: "2021-03-25T04:36:51.249828+00:00",
|
|
||||||
name: "Toggle 4",
|
|
||||||
state: "on",
|
|
||||||
entity_id: "input_boolean.toggle_4",
|
|
||||||
context_entity_id: "automation.toggle_toggles",
|
|
||||||
context_entity_id_name: "Ensure Party mode",
|
|
||||||
context_event_type: "automation_triggered",
|
|
||||||
context_domain: "automation",
|
|
||||||
context_name: "Ensure Party mode",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
when: "2021-03-25T04:36:51.258947+00:00",
|
|
||||||
name: "Toggle 2",
|
|
||||||
state: "on",
|
|
||||||
entity_id: "input_boolean.toggle_2",
|
|
||||||
context_entity_id: "automation.toggle_toggles",
|
|
||||||
context_entity_id_name: "Ensure Party mode",
|
|
||||||
context_event_type: "automation_triggered",
|
|
||||||
context_domain: "automation",
|
|
||||||
context_name: "Ensure Party mode",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
when: "2021-03-25T04:36:51.261806+00:00",
|
|
||||||
name: "Toggle 3",
|
|
||||||
state: "off",
|
|
||||||
entity_id: "input_boolean.toggle_3",
|
|
||||||
context_entity_id: "automation.toggle_toggles",
|
|
||||||
context_entity_id_name: "Ensure Party mode",
|
|
||||||
context_event_type: "automation_triggered",
|
|
||||||
context_domain: "automation",
|
|
||||||
context_name: "Ensure Party mode",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
when: "2021-03-25T04:36:51.265246+00:00",
|
|
||||||
name: "Toggle 4",
|
|
||||||
state: "off",
|
|
||||||
entity_id: "input_boolean.toggle_4",
|
|
||||||
context_entity_id: "automation.toggle_toggles",
|
|
||||||
context_entity_id_name: "Ensure Party mode",
|
|
||||||
context_event_type: "automation_triggered",
|
|
||||||
context_domain: "automation",
|
|
||||||
context_name: "Ensure Party mode",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
@@ -1,44 +0,0 @@
|
|||||||
import { LogbookEntry } from "../../../../src/data/logbook";
|
|
||||||
import { AutomationTraceExtended } from "../../../../src/data/trace";
|
|
||||||
import { DemoTrace } from "./types";
|
|
||||||
|
|
||||||
export const mockDemoTrace = (
|
|
||||||
tracePartial: Partial<AutomationTraceExtended>,
|
|
||||||
logbookEntries?: LogbookEntry[]
|
|
||||||
): DemoTrace => ({
|
|
||||||
trace: {
|
|
||||||
last_step: "",
|
|
||||||
run_id: "0",
|
|
||||||
state: "stopped",
|
|
||||||
timestamp: {
|
|
||||||
start: "2021-03-25T04:36:51.223693+00:00",
|
|
||||||
finish: "2021-03-25T04:36:51.266132+00:00",
|
|
||||||
},
|
|
||||||
trigger: "mocked trigger",
|
|
||||||
domain: "automation",
|
|
||||||
item_id: "1615419646544",
|
|
||||||
trace: {
|
|
||||||
"trigger/0": [
|
|
||||||
{
|
|
||||||
path: "trigger/0",
|
|
||||||
changed_variables: {
|
|
||||||
trigger: {
|
|
||||||
description: "mocked trigger",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
timestamp: "2021-03-25T04:36:51.223693+00:00",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
config: {
|
|
||||||
trigger: [],
|
|
||||||
action: [],
|
|
||||||
},
|
|
||||||
context: {
|
|
||||||
id: "abcd",
|
|
||||||
},
|
|
||||||
script_execution: "finished",
|
|
||||||
...tracePartial,
|
|
||||||
},
|
|
||||||
logbookEntries: logbookEntries || [],
|
|
||||||
});
|
|
@@ -1,214 +0,0 @@
|
|||||||
import { DemoTrace } from "./types";
|
|
||||||
|
|
||||||
export const motionLightTrace: DemoTrace = {
|
|
||||||
trace: {
|
|
||||||
last_step: "action/3",
|
|
||||||
run_id: "1",
|
|
||||||
state: "stopped",
|
|
||||||
timestamp: {
|
|
||||||
start: "2021-03-14T06:07:01.768006+00:00",
|
|
||||||
finish: "2021-03-14T06:07:53.287525+00:00",
|
|
||||||
},
|
|
||||||
trigger: "state of binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
domain: "automation",
|
|
||||||
item_id: "1614732497392",
|
|
||||||
trace: {
|
|
||||||
"trigger/0": [
|
|
||||||
{
|
|
||||||
path: "trigger/0",
|
|
||||||
timestamp: "2021-03-25T04:36:51.223693+00:00",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/0": [
|
|
||||||
{
|
|
||||||
path: "action/0",
|
|
||||||
timestamp: "2021-03-14T06:07:01.771038+00:00",
|
|
||||||
changed_variables: {
|
|
||||||
trigger: {
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
from_state: {
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
state: "off",
|
|
||||||
attributes: {
|
|
||||||
friendly_name: "Paulus’s MacBook Pro Camera In Use",
|
|
||||||
icon: "mdi:camera-off",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-14T06:06:29.235325+00:00",
|
|
||||||
last_updated: "2021-03-14T06:06:29.235325+00:00",
|
|
||||||
context: {
|
|
||||||
id: "ad4864c5ce957c38a07b50378eeb245d",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
to_state: {
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
state: "on",
|
|
||||||
attributes: {
|
|
||||||
friendly_name: "Paulus’s MacBook Pro Camera In Use",
|
|
||||||
icon: "mdi:camera",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-14T06:07:01.762009+00:00",
|
|
||||||
last_updated: "2021-03-14T06:07:01.762009+00:00",
|
|
||||||
context: {
|
|
||||||
id: "e22ddfd5f11dc4aad9a52fc10dab613b",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
for: null,
|
|
||||||
attribute: null,
|
|
||||||
description:
|
|
||||||
"state of binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
},
|
|
||||||
context: {
|
|
||||||
id: "43b6ee9293a551c5cc14e8eb60af54ba",
|
|
||||||
parent_id: "e22ddfd5f11dc4aad9a52fc10dab613b",
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/1": [
|
|
||||||
{ path: "action/1", timestamp: "2021-03-14T06:07:01.875316+00:00" },
|
|
||||||
],
|
|
||||||
"action/2": [
|
|
||||||
{
|
|
||||||
path: "action/2",
|
|
||||||
timestamp: "2021-03-14T06:07:53.195013+00:00",
|
|
||||||
changed_variables: {
|
|
||||||
wait: {
|
|
||||||
remaining: null,
|
|
||||||
trigger: {
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
from_state: {
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
state: "on",
|
|
||||||
attributes: {
|
|
||||||
friendly_name: "Paulus’s MacBook Pro Camera In Use",
|
|
||||||
icon: "mdi:camera",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-14T06:07:01.762009+00:00",
|
|
||||||
last_updated: "2021-03-14T06:07:01.762009+00:00",
|
|
||||||
context: {
|
|
||||||
id: "e22ddfd5f11dc4aad9a52fc10dab613b",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
to_state: {
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
state: "off",
|
|
||||||
attributes: {
|
|
||||||
friendly_name: "Paulus’s MacBook Pro Camera In Use",
|
|
||||||
icon: "mdi:camera-off",
|
|
||||||
},
|
|
||||||
last_changed: "2021-03-14T06:07:53.186755+00:00",
|
|
||||||
last_updated: "2021-03-14T06:07:53.186755+00:00",
|
|
||||||
context: {
|
|
||||||
id: "b2308cc91d509ea8e0c623331ab178d6",
|
|
||||||
parent_id: null,
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
for: null,
|
|
||||||
attribute: null,
|
|
||||||
description:
|
|
||||||
"state of binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"action/3": [
|
|
||||||
{
|
|
||||||
path: "action/3",
|
|
||||||
timestamp: "2021-03-14T06:07:53.196014+00:00",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
config: {
|
|
||||||
mode: "restart",
|
|
||||||
max_exceeded: "silent",
|
|
||||||
trigger: [
|
|
||||||
{
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
from: "off",
|
|
||||||
to: "on",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
action: [
|
|
||||||
{
|
|
||||||
service: "light.turn_on",
|
|
||||||
target: {
|
|
||||||
entity_id: "light.elgato_key_light_air",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
wait_for_trigger: [
|
|
||||||
{
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
from: "on",
|
|
||||||
to: "off",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
delay: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
service: "light.turn_off",
|
|
||||||
target: {
|
|
||||||
entity_id: "light.elgato_key_light_air",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
id: "1614732497392",
|
|
||||||
alias: "Auto Elgato",
|
|
||||||
description: "",
|
|
||||||
},
|
|
||||||
context: {
|
|
||||||
id: "43b6ee9293a551c5cc14e8eb60af54ba",
|
|
||||||
parent_id: "e22ddfd5f11dc4aad9a52fc10dab613b",
|
|
||||||
user_id: null,
|
|
||||||
},
|
|
||||||
script_execution: "finished",
|
|
||||||
},
|
|
||||||
logbookEntries: [
|
|
||||||
{
|
|
||||||
name: "Auto Elgato",
|
|
||||||
message:
|
|
||||||
"has been triggered by state of binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
source: "state of binary_sensor.pauluss_macbook_pro_camera_in_use",
|
|
||||||
entity_id: "automation.auto_elgato",
|
|
||||||
when: "2021-03-14T06:07:01.768492+00:00",
|
|
||||||
domain: "automation",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
when: "2021-03-14T06:07:01.872187+00:00",
|
|
||||||
name: "Elgato Key Light Air",
|
|
||||||
state: "on",
|
|
||||||
entity_id: "light.elgato_key_light_air",
|
|
||||||
context_entity_id: "automation.auto_elgato",
|
|
||||||
context_entity_id_name: "Auto Elgato",
|
|
||||||
context_event_type: "automation_triggered",
|
|
||||||
context_domain: "automation",
|
|
||||||
context_name: "Auto Elgato",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
when: "2021-03-14T06:07:53.284505+00:00",
|
|
||||||
name: "Elgato Key Light Air",
|
|
||||||
state: "off",
|
|
||||||
entity_id: "light.elgato_key_light_air",
|
|
||||||
context_entity_id: "automation.auto_elgato",
|
|
||||||
context_entity_id_name: "Auto Elgato",
|
|
||||||
context_event_type: "automation_triggered",
|
|
||||||
context_domain: "automation",
|
|
||||||
context_name: "Auto Elgato",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
@@ -1,7 +0,0 @@
|
|||||||
import { AutomationTraceExtended } from "../../../../src/data/trace";
|
|
||||||
import { LogbookEntry } from "../../../../src/data/logbook";
|
|
||||||
|
|
||||||
export interface DemoTrace {
|
|
||||||
trace: AutomationTraceExtended;
|
|
||||||
logbookEntries: LogbookEntry[];
|
|
||||||
}
|
|
@@ -1,96 +0,0 @@
|
|||||||
import { dump } from "js-yaml";
|
|
||||||
import { html, css, LitElement, TemplateResult } from "lit";
|
|
||||||
import { customElement, property } from "lit/decorators";
|
|
||||||
import "../../../src/components/ha-card";
|
|
||||||
import { describeAction } from "../../../src/data/script_i18n";
|
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
|
||||||
import { HomeAssistant } from "../../../src/types";
|
|
||||||
|
|
||||||
const actions = [
|
|
||||||
{ wait_template: "{{ true }}", alias: "Something with an alias" },
|
|
||||||
{ delay: "0:05" },
|
|
||||||
{ wait_template: "{{ true }}" },
|
|
||||||
{
|
|
||||||
condition: "template",
|
|
||||||
value_template: "{{ true }}",
|
|
||||||
},
|
|
||||||
{ event: "happy_event" },
|
|
||||||
{
|
|
||||||
device_id: "abcdefgh",
|
|
||||||
domain: "plex",
|
|
||||||
entity_id: "media_player.kitchen",
|
|
||||||
},
|
|
||||||
{ scene: "scene.kitchen_morning" },
|
|
||||||
{
|
|
||||||
wait_for_trigger: [
|
|
||||||
{
|
|
||||||
platform: "state",
|
|
||||||
entity_id: "input_boolean.toggle_1",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
variables: {
|
|
||||||
hello: "world",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
service: "input_boolean.toggle",
|
|
||||||
target: {
|
|
||||||
entity_id: "input_boolean.toggle_4",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
@customElement("demo-automation-describe-action")
|
|
||||||
export class DemoAutomationDescribeAction extends LitElement {
|
|
||||||
@property({ attribute: false }) hass!: HomeAssistant;
|
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
if (!this.hass) {
|
|
||||||
return html``;
|
|
||||||
}
|
|
||||||
return html`
|
|
||||||
<ha-card header="Actions">
|
|
||||||
${actions.map(
|
|
||||||
(conf) => html`
|
|
||||||
<div class="action">
|
|
||||||
<span>${describeAction(this.hass, conf as any)}</span>
|
|
||||||
<pre>${dump(conf)}</pre>
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
)}
|
|
||||||
</ha-card>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected firstUpdated(changedProps) {
|
|
||||||
super.firstUpdated(changedProps);
|
|
||||||
const hass = provideHass(this);
|
|
||||||
hass.updateTranslations(null, "en");
|
|
||||||
}
|
|
||||||
|
|
||||||
static get styles() {
|
|
||||||
return css`
|
|
||||||
ha-card {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: 24px auto;
|
|
||||||
}
|
|
||||||
.action {
|
|
||||||
padding: 16px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
span {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-automation-describe-action": DemoAutomationDescribeAction;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,60 +0,0 @@
|
|||||||
import { dump } from "js-yaml";
|
|
||||||
import { html, css, LitElement, TemplateResult } from "lit";
|
|
||||||
import { customElement } from "lit/decorators";
|
|
||||||
import "../../../src/components/ha-card";
|
|
||||||
import { describeCondition } from "../../../src/data/automation_i18n";
|
|
||||||
|
|
||||||
const conditions = [
|
|
||||||
{ condition: "and" },
|
|
||||||
{ condition: "not" },
|
|
||||||
{ condition: "or" },
|
|
||||||
{ condition: "state" },
|
|
||||||
{ condition: "numeric_state" },
|
|
||||||
{ condition: "sun", after: "sunset" },
|
|
||||||
{ condition: "sun", after: "sunrise" },
|
|
||||||
{ condition: "zone" },
|
|
||||||
{ condition: "time" },
|
|
||||||
{ condition: "template" },
|
|
||||||
];
|
|
||||||
|
|
||||||
@customElement("demo-automation-describe-condition")
|
|
||||||
export class DemoAutomationDescribeCondition extends LitElement {
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`
|
|
||||||
<ha-card header="Conditions">
|
|
||||||
${conditions.map(
|
|
||||||
(conf) => html`
|
|
||||||
<div class="condition">
|
|
||||||
<span>${describeCondition(conf as any)}</span>
|
|
||||||
<pre>${dump(conf)}</pre>
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
)}
|
|
||||||
</ha-card>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get styles() {
|
|
||||||
return css`
|
|
||||||
ha-card {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: 24px auto;
|
|
||||||
}
|
|
||||||
.condition {
|
|
||||||
padding: 16px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
span {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-automation-describe-condition": DemoAutomationDescribeCondition;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,63 +0,0 @@
|
|||||||
import { dump } from "js-yaml";
|
|
||||||
import { html, css, LitElement, TemplateResult } from "lit";
|
|
||||||
import { customElement } from "lit/decorators";
|
|
||||||
import "../../../src/components/ha-card";
|
|
||||||
import { describeTrigger } from "../../../src/data/automation_i18n";
|
|
||||||
|
|
||||||
const triggers = [
|
|
||||||
{ platform: "state" },
|
|
||||||
{ platform: "mqtt" },
|
|
||||||
{ platform: "geo_location" },
|
|
||||||
{ platform: "homeassistant" },
|
|
||||||
{ platform: "numeric_state" },
|
|
||||||
{ platform: "sun" },
|
|
||||||
{ platform: "time_pattern" },
|
|
||||||
{ platform: "webhook" },
|
|
||||||
{ platform: "zone" },
|
|
||||||
{ platform: "tag" },
|
|
||||||
{ platform: "time" },
|
|
||||||
{ platform: "template" },
|
|
||||||
{ platform: "event" },
|
|
||||||
];
|
|
||||||
|
|
||||||
@customElement("demo-automation-describe-trigger")
|
|
||||||
export class DemoAutomationDescribeTrigger extends LitElement {
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`
|
|
||||||
<ha-card header="Triggers">
|
|
||||||
${triggers.map(
|
|
||||||
(conf) => html`
|
|
||||||
<div class="trigger">
|
|
||||||
<span>${describeTrigger(conf as any)}</span>
|
|
||||||
<pre>${dump(conf)}</pre>
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
)}
|
|
||||||
</ha-card>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get styles() {
|
|
||||||
return css`
|
|
||||||
ha-card {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: 24px auto;
|
|
||||||
}
|
|
||||||
.trigger {
|
|
||||||
padding: 16px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
span {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-automation-describe-trigger": DemoAutomationDescribeTrigger;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,81 +0,0 @@
|
|||||||
import { html, css, LitElement, TemplateResult } from "lit";
|
|
||||||
import { customElement, property } from "lit/decorators";
|
|
||||||
import "../../../src/components/ha-card";
|
|
||||||
import "../../../src/components/trace/hat-script-graph";
|
|
||||||
import "../../../src/components/trace/hat-trace-timeline";
|
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
|
||||||
import { HomeAssistant } from "../../../src/types";
|
|
||||||
import { mockDemoTrace } from "../data/traces/mock-demo-trace";
|
|
||||||
import { DemoTrace } from "../data/traces/types";
|
|
||||||
|
|
||||||
const traces: DemoTrace[] = [
|
|
||||||
mockDemoTrace({ state: "running" }),
|
|
||||||
mockDemoTrace({ state: "debugged" }),
|
|
||||||
mockDemoTrace({ state: "stopped", script_execution: "failed_conditions" }),
|
|
||||||
mockDemoTrace({ state: "stopped", script_execution: "failed_single" }),
|
|
||||||
mockDemoTrace({ state: "stopped", script_execution: "failed_max_runs" }),
|
|
||||||
mockDemoTrace({ state: "stopped", script_execution: "finished" }),
|
|
||||||
mockDemoTrace({ state: "stopped", script_execution: "aborted" }),
|
|
||||||
mockDemoTrace({
|
|
||||||
state: "stopped",
|
|
||||||
script_execution: "error",
|
|
||||||
error: 'Variable "beer" cannot be None',
|
|
||||||
}),
|
|
||||||
mockDemoTrace({ state: "stopped", script_execution: "cancelled" }),
|
|
||||||
];
|
|
||||||
|
|
||||||
@customElement("demo-automation-trace-timeline")
|
|
||||||
export class DemoAutomationTraceTimeline extends LitElement {
|
|
||||||
@property({ attribute: false }) hass?: HomeAssistant;
|
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
if (!this.hass) {
|
|
||||||
return html``;
|
|
||||||
}
|
|
||||||
return html`
|
|
||||||
${traces.map(
|
|
||||||
(trace) => html`
|
|
||||||
<ha-card .header=${trace.trace.config.alias}>
|
|
||||||
<div class="card-content">
|
|
||||||
<hat-trace-timeline
|
|
||||||
.hass=${this.hass}
|
|
||||||
.trace=${trace.trace}
|
|
||||||
.logbookEntries=${trace.logbookEntries}
|
|
||||||
></hat-trace-timeline>
|
|
||||||
<button @click=${() => console.log(trace)}>Log trace</button>
|
|
||||||
</div>
|
|
||||||
</ha-card>
|
|
||||||
`
|
|
||||||
)}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected firstUpdated(changedProps) {
|
|
||||||
super.firstUpdated(changedProps);
|
|
||||||
const hass = provideHass(this);
|
|
||||||
hass.updateTranslations(null, "en");
|
|
||||||
}
|
|
||||||
|
|
||||||
static get styles() {
|
|
||||||
return css`
|
|
||||||
ha-card {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: 24px;
|
|
||||||
}
|
|
||||||
.card-content {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
button {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-automation-trace-timeline": DemoAutomationTraceTimeline;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,91 +0,0 @@
|
|||||||
import { html, css, LitElement, TemplateResult } from "lit";
|
|
||||||
import "../../../src/components/ha-card";
|
|
||||||
import "../../../src/components/trace/hat-script-graph";
|
|
||||||
import "../../../src/components/trace/hat-trace-timeline";
|
|
||||||
import { customElement, property, state } from "lit/decorators";
|
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
|
||||||
import { HomeAssistant } from "../../../src/types";
|
|
||||||
import { DemoTrace } from "../data/traces/types";
|
|
||||||
import { basicTrace } from "../data/traces/basic_trace";
|
|
||||||
import { motionLightTrace } from "../data/traces/motion-light-trace";
|
|
||||||
|
|
||||||
const traces: DemoTrace[] = [basicTrace, motionLightTrace];
|
|
||||||
|
|
||||||
@customElement("demo-automation-trace")
|
|
||||||
export class DemoAutomationTrace extends LitElement {
|
|
||||||
@property({ attribute: false }) hass?: HomeAssistant;
|
|
||||||
|
|
||||||
@state() private _selected = {};
|
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
if (!this.hass) {
|
|
||||||
return html``;
|
|
||||||
}
|
|
||||||
return html`
|
|
||||||
${traces.map(
|
|
||||||
(trace, idx) => html`
|
|
||||||
<ha-card .header=${trace.trace.config.alias}>
|
|
||||||
<div class="card-content">
|
|
||||||
<hat-script-graph
|
|
||||||
.trace=${trace.trace}
|
|
||||||
.selected=${this._selected[idx]}
|
|
||||||
@graph-node-selected=${(ev) => {
|
|
||||||
this._selected = { ...this._selected, [idx]: ev.detail.path };
|
|
||||||
}}
|
|
||||||
></hat-script-graph>
|
|
||||||
<hat-trace-timeline
|
|
||||||
allowPick
|
|
||||||
.hass=${this.hass}
|
|
||||||
.trace=${trace.trace}
|
|
||||||
.logbookEntries=${trace.logbookEntries}
|
|
||||||
.selectedPath=${this._selected[idx]}
|
|
||||||
@value-changed=${(ev) => {
|
|
||||||
this._selected = {
|
|
||||||
...this._selected,
|
|
||||||
[idx]: ev.detail.value,
|
|
||||||
};
|
|
||||||
}}
|
|
||||||
></hat-trace-timeline>
|
|
||||||
<button @click=${() => console.log(trace)}>Log trace</button>
|
|
||||||
</div>
|
|
||||||
</ha-card>
|
|
||||||
`
|
|
||||||
)}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected firstUpdated(changedProps) {
|
|
||||||
super.firstUpdated(changedProps);
|
|
||||||
const hass = provideHass(this);
|
|
||||||
hass.updateTranslations(null, "en");
|
|
||||||
}
|
|
||||||
|
|
||||||
static get styles() {
|
|
||||||
return css`
|
|
||||||
ha-card {
|
|
||||||
max-width: 600px;
|
|
||||||
margin: 24px;
|
|
||||||
}
|
|
||||||
.card-content {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
.card-content > * {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
.card-content > *:last-child {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
button {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
declare global {
|
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-automation-trace": DemoAutomationTrace;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -70,25 +71,37 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-alarm-panel-card")
|
class DemoAlarmPanelEntity extends PolymerElement {
|
||||||
class DemoAlarmPanelEntity extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html`
|
||||||
|
<demo-cards
|
||||||
protected render(): TemplateResult {
|
id="demos"
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
hass="[[hass]]"
|
||||||
|
configs="[[_configs]]"
|
||||||
|
></demo-cards>
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
hass.updateTranslations(null, "en");
|
type: Object,
|
||||||
hass.updateTranslations("lovelace", "en");
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
hass: Object,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
this._setupDemo();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async _setupDemo() {
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
|
await hass.updateTranslations(null, "en");
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-alarm-panel-card", DemoAlarmPanelEntity);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-alarm-panel-card": DemoAlarmPanelEntity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -52,25 +53,33 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-conditional-card")
|
class DemoConditional extends PolymerElement {
|
||||||
class DemoConditional extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html`
|
||||||
|
<demo-cards
|
||||||
protected render(): TemplateResult {
|
id="demos"
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
hass="[[hass]]"
|
||||||
|
configs="[[_configs]]"
|
||||||
|
></demo-cards>
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
hass: Object,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-conditional-card", DemoConditional);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-conditional-card": DemoConditional;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -216,25 +217,26 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-entities-card")
|
class DemoEntities extends PolymerElement {
|
||||||
class DemoEntities extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-entities-card", DemoEntities);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-entities-card": DemoEntities;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -19,10 +20,10 @@ const CONFIGS = [
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "With Name (defined in card)",
|
heading: "With Name",
|
||||||
config: `
|
config: `
|
||||||
- type: button
|
- type: button
|
||||||
name: Custom Name
|
name: Bedroom
|
||||||
entity: light.bed_light
|
entity: light.bed_light
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
@@ -31,7 +32,7 @@ const CONFIGS = [
|
|||||||
config: `
|
config: `
|
||||||
- type: button
|
- type: button
|
||||||
entity: light.bed_light
|
entity: light.bed_light
|
||||||
icon: mdi:tools
|
icon: mdi:hotel
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -47,7 +48,7 @@ const CONFIGS = [
|
|||||||
config: `
|
config: `
|
||||||
- type: button
|
- type: button
|
||||||
entity: light.bed_light
|
entity: light.bed_light
|
||||||
tap_action:
|
tap_action:
|
||||||
action: toggle
|
action: toggle
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
@@ -68,25 +69,33 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-entity-button-card")
|
class DemoButtonEntity extends PolymerElement {
|
||||||
class DemoButtonEntity extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html`
|
||||||
|
<demo-cards
|
||||||
protected render(): TemplateResult {
|
id="demos"
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
hass="[[hass]]"
|
||||||
|
configs="[[_configs]]"
|
||||||
|
></demo-cards>
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
hass: Object,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-entity-button-card", DemoButtonEntity);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-entity-button-card": DemoButtonEntity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -42,7 +43,7 @@ const ENTITIES = [
|
|||||||
|
|
||||||
const CONFIGS = [
|
const CONFIGS = [
|
||||||
{
|
{
|
||||||
heading: "Unfiltered controller",
|
heading: "Controller",
|
||||||
config: `
|
config: `
|
||||||
- type: entities
|
- type: entities
|
||||||
entities:
|
entities:
|
||||||
@@ -52,7 +53,7 @@ const CONFIGS = [
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "Filtered entities card",
|
heading: "Basic",
|
||||||
config: `
|
config: `
|
||||||
- type: entity-filter
|
- type: entity-filter
|
||||||
entities:
|
entities:
|
||||||
@@ -68,27 +69,7 @@ const CONFIGS = [
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: 'With "entities" card config',
|
heading: "With card config",
|
||||||
config: `
|
|
||||||
- type: entity-filter
|
|
||||||
entities:
|
|
||||||
- device_tracker.demo_anne_therese
|
|
||||||
- device_tracker.demo_home_boy
|
|
||||||
- device_tracker.demo_paulus
|
|
||||||
- light.bed_light
|
|
||||||
- light.ceiling_lights
|
|
||||||
- light.kitchen_lights
|
|
||||||
state_filter:
|
|
||||||
- "on"
|
|
||||||
- not_home
|
|
||||||
card:
|
|
||||||
type: entities
|
|
||||||
title: Custom Title
|
|
||||||
show_header_toggle: false
|
|
||||||
`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
heading: 'With "glance" card config',
|
|
||||||
config: `
|
config: `
|
||||||
- type: entity-filter
|
- type: entity-filter
|
||||||
entities:
|
entities:
|
||||||
@@ -103,31 +84,31 @@ const CONFIGS = [
|
|||||||
- not_home
|
- not_home
|
||||||
card:
|
card:
|
||||||
type: glance
|
type: glance
|
||||||
show_state: true
|
show_state: false
|
||||||
title: Custom Title
|
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-entity-filter-card")
|
class DemoFilter extends PolymerElement {
|
||||||
class DemoEntityFilter extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-entity-filter-card", DemoFilter);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-entity-filter-card": DemoEntityFilter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -106,25 +107,26 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-gauge-card")
|
class DemoGaugeEntity extends PolymerElement {
|
||||||
class DemoGaugeEntity extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-gauge-card", DemoGaugeEntity);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-gauge-card": DemoGaugeEntity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -76,8 +77,7 @@ const CONFIGS = [
|
|||||||
heading: "With title",
|
heading: "With title",
|
||||||
config: `
|
config: `
|
||||||
- type: glance
|
- type: glance
|
||||||
title: Custom title
|
title: This is glance
|
||||||
columns: 4
|
|
||||||
entities:
|
entities:
|
||||||
- device_tracker.demo_paulus
|
- device_tracker.demo_paulus
|
||||||
- media_player.living_room
|
- media_player.living_room
|
||||||
@@ -104,10 +104,9 @@ const CONFIGS = [
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "No entity names",
|
heading: "No name",
|
||||||
config: `
|
config: `
|
||||||
- type: glance
|
- type: glance
|
||||||
columns: 4
|
|
||||||
show_name: false
|
show_name: false
|
||||||
entities:
|
entities:
|
||||||
- device_tracker.demo_paulus
|
- device_tracker.demo_paulus
|
||||||
@@ -120,10 +119,9 @@ const CONFIGS = [
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "No state labels",
|
heading: "No state",
|
||||||
config: `
|
config: `
|
||||||
- type: glance
|
- type: glance
|
||||||
columns: 4
|
|
||||||
show_state: false
|
show_state: false
|
||||||
entities:
|
entities:
|
||||||
- device_tracker.demo_paulus
|
- device_tracker.demo_paulus
|
||||||
@@ -136,10 +134,9 @@ const CONFIGS = [
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "No names and no state labels",
|
heading: "No name and no state",
|
||||||
config: `
|
config: `
|
||||||
- type: glance
|
- type: glance
|
||||||
columns: 4
|
|
||||||
show_name: false
|
show_name: false
|
||||||
show_state: false
|
show_state: false
|
||||||
entities:
|
entities:
|
||||||
@@ -153,24 +150,47 @@ const CONFIGS = [
|
|||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "Custom name + custom icon",
|
heading: "Custom name, custom icon",
|
||||||
config: `
|
config: `
|
||||||
- type: glance
|
- type: glance
|
||||||
columns: 4
|
|
||||||
entities:
|
entities:
|
||||||
- entity: device_tracker.demo_paulus
|
- entity: device_tracker.demo_paulus
|
||||||
name: ¯\\_(ツ)_/¯
|
name: ¯\\_(ツ)_/¯
|
||||||
icon: mdi:home-assistant
|
icon: mdi:home-assistant
|
||||||
- entity: media_player.living_room
|
- media_player.living_room
|
||||||
name: ¯\\_(ツ)_/¯
|
- sun.sun
|
||||||
icon: mdi:home-assistant
|
- cover.kitchen_window
|
||||||
|
- entity: light.kitchen_lights
|
||||||
|
icon: mdi:alarm-light
|
||||||
|
- lock.kitchen_door
|
||||||
|
- light.ceiling_lights
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: "Custom tap action",
|
||||||
|
config: `
|
||||||
|
- type: glance
|
||||||
|
entities:
|
||||||
|
- entity: lock.kitchen_door
|
||||||
|
tap_action:
|
||||||
|
type: toggle
|
||||||
|
- entity: light.ceiling_lights
|
||||||
|
tap_action:
|
||||||
|
action: call-service
|
||||||
|
service: light.turn_on
|
||||||
|
service_data:
|
||||||
|
entity_id: light.ceiling_lights
|
||||||
|
- device_tracker.demo_paulus
|
||||||
|
- media_player.living_room
|
||||||
|
- sun.sun
|
||||||
|
- cover.kitchen_window
|
||||||
|
- light.kitchen_lights
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "Selectively hidden name",
|
heading: "Selectively hidden name",
|
||||||
config: `
|
config: `
|
||||||
- type: glance
|
- type: glance
|
||||||
columns: 4
|
|
||||||
entities:
|
entities:
|
||||||
- device_tracker.demo_paulus
|
- device_tracker.demo_paulus
|
||||||
- entity: media_player.living_room
|
- entity: media_player.living_room
|
||||||
@@ -179,55 +199,45 @@ const CONFIGS = [
|
|||||||
- entity: cover.kitchen_window
|
- entity: cover.kitchen_window
|
||||||
name:
|
name:
|
||||||
- light.kitchen_lights
|
- light.kitchen_lights
|
||||||
- entity: lock.kitchen_door
|
|
||||||
name:
|
|
||||||
- light.ceiling_lights
|
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
heading: "Custom tap action",
|
heading: "Primary theme",
|
||||||
config: `
|
config: `
|
||||||
- type: glance
|
- type: glance
|
||||||
columns: 4
|
theming: primary
|
||||||
entities:
|
entities:
|
||||||
- entity: lock.kitchen_door
|
- device_tracker.demo_paulus
|
||||||
name: Custom
|
- media_player.living_room
|
||||||
tap_action:
|
- sun.sun
|
||||||
type: toggle
|
- cover.kitchen_window
|
||||||
- entity: light.ceiling_lights
|
- light.kitchen_lights
|
||||||
name: Custom
|
- lock.kitchen_door
|
||||||
tap_action:
|
- light.ceiling_lights
|
||||||
action: call-service
|
|
||||||
service: light.turn_on
|
|
||||||
service_data:
|
|
||||||
entity_id: light.ceiling_lights
|
|
||||||
- entity: sun.sun
|
|
||||||
name: Regular
|
|
||||||
- entity: light.kitchen_lights
|
|
||||||
name: Regular
|
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-glance-card")
|
class DemoPicEntity extends PolymerElement {
|
||||||
class DemoGlanceEntity extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-glance-card", DemoPicEntity);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-glance-card": DemoGlanceEntity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
|
|
||||||
const CONFIGS = [
|
const CONFIGS = [
|
||||||
@@ -36,15 +37,19 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-iframe-card")
|
class DemoIframe extends PolymerElement {
|
||||||
class DemoIframe extends LitElement {
|
static get template() {
|
||||||
protected render(): TemplateResult {
|
return html` <demo-cards configs="[[_configs]]"></demo-cards> `;
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
}
|
||||||
|
|
||||||
|
static get properties() {
|
||||||
|
return {
|
||||||
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-iframe-card", DemoIframe);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-iframe-card": DemoIframe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -62,25 +63,26 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-light-card")
|
class DemoLightEntity extends PolymerElement {
|
||||||
class DemoLightEntity extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-light-card", DemoLightEntity);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-light-card": DemoLightEntity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { getEntity } from "../../../src/fake_data/entity";
|
import { getEntity } from "../../../src/fake_data/entity";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -160,25 +161,33 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-map-card")
|
class DemoMap extends PolymerElement {
|
||||||
class DemoMap extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html`
|
||||||
|
<demo-cards
|
||||||
protected render(): TemplateResult {
|
id="demos"
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
hass="[[hass]]"
|
||||||
|
configs="[[_configs]]"
|
||||||
|
></demo-cards>
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
|
type: Object,
|
||||||
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
hass: Object,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
hass.updateTranslations(null, "en");
|
hass.updateTranslations(null, "en");
|
||||||
hass.updateTranslations("lovelace", "en");
|
|
||||||
hass.addEntities(ENTITIES);
|
hass.addEntities(ENTITIES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-map-card", DemoMap);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-map-card": DemoMap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||||
import { customElement, query } from "lit/decorators";
|
/* eslint-plugin-disable lit */
|
||||||
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
import { mockTemplate } from "../../../demo/src/stubs/template";
|
import { mockTemplate } from "../../../demo/src/stubs/template";
|
||||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||||
import "../components/demo-cards";
|
import "../components/demo-cards";
|
||||||
@@ -253,25 +254,25 @@ const CONFIGS = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@customElement("demo-hui-markdown-card")
|
class DemoMarkdown extends PolymerElement {
|
||||||
class DemoMarkdown extends LitElement {
|
static get template() {
|
||||||
@query("#demos") private _demoRoot!: HTMLElement;
|
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
|
||||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected firstUpdated(changedProperties: PropertyValues) {
|
static get properties() {
|
||||||
super.firstUpdated(changedProperties);
|
return {
|
||||||
const hass = provideHass(this._demoRoot);
|
_configs: {
|
||||||
hass.updateTranslations(null, "en");
|
type: Object,
|
||||||
hass.updateTranslations("lovelace", "en");
|
value: CONFIGS,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public ready() {
|
||||||
|
super.ready();
|
||||||
|
const hass = provideHass(this.$.demos);
|
||||||
mockTemplate(hass);
|
mockTemplate(hass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
customElements.define("demo-hui-markdown-card", DemoMarkdown);
|
||||||
interface HTMLElementTagNameMap {
|
|
||||||
"demo-hui-markdown-card": DemoMarkdown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user