reorganization of packages and lovelace - using storage mode with yaml dashboards

(working before upgrade to 118.5 which failed)
master
David Kebler 2020-12-08 19:58:32 -08:00
parent 67298f67ef
commit d172ead1c1
563 changed files with 57328 additions and 8124 deletions

View File

@ -1 +1 @@
0.107.7
0.118.4

6
.gitignore vendored
View File

@ -1,7 +1,7 @@
/.storage/
/.vscode/
/.cloud/
*.code-workspace
*.js.gz
*.log
*.db
.gitsecret/keys/random_seed
!*.secret
secrets.yaml

BIN
.gitsecret/keys/pubring.kbx Normal file

Binary file not shown.

Binary file not shown.

BIN
.gitsecret/keys/trustdb.gpg Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
secrets.yaml

1073
.storage/auth Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,24 @@
{
"data": {
"users": [
{
"password": "JDJiJDEyJEROU05qSFRuRE5RRHJ6RUFjQ1pwUy5qcGN3TlNnaDU0ZUdjUnFxdWFZQVFZamEzTnZ3LjBT",
"username": "sysadmin"
},
{
"password": "JDJiJDEyJFd3Tnh0ZlVZb21iQmlKaGs1RnVhai5OSlFLNWNKVU92a2ZNTWVKdEhzb0hQTWF0eDRXTjRl",
"username": "trish"
},
{
"password": "JDJiJDEyJDR6elRTeWxORHNMclFzSFJ3N0ZiNC4ucmUyUmZ4TEVFRHNJekpmcXNWUm1EOS45cGoveFAy",
"username": "irrigation"
},
{
"password": "JDJiJDEyJDZMclNZSy5pSGY5QVdNZ0JhVWF4UHUwUVdsbGhsRGJHeUhDWlZ0ZHVLdUtOdFdDTGRJVlZl",
"username": "test"
}
]
},
"key": "auth_provider.homeassistant",
"version": 1
}

View File

@ -0,0 +1,20 @@
{
"data": {
"areas": [
{
"id": "5c6c9f7bb2af43a4afa8851308f8e10a",
"name": "Living Room"
},
{
"id": "82805bb0656b443ea5c7fdc7a762a7aa",
"name": "Kitchen"
},
{
"id": "13ef8995699f4a04b79b02119ba2d2dd",
"name": "Bedroom"
}
]
},
"key": "core.area_registry",
"version": 1
}

14
.storage/core.config Normal file
View File

@ -0,0 +1,14 @@
{
"version": 1,
"key": "core.config",
"data": {
"latitude": 44.46097018572946,
"longitude": -118.71158838272095,
"elevation": 0,
"unit_system": "imperial",
"location_name": "238 McHaley",
"time_zone": "America/Los_Angeles",
"external_url": null,
"internal_url": null
}
}

View File

