This commit is contained in:
Martin Bauer 2022-08-28 22:33:35 +02:00
parent 91fc9c38ff
commit f261b582b0
44 changed files with 71746 additions and 59774 deletions

View File

@ -1 +1 @@
2021.9.6 2022.8.7

1
.gitignore vendored
View File

@ -15,3 +15,4 @@ node_modules
/custom_components/scheduler /custom_components/scheduler
/custom_components/pyscript /custom_components/pyscript
/themes /themes
/.storage/hacs/*.hacs

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,11 @@
{ {
"version": 1,
"minor_version": 1,
"key": "auth_module.totp",
"data": { "data": {
"users": { "users": {
"2ffcb10d3db745b396789364fdef72ec": "VSSLF24TFVBBITYM" "2ffcb10d3db745b396789364fdef72ec": "VSSLF24TFVBBITYM",
"bd0f10a32b324e85998881cb5b748d0f": "BUFHT7N5LWOYLARK2NPWFPTFN6FP6Z2D"
} }
}, }
"key": "auth_module.totp",
"version": 1
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,15 @@
{ {
"version": 1, "version": 1,
"key": "frontend.user_data_2ffcb10d3db745b396789364fdef72ec", "minor_version": 1,
"data": { "key": "frontend.user_data_2ffcb10d3db745b396789364fdef72ec",
"core": { "data": {
"showAdvanced": true "core": {
}, "showAdvanced": true
"language": { },
"language": "de", "language": {
"number_format": "language", "language": "de",
"time_format": "language" "number_format": "language",
} "time_format": "language"
} }
}
} }

View File

@ -1,5 +1,6 @@
{ {
"version": 1, "version": 1,
"minor_version": 1,
"key": "frontend.user_data_bd0f10a32b324e85998881cb5b748d0f", "key": "frontend.user_data_bd0f10a32b324e85998881cb5b748d0f",
"data": { "data": {
"core": { "core": {

View File

@ -1,9 +1,12 @@
{ {
"version": 1, "version": 1,
"minor_version": 1,
"key": "google_assistant", "key": "google_assistant",
"data": { "data": {
"agent_user_ids": { "agent_user_ids": {
"2ffcb10d3db745b396789364fdef72ec": {} "2ffcb10d3db745b396789364fdef72ec": {
"local_webhook_id": "7f9f90ea0609767552e3c86e6b4629b30ccf378e57084c5d3a3d461c909102f5"
}
} }
} }
} }

View File

@ -1,20 +1,67 @@
{ {
"version": "6", "version": "6",
"key": "hacs.hacs", "minor_version": 1,
"data": { "key": "hacs.hacs",
"view": "Grid", "data": {
"compact": false, "archived_repositories": [
"onboarding_done": false, "atomic7777/atomic_calendar",
"archived_repositories": [ "mampfes/hacs_wiffi",
"atomic7777/atomic_calendar", "PTST/O365-HomeAssistant",
"atomic7777/atomic_calendar", "pilotak/homeassistant-mikrotik",
"mampfes/hacs_wiffi", "estevez-dev/extended-banner-card",
"PTST/O365-HomeAssistant" "custom-components/custom_components",
], "custom-components/sensor.custom_components",
"renamed_repositories": { "Michsior14/ha-laser-egg",
"xMrVizzy/Minecraft-Version": "kraineff/minecraft-version", "custom-components/sensor.tautulli",
"xMrVizzy/Philips-AirPurifier": "kraineff/philips-airpurifier", "ppanagiotis/pymusiccast",
"scottyphillips/mitsubishi_hass": "scottyphillips/echonetlite_homeassistant" "Kraineff/philips-airpurifier",
} "jensweimann/awb",
} "briis/smartweather",
"KoljaWindeler/kaco",
"dr1rrb/ha-twinkly",
"heinoldenhuis/home_assistant_omnik_solar",
"DSorlov/hasl-platform",
"iantrich/aftership-card",
"nagyrobi/home-assistant-custom-components-pfsense-gateways",
"pippyn/Home-Assistant-Sensor-Groningen-Afvalwijzer",
"maykar/kiosk-mode",
"custom-cards/upcoming-media-card",
"maykar/lovelace-swipe-navigation",
"custom-components/sensor.plex_recently_added",
"custom-components/sensor.sonarr_upcoming_media",
"custom-components/sensor.radarr_upcoming_media",
"maykar/plex_assistant",
"custom-components/wienerlinien",
"GeorgeSG/lovelace-folder-card",
"KTibow/lovelace-dark-soft-ui-theme",
"KTibow/lovelace-light-soft-ui-theme",
"DCSBL/ha-homewizard-energy",
"eavanvalkenburg/sia",
"Cyr-ius/hass-hue-service-advanced",
"Cyr-ius/hass-cozytouch",
"georgezhao2010/climate_ewelink",
"custom-components/sensor.custom_aftership"
],
"renamed_repositories": {
"xMrVizzy/Minecraft-Version": "kraineff/minecraft-version",
"xMrVizzy/Philips-AirPurifier": "kraineff/philips-airpurifier",
"scottyphillips/mitsubishi_hass": "scottyphillips/echonetlite_homeassistant",
"idittansikte/bootstrap-grid-card": "ownbee/bootstrap-grid-card",
"marksie1988/atomic-calendar-revive": "totaldebug/atomic-calendar-revive",
"PepegaBruh/CryptoTracker": "BigNocciolino/CryptoTracker",
"custom-components/blueprint": "custom-components/integration_blueprint",
"9a4gl/hass-peltec": "9a4gl/hass-centrometal-boiler",
"78wesley/Darkish-Theme": "78wesley/Home-Assistant-Darkish-Theme",
"KartoffelToby/ai_thermostat": "KartoffelToby/better_thermostat",
"nbogojevic/homeassistant-midea-dehumidifier-lan": "nbogojevic/homeassistant-midea-air-appliances-lan",
"nikrolls/homeassistant-goldair-climate": "nicole-ashley/homeassistant-goldair-climate",
"ulic75/power-distribution-card": "ulic75/power-flow-card",
"wills106/homsassistant-solax-modbus": "wills106/homeassistant-solax-modbus",
"dmitry-k/yandex_smart_home": "dext0r/yandex_smart_home",
"uvjustin/alarmdotcom": "pyalarmdotcom/alarmdotcom",
"wernerhp/ha_integration_load_shedding": "wernerhp/ha.integration.load_shedding",
"TheLastProject/lovelace-valetudo-map-card": "Hypfer/lovelace-valetudo-map-card"
},
"ignored_repositories": []
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
{ {
"version": "6", "version": "6",
"minor_version": 1,
"key": "hacs/144899700.hacs", "key": "hacs/144899700.hacs",
"data": { "data": {
"archived": false, "archived": false,
@ -13,9 +14,9 @@
"domain": "", "domain": "",
"domains": [], "domains": [],
"downloads": 0, "downloads": 0,
"etag_repository": "W/\"342e0bde964bee684ad6a005abf2196c8b89b3c55ce9d6059659c29d33f84571\"", "etag_repository": "W/\"dcee04e155a6f214619452084692a69a604122200203c448889608db87867fa8\"",
"file_name": "slider-entity-row.js", "file_name": "slider-entity-row.js",
"filename": "", "filename": null,
"first_install": false, "first_install": false,
"fork": false, "fork": false,
"full_name": "thomasloven/lovelace-slider-entity-row", "full_name": "thomasloven/lovelace-slider-entity-row",
@ -26,28 +27,28 @@
"id": "144899700", "id": "144899700",
"iot_class": null, "iot_class": null,
"installed": true, "installed": true,
"installed_commit": "99126b3", "installed_commit": "3587bef",
"installed_version": "17.1.0", "installed_version": "17.2.1",
"open_issues": 26, "open_issues": 27,
"last_commit": "c227e5a", "last_commit": "c84a0ad",
"last_version": "17.1.0", "last_version": "17.2.1",
"last_updated": "2021-08-13T00:34:38Z", "last_updated": "2022-08-13T19:01:37Z",
"manifest_name": null, "manifest_name": null,
"new": false, "new": false,
"persistent_directory": null, "persistent_directory": null,
"pushed_at": "2021-08-13T00:34:38", "pushed_at": "2022-08-13T19:01:37",
"releases": true, "releases": true,
"render_readme": true, "render_readme": true,
"published_tags": [ "published_tags": [
"17.2.1",
"17.2.0",
"17.1.0", "17.1.0",
"17.0.1", "17.0.1",
"17.0.0", "17.0.0"
"16",
"15"
], ],
"selected_tag": null, "selected_tag": null,
"show_beta": false, "show_beta": false,
"stargazers_count": 501, "stargazers_count": 648,
"topics": [], "topics": [],
"zip_release": false "zip_release": false
} }

View File

@ -1,64 +1,65 @@
{ {
"version": "6", "version": "6",
"key": "hacs/172733314.hacs", "minor_version": 1,
"data": { "key": "hacs/172733314.hacs",
"archived": false, "data": {
"authors": [ "archived": false,
"@ludeeus" "authors": [
], "@ludeeus"
"category": "integration", ],
"content_in_root": false, "category": "integration",
"country": [], "content_in_root": false,
"config_flow": true, "country": [],
"default_branch": "main", "config_flow": true,
"description": "HACS gives you a powerful UI to handle downloads of all your custom needs.", "default_branch": "main",
"domain": "hacs", "description": "HACS gives you a powerful UI to handle downloads of all your custom needs.",
"domains": [], "domain": "hacs",
"downloads": 34817, "domains": [],
"etag_repository": "W/\"379595670a046ed8414f2a3a3fcf1547bfbac2dc64d78ead9f24630c16cb80ee\"", "downloads": 7257,
"file_name": "", "etag_repository": "W/\"711c9f5308bfaed56466dbb84dc11ce170e3abaf8bed0ee5cb0b4c189afc1f1c\"",
"filename": "hacs.zip", "file_name": "",
"first_install": false, "filename": "hacs.zip",
"fork": false, "first_install": false,
"full_name": "hacs/integration", "fork": false,
"hacs": "0.19.0", "full_name": "hacs/integration",
"hide": false, "hacs": "0.19.0",
"hide_default_branch": true, "hide": false,
"homeassistant": "2021.2.0", "hide_default_branch": true,
"id": "172733314", "homeassistant": "2022.8.0",
"iot_class": null, "id": "172733314",
"installed": true, "iot_class": null,
"installed_commit": "b4ae25f", "installed": true,
"installed_version": "1.15.2", "installed_commit": "8fa59ee",
"open_issues": 6, "installed_version": "1.27.0",
"last_commit": "b4ae25f", "open_issues": 0,
"last_version": "1.15.2", "last_commit": "8fa59ee",
"last_updated": "2021-09-19T01:33:31Z", "last_version": "1.27.1",
"manifest_name": "HACS", "last_updated": "2022-08-28T08:21:31Z",
"new": false, "manifest_name": "HACS",
"persistent_directory": null, "new": false,
"pushed_at": "2021-09-19T01:33:31", "persistent_directory": null,
"releases": true, "pushed_at": "2022-08-28T08:21:31",
"render_readme": false, "releases": true,
"published_tags": [ "render_readme": false,
"1.15.2", "published_tags": [
"1.15.1", "1.27.1",
"1.15.0", "1.27.0",
"1.14.1", "1.26.2",
"1.14.0" "1.26.1",
], "1.26.0"
"selected_tag": null, ],
"show_beta": false, "selected_tag": "1.27.0",
"stargazers_count": 1913, "show_beta": false,
"topics": [ "stargazers_count": 2860,
"community", "topics": [
"hacktoberfest", "community",
"hacs", "hacktoberfest",
"home-assistant", "hacs",
"integration", "home-assistant",
"package-manager", "integration",
"python" "package-manager",
], "python"
"zip_release": true ],
} "zip_release": true
}
} }

View File

@ -1,61 +1,63 @@
{ {
"version": "6", "version": "6",
"key": "hacs/215327195.hacs", "minor_version": 1,
"data": { "key": "hacs/215327195.hacs",
"archived": false, "data": {
"authors": [], "archived": false,
"category": "plugin", "authors": [],
"content_in_root": true, "category": "plugin",
"country": [], "content_in_root": true,
"config_flow": false, "country": [],
"default_branch": "master", "config_flow": false,
"description": "\ud83d\udca1 A Lovelace custom card for RGB lights", "default_branch": "master",
"domain": "", "description": "💡 A Lovelace custom card for RGB lights",
"domains": [ "domain": "",
"light" "domains": [
], "light"
"downloads": 11082, ],
"etag_repository": "W/\"f9d6a68e2ff6e1221e937b06ad04632a8722eeb6d8f68274fb25e991e617131d\"", "downloads": 12380,
"file_name": "card.js", "etag_repository": "W/\"b5f74cfb36458239d165665039ad8868468ef47299c90d6095e79f2e48ecc5e2\"",
"filename": "card.js", "file_name": "card.js",
"first_install": false, "filename": "card.js",
"fork": false, "first_install": false,
"full_name": "bokub/rgb-light-card", "fork": false,
"hacs": null, "full_name": "bokub/rgb-light-card",
"hide": false, "hacs": null,
"hide_default_branch": false, "hide": false,
"homeassistant": null, "hide_default_branch": false,
"id": "215327195", "homeassistant": null,
"iot_class": null, "id": "215327195",
"installed": true, "iot_class": null,
"installed_commit": "8390d2e", "installed": true,
"installed_version": "1.9.0", "installed_commit": "abb7c78",
"open_issues": 7, "installed_version": "1.11.0",
"last_commit": "8390d2e", "open_issues": 6,
"last_version": "1.9.0", "last_commit": "abb7c78",
"last_updated": "2021-07-07T08:49:28Z", "last_version": "1.11.0",
"manifest_name": null, "last_updated": "2022-07-02T09:17:13Z",
"new": false, "manifest_name": null,
"persistent_directory": null, "new": false,
"pushed_at": "2021-07-07T08:49:28", "persistent_directory": null,
"releases": true, "pushed_at": "2022-07-02T09:17:13",
"render_readme": true, "releases": true,
"published_tags": [ "render_readme": true,
"1.9.0", "published_tags": [
"1.8.0", "1.11.0",
"1.7.1", "1.10.0",
"1.6.0", "1.9.0",
"1.5.0" "1.8.0",
], "1.7.1"
"selected_tag": null, ],
"show_beta": false, "selected_tag": null,
"stargazers_count": 228, "show_beta": false,
"topics": [ "stargazers_count": 311,
"home-assistant", "topics": [
"lovelace", "hacktoberfest",
"lovelace-custom-card", "home-assistant",
"rgb-lights" "lovelace",
], "lovelace-custom-card",
"zip_release": false "rgb-lights"
} ],
"zip_release": false
}
} }

View File

@ -1,5 +1,6 @@
{ {
"version": "6", "version": "6",
"minor_version": 1,
"key": "hacs/222422187.hacs", "key": "hacs/222422187.hacs",
"data": { "data": {
"archived": false, "archived": false,
@ -13,9 +14,9 @@
"domain": "", "domain": "",
"domains": [], "domains": [],
"downloads": 0, "downloads": 0,
"etag_repository": "W/\"16ee27999cb17285ad3ea04a235626d26d0f218fe81f5cce0d9e6218eaff6ece\"", "etag_repository": "W/\"cecf357175700b3cc1db9c4389607d4d10ef7369436b93d42529460c5e1dd05c\"",
"file_name": "ios-dark-mode.yaml", "file_name": "ios-dark-mode.yaml",
"filename": "", "filename": null,
"first_install": false, "first_install": false,
"fork": false, "fork": false,
"full_name": "basnijholt/lovelace-ios-dark-mode-theme", "full_name": "basnijholt/lovelace-ios-dark-mode-theme",
@ -26,22 +27,22 @@
"id": "222422187", "id": "222422187",
"iot_class": null, "iot_class": null,
"installed": true, "installed": true,
"installed_commit": "555c937", "installed_commit": "9c012f7",
"installed_version": null, "installed_version": null,
"open_issues": 22, "open_issues": 29,
"last_commit": "555c937", "last_commit": "9c012f7",
"last_version": null, "last_version": null,
"last_updated": "2021-07-06T10:58:37Z", "last_updated": "2022-05-27T18:41:09Z",
"manifest_name": null, "manifest_name": null,
"new": false, "new": false,
"persistent_directory": null, "persistent_directory": null,
"pushed_at": "2021-07-06T10:58:37", "pushed_at": "2022-05-27T18:41:09",
"releases": false, "releases": false,
"render_readme": true, "render_readme": true,
"published_tags": [], "published_tags": [],
"selected_tag": null, "selected_tag": null,
"show_beta": false, "show_beta": false,
"stargazers_count": 324, "stargazers_count": 375,
"topics": [ "topics": [
"dark-mode", "dark-mode",
"darkmode", "darkmode",

View File

@ -1,5 +1,6 @@
{ {
"version": "6", "version": "6",
"minor_version": 1,
"key": "hacs/231674882.hacs", "key": "hacs/231674882.hacs",
"data": { "data": {
"archived": false, "archived": false,
@ -13,9 +14,9 @@
"domain": "", "domain": "",
"domains": [], "domains": [],
"downloads": 0, "downloads": 0,
"etag_repository": "W/\"88f3462e324504ca32d5316d7b4ad0db14bf7c5cab7fd03b4eb1af815efd0015\"", "etag_repository": "W/\"d9e5ddb563c27cbe6f0cc04e78ed92c7517cd7e1f3c872746eb5bfad4fa3ef87\"",
"file_name": "template-entity-row.js", "file_name": "template-entity-row.js",
"filename": "", "filename": null,
"first_install": false, "first_install": false,
"fork": false, "fork": false,
"full_name": "thomasloven/lovelace-template-entity-row", "full_name": "thomasloven/lovelace-template-entity-row",
@ -28,14 +29,14 @@
"installed": true, "installed": true,
"installed_commit": "3c7d493", "installed_commit": "3c7d493",
"installed_version": "1.3.0", "installed_version": "1.3.0",
"open_issues": 4, "open_issues": 14,
"last_commit": "3c7d493", "last_commit": "e3da7ba",
"last_version": "1.3.0", "last_version": "1.3.0",
"last_updated": "2021-06-26T18:46:48Z", "last_updated": "2022-08-24T08:27:00Z",
"manifest_name": null, "manifest_name": null,
"new": false, "new": false,
"persistent_directory": null, "persistent_directory": null,
"pushed_at": "2021-06-26T18:46:48", "pushed_at": "2022-08-24T08:27:00",
"releases": true, "releases": true,
"render_readme": true, "render_readme": true,
"published_tags": [ "published_tags": [
@ -47,7 +48,7 @@
], ],
"selected_tag": null, "selected_tag": null,
"show_beta": false, "show_beta": false,
"stargazers_count": 76, "stargazers_count": 118,
"topics": [], "topics": [],
"zip_release": false "zip_release": false
} }

View File

@ -1,5 +1,6 @@
{ {
"version": "6", "version": "6",
"minor_version": 1,
"key": "hacs/286186485.hacs", "key": "hacs/286186485.hacs",
"data": { "data": {
"archived": false, "archived": false,
@ -13,13 +14,11 @@
"default_branch": "main", "default_branch": "main",
"description": "Custom component for HA that enables the creation of scheduler entities", "description": "Custom component for HA that enables the creation of scheduler entities",
"domain": "scheduler", "domain": "scheduler",
"domains": [ "domains": [],
"switch" "downloads": 173,
], "etag_repository": "W/\"64b7c6bf6cebec946299473fb7ec1abfcdf1d3d69a65cc0dbfea133ed5b06360\"",
"downloads": 10,
"etag_repository": "W/\"b86deefce5d113affb12546b777cfc592f6cf10fc7c270a435310f1538cae127\"",
"file_name": "", "file_name": "",
"filename": "", "filename": null,
"first_install": false, "first_install": false,
"fork": false, "fork": false,
"full_name": "nielsfaber/scheduler-component", "full_name": "nielsfaber/scheduler-component",
@ -28,32 +27,30 @@
"hide_default_branch": false, "hide_default_branch": false,
"homeassistant": null, "homeassistant": null,
"id": "286186485", "id": "286186485",
"iot_class": [ "iot_class": null,
"Local Push"
],
"installed": true, "installed": true,
"installed_commit": "731233c", "installed_commit": "b683d53",
"installed_version": "v3.2.1", "installed_version": "v3.2.10",
"open_issues": 8, "open_issues": 5,
"last_commit": "731233c", "last_commit": "b683d53",
"last_version": "v3.2.1", "last_version": "v3.2.10",
"last_updated": "2021-09-12T06:58:44Z", "last_updated": "2022-06-02T06:36:20Z",
"manifest_name": "Scheduler integration", "manifest_name": "Scheduler integration",
"new": false, "new": false,
"persistent_directory": null, "persistent_directory": null,
"pushed_at": "2021-09-12T06:58:44", "pushed_at": "2022-06-02T06:36:20",
"releases": true, "releases": true,
"render_readme": "true", "render_readme": true,
"published_tags": [ "published_tags": [
"v3.2.1", "v3.2.10",
"v3.2.0", "v3.2.9",
"v3.1.3", "v3.2.8",
"v.3.1.2", "v3.2.7",
"v3.1.1" "v3.2.6"
], ],
"selected_tag": null, "selected_tag": null,
"show_beta": false, "show_beta": false,
"stargazers_count": 153, "stargazers_count": 292,
"topics": [ "topics": [
"custom-component", "custom-component",
"hacs", "hacs",

View File

@ -1,69 +1,70 @@
{ {
"version": "6", "version": "6",
"key": "hacs/286270157.hacs", "minor_version": 1,
"data": { "key": "hacs/286270157.hacs",
"archived": false, "data": {
"authors": [], "archived": false,
"category": "plugin", "authors": [],
"content_in_root": false, "category": "plugin",
"country": [], "content_in_root": false,
"config_flow": false, "country": [],
"default_branch": "main", "config_flow": false,
"description": "HA Lovelace card for control of scheduler entities", "default_branch": "main",
"domain": "", "description": "HA Lovelace card for control of scheduler entities",
"domains": [], "domain": "",
"downloads": 3085, "domains": [],
"etag_repository": "W/\"2b51dcc9829014317e51aeae737ee5a6c89128a85a366d4a868728ad635c1c43\"", "downloads": 4124,
"file_name": "scheduler-card.js", "etag_repository": "W/\"ae9399bf823de6e5d633fc8e5c539f19b44ee94baa4d2c29a92686279538b91a\"",
"filename": "", "file_name": "scheduler-card.js",
"first_install": false, "filename": "scheduler-card.js",
"fork": false, "first_install": false,
"full_name": "nielsfaber/scheduler-card", "fork": false,
"hacs": null, "full_name": "nielsfaber/scheduler-card",
"hide": false, "hacs": null,
"hide_default_branch": false, "hide": false,
"homeassistant": null, "hide_default_branch": false,
"id": "286270157", "homeassistant": null,
"iot_class": null, "id": "286270157",
"installed": true, "iot_class": null,
"installed_commit": "951cf22", "installed": true,
"installed_version": "v2.2.0", "installed_commit": "5b7d19b",
"open_issues": 10, "installed_version": "v2.3.6",
"last_commit": "951cf22", "open_issues": 9,
"last_version": "v2.2.0", "last_commit": "5b7d19b",
"last_updated": "2021-09-10T07:18:06Z", "last_version": "v2.3.6",
"manifest_name": null, "last_updated": "2022-08-23T19:00:00Z",
"new": false, "manifest_name": null,
"persistent_directory": null, "new": false,
"pushed_at": "2021-09-10T07:18:06", "persistent_directory": null,
"releases": true, "pushed_at": "2022-08-23T19:00:00",
"render_readme": "true", "releases": true,
"published_tags": [ "render_readme": true,
"v2.2.0", "published_tags": [
"v2.1.4", "v2.3.6",
"v2.1.3", "v2.3.5",
"v2.1.2", "v2.3.4",
"v2.1.1" "v2.3.3",
], "v2.3.2"
"selected_tag": null, ],
"show_beta": false, "selected_tag": null,
"stargazers_count": 246, "show_beta": false,
"topics": [ "stargazers_count": 440,
"assistant", "topics": [
"automation", "assistant",
"card", "automation",
"custom-card", "card",
"home", "custom-card",
"home-assistant", "home",
"homeassistant", "home-assistant",
"lovelace", "homeassistant",
"schedule", "lovelace",
"scheduler", "schedule",
"sunrise", "scheduler",
"sunset", "sunrise",
"week", "sunset",
"weekly" "week",
], "weekly"
"zip_release": false ],
} "zip_release": false
}
} }

View File

@ -1,5 +1,6 @@
{ {
"version": 1, "version": 1,
"minor_version": 1,
"key": "homekit.e1101f79ce9b41a28359a95f85e57b63.aids", "key": "homekit.e1101f79ce9b41a28359a95f85e57b63.aids",
"data": { "data": {
"allocations": { "allocations": {
@ -89,7 +90,26 @@
"script.bedroom_waves": 3287422185, "script.bedroom_waves": 3287422185,
"script.bedroom_rain": 2176118223, "script.bedroom_rain": 2176118223,
"script.bedroom_sleep_music_long": 2167838011, "script.bedroom_sleep_music_long": 2167838011,
"script.bedroom_sleep_music_short": 2422372189 "script.bedroom_sleep_music_short": 2422372189,
"hue.light.3ae16067-778e-47d9-86c5-d75d28b7f01b": 1762055787,
"hue.light.d6c3f683-2a24-4fc4-8055-eec68b3bb2f5": 4252871793,
"hue.light.22ffd26f-a76f-4c88-b2d8-2220ef7f8537": 1463708737,
"hue.light.a07ffc61-1d40-406b-b699-eb25c70d9cc4": 2276656891,
"hue.light.2e84b76c-748f-4375-82ab-05e15f4b7223": 2014439809,
"hue.light.58c1bf6f-844e-4690-a21e-f543ae544478": 363823799,
"hue.light.652b0901-18b3-4172-9c06-ca11a9cde172": 1710044888,
"hue.light.0aa6b6e3-7835-44bd-b1fe-06e7d38357bd": 3764471800,
"hue.light.8780e8b9-f420-4679-b434-3a3a02a32d17": 2802754275,
"hue.light.06259ccb-4b42-4f43-b33f-73b6fa5088c8": 3008706353,
"hue.light.56174d32-5767-458d-b3bf-f18fee04e33b": 3899854062,
"hue.light.c720f6e9-2444-4b36-be7a-b08cc4eed965": 1758205815,
"hue.light.de928995-bdc2-40d3-94a4-8aaee26a730f": 1173734377,
"hue.light.0d5d67e0-1f5b-4fe6-aae7-ac6f1f37fcaf": 2788850002,
"hue.light.78da0de5-c611-4b7e-8dc1-5d66347bed9b": 2202441427,
"hue.light.91b4abd8-c147-4b27-86ae-de083b6e860b": 2105360777,
"hue.light.d00eeb4b-0aa8-494f-aa64-1f84faa38213": 4065476362,
"hue.light.67247d33-bc41-4308-b2bb-144abd298001": 700545104,
"hue.light.515b9513-f060-4955-9dad-3e41e16f89ca": 2146599903
} }
} }
} }

View File

@ -1 +1 @@
{"mac": "2C:5F:45:B9:36:2A", "config_version": 61, "paired_clients": {"6ae4feba-9725-4653-8a32-bfae21591972": "4463182fbace66328d3e534cf78b6f81ccfd0e4250bdb1d954418e3eed738269"}, "client_properties": {"6ae4feba-9725-4653-8a32-bfae21591972": {"permissions": 1}}, "accessories_hash": "bed3649f89379771e280dffafd0465eb2a44ac1e67d939a65d8a9b95205f1806c1deb6b19d199ef517803acc4016f778bec3362e2db196b98c3a9957448cbf7d", "private_key": "03d847a9e20598ee99c5b47cfc64c07ce83c7aebc6720e26e83fdd4c359e33c7", "public_key": "f4de2e4b9a98f38d27af5914310f92b861f6cdbc02e22945554c07bbc3868f70"} {"mac": "2C:5F:45:B9:36:2A", "config_version": 105, "paired_clients": {"6ae4feba-9725-4653-8a32-bfae21591972": "4463182fbace66328d3e534cf78b6f81ccfd0e4250bdb1d954418e3eed738269"}, "client_properties": {"6ae4feba-9725-4653-8a32-bfae21591972": {"permissions": 1}}, "accessories_hash": "3e51708bb39e78df9fc35a4d21ddd3074f65e8177782f44c74d9ddd16534a62372e388e17e23897dc6af9b39286e8742d6704ddd2d6a89e3623f7a083fa79749", "private_key": "03d847a9e20598ee99c5b47cfc64c07ce83c7aebc6720e26e83fdd4c359e33c7", "public_key": "f4de2e4b9a98f38d27af5914310f92b861f6cdbc02e22945554c07bbc3868f70"}

View File

@ -1,17 +1,18 @@
{ {
"version": 1, "version": 1,
"key": "http", "minor_version": 1,
"data": { "key": "http",
"use_x_forwarded_for": true, "data": {
"trusted_proxies": [ "use_x_forwarded_for": true,
"192.168.178.80" "trusted_proxies": [
], "192.168.178.80"
"ssl_profile": "modern", ],
"server_port": 8123, "ip_ban_enabled": true,
"login_attempts_threshold": -1, "cors_allowed_origins": [
"ip_ban_enabled": true, "https://cast.home-assistant.io"
"cors_allowed_origins": [ ],
"https://cast.home-assistant.io" "login_attempts_threshold": -1,
] "ssl_profile": "modern",
} "server_port": 8123
}
} }

View File

@ -16,62 +16,6 @@
"icon": "mdi:home", "icon": "mdi:home",
"badges": [], "badges": [],
"cards": [ "cards": [
{
"type": "conditional",
"conditions": [
{
"entity": "cover.kinderzimmer_rollo",
"state_not": "open"
}
],
"card": {
"type": "vertical-stack",
"cards": [
{
"type": "entities",
"entities": [
{
"entity": "switch.tasmota07",
"name": "F\u00f6n",
"icon": "mdi:hair-dryer"
},
{
"entity": "timer.fon_timer",
"name": "Timer",
"icon": "mdi:timer"
},
{
"type": "button",
"name": "Aus in 10 min",
"action_name": "Los",
"tap_action": {
"action": "call-service",
"service": "timer.start",
"service_data": {
"entity_id": "timer.fon_timer",
"duration": "00:10:00"
}
}
},
{
"type": "button",
"name": "Aus in 15 min",
"action_name": "Los",
"tap_action": {
"action": "call-service",
"service": "timer.start",
"service_data": {
"entity_id": "timer.fon_timer",
"duration": "00:15:00"
}
}
}
],
"title": "F\u00f6n"
}
]
}
},
{ {
"type": "entities", "type": "entities",
"entities": [ "entities": [

View File

@ -91,6 +91,10 @@
{ {
"entity": "light.gang_bogen", "entity": "light.gang_bogen",
"name": "Gang Bogen" "name": "Gang Bogen"
},
{
"entity": "automation.gang_bogen_nachtlicht",
"name": "Autom. Bogenlicht"
} }
], ],
"show_header_toggle": false, "show_header_toggle": false,
@ -562,6 +566,11 @@
"entity": "light.kinderzimmer_deckenlampe", "entity": "light.kinderzimmer_deckenlampe",
"name": "Deckenlampe" "name": "Deckenlampe"
}, },
{
"entity": "light.music_mouse_regal_licht",
"name": "Regal",
"icon": "hue:bulb-group-lightstrip"
},
{ {
"entity": "light.kinderzimmer_fluter", "entity": "light.kinderzimmer_fluter",
"name": "Fluter", "name": "Fluter",
@ -572,16 +581,6 @@
"name": "Rollo Klein", "name": "Rollo Klein",
"type": "custom:state-card-custom-cover" "type": "custom:state-card-custom-cover"
}, },
{
"entity": "switch.tasmota06",
"name": "Kamera Schlafzimmer",
"icon": "mdi:video"
},
{
"entity": "switch.tasmota07",
"name": "F\u00f6n Schlafzimmer",
"icon": "mdi:hair-dryer"
},
{ {
"entity": "cover.kinderzimmer_rollo", "entity": "cover.kinderzimmer_rollo",
"name": "Rollo" "name": "Rollo"
@ -644,82 +643,6 @@
"icon": "mdi:tree", "icon": "mdi:tree",
"badges": [], "badges": [],
"cards": [ "cards": [
{
"type": "vertical-stack",
"title": "Pool",
"cards": [
{
"type": "horizontal-stack",
"cards": [
{
"type": "button",
"name": "Pumpe",
"icon": "mdi:pump",
"entity": "switch.poolpumpesteckdose",
"show_state": true
},
{
"type": "gauge",
"entity": "sensor.pool_temperature",
"min": 10,
"name": "Temperatur",
"max": 30,
"severity": {
"green": 18,
"yellow": 20,
"red": 24
}
},
{
"type": "gauge",
"entity": "sensor.pool_ph",
"min": 6,
"name": "pH (7.0-7.4)",
"max": 9,
"severity": {
"green": 6.9,
"yellow": 7.4,
"red": 8
}
},
{
"type": "gauge",
"entity": "sensor.pool_oxydo_reduction_potential",
"min": 400,
"name": "Redox (650-750)",
"max": 650,
"severity": {
"green": 650,
"yellow": 500,
"red": 400
}
}
]
},
{
"type": "entities",
"entities": [
{
"entity": "sensor.pool_pumpe_heute"
},
{
"entity": "sensor.pool_pumpe_gestern"
},
{
"type": "divider"
},
{
"entity": "sensor.pool_tds",
"name": "Partikel (TDS)"
},
{
"entity": "sensor.pool_rssi",
"name": "Empfang Boje"
}
]
}
]
},
{ {
"type": "entities", "type": "entities",
"entities": [ "entities": [
@ -762,29 +685,41 @@
"state_color": true "state_color": true
}, },
{ {
"type": "custom:mini-graph-card", "type": "entities",
"hours_to_show": 96,
"line_color": "#FF8552",
"height": 250,
"smoothing": true,
"lower_bound": 7,
"upper_bound": 8.5,
"lower_bound_secondary": 500,
"upper_bound_secondary": 750,
"show": {
"labels": true
},
"entities": [ "entities": [
{ {
"entity": "sensor.pool_ph", "entity": "switch.tasmota01",
"name": "pH" "name": "Balkon",
"icon": "mdi:balcony"
}, },
{ {
"entity": "sensor.pool_oxydo_reduction_potential", "entity": "switch.tasmota02",
"y_axis": "secondary", "name": "Eingang",
"name": "ORP" "icon": "mdi:window-closed-variant"
},
{
"entity": "switch.tasmota04",
"name": "Esszimmer",
"icon": "mdi:window-closed-variant"
},
{
"entity": "switch.tasmota05",
"name": "Wohnzimmer",
"icon": "mdi:string-lights"
},
{
"entity": "switch.tasmota06",
"name": "Arbeitszimmer",
"icon": "mdi:star-four-points"
},
{
"entity": "switch.tasmota07",
"name": "Treppe",
"icon": "mdi:stairs"
} }
] ],
"title": "Weihnachten",
"show_header_toggle": false
} }
] ]
} }

View File

@ -1,5 +1,6 @@
{ {
"version": 1, "version": 1,
"minor_version": 1,
"key": "lovelace.05_detail", "key": "lovelace.05_detail",
"data": { "data": {
"config": { "config": {
@ -47,30 +48,13 @@
{ {
"entities": [ "entities": [
{ {
"entity": "binary_sensor.rauchmelder_gang_oben_sensor", "entity": "binary_sensor.rauchmelder_schlafzimmer_smoke_alarm_smoke_detected"
"name": "Gang Erster Stock",
"secondary_info": "last-changed"
}, },
{ {
"entity": "binary_sensor.rauchmelder_gang_sensor", "entity": "binary_sensor.rauchmelder_unten_gang_smoke_alarm_smoke_detected"
"name": "Gang unten",
"secondary_info": "last-changed"
}, },
{ {
"entity": "binary_sensor.rauchmelder_schlafzimmer_sensor", "entity": "binary_sensor.smoke_detector_and_siren_smoke_alarm_smoke_detected"
"name": "Schlafzimmer unten",
"secondary_info": "last-changed"
},
{
"entity": "binary_sensor.rauchmelder_wohnzimmer_sensor",
"name": "Wohnzimmer unten",
"secondary_info": "last-changed"
},
{
"type": "divider"
},
{
"entity": "binary_sensor.rauchmelder_heizraum_siren_sensor"
} }
], ],
"show_header_toggle": false, "show_header_toggle": false,
@ -134,6 +118,20 @@
"icon": "mdi:bell", "icon": "mdi:bell",
"title": "Klingel", "title": "Klingel",
"type": "entities" "type": "entities"
},
{
"type": "custom:valetudo-map-card",
"entity": "camera.map_data",
"title": "Staubsauger",
"vacuum_entity": "vacuum.vacuum",
"rotate": 0,
"crop": {
"top": 0,
"bottom": 0,
"left": 80,
"right": 0
},
"min_height": 0
} }
] ]
}, },
@ -660,7 +658,7 @@
"type": "entities", "type": "entities",
"entities": [ "entities": [
{ {
"entity": "sensor.prusaprinter_current_state", "entity": "sensor.octoprint_current_state",
"name": "Status", "name": "Status",
"secondary_info": "last-changed" "secondary_info": "last-changed"
}, },
@ -668,17 +666,17 @@
"type": "custom:template-entity-row", "type": "custom:template-entity-row",
"icon": "mdi:clock", "icon": "mdi:clock",
"name": "Fertig in", "name": "Fertig in",
"state": "{{ states('sensor.prusaprinter_time_remaining') | int // 3600}}h {{ states('sensor.prusaprinter_time_remaining') | int // 60 % 60}}min", "state": "{{ states('sensor.octoprint_time_remaining') | int // 3600}}h {{ states('sensor.octoprint_time_remaining') | int // 60 % 60}}min",
"secondary": "Druckt seit {{ states('sensor.prusaprinter_time_elapsed') | int // 3600}}h {{ states('sensor.prusaprinter_time_elapsed') | int // 60 % 60}}min", "secondary": "Druckt seit {{ states('sensor.octoprint_time_elapsed') | int // 3600}}h {{ states('sensor.octoprint_time_elapsed') | int // 60 % 60}}min",
"active": "{{ is_state('light.bed_light', 'off') }}" "active": "{{ is_state('light.bed_light', 'off') }}"
}, },
{ {
"entity": "sensor.prusaprinter_actual_bed_temp", "entity": "sensor.octoprint_actual_bed_temp",
"name": "Print Bed", "name": "Print Bed",
"icon": "mdi:card" "icon": "mdi:card"
}, },
{ {
"entity": "sensor.prusaprinter_actual_tool0_temp", "entity": "sensor.octoprint_actual_tool0_temp",
"name": "Nozzle", "name": "Nozzle",
"icon": "mdi:printer-3d-nozzle" "icon": "mdi:printer-3d-nozzle"
}, },

View File

@ -1,12 +1,13 @@
{ {
"version": 1, "version": 1,
"minor_version": 1,
"key": "lovelace_resources", "key": "lovelace_resources",
"data": { "data": {
"items": [ "items": [
{ {
"id": "2dd231ecf4fa46d1b9ba696f28da7731", "id": "2dd231ecf4fa46d1b9ba696f28da7731",
"type": "module", "type": "module",
"url": "/local/custom_ui/state-card-custom-cover.js?v=1.04" "url": "/local/custom_ui/state-card-custom-cover.js?v=1.09"
}, },
{ {
"id": "526c1c7115cd4bb396cf02a83b884365", "id": "526c1c7115cd4bb396cf02a83b884365",
@ -16,15 +17,15 @@
{ {
"id": "55ef5e325ab444d19e15a1183a97fb35", "id": "55ef5e325ab444d19e15a1183a97fb35",
"type": "module", "type": "module",
"url": "/local/custom_ui/room-glance-card.js?v=1.1" "url": "/local/custom_ui/room-glance-card.js?v=1.09"
}, },
{ {
"url": "/hacsfiles/scheduler-card/scheduler-card.js?hacstag=286270157220", "url": "/hacsfiles/scheduler-card/scheduler-card.js?hacstag=286270157236",
"type": "module", "type": "module",
"id": "af379618bd83489a9f2f15a0be498eaf" "id": "af379618bd83489a9f2f15a0be498eaf"
}, },
{ {
"url": "/hacsfiles/lovelace-slider-entity-row/slider-entity-row.js?hacstag=1448997001710", "url": "/hacsfiles/lovelace-slider-entity-row/slider-entity-row.js?hacstag=1448997001721",
"type": "module", "type": "module",
"id": "7067680a3f314af285c5ebe1605e0451" "id": "7067680a3f314af285c5ebe1605e0451"
}, },
@ -34,27 +35,27 @@
"id": "aa48cd5ffa8a4e0883ce06e64391cf46" "id": "aa48cd5ffa8a4e0883ce06e64391cf46"
}, },
{ {
"url": "/hacsfiles/rgb-light-card/card.js?hacstag=215327195190", "url": "/hacsfiles/rgb-light-card/card.js?hacstag=2153271951110",
"type": "module", "type": "module",
"id": "9fa16ed42d0c480ab9dc711cb98790e7" "id": "9fa16ed42d0c480ab9dc711cb98790e7"
}, },
{ {
"url": "/hacsfiles/mini-graph-card/mini-graph-card-bundle.js?hacstag=1512800620100", "url": "/hacsfiles/mini-graph-card/mini-graph-card-bundle.js?hacstag=1512800620110",
"type": "module", "type": "module",
"id": "5fb0764a8bb54c4aaf4a4be15022095b" "id": "5fb0764a8bb54c4aaf4a4be15022095b"
}, },
{ {
"url": "/hacsfiles/mini-media-player/mini-media-player-bundle.js?hacstag=1485208381130", "url": "/hacsfiles/mini-media-player/mini-media-player-bundle.js?hacstag=1485208381164",
"type": "module", "type": "module",
"id": "9f7ce776f265476f89246c9926a933a8" "id": "9f7ce776f265476f89246c9926a933a8"
}, },
{ {
"url": "/hacsfiles/lovelace-multiple-entity-row/multiple-entity-row.js?hacstag=178921037420", "url": "/hacsfiles/lovelace-multiple-entity-row/multiple-entity-row.js?hacstag=178921037441",
"type": "module", "type": "module",
"id": "295d5e67ee594e31935e535c2c4b7bd4" "id": "295d5e67ee594e31935e535c2c4b7bd4"
}, },
{ {
"url": "/hacsfiles/hass-hue-icons/hass-hue-icons.js?hacstag=3844345221088", "url": "/hacsfiles/hass-hue-icons/hass-hue-icons.js?hacstag=3844345221243",
"type": "module", "type": "module",
"id": "59ab7764b5724e75ac5ff57fdcd54e2c" "id": "59ab7764b5724e75ac5ff57fdcd54e2c"
}, },
@ -69,14 +70,19 @@
"id": "c5461acbb2e742e4b06cebf73181ffc7" "id": "c5461acbb2e742e4b06cebf73181ffc7"
}, },
{ {
"url": "/hacsfiles/apexcharts-card/apexcharts-card.js?hacstag=331701152190", "url": "/hacsfiles/apexcharts-card/apexcharts-card.js?hacstag=331701152201",
"type": "module", "type": "module",
"id": "322b6b5391e84fd1bb126c8448db1ebb" "id": "322b6b5391e84fd1bb126c8448db1ebb"
}, },
{ {
"url": "/hacsfiles/kiosk-mode/kiosk-mode.js?hacstag=303101606171", "url": "/hacsfiles/kiosk-mode/kiosk-mode.js?hacstag=303101606172",
"type": "module", "type": "module",
"id": "58eff8b61ebf463b86570a8c975adda3" "id": "58eff8b61ebf463b86570a8c975adda3"
},
{
"url": "/hacsfiles/lovelace-valetudo-map-card/valetudo-map-card.js?hacstag=20303610820211205",
"type": "module",
"id": "44c1654a1a8b4e078c2d69bf52ba2ce5"
} }
] ]
} }

View File

@ -1,5 +1,5 @@
- id: '1575130335468' - id: '1575130335468'
alias: FernbedienungWeihnachtslichterOben alias: Fernbedienung Weihnachtslichter Oben
description: '' description: ''
trigger: trigger:
- event_data: - event_data:
@ -13,6 +13,7 @@
- data: - data:
entity_id: switch.mobile_steckdose_schalter_2 entity_id: switch.mobile_steckdose_schalter_2
service: switch.toggle service: switch.toggle
mode: single
- id: '1575202743482' - id: '1575202743482'
alias: Wecker Licht an alias: Wecker Licht an
description: '' description: ''
@ -44,7 +45,7 @@
- 0.414 - 0.414
service: light.turn_on service: light.turn_on
- id: '1589377976830' - id: '1589377976830'
alias: AlarmMartinHandy alias: Alarm Martin Handy
description: '' description: ''
trigger: trigger:
- entity_id: binary_sensor.gang_bewegungsmelder_schlafzimmer, binary_sensor.gang_bewegungsmelder_ost, - entity_id: binary_sensor.gang_bewegungsmelder_schlafzimmer, binary_sensor.gang_bewegungsmelder_ost,
@ -65,7 +66,7 @@
- delay: '30' - delay: '30'
mode: single mode: single
- id: '1598594894559' - id: '1598594894559'
alias: KlingelAufHandy alias: Klingel Auf Handy
description: '' description: ''
trigger: trigger:
- entity_id: switch.klingel_aussentur - entity_id: switch.klingel_aussentur
@ -84,7 +85,7 @@
service: notify.ios_martins_ipad service: notify.ios_martins_ipad
mode: single mode: single
- id: '1606655282153' - id: '1606655282153'
alias: _WeihnachtslichterAnUm6 alias: Weihnachtslichter an morgens um 6
description: '' description: ''
trigger: trigger:
- platform: time - platform: time
@ -96,10 +97,13 @@
entity_id: entity_id:
- switch.tasmota01 - switch.tasmota01
- switch.tasmota02 - switch.tasmota02
- switch.tasmota03 - switch.tasmota04
- switch.tasmota05
- switch.tasmota06
- switch.tasmota07
mode: single mode: single
- id: '1607412098745' - id: '1607412098745'
alias: _WeihnachtslichterAusMorgens alias: Weihnachtslichter aus morgens
description: '' description: ''
trigger: trigger:
- platform: sun - platform: sun
@ -112,12 +116,13 @@
entity_id: entity_id:
- switch.tasmota01 - switch.tasmota01
- switch.tasmota02 - switch.tasmota02
- switch.tasmota03 - switch.tasmota04
- switch.mobile_steckdose_schalter_1 - switch.tasmota05
- switch.mobile_steckdose_schalter_2 - switch.tasmota06
- switch.tasmota07
mode: single mode: single
- id: '1607412144113' - id: '1607412144113'
alias: _Weihnachtslichter An Abends alias: Weihnachtslichter An Abends
description: '' description: ''
trigger: trigger:
- platform: sun - platform: sun
@ -129,12 +134,13 @@
entity_id: entity_id:
- switch.tasmota01 - switch.tasmota01
- switch.tasmota02 - switch.tasmota02
- switch.tasmota03 - switch.tasmota04
- switch.mobile_steckdose_schalter_1 - switch.tasmota05
- switch.mobile_steckdose_schalter_2 - switch.tasmota06
- switch.tasmota07
mode: single mode: single
- id: '1607412210097' - id: '1607412210097'
alias: _Weihnachtslichter Aus Abends alias: Weihnachtslichter Aus Abends
description: '' description: ''
trigger: trigger:
- platform: time - platform: time
@ -146,12 +152,13 @@
entity_id: entity_id:
- switch.tasmota01 - switch.tasmota01
- switch.tasmota02 - switch.tasmota02
- switch.tasmota03 - switch.tasmota04
- switch.mobile_steckdose_schalter_1 - switch.tasmota05
- switch.mobile_steckdose_schalter_2 - switch.tasmota06
- switch.tasmota07
mode: single mode: single
- id: '1612028092169' - id: '1612028092169'
alias: 0_BewegungsmelderSchlafzimmerNacht alias: Bewegungsmelder Schlafzimmer Nacht
description: '' description: ''
trigger: trigger:
- platform: state - platform: state
@ -198,3 +205,83 @@
target: target:
entity_id: switch.tasmota07 entity_id: switch.tasmota07
mode: single mode: single
- id: '1632393568599'
alias: Herd vorgeheizt -> iPad
description: ''
trigger:
- platform: numeric_state
entity_id: sensor.backofen_verbrauch
below: '20'
for:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
condition: []
action:
- service: notify.mobile_app_martins_ipad
data:
title: Herd vorgeheizt
message: herd ist heiss :)
mode: single
- id: '1633435293611'
alias: Gang Bogen Nachtlicht
description: ''
trigger:
- platform: state
entity_id:
- binary_sensor.gang_bewegungsmelder_schlafzimmer
- binary_sensor.gang_bewegungsmelder_wohnzimmer
from: 'off'
to: 'on'
condition:
- condition: template
value_template: '{{ state_attr(''sun.sun'', ''elevation'') < 5 }}'
action:
- service: light.turn_on
target:
entity_id: light.gang_bogen
data:
brightness_pct: 50
xy_color:
- 0.607
- 0.378
- delay:
hours: 0
minutes: 2
seconds: 0
milliseconds: 0
- service: light.turn_off
target:
entity_id: light.gang_bogen
data:
transition: 5
mode: restart
- id: '1634461079797'
alias: 3D Drucker State Change
description: ''
trigger:
- platform: state
entity_id: binary_sensor.octoprint_printing
condition: []
action:
- service: notify.telegram_martin
data:
title: 3D Drucker
message: 3D Drucker hat Zustand gewechselt
mode: single
- id: '1656971839915'
alias: Rollos zu nachts
description: ''
trigger:
- platform: time
at: 04:00:00
condition: []
action:
- service: cover.close_cover
data: {}
target:
entity_id:
- cover.schlafzimmer_rollo_klein
- cover.schlafzimmer_rollo_gross
mode: single

View File

@ -1,263 +0,0 @@
attr global userattr cmdIcon devStateIcon devStateStyle icon sortby webCmd widgetOverride
attr global autoload_undefined_devices 1
attr global logfile -
attr global modpath .
attr global motd Error messages while initializing FHEM:\
attr global statefile ./log/fhem.save
attr global updateInBackground 1
attr global verbose 3
attr global genericDeviceType:switch,light,blind,thermostat
define telnetPort telnet 7072 global
#define WEB FHEMWEB 8083 global
#define WEBphone FHEMWEB 8084 global
#attr WEBphone stylesheetPrefix smallscreen
#define WEBtablet FHEMWEB 8085 global
#attr WEBtablet stylesheetPrefix touchpad
# Fake FileLog entry, to access the fhem log from FHEMWEB
#define Logfile FileLog ./log/fhem-%Y-%m.log fakelog
define autocreate autocreate
attr autocreate autosave 1
#attr autocreate filelog ./log/%NAME-%Y.log
#define eventTypes eventTypes ./log/eventTypes.txt
# Disable this to avoid looking for new USB devices on startup
#define initialUsbCheck notify global:INITIALIZED usb create
define CUL_0 CUL __device_placeholder__@9600 1034
attr CUL_0 hmId 62a77d
attr CUL_0 rfmode HomeMatic
define Arbeitszimmer_Rollo CUL_HM 339336
attr Arbeitszimmer_Rollo IODev CUL_0
attr Arbeitszimmer_Rollo autoReadReg 4_reqStatus
attr Arbeitszimmer_Rollo expert 2_full
attr Arbeitszimmer_Rollo firmware 2.3
attr Arbeitszimmer_Rollo model HM-LC-Bl1PBU-FM
attr Arbeitszimmer_Rollo room CUL_HM
attr Arbeitszimmer_Rollo serialNr LEQ1440417
attr Arbeitszimmer_Rollo subType blindActuator
attr Arbeitszimmer_Rollo webCmd statusRequest:toggleDir:on:off:up:down:stop
attr Arbeitszimmer_Rollo room Homekit
define Arbeitszimmer_Deckenlampe CUL_HM 1AA382
attr Arbeitszimmer_Deckenlampe IODev CUL_0
attr Arbeitszimmer_Deckenlampe autoReadReg 4_reqStatus
attr Arbeitszimmer_Deckenlampe expert 2_full
attr Arbeitszimmer_Deckenlampe firmware 2.2
attr Arbeitszimmer_Deckenlampe model HM-LC-Dim1TPBU-FM
attr Arbeitszimmer_Deckenlampe room CUL_HM
attr Arbeitszimmer_Deckenlampe serialNr JEQ0201891
attr Arbeitszimmer_Deckenlampe subType dimmer
attr Arbeitszimmer_Deckenlampe webCmd getConfig:clear msgEvents
define Arbeitszimmer_Deckenlampe_Sw CUL_HM 1AA38201
attr Arbeitszimmer_Deckenlampe_Sw model HM-LC-Dim1TPBU-FM
attr Arbeitszimmer_Deckenlampe_Sw peerIDs
attr Arbeitszimmer_Deckenlampe_Sw webCmd statusRequest:toggle:on:off:up:down
define Arbeitszimmer_Deckenlampe_Sw1_V_01 CUL_HM 1AA38202
attr Arbeitszimmer_Deckenlampe_Sw1_V_01 model HM-LC-Dim1TPBU-FM
attr Arbeitszimmer_Deckenlampe_Sw1_V_01 webCmd statusRequest:toggle:on:off:up:down
define Arbeitszimmer_Deckenlampe_Sw1_V_02 CUL_HM 1AA38203
attr Arbeitszimmer_Deckenlampe_Sw1_V_02 model HM-LC-Dim1TPBU-FM
attr Arbeitszimmer_Deckenlampe_Sw1_V_02 webCmd statusRequest:toggle:on:off:up:down
attr Arbeitszimmer_Deckenlampe room Homekit
define Schlafzimmer_Deckenlampe CUL_HM 1AA1C7
attr Schlafzimmer_Deckenlampe IODev CUL_0
attr Schlafzimmer_Deckenlampe autoReadReg 4_reqStatus
attr Schlafzimmer_Deckenlampe expert 2_full
attr Schlafzimmer_Deckenlampe firmware 2.2
attr Schlafzimmer_Deckenlampe model HM-LC-Dim1TPBU-FM
attr Schlafzimmer_Deckenlampe room CUL_HM
attr Schlafzimmer_Deckenlampe serialNr JEQ0201456
attr Schlafzimmer_Deckenlampe subType dimmer
attr Schlafzimmer_Deckenlampe webCmd getConfig:clear msgEvents
define Schlafzimmer_Deckenlampe_Sw CUL_HM 1AA1C701
attr Schlafzimmer_Deckenlampe_Sw model HM-LC-Dim1TPBU-FM
attr Schlafzimmer_Deckenlampe_Sw peerIDs
attr Schlafzimmer_Deckenlampe_Sw webCmd statusRequest:toggle:on:off:up:down
define Schlafzimmer_Deckenlampe_Sw1_V_01 CUL_HM 1AA1C702
attr Schlafzimmer_Deckenlampe_Sw1_V_01 model HM-LC-Dim1TPBU-FM
attr Schlafzimmer_Deckenlampe_Sw1_V_01 webCmd statusRequest:toggle:on:off:up:down
define Schlafzimmer_Deckenlampe_Sw1_V_02 CUL_HM 1AA1C703
attr Schlafzimmer_Deckenlampe_Sw1_V_02 model HM-LC-Dim1TPBU-FM
attr Schlafzimmer_Deckenlampe_Sw1_V_02 webCmd statusRequest:toggle:on:off:up:down
attr Schlafzimmer_Deckenlampe room Homekit
define Schlafzimmer_RolloKlein CUL_HM 338C2A
attr Schlafzimmer_RolloKlein IODev CUL_0
attr Schlafzimmer_RolloKlein autoReadReg 4_reqStatus
attr Schlafzimmer_RolloKlein expert 2_full
attr Schlafzimmer_RolloKlein firmware 2.3
attr Schlafzimmer_RolloKlein model HM-LC-Bl1PBU-FM
attr Schlafzimmer_RolloKlein room CUL_HM
attr Schlafzimmer_RolloKlein serialNr LEQ1439693
attr Schlafzimmer_RolloKlein subType blindActuator
attr Schlafzimmer_RolloKlein webCmd statusRequest:toggleDir:on:off:up:down:stop
attr Schlafzimmer_RolloKlein room Homekit
define Schlafzimmer_RolloGross CUL_HM 338C33
attr Schlafzimmer_RolloGross IODev CUL_0
attr Schlafzimmer_RolloGross autoReadReg 4_reqStatus
attr Schlafzimmer_RolloGross expert 2_full
attr Schlafzimmer_RolloGross firmware 2.3
attr Schlafzimmer_RolloGross model HM-LC-Bl1PBU-FM
attr Schlafzimmer_RolloGross room CUL_HM
attr Schlafzimmer_RolloGross serialNr LEQ1439702
attr Schlafzimmer_RolloGross subType blindActuator
attr Schlafzimmer_RolloGross webCmd statusRequest:toggleDir:on:off:up:down:stop
attr Schlafzimmer_RolloGross room Homekit
define Kinderzimmer_Deckenlampe CUL_HM 1B5305
attr Kinderzimmer_Deckenlampe IODev CUL_0
attr Kinderzimmer_Deckenlampe autoReadReg 4_reqStatus
attr Kinderzimmer_Deckenlampe expert 2_full
attr Kinderzimmer_Deckenlampe firmware 2.2
attr Kinderzimmer_Deckenlampe model HM-LC-Dim1TPBU-FM
attr Kinderzimmer_Deckenlampe room CUL_HM
attr Kinderzimmer_Deckenlampe serialNr JEQ0199674
attr Kinderzimmer_Deckenlampe subType dimmer
attr Kinderzimmer_Deckenlampe webCmd getConfig:clear msgEvents
define Kinderzimmer_Deckenlampe_Sw CUL_HM 1B530501
attr Kinderzimmer_Deckenlampe_Sw model HM-LC-Dim1TPBU-FM
attr Kinderzimmer_Deckenlampe_Sw peerIDs
attr Kinderzimmer_Deckenlampe_Sw webCmd statusRequest:toggle:on:off:up:down
define Kinderzimmer_Deckenlampe_Sw1_V_01 CUL_HM 1B530502
attr Kinderzimmer_Deckenlampe_Sw1_V_01 model HM-LC-Dim1TPBU-FM
attr Kinderzimmer_Deckenlampe_Sw1_V_01 webCmd statusRequest:toggle:on:off:up:down
define Kinderzimmer_Deckenlampe_Sw1_V_02 CUL_HM 1B530503
attr Kinderzimmer_Deckenlampe_Sw1_V_02 model HM-LC-Dim1TPBU-FM
attr Kinderzimmer_Deckenlampe_Sw1_V_02 webCmd statusRequest:toggle:on:off:up:down
attr Kinderzimmer_Deckenlampe room Homekit
define Kinderzimmer_Rollo CUL_HM 1AF5DD
attr Kinderzimmer_Rollo IODev CUL_0
attr Kinderzimmer_Rollo autoReadReg 4_reqStatus
attr Kinderzimmer_Rollo expert 2_full
attr Kinderzimmer_Rollo firmware 2.1
attr Kinderzimmer_Rollo model HM-LC-Bl1PBU-FM
attr Kinderzimmer_Rollo room CUL_HM
attr Kinderzimmer_Rollo serialNr JEQ0109195
attr Kinderzimmer_Rollo subType blindActuator
attr Kinderzimmer_Rollo webCmd statusRequest:toggleDir:on:off:up:down:stop
attr Kinderzimmer_Rollo room Homekit
define Steckdose_Dimmer CUL_HM 20E8F1
attr Steckdose_Dimmer IODev CUL_0
attr Steckdose_Dimmer autoReadReg 4_reqStatus
attr Steckdose_Dimmer expert 2_full
attr Steckdose_Dimmer firmware 2.3
attr Steckdose_Dimmer model HM-LC-Dim1T-Pl-2
attr Steckdose_Dimmer room CUL_HM
attr Steckdose_Dimmer serialNr KEQ0124588
attr Steckdose_Dimmer subType dimmer
attr Steckdose_Dimmer webCmd statusRequest:toggle:on:off:up:down
attr Steckdose_Dimmer room Homekit
define Bad_Luefter CUL_HM 1B7501
attr Bad_Luefter IODev CUL_0
attr Bad_Luefter autoReadReg 4_reqStatus
attr Bad_Luefter expert 2_full
attr Bad_Luefter firmware 2.1
attr Bad_Luefter model HM-LC-Sw1PBU-FM
attr Bad_Luefter room CUL_HM
attr Bad_Luefter serialNr JEQ0099033
attr Bad_Luefter subType switch
attr Bad_Luefter webCmd statusRequest:toggle:on:off
attr Bad_Luefter room Homekit
define Arbeitszimmer_Bewegungsmelder CUL_HM 2F2A4B
attr Arbeitszimmer_Bewegungsmelder IODev CUL_0
attr Arbeitszimmer_Bewegungsmelder actCycle 000:20
attr Arbeitszimmer_Bewegungsmelder actStatus alive
attr Arbeitszimmer_Bewegungsmelder autoReadReg 4_reqStatus
attr Arbeitszimmer_Bewegungsmelder expert 2_full
attr Arbeitszimmer_Bewegungsmelder firmware 1.6
attr Arbeitszimmer_Bewegungsmelder model HM-SEC-MDIR-2
attr Arbeitszimmer_Bewegungsmelder room CUL_HM
attr Arbeitszimmer_Bewegungsmelder serialNr LEQ0797237
attr Arbeitszimmer_Bewegungsmelder subType motionDetector
attr Arbeitszimmer_Bewegungsmelder room Homekit
define ActionDetector CUL_HM 000000
attr ActionDetector event-on-change-reading .*
attr ActionDetector model ActionDetector
define MobileSteckdoseSchalter1 CUL_HM 453335
attr MobileSteckdoseSchalter1 IODev CUL_0
attr MobileSteckdoseSchalter1 actCycle 000:10
attr MobileSteckdoseSchalter1 actStatus dead
attr MobileSteckdoseSchalter1 autoReadReg 4_reqStatus
attr MobileSteckdoseSchalter1 expert 2_full
attr MobileSteckdoseSchalter1 firmware 1.6
attr MobileSteckdoseSchalter1 model HM-ES-PMSw1-Pl
attr MobileSteckdoseSchalter1 room CUL_HM
attr MobileSteckdoseSchalter1 serialNr NEQ0153825
attr MobileSteckdoseSchalter1 subType powerMeter
attr MobileSteckdoseSchalter1 webCmd getConfig:clear msgEvents
define MobileSteckdoseSchalter1_Sw CUL_HM 45333501
attr MobileSteckdoseSchalter1_Sw model HM-ES-PMSw1-Pl
attr MobileSteckdoseSchalter1_Sw peerIDs
define MobileSteckdoseSchalter1_Pwr CUL_HM 45333502
attr MobileSteckdoseSchalter1_Pwr model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter1_SenPwr CUL_HM 45333503
attr MobileSteckdoseSchalter1_SenPwr model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter1_SenI CUL_HM 45333504
attr MobileSteckdoseSchalter1_SenI model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter1_SenU CUL_HM 45333505
attr MobileSteckdoseSchalter1_SenU model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter1_SenF CUL_HM 45333506
attr MobileSteckdoseSchalter1_SenF model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter2 CUL_HM 338E72
attr MobileSteckdoseSchalter2 IODev CUL_0
attr MobileSteckdoseSchalter2 actCycle 000:10
attr MobileSteckdoseSchalter2 actStatus dead
attr MobileSteckdoseSchalter2 autoReadReg 4_reqStatus
attr MobileSteckdoseSchalter2 expert 2_full
attr MobileSteckdoseSchalter2 firmware 1.6
attr MobileSteckdoseSchalter2 model HM-ES-PMSw1-Pl
attr MobileSteckdoseSchalter2 room CUL_HM
attr MobileSteckdoseSchalter2 serialNr LEQ1345055
attr MobileSteckdoseSchalter2 subType powerMeter
attr MobileSteckdoseSchalter2 webCmd getConfig:clear msgEvents
define MobileSteckdoseSchalter2_Sw CUL_HM 338E7201
attr MobileSteckdoseSchalter2_Sw model HM-ES-PMSw1-Pl
attr MobileSteckdoseSchalter2_Sw peerIDs
define MobileSteckdoseSchalter2_Pwr CUL_HM 338E7202
attr MobileSteckdoseSchalter2_Pwr model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter2_SenPwr CUL_HM 338E7203
attr MobileSteckdoseSchalter2_SenPwr model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter2_SenI CUL_HM 338E7204
attr MobileSteckdoseSchalter2_SenI model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter2_SenU CUL_HM 338E7205
attr MobileSteckdoseSchalter2_SenU model HM-ES-PMSw1-Pl
define MobileSteckdoseSchalter2_SenF CUL_HM 338E7206
attr MobileSteckdoseSchalter2_SenF model HM-ES-PMSw1-Pl

View File

@ -1,9 +1,5 @@
# Add only entities here that are auto-discovered (not KNX devices) # Add only entities here that are auto-discovered (not KNX devices)
#default_view:
# view: true
# icon: mdi:home
living_area: living_area:
name: Wohnbereich name: Wohnbereich
entities: entities:

View File

@ -1,337 +0,0 @@
import re
import os
from ruamel.yaml import YAML
yaml = YAML()
# -------------------------------------- put the config here -----------------------------------------------------------
def get_config():
return {
'bedroom': {
'ir_host': 'bedroompi.fritz.box',
'media_player': 'media_player.bedroompi',
'group': 'group.bedroom',
'mapping': {
'btn_1': '[playlist] Good Morning',
'btn_2': '[playlist] Good Night Long',
'btn_3': '[playlist] Good Night',
'btn_4': '[playlist] Bar Classics',
'btn_5': '[playlist] Sentimental Moods',
'btn_6': '[playlist] Pop',
'btn_7': '[radio] B 5 aktuell',
'btn_8': '[radio] BR-Klassik',
'btn_9': '[playlist] http://opml.radiotime.com/Tune.ashx?id=s25028&formats=aac,ogg,mp3', # Klassik Radio
'key_numeric_star': [
*repeat_one_crossfade('media_player.bedroompi'),
service('media_player.play_media', 'media_player.bedroompi',
media_content_id='Foen', media_content_type='music'),
service('media_player.volume_set', 'media_player.bedroompi', volume_level=60),
],
'btn_0': '[radio] Bayern 3',
'key_numeric_pound': '[radio] Bayern 2',
'key_red': '[scene] schlafzimmer_stillen',
'key_green': '[scene] schlafzimmer_orange',
'key_yellow': '[scene] schlafzimmer_ganz_hell',
'key_blue': '[scene] nachtswennallelieberschlafen',
'key_tv': [service('script.turn_on', 'script.timed_sleep',
variables={'media_content_id': 'spotify:playlist:37i9dQZF1DXbcPC6Vvqudd', # Regen
'light_off_secs': 15 * 60,
'music_off_secs': 45 * 60,
'shuffle': 1,
})],
'key_video': [service('script.turn_on', 'script.timed_sleep',
variables={'media_content_id': 'Good Night',
'light_off_secs': 15 * 60,
'music_off_secs': 45 * 60,
'shuffle': 0,
})],
'key_music': [service('script.turn_on', 'script.timed_sleep',
variables={'media_content_id': 'spotify:playlist:37i9dQZF1DXbcPC6Vvqudd', # Regen
'light_off_secs': 5 * 60,
'music_off_secs': 20 * 60,
'shuffle': 1,
})],
'key_pictures': [service('script.turn_on', 'script.timed_sleep',
variables={'media_content_id': 'Good Night',
'light_off_secs': 5 * 60,
'music_off_secs': 20 * 60,
'shuffle': 0,
})],
'key_power': [ # Music & Lights off
service('media_player.media_pause', 'media_player.bedroompi'),
service('light.turn_off', 'group.bedroom'),
],
'key_ok': [ # Grosser Rollo zu, kleiner halb zu
service('cover.close_cover', 'cover.schlafzimmer_rollo_gross'),
service('cover_half.set_half', 'cover.schlafzimmer_rollo_klein'),
],
'key_mute': [service('light.turn_off', 'group.all_downstairs_but_bedroom_and_outside')],
'key_channel': [service('light.turn_off', 'group.all_downstairs_but_bedroom')],
}
},
'living_area': {
'ir_host': 'kitchenpi.fritz.box',
'media_player': 'media_player.kitchenpi',
'group': 'group.living_area',
'mapping': {
'btn_4': '[playlist] Bar Classics',
'btn_5': '[playlist] Sentimental Moods',
'btn_6': '[playlist] Pop',
'btn_7': '[radio] B 5 aktuell',
'btn_8': '[radio] BR-Klassik',
'btn_9': '[playlist] http://opml.radiotime.com/Tune.ashx?id=s25028&formats=aac,ogg,mp3', # Klassik Radio
'key_numeric_star': '[radio] Antenne Bayern',
'btn_0': '[radio] Bayern 3',
'key_numeric_pound': '[radio] Bayern 2',
'key_red': '[scene] wohnbereich_orange',
'key_green': '[scene] wohnbereich_grun',
'key_yellow': '[scene] wohnbereich_hell',
'key_blue': '[scene] wohnbereich_blau_grun',
}
},
'first_floor_dining_room': {
'ir_host': 'esszimmerradio.fritz.box',
'media_player': 'media_player.esszimmer',
'mapping': {
'btn_1': '[radio] Bayern 1',
'btn_2': '[radio] Bayern 2',
'btn_3': '[radio] BR Heimat',
'btn_4': '[radio] Bayern+',
'btn_5': '[radio] B 5 Aktuell',
'btn_6': '[radio] BR-Klassik',
'btn_7': '[playlist] Gesammelte Weihnachtslieder',
'btn_8': '[playlist] Harmonic Brass Christmas',
'btn_9': '[playlist] German Brass Christmas',
'key_numeric_star': '[playlist] Weihnachten mit den Wiener Sängerknaben',
'btn_0': '[playlist] Weihnachten mit den Wiener Sängerknaben',
'key_numeric_pound': '[playlist] SammlungGeorg',
}
},
'first_floor_living_room': {
'ir_host': 'musikserverWohnzimmerOben.fritz.box',
'media_player': 'media_player.wohnzimmer',
'mapping': {
'btn_1': '[radio] Bayern 1',
'btn_2': '[radio] Bayern 2',
'btn_3': '[radio] BR Heimat',
'btn_4': '[radio] Bayern+',
'btn_5': '[radio] B 5 Aktuell',
'btn_6': '[radio] BR-Klassik',
'btn_7': '[playlist] Gesammelte Weihnachtslieder',
'btn_8': '[playlist] Harmonic Brass Christmas',
'btn_9': '[playlist] German Brass Christmas',
'key_numeric_star': '[playlist] Weihnachten mit den Wiener Sängerknaben',
'btn_0': '[playlist] Weihnachten mit den Wiener Sängerknaben',
'key_numeric_pound': '[playlist] SammlungGeorg',
}
},
}
# ----------------------------------------------------------------------------------------------------------------------
description_regex = re.compile(r'\[\s*(.*)\s*\](.*)')
def split_description(d):
res = description_regex.match(d)
return res.group(1).strip(), res.group(2).strip()
def default_music_settings(media_player):
return [
service('media_player.shuffle_set', media_player, shuffle=False),
service('media_player.squeezebox_call_method', media_player, command='playlist repeat 0'),
service('media_player.squeezebox_call_method', media_player, command="playerpref transitionType 0"),
]
def repeat_one_crossfade(media_player):
return [
service('media_player.repeat_set', media_player, repeat='one'),
service('media_player.squeezebox_call_method', media_player, command="playerpref transitionType 1"),
]
def automation_from_config(ir_description):
ir_host = ir_description['ir_host']
result = []
for key, description in ir_description['mapping'].items():
automation = {'alias': f'IR {ir_host} {key}',
'trigger': ir_trigger(ir_host, key)}
if isinstance(description, list):
action = description
elif isinstance(description, str):
function, value = split_description(description)
if function == 'playlist':
media_player = ir_description['media_player']
action = [*default_music_settings(media_player),
service('media_player.play_media', media_player,
media_content_id=value, media_content_type='music')]
elif function == 'radio':
media_player = ir_description['media_player']
action = service('media_player.play_media', media_player,
media_content_id=value, media_content_type='channel')
elif function == 'scene':
action = service('scene.turn_on', 'scene.' + value)
elif function == 'timed_light_off':
group = ir_description['group']
action = service('light.turn_off', group, transition=str(60 * int(value)))
else:
raise ValueError("Invalid prefix " + function)
else:
raise ValueError("Invalid type for entry " + key)
automation['action'] = action
result.append(automation)
return result
def ir_trigger(ir_host, button_name):
return {
'platform': 'event',
'event_type': 'ir_command_received',
'event_data': {
'button_name': button_name,
'repeat_counter': 0,
'host': ir_host,
}
}
def service(service_name, entity_id, **kwargs):
kwargs['entity_id'] = entity_id
return {
'service': service_name,
'data': kwargs
}
def default_shutter_controls(device_group, ir_host):
"""Default rules for Hauppauge IR for Shutter control with up, down, left, right buttons"""
return [
{
'alias': f'IR {ir_host} Rollo auf',
'trigger': ir_trigger(ir_host, 'key_up'),
'action': service('cover.open_cover', device_group),
},
{
'alias': f'IR {ir_host} Rollo zu',
'trigger': ir_trigger(ir_host, 'key_down'),
'action': service('cover.close_cover', device_group),
},
{
'alias': f'IR {ir_host} Rollo halb',
'trigger': [ir_trigger(ir_host, 'key_left'), ir_trigger(ir_host, 'key_right')],
'action': service('cover_half.set_half', device_group),
},
]
def default_light_controls(device_group, ir_host):
"""Default light rules for Hauppauge IR for light dimming with channel up/down and light off with stop button"""
return [
{
'alias': f'IR {ir_host} Licht heller',
'trigger': ir_trigger(ir_host, 'key_channelup'),
'action': service('dimmer.dim', device_group, offset=30),
},
{
'alias': f'IR {ir_host} Licht dunkler',
'trigger': ir_trigger(ir_host, 'key_channeldown'),
'action': service('dimmer.dim', device_group, offset=-30),
},
{
'alias': f'IR {ir_host} Licht viel heller',
'trigger': ir_trigger(ir_host, 'key_menu'),
'action': service('dimmer.dim', device_group, offset=130),
},
{
'alias': f'IR {ir_host} Licht viel dunkler',
'trigger': ir_trigger(ir_host, 'key_stop'),
'action': service('dimmer.dim', device_group, offset=-130),
},
{
'alias': f'IR {ir_host} Licht aus',
'trigger': ir_trigger(ir_host, 'key_goto'),
'action': service('light.turn_off', device_group),
},
]
def default_music_controls(device_group, ir_host):
"""Default music control (play, pause, next) for Hauppauge IR"""
return [
{
'alias': f'IR {ir_host} Musik Play',
'trigger': ir_trigger(ir_host, 'key_play'),
'action': service('media_player.media_play_pause', device_group),
},
{
'alias': f'IR {ir_host} Musik Pause',
'trigger': ir_trigger(ir_host, 'key_pause'),
'action': service('media_player.turn_off', device_group),
},
{
'alias': f'IR {ir_host} Musik Next',
'trigger': [ir_trigger(ir_host, 'key_forward'), ir_trigger(ir_host, 'key_fastforward')],
'action': service('media_player.media_next_track', device_group),
},
{
'alias': f'IR {ir_host} Musik Prev',
'trigger': [ir_trigger(ir_host, 'key_previous'), ir_trigger(ir_host, 'key_rewind')],
'action': service('media_player.media_next_track', device_group),
},
{
'alias': f'IR {ir_host} Vol Up',
'trigger': ir_trigger(ir_host, 'key_volumeup'),
'action': service('media_player.volume_up', device_group),
},
{
'alias': f'IR {ir_host} Vol Down',
'trigger': ir_trigger(ir_host, 'key_volumedown'),
'action': service('media_player.volume_down', device_group),
},
{
'alias': f'IR {ir_host} Shuffle On',
'trigger': ir_trigger(ir_host, 'key_menu'),
'action': service('media_player.shuffle_set', device_group, shuffle=True),
},
{
'alias': f'IR {ir_host} Shuffle Off',
'trigger': ir_trigger(ir_host, 'key_exit'),
'action': service('media_player.shuffle_set', device_group, shuffle=False),
},
]
def create_rules(folder):
for name, data in get_config().items():
rules = []
rules += automation_from_config(data)
if 'group' in data:
rules += default_shutter_controls(data['group'], data['ir_host'])
rules += default_light_controls(data['group'], data['ir_host'])
if 'media_player' in data:
rules += default_music_controls(data['media_player'], data['ir_host'])
file_name = os.path.join(folder, "ir_" + name + '.yaml')
with open(file_name, 'w') as f:
f.write("# Dont' edit manually! this is generated!\n\n")
yaml.dump(rules, f)

View File

@ -3,7 +3,6 @@ import argparse
from util import DeviceInfo, add_to_group, name_to_id from util import DeviceInfo, add_to_group, name_to_id
from ruamel.yaml import YAML from ruamel.yaml import YAML
import knx_conf as knx import knx_conf as knx
from ir_automations import create_rules as create_automation_rules
script_path = os.path.dirname(os.path.realpath(__file__)) script_path = os.path.dirname(os.path.realpath(__file__))
yaml = YAML() yaml = YAML()
@ -13,8 +12,8 @@ yaml.preserve_quotes = True
sensor_exclude_list = [ sensor_exclude_list = [
'sensor.fritz_box_7490_bytes_received', 'sensor.fritz_box_7490_bytes_received',
'sensor.fritz_box_7490_bytes_sent', 'sensor.fritz_box_7490_bytes_sent',
#'sensor.fritz_box_7490_kbyte_sec_received', # 'sensor.fritz_box_7490_kbyte_sec_received',
#'sensor.fritz_box_7490_kbyte_sec_sent', # 'sensor.fritz_box_7490_kbyte_sec_sent',
'sensor.fritz_box_7490_packets_received', 'sensor.fritz_box_7490_packets_received',
'sensor.fritz_box_7490_packets_sec_received', 'sensor.fritz_box_7490_packets_sec_received',
'sensor.fritz_box_7490_packets_sec_sent', 'sensor.fritz_box_7490_packets_sec_sent',
@ -165,7 +164,6 @@ def add_knx_devices(devices, groups):
return template_sensors return template_sensors
def add_meta_groups(groups): def add_meta_groups(groups):
all_devices = set() all_devices = set()
for group in groups.values(): for group in groups.values():
@ -256,11 +254,10 @@ def create_config(target_directory, development=False):
manual_config_dict = yaml.load(open(manual_config_path, encoding="utf-8")) manual_config_dict = yaml.load(open(manual_config_path, encoding="utf-8"))
knx_conf = { knx_conf = {
'rate_limit': 20, #'tunneling': {
'tunneling': { # 'host': '192.168.178.65',
'host': '192.168.178.65', # 'port': 3671
'port': 3671 #}
}
} }
template_sensors = add_knx_devices(knx_conf, group_dict) template_sensors = add_knx_devices(knx_conf, group_dict)
@ -298,8 +295,6 @@ def create_config(target_directory, development=False):
additional_file = 'secrets_development.yaml' if development else 'secrets_deploy.yaml' additional_file = 'secrets_development.yaml' if development else 'secrets_deploy.yaml'
output.write(open(os.path.join(script_path, additional_file), 'r').read()) output.write(open(os.path.join(script_path, additional_file), 'r').read())
#create_automation_rules(os.path.join(target_directory, 'automations'))
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()

View File

@ -8,7 +8,6 @@ mobile_app:
person: person:
sun: sun:
system_health: system_health:
updater:
#logbook: #logbook:
input_boolean: input_boolean:
@ -155,94 +154,94 @@ switch:
name: esszimmer_oben_radio_steckdose name: esszimmer_oben_radio_steckdose
host: esszimmerradio.fritz.box host: esszimmerradio.fritz.box
num_power_plugs: 4 num_power_plugs: 4
- platform: mqtt # - platform: mqtt
name: PoolPumpeSteckdose # name: PoolPumpeSteckdose
state_topic: "stat/poolpumpesteckdose/POWER" # state_topic: "stat/poolpumpesteckdose/POWER"
command_topic: "cmnd/poolpumpesteckdose/POWER" # command_topic: "cmnd/poolpumpesteckdose/POWER"
availability_topic: "tele/poolpumpesteckdose/LWT" # availability_topic: "tele/poolpumpesteckdose/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
- platform: mqtt # - platform: mqtt
name: Tasmota01 # name: Tasmota01
state_topic: "stat/tasmota01/POWER" # state_topic: "stat/tasmota01/POWER"
command_topic: "cmnd/tasmota01/POWER" # command_topic: "cmnd/tasmota01/POWER"
availability_topic: "tele/tasmota01/LWT" # availability_topic: "tele/tasmota01/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
- platform: mqtt # - platform: mqtt
name: Tasmota02 # name: Tasmota02
state_topic: "stat/tasmota02/POWER" # state_topic: "stat/tasmota02/POWER"
command_topic: "cmnd/tasmota02/POWER" # command_topic: "cmnd/tasmota02/POWER"
availability_topic: "tele/tasmota02/LWT" # availability_topic: "tele/tasmota02/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
- platform: mqtt # - platform: mqtt
name: Tasmota03 # name: Tasmota03
state_topic: "stat/tasmota03/POWER" # state_topic: "stat/tasmota03/POWER"
command_topic: "cmnd/tasmota03/POWER" # command_topic: "cmnd/tasmota03/POWER"
availability_topic: "tele/tasmota03/LWT" # availability_topic: "tele/tasmota03/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
- platform: mqtt # - platform: mqtt
name: Tasmota04 # name: Tasmota04
state_topic: "stat/tasmota04/POWER" # state_topic: "stat/tasmota04/POWER"
command_topic: "cmnd/tasmota04/POWER" # command_topic: "cmnd/tasmota04/POWER"
availability_topic: "tele/tasmota04/LWT" # availability_topic: "tele/tasmota04/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
- platform: mqtt # - platform: mqtt
name: Tasmota05 # name: Tasmota05
state_topic: "stat/tasmota05/POWER" # state_topic: "stat/tasmota05/POWER"
command_topic: "cmnd/tasmota05/POWER" # command_topic: "cmnd/tasmota05/POWER"
availability_topic: "tele/tasmota05/LWT" # availability_topic: "tele/tasmota05/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
- platform: mqtt # - platform: mqtt
name: Tasmota06 # name: Tasmota06
state_topic: "stat/tasmota06/POWER" # state_topic: "stat/tasmota06/POWER"
command_topic: "cmnd/tasmota06/POWER" # command_topic: "cmnd/tasmota06/POWER"
availability_topic: "tele/tasmota06/LWT" # availability_topic: "tele/tasmota06/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
- platform: mqtt # - platform: mqtt
name: Tasmota07 # name: Tasmota07
state_topic: "stat/tasmota07/POWER" # state_topic: "stat/tasmota07/POWER"
command_topic: "cmnd/tasmota07/POWER" # command_topic: "cmnd/tasmota07/POWER"
availability_topic: "tele/tasmota07/LWT" # availability_topic: "tele/tasmota07/LWT"
qos: 1 # qos: 1
payload_on: "ON" # payload_on: "ON"
payload_off: "OFF" # payload_off: "OFF"
payload_available: "Online" # payload_available: "Online"
payload_not_available: "Offline" # payload_not_available: "Offline"
retain: false # retain: false
long_click: long_click:
duration: 0.6 duration: 0.6
@ -479,9 +478,9 @@ homematic:
username: homeassistant username: homeassistant
password: !secret homematic_pw password: !secret homematic_pw
zwave: #zwave:
usb_path: /dev/serial/by-id/usb-0658_0200-if00 # usb_path: /dev/serial/by-id/usb-0658_0200-if00
network_key: "0xE0, 0x64, 0x50, 0x55, 0x20, 0x63, 0xC7, 0x05, 0x62, 0xD3, 0xEA, 0x91, 0x87, 0xE0, 0x1E, 0x74" # network_key: "0xE0, 0x64, 0x50, 0x55, 0x20, 0x63, 0xC7, 0x05, 0x62, 0xD3, 0xEA, 0x91, 0x87, 0xE0, 0x1E, 0x74"
sysdweb: sysdweb:
@ -549,13 +548,6 @@ media_player:
- platform: squeezebox_telnet - platform: squeezebox_telnet
host: musikserverWohnzimmerOben.fritz.box host: musikserverWohnzimmerOben.fritz.box
# set up via frontend :(
#vacuum:
# - platform: xiaomi_miio
# host: vacuum.fritz.box
# token: !secret vacuum_token
sensor: sensor:
- platform: mqtt - platform: mqtt
state_topic: 'monitor/kitchen/martin_handy' state_topic: 'monitor/kitchen/martin_handy'

File diff suppressed because one or more lines are too long

View File

@ -87,10 +87,12 @@ export class RoomGlanceCard extends LitElement {
return html` return html`
<ha-icon-button <ha-icon-button
icon="${buttonCfg.icon || "mdi:checkbox-blank"}" icon="${buttonCfg.icon || "mdi:checkbox-blank"}"
style="color: ${buttonCfg.color || ""};"
title="${buttonCfg.name}" title="${buttonCfg.name}"
@click=${this.serviceHandler("scene", "turn_on", {entity_id: buttonCfg.scene})} @click=${this.serviceHandler("scene", "turn_on", {entity_id: buttonCfg.scene})}
></ha-icon-button> >
<ha-icon style="color: ${buttonCfg.color || ""};"
icon="${buttonCfg.icon || "mdi:checkbox-blank"}"></ha-icon>
</ha-icon-button>
`; `;
} }
@ -99,18 +101,24 @@ export class RoomGlanceCard extends LitElement {
<ha-icon-button <ha-icon-button
icon="mdi:close-circle" icon="mdi:close-circle"
@click=${this.serviceHandler("light", "turn_off")} @click=${this.serviceHandler("light", "turn_off")}
></ha-icon-button> >
<ha-icon icon="mdi:close-circle"></ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="mdi:chevron-up" icon="mdi:chevron-up"
title="Heller" title="Heller"
@click=${this.serviceHandler("dimmer", "dim", {offset: 30})} @click=${this.serviceHandler("dimmer", "dim", {offset: 30})}
></ha-icon-button> >
<ha-icon icon="mdi:chevron-up"></ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="mdi:chevron-down" icon="mdi:chevron-down"
title="Dunkler" title="Dunkler"
@click=${this.serviceHandler("dimmer", "dim", {offset: -30})} @click=${this.serviceHandler("dimmer", "dim", {offset: -30})}
></ha-icon-button>`; >
<ha-icon icon="mdi:chevron-down"></ha-icon>
</ha-icon-button>`;
} }
private renderCoverControl() { private renderCoverControl() {
@ -118,19 +126,27 @@ export class RoomGlanceCard extends LitElement {
<ha-icon-button <ha-icon-button
icon="hass:menu" icon="hass:menu"
@click=${this.serviceHandler("cover_half", "set_half")} @click=${this.serviceHandler("cover_half", "set_half")}
></ha-icon-button> >
<ha-icon icon="hass:menu"></ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-up" icon="hass:arrow-up"
@click=${this.serviceHandler("cover", "open_cover")} @click=${this.serviceHandler("cover", "open_cover")}
></ha-icon-button> >
<ha-icon icon="hass:arrow-up"></ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:stop" icon="hass:stop"
@click=${this.serviceHandler("cover", "stop_cover")} @click=${this.serviceHandler("cover", "stop_cover")}
></ha-icon-button> >
<ha-icon icon="hass:stop"></ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-down" icon="hass:arrow-down"
@click=${this.serviceHandler("cover", "close_cover")} @click=${this.serviceHandler("cover", "close_cover")}
></ha-icon-button> >
<ha-icon icon="hass:arrow-down"></ha-icon>
</ha-icon-button>
`; `;
} }
@ -227,9 +243,7 @@ export class RoomGlanceCard extends LitElement {
} }
ha-icon { ha-icon {
cursor: pointer; height: auto;
padding: 8px;
color: #a9a9a9;
} }
ha-icon.state-on { ha-icon.state-on {

View File

@ -12,7 +12,7 @@
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
const i=new WeakMap,n=t=>"function"==typeof t&&i.has(t),r=void 0!==window.customElements&&void 0!==window.customElements.polyfillWrapFlushCallback,o=(t,e,s=null)=>{for(;e!==s;){const s=e.nextSibling;t.removeChild(e),e=s}},a={},l={},h=`{{lit-${String(Math.random()).slice(2)}}}`,c=`\x3c!--${h}--\x3e`,p=new RegExp(`${h}|${c}`),d="$lit$";class u{constructor(t,e){this.parts=[],this.element=e;const s=[],i=[],n=document.createTreeWalker(e.content,133,null,!1);let r=0,o=-1,a=0;const{strings:l,values:{length:c}}=t;for(;a<c;){const t=n.nextNode();if(null!==t){if(o++,1===t.nodeType){if(t.hasAttributes()){const e=t.attributes,{length:s}=e;let i=0;for(let t=0;t<s;t++)_(e[t].name,d)&&i++;for(;i-- >0;){const e=l[a],s=y.exec(e)[2],i=s.toLowerCase()+d,n=t.getAttribute(i);t.removeAttribute(i);const r=n.split(p);this.parts.push({type:"attribute",index:o,name:s,strings:r}),a+=r.length-1}}"TEMPLATE"===t.tagName&&(i.push(t),n.currentNode=t.content)}else if(3===t.nodeType){const e=t.data;if(e.indexOf(h)>=0){const i=t.parentNode,n=e.split(p),r=n.length-1;for(let e=0;e<r;e++){let s,r=n[e];if(""===r)s=m();else{const t=y.exec(r);null!==t&&_(t[2],d)&&(r=r.slice(0,t.index)+t[1]+t[2].slice(0,-d.length)+t[3]),s=document.createTextNode(r)}i.insertBefore(s,t),this.parts.push({type:"node",index:++o})}""===n[r]?(i.insertBefore(m(),t),s.push(t)):t.data=n[r],a+=r}}else if(8===t.nodeType)if(t.data===h){const e=t.parentNode;null!==t.previousSibling&&o!==r||(o++,e.insertBefore(m(),t)),r=o,this.parts.push({type:"node",index:o}),null===t.nextSibling?t.data="":(s.push(t),o--),a++}else{let e=-1;for(;-1!==(e=t.data.indexOf(h,e+1));)this.parts.push({type:"node",index:-1}),a++}}else n.currentNode=i.pop()}for(const t of s)t.parentNode.removeChild(t)}}const _=(t,e)=>{const s=t.length-e.length;return s>=0&&t.slice(s)===e},f=t=>-1!==t.index,m=()=>document.createComment(""),y=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F "'>=\/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/; const i=new WeakMap,n=t=>"function"==typeof t&&i.has(t),r=void 0!==window.customElements&&void 0!==window.customElements.polyfillWrapFlushCallback,o=(t,e,s=null)=>{for(;e!==s;){const s=e.nextSibling;t.removeChild(e),e=s}},a={},l={},h=`{{lit-${String(Math.random()).slice(2)}}}`,c=`\x3c!--${h}--\x3e`,p=new RegExp(`${h}|${c}`),u="$lit$";class d{constructor(t,e){this.parts=[],this.element=e;const s=[],i=[],n=document.createTreeWalker(e.content,133,null,!1);let r=0,o=-1,a=0;const{strings:l,values:{length:c}}=t;for(;a<c;){const t=n.nextNode();if(null!==t){if(o++,1===t.nodeType){if(t.hasAttributes()){const e=t.attributes,{length:s}=e;let i=0;for(let t=0;t<s;t++)_(e[t].name,u)&&i++;for(;i-- >0;){const e=l[a],s=g.exec(e)[2],i=s.toLowerCase()+u,n=t.getAttribute(i);t.removeAttribute(i);const r=n.split(p);this.parts.push({type:"attribute",index:o,name:s,strings:r}),a+=r.length-1}}"TEMPLATE"===t.tagName&&(i.push(t),n.currentNode=t.content)}else if(3===t.nodeType){const e=t.data;if(e.indexOf(h)>=0){const i=t.parentNode,n=e.split(p),r=n.length-1;for(let e=0;e<r;e++){let s,r=n[e];if(""===r)s=m();else{const t=g.exec(r);null!==t&&_(t[2],u)&&(r=r.slice(0,t.index)+t[1]+t[2].slice(0,-u.length)+t[3]),s=document.createTextNode(r)}i.insertBefore(s,t),this.parts.push({type:"node",index:++o})}""===n[r]?(i.insertBefore(m(),t),s.push(t)):t.data=n[r],a+=r}}else if(8===t.nodeType)if(t.data===h){const e=t.parentNode;null!==t.previousSibling&&o!==r||(o++,e.insertBefore(m(),t)),r=o,this.parts.push({type:"node",index:o}),null===t.nextSibling?t.data="":(s.push(t),o--),a++}else{let e=-1;for(;-1!==(e=t.data.indexOf(h,e+1));)this.parts.push({type:"node",index:-1}),a++}}else n.currentNode=i.pop()}for(const t of s)t.parentNode.removeChild(t)}}const _=(t,e)=>{const s=t.length-e.length;return s>=0&&t.slice(s)===e},f=t=>-1!==t.index,m=()=>document.createComment(""),g=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F "'>=\/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/;
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -26,7 +26,7 @@ const i=new WeakMap,n=t=>"function"==typeof t&&i.has(t),r=void 0!==window.custom
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
class g{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this.options=s}update(t){let e=0;for(const s of this.__parts)void 0!==s&&s.setValue(t[e]),e++;for(const t of this.__parts)void 0!==t&&t.commit()}_clone(){const t=r?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),e=[],s=this.template.parts,i=document.createTreeWalker(t,133,null,!1);let n,o=0,a=0,l=i.nextNode();for(;o<s.length;)if(n=s[o],f(n)){for(;a<n.index;)a++,"TEMPLATE"===l.nodeName&&(e.push(l),i.currentNode=l.content),null===(l=i.nextNode())&&(i.currentNode=e.pop(),l=i.nextNode());if("node"===n.type){const t=this.processor.handleTextExpression(this.options);t.insertAfterNode(l.previousSibling),this.__parts.push(t)}else this.__parts.push(...this.processor.handleAttributeExpressions(l,n.name,n.strings,this.options));o++}else this.__parts.push(void 0),o++;return r&&(document.adoptNode(t),customElements.upgrade(t)),t}} class y{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this.options=s}update(t){let e=0;for(const s of this.__parts)void 0!==s&&s.setValue(t[e]),e++;for(const t of this.__parts)void 0!==t&&t.commit()}_clone(){const t=r?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),e=[],s=this.template.parts,i=document.createTreeWalker(t,133,null,!1);let n,o=0,a=0,l=i.nextNode();for(;o<s.length;)if(n=s[o],f(n)){for(;a<n.index;)a++,"TEMPLATE"===l.nodeName&&(e.push(l),i.currentNode=l.content),null===(l=i.nextNode())&&(i.currentNode=e.pop(),l=i.nextNode());if("node"===n.type){const t=this.processor.handleTextExpression(this.options);t.insertAfterNode(l.previousSibling),this.__parts.push(t)}else this.__parts.push(...this.processor.handleAttributeExpressions(l,n.name,n.strings,this.options));o++}else this.__parts.push(void 0),o++;return r&&(document.adoptNode(t),customElements.upgrade(t)),t}}
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -39,7 +39,7 @@ class g{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this
* Code distributed by Google as part of the polymer project is also * Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/class v{constructor(t,e,s,i){this.strings=t,this.values=e,this.type=s,this.processor=i}getHTML(){const t=this.strings.length-1;let e="",s=!1;for(let i=0;i<t;i++){const t=this.strings[i],n=t.lastIndexOf("\x3c!--");s=(n>-1||s)&&-1===t.indexOf("--\x3e",n+1);const r=y.exec(t);e+=null===r?t+(s?h:c):t.substr(0,r.index)+r[1]+r[2]+d+r[3]+h}return e+=this.strings[t]}getTemplateElement(){const t=document.createElement("template");return t.innerHTML=this.getHTML(),t}} */class v{constructor(t,e,s,i){this.strings=t,this.values=e,this.type=s,this.processor=i}getHTML(){const t=this.strings.length-1;let e="",s=!1;for(let i=0;i<t;i++){const t=this.strings[i],n=t.lastIndexOf("\x3c!--");s=(n>-1||s)&&-1===t.indexOf("--\x3e",n+1);const r=g.exec(t);e+=null===r?t+(s?h:c):t.substr(0,r.index)+r[1]+r[2]+u+r[3]+h}return e+=this.strings[t]}getTemplateElement(){const t=document.createElement("template");return t.innerHTML=this.getHTML(),t}}
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -53,7 +53,7 @@ class g{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isArray(t)||!(!t||!t[Symbol.iterator]);class w{constructor(t,e,s){this.dirty=!0,this.element=t,this.name=e,this.strings=s,this.parts=[];for(let t=0;t<s.length-1;t++)this.parts[t]=this._createPart()}_createPart(){return new P(this)}_getValue(){const t=this.strings,e=t.length-1;let s="";for(let i=0;i<e;i++){s+=t[i];const e=this.parts[i];if(void 0!==e){const t=e.value;if(S(t)||!b(t))s+="string"==typeof t?t:String(t);else for(const e of t)s+="string"==typeof e?e:String(e)}}return s+=t[e]}commit(){this.dirty&&(this.dirty=!1,this.element.setAttribute(this.name,this._getValue()))}}class P{constructor(t){this.value=void 0,this.committer=t}setValue(t){t===a||S(t)&&t===this.value||(this.value=t,n(t)||(this.committer.dirty=!0))}commit(){for(;n(this.value);){const t=this.value;this.value=a,t(this)}this.value!==a&&this.committer.commit()}}class C{constructor(t){this.value=void 0,this.__pendingValue=void 0,this.options=t}appendInto(t){this.startNode=t.appendChild(m()),this.endNode=t.appendChild(m())}insertAfterNode(t){this.startNode=t,this.endNode=t.nextSibling}appendIntoPart(t){t.__insert(this.startNode=m()),t.__insert(this.endNode=m())}insertAfterPart(t){t.__insert(this.startNode=m()),this.endNode=t.endNode,t.endNode=this.startNode}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}const t=this.__pendingValue;t!==a&&(S(t)?t!==this.value&&this.__commitText(t):t instanceof v?this.__commitTemplateResult(t):t instanceof Node?this.__commitNode(t):b(t)?this.__commitIterable(t):t===l?(this.value=l,this.clear()):this.__commitText(t))}__insert(t){this.endNode.parentNode.insertBefore(t,this.endNode)}__commitNode(t){this.value!==t&&(this.clear(),this.__insert(t),this.value=t)}__commitText(t){const e=this.startNode.nextSibling;t=null==t?"":t,e===this.endNode.previousSibling&&3===e.nodeType?e.data=t:this.__commitNode(document.createTextNode("string"==typeof t?t:String(t))),this.value=t}__commitTemplateResult(t){const e=this.options.templateFactory(t);if(this.value instanceof g&&this.value.template===e)this.value.update(t.values);else{const s=new g(e,t.processor,this.options),i=s._clone();s.update(t.values),this.__commitNode(i),this.value=s}}__commitIterable(t){Array.isArray(this.value)||(this.value=[],this.clear());const e=this.value;let s,i=0;for(const n of t)void 0===(s=e[i])&&(s=new C(this.options),e.push(s),0===i?s.appendIntoPart(this):s.insertAfterPart(e[i-1])),s.setValue(n),s.commit(),i++;i<e.length&&(e.length=i,this.clear(s&&s.endNode))}clear(t=this.startNode){o(this.startNode.parentNode,t.nextSibling,this.endNode)}}class x{constructor(t,e,s){if(this.value=void 0,this.__pendingValue=void 0,2!==s.length||""!==s[0]||""!==s[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=s}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=!!this.__pendingValue;this.value!==t&&(t?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name),this.value=t),this.__pendingValue=a}}class O extends w{constructor(t,e,s){super(t,e,s),this.single=2===s.length&&""===s[0]&&""===s[1]}_createPart(){return new T(this)}_getValue(){return this.single?this.parts[0].value:super._getValue()}commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}}class T extends P{}let N=!1;try{const t={get capture(){return N=!0,!1}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){}class A{constructor(t,e,s){this.value=void 0,this.__pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=s,this.__boundHandleEvent=t=>this.handleEvent(t)}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=this.__pendingValue,e=this.value,s=null==t||null!=e&&(t.capture!==e.capture||t.once!==e.once||t.passive!==e.passive),i=null!=t&&(null==e||s);s&&this.element.removeEventListener(this.eventName,this.__boundHandleEvent,this.__options),i&&(this.__options=j(t),this.element.addEventListener(this.eventName,this.__boundHandleEvent,this.__options)),this.value=t,this.__pendingValue=a}handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}}const j=t=>t&&(N?{capture:t.capture,passive:t.passive,once:t.once}:t.capture); const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isArray(t)||!(!t||!t[Symbol.iterator]);class w{constructor(t,e,s){this.dirty=!0,this.element=t,this.name=e,this.strings=s,this.parts=[];for(let t=0;t<s.length-1;t++)this.parts[t]=this._createPart()}_createPart(){return new P(this)}_getValue(){const t=this.strings,e=t.length-1;let s="";for(let i=0;i<e;i++){s+=t[i];const e=this.parts[i];if(void 0!==e){const t=e.value;if(S(t)||!b(t))s+="string"==typeof t?t:String(t);else for(const e of t)s+="string"==typeof e?e:String(e)}}return s+=t[e]}commit(){this.dirty&&(this.dirty=!1,this.element.setAttribute(this.name,this._getValue()))}}class P{constructor(t){this.value=void 0,this.committer=t}setValue(t){t===a||S(t)&&t===this.value||(this.value=t,n(t)||(this.committer.dirty=!0))}commit(){for(;n(this.value);){const t=this.value;this.value=a,t(this)}this.value!==a&&this.committer.commit()}}class C{constructor(t){this.value=void 0,this.__pendingValue=void 0,this.options=t}appendInto(t){this.startNode=t.appendChild(m()),this.endNode=t.appendChild(m())}insertAfterNode(t){this.startNode=t,this.endNode=t.nextSibling}appendIntoPart(t){t.__insert(this.startNode=m()),t.__insert(this.endNode=m())}insertAfterPart(t){t.__insert(this.startNode=m()),this.endNode=t.endNode,t.endNode=this.startNode}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}const t=this.__pendingValue;t!==a&&(S(t)?t!==this.value&&this.__commitText(t):t instanceof v?this.__commitTemplateResult(t):t instanceof Node?this.__commitNode(t):b(t)?this.__commitIterable(t):t===l?(this.value=l,this.clear()):this.__commitText(t))}__insert(t){this.endNode.parentNode.insertBefore(t,this.endNode)}__commitNode(t){this.value!==t&&(this.clear(),this.__insert(t),this.value=t)}__commitText(t){const e=this.startNode.nextSibling;t=null==t?"":t,e===this.endNode.previousSibling&&3===e.nodeType?e.data=t:this.__commitNode(document.createTextNode("string"==typeof t?t:String(t))),this.value=t}__commitTemplateResult(t){const e=this.options.templateFactory(t);if(this.value instanceof y&&this.value.template===e)this.value.update(t.values);else{const s=new y(e,t.processor,this.options),i=s._clone();s.update(t.values),this.__commitNode(i),this.value=s}}__commitIterable(t){Array.isArray(this.value)||(this.value=[],this.clear());const e=this.value;let s,i=0;for(const n of t)void 0===(s=e[i])&&(s=new C(this.options),e.push(s),0===i?s.appendIntoPart(this):s.insertAfterPart(e[i-1])),s.setValue(n),s.commit(),i++;i<e.length&&(e.length=i,this.clear(s&&s.endNode))}clear(t=this.startNode){o(this.startNode.parentNode,t.nextSibling,this.endNode)}}class x{constructor(t,e,s){if(this.value=void 0,this.__pendingValue=void 0,2!==s.length||""!==s[0]||""!==s[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=s}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=!!this.__pendingValue;this.value!==t&&(t?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name),this.value=t),this.__pendingValue=a}}class O extends w{constructor(t,e,s){super(t,e,s),this.single=2===s.length&&""===s[0]&&""===s[1]}_createPart(){return new T(this)}_getValue(){return this.single?this.parts[0].value:super._getValue()}commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}}class T extends P{}let N=!1;try{const t={get capture(){return N=!0,!1}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){}class A{constructor(t,e,s){this.value=void 0,this.__pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=s,this.__boundHandleEvent=t=>this.handleEvent(t)}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=this.__pendingValue,e=this.value,s=null==t||null!=e&&(t.capture!==e.capture||t.once!==e.once||t.passive!==e.passive),i=null!=t&&(null==e||s);s&&this.element.removeEventListener(this.eventName,this.__boundHandleEvent,this.__options),i&&(this.__options=j(t),this.element.addEventListener(this.eventName,this.__boundHandleEvent,this.__options)),this.value=t,this.__pendingValue=a}handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}}const j=t=>t&&(N?{capture:t.capture,passive:t.passive,once:t.once}:t.capture);
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -79,7 +79,7 @@ const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isAr
* Code distributed by Google as part of the polymer project is also * Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/function V(t){let e=k.get(t.type);void 0===e&&(e={stringsArray:new WeakMap,keyString:new Map},k.set(t.type,e));let s=e.stringsArray.get(t.strings);if(void 0!==s)return s;const i=t.strings.join(h);return void 0===(s=e.keyString.get(i))&&(s=new u(t,t.getTemplateElement()),e.keyString.set(i,s)),e.stringsArray.set(t.strings,s),s}const k=new Map,M=new WeakMap; */function V(t){let e=k.get(t.type);void 0===e&&(e={stringsArray:new WeakMap,keyString:new Map},k.set(t.type,e));let s=e.stringsArray.get(t.strings);if(void 0!==s)return s;const i=t.strings.join(h);return void 0===(s=e.keyString.get(i))&&(s=new d(t,t.getTemplateElement()),e.keyString.set(i,s)),e.stringsArray.set(t.strings,s),s}const k=new Map,M=new WeakMap;
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -120,7 +120,7 @@ const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isAr
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
const q=(t,e)=>`${t}--${e}`;let I=!0;void 0===window.ShadyCSS?I=!1:void 0===window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected. Please update to at least @webcomponents/webcomponentsjs@2.0.2 and @webcomponents/shadycss@1.3.1."),I=!1);const H=t=>e=>{const s=q(e.type,t);let i=k.get(s);void 0===i&&(i={stringsArray:new WeakMap,keyString:new Map},k.set(s,i));let n=i.stringsArray.get(e.strings);if(void 0!==n)return n;const r=e.strings.join(h);if(void 0===(n=i.keyString.get(r))){const s=e.getTemplateElement();I&&window.ShadyCSS.prepareTemplateDom(s,t),n=new u(e,s),i.keyString.set(r,n)}return i.stringsArray.set(e.strings,n),n},D=["html","svg"],L=new Set,B=(t,e,s)=>{L.add(s);const i=t.querySelectorAll("style"),{length:n}=i;if(0===n)return void window.ShadyCSS.prepareTemplateStyles(e.element,s);const r=document.createElement("style");for(let t=0;t<n;t++){const e=i[t];e.parentNode.removeChild(e),r.textContent+=e.textContent}(t=>{D.forEach(e=>{const s=k.get(q(e,t));void 0!==s&&s.keyString.forEach(t=>{const{element:{content:e}}=t,s=new Set;Array.from(e.querySelectorAll("style")).forEach(t=>{s.add(t)}),z(t,s)})})})(s);const o=e.element.content;!function(t,e,s=null){const{element:{content:i},parts:n}=t;if(null==s)return void i.appendChild(e);const r=document.createTreeWalker(i,U,null,!1);let o=$(n),a=0,l=-1;for(;r.nextNode();)for(l++,r.currentNode===s&&(a=F(e),s.parentNode.insertBefore(e,s));-1!==o&&n[o].index===l;){if(a>0){for(;-1!==o;)n[o].index+=a,o=$(n,o);return}o=$(n,o)}}(e,r,o.firstChild),window.ShadyCSS.prepareTemplateStyles(e.element,s);const a=o.querySelector("style");if(window.ShadyCSS.nativeShadow&&null!==a)t.insertBefore(a.cloneNode(!0),t.firstChild);else{o.insertBefore(r,o.firstChild);const t=new Set;t.add(r),z(e,t)}}; const q=(t,e)=>`${t}--${e}`;let I=!0;void 0===window.ShadyCSS?I=!1:void 0===window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected. Please update to at least @webcomponents/webcomponentsjs@2.0.2 and @webcomponents/shadycss@1.3.1."),I=!1);const H=t=>e=>{const s=q(e.type,t);let i=k.get(s);void 0===i&&(i={stringsArray:new WeakMap,keyString:new Map},k.set(s,i));let n=i.stringsArray.get(e.strings);if(void 0!==n)return n;const r=e.strings.join(h);if(void 0===(n=i.keyString.get(r))){const s=e.getTemplateElement();I&&window.ShadyCSS.prepareTemplateDom(s,t),n=new d(e,s),i.keyString.set(r,n)}return i.stringsArray.set(e.strings,n),n},D=["html","svg"],L=new Set,B=(t,e,s)=>{L.add(s);const i=t.querySelectorAll("style"),{length:n}=i;if(0===n)return void window.ShadyCSS.prepareTemplateStyles(e.element,s);const r=document.createElement("style");for(let t=0;t<n;t++){const e=i[t];e.parentNode.removeChild(e),r.textContent+=e.textContent}(t=>{D.forEach(e=>{const s=k.get(q(e,t));void 0!==s&&s.keyString.forEach(t=>{const{element:{content:e}}=t,s=new Set;Array.from(e.querySelectorAll("style")).forEach(t=>{s.add(t)}),z(t,s)})})})(s);const o=e.element.content;!function(t,e,s=null){const{element:{content:i},parts:n}=t;if(null==s)return void i.appendChild(e);const r=document.createTreeWalker(i,U,null,!1);let o=$(n),a=0,l=-1;for(;r.nextNode();)for(l++,r.currentNode===s&&(a=F(e),s.parentNode.insertBefore(e,s));-1!==o&&n[o].index===l;){if(a>0){for(;-1!==o;)n[o].index+=a,o=$(n,o);return}o=$(n,o)}}(e,r,o.firstChild),window.ShadyCSS.prepareTemplateStyles(e.element,s);const a=o.querySelector("style");if(window.ShadyCSS.nativeShadow&&null!==a)t.insertBefore(a.cloneNode(!0),t.firstChild);else{o.insertBefore(r,o.firstChild);const t=new Set;t.add(r),z(e,t)}};
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -162,7 +162,7 @@ const st=(t,e)=>"method"!==e.kind||!e.descriptor||"value"in e.descriptor?{kind:"
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
(window.litElementVersions||(window.litElementVersions=[])).push("2.0.1");const ot=t=>t.flat?t.flat(1/0):function t(e,s=[]){for(let i=0,n=e.length;i<n;i++){const n=e[i];Array.isArray(n)?t(n,s):s.push(n)}return s}(t);class at extends et{static finalize(){super.finalize(),this._styles=this.hasOwnProperty(JSCompiler_renameProperty("styles",this))?this._getUniqueStyles():this._styles||[]}static _getUniqueStyles(){const t=this.styles,e=[];if(Array.isArray(t)){ot(t).reduceRight((t,e)=>(t.add(e),t),new Set).forEach(t=>e.unshift(t))}else t&&e.push(t);return e}initialize(){super.initialize(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow({mode:"open"})}adoptStyles(){const t=this.constructor._styles;0!==t.length&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow?rt?this.renderRoot.adoptedStyleSheets=t.map(t=>t.styleSheet):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(t.map(t=>t.cssText),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&void 0!==window.ShadyCSS&&window.ShadyCSS.styleElement(this)}update(t){super.update(t);const e=this.render();e instanceof v&&this.constructor.render(e,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach(t=>{const e=document.createElement("style");e.textContent=t.cssText,this.renderRoot.appendChild(e)}))}render(){}}at.finalized=!0,at.render=(t,e,s)=>{const i=s.scopeName,n=M.has(e),r=I&&11===e.nodeType&&!!e.host&&t instanceof v,a=r&&!L.has(i),l=a?document.createDocumentFragment():e;if(((t,e,s)=>{let i=M.get(e);void 0===i&&(o(e,e.firstChild),M.set(e,i=new C(Object.assign({templateFactory:V},s))),i.appendInto(e)),i.setValue(t),i.commit()})(t,l,Object.assign({templateFactory:H(i)},s)),a){const t=M.get(l);M.delete(l),t.value instanceof g&&B(l,t.value.template,i),o(e,e.firstChild),e.appendChild(l),M.set(e,t)}!n&&r&&window.ShadyCSS.styleElement(e.host)};const lt=(t,e)=>0!=(t.attributes.supported_features&e);class ht{constructor(t,e){this.hass=t,this.stateObj=e,this._attr=e.attributes,this._feat=this._attr.supported_features}get isFullyOpen(){return void 0!==this._attr.current_position?100===this._attr.current_position:"open"===this.stateObj.state}get isFullyClosed(){return void 0!==this._attr.current_position?0===this._attr.current_position:"closed"===this.stateObj.state}get isFullyOpenTilt(){return 100===this._attr.current_tilt_position}get isFullyClosedTilt(){return 0===this._attr.current_tilt_position}get isOpening(){return"opening"===this.stateObj.state}get isClosing(){return"closing"===this.stateObj.state}get supportsOpen(){return lt(this.stateObj,1)}get supportsClose(){return lt(this.stateObj,2)}get supportsSetPosition(){return lt(this.stateObj,4)}get supportsStop(){return lt(this.stateObj,8)}get supportsOpenTilt(){return lt(this.stateObj,16)}get supportsCloseTilt(){return lt(this.stateObj,32)}get supportsStopTilt(){return lt(this.stateObj,64)}get supportsSetTiltPosition(){return lt(this.stateObj,128)}get isTiltOnly(){const t=this.supportsOpen||this.supportsClose||this.supportsStop;return(this.supportsOpenTilt||this.supportsCloseTilt||this.supportsStopTilt)&&!t}openCover(){this.callService("open_cover")}closeCover(){this.callService("close_cover")}stopCover(){this.callService("stop_cover")}openCoverTilt(){this.callService("open_cover_tilt")}closeCoverTilt(){this.callService("close_cover_tilt")}stopCoverTilt(){this.callService("stop_cover_tilt")}setCoverPosition(t){this.callService("set_cover_position",{position:t})}setCoverTiltPosition(t){this.callService("set_cover_tilt_position",{tilt_position:t})}callService(t,e={}){e.entity_id=this.stateObj.entity_id,this.hass.callService("cover",t,e)}}s.d(e,"StateCardCustomCover",function(){return pt});var ct=function(t,e,s,i){var n,r=arguments.length,o=r<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,s,i);else for(var a=t.length-1;a>=0;a--)(n=t[a])&&(o=(r<3?n(o):r>3?n(e,s,o):n(e,s))||o);return r>3&&o&&Object.defineProperty(e,s,o),o};let pt=class extends at{constructor(){super(...arguments),this.inDialog=!1}get stateObj(){return this.hass&&this._config?this.hass.states[this._config.entity]:null}setConfig(t){if(!t||!t.entity)throw new Error("Invalid configuration");this._config=t}get entityObj(){if(this.hass&&this.stateObj)return new ht(this.hass,this.stateObj);throw new Error("Trying to get entityObj before setting hass & config")}static getCardSize(){return 1}stateInfoTemplate(){return R` (window.litElementVersions||(window.litElementVersions=[])).push("2.0.1");const ot=t=>t.flat?t.flat(1/0):function t(e,s=[]){for(let i=0,n=e.length;i<n;i++){const n=e[i];Array.isArray(n)?t(n,s):s.push(n)}return s}(t);class at extends et{static finalize(){super.finalize(),this._styles=this.hasOwnProperty(JSCompiler_renameProperty("styles",this))?this._getUniqueStyles():this._styles||[]}static _getUniqueStyles(){const t=this.styles,e=[];if(Array.isArray(t)){ot(t).reduceRight((t,e)=>(t.add(e),t),new Set).forEach(t=>e.unshift(t))}else t&&e.push(t);return e}initialize(){super.initialize(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow({mode:"open"})}adoptStyles(){const t=this.constructor._styles;0!==t.length&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow?rt?this.renderRoot.adoptedStyleSheets=t.map(t=>t.styleSheet):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(t.map(t=>t.cssText),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&void 0!==window.ShadyCSS&&window.ShadyCSS.styleElement(this)}update(t){super.update(t);const e=this.render();e instanceof v&&this.constructor.render(e,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach(t=>{const e=document.createElement("style");e.textContent=t.cssText,this.renderRoot.appendChild(e)}))}render(){}}at.finalized=!0,at.render=(t,e,s)=>{const i=s.scopeName,n=M.has(e),r=I&&11===e.nodeType&&!!e.host&&t instanceof v,a=r&&!L.has(i),l=a?document.createDocumentFragment():e;if(((t,e,s)=>{let i=M.get(e);void 0===i&&(o(e,e.firstChild),M.set(e,i=new C(Object.assign({templateFactory:V},s))),i.appendInto(e)),i.setValue(t),i.commit()})(t,l,Object.assign({templateFactory:H(i)},s)),a){const t=M.get(l);M.delete(l),t.value instanceof y&&B(l,t.value.template,i),o(e,e.firstChild),e.appendChild(l),M.set(e,t)}!n&&r&&window.ShadyCSS.styleElement(e.host)};const lt=(t,e)=>0!=(t.attributes.supported_features&e);class ht{constructor(t,e){this.hass=t,this.stateObj=e,this._attr=e.attributes,this._feat=this._attr.supported_features}get isFullyOpen(){return void 0!==this._attr.current_position?100===this._attr.current_position:"open"===this.stateObj.state}get isFullyClosed(){return void 0!==this._attr.current_position?0===this._attr.current_position:"closed"===this.stateObj.state}get isFullyOpenTilt(){return 100===this._attr.current_tilt_position}get isFullyClosedTilt(){return 0===this._attr.current_tilt_position}get isOpening(){return"opening"===this.stateObj.state}get isClosing(){return"closing"===this.stateObj.state}get supportsOpen(){return lt(this.stateObj,1)}get supportsClose(){return lt(this.stateObj,2)}get supportsSetPosition(){return lt(this.stateObj,4)}get supportsStop(){return lt(this.stateObj,8)}get supportsOpenTilt(){return lt(this.stateObj,16)}get supportsCloseTilt(){return lt(this.stateObj,32)}get supportsStopTilt(){return lt(this.stateObj,64)}get supportsSetTiltPosition(){return lt(this.stateObj,128)}get isTiltOnly(){const t=this.supportsOpen||this.supportsClose||this.supportsStop;return(this.supportsOpenTilt||this.supportsCloseTilt||this.supportsStopTilt)&&!t}openCover(){this.callService("open_cover")}closeCover(){this.callService("close_cover")}stopCover(){this.callService("stop_cover")}openCoverTilt(){this.callService("open_cover_tilt")}closeCoverTilt(){this.callService("close_cover_tilt")}stopCoverTilt(){this.callService("stop_cover_tilt")}setCoverPosition(t){this.callService("set_cover_position",{position:t})}setCoverTiltPosition(t){this.callService("set_cover_tilt_position",{tilt_position:t})}callService(t,e={}){e.entity_id=this.stateObj.entity_id,this.hass.callService("cover",t,e)}}s.d(e,"StateCardCustomCover",function(){return pt});var ct=function(t,e,s,i){var n,r=arguments.length,o=r<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,s,i);else for(var a=t.length-1;a>=0;a--)(n=t[a])&&(o=(r<3?n(o):r>3?n(e,s,o):n(e,s))||o);return r>3&&o&&Object.defineProperty(e,s,o),o};let pt=class extends at{constructor(){super(...arguments),this.inDialog=!1}get stateObj(){return this.hass&&this._config?this.hass.states[this._config.entity]:null}setConfig(t){if(!t||!t.entity)throw new Error("Invalid configuration");this._config=t}get entityObj(){if(this.hass&&this.stateObj)return new ht(this.hass,this.stateObj);throw new Error("Trying to get entityObj before setting hass & config")}static getCardSize(){return 1}stateInfoTemplate(){return R`
State info template State info template
`}render(){if(!this._config||!this.hass)return R``;const t=this.entityObj,e=this.hass.states[this._config.entity];return e?R` `}render(){if(!this._config||!this.hass)return R``;const t=this.entityObj,e=this.hass.states[this._config.entity];return e?R`
<style include="iron-flex iron-flex-alignment"></style> <style include="iron-flex iron-flex-alignment"></style>
@ -179,6 +179,10 @@ const st=(t,e)=>"method"!==e.kind||!e.descriptor||"value"in e.descriptor?{kind:"
--mdc-icon-size: 25px; --mdc-icon-size: 25px;
} }
ha-icon {
height: auto;
}
[invisible] { [invisible] {
visibility: hidden !important; visibility: hidden !important;
} }
@ -189,17 +193,23 @@ const st=(t,e)=>"method"!==e.kind||!e.descriptor||"value"in e.descriptor?{kind:"
<ha-icon-button <ha-icon-button
icon="hass:menu" icon="hass:menu"
@click=${this.onHalfOpenTap} @click=${this.onHalfOpenTap}
></ha-icon-button> >
<ha-icon icon="hass:menu"> </ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-up" icon="hass:arrow-up"
@click=${this.onOpenTap} @click=${this.onOpenTap}
.disabled="${this.computeOpenDisabled(e,this.entityObj)}" .disabled="${this.computeOpenDisabled(e,this.entityObj)}"
></ha-icon-button> >
<ha-icon icon="hass:arrow-up"> </ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-down" icon="hass:arrow-down"
@click=${this.onCloseTap} @click=${this.onCloseTap}
.disabled="${this.computeClosedDisabled(e,t)}" .disabled="${this.computeClosedDisabled(e,t)}"
></ha-icon-button> >
<ha-icon icon="hass:arrow-down"> </ha-icon>
</ha-icon-button>
</div> </div>
</hui-generic-entity-row> </hui-generic-entity-row>
`:R` `:R`

View File

@ -83,6 +83,10 @@ export class StateCardCustomCover extends LitElement {
--mdc-icon-size: 25px; --mdc-icon-size: 25px;
} }
ha-icon {
height: auto;
}
[invisible] { [invisible] {
visibility: hidden !important; visibility: hidden !important;
} }
@ -93,17 +97,23 @@ export class StateCardCustomCover extends LitElement {
<ha-icon-button <ha-icon-button
icon="hass:menu" icon="hass:menu"
@click=${this.onHalfOpenTap} @click=${this.onHalfOpenTap}
></ha-icon-button> >
<ha-icon icon="hass:menu"> </ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-up" icon="hass:arrow-up"
@click=${this.onOpenTap} @click=${this.onOpenTap}
.disabled="${this.computeOpenDisabled(stateObj, this.entityObj)}" .disabled="${this.computeOpenDisabled(stateObj, this.entityObj)}"
></ha-icon-button> >
<ha-icon icon="hass:arrow-up"> </ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-down" icon="hass:arrow-down"
@click=${this.onCloseTap} @click=${this.onCloseTap}
.disabled="${this.computeClosedDisabled(stateObj, entityObj)}" .disabled="${this.computeClosedDisabled(stateObj, entityObj)}"
></ha-icon-button> >
<ha-icon icon="hass:arrow-down"> </ha-icon>
</ha-icon-button>
</div> </div>
</hui-generic-entity-row> </hui-generic-entity-row>
`; `;

8
known_devices.yaml Normal file
View File

@ -0,0 +1,8 @@
martins_ipad:
hide_if_away: false
icon:
mac:
name: Martins iPad
picture:
track: true

416
knx_conf.yaml Normal file
View File

@ -0,0 +1,416 @@
# Dont' edit manually! this is generated!
sensor:
- name: Gang Bewegungsmelder West Helligkeit
state_address: 0/0/42
type: illuminance
- name: Gang Bewegungsmelder Mitte Helligkeit
state_address: 0/0/45
type: illuminance
- name: Gang Bewegungsmelder Ost Helligkeit
state_address: 0/0/48
type: illuminance
- name: Esszimmer Temperatur
state_address: 0/0/6
type: temperature
- name: Treppenhaus Oben Temperatur
state_address: 0/0/5
type: temperature
- name: Eingangsbereich Temperatur
state_address: 0/0/24
type: temperature
- name: Wohnzimmer Gang Temperatur
state_address: 0/0/25
type: temperature
- name: Wohnzimmer Terassentür Temperatur
state_address: 0/0/26
type: temperature
- name: Vorratsraum Steckdose 1 Betriebsstunden
state_address: 0/5/62
type: 2byte_unsigned
- name: Vorratsraum Steckdose 1 Verbrauch mA
state_address: 0/5/65
type: DPT-9
- name: Vorratsraum Steckdose 1 Verbrauch Summe
state_address: 0/5/70
type: 4byte_unsigned
- name: Vorratsraum Steckdose 2 Betriebsstunden
state_address: 0/5/80
type: 2byte_unsigned
- name: Vorratsraum Steckdose 2 Verbrauch mA
state_address: 0/5/83
type: DPT-9
- name: Vorratsraum Steckdose 2 Verbrauch Summe
state_address: 0/5/88
type: 4byte_unsigned
- name: Gefrierschrank Betriebsstunden
state_address: 0/5/98
type: 2byte_unsigned
- name: Gefrierschrank Verbrauch mA
state_address: 0/5/101
type: DPT-9
- name: Gefrierschrank Verbrauch Summe
state_address: 0/5/106
type: 4byte_unsigned
- name: Trockner Betriebsstunden
state_address: 0/5/26
type: 2byte_unsigned
- name: Trockner Verbrauch mA
state_address: 0/5/29
type: DPT-9
- name: Trockner Verbrauch Summe
state_address: 0/5/34
type: 4byte_unsigned
- name: Waschmaschine Betriebsstunden
state_address: 0/5/8
type: 2byte_unsigned
- name: Waschmaschine Verbrauch mA
state_address: 0/5/11
type: DPT-9
- name: Waschmaschine Verbrauch Summe
state_address: 0/5/16
type: 4byte_unsigned
- name: Küche Steckdosen rechts Betriebsstunden
state_address: 0/4/98
type: 2byte_unsigned
- name: Küche Steckdosen rechts Verbrauch mA
state_address: 0/4/101
type: DPT-9
- name: Küche Steckdosen rechts Verbrauch Summe
state_address: 0/4/106
type: 4byte_unsigned
- name: Dunstabzug Betriebsstunden
state_address: 0/4/116
type: 2byte_unsigned
- name: Dunstabzug Verbrauch mA
state_address: 0/4/119
type: DPT-9
- name: Dunstabzug Verbrauch Summe
state_address: 0/4/124
type: 4byte_unsigned
- name: Spülmaschine Betriebsstunden
state_address: 0/4/8
type: 2byte_unsigned
- name: Spülmaschine Verbrauch mA
state_address: 0/4/11
type: DPT-9
- name: Backofen Betriebsstunden
state_address: 0/4/26
type: 2byte_unsigned
- name: Backofen Verbrauch mA
state_address: 0/4/29
type: DPT-9
- name: Backofen Verbrauch Summe
state_address: 0/4/34
type: 4byte_unsigned
- name: Herd Phase 1 Betriebsstunden
state_address: 0/4/44
type: 2byte_unsigned
- name: Herd Phase 1 Verbrauch mA
state_address: 0/4/47
type: DPT-9
- name: Herd Phase 1 Verbrauch Summe
state_address: 0/4/52
type: 4byte_unsigned
- name: Herd Phase 2 Betriebsstunden
state_address: 0/4/62
type: 2byte_unsigned
- name: Herd Phase 2 Verbrauch mA
state_address: 0/4/65
type: DPT-9
- name: Herd Phase 2 Verbrauch Summe
state_address: 0/4/70
type: 4byte_unsigned
- name: Herd Phase 3 Betriebsstunden
state_address: 0/4/80
type: 2byte_unsigned
- name: Herd Phase 3 Verbrauch mA
state_address: 0/4/83
type: DPT-9
- name: Herd Phase 3 Verbrauch Summe
state_address: 0/4/88
type: 4byte_unsigned
- name: Arbeitszimmer Steckdose Betriebsstunden
state_address: 0/4/134
type: 2byte_unsigned
- name: Arbeitszimmer Steckdose Verbrauch mA
state_address: 0/4/137
type: DPT-9
- name: Arbeitszimmer Steckdose Verbrauch Summe
state_address: 0/4/142
type: 4byte_unsigned
- name: Wohnzimmer Steckdose 1 Betriebsstunden
state_address: 0/4/152
type: 2byte_unsigned
- name: Wohnzimmer Steckdose 1 Verbrauch mA
state_address: 0/4/155
type: DPT-9
- name: Wohnzimmer Steckdose 1 Verbrauch Summe
state_address: 0/4/160
type: 4byte_unsigned
- name: Wohnzimmer Steckdose 2 Betriebsstunden
state_address: 0/4/170
type: 2byte_unsigned
- name: Wohnzimmer Steckdose 2 Verbrauch mA
state_address: 0/4/173
type: DPT-9
- name: Wohnzimmer Steckdose 2 Verbrauch Summe
state_address: 0/4/178
type: 4byte_unsigned
binary_sensor:
- name: Gang Bewegungsmelder Schlafzimmer
state_address: 0/0/40
device_class: motion
- name: Gang Bewegungsmelder Wohnzimmer
state_address: 0/0/41
device_class: motion
- name: Gang Bewegungsmelder Mitte
state_address: 0/0/44
device_class: motion
- name: Gang Bewegungsmelder Ost
state_address: 0/0/47
device_class: motion
light:
- name: Wohnzimmer Deckenlampe
address: 0/1/3
state_address: 0/1/8
brightness_address: 0/1/7
brightness_state_address: 0/1/9
- name: Esszimmer Deckenlampe West
address: 0/1/21
state_address: 0/1/26
brightness_address: 0/1/25
brightness_state_address: 0/1/27
- name: Esszimmer Deckenlampe Mitte
address: 0/1/39
state_address: 0/1/44
brightness_address: 0/1/43
brightness_state_address: 0/1/45
- name: Esszimmer Schrankleuchte
address: 0/2/39
state_address: 0/2/44
brightness_address: 0/2/43
brightness_state_address: 0/2/45
- name: Küche Deckenlampe
address: 0/1/57
state_address: 0/1/62
brightness_address: 0/1/61
brightness_state_address: 0/1/63
- name: Aussen Terassenlicht
address: 0/2/21
state_address: 0/2/26
brightness_address: 0/2/25
brightness_state_address: 0/2/27
- name: Gang Licht
address: 0/3/3
state_address: 0/3/8
brightness_address: 0/3/7
brightness_state_address: 0/3/9
- name: Bad Licht
address: 0/3/21
state_address: 0/3/26
brightness_address: 0/3/25
brightness_state_address: 0/3/27
- name: Gang Einganglicht
address: 0/3/39
state_address: 0/3/44
brightness_address: 0/3/43
brightness_state_address: 0/3/45
- name: Waschküche Licht
address: 0/3/57
state_address: 0/3/62
brightness_address: 0/3/61
brightness_state_address: 0/3/63
- name: Haustür Licht
address: 0/0/1
state_address: 0/0/2
- name: Haustür Licht NW
address: 0/0/3
state_address: 0/0/4
- name: Treppenhaus Licht
address: 0/5/180
state_address: 0/5/185
- name: Vorratsraum Licht
address: 0/5/36
state_address: 0/5/41
- name: Bewegungsmelder Mitte LED
address: 0/0/46
- name: Bewegungsmelder West LED
address: 0/0/43
- name: Bewegungsmelder Ost LED
address: 0/0/49
cover:
- name: Wohnzimmer Fenster Rollo
move_long_address: 0/7/10
move_short_address: 0/7/11
position_address: 0/7/28
position_state_address: 0/7/24
- name: Wohnzimmer Terrassentür Rollo
move_long_address: 0/7/36
move_short_address: 0/7/37
position_address: 0/7/54
position_state_address: 0/7/50
- name: Küche Fenster Rollo
move_long_address: 0/7/62
move_short_address: 0/7/63
position_address: 0/7/80
position_state_address: 0/7/76
- name: Esszimmer Fenster Rollo
move_long_address: 0/7/88
move_short_address: 0/7/89
position_address: 0/7/106
position_state_address: 0/7/102
switch:
- name: Klingel Oben
address: 0/0/15
state_address: 0/0/15
- name: Klingel Innentür
address: 0/5/108
state_address: 0/5/113
- name: Klingel Außentür
address: 0/5/126
state_address: 0/5/131
- name: Esszimmer Szene 0
address: 0/0/11
state_address: 0/0/11
- name: Esszimmer Szene 1
address: 0/0/12
state_address: 0/0/12
- name: Esszimmer Szene 2
address: 0/0/9
state_address: 0/0/9
- name: Esszimmer Szene 3
address: 0/0/10
state_address: 0/0/10
- name: Esszimmer Szene 4
address: 0/0/8
state_address: 0/0/8
- name: Esszimmer Szene 5
address: 0/0/19
state_address: 0/0/19
- name: Wohnzimmer Szene 0
address: 0/0/27
state_address: 0/0/27
- name: Wohnzimmer Szene 1
address: 0/0/28
state_address: 0/0/28
- name: Wohnzimmer Szene 2
address: 0/0/29
state_address: 0/0/29
- name: Wohnzimmer Szene 3
address: 0/0/30
state_address: 0/0/30
- name: Wohnzimmer Szene 4
address: 0/0/31
state_address: 0/0/31
- name: Wohnzimmer Szene 5
address: 0/0/32
state_address: 0/0/32
- name: Eingang Szene 2
address: 0/0/20
state_address: 0/0/20
- name: Eingang Szene 3
address: 0/0/21
state_address: 0/0/21
- name: Eingang Szene 4
address: 0/0/22
state_address: 0/0/22
- name: Eingang Szene 5
address: 0/0/23
state_address: 0/0/23
- name: Wohnzimmer Terrassentür Szene 2
address: 0/0/17
state_address: 0/0/17
- name: Wohnzimmer Terrassentür Szene 3
address: 0/0/18
state_address: 0/0/18
- name: alarm_led_links_normal
address: 0/0/7
state_address: 0/0/7
- name: alarm_led_links_ueberlagert
address: 0/0/13
state_address: 0/0/13
- name: alarm_led_rechts_normal
address: 0/0/14
state_address: 0/0/14
- name: alarm_led_rechts_ueberlagert
address: 0/0/16
state_address: 0/0/16
- name: wc_licht_taster
address: 0/5/198
state_address: 0/5/198
- name: Vorratsraum Steckdose 1
address: 0/5/54
state_address: 0/5/59
- name: Vorratsraum Steckdose 1 Betriebsstunden Reset
address: 0/5/63
- name: Vorratsraum Steckdose 2
address: 0/5/72
state_address: 0/5/77
- name: Vorratsraum Steckdose 2 Betriebsstunden Reset
address: 0/5/81
- name: Gefrierschrank
address: 0/5/90
state_address: 0/5/95
- name: Gefrierschrank Betriebsstunden Reset
address: 0/5/99
- name: Trockner
address: 0/5/18
state_address: 0/5/23
- name: Trockner Betriebsstunden Reset
address: 0/5/27
- name: Waschmaschine
address: 0/5/0
state_address: 0/5/5
- name: Waschmaschine Betriebsstunden Reset
address: 0/5/9
- name: Küche Steckdosen rechts
address: 0/4/90
state_address: 0/4/95
- name: Küche Steckdosen rechts Betriebsstunden Reset
address: 0/4/99
- name: Dunstabzug
address: 0/4/108
state_address: 0/4/113
- name: Dunstabzug Betriebsstunden Reset
address: 0/4/117
- name: Spülmaschine
address: 0/4/0
state_address: 0/4/5
- name: Spülmaschine Betriebsstunden Reset
address: 0/4/9
- name: Backofen
address: 0/4/18
state_address: 0/4/23
- name: Backofen Betriebsstunden Reset
address: 0/4/27
- name: Herd Phase 1
address: 0/4/36
state_address: 0/4/41
- name: Herd Phase 1 Betriebsstunden Reset
address: 0/4/45
- name: Herd Phase 2
address: 0/4/54
state_address: 0/4/59
- name: Herd Phase 2 Betriebsstunden Reset
address: 0/4/63
- name: Herd Phase 3
address: 0/4/72
state_address: 0/4/77
- name: Herd Phase 3 Betriebsstunden Reset
address: 0/4/81
- name: Arbeitszimmer Steckdose
address: 0/4/126
state_address: 0/4/131
- name: Arbeitszimmer Steckdose Betriebsstunden Reset
address: 0/4/135
- name: Wohnzimmer Steckdose 1
address: 0/4/144
state_address: 0/4/149
- name: Wohnzimmer Steckdose 1 Betriebsstunden Reset
address: 0/4/153
- name: Wohnzimmer Steckdose 2
address: 0/4/162
state_address: 0/4/167
- name: Wohnzimmer Steckdose 2 Betriebsstunden Reset
address: 0/4/171

View File

@ -1,4 +1,5 @@
apps: apps:
bad_luefter
ir_remote_kitchenpi ir_remote_kitchenpi
ir_remote_oben ir_remote_oben
ir_remote_schlafzimmer ir_remote_schlafzimmer

View File

@ -15,6 +15,11 @@ def timed_sleep_f(content, light_off_mins, music_off_mins, shuffle):
return f return f
@state_trigger("switch.tasmota07 == 'on'")
def foen_auto_off():
timer.fon_timer.start(duration="00:45:00")
@event_trigger("ir_command_received", "host == 'bedroompi.fritz.box' and repeat_counter == 0") @event_trigger("ir_command_received", "host == 'bedroompi.fritz.box' and repeat_counter == 0")
def ir_remote_schlafzimmer(button_name=None, **kwargs): def ir_remote_schlafzimmer(button_name=None, **kwargs):
p = {'player': 'media_player.bedroompi'} p = {'player': 'media_player.bedroompi'}
@ -36,7 +41,7 @@ def ir_remote_schlafzimmer(button_name=None, **kwargs):
'btn_0': radio_f('Bayern 3', **p), 'btn_0': radio_f('Bayern 3', **p),
'key_numeric_pound': radio_f('Bayern 2', **p), 'key_numeric_pound': radio_f('Bayern 2', **p),
'key_numeric_star': radio_f('Antenne Bayern', **player), #'key_numeric_star': lambda: timer.fon_timer.start(duration="00:10:00"),
'key_red': scene_f('schlafzimmer_stillen'), 'key_red': scene_f('schlafzimmer_stillen'),
'key_green': scene_f('schlafzimmer_orange'), 'key_green': scene_f('schlafzimmer_orange'),
@ -51,9 +56,10 @@ def ir_remote_schlafzimmer(button_name=None, **kwargs):
if button_name in mapping: if button_name in mapping:
mapping[button_name]() mapping[button_name]()
elif button_name == "key_numeric_star": # Foen elif button_name == "key_numeric_star": # Foen
repeat_one_crossfade(**p) #repeat_one_crossfade(**p)
media_player.play_media(media_content_id='Foen', media_content_type='music', entity_id=p['player']) #media_player.play_media(media_content_id='Foen', media_content_type='music', entity_id=p['player'])
media_player.volume_set(volume_level=60, entity_id=p['player']) #media_player.volume_set(volume_level=60, entity_id=p['player'])
timer.fon_timer.start(duration="00:10:00")
elif button_name == 'key_power': # Music & Lights off elif button_name == 'key_power': # Music & Lights off
media_player.media_pause(entity_id=p['player']) media_player.media_pause(entity_id=p['player'])
light.turn_off(entity_id='group.bedroom') light.turn_off(entity_id='group.bedroom')

View File

@ -1,11 +1,30 @@
@event_trigger("homematic.keypress", "name == 'schlafzimmer_deckenlampe'")
def schlafzimmer_licht(channel=None, param=None):
up = (channel == 1)
long = (param == "PRESS_LONG")
# TODO
# oben: kurz: orange szene # oben: kurz: orange szene
# lang: helle szene # lang: helle szene
# unten: kurz: off, but 1 min bedlight # unten: kurz: off, but 1 min bedlight
# lang: rollos zu # lang: rollos zu: nur tagsueber wenn komplett offen
@event_trigger("homematic.keypress", "name == 'schlafzimmer_deckenlampe'")
def schlafzimmer_licht(channel=None, param=None, **kwargs):
up = (channel == 2)
down = (channel == 1)
long = (param == "PRESS_LONG")
short = not long
log.info(f"Schlafzimmer knopf up {up}, long {long}")
if up and short:
scene.schlafzimmer_orange.turn_on()
elif up and long:
scene.schlafzimmer_ganz_hell.turn_on()
elif down and short:
light.turn_off(entity_id='group.bedroom')
scene.schlafzimmer_bettlicht_dunkel.turn_on()
task.wait_until(timeout=60)
light.bett_martin.turn_off()
light.bett_rebecca.turn_off()
elif down and long:
during_day = float(sun.sun.elevation) > 5
covers_fully_open = (int(cover.schlafzimmer_rollo_gross.current_position) > 95 or
int(cover.schlafzimmer_rollo_klein.current_position) > 95)
if during_day and covers_fully_open:
cover.schlafzimmer_rollo_gross.close_cover()
cover_half.set_half(entity_id="cover.schlafzimmer_rollo_klein")

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
const i=new WeakMap,n=t=>"function"==typeof t&&i.has(t),r=void 0!==window.customElements&&void 0!==window.customElements.polyfillWrapFlushCallback,o=(t,e,s=null)=>{for(;e!==s;){const s=e.nextSibling;t.removeChild(e),e=s}},a={},l={},h=`{{lit-${String(Math.random()).slice(2)}}}`,c=`\x3c!--${h}--\x3e`,p=new RegExp(`${h}|${c}`),d="$lit$";class u{constructor(t,e){this.parts=[],this.element=e;const s=[],i=[],n=document.createTreeWalker(e.content,133,null,!1);let r=0,o=-1,a=0;const{strings:l,values:{length:c}}=t;for(;a<c;){const t=n.nextNode();if(null!==t){if(o++,1===t.nodeType){if(t.hasAttributes()){const e=t.attributes,{length:s}=e;let i=0;for(let t=0;t<s;t++)_(e[t].name,d)&&i++;for(;i-- >0;){const e=l[a],s=y.exec(e)[2],i=s.toLowerCase()+d,n=t.getAttribute(i);t.removeAttribute(i);const r=n.split(p);this.parts.push({type:"attribute",index:o,name:s,strings:r}),a+=r.length-1}}"TEMPLATE"===t.tagName&&(i.push(t),n.currentNode=t.content)}else if(3===t.nodeType){const e=t.data;if(e.indexOf(h)>=0){const i=t.parentNode,n=e.split(p),r=n.length-1;for(let e=0;e<r;e++){let s,r=n[e];if(""===r)s=m();else{const t=y.exec(r);null!==t&&_(t[2],d)&&(r=r.slice(0,t.index)+t[1]+t[2].slice(0,-d.length)+t[3]),s=document.createTextNode(r)}i.insertBefore(s,t),this.parts.push({type:"node",index:++o})}""===n[r]?(i.insertBefore(m(),t),s.push(t)):t.data=n[r],a+=r}}else if(8===t.nodeType)if(t.data===h){const e=t.parentNode;null!==t.previousSibling&&o!==r||(o++,e.insertBefore(m(),t)),r=o,this.parts.push({type:"node",index:o}),null===t.nextSibling?t.data="":(s.push(t),o--),a++}else{let e=-1;for(;-1!==(e=t.data.indexOf(h,e+1));)this.parts.push({type:"node",index:-1}),a++}}else n.currentNode=i.pop()}for(const t of s)t.parentNode.removeChild(t)}}const _=(t,e)=>{const s=t.length-e.length;return s>=0&&t.slice(s)===e},f=t=>-1!==t.index,m=()=>document.createComment(""),y=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F "'>=\/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/; const i=new WeakMap,n=t=>"function"==typeof t&&i.has(t),r=void 0!==window.customElements&&void 0!==window.customElements.polyfillWrapFlushCallback,o=(t,e,s=null)=>{for(;e!==s;){const s=e.nextSibling;t.removeChild(e),e=s}},a={},l={},h=`{{lit-${String(Math.random()).slice(2)}}}`,c=`\x3c!--${h}--\x3e`,p=new RegExp(`${h}|${c}`),u="$lit$";class d{constructor(t,e){this.parts=[],this.element=e;const s=[],i=[],n=document.createTreeWalker(e.content,133,null,!1);let r=0,o=-1,a=0;const{strings:l,values:{length:c}}=t;for(;a<c;){const t=n.nextNode();if(null!==t){if(o++,1===t.nodeType){if(t.hasAttributes()){const e=t.attributes,{length:s}=e;let i=0;for(let t=0;t<s;t++)_(e[t].name,u)&&i++;for(;i-- >0;){const e=l[a],s=g.exec(e)[2],i=s.toLowerCase()+u,n=t.getAttribute(i);t.removeAttribute(i);const r=n.split(p);this.parts.push({type:"attribute",index:o,name:s,strings:r}),a+=r.length-1}}"TEMPLATE"===t.tagName&&(i.push(t),n.currentNode=t.content)}else if(3===t.nodeType){const e=t.data;if(e.indexOf(h)>=0){const i=t.parentNode,n=e.split(p),r=n.length-1;for(let e=0;e<r;e++){let s,r=n[e];if(""===r)s=m();else{const t=g.exec(r);null!==t&&_(t[2],u)&&(r=r.slice(0,t.index)+t[1]+t[2].slice(0,-u.length)+t[3]),s=document.createTextNode(r)}i.insertBefore(s,t),this.parts.push({type:"node",index:++o})}""===n[r]?(i.insertBefore(m(),t),s.push(t)):t.data=n[r],a+=r}}else if(8===t.nodeType)if(t.data===h){const e=t.parentNode;null!==t.previousSibling&&o!==r||(o++,e.insertBefore(m(),t)),r=o,this.parts.push({type:"node",index:o}),null===t.nextSibling?t.data="":(s.push(t),o--),a++}else{let e=-1;for(;-1!==(e=t.data.indexOf(h,e+1));)this.parts.push({type:"node",index:-1}),a++}}else n.currentNode=i.pop()}for(const t of s)t.parentNode.removeChild(t)}}const _=(t,e)=>{const s=t.length-e.length;return s>=0&&t.slice(s)===e},f=t=>-1!==t.index,m=()=>document.createComment(""),g=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F "'>=\/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/;
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -26,7 +26,7 @@ const i=new WeakMap,n=t=>"function"==typeof t&&i.has(t),r=void 0!==window.custom
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
class g{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this.options=s}update(t){let e=0;for(const s of this.__parts)void 0!==s&&s.setValue(t[e]),e++;for(const t of this.__parts)void 0!==t&&t.commit()}_clone(){const t=r?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),e=[],s=this.template.parts,i=document.createTreeWalker(t,133,null,!1);let n,o=0,a=0,l=i.nextNode();for(;o<s.length;)if(n=s[o],f(n)){for(;a<n.index;)a++,"TEMPLATE"===l.nodeName&&(e.push(l),i.currentNode=l.content),null===(l=i.nextNode())&&(i.currentNode=e.pop(),l=i.nextNode());if("node"===n.type){const t=this.processor.handleTextExpression(this.options);t.insertAfterNode(l.previousSibling),this.__parts.push(t)}else this.__parts.push(...this.processor.handleAttributeExpressions(l,n.name,n.strings,this.options));o++}else this.__parts.push(void 0),o++;return r&&(document.adoptNode(t),customElements.upgrade(t)),t}} class y{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this.options=s}update(t){let e=0;for(const s of this.__parts)void 0!==s&&s.setValue(t[e]),e++;for(const t of this.__parts)void 0!==t&&t.commit()}_clone(){const t=r?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),e=[],s=this.template.parts,i=document.createTreeWalker(t,133,null,!1);let n,o=0,a=0,l=i.nextNode();for(;o<s.length;)if(n=s[o],f(n)){for(;a<n.index;)a++,"TEMPLATE"===l.nodeName&&(e.push(l),i.currentNode=l.content),null===(l=i.nextNode())&&(i.currentNode=e.pop(),l=i.nextNode());if("node"===n.type){const t=this.processor.handleTextExpression(this.options);t.insertAfterNode(l.previousSibling),this.__parts.push(t)}else this.__parts.push(...this.processor.handleAttributeExpressions(l,n.name,n.strings,this.options));o++}else this.__parts.push(void 0),o++;return r&&(document.adoptNode(t),customElements.upgrade(t)),t}}
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -39,7 +39,7 @@ class g{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this
* Code distributed by Google as part of the polymer project is also * Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/class v{constructor(t,e,s,i){this.strings=t,this.values=e,this.type=s,this.processor=i}getHTML(){const t=this.strings.length-1;let e="",s=!1;for(let i=0;i<t;i++){const t=this.strings[i],n=t.lastIndexOf("\x3c!--");s=(n>-1||s)&&-1===t.indexOf("--\x3e",n+1);const r=y.exec(t);e+=null===r?t+(s?h:c):t.substr(0,r.index)+r[1]+r[2]+d+r[3]+h}return e+=this.strings[t]}getTemplateElement(){const t=document.createElement("template");return t.innerHTML=this.getHTML(),t}} */class v{constructor(t,e,s,i){this.strings=t,this.values=e,this.type=s,this.processor=i}getHTML(){const t=this.strings.length-1;let e="",s=!1;for(let i=0;i<t;i++){const t=this.strings[i],n=t.lastIndexOf("\x3c!--");s=(n>-1||s)&&-1===t.indexOf("--\x3e",n+1);const r=g.exec(t);e+=null===r?t+(s?h:c):t.substr(0,r.index)+r[1]+r[2]+u+r[3]+h}return e+=this.strings[t]}getTemplateElement(){const t=document.createElement("template");return t.innerHTML=this.getHTML(),t}}
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -53,7 +53,7 @@ class g{constructor(t,e,s){this.__parts=[],this.template=t,this.processor=e,this
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isArray(t)||!(!t||!t[Symbol.iterator]);class w{constructor(t,e,s){this.dirty=!0,this.element=t,this.name=e,this.strings=s,this.parts=[];for(let t=0;t<s.length-1;t++)this.parts[t]=this._createPart()}_createPart(){return new P(this)}_getValue(){const t=this.strings,e=t.length-1;let s="";for(let i=0;i<e;i++){s+=t[i];const e=this.parts[i];if(void 0!==e){const t=e.value;if(S(t)||!b(t))s+="string"==typeof t?t:String(t);else for(const e of t)s+="string"==typeof e?e:String(e)}}return s+=t[e]}commit(){this.dirty&&(this.dirty=!1,this.element.setAttribute(this.name,this._getValue()))}}class P{constructor(t){this.value=void 0,this.committer=t}setValue(t){t===a||S(t)&&t===this.value||(this.value=t,n(t)||(this.committer.dirty=!0))}commit(){for(;n(this.value);){const t=this.value;this.value=a,t(this)}this.value!==a&&this.committer.commit()}}class C{constructor(t){this.value=void 0,this.__pendingValue=void 0,this.options=t}appendInto(t){this.startNode=t.appendChild(m()),this.endNode=t.appendChild(m())}insertAfterNode(t){this.startNode=t,this.endNode=t.nextSibling}appendIntoPart(t){t.__insert(this.startNode=m()),t.__insert(this.endNode=m())}insertAfterPart(t){t.__insert(this.startNode=m()),this.endNode=t.endNode,t.endNode=this.startNode}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}const t=this.__pendingValue;t!==a&&(S(t)?t!==this.value&&this.__commitText(t):t instanceof v?this.__commitTemplateResult(t):t instanceof Node?this.__commitNode(t):b(t)?this.__commitIterable(t):t===l?(this.value=l,this.clear()):this.__commitText(t))}__insert(t){this.endNode.parentNode.insertBefore(t,this.endNode)}__commitNode(t){this.value!==t&&(this.clear(),this.__insert(t),this.value=t)}__commitText(t){const e=this.startNode.nextSibling;t=null==t?"":t,e===this.endNode.previousSibling&&3===e.nodeType?e.data=t:this.__commitNode(document.createTextNode("string"==typeof t?t:String(t))),this.value=t}__commitTemplateResult(t){const e=this.options.templateFactory(t);if(this.value instanceof g&&this.value.template===e)this.value.update(t.values);else{const s=new g(e,t.processor,this.options),i=s._clone();s.update(t.values),this.__commitNode(i),this.value=s}}__commitIterable(t){Array.isArray(this.value)||(this.value=[],this.clear());const e=this.value;let s,i=0;for(const n of t)void 0===(s=e[i])&&(s=new C(this.options),e.push(s),0===i?s.appendIntoPart(this):s.insertAfterPart(e[i-1])),s.setValue(n),s.commit(),i++;i<e.length&&(e.length=i,this.clear(s&&s.endNode))}clear(t=this.startNode){o(this.startNode.parentNode,t.nextSibling,this.endNode)}}class x{constructor(t,e,s){if(this.value=void 0,this.__pendingValue=void 0,2!==s.length||""!==s[0]||""!==s[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=s}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=!!this.__pendingValue;this.value!==t&&(t?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name),this.value=t),this.__pendingValue=a}}class O extends w{constructor(t,e,s){super(t,e,s),this.single=2===s.length&&""===s[0]&&""===s[1]}_createPart(){return new T(this)}_getValue(){return this.single?this.parts[0].value:super._getValue()}commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}}class T extends P{}let N=!1;try{const t={get capture(){return N=!0,!1}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){}class A{constructor(t,e,s){this.value=void 0,this.__pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=s,this.__boundHandleEvent=t=>this.handleEvent(t)}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=this.__pendingValue,e=this.value,s=null==t||null!=e&&(t.capture!==e.capture||t.once!==e.once||t.passive!==e.passive),i=null!=t&&(null==e||s);s&&this.element.removeEventListener(this.eventName,this.__boundHandleEvent,this.__options),i&&(this.__options=j(t),this.element.addEventListener(this.eventName,this.__boundHandleEvent,this.__options)),this.value=t,this.__pendingValue=a}handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}}const j=t=>t&&(N?{capture:t.capture,passive:t.passive,once:t.once}:t.capture); const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isArray(t)||!(!t||!t[Symbol.iterator]);class w{constructor(t,e,s){this.dirty=!0,this.element=t,this.name=e,this.strings=s,this.parts=[];for(let t=0;t<s.length-1;t++)this.parts[t]=this._createPart()}_createPart(){return new P(this)}_getValue(){const t=this.strings,e=t.length-1;let s="";for(let i=0;i<e;i++){s+=t[i];const e=this.parts[i];if(void 0!==e){const t=e.value;if(S(t)||!b(t))s+="string"==typeof t?t:String(t);else for(const e of t)s+="string"==typeof e?e:String(e)}}return s+=t[e]}commit(){this.dirty&&(this.dirty=!1,this.element.setAttribute(this.name,this._getValue()))}}class P{constructor(t){this.value=void 0,this.committer=t}setValue(t){t===a||S(t)&&t===this.value||(this.value=t,n(t)||(this.committer.dirty=!0))}commit(){for(;n(this.value);){const t=this.value;this.value=a,t(this)}this.value!==a&&this.committer.commit()}}class C{constructor(t){this.value=void 0,this.__pendingValue=void 0,this.options=t}appendInto(t){this.startNode=t.appendChild(m()),this.endNode=t.appendChild(m())}insertAfterNode(t){this.startNode=t,this.endNode=t.nextSibling}appendIntoPart(t){t.__insert(this.startNode=m()),t.__insert(this.endNode=m())}insertAfterPart(t){t.__insert(this.startNode=m()),this.endNode=t.endNode,t.endNode=this.startNode}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}const t=this.__pendingValue;t!==a&&(S(t)?t!==this.value&&this.__commitText(t):t instanceof v?this.__commitTemplateResult(t):t instanceof Node?this.__commitNode(t):b(t)?this.__commitIterable(t):t===l?(this.value=l,this.clear()):this.__commitText(t))}__insert(t){this.endNode.parentNode.insertBefore(t,this.endNode)}__commitNode(t){this.value!==t&&(this.clear(),this.__insert(t),this.value=t)}__commitText(t){const e=this.startNode.nextSibling;t=null==t?"":t,e===this.endNode.previousSibling&&3===e.nodeType?e.data=t:this.__commitNode(document.createTextNode("string"==typeof t?t:String(t))),this.value=t}__commitTemplateResult(t){const e=this.options.templateFactory(t);if(this.value instanceof y&&this.value.template===e)this.value.update(t.values);else{const s=new y(e,t.processor,this.options),i=s._clone();s.update(t.values),this.__commitNode(i),this.value=s}}__commitIterable(t){Array.isArray(this.value)||(this.value=[],this.clear());const e=this.value;let s,i=0;for(const n of t)void 0===(s=e[i])&&(s=new C(this.options),e.push(s),0===i?s.appendIntoPart(this):s.insertAfterPart(e[i-1])),s.setValue(n),s.commit(),i++;i<e.length&&(e.length=i,this.clear(s&&s.endNode))}clear(t=this.startNode){o(this.startNode.parentNode,t.nextSibling,this.endNode)}}class x{constructor(t,e,s){if(this.value=void 0,this.__pendingValue=void 0,2!==s.length||""!==s[0]||""!==s[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=s}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=!!this.__pendingValue;this.value!==t&&(t?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name),this.value=t),this.__pendingValue=a}}class O extends w{constructor(t,e,s){super(t,e,s),this.single=2===s.length&&""===s[0]&&""===s[1]}_createPart(){return new T(this)}_getValue(){return this.single?this.parts[0].value:super._getValue()}commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}}class T extends P{}let N=!1;try{const t={get capture(){return N=!0,!1}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){}class A{constructor(t,e,s){this.value=void 0,this.__pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=s,this.__boundHandleEvent=t=>this.handleEvent(t)}setValue(t){this.__pendingValue=t}commit(){for(;n(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=a,t(this)}if(this.__pendingValue===a)return;const t=this.__pendingValue,e=this.value,s=null==t||null!=e&&(t.capture!==e.capture||t.once!==e.once||t.passive!==e.passive),i=null!=t&&(null==e||s);s&&this.element.removeEventListener(this.eventName,this.__boundHandleEvent,this.__options),i&&(this.__options=j(t),this.element.addEventListener(this.eventName,this.__boundHandleEvent,this.__options)),this.value=t,this.__pendingValue=a}handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}}const j=t=>t&&(N?{capture:t.capture,passive:t.passive,once:t.once}:t.capture);
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -79,7 +79,7 @@ const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isAr
* Code distributed by Google as part of the polymer project is also * Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/function V(t){let e=k.get(t.type);void 0===e&&(e={stringsArray:new WeakMap,keyString:new Map},k.set(t.type,e));let s=e.stringsArray.get(t.strings);if(void 0!==s)return s;const i=t.strings.join(h);return void 0===(s=e.keyString.get(i))&&(s=new u(t,t.getTemplateElement()),e.keyString.set(i,s)),e.stringsArray.set(t.strings,s),s}const k=new Map,M=new WeakMap; */function V(t){let e=k.get(t.type);void 0===e&&(e={stringsArray:new WeakMap,keyString:new Map},k.set(t.type,e));let s=e.stringsArray.get(t.strings);if(void 0!==s)return s;const i=t.strings.join(h);return void 0===(s=e.keyString.get(i))&&(s=new d(t,t.getTemplateElement()),e.keyString.set(i,s)),e.stringsArray.set(t.strings,s),s}const k=new Map,M=new WeakMap;
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -120,7 +120,7 @@ const S=t=>null===t||!("object"==typeof t||"function"==typeof t),b=t=>Array.isAr
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
const q=(t,e)=>`${t}--${e}`;let I=!0;void 0===window.ShadyCSS?I=!1:void 0===window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected. Please update to at least @webcomponents/webcomponentsjs@2.0.2 and @webcomponents/shadycss@1.3.1."),I=!1);const H=t=>e=>{const s=q(e.type,t);let i=k.get(s);void 0===i&&(i={stringsArray:new WeakMap,keyString:new Map},k.set(s,i));let n=i.stringsArray.get(e.strings);if(void 0!==n)return n;const r=e.strings.join(h);if(void 0===(n=i.keyString.get(r))){const s=e.getTemplateElement();I&&window.ShadyCSS.prepareTemplateDom(s,t),n=new u(e,s),i.keyString.set(r,n)}return i.stringsArray.set(e.strings,n),n},D=["html","svg"],L=new Set,B=(t,e,s)=>{L.add(s);const i=t.querySelectorAll("style"),{length:n}=i;if(0===n)return void window.ShadyCSS.prepareTemplateStyles(e.element,s);const r=document.createElement("style");for(let t=0;t<n;t++){const e=i[t];e.parentNode.removeChild(e),r.textContent+=e.textContent}(t=>{D.forEach(e=>{const s=k.get(q(e,t));void 0!==s&&s.keyString.forEach(t=>{const{element:{content:e}}=t,s=new Set;Array.from(e.querySelectorAll("style")).forEach(t=>{s.add(t)}),z(t,s)})})})(s);const o=e.element.content;!function(t,e,s=null){const{element:{content:i},parts:n}=t;if(null==s)return void i.appendChild(e);const r=document.createTreeWalker(i,U,null,!1);let o=$(n),a=0,l=-1;for(;r.nextNode();)for(l++,r.currentNode===s&&(a=F(e),s.parentNode.insertBefore(e,s));-1!==o&&n[o].index===l;){if(a>0){for(;-1!==o;)n[o].index+=a,o=$(n,o);return}o=$(n,o)}}(e,r,o.firstChild),window.ShadyCSS.prepareTemplateStyles(e.element,s);const a=o.querySelector("style");if(window.ShadyCSS.nativeShadow&&null!==a)t.insertBefore(a.cloneNode(!0),t.firstChild);else{o.insertBefore(r,o.firstChild);const t=new Set;t.add(r),z(e,t)}}; const q=(t,e)=>`${t}--${e}`;let I=!0;void 0===window.ShadyCSS?I=!1:void 0===window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected. Please update to at least @webcomponents/webcomponentsjs@2.0.2 and @webcomponents/shadycss@1.3.1."),I=!1);const H=t=>e=>{const s=q(e.type,t);let i=k.get(s);void 0===i&&(i={stringsArray:new WeakMap,keyString:new Map},k.set(s,i));let n=i.stringsArray.get(e.strings);if(void 0!==n)return n;const r=e.strings.join(h);if(void 0===(n=i.keyString.get(r))){const s=e.getTemplateElement();I&&window.ShadyCSS.prepareTemplateDom(s,t),n=new d(e,s),i.keyString.set(r,n)}return i.stringsArray.set(e.strings,n),n},D=["html","svg"],L=new Set,B=(t,e,s)=>{L.add(s);const i=t.querySelectorAll("style"),{length:n}=i;if(0===n)return void window.ShadyCSS.prepareTemplateStyles(e.element,s);const r=document.createElement("style");for(let t=0;t<n;t++){const e=i[t];e.parentNode.removeChild(e),r.textContent+=e.textContent}(t=>{D.forEach(e=>{const s=k.get(q(e,t));void 0!==s&&s.keyString.forEach(t=>{const{element:{content:e}}=t,s=new Set;Array.from(e.querySelectorAll("style")).forEach(t=>{s.add(t)}),z(t,s)})})})(s);const o=e.element.content;!function(t,e,s=null){const{element:{content:i},parts:n}=t;if(null==s)return void i.appendChild(e);const r=document.createTreeWalker(i,U,null,!1);let o=$(n),a=0,l=-1;for(;r.nextNode();)for(l++,r.currentNode===s&&(a=F(e),s.parentNode.insertBefore(e,s));-1!==o&&n[o].index===l;){if(a>0){for(;-1!==o;)n[o].index+=a,o=$(n,o);return}o=$(n,o)}}(e,r,o.firstChild),window.ShadyCSS.prepareTemplateStyles(e.element,s);const a=o.querySelector("style");if(window.ShadyCSS.nativeShadow&&null!==a)t.insertBefore(a.cloneNode(!0),t.firstChild);else{o.insertBefore(r,o.firstChild);const t=new Set;t.add(r),z(e,t)}};
/** /**
* @license * @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
@ -162,7 +162,7 @@ const st=(t,e)=>"method"!==e.kind||!e.descriptor||"value"in e.descriptor?{kind:"
* subject to an additional IP rights grant found at * subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt * http://polymer.github.io/PATENTS.txt
*/ */
(window.litElementVersions||(window.litElementVersions=[])).push("2.0.1");const ot=t=>t.flat?t.flat(1/0):function t(e,s=[]){for(let i=0,n=e.length;i<n;i++){const n=e[i];Array.isArray(n)?t(n,s):s.push(n)}return s}(t);class at extends et{static finalize(){super.finalize(),this._styles=this.hasOwnProperty(JSCompiler_renameProperty("styles",this))?this._getUniqueStyles():this._styles||[]}static _getUniqueStyles(){const t=this.styles,e=[];if(Array.isArray(t)){ot(t).reduceRight((t,e)=>(t.add(e),t),new Set).forEach(t=>e.unshift(t))}else t&&e.push(t);return e}initialize(){super.initialize(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow({mode:"open"})}adoptStyles(){const t=this.constructor._styles;0!==t.length&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow?rt?this.renderRoot.adoptedStyleSheets=t.map(t=>t.styleSheet):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(t.map(t=>t.cssText),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&void 0!==window.ShadyCSS&&window.ShadyCSS.styleElement(this)}update(t){super.update(t);const e=this.render();e instanceof v&&this.constructor.render(e,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach(t=>{const e=document.createElement("style");e.textContent=t.cssText,this.renderRoot.appendChild(e)}))}render(){}}at.finalized=!0,at.render=(t,e,s)=>{const i=s.scopeName,n=M.has(e),r=I&&11===e.nodeType&&!!e.host&&t instanceof v,a=r&&!L.has(i),l=a?document.createDocumentFragment():e;if(((t,e,s)=>{let i=M.get(e);void 0===i&&(o(e,e.firstChild),M.set(e,i=new C(Object.assign({templateFactory:V},s))),i.appendInto(e)),i.setValue(t),i.commit()})(t,l,Object.assign({templateFactory:H(i)},s)),a){const t=M.get(l);M.delete(l),t.value instanceof g&&B(l,t.value.template,i),o(e,e.firstChild),e.appendChild(l),M.set(e,t)}!n&&r&&window.ShadyCSS.styleElement(e.host)};const lt=(t,e)=>0!=(t.attributes.supported_features&e);class ht{constructor(t,e){this.hass=t,this.stateObj=e,this._attr=e.attributes,this._feat=this._attr.supported_features}get isFullyOpen(){return void 0!==this._attr.current_position?100===this._attr.current_position:"open"===this.stateObj.state}get isFullyClosed(){return void 0!==this._attr.current_position?0===this._attr.current_position:"closed"===this.stateObj.state}get isFullyOpenTilt(){return 100===this._attr.current_tilt_position}get isFullyClosedTilt(){return 0===this._attr.current_tilt_position}get isOpening(){return"opening"===this.stateObj.state}get isClosing(){return"closing"===this.stateObj.state}get supportsOpen(){return lt(this.stateObj,1)}get supportsClose(){return lt(this.stateObj,2)}get supportsSetPosition(){return lt(this.stateObj,4)}get supportsStop(){return lt(this.stateObj,8)}get supportsOpenTilt(){return lt(this.stateObj,16)}get supportsCloseTilt(){return lt(this.stateObj,32)}get supportsStopTilt(){return lt(this.stateObj,64)}get supportsSetTiltPosition(){return lt(this.stateObj,128)}get isTiltOnly(){const t=this.supportsOpen||this.supportsClose||this.supportsStop;return(this.supportsOpenTilt||this.supportsCloseTilt||this.supportsStopTilt)&&!t}openCover(){this.callService("open_cover")}closeCover(){this.callService("close_cover")}stopCover(){this.callService("stop_cover")}openCoverTilt(){this.callService("open_cover_tilt")}closeCoverTilt(){this.callService("close_cover_tilt")}stopCoverTilt(){this.callService("stop_cover_tilt")}setCoverPosition(t){this.callService("set_cover_position",{position:t})}setCoverTiltPosition(t){this.callService("set_cover_tilt_position",{tilt_position:t})}callService(t,e={}){e.entity_id=this.stateObj.entity_id,this.hass.callService("cover",t,e)}}s.d(e,"StateCardCustomCover",function(){return pt});var ct=function(t,e,s,i){var n,r=arguments.length,o=r<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,s,i);else for(var a=t.length-1;a>=0;a--)(n=t[a])&&(o=(r<3?n(o):r>3?n(e,s,o):n(e,s))||o);return r>3&&o&&Object.defineProperty(e,s,o),o};let pt=class extends at{constructor(){super(...arguments),this.inDialog=!1}get stateObj(){return this.hass&&this._config?this.hass.states[this._config.entity]:null}setConfig(t){if(!t||!t.entity)throw new Error("Invalid configuration");this._config=t}get entityObj(){if(this.hass&&this.stateObj)return new ht(this.hass,this.stateObj);throw new Error("Trying to get entityObj before setting hass & config")}static getCardSize(){return 1}stateInfoTemplate(){return R` (window.litElementVersions||(window.litElementVersions=[])).push("2.0.1");const ot=t=>t.flat?t.flat(1/0):function t(e,s=[]){for(let i=0,n=e.length;i<n;i++){const n=e[i];Array.isArray(n)?t(n,s):s.push(n)}return s}(t);class at extends et{static finalize(){super.finalize(),this._styles=this.hasOwnProperty(JSCompiler_renameProperty("styles",this))?this._getUniqueStyles():this._styles||[]}static _getUniqueStyles(){const t=this.styles,e=[];if(Array.isArray(t)){ot(t).reduceRight((t,e)=>(t.add(e),t),new Set).forEach(t=>e.unshift(t))}else t&&e.push(t);return e}initialize(){super.initialize(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow({mode:"open"})}adoptStyles(){const t=this.constructor._styles;0!==t.length&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow?rt?this.renderRoot.adoptedStyleSheets=t.map(t=>t.styleSheet):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(t.map(t=>t.cssText),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&void 0!==window.ShadyCSS&&window.ShadyCSS.styleElement(this)}update(t){super.update(t);const e=this.render();e instanceof v&&this.constructor.render(e,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach(t=>{const e=document.createElement("style");e.textContent=t.cssText,this.renderRoot.appendChild(e)}))}render(){}}at.finalized=!0,at.render=(t,e,s)=>{const i=s.scopeName,n=M.has(e),r=I&&11===e.nodeType&&!!e.host&&t instanceof v,a=r&&!L.has(i),l=a?document.createDocumentFragment():e;if(((t,e,s)=>{let i=M.get(e);void 0===i&&(o(e,e.firstChild),M.set(e,i=new C(Object.assign({templateFactory:V},s))),i.appendInto(e)),i.setValue(t),i.commit()})(t,l,Object.assign({templateFactory:H(i)},s)),a){const t=M.get(l);M.delete(l),t.value instanceof y&&B(l,t.value.template,i),o(e,e.firstChild),e.appendChild(l),M.set(e,t)}!n&&r&&window.ShadyCSS.styleElement(e.host)};const lt=(t,e)=>0!=(t.attributes.supported_features&e);class ht{constructor(t,e){this.hass=t,this.stateObj=e,this._attr=e.attributes,this._feat=this._attr.supported_features}get isFullyOpen(){return void 0!==this._attr.current_position?100===this._attr.current_position:"open"===this.stateObj.state}get isFullyClosed(){return void 0!==this._attr.current_position?0===this._attr.current_position:"closed"===this.stateObj.state}get isFullyOpenTilt(){return 100===this._attr.current_tilt_position}get isFullyClosedTilt(){return 0===this._attr.current_tilt_position}get isOpening(){return"opening"===this.stateObj.state}get isClosing(){return"closing"===this.stateObj.state}get supportsOpen(){return lt(this.stateObj,1)}get supportsClose(){return lt(this.stateObj,2)}get supportsSetPosition(){return lt(this.stateObj,4)}get supportsStop(){return lt(this.stateObj,8)}get supportsOpenTilt(){return lt(this.stateObj,16)}get supportsCloseTilt(){return lt(this.stateObj,32)}get supportsStopTilt(){return lt(this.stateObj,64)}get supportsSetTiltPosition(){return lt(this.stateObj,128)}get isTiltOnly(){const t=this.supportsOpen||this.supportsClose||this.supportsStop;return(this.supportsOpenTilt||this.supportsCloseTilt||this.supportsStopTilt)&&!t}openCover(){this.callService("open_cover")}closeCover(){this.callService("close_cover")}stopCover(){this.callService("stop_cover")}openCoverTilt(){this.callService("open_cover_tilt")}closeCoverTilt(){this.callService("close_cover_tilt")}stopCoverTilt(){this.callService("stop_cover_tilt")}setCoverPosition(t){this.callService("set_cover_position",{position:t})}setCoverTiltPosition(t){this.callService("set_cover_tilt_position",{tilt_position:t})}callService(t,e={}){e.entity_id=this.stateObj.entity_id,this.hass.callService("cover",t,e)}}s.d(e,"StateCardCustomCover",function(){return pt});var ct=function(t,e,s,i){var n,r=arguments.length,o=r<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,s,i);else for(var a=t.length-1;a>=0;a--)(n=t[a])&&(o=(r<3?n(o):r>3?n(e,s,o):n(e,s))||o);return r>3&&o&&Object.defineProperty(e,s,o),o};let pt=class extends at{constructor(){super(...arguments),this.inDialog=!1}get stateObj(){return this.hass&&this._config?this.hass.states[this._config.entity]:null}setConfig(t){if(!t||!t.entity)throw new Error("Invalid configuration");this._config=t}get entityObj(){if(this.hass&&this.stateObj)return new ht(this.hass,this.stateObj);throw new Error("Trying to get entityObj before setting hass & config")}static getCardSize(){return 1}stateInfoTemplate(){return R`
State info template State info template
`}render(){if(!this._config||!this.hass)return R``;const t=this.entityObj,e=this.hass.states[this._config.entity];return e?R` `}render(){if(!this._config||!this.hass)return R``;const t=this.entityObj,e=this.hass.states[this._config.entity];return e?R`
<style include="iron-flex iron-flex-alignment"></style> <style include="iron-flex iron-flex-alignment"></style>
@ -179,6 +179,10 @@ const st=(t,e)=>"method"!==e.kind||!e.descriptor||"value"in e.descriptor?{kind:"
--mdc-icon-size: 25px; --mdc-icon-size: 25px;
} }
ha-icon {
height: auto;
}
[invisible] { [invisible] {
visibility: hidden !important; visibility: hidden !important;
} }
@ -189,17 +193,23 @@ const st=(t,e)=>"method"!==e.kind||!e.descriptor||"value"in e.descriptor?{kind:"
<ha-icon-button <ha-icon-button
icon="hass:menu" icon="hass:menu"
@click=${this.onHalfOpenTap} @click=${this.onHalfOpenTap}
></ha-icon-button> >
<ha-icon icon="hass:menu"> </ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-up" icon="hass:arrow-up"
@click=${this.onOpenTap} @click=${this.onOpenTap}
.disabled="${this.computeOpenDisabled(e,this.entityObj)}" .disabled="${this.computeOpenDisabled(e,this.entityObj)}"
></ha-icon-button> >
<ha-icon icon="hass:arrow-up"> </ha-icon>
</ha-icon-button>
<ha-icon-button <ha-icon-button
icon="hass:arrow-down" icon="hass:arrow-down"
@click=${this.onCloseTap} @click=${this.onCloseTap}
.disabled="${this.computeClosedDisabled(e,t)}" .disabled="${this.computeClosedDisabled(e,t)}"
></ha-icon-button> >
<ha-icon icon="hass:arrow-down"> </ha-icon>
</ha-icon-button>
</div> </div>
</hui-generic-entity-row> </hui-generic-entity-row>
`:R` `:R`