@ -0,0 +1,221 @@
{
"version": 1,
"key": "core.config_entries",
"data": {
"entries": [
{
"entry_id": "2872c3dbbf1246c2b7aab8c616984183",
"version": 1,
"domain": "mobile_app",
"title": "700T1C",
"data": {
"app_data": {
"push_token": "fCP75bxzpBY:APA91bGOZjg0ObYy1-QJs8VJxqU-AQbNpQ1fz2Gc485DjxBsZ1LAsdLaZTJ3vgbgQ98Qt3jO0Xv4yfaLM4uiGunzKs4_iCrV-KAU2Qul5zN_dmQ6LVqo2PDMPSUZkAqRF7Ip5u9zz88F",
"push_url": "https://mobile-apps.home-assistant.io/api/sendPush/android/v1"
},
"app_id": "io.homeassistant.companion.android",
"app_name": "Home Assistant",
"app_version": "2.5.0-full (400)",
"device_id": "6cb92e1b94d47217",
"device_name": "700T1C",
"manufacturer": "SAMSUNG ELECTRONICS CO., LTD.",
"model": "700T1C",
"os_name": "Android",
"os_version": "28",
"supports_encryption": false,
"user_id": "99685dc45d9f40dc8183e11ce5128038",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "registration",
"connection_class": "cloud_push",
"unique_id": "io.homeassistant.companion.android-6cb92e1b94d47217"
},
{
"entry_id": "f2587c6a3ce34da5a1209b077a39d931",
"version": 1,
"domain": "mqtt",
"title": "broker.kebler.net",
"data": {
"broker": "broker.kebler.net",
"discovery": true,
"port": 1883
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "user",
"connection_class": "local_push",
"unique_id": null
},
{
"entry_id": "9436e71647e64581a19a2cc8172f9a35",
"version": 1,
"domain": "esphome",
"title": "inside_temp_humd",
"data": {
"host": "10.0.0.180",
"password": "",
"port": 6053
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "zeroconf",
"connection_class": "local_push",
"unique_id": "inside_temp_humd"
},
{
"entry_id": "cf5266d3fa4a4824850935818193ac48",
"version": 1,
"domain": "esphome",
"title": "outside_temp_humd",
"data": {
"host": "10.0.0.222",
"password": "",
"port": 6053
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "user",
"connection_class": "local_push",
"unique_id": "outside_temp_humd"
},
{
"entry_id": "3ed789ad543542018f094a6d3d209d9a",
"version": 1,
"domain": "nws",
"title": "KGCD",
"data": {
"api_key": "kebler.net@gmail.com",
"latitude": 44.46097018572946,
"longitude": -118.71158838272095,
"station": "KGCD"
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "user",
"connection_class": "cloud_poll",
"unique_id": "44.46097018572946_-118.71158838272095"
},
{
"entry_id": "b7c6f2ecbb0d48ce83a92d218b4e129c",
"version": 1,
"domain": "mobile_app",
"title": "SM-G935R4",
"data": {
"app_data": {
"push_token": "dR6iDAsFIAI:APA91bHbf9uAX51rcCn1eD8J__in-9K7sqaXbnFgfVxE4wEpNmD3lcwBR0JeG-sVnWx1dUYhj4BRP6BHQy1uFAHWjs890GAIPvYU-AWKRRR-GuDhaWvXnLYX94yLQp80GZMxbpOG9-Ke",
"push_url": "https://mobile-apps.home-assistant.io/api/sendPush/android/v1"
},
"app_id": "io.homeassistant.companion.android",
"app_name": "Home Assistant",
"app_version": "1.11.0-215 (215)",
"device_id": "ea51283736a711a9",
"device_name": "SM-G935R4",
"manufacturer": "samsung",
"model": "SM-G935R4",
"os_name": "Android",
"os_version": "26",
"supports_encryption": false,
"user_id": "99685dc45d9f40dc8183e11ce5128038",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "registration",
"connection_class": "cloud_push",
"unique_id": "io.homeassistant.companion.android-ea51283736a711a9"
},
{
"entry_id": "ea9548ce249e4e388ef42aa16cedfa29",
"version": 1,
"domain": "mobile_app",
"title": "White Moto G",
"data": {
"app_data": {
"push_token": "f-HooFTWTWad3h8a1EJswU:APA91bE8CUndwczKWO6Cb59jnXddyUwL5zYtFO9CJxhUqBnbOJvPYRaLMeLIC4CIJAdFkZ6ep82_7RxoIVRtYfhP_qOByjOgYImrapNEUjSayCmiyjTZaEH1eCzshzeaauD16NO8THyj",
"push_url": "https://mobile-apps.home-assistant.io/api/sendPush/android/v1"
},
"app_id": "io.homeassistant.companion.android",
"app_name": "Home Assistant",
"app_version": "1.11.0-215 (215)",
"device_id": "764372054dcb3823",
"device_name": "XT1064",
"manufacturer": "motorola",
"model": "XT1064",
"os_name": "Android",
"os_version": "23",
"supports_encryption": false,
"user_id": "99685dc45d9f40dc8183e11ce5128038",
"webhook_id": "5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be"
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "registration",
"connection_class": "cloud_push",
"unique_id": "io.homeassistant.companion.android-764372054dcb3823"
},
{
"entry_id": "0f3b31063a5d4293a373c98d6c5d5c77",
"version": 1,
"domain": "mobile_app",
"title": "LGUS215",
"data": {
"app_data": {
"push_token": "dHFyVftSS7GU1tZWdpLnZp:APA91bH9Jy7ZBQ-vmUQwZKk4ymzjrbFyxuXJRcVlNnbPcDMFlbG8zV5VOX2wbbOYW7N72LbSLLYjMbnQy5zDsknYEI7QaNXfcNnGHbF3d7AsD2NrvJ9pYmsde5e3tpTaBYAkBMAqDnSa",
"push_url": "https://mobile-apps.home-assistant.io/api/sendPush/android/v1"
},
"app_id": "io.homeassistant.companion.android",
"app_name": "Home Assistant",
"app_version": "1.11.0-215 (215)",
"device_id": "315c682d3b2d88cc",
"device_name": "LGUS215",
"manufacturer": "LGE",
"model": "LGUS215",
"os_name": "Android",
"os_version": "24",
"supports_encryption": false,
"user_id": "99685dc45d9f40dc8183e11ce5128038",
"webhook_id": "05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2"
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "registration",
"connection_class": "cloud_push",
"unique_id": "io.homeassistant.companion.android-315c682d3b2d88cc"
},
{
"entry_id": "d00c44239e11a6b5cc8a1f44eb4c23e2",
"version": 1,
"domain": "hacs",
"title": "",
"data": {
"token": "ab27da1f11e3827fa78258ac8ed11795c6261c34"
},
"options": {},
"system_options": {
"disable_new_entities": false
},
"source": "user",
"connection_class": "cloud_poll",
"unique_id": null
}
]
}
}

View File

@ -0,0 +1,177 @@
{
"version": 1,
"key": "core.device_registry",
"data": {
"devices": [
{
"config_entries": [
"2872c3dbbf1246c2b7aab8c616984183"
],
"connections": [],
"identifiers": [
[
"mobile_app",
"6cb92e1b94d47217"
]
],
"manufacturer": "SAMSUNG ELECTRONICS CO., LTD.",
"model": "700T1C",
"name": "700T1C",
"sw_version": "28",
"entry_type": null,
"id": "515c6f88684b452e86231c4411e3001e",
"via_device_id": null,
"area_id": null,
"name_by_user": null
},
{
"config_entries": [
"f2587c6a3ce34da5a1209b077a39d931"
],
"connections": [],
"identifiers": [
[
"mqtt",
"84f3eb3b8492"
]
],
"manufacturer": "espressif",
"model": "PLATFORMIO_D1_MINI",
"name": "outside_temp_humd",
"sw_version": "esphome v1.14.3 Apr 23 2020, 12:14:31",
"entry_type": null,
"id": "93560a2f0c64414e8c1a69dbbf3bf97f",
"via_device_id": null,
"area_id": null,
"name_by_user": null
},
{
"config_entries": [
"9436e71647e64581a19a2cc8172f9a35"
],
"connections": [
[
"mac",
"84:f3:eb:3b:77:30"
]
],
"identifiers": [],
"manufacturer": "espressif",
"model": "PLATFORMIO_D1_MINI",
"name": "inside_temp_humd",
"sw_version": "1.15.3 (Dec 1 2020, 11:20:56)",
"entry_type": null,
"id": "1883f8cbd6b548b992e9a1974008f81f",
"via_device_id": null,
"area_id": null,
"name_by_user": null
},
{
"config_entries": [
"cf5266d3fa4a4824850935818193ac48"
],
"connections": [
[
"mac",
"84:f3:eb:3b:84:92"
]
],
"identifiers": [],
"manufacturer": "espressif",
"model": "PLATFORMIO_D1_MINI",
"name": "outside_temp_humd",
"sw_version": "1.15.3 (Dec 1 2020, 10:59:50)",
"entry_type": null,
"id": "207200b764c24bb2ac697f37d7c8b4e2",
"via_device_id": null,
"area_id": null,
"name_by_user": null
},
{
"config_entries": [
"b7c6f2ecbb0d48ce83a92d218b4e129c"
],
"connections": [],
"identifiers": [
[
"mobile_app",
"ea51283736a711a9"
]
],
"manufacturer": "samsung",
"model": "SM-G935R4",
"name": "SM-G935R4",
"sw_version": "26",
"entry_type": null,
"id": "379851aebc71474585da2f6ce68a5745",
"via_device_id": null,
"area_id": null,
"name_by_user": null
},
{
"config_entries": [
"ea9548ce249e4e388ef42aa16cedfa29"
],
"connections": [],
"identifiers": [
[
"mobile_app",
"764372054dcb3823"
]
],
"manufacturer": "motorola",
"model": "XT1064",
"name": "XT1064",
"sw_version": "23",
"entry_type": null,
"id": "f16e11491ac04282ab179f5727d4f5dc",
"via_device_id": null,
"area_id": null,
"name_by_user": null
},
{
"config_entries": [
"0f3b31063a5d4293a373c98d6c5d5c77"
],
"connections": [],
"identifiers": [
[
"mobile_app",
"315c682d3b2d88cc"
]
],
"manufacturer": "LGE",
"model": "LGUS215",
"name": "LGUS215",
"sw_version": "24",
"entry_type": null,
"id": "ff1bf04ce1b2439b8a7ebc9237a010d9",
"via_device_id": null,
"area_id": null,
"name_by_user": null
},
{
"config_entries": [
"d00c44239e11a6b5cc8a1f44eb4c23e2"
],
"connections": [],
"identifiers": [
[
"hacs",
"0717a0cd-745c-48fd-9b16-c8534c9704f9-bc944b0f-fd42-4a58-a072-ade38d1444cd"
]
],
"manufacturer": "hacs.xyz",
"model": "",
"name": "HACS",
"sw_version": "1.8.0",
"entry_type": "service",
"id": "da36236384f2c8816377b036cf723ece",
"via_device_id": null,
"area_id": null,
"name_by_user": null
}
],
"deleted_devices": []
}
}

File diff suppressed because it is too large Load Diff

1805
.storage/core.restore_state Normal file

File diff suppressed because it is too large Load Diff

7
.storage/core.uuid Normal file
View File

@ -0,0 +1,7 @@
{
"version": 1,
"key": "core.uuid",
"data": {
"uuid": "730705095bdc49d696bac6c69892ff3c"
}
}

View File

@ -0,0 +1,39 @@
{
"data": {
"device_info": {
"compilation_time": "Apr 24 2020, 17:23:25",
"esphome_version": "1.14.3",
"has_deep_sleep": false,
"mac_address": "84:F3:EB:3B:84:92",
"model": "PLATFORMIO_D1_MINI",
"name": "outside_temp_humd",
"uses_password": false
},
"sensor": [
{
"accuracy_decimals": 1,
"force_update": false,
"icon": "mdi:thermometer",
"key": 2259435129,
"name": "Outside Temperature",
"object_id": "outside_temperature",
"unique_id": "outside_temp_humdsensoroutside_temperature",
"unit_of_measurement": "\u00b0C"
},
{
"accuracy_decimals": 1,
"force_update": false,
"icon": "mdi:water-percent",
"key": 1320590942,
"name": "Outside Humidity",
"object_id": "outside_humidity",
"unique_id": "outside_temp_humdsensoroutside_humidity",
"unit_of_measurement": "%"
}
],
"services": [],
"text_sensor": []
},
"key": "esphome.28ebec0e77234c51bb89a4a1b26e47b3",
"version": 1
}

View File

@ -0,0 +1,39 @@
{
"version": 1,
"key": "esphome.9436e71647e64581a19a2cc8172f9a35",
"data": {
"device_info": {
"uses_password": false,
"name": "inside_temp_humd",
"mac_address": "84:F3:EB:3B:77:30",
"compilation_time": "Dec 1 2020, 11:20:56",
"model": "PLATFORMIO_D1_MINI",
"has_deep_sleep": false,
"esphome_version": "1.15.3"
},
"services": [],
"sensor": [
{
"object_id": "inside_temperature",
"key": 920924750,
"name": "Inside Temperature",
"unique_id": "inside_temp_humdsensorinside_temperature",
"icon": "mdi:thermometer",
"unit_of_measurement": "\u00b0C",
"accuracy_decimals": 1,
"force_update": false
},
{
"object_id": "inside_humidity",
"key": 847076999,
"name": "Inside Humidity",
"unique_id": "inside_temp_humdsensorinside_humidity",
"icon": "mdi:water-percent",
"unit_of_measurement": "%",
"accuracy_decimals": 1,
"force_update": false
}
],
"text_sensor": []
}
}

View File

@ -0,0 +1,39 @@
{
"version": 1,
"key": "esphome.cf5266d3fa4a4824850935818193ac48",
"data": {
"device_info": {
"uses_password": false,
"name": "outside_temp_humd",
"mac_address": "84:F3:EB:3B:84:92",
"compilation_time": "Dec 1 2020, 10:59:50",
"model": "PLATFORMIO_D1_MINI",
"has_deep_sleep": false,
"esphome_version": "1.15.3"
},
"services": [],
"sensor": [
{
"object_id": "outside_temperature",
"key": 2259435129,
"name": "Outside Temperature",
"unique_id": "outside_temp_humdsensoroutside_temperature",
"icon": "mdi:thermometer",
"unit_of_measurement": "\u00b0C",
"accuracy_decimals": 1,
"force_update": false
},
{
"object_id": "outside_humidity",
"key": 1320590942,
"name": "Outside Humidity",
"unique_id": "outside_temp_humdsensoroutside_humidity",
"icon": "mdi:water-percent",
"unit_of_measurement": "%",
"accuracy_decimals": 1,
"force_update": false
}
],
"text_sensor": []
}
}

View File

@ -0,0 +1,39 @@
{
"data": {
"device_info": {
"compilation_time": "Feb 28 2020, 20:07:32",
"esphome_version": "1.14.3",
"has_deep_sleep": false,
"mac_address": "84:F3:EB:3B:84:92",
"model": "PLATFORMIO_D1_MINI",
"name": "outside_temp_humd",
"uses_password": false
},
"sensor": [
{
"accuracy_decimals": 1,
"force_update": false,
"icon": "mdi:thermometer",
"key": 2259435129,
"name": "Outside Temperature",
"object_id": "outside_temperature",
"unique_id": "outside_temp_humdsensoroutside_temperature",
"unit_of_measurement": "\u00b0C"
},
{
"accuracy_decimals": 1,
"force_update": false,
"icon": "mdi:water-percent",
"key": 1320590942,
"name": "Outside Humidity",
"object_id": "outside_humidity",
"unique_id": "outside_temp_humdsensoroutside_humidity",
"unit_of_measurement": "%"
}
],
"services": [],
"text_sensor": []
},
"key": "esphome.eeb6ca4d62944fa4b32711e291ba2f63",
"version": 1
}

View File

@ -0,0 +1,9 @@
{
"data": {
"core": {
"showAdvanced": true
}
},
"key": "frontend.user_data_99685dc45d9f40dc8183e11ce5128038",
"version": 1
}

8
.storage/frontend_theme Normal file
View File

@ -0,0 +1,8 @@
{
"version": 1,
"key": "frontend_theme",
"data": {
"frontend_default_theme": "Dark Turqoise",
"frontend_default_dark_theme": null
}
}

12
.storage/hacs.critical Normal file
View File

@ -0,0 +1,12 @@
{
"version": "6",
"key": "hacs.critical",
"data": [
{
"repository": "test/test",
"reason": "Security issues, known to steal auth tokens.",
"link": "https://github.com/hacs/default/pull/2",
"acknowledged": true
}
]
}

9
.storage/hacs.hacs Normal file
View File

@ -0,0 +1,9 @@
{
"version": "6",
"key": "hacs.hacs",
"data": {
"view": "Grid",
"compact": false,
"onboarding_done": false
}
}

21929
.storage/hacs.repositories Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
{
"version": "6",
"key": "hacs/146194325.hacs",
"data": {
"archived": false,
"authors": [],
"category": "plugin",
"content_in_root": false,
"country": [],
"config_flow": false,
"default_branch": "master",
"description": "\u2747\ufe0f Lovelace button-card for home assistant",
"domain": "",
"domains": [],
"downloads": 5070,
"file_name": "button-card.js",
"filename": "button-card.js",
"first_install": false,
"fork": false,
"full_name": "custom-cards/button-card",
"hacs": null,
"hide": false,
"hide_default_branch": false,
"homeassistant": null,
"id": "146194325",
"iot_class": null,
"installed": true,
"installed_commit": "b5de991",
"installed_version": "3.4.0",
"open_issues": 28,
"last_commit": "b5de991",
"last_version": "3.4.0",
"last_updated": "2020-12-02T14:06:47Z",
"manifest_name": null,
"new": false,
"persistent_directory": null,
"pushed_at": "2020-12-02T14:06:47",
"releases": true,
"render_readme": true,
"published_tags": [
"3.4.0",
"3.3.6",
"3.3.5",
"3.3.4",
"3.3.3"
],
"selected_tag": null,
"show_beta": false,
"stargazers_count": 580,
"topics": [
"home-assistant",
"home-assistant-custom",
"home-automation",
"lovelace",
"lovelace-ui"
],
"zip_release": false
}
}

View File

@ -0,0 +1,54 @@
{
"version": "6",
"key": "hacs/162468030.hacs",
"data": {
"archived": false,
"authors": [],
"category": "theme",
"content_in_root": false,
"country": [],
"config_flow": false,
"default_branch": "master",
"description": "A collection of dark themes for Home Assistant. ",
"domain": "",
"domains": [],
"downloads": 0,
"file_name": "dark_themes.yaml",
"filename": "dark_themes.yaml",
"first_install": false,
"fork": false,
"full_name": "awolkers/home-assistant-themes",
"hacs": null,
"hide": false,
"hide_default_branch": false,
"homeassistant": null,
"id": "162468030",
"iot_class": null,
"installed": true,
"installed_commit": "648aef9",
"installed_version": null,
"open_issues": 0,
"last_commit": "648aef9",
"last_version": null,
"last_updated": "2020-09-16T14:47:00Z",
"manifest_name": null,
"new": false,
"persistent_directory": null,
"pushed_at": "2020-09-16T14:47:00",
"releases": false,
"render_readme": true,
"published_tags": [],
"selected_tag": null,
"show_beta": false,
"stargazers_count": 7,
"topics": [
"dark-mode",
"dark-theme",
"hacs",
"hassio",
"home-assistant",
"theme"
],
"zip_release": false
}
}

View File

@ -0,0 +1,63 @@
{
"version": "6",
"key": "hacs/172733314.hacs",
"data": {
"archived": false,
"authors": [
"@ludeeus"
],
"category": "integration",
"content_in_root": false,
"country": [],
"config_flow": true,
"default_branch": "main",
"description": "HACS gives you a powerful UI to handle downloads of all your custom needs.",
"domain": "hacs",
"domains": [],
"downloads": 9120,
"file_name": "",
"filename": "hacs.zip",
"first_install": false,
"fork": false,
"full_name": "hacs/integration",
"hacs": "0.19.0",
"hide": false,
"hide_default_branch": true,
"homeassistant": "0.110.0",
"id": "172733314",
"iot_class": null,
"installed": true,
"installed_commit": null,
"installed_version": "1.8.0",
"open_issues": 30,
"last_commit": "d41c3f7",
"last_version": "1.8.0",
"last_updated": "2020-12-08T07:18:56Z",
"manifest_name": "HACS",
"new": false,
"persistent_directory": null,
"pushed_at": "2020-12-08T07:18:56",
"releases": true,
"render_readme": false,
"published_tags": [
"1.8.0",
"1.6.2",
"1.6.1",
"1.6.0",
"1.5.2"
],
"selected_tag": null,
"show_beta": false,
"stargazers_count": 1422,
"topics": [
"community",
"hacktoberfest",
"hacs",
"home-assistant",
"integration",
"package-manager",
"python"
],
"zip_release": true
}
}

View File

@ -0,0 +1,47 @@
{
"version": "6",
"key": "hacs/260526528.hacs",
"data": {
"archived": false,
"authors": [],
"category": "plugin",
"content_in_root": true,
"country": [],
"config_flow": false,
"default_branch": "master",
"description": "Custom Dark Sky Weather plugin for HACS. This creates a rich weather card using the Dark Sky weather plugin.",
"domain": "",
"domains": [],
"downloads": 0,
"file_name": "lovelace-darksky-card.js",
"filename": "lovelace-darksky-card.js",
"first_install": false,
"fork": true,
"full_name": "clayauld/lovelace-darksky-card",
"hacs": null,
"hide": false,
"hide_default_branch": false,
"homeassistant": null,
"id": "260526528",
"iot_class": null,
"installed": true,
"installed_commit": "03e6eac",
"installed_version": null,
"open_issues": 1,
"last_commit": "03e6eac",
"last_version": null,
"last_updated": "2020-11-05T01:35:52Z",
"manifest_name": null,
"new": false,
"persistent_directory": null,
"pushed_at": "2020-11-05T01:35:52",
"releases": false,
"render_readme": "true",
"published_tags": [],
"selected_tag": null,
"show_beta": false,
"stargazers_count": 3,
"topics": [],
"zip_release": false
}
}

View File

@ -0,0 +1,59 @@
{
"version": "6",
"key": "hacs/261262884.hacs",
"data": {
"archived": false,
"authors": [],
"category": "plugin",
"content_in_root": false,
"country": [],
"config_flow": false,
"default_branch": "master",
"description": "\ud83d\udd70\ufe0f Time Picker Card for Home Assistant's Lovelace UI",
"domain": "",
"domains": [],
"downloads": 958,
"file_name": "time-picker-card.js",
"filename": "time-picker-card.js",
"first_install": false,
"fork": false,
"full_name": "GeorgeSG/lovelace-time-picker-card",
"hacs": null,
"hide": false,
"hide_default_branch": false,
"homeassistant": null,
"id": "261262884",
"iot_class": null,
"installed": true,
"installed_commit": "c3fa2ce",
"installed_version": "1.1.1",
"open_issues": 1,
"last_commit": "c3fa2ce",
"last_version": "1.1.1",
"last_updated": "2020-11-22T14:38:10Z",
"manifest_name": null,
"new": false,
"persistent_directory": null,
"pushed_at": "2020-11-22T14:38:10",
"releases": true,
"render_readme": true,
"published_tags": [
"1.1.1",
"1.1.0",
"1.0.1",
"0.1.1",
"0.1.0"
],
"selected_tag": null,
"show_beta": false,
"stargazers_count": 43,
"topics": [
"home-assistant",
"homeassistant",
"lovelace",
"lovelace-card",
"lovelace-custom-card"
],
"zip_release": false
}
}

7
.storage/hassio Normal file
View File

@ -0,0 +1,7 @@
{
"data": {
"hassio_user": "5dc5beb72dbc49d59080804cea6f026c"
},
"key": "hassio",
"version": 1
}

13
.storage/http Normal file
View File

@ -0,0 +1,13 @@
{
"version": 1,
"key": "http",
"data": {
"server_port": 8123,
"ssl_profile": "modern",
"cors_allowed_origins": [
"https://cast.home-assistant.io"
],
"login_attempts_threshold": -1,
"ip_ban_enabled": true
}
}

View File

@ -0,0 +1,209 @@
{
"version": 1,
"key": "lovelace.lovelace_learning",
"data": {
"config": {
"title": "238 McHaley",
"views": [
{
"title": "Meterology",
"path": "meterology",
"icon": "mdi:thermometer-lines",
"badges": [],
"cards": [
{
"type": "entities",
"show_header_toggle": false,
"title": "Outside",
"entities": [
"sensor.outside_temperature",
"sensor.outside_humidity"
]
},
{
"type": "entities",
"show_header_toggle": false,
"title": "Inside",
"entities": [
"sensor.inside_temperature",
"sensor.inside_humidity"
]
},
{
"type": "weather-forecast",
"entity": "weather.praire_city_weather"
},
{
"type": "entities",
"entities": [
{
"entity": "sensor.bme_outside_temperature",
"icon": "mdi:temperature-fahrenheit",
"name": "Outside Temperature",
"secondary_info": "last-changed"
},
{
"entity": "sensor.bme_outside_humidity",
"name": "Humidity",
"icon": "mdi:water-percent"
},
{
"entity": "sensor.bme_outside_barometric_pressure",
"name": "Barometric Pressue",
"icon": "mdi:gauge"
},
{
"entity": "sensor.bme_outside_dew_point_temperature",
"name": "Dew Point Temperature",
"icon": "mdi:thermometer-lines"
}
],
"title": "Outside Conditions",
"theme": "Dark Blue",
"show_header_toggle": false
},
{
"type": "iframe",
"url": "https://embed.windy.com/embed2.html?lat=44.422&lon=-118.718&detailLat=44.452&detailLon=-118.529&width=650&height=450&zoom=9&level=surface&overlay=radar&product=radar&menu=&message=&marker=&calendar=now&pressure=&type=map&location=coordinates&detail=&metricWind=mph&metricTemp=%C2%B0F&radarRange=-1",
"aspect_ratio": "100%",
"title": "Live Weather Map"
},
{
"type": "iframe",
"title": "Local Radar",
"aspect_ratio": "100%",
"url": "https://www.rainviewer.com/map.html?loc=44.4823,-118.7828,10&oFa=0&oC=1&oU=0&oCS=1&oF=0&oAP=0&rmt=0&c=0&o=83&lm=1&th=1&sm=1&sn=1"
},
{
"type": "weather-forecast",
"entity": "weather.praire_city_weather"
},
{
"type": "custom:lovelace-darksky-card",
"entity_current_conditions": "sensor.dark_sky_icon",
"entity_temperature": "sensor.dark_sky_temperature",
"entity_forecast_high_temp_1": "sensor.dark_sky_daytime_high_temperature_1d",
"entity_forecast_high_temp_2": "sensor.dark_sky_daytime_high_temperature_2d",
"entity_forecast_high_temp_3": "sensor.dark_sky_daytime_high_temperature_3d",
"entity_forecast_high_temp_4": "sensor.dark_sky_daytime_high_temperature_4d",
"entity_forecast_high_temp_5": "sensor.dark_sky_daytime_high_temperature_5d",
"entity_forecast_icon_1": "sensor.dark_sky_icon_1d",
"entity_forecast_icon_2": "sensor.dark_sky_icon_2d",
"entity_forecast_icon_3": "sensor.dark_sky_icon_3d",
"entity_forecast_icon_4": "sensor.dark_sky_icon_4d",
"entity_forecast_icon_5": "sensor.dark_sky_icon_5d",
"entity_forecast_low_temp_1": "sensor.dark_sky_overnight_low_temperature_0d",
"entity_forecast_low_temp_2": "sensor.dark_sky_overnight_low_temperature_1d",
"entity_forecast_low_temp_3": "sensor.dark_sky_overnight_low_temperature_2d",
"entity_forecast_low_temp_4": "sensor.dark_sky_overnight_low_temperature_3d",
"entity_forecast_low_temp_5": "sensor.dark_sky_overnight_low_temperature_4d",
"entity_summary_1": "sensor.dark_sky_summary_1d",
"entity_summary_2": "sensor.dark_sky_summary_2d",
"entity_summary_3": "sensor.dark_sky_summary_3d",
"entity_summary_4": "sensor.dark_sky_summary_4d",
"entity_summary_5": "sensor.dark_sky_summary_5d",
"entity_sun": "sun.sun",
"entity_visibility": "sensor.dark_sky_visibility",
"entity_daytime_high": "sensor.dark_sky_daytime_high_temperature_0d",
"entity_wind_bearing": "sensor.dark_sky_wind_bearing",
"entity_wind_speed": "sensor.dark_sky_wind_speed",
"entity_humidity": "sensor.dark_sky_humidity",
"entity_pressure": "sensor.dark_sky_pressure",
"entity_apparent_temp": "sensor.dark_sky_apparent_temperature",
"entity_daily_summary": "sensor.dark_sky_daily_summary",
"entity_pop": "sensor.dark_sky_precip_probability",
"entity_pop_intensity": "sensor.dark_sky_precip_intensity",
"entity_pop_1": "sensor.dark_sky_precip_probability_1d",
"entity_pop_2": "sensor.dark_sky_precip_probability_2d",
"entity_pop_3": "sensor.dark_sky_precip_probability_3d",
"entity_pop_4": "sensor.dark_sky_precip_probability_4d",
"entity_pop_5": "sensor.dark_sky_precip_probability_5d"
}
]
},
{
"title": "Lights",
"path": "lights",
"icon": "mdi:lightbulb",
"badges": [],
"cards": [
{
"type": "entities",
"show_header_toggle": false,
"title": "Indoor Security Lights",
"entities": [
{
"entity": "switch.all_sonoffs",
"name": "Lights State (manual override)"
},
{
"entity": "input_datetime.security_lights_interior_time_off",
"name": "Time Of Day To Turn Off (24HR)"
},
{
"entity": "automation.security_lights_interior_time_on",
"name": "Lights On At Sunset Automation Enabled"
},
{
"entity": "automation.security_lights_interior_time_off",
"name": "Lights Off Automation Enabled"
}
]
},
{
"type": "entities",
"show_header_toggle": false,
"title": "Raw Sonoff Control",
"entities": [
"switch.sonoff_white",
"switch.sonoff_brown",
"switch.all_sonoffs"
]
},
{
"type": "custom:time-picker-card",
"entity": "input_datetime.security_lights_interior_time_off",
"hour_mode": 24,
"hour_step": 1,
"minute_step": 5,
"second_step": 5,
"name": "lights off at",
"layout": {
"embedded": true,
"name": "header",
"align_controls": "center"
},
"link_values": false
},
{
"type": "button",
"tap_action": {
"action": "toggle"
},
"entity": "switch.outside_north_circuit_1"
}
]
},
{
"title": "Electronics Closet",
"path": "electronics-closet",
"icon": "mdi:door",
"badges": [],
"cards": [
{
"type": "entities",
"show_header_toggle": false,
"title": "Temperature Control",
"entities": [
"sensor.closet_temperature",
"input_number.fan_on_temp",
"switch.fan_automation_enabled",
"fan.fan_state"
]
}
]
}
]
}
}
}

View File

@ -0,0 +1,91 @@
{
"version": 1,
"key": "lovelace.system_setup",
"data": {
"config": {
"views": [
{
"title": "Main",
"path": "main",
"badges": [],
"cards": [
{
"type": "entities",
"show_header_toggle": false,
"entities": [
{
"type": "weblink",
"name": "ESPHome",
"url": "/15ef4d2f_esphome",
"icon": "mdi:alpha-e-box"
},
{
"type": "weblink",
"name": "HACS",
"url": "/hacs/entry",
"icon": "mdi:alpha-h-box"
},
{
"type": "weblink",
"name": "Dashboards",
"url": "/config/lovelace/dashboards",
"icon": "mdi:view-dashboard-variant"
},
{
"type": "weblink",
"name": "Edit Configuration Files",
"url": "/a0d7b954_vscode",
"icon": "mdi:playlist-edit"
}
]
},
{
"type": "entities",
"title": "HomeAssistant",
"show_header_toggle": false,
"entities": [
{
"type": "weblink",
"name": "Home Assistant",
"url": "https://home-assistant.io",
"icon": "mdi:home-assistant"
},
{
"type": "weblink",
"name": "Configuring Home Assistant",
"url": "https://home-assistant.io/getting-started/configuration/",
"icon": "mdi:assistant"
},
{
"type": "weblink",
"name": "Available Components",
"url": "https://home-assistant.io/components/",
"icon": "mdi:briefcase-check"
},
{
"type": "weblink",
"name": "Troubleshooting your configuration",
"url": "https://home-assistant.io/docs/configuration/troubleshooting/",
"icon": "mdi:wrench"
},
{
"type": "weblink",
"name": "Getting Help",
"url": "https://home-assistant.io/help/",
"icon": "mdi:help"
},
{
"type": "weblink",
"name": "Home Assistant Forum",
"url": "https://community.home-assistant.io",
"icon": "mdi:comment-multiple-outline"
}
]
}
]
}
],
"title": "System Setup Navigator"
}
}
}

View File

@ -0,0 +1,24 @@
{
"version": 1,
"key": "lovelace_dashboards",
"data": {
"items": [
{
"require_admin": false,
"show_in_sidebar": true,
"title": "Learning",
"url_path": "lovelace-learning",
"mode": "storage",
"id": "lovelace_learning"
},
{
"require_admin": true,
"show_in_sidebar": true,
"title": "Setup",
"url_path": "system-setup",
"mode": "storage",
"id": "system_setup"
}
]
}
}

View File

@ -0,0 +1,23 @@
{
"version": 1,
"key": "lovelace_resources",
"data": {
"items": [
{
"url": "/hacsfiles/button-card/button-card.js",
"type": "module",
"id": "2e6bc398cf194600a54c288f0f39df30"
},
{
"url": "/hacsfiles/lovelace-time-picker-card/time-picker-card.js",
"type": "module",
"id": "320b29e23fa841389e7f288518351f20"
},
{
"url": "/hacsfiles/lovelace-darksky-card/lovelace-darksky-card.js",
"type": "module",
"id": "1b05f5d79aba4d86876333158b04a3c9"
}
]
}
}

530
.storage/mobile_app Normal file
View File

@ -0,0 +1,530 @@
{
"version": 1,
"key": "mobile_app",
"data": {
"binary_sensor": {
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_is_charging": {
"added": true,
"attributes": {},
"device_class": "plug",
"icon": "mdi:power-plug",
"name": "Is Charging",
"state": true,
"type": "binary_sensor",
"unique_id": "is_charging",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
}
},
"deleted_ids": [
"e05272f132b2ece8de22ec23b279ff8775479cfe54e60bb4d935111c007480a1",
"e689e9489fb188efebd2131925467e20069b7725bbd125ef8f8765986e124d0f",
"589b63fea7e219d0ebc4a4804c59f7cfacef9c25c4621300f84eb7614446152c"
],
"sensor": {
"05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2_battery_level": {
"added": true,
"attributes": {},
"device_class": "battery",
"icon": "mdi:battery-90",
"name": "Battery Level",
"state": 93,
"type": "sensor",
"unique_id": "battery_level",
"unit_of_measurement": "%",
"webhook_id": "05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2"
},
"05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2_battery_state": {
"added": true,
"attributes": {
"charger_type": "unknown",
"is_charging": false
},
"device_class": "battery",
"icon": "mdi:battery-90",
"name": "Battery State",
"state": "discharging",
"type": "sensor",
"unique_id": "battery_state",
"webhook_id": "05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2"
},
"05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2_wifi_connection": {
"added": true,
"attributes": {
"bssid": "0c:80:63:06:fc:b0",
"frequency": 2462,
"ip_address": "10.0.0.50",
"is_hidden": false,
"link_speed": 72,
"signal_level": -1
},
"icon": "mdi:wifi-strength-off",
"name": "Wifi Connection",
"state": "zoesplace",
"type": "sensor",
"unique_id": "wifi_connection",
"webhook_id": "05937d05f5a6239334725f7b14a462ab0e409dbbe11c2cf4b2f20747f403edf2"
},
"589b63fea7e219d0ebc4a4804c59f7cfacef9c25c4621300f84eb7614446152c_battery_level": {
"added": true,
"attributes": {
"charger_type": "N/A",
"is_charging": false
},
"device_class": "battery",
"icon": "mdi:battery-60",
"name": "Battery Level",
"state": 67,
"type": "sensor",
"unique_id": "battery_level",
"unit_of_measurement": "%",
"webhook_id": "589b63fea7e219d0ebc4a4804c59f7cfacef9c25c4621300f84eb7614446152c"
},
"589b63fea7e219d0ebc4a4804c59f7cfacef9c25c4621300f84eb7614446152c_geocoded_location": {
"added": true,
"attributes": {
"Administrative Area": "Oregon",
"Country": "United States",
"ISO Country Code": "US",
"Locality": "Prairie City",
"Location": [
44.4611229,
-118.71172790000001
],
"Postal Code": "97869",
"Sub Administrative Area": "Grant County",
"Sub Locality": null,
"Sub Thoroughfare": "238",
"Thoroughfare": "North McHaley Street"
},
"icon": "mdi:map",
"name": "Geocoded Location",
"state": "238 N McHaley St, Prairie City, OR 97869, USA",
"type": "sensor",
"unique_id": "geocoded_location",
"webhook_id": "589b63fea7e219d0ebc4a4804c59f7cfacef9c25c4621300f84eb7614446152c"
},
"589b63fea7e219d0ebc4a4804c59f7cfacef9c25c4621300f84eb7614446152c_wifi_connection": {
"added": true,
"attributes": {
"bssid": "0c:80:63:06:fc:b0",
"frequency": 2437,
"ip_address": "10.0.0.203",
"is_hidden": false,
"link_speed": 28,
"signal_level": -74
},
"icon": "mdi:wifi-strength-1",
"name": "Wifi Connection",
"state": "zoesplace",
"type": "sensor",
"unique_id": "wifi_connection",
"webhook_id": "589b63fea7e219d0ebc4a4804c59f7cfacef9c25c4621300f84eb7614446152c"
},
"5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be_battery_level": {
"added": true,
"attributes": {},
"device_class": "battery",
"icon": "mdi:battery",
"name": "Battery Level",
"state": 100,
"type": "sensor",
"unique_id": "battery_level",
"unit_of_measurement": "%",
"webhook_id": "5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be"
},
"5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be_battery_state": {
"added": true,
"attributes": {
"is_charging": true,
"charger_type": "ac"
},
"device_class": "battery",
"icon": "mdi:battery-charging",
"name": "Battery State",
"state": "full",
"type": "sensor",
"unique_id": "battery_state",
"webhook_id": "5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be"
},
"5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be_wifi_connection": {
"added": true,
"attributes": {
"bssid": "0c:80:63:91:4c:90",
"ip_address": "10.0.0.203",
"link_speed": 72,
"is_hidden": false,
"frequency": 2437,
"signal_level": -1
},
"icon": "mdi:wifi-strength-off",
"name": "Wifi Connection",
"state": "zoesplace-outside",
"type": "sensor",
"unique_id": "wifi_connection",
"webhook_id": "5f53d4c3439e791aab47663319361609868cb300c034204db0e25e40147d27be"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_audio_sensor": {
"added": true,
"attributes": {
"audio_mode": "normal",
"is_headphones": false,
"is_mic_muted": false,
"is_music_active": false,
"is_speakerphone_on": false,
"volume_level_alarm": 6,
"volume_level_call": 4,
"volume_level_music": 0,
"volume_level_ring": 5
},
"icon": "mdi:volume-high",
"name": "Audio Sensor",
"state": "normal",
"type": "sensor",
"unique_id": "audio_sensor",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_battery_health": {
"added": true,
"attributes": {},
"icon": "mdi:battery-alert",
"name": "Battery Health",
"state": "unknown",
"type": "sensor",
"unique_id": "battery_health",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_battery_level": {
"added": true,
"attributes": {},
"device_class": "battery",
"icon": "mdi:battery",
"name": "Battery Level",
"state": 100,
"type": "sensor",
"unique_id": "battery_level",
"unit_of_measurement": "%",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_battery_state": {
"added": true,
"attributes": {},
"device_class": "battery",
"icon": "mdi:battery-charging",
"name": "Battery State",
"state": "full",
"type": "sensor",
"unique_id": "battery_state",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_bluetooth_connection": {
"added": true,
"attributes": {
"connected_not_paired_devices": "[]",
"connected_paired_devices": "[]",
"is_bt_on": false,
"paired_devices": ""
},
"icon": "mdi:bluetooth",
"name": "Bluetooth Connection",
"state": 0,
"type": "sensor",
"unique_id": "bluetooth_connection",
"unit_of_measurement": "connection(s)",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_charger_type": {
"added": true,
"attributes": {},
"icon": "mdi:power-plug",
"name": "Charger Type",
"state": "ac",
"type": "sensor",
"unique_id": "charger_type",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_detected_activity": {
"added": true,
"attributes": {
"in_vehicle": 10,
"on_bicycle": 10,
"on_foot": 10,
"running": 10,
"still": 10,
"unknown": 40,
"walking": 10
},
"icon": "mdi:progress-question",
"name": "Detected Activity",
"state": "unknown",
"type": "sensor",
"unique_id": "detected_activity",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_dnd_sensor": {
"added": true,
"attributes": {},
"icon": "mdi:do-not-disturb",
"name": "Do Not Disturb Sensor",
"state": "off",
"type": "sensor",
"unique_id": "dnd_sensor",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_last_reboot": {
"added": true,
"attributes": {
"Local Time": "Thu Dec 03 12:36:33 PST 2020",
"Time in Milliseconds": 1607027793942
},
"device_class": "timestamp",
"icon": "mdi:restart",
"name": "Last Reboot",
"state": "2020-12-03T20:36:33Z",
"type": "sensor",
"unique_id": "last_reboot",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_light_sensor": {
"added": true,
"attributes": {},
"device_class": "illuminance",
"icon": "mdi:brightness-5",
"name": "Light Sensor",
"state": "116",
"type": "sensor",
"unique_id": "light_sensor",
"unit_of_measurement": "lx",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_next_alarm": {
"added": true,
"attributes": {
"Local Time": "",
"Package": "",
"Time in Milliseconds": 0.0
},
"device_class": "timestamp",
"icon": "mdi:alarm",
"name": "Next Alarm",
"state": "unavailable",
"type": "sensor",
"unique_id": "next_alarm",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_storage_sensor": {
"added": true,
"attributes": {
"Total internal storage": "116GB"
},
"icon": "mdi:harddisk",
"name": "Storage Sensor",
"state": 88,
"type": "sensor",
"unique_id": "storage_sensor",
"unit_of_measurement": "%",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4_wifi_connection": {
"added": true,
"attributes": {
"bssid": "02:00:00:00:00:00",
"frequency": 5180,
"ip_address": "10.0.0.250",
"is_hidden": true,
"link_speed": 300,
"signal_level": -1
},
"icon": "mdi:wifi-strength-off",
"name": "Wifi Connection",
"state": "<unknown ssid>",
"type": "sensor",
"unique_id": "wifi_connection",
"webhook_id": "972369ddfba8b95dfc4b3ab68f74f19e19227919102c4720d1fc38d9fd45a0b4"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_battery_level": {
"added": true,
"attributes": {},
"device_class": "battery",
"icon": "mdi:battery-50",
"name": "Battery Level",
"state": 58,
"type": "sensor",
"unique_id": "battery_level",
"unit_of_measurement": "%",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_battery_state": {
"added": true,
"attributes": {
"battery_health": "good",
"charger_type": "unknown",
"is_charging": false
},
"device_class": "battery",
"icon": "mdi:battery-50",
"name": "Battery State",
"state": "discharging",
"type": "sensor",
"unique_id": "battery_state",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_bluetooth_connection": {
"added": true,
"attributes": {
"connected_not_paired_devices": [],
"connected_paired_devices": [],
"is_bt_on": false,
"paired_devices": ""
},
"icon": "mdi:bluetooth",
"name": "Bluetooth Connection",
"state": 0,
"type": "sensor",
"unique_id": "bluetooth_connection",
"unit_of_measurement": "connection(s)",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_geocoded_location": {
"added": true,
"attributes": {
"Administrative Area": "Oregon",
"Country": "United States",
"ISO Country Code": "US",
"Locality": "Prairie City",
"Location": [
44.4609349,
-118.71165899999998
],
"Postal Code": "97869",
"Sub Administrative Area": "Grant County",
"Sub Locality": null,
"Sub Thoroughfare": "258",
"Thoroughfare": "South McHaley Avenue"
},
"icon": "mdi:map",
"name": "Geocoded Location",
"state": "258 S McHaley Ave, Prairie City, OR 97869, USA",
"type": "sensor",
"unique_id": "geocoded_location",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_light_sensor": {
"added": true,
"attributes": {},
"device_class": "illuminance",
"icon": "mdi:brightness-5",
"name": "Light Sensor",
"state": "unavailable",
"type": "sensor",
"unique_id": "light_sensor",
"unit_of_measurement": "lx",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_next_alarm": {
"added": true,
"attributes": {
"Local Time": "",
"Package": "",
"Time in Milliseconds": 0
},
"device_class": "timestamp",
"icon": "mdi:alarm",
"name": "Next Alarm",
"state": "unavailable",
"type": "sensor",
"unique_id": "next_alarm",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_storage_sensor": {
"added": true,
"attributes": {
"Free external storage": "17GB",
"Free internal storage": "0GB",
"Total external storage": "29GB",
"Total internal storage": "24GB"
},
"icon": "mdi:harddisk",
"name": "Storage Sensor",
"state": 3,
"type": "sensor",
"unique_id": "storage_sensor",
"unit_of_measurement": "%",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0_wifi_connection": {
"added": true,
"attributes": {
"bssid": "0c:80:63:91:4c:91",
"frequency": 5180,
"ip_address": "10.0.0.81",
"is_hidden": false,
"is_wifi_on": true,
"link_speed": 390,
"signal_level": -63
},
"icon": "mdi:wifi-strength-2",
"name": "Wifi Connection",
"state": "zoesplace-outside",
"type": "sensor",
"unique_id": "wifi_connection",
"webhook_id": "b0bd2f0affedb208d53f95e0f264ec0ba55e5c867ee3a864dd94e29c3f8a8db0"
},
"e689e9489fb188efebd2131925467e20069b7725bbd125ef8f8765986e124d0f_battery_level": {
"added": true,
"attributes": {
"charger_type": "AC",
"is_charging": true
},
"device_class": "battery",
"icon": "mdi:battery-charging",
"name": "Battery Level",
"state": 100,
"type": "sensor",
"unique_id": "battery_level",
"unit_of_measurement": "%",
"webhook_id": "e689e9489fb188efebd2131925467e20069b7725bbd125ef8f8765986e124d0f"
},
"e689e9489fb188efebd2131925467e20069b7725bbd125ef8f8765986e124d0f_geocoded_location": {
"added": true,
"attributes": {
"Administrative Area": "Oregon",
"Country": "United States",
"ISO Country Code": "US",
"Locality": "Prairie City",
"Location": [
44.4611229,
-118.71172790000001
],
"Postal Code": "97869",
"Sub Administrative Area": "Grant County",
"Sub Locality": null,
"Sub Thoroughfare": "238",
"Thoroughfare": "North McHaley Street"
},
"icon": "mdi:map",
"name": "Geocoded Location",
"state": "238 N McHaley St, Prairie City, OR 97869, USA",
"type": "sensor",
"unique_id": "geocoded_location",
"webhook_id": "e689e9489fb188efebd2131925467e20069b7725bbd125ef8f8765986e124d0f"
},
"e689e9489fb188efebd2131925467e20069b7725bbd125ef8f8765986e124d0f_wifi_connection": {
"added": true,
"attributes": {
"bssid": "0c:80:63:91:4c:90",
"frequency": 2437,
"ip_address": "10.0.0.182",
"is_hidden": false,
"link_speed": 72,
"signal_level": -39
},
"icon": "mdi:wifi-strength-3",
"name": "Wifi Connection",
"state": "zoesplace-outside",
"type": "sensor",
"unique_id": "wifi_connection",
"webhook_id": "e689e9489fb188efebd2131925467e20069b7725bbd125ef8f8765986e124d0f"
}
}
}
}

11
.storage/onboarding Normal file
View File

@ -0,0 +1,11 @@
{
"data": {
"done": [
"user",
"core_config",
"integration"
]
},
"key": "onboarding",
"version": 3
}

19
.storage/person Normal file
View File

@ -0,0 +1,19 @@
{
"data": {
"items": [
{
"device_trackers": [
"device_tracker.700t1c",
"device_tracker.sm_g935r4",
"device_tracker.xt1064_2",
"device_tracker.lgus215"
],
"id": "sysadmin",
"name": "sysadmin",
"user_id": "99685dc45d9f40dc8183e11ce5128038"
}
]
},
"key": "person",
"version": 2
}

7
.storage/zone Normal file
View File

@ -0,0 +1,7 @@
{
"data": {
"items": []
},
"key": "zone",
"version": 1
}

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"*.yaml": "home-assistant"
}
}

View File

@ -6,6 +6,7 @@
#port: 1883
#username: !secret MQTT_username
#password: !secret MQTT_password
#discovery: true
birth_message:
topic: "status/ha"
payload: "online"

View File

@ -0,0 +1,18 @@
# lovelace_gen
# {% zones = [ '1':'Front North', '2':'Front South', '3':'Front Beds'} %}
icon: mdi:water
cards:
- type: vertical-stack
cards:
- type: markdown
content: >
# Irrigation
# {% for zone in zones %}
# - type: entity-button
# entity: switch.irrigation_zone_{{ zone }}
# icon: mdi:water
# name: zones[zone]
# tap_action:
# action: toggle
# {% endfor %}

View File

@ -0,0 +1,8 @@
# lovelace_gen
{% if entity.startswith("light") %}
type: light
{% else %}
type: entity-button
{% endif %}
entity: {{ entity }}
name: {{ name }}

View File

@ -4,7 +4,7 @@ cards:
cards:
- type: markdown
content: >
# Control GPIO Relays on Pine64
# Control UCI GPIO Relays
- type: horizontal-stack
cards:
- type: entity-button

View File

@ -0,0 +1,34 @@
# lovelace_gen
title: MQTT Irrigation Buttons
{# icon: mdi:water #}
panel: true
cards:
- type: 'custom:layout-card'
min_columns: 2
max_columns: 4
column_width: 200px
cards:
- type: entity-button
entity: switch.irrigation_pump
icon: mdi:water-pump
name: well pump
tap_action:
action: toggle
{% set zones = {
'1':'Front Yard North',
'2':'Front Yard South',
'3':'Fr. Beds/Back E. Spigot',
'4':'Back Garage Spigot',
'5':'Garden North/West',
'6':'Garden South',
'7':'Back West Spigot'
}
%}
{% for zone,name in zones.items() %}
- type: entity-button
entity: switch.irrigation_zone_{{ zone }}
icon: mdi:water
name: {{ name }}
tap_action:
action: toggle
{% endfor %}

View File

@ -0,0 +1,34 @@
# lovelace_gen
title: Irrigation
icon: mdi:water
panel: true
cards:
- type: 'custom:layout-card'
min_columns: 2
max_columns: 4
column_width: 200px
cards:
- type: entity-button
entity: input_boolean.irrigation_pump
icon: mdi:water-pump
name: well pump
tap_action:
action: toggle
{% set zones = {
'1':'Front Yard North',
'2':'Front Yard South',
'3':'Fr. Beds/Back E. Spigot',
'4':'Back Garage Spigot',
'5':'Garden North/West',
'6':'Garden South',
'7':'Back West Spigot'
}
%}
{% for zone,name in zones.items() %}
- type: entity-button
entity: input_boolean.irrigation_zone_{{ zone }}_state
icon: mdi:water
name: {{ name }}
tap_action:
action: toggle
{% endfor %}

View File

@ -0,0 +1,70 @@
# lovelace_gen
title: Irrigation
cards:
{% set zones = {
'1':'Front Yard North',
'2':'Front Yard South',
'3':'Fr. Beds/Back E. Spigot',
'4':'Back Garage Spigot',
'5':'Garden North/West',
'6':'Garden South',
'7':'Back West Spigot'
}
%}
- type: vertical-stack
cards:
- type: markdown
content: >
# IRRIGATION SYSTEM STATE
theme: solarized_light
- type: entities
show_header_toggle: false
entities:
- entity: input_boolean.irrigation_enabled
- type: divider
- entity: variable.irrigation_next_trigger
- entity: variable.irrigation_next_trigger_dt
- entity: variable.irrigation_next_schedule_name
- entity: variable.irrigation_running_names
- entity: variable.irrigation_queue_names
- type: divider
{% for zone,name in zones.items() %}
- entity: input_boolean.irrigation_zone_{{ zone }}_schedule_enabled
name: {{ name }}
{% endfor %}
{% for zone,name in zones.items() %}
- type: conditional
conditions:
- entity: input_boolean.irrigation_zone_{{ zone }}_schedule_enabled
state: "on"
card:
type: vertical-stack
cards:
- type: markdown
content: >
## {{ name }} : Zone {{ zone }}
theme: slate
- type: entities
entities:
- entity: input_boolean.irrigation_zone_{{ zone }}_state
- entity: input_number.irrigation_zone_{{ zone }}_duration
- type: divider
- entity: variable.irrigation_zone_{{ zone }}_schedule_next_dt
- entity: variable.irrigation_zone_{{ zone }}_schedule_countdown
- type: entities
entities:
- type: custom:fold-entity-row
head: input_boolean.irrigation_zone_{{ zone }}_schedule_enabled
entities:
- type: section
label: 'Schedule Parameters for {{name}}'
- type: divider
- type: section
label: 'Base Time of Day'
- entity: input_number.irrigation_zone_{{ zone }}_schedule_base_hour
- entity: input_number.irrigation_zone_{{ zone }}_schedule_base_minute
- type: divider
- entity: input_select.irrigation_zone_{{ zone }}_schedule_delta
{% endfor %}

View File

@ -0,0 +1,19 @@
# lovelace_gen
{% set zones = ['1','2','3','4','5','6','7','8'] %}
icon: mdi:water
cards:
- type: vertical-stack
cards:
- type: markdown
content: >
# Irrigation
- type: horizontal-stack
cards:
{% for zone in zones %}
- type: entity-button
entity: switch.irrigation_zone_{{ zone }}
icon: mdi:water
name: {{ zone }}
tap_action:
action: toggle
{% endfor %}

View File

@ -0,0 +1,30 @@
# lovelace_gen
{% set zones = {
'1':'Front Yard North',
'2':'Front Yard South',
'3':'Front Yard Beds',
'4':'Back Yard East',
'5':'Back Yard Garage',
'6':'Back Yard West',
'7':'Garden East',
'8':'Garden West'
}
%}
icon: mdi:water
panel: true
cards:
- type: 'custom:layout-card'
{# layout: <layout> #}
{# min_height: <min_height> #}
min_columns: 2
max_columns: 4
column_width: 200px
cards:
{% for zone,name in zones.items() %}
- type: entity-button
entity: switch.irrigation_zone_{{ zone }}
icon: mdi:water
name: {{ name }}
tap_action:
action: toggle
{% endfor %}

View File

@ -0,0 +1,29 @@
path: tiles
title: Tile Test
panel: true
cards:
- type: 'custom:layout-card'
layout: auto
# min_height: <min_height>
# min_columns: 2
# max_columns: 20
# column_width: 50px
# max_width:
# min_width: 50px
flex_grow: 5
# gridcols: <grid-cols>
# gridrows: <grid-rows>
justify_content: flex-start
cards:
- type: 'custom:button-card' #
entity: sensor.outside_temperature #
name: Outside #
label: 238 McHaley
template: large_value #
- type: 'custom:button-card' #
entity: sensor.inside_temperature #
name: Inside #
label: 238 McHaley
template: large_value #
- type: weather-forecast
entity: weather.praire_city_weather

View File

@ -0,0 +1,58 @@
path: tiles
title: Tile Test
theme: Backend-selected
badges: []
panel: true
cards:
- type: 'custom:layout-card'
column_width: 100%
layout: vertical
cards:
- type: 'custom:layout-card'
layout: grid
gridcols: 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px
gridrows: 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px 50px
cards:
- type: 'custom:button-card' #
entity: sensor.outside_temperature #
gridcol: 1/3 # Your first
gridrow: 1/3 # card
name: Outside #
label: 238 McHaley
template: large_value #
- type: custom:canvas-gauge-card
entity: sensor.outside_humidity
name: Humidity (%)
card_height: 135
gridcol: 4/7
gridrow: 1/3
gauge:
type: "radial-gauge"
width: 120
height: 120
# borderShadowWidth: 0
# borderOuterWidth: 0
# borderMiddleWidth: 0
# borderInnerWidth: 0
# minValue: 0
# maxValue: 100
# startAngle: 90
# ticksAngle: 180
# valueBox: true
# majorTicks:
# ["0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100"]
# minorTicks: 2
# strokeTicks: true
# highlights: [{ "from": 80, "to": 100, "color": "rgba(200, 50, 50, .75)" }]
# borders: true
- type: 'custom:button-card' #
entity: sensor.inside_temperature #
gridcol: 1/3 # Your first
gridrow: 4/7 # card
name: Inside #
label: 238 McHaley
template: large_value #
# - type: weather-forecast
# entity: weather.praire_city_weather
# gridcol: 4/14 # Your first
# gridrow: 1/5

View File

@ -0,0 +1,6 @@
# Exampe Scheduler
title: Node Red Scheduler
cards:
- type: iframe
url: 'https://giskard.kebler.net:1880/endpoint/ui'
aspect_ratio: 100%

View File

@ -6,6 +6,9 @@ cards:
## Scheduler Example
- type: vertical-stack
cards:
- type: markdown
content: >
## Scheduler 2
- type: entities
entities:
# - entity: input_datetime.test_schedule_base

View File

@ -0,0 +1,43 @@
# Exampe Scheduler
title: Zone1
cards:
- type: markdown
content: >
## Scheduler Example
- type: vertical-stack
cards:
- type: entities
entities:
# - entity: input_datetime.irrigation_zone_1_schedule_base
- type: section
label: 'Base Time of Day'
- entity: input_number.irrigation_zone_1_schedule_base_hour
- entity: input_number.irrigation_zone_1_schedule_base_minute
- type: divider
- entity: input_select.irrigation_zone_1_schedule_repeatin
# - entity: variable.irrigation_zone_1_schedule_countdown
# - entity: variable.irrigation_zone_1_schedule_next_timestamp
- type: divider
- entity: variable.irrigation_zone_1_schedule_next
- entity: sensor.irrigation_zone_1_schedule_next
- entity: variable.irrigation_zone_1_schedule_countdown
- type: horizontal-stack
cards:
- type: entity-button
name: Enable Scheduler
icon: mdi:timer
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: script.enable_irrigation_zone_1_schedule
entity: script.enable_irrigation_zone_1_schedule
- type: entity-button
name: Disable Scheduler
icon: mdi:timer
tap_action:
action: call-service
service: script.turn_on
service_data:
entity_id: script.disable_irrigation_zone_1_schedule
entity: script.disable_irrigation_zone_1_schedule

View File

@ -0,0 +1,76 @@
sensor:
- platform: template
sensors:
alarm_time:
friendly_name: "Time"
value_template: "{{ '%0.02d:%0.02d' | format(states('input_number.alarmhour') | int, states('input_number.alarmminutes') | int) }}"
- platform: time_date
display_options:
- 'time'
- 'date'
- 'date_time'
- 'time_date'
- 'time_utc'
automation:
- alias: 'Wake Me Up'
trigger:
platform: template
value_template: "{{ states.sensor.time.state == states.sensor.alarm_time.state }}"
condition:
condition: or
conditions:
- condition: and
conditions:
- condition: state
entity_id: input_boolean.alarmweekday
state: 'on'
- condition: time
weekday:
- mon
- tue
- wed
- thu
- fri
- condition: state
entity_id: input_boolean.alarmweekday
state: 'off'
action:
service: notify.notify
data_template:
message: 'Good morning. Time to Wake Up!'
title: ''
group:
default_view:
view: yes
entities:
- group.alarmclock
alarmclock:
name: Wake Me Up
entities:
- automation.wake_me_up
- sensor.alarm_time
- input_number.alarmhour
- input_number.alarmminutes
- input_boolean.alarmweekday
input_boolean:
alarmweekday:
name: Weekdays Only
icon: mdi:calendar
input_number:
alarmhour:
name: Hour
icon: mdi:timer
min: 0
max: 23
step: 1
alarmminutes:
name: Minutes
icon: mdi:timer
min: 0
max: 59
step: 5

View File

@ -0,0 +1,78 @@
# package of switches to test gpio pins/relays for @uci/gpio example
# gpio pins on pine64 in order for relays 1-8 const PINS = [80,73,69,230,229,75,74,70]
switch:
- platform: mqtt
name: "uci Switch 1"
state_topic: "relay/status/80"
command_topic: "relay/set/80"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
- platform: mqtt
name: "pine64 Switch 2"
state_topic: "relay/status/73"
command_topic: "relay/set/73"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
- platform: mqtt
name: "pine64 Switch 3"
state_topic: "relay/status/69"
command_topic: "relay/set/69"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
- platform: mqtt
name: "pine64 Switch 4"
state_topic: "relay/status/230"
command_topic: "relay/set/230"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
- platform: mqtt
name: "pine64 Switch 5"
state_topic: "relay/status/229"
command_topic: "relay/set/229"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
- platform: mqtt
name: "pine64 Switch 6"
state_topic: "relay/status/75"
command_topic: "relay/set/75"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
- platform: mqtt
name: "pine64 Switch 7"
state_topic: "relay/status/74"
command_topic: "relay/set/74"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
- platform: mqtt
name: "pine64 Switch 8"
state_topic: "relay/status/70"
command_topic: "relay/set/70"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:lightbulb
# copy and paste and uncomment below as a view under views: in ui-lovelace.yaml

View File

@ -0,0 +1,165 @@
# - Day
# - Every Other Day
# - Every Third Day
# - Every Week
# values:
# - 3
# - 6
# - 12
# - 24
# - 48
# - 72
# - 168
# sensor:
# - platform: template # Derived values
# sensors:
# irrigation_zone_1_schedule_delta: # computes delta based on choice
# entity_id: input_select.irrigation_zone_1_schedule_repeatin
# unit_of_measurement: 'hours'
# value_template: >
# {% for option in state_attr("input_select.irrigation_zone_1_schedule_repeatin", "options") -%}
# {% if is_state("input_select.irrigation_zone_1_schedule_repeatin", option) -%}
# {{ state_attr("input_select.irrigation_zone_1_schedule_repeatin", 'values')[loop.index - 1] }}
# {%- endif %}
# {%- endfor %}
# format the next timestamp for humans
# irrigation_zone_1_schedule_next:
# friendly_name: Next run to start at
# entity_id: variable.irrigation_zone_1_schedule_next_timestamp
# value_template: '{{ states.variable.irrigation_zone_1_schedule_next.state | int | timestamp_custom("%A, %d %h %H:%M") }}'
# irrigation_zone_1_schedule_countdown:
# friendly_name: Countdown to next run
# entity_id: variable.irrigation_zone_1_schedule_countdown
# # value_template: '{{ states.variable.irrigation_zone_1_schedule_countdown.state | int | timestamp_custom("%A, %d %h %H:%M") }}'
# value_template: >-
# {% set time = states.variable.irrigation_zone_1_schedule_countdown.state | int %}
# {% set minutes = ((time % 3600) / 60) | int %}
# {% set hours = ((time % 86400) / 3600) | int %}
# {% set days = (time / 86400) | int %}
# {{time}} seconds is {{ days }}:{{ hours }}:{{minutes}} (D:H:M)
# switch:
# - platform: mqtt
# name: "Scheduler Test Solenoid"
# state_topic: "status/irrigation/zone_1"
# command_topic: "set/irrigation/zone_1"
# payload_on: "ON"
# payload_off: "OFF"
# qos: 0
# retain: true
# script:
# enable_irrigation_zone_1_schedule:
# sequence:
# - event: ENABLE_SCHEDULE
# - service: variable.set_variable
# data:
# variable: irrigation_zone_1_schedule_countdown
# value_template: '{{ states.variable.irrigation_zone_1_schedule_next_timestamp.state | int - as_timestamp(now()) }}'
# value_template: "{{ as_timestamp(now()) }}"
# - service: variable.set_variable
# data:
# variable: irrigation_zone_1_schedule_dummy_device
# value: 'ON'
# - service: automation.turn_on
# entity_id: automation.irrigation_zone_1_schedule_countdown
# - service: automation.turn_on
# data:
# entity_id: automation.irrigation_zone_1_timer_zero_trigger
# disable_irrigation_zone_1_schedule:
# sequence:
# - service: automation.turn_off
# data:
# entity_id: automation.irrigation_zone_1_schedule_countdown
# - service: variable.set_variable
# data:
# variable: irrigation_zone_1_schedule_countdown
# value: 0
# automation:
# - alias: irrigation_zone_1_schedule_countdown
# initial_state: false
# trigger:
# platform: time_pattern
# seconds: '/1'
# action:
# - service: variable.set_variable
# data:
# variable: irrigation_zone_1_schedule_countdown
# value_template: '{{ [((variable.state | int) - 1), 0] | max }}'
# - alias: irrigation_zone_1_schedule_changed
# # initial_state: false
# trigger:
# platform: state
# action:
# - service: variable.set_variable
# data:
# variable: irrigation_zone_1_schedule_countdown
# value_template: '{{ states.variable.irrigation_zone_1_schedule_next_timestamp.state | int - as_timestamp(now()) }}'
# - service: automation.turn_off
# data:
# entity_id: automation.irrigation_zone_1_timer_zero_trigger
# - service: variable.set_variable
# data:
# variable: irrigation_zone_1_timer_device
# value: 'OFF'
#
#
# - alias: irrigation_zone_1_timer_zero_trigger
# initial_state: false
# trigger:
# platform: numeric_state
# entity_id: variable.irrigation_zone_1_timer_countdown
# below: 1
# action:
# - service: automation.turn_off
# entity_id: automation.irrigation_zone_1_timer_countdown
# - service: variable.set_variable
# data:
# variable: irrigation_zone_1_timer_device
# value: 'OFF'
# #
# return corresponding value from input_select option of same name
# irrigation_zone_1_schedule_delta:
# entity_id: input_select.irrigation_zone_1_schedule_repeatin
# value_template: >
# {% for option in state_attr("input_select.irrigation_zone_1_schedule_repeatin", "options") -%}
# {% if is_state("input_select.irrigation_zone_1_schedule_repeatin", option) -%}
# {{ state_attr("input_select.irrigation_zone_1_schedule_repeatin", 'values')[loop.index - 1] }}
# {%- endif %}
# {%- endfor %}
# irrigation_zone_1_schedule_base_timestamp:
# entity_id: input_datetime.irrigation_zone_1_schedule_base
# value_template: >
# {{
# as_timestamp(now())
# - ( now().second + now().minute | int * 60 + now().hour | int * 3600 )
# + state_attr('input_datetime.irrigation_zone_1_schedule_base','hour')|int * 3600
# + state_attr('input_datetime.irrigation_zone_1_schedule_base','minute') * 60
# }}
# value_template: "{{ (state_attr('input_datetime.irrigation_zone_1_schedule_base','hour')|int * 3600 + state_attr('input_datetime.irrigation_zone_1_schedule_base','minute')|int * 60) | timestamp_custom('%A, %d %h %H:%M') }}"
# value_template: >
# "{{ (state_attr('input_datetime.irrigation_zone_1_schedule_base','hour')|int * 3600 +
# state_attr('input_datetime.irrigation_zone_1_schedule_base','minute')|int * 60 +
# as_timestamp(now()))
# | timestamp_custom("%A, %d %h %H:%M") }}"
# value_template: "{{ states(input_datetime.irrigation_zone_1_schedule_base) }}"
# {{ as_timestamp(now()) + as_timestamp(states.input_datetime.irrigation_zone_1_schedule_base) }}
# {{ as_timestamp(now()) + as_timestamp(states.input_datetime.irrigation_zone_1_schedule_base) }}

View File

@ -0,0 +1,47 @@
homeassistant:
# Customize for Sprinklers - map relay to sprinkler name/location
customize:
switch.relay1:
friendly_name: Front Yard North
# sensor.closet_temperature:
# friendly_name: Closet Temperature (C)
# input_number.fan_on_temp:
# friendly_name: Fan On Set Temperature (C)
# 8 Relay Board, Topic number is gpio pin
switch:
- platform: mqtt
name: "relay1" # Pine64 gpio 80 is pin 40
state_topic: "relays/status/80"
command_topic: "relays/set/80"
state_on: "on"
state_off: "off"
payload_on: "on"
payload_off: "off"
icon: mdi:water
# This automation script runs when a value is received via MQTT on retained topic: setTemperature
# It sets the value slider on the GUI. This slides also had its own automation when the value is changed.
automation:
# - alias: Closet Fan On Set Temperature slider
# trigger:
# platform: mqtt
# topic: 'closet/status/fan/automation/temp'
# action:
# service: input_number.set_value
# data_template:
# entity_id: input_number.fan_on_temp
# value: "{{ trigger.payload }}"
# This second automation script runs when the target temperature slider is moved.
# It publishes its value to the same MQTT topic it is also subscribed to.
# - alias: Closet Fan Temp Slider Moved
# trigger:
# platform: state
# entity_id: input_number.fan_on_temp
# action:
# service: mqtt.publish
# data_template:
# topic: 'closet/fan/automation/temp'
# retain: true
# payload: "{{ states('input_number.fan_on_temp') }}"

View File

@ -0,0 +1,131 @@
- id: lounge_aircon_manual
alias: 'Lounge Room Aircon'
hide_entity: True
trigger:
platform: state
entity_id: input_select.lounge_ac_mode
action:
- service_template: >
{% if is_state('input_select.lounge_ac_mode', 'Powerful Heat') %} shell_command.lounge_ac_powerful_heat
{% elif is_state('input_select.lounge_ac_mode', 'Normal Heat') %} shell_command.lounge_ac_normal_heat
{% elif is_state('input_select.lounge_ac_mode', 'Silent Heat') %} shell_command.lounge_ac_silent_heat
{% elif is_state('input_select.lounge_ac_mode', 'Powerful Cool') %} shell_command.lounge_ac_powerful_cool
{% elif is_state('input_select.lounge_ac_mode', 'Normal Cool') %} shell_command.lounge_ac_normal_cool
{% elif is_state('input_select.lounge_ac_mode', 'Silent Cool') %} shell_command.lounge_ac_silent_cool
{% elif is_state('input_select.lounge_ac_mode', 'Dry') %} shell_command.lounge_ac_dry
{% elif is_state('input_select.lounge_ac_mode', 'Off') %} shell_command.lounge_ac_off
{% endif %}
- id: lounge_aircon_auto_am_on
alias: 'Lounge Room Aircon Scheduled AM On'
trigger:
platform: template
value_template: "{{ states('sensor.time') == (states.input_datetime.lounge_ac_am_on_time.state[0:5]) }}"
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_am_automation # If automation is required and ...
state: 'on'
- condition: or
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_workday # If workday is not tested or is a workday
state: 'off'
- condition: state
entity_id: binary_sensor.workday_sensor
state: 'on'
action:
- service: input_select.select_option
data_template:
entity_id: input_select.lounge_ac_mode
option: >
{% if states.sensor.stats_roomt_mean.state < states.input_number.lounge_ac_heat_temp_set.state %}
Normal Heat
{% elif states.sensor.stats_roomt_mean.state > states.input_number.lounge_ac_cool_temp_set.state %}
Normal Cool
{% else %}
'Off'
{% endif %}
- id: lounge_aircon_auto_pm_on
alias: 'Lounge Room Aircon Scheduled PM On'
trigger:
platform: template
value_template: "{{ states('sensor.time') == (states.input_datetime.lounge_ac_pm_on_time.state[0:5]) }}"
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_pm_automation # If automation is required and ...
state: 'on'
- condition: or
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_workday # If workday is not tested or is a workday
state: 'off'
- condition: state
entity_id: binary_sensor.workday_sensor
state: 'on'
action:
- service: input_select.select_option
data_template:
entity_id: input_select.lounge_ac_mode
option: >
{% if states.sensor.stats_roomt_mean.state < states.input_number.lounge_ac_heat_temp_set.state %}
Normal Heat
{% elif states.sensor.stats_roomt_mean.state > states.input_number.lounge_ac_cool_temp_set.state %}
Normal Cool
{% else %}
'Off'
{% endif %}
- id: lounge_aircon_auto_am_off
alias: 'Lounge Room Aircon Scheduled AM Off'
trigger:
platform: template
value_template: "{{ states('sensor.time') == (states.input_datetime.lounge_ac_am_off_time.state[0:5]) }}"
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_am_automation # If automation is required and ...
state: 'on'
- condition: or
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_workday # If workday is not tested or is a workday
state: 'off'
- condition: state
entity_id: binary_sensor.workday_sensor
state: 'on'
action:
- service: input_select.select_option
data_template:
entity_id: input_select.lounge_ac_mode
option: 'Off'
- id: lounge_aircon_auto_pm_off
alias: 'Lounge Room Aircon Scheduled PM Off'
trigger:
platform: template
value_template: "{{ states('sensor.time') == (states.input_datetime.lounge_ac_pm_off_time.state[0:5]) }}"
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_pm_automation # If automation is required and ...
state: 'on'
- condition: or
conditions:
- condition: state
entity_id: input_boolean.lounge_ac_workday # If workday not tested or if workday
state: 'off'
- condition: state
entity_id: binary_sensor.workday_sensor
state: 'on'
action:
- service: input_select.select_option
data_template:
entity_id: input_select.lounge_ac_mode
option: 'Off'

View File

@ -1,11 +1,11 @@
homeassistant:
customize:
fan.fan_state:
friendly_name: 'Fan State (manual override)'
sensor.closet_temperature:
friendly_name: 'Closet Temperature (C)'
input_number.fan_on_temp:
friendly_name: 'Fan On Set Temperature (C)'
# homeassistant:
# customize:
# fan.fan_state:
# friendly_name: 'Fan State (manual override)'
# sensor.closet_temperature:
# friendly_name: 'Closet Temperature (C)'
# input_number.fan_on_temp:
# friendly_name: 'Fan On Set Temperature (C)'
switch:
- platform: mqtt

View File

@ -0,0 +1,20 @@
sensor:
- platform: wundergroundpws
api_key: d54bc75310ae4d378bc75310aead372e
pws_id: KORPRAIR9
# lang: de
monitored_conditions:
- stationID
- solarRadiation
- obsTimeLocal
- uv
- winddir
- humidity
- dewpt
- heatIndex
- windChill
- precipTotal
- precipRate
- temp
- windGust
- windSpeed

View File

@ -0,0 +1,262 @@
sensor:
- platform: template
sensors:
zone_1_timer:
value_template: '{{ "{:02d}".format(states.input_number.timer_hours_1.state|int) }}:{{ "{:02d}".format(states.input_number.timer_minutes_1.state|int) }}'
friendly_name: "Time"
last_run_zone_1:
friendly_name: "Last Run"
value_template: '{{ (as_timestamp(states.switch.zone_1.last_changed)) | timestamp_custom("%A, %d %h %H:%M") }}'
next_run_zone_1:
friendly_name: "Next Run"
value_template: '{{states.sensor.zone_1_timer_reset_sensor.state}}'
time_delta:
friendly_name: "Zone 1 Timedelta"
value_template: '{{states.input_number.repeat_1.state|int * 3600}}'
duration_1:
value_template: '{{states.input_number.duration_1.state | int}}mins'
friendly_name: "Duration"
repeat_1:
value_template: '{{ "{:02d}".format(states.input_number.repeat_1.state|int)}}hrs'
friendly_name: "Repeat in"
rain_sensor:
friendly_name: "Rainfall Threshold Sensitivity"
value_template: >-
{% if states.sensor.pws_precip_1d.state <= states.input_number.pws_precip_1d_sensitivity.state and states.sensor.pws_precip_today_metric.state <= states.input_number.pws_precip_today_metric_sensitivity.state %}
dry
{% else %}
too wet
{% endif %}
switch mqtt:
- platform: mqtt
name: "Zone 1"
state_topic: "status/irrigation/80"
command_topic: "cmnd/irrigation/80"
payload_on: "ON"
payload_off: "OFF"
qos: 0
retain: true
binary_sensor mqtt:
- platform: mqtt
name: "ZONE 1"
device_class: moisture
state_topic: "cmnd/irrigation/POWER1"
payload_on: "ON"
sensor mqtt:
- platform: mqtt
name: "Zone 1 Timer Reset Sensor"
state_topic: "cmnd/zone_1_control/TIMER"
input_boolean:
reset_zone_1:
name: Reset Next Run Timer
initial: off
icon: mdi:lock-reset
input_number:
timer_minutes_1:
name: "Minutes"
initial: 0
min: 0
max: 55
step: 1
icon: mdi:timer
timer_hours_1:
name: "Hour"
initial: 6
min: 0
max: 23
step: 1
icon: mdi:timer
duration_1:
name: "Set Duration"
initial: 3
min: 0
max: 15
step: 1
icon: mdi:camera-timer
repeat_1:
name: "Set Repeat"
initial: 24
min: 0
max: 48
icon: mdi:repeat
pws_precip_today_metric_sensitivity:
name: "Rainfall mm Sensitivity"
initial: 0.1
min: 0
max: 2
step: 0.1
icon: mdi:contrast
pws_precip_1d_sensitivity:
name: "Rainfall Probability Sensitivity"
initial: 40
min: 0
max: 100
step: 10
icon: mdi:contrast
group:
garden:
view: yes
control: hidden
name: "Garden"
entities:
- group.solenoids
- group.irrigation_timer_1
- group.rain_sensor
- sensor.pws_precip_today_metric
- sensor.pws_precip_1d
- binary_sensor.zone_1
solenoids:
view: no
name: "Back Garden Irrigation"
icon: 'mdi:flower'
entities:
- switch.zone_1
rain_sensor:
view: no
name: "Rainfall Sensitivity"
icon: mdi:contrast
entities:
- sensor.rain_sensor
- input_number.pws_precip_today_metric_sensitivity
- input_number.pws_precip_1d_sensitivity
irrigation_timer_1:
view: no
name: "Sprinklers Zone 1"
icon: mdi:clock
entities:
- sensor.last_run_zone_1
- sensor.next_run_zone_1
- sensor.duration_1
- sensor.repeat_1
- group.setting_zone_1
- automation.activate_zone_1_timer
setting_zone_1:
view: no
control: hidden
name: "Settings"
icon: mdi:settings
entities:
- sensor.zone_1_timer
- input_number.timer_hours_1
- input_number.timer_minutes_1
- input_number.duration_1
- input_number.repeat_1
- input_boolean.reset_zone_1
automation zone_1_1:
alias: "Activate Zone 1 Timer"
trigger:
- platform: time_pattern
minutes: '/1'
condition:
condition: and
conditions:
- condition: template
value_template: '{{(as_timestamp(now()) | timestamp_custom("%A, %d %h %H:%M")) == states.sensor.next_run_zone_1.state}}'
- condition: state
entity_id: sensor.rain_sensor
state: 'dry'
action:
- service: script.turn_on
entity_id: script.activate_irrigation_zone_1
automation zone_1_2:
alias: "Zone 1 Active Notification"
hide_entity: False
trigger:
- platform: state
entity_id: switch.zone_1
from: 'off'
to: 'on'
action:
- service: notify.pushbullet
data:
title: "Irrigation Zone 1"
message: "Watering has started"
automation zone_1_3:
alias: "Zone 1 Completed Notification"
hide_entity: False
trigger:
- platform: state
entity_id: switch.zone_1
from: 'on'
to: 'off'
action:
- service: notify.pushbullet
data:
title: "Irrigation Zone 1"
message: "Watering has completed"
automation zone_1_4:
alias: "Zone 1 Timer Reset"
trigger:
- platform: state
entity_id: input_boolean.reset_zone_1
from: 'off'
to: 'on'
action:
- service: mqtt.publish
data:
topic: "cmnd/zone_1_control/TIMER"
retain: 1
payload_template: >-
{%if now().strftime("%H:%M") > states.sensor.zone_1_timer.state %}
{{(as_timestamp(now() )+24*3600 ) | timestamp_custom("%A, %d %h ")}}{{states.sensor.zone_1_timer.state}}
{%else%}
{{(as_timestamp(now() ) ) | timestamp_custom("%A, %d %h ")}}{{states.sensor.zone_1_timer.state}}
{%endif%}
- delay:
seconds: 1
- service: input_boolean.turn_off
data:
entity_id: input_boolean.reset_zone_1
automation zone_1_5:
alias: "Extend Zone 1 Timer When Wet"
trigger:
- platform: time_pattern
minutes: '/1'
condition:
condition: and
conditions:
- condition: template
value_template: '{{(as_timestamp(now()) | timestamp_custom("%A, %d %h %H:%M")) == states.sensor.next_run_zone_1.state}}'
- condition: state
entity_id: sensor.rain_sensor
state: 'too wet'
action:
- service: mqtt.publish
data:
topic: "cmnd/zone_1_control/TIMER"
retain: 1
payload_template: '{{(as_timestamp(now() )+ states.sensor.time_delta.state | int) | timestamp_custom("%A, %d %h %H:%M") }}'
script:
activate_irrigation_zone_1:
alias: "Activate Irrigation Zone 1"
sequence:
- alias: "Switch on Zone 1"
service: switch.turn_on
entity_id: switch.zone_1
- delay: '00:{{ states.input_number.duration_1.state | int }}:00'
- alias: "Switch off Zone 1"
service: switch.turn_off
entity_id: switch.zone_1
- alias: "Update Next Run Time"
service: mqtt.publish
data:
topic: "cmnd/zone_1_control/TIMER"
retain: 1
payload_template: '{{ (as_timestamp(states.switch.zone_1.last_changed)+ states.sensor.time_delta.state | int) | timestamp_custom("%A, %d %h %H:%M") }}'

View File

@ -1,4 +1,5 @@
- type: homeassistant
# authorization settings - none needed
# - type: homeassistant
# - type: trusted_networks
# trusted_networks:
# - 10.0.0.3

View File

@ -1,8 +1,32 @@
- alias: Update Available Notification
# global and startup automations here
- id: 'themestartup'
alias: 'System - Set Custom Theme at Startup'
trigger:
platform: state
entity_id: updater.updater
platform: homeassistant
event: start
action:
service: notify.martin
service: frontend.set_theme
data:
message: "Update for Home Assistant is available."
name: 'Dark Turqoise'
- alias: Restart Notification
trigger:
platform: homeassistant
event: start
action:
service: notify.pushsafer
data:
title: "Home Assistant Has Restarted"
message: "Attention [i]italic[/i] Text[br][url=https://ha.238.kebler.net/]Home Assitant 238[/url]"
target: ["26583"]
data:
icon: "20"
iconcolor: "#FF00FF"
sound: "33"
vibration: "0"
url: "https://ha.238.kebler.net/"
urltitle: "Open Home Assistant"
time2live: "10"
priority: "2"
retry: "60"
expire: "600"
answer: "1"

View File

@ -1,2 +1,4 @@
fan.fan_state:
friendly_name: This is a dummy entry to be overwrrten
#global friendly names and other customizations can go here
# ex:
#fan.fan_state:
# friendly_name: This is a dummy entry to be overwrrten

4
configs/notify.yaml Normal file
View File

@ -0,0 +1,4 @@
# push notifications services here.
- name: pushsafer
platform: pushsafer
private_key: !secret pushsafer_api_key

View File

@ -1,4 +0,0 @@
# Use this file to store secrets like usernames and passwords.
# Learn more at https://home-assistant.io/docs/configuration/secrets/
some_password: welcome

View File

@ -2,26 +2,54 @@ homeassistant:
# see packages/aa_system.yaml for basic settings
customize: !include configs/customize.yaml
auth_providers: !include configs/auth.yaml
# mqtt: !include configs/mqtt.yaml # set by integration
packages: !include_dir_named packages
# discovery:
default_config:
# CONIG FILES
# group: !include configs/groups.yaml
automation: !include configs/automations.yaml
notify: !include configs/notify.yaml
# group: !include configs/groups.yaml
# script: !include configs/scripts.yaml
# http: !include configs/http.yaml
# mqtt: !include configs/mqtt.yaml
# panel_iframe: !include configs/panel.yaml
python_script:
# see https://github.com/thomasloven/hass-browser_mod
# browser_mod:
frontend:
themes: !include_dir_merge_named themes
# not needed browser_mod handles it
extra_module_url:
# see https://github.com/Villhellm/custom-sidebar
- /hacsfiles/custom-sidebar/custom-sidebar.js
# lovelace_gen:
lovelace:
mode: yaml
mode: storage
dashboards: !include lovelace/dashboards.yaml
# needed for any time of day related triggers
sensor:
- platform: time_date
display_options:
- 'time'
- 'date'
- 'date_time'
- 'date_time_iso'
- 'time_date'
- 'time_utc'
- 'beat'
# sensor:
# - platform: time_date
# display_options:
# - 'time'
# - 'date'
# - 'date_time'
# - 'date_time_iso'
# - 'time_date'
# - 'time_utc'
# - 'beat'
# recorder:
# exclude:
# entities:
# - sensor.time
# - sensor.time_date
# - sensor.date
# - sensor.date_time_iso
# - sensor.date_time_iso
# - sensor.date_time_iso

View File

@ -0,0 +1,52 @@
import logging
from .mod_view import setup_view
from .connection import setup_connection
from .service import setup_service
from .const import (
DOMAIN,
DATA_DEVICES,
DATA_ALIASES,
DATA_ADDERS,
CONFIG_DEVICES,
DATA_CONFIG,
DATA_SETUP_COMPLETE,
)
_LOGGER = logging.getLogger(__name__)
async def async_setup(hass, config):
aliases = {}
for d in config[DOMAIN].get(CONFIG_DEVICES, {}):
name = config[DOMAIN][CONFIG_DEVICES][d].get("name", None)
if name:
aliases[name] = d.replace('_', '-')
hass.data[DOMAIN] = {
DATA_DEVICES: {},
DATA_ALIASES: aliases,
DATA_ADDERS: {},
DATA_CONFIG: config[DOMAIN],
DATA_SETUP_COMPLETE: False,
}
await setup_connection(hass, config)
setup_view(hass)
async_load_platform = hass.helpers.discovery.async_load_platform
await async_load_platform("media_player", DOMAIN, {}, config)
await async_load_platform("sensor", DOMAIN, {}, config)
await async_load_platform("binary_sensor", DOMAIN, {}, config)
await async_load_platform("light", DOMAIN, {}, config)
await async_load_platform("camera", DOMAIN, {}, config)
await setup_service(hass)
hass.data[DOMAIN][DATA_SETUP_COMPLETE] = True
for device in hass.data[DOMAIN][DATA_DEVICES].values():
device.trigger_update()
return True

View File

@ -0,0 +1,50 @@
import logging
from datetime import datetime
from homeassistant.const import STATE_UNAVAILABLE, ATTR_BATTERY_CHARGING, ATTR_BATTERY_LEVEL, STATE_ON, STATE_OFF
from homeassistant.components.binary_sensor import DEVICE_CLASS_MOTION
from .helpers import setup_platform, BrowserModEntity
PLATFORM = 'binary_sensor'
async def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
return setup_platform(hass, config, async_add_devices, PLATFORM, BrowserModSensor)
class BrowserModSensor(BrowserModEntity):
domain = PLATFORM
def __init__(self, hass, connection, deviceID, alias=None):
super().__init__(hass, connection, deviceID, alias)
self.last_seen = None
def updated(self):
self.last_seen = datetime.now()
self.schedule_update_ha_state()
@property
def state(self):
if not self.connection.connection:
return STATE_UNAVAILABLE
if self.data.get('motion', False):
return STATE_ON
return STATE_OFF
@property
def is_on(self):
return not self.data.get('motion', False)
@property
def device_class(self):
return DEVICE_CLASS_MOTION
@property
def device_state_attributes(self):
return {
"type": "browser_mod",
"last_seen": self.last_seen,
ATTR_BATTERY_LEVEL: self.data.get('battery', None),
ATTR_BATTERY_CHARGING: self.data.get('charging', None),
**self.data
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,37 @@
import logging
from datetime import datetime
import base64
from homeassistant.const import STATE_UNAVAILABLE, STATE_ON, STATE_OFF, STATE_IDLE
from homeassistant.components.camera import Camera
from .helpers import setup_platform, BrowserModEntity
PLATFORM = 'camera'
async def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
return setup_platform(hass, config, async_add_devices, PLATFORM, BrowserModCamera)
class BrowserModCamera(Camera, BrowserModEntity):
domain = PLATFORM
def __init__(self, hass, connection, deviceID, alias=None):
Camera.__init__(self)
BrowserModEntity.__init__(self, hass, connection, deviceID, alias)
self.last_seen = None
def updated(self):
if self.last_seen is None or (datetime.now() - self.last_seen).seconds > 15:
self.last_seen = datetime.now()
self.schedule_update_ha_state()
def camera_image(self):
return base64.b64decode(self.data.split(',')[1])
@property
def device_state_attributes(self):
return {
"type": "browser_mod",
"deviceID": self.deviceID,
"last_seen": self.last_seen,
}

View File

@ -0,0 +1,125 @@
import logging
import voluptuous as vol
from homeassistant.components.websocket_api import (
websocket_command,
result_message,
event_message,
async_register_command
)
from .const import WS_CONNECT, WS_UPDATE
from .helpers import get_devices, create_entity, get_config, is_setup_complete
_LOGGER = logging.getLogger(__name__)
async def setup_connection(hass, config):
@websocket_command({
vol.Required("type"): WS_CONNECT,
vol.Required("deviceID"): str,
})
def handle_connect(hass, connection, msg):
deviceID = msg["deviceID"]
device = get_devices(hass).get(deviceID,
BrowserModConnection(hass, deviceID))
device.connect(connection, msg["id"])
get_devices(hass)[deviceID] = device
connection.send_message(result_message(msg["id"]))
@websocket_command({
vol.Required("type"): WS_UPDATE,
vol.Required("deviceID"): str,
vol.Optional("data"): dict,
})
def handle_update(hass, connection, msg):
devices = get_devices(hass)
deviceID = msg["deviceID"]
if deviceID in devices:
devices[deviceID].update(msg.get("data", None))
async_register_command(hass, handle_connect)
async_register_command(hass, handle_update)
class BrowserModConnection:
def __init__(self, hass, deviceID):
self.hass = hass
self.deviceID = deviceID
self.connection = []
self.media_player = None
self.screen = None
self.sensor = None
self.fully = None
self.camera = None
def connect(self, connection, cid):
self.connection.append((connection, cid))
self.trigger_update()
def disconnect():
self.connection.remove((connection, cid))
connection.subscriptions[cid] = disconnect
def send(self, command, **kwargs):
if self.connection:
connection, cid = self.connection[-1]
connection.send_message(event_message(cid, {
"command": command,
**kwargs,
}))
def trigger_update(self):
if is_setup_complete(self.hass):
self.send("update", **get_config(self.hass, self.deviceID))
def update(self, data):
if data.get('browser'):
self.sensor = self.sensor or create_entity(
self.hass,
'sensor',
self.deviceID,
self)
if self.sensor:
self.sensor.data = data.get('browser')
if data.get('player'):
self.media_player = self.media_player or create_entity(
self.hass,
'media_player',
self.deviceID,
self)
if self.media_player:
self.media_player.data = data.get('player')
if data.get('screen'):
self.screen = self.screen or create_entity(
self.hass,
'light',
self.deviceID,
self)
if self.screen:
self.screen.data = data.get('screen')
if data.get('fully'):
self.fully = self.fully or create_entity(
self.hass,
'binary_sensor',
self.deviceID,
self)
if self.fully:
self.fully.data = data.get('fully')
if data.get('camera'):
self.camera = self.camera or create_entity(
self.hass,
'camera',
self.deviceID,
self)
if self.camera:
self.camera.data = data.get('camera')

View File

@ -0,0 +1,35 @@
DOMAIN = "browser_mod"
FRONTEND_SCRIPT_URL = "/browser_mod.js"
DATA_EXTRA_MODULE_URL = 'frontend_extra_module_url'
DATA_DEVICES = "devices"
DATA_ALIASES = "aliases"
DATA_ADDERS = "adders"
DATA_CONFIG = "config"
DATA_SETUP_COMPLETE = "setup_complete"
CONFIG_DEVICES = "devices"
CONFIG_PREFIX = "prefix"
CONFIG_DISABLE = "disable"
CONFIG_DISABLE_ALL = "all"
WS_ROOT = DOMAIN
WS_CONNECT = "{}/connect".format(WS_ROOT)
WS_UPDATE = "{}/update".format(WS_ROOT)
WS_CAMERA = "{}/camera".format(WS_ROOT)
USER_COMMANDS = [
"debug",
"popup",
"close-popup",
"navigate",
"more-info",
"set-theme",
"lovelace-reload",
"window-reload",
"blackout",
"no-blackout",
"toast",
]

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