Compare commits
2 Commits
1efb4dbd2d
...
29a74e2546
| Author | SHA1 | Date | |
|---|---|---|---|
| 29a74e2546 | |||
| 5128fa7358 |
@@ -1 +1 @@
|
||||
2022.12.6
|
||||
2023.2.5
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -9,6 +9,9 @@
|
||||
home-assistant.log
|
||||
home-assistant.log.1
|
||||
home-assistant.log.fault
|
||||
/custom_components/*
|
||||
/tts/*
|
||||
/blueprints/*
|
||||
|
||||
# Example .gitignore file for your config dir.
|
||||
# An * ensures that everything will be ignored.
|
||||
|
||||
35
airsonos.xml
Normal file
35
airsonos.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0"?>
|
||||
<main_log>info</main_log>
|
||||
<upnp_log>info</upnp_log>
|
||||
<util_log>warn</util_log>
|
||||
<raop_log>info</raop_log>
|
||||
<log_limit>-1</log_limit>
|
||||
<max_players>32</max_players>
|
||||
<binding>?</binding>
|
||||
<ports>0:0</ports>
|
||||
<enabled>1</enabled>
|
||||
<max_volume>100</max_volume>
|
||||
<http_length>-1</http_length>
|
||||
<upnp_max>1</upnp_max>
|
||||
<codec>flc</codec>
|
||||
<metadata>1</metadata>
|
||||
<flush>1</flush>
|
||||
<artwork></artwork>
|
||||
<latency>1000:2000</latency>
|
||||
<drift>0</drift>
|
||||
<pcm>http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</pcm>
|
||||
<wav>http-get:*:audio/wav:DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</wav>
|
||||
<flac>http-get:*:audio/flac:DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</flac>
|
||||
<mp3>http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</mp3>
|
||||
<device>
|
||||
<udn>uuid:RINCON_38420B93464001400</udn>
|
||||
<name>Keuken+</name>
|
||||
<mac>bb:bb:0b:93:46:40</mac>
|
||||
<enabled>1</enabled>
|
||||
</device>
|
||||
<device>
|
||||
<udn>uuid:BO5EBO5E-F00D-F00D-FEED-506583CEC197</udn>
|
||||
<name>Bose woonkamer+</name>
|
||||
<mac>bb:bb:7f:f3:34:e1</mac>
|
||||
<enabled>1</enabled>
|
||||
</device>
|
||||
799
automations.yaml
799
automations.yaml
@@ -36,9 +36,9 @@
|
||||
input:
|
||||
motion_sensor: binary_sensor.beweging_hal_motion_detection
|
||||
target_entity: scene.hal_aan
|
||||
illuminance_sensor: sensor.hal_beweging_2_illuminance
|
||||
illuminance_sensor: sensor.beweging_hal_illuminance
|
||||
illuminance_cutoff: input_number.hal_luminance_threshold
|
||||
target_off_entity: switch.hal_lamp_hal_switch
|
||||
target_off_entity: light.lamp_hal
|
||||
no_motion_wait: input_number.hal_beweging_timer
|
||||
time_limit_after: input_datetime.hal_beweging_active
|
||||
time_limit_before: input_datetime.hal_beweging_inactive
|
||||
@@ -48,10 +48,10 @@
|
||||
use_blueprint:
|
||||
path: freakshock88/motion_illuminance_activated_entity.yaml
|
||||
input:
|
||||
motion_sensor: binary_sensor.beweging_keuken_motion_detection
|
||||
motion_sensor: binary_sensor.beweging_keuken_sensor_state_motion
|
||||
target_entity: scene.keuken_verlichting_aan_beweging
|
||||
no_motion_wait: input_number.keuken_timer_off
|
||||
target_off_entity: light.lamp_aanrecht_keuken
|
||||
target_off_entity: light.lamp_aanrecht
|
||||
time_limit_after: input_datetime.keuken_beweging_active
|
||||
time_limit_before: input_datetime.keuken_beweging_inactive
|
||||
- id: '1659077789477'
|
||||
@@ -77,7 +77,7 @@
|
||||
domain: select
|
||||
entity_id: select.harmony_hub_activities
|
||||
type: current_option_changed
|
||||
from: PowerOff
|
||||
from: power_off
|
||||
to: Apple TV kijken 2
|
||||
for:
|
||||
hours: 0
|
||||
@@ -100,6 +100,10 @@
|
||||
data: {}
|
||||
target:
|
||||
entity_id: scene.avond_stand
|
||||
- type: turn_off
|
||||
device_id: 9f4dd21a83f9473a5350876da52296d6
|
||||
entity_id: light.lamp_bank_light
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1660333123289'
|
||||
alias: Badkamer - beweging sensor ochtend
|
||||
@@ -121,11 +125,11 @@
|
||||
use_blueprint:
|
||||
path: freakshock88/motion_illuminance_activated_entity.yaml
|
||||
input:
|
||||
motion_sensor: binary_sensor.beweging_toilet_occupancy
|
||||
target_entity: light.lamp_toilet
|
||||
illuminance_sensor: sensor.beweging_toilet_illuminance_lux
|
||||
motion_sensor: binary_sensor.lumi_lumi_sensor_motion_aq2_occupancy
|
||||
target_entity: light.lamp_wc_beneden_light
|
||||
illuminance_sensor: sensor.lumi_lumi_sensor_motion_aq2_illuminance
|
||||
no_motion_wait: input_number.beweging_toilet_timer
|
||||
target_off_entity: light.lamp_toilet
|
||||
target_off_entity: light.lamp_wc_beneden_light
|
||||
illuminance_cutoff: input_number.beweging_toilet_helderheid
|
||||
- id: '1660502406213'
|
||||
alias: Tuin - Lights On At Sunset
|
||||
@@ -133,21 +137,21 @@
|
||||
use_blueprint:
|
||||
path: CyanAutomation/lights_on_at_sunset.yaml
|
||||
input:
|
||||
target_brightness: 40
|
||||
target_light:
|
||||
area_id: tuin
|
||||
target_brightness: 65
|
||||
- id: '1660507765057'
|
||||
alias: woonkamer - alles uit
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
type: turned_off
|
||||
device_id: 800c3462cb0da0ee95bfcf8c5154278c
|
||||
entity_id: light.lamp_sfeer_dimmer_1
|
||||
device_id: bc61b8f4ddf2fc04d3a0a6001ea7c7c8
|
||||
entity_id: light.lamp_sfeer_woonkamer
|
||||
domain: light
|
||||
condition:
|
||||
- condition: time
|
||||
after: '22:00:00'
|
||||
after: '21:30:00'
|
||||
weekday:
|
||||
- mon
|
||||
- tue
|
||||
@@ -156,6 +160,7 @@
|
||||
- fri
|
||||
- sat
|
||||
- sun
|
||||
before: 04:00:00
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
@@ -166,58 +171,37 @@
|
||||
alias: Slaapkamer - bedlamp aan lage helderheid
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: adc076a39e1a0df058ab1423acca5dde
|
||||
type: action
|
||||
subtype: single_right
|
||||
discovery_id: 0x00158d0002ec3873 action_single_right
|
||||
condition:
|
||||
- condition: device
|
||||
type: is_off
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
domain: light
|
||||
action:
|
||||
- type: turn_on
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
domain: light
|
||||
brightness_pct: 10
|
||||
mode: single
|
||||
- id: '1661103772228'
|
||||
alias: zolder knoppen werken (2) aan
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: a7bc75c4ece60567f111d2ec6dfd1fe8
|
||||
type: action
|
||||
subtype: on_2
|
||||
discovery_id: 0xbc33acfffe6f8eca action_on_2
|
||||
- device_id: dc42e9871d6dfc0ce76c594054038cd9
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_short_press
|
||||
subtype: button_1
|
||||
condition: []
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.werken_op_zolder
|
||||
metadata: {}
|
||||
mode: single
|
||||
- id: '1661103922881'
|
||||
alias: zolder knoppen werken (2) uit
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: a7bc75c4ece60567f111d2ec6dfd1fe8
|
||||
type: action
|
||||
subtype: off_2
|
||||
discovery_id: 0xbc33acfffe6f8eca action_off_2
|
||||
condition: []
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.klaar_met_werken_op_zolder
|
||||
metadata: {}
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: device
|
||||
type: is_off
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
sequence:
|
||||
- type: turn_on
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
brightness_pct: 10
|
||||
- conditions:
|
||||
- condition: device
|
||||
type: is_on
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
sequence:
|
||||
- type: turn_off
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1661107342293'
|
||||
alias: Zolder - Wasdroger cycle
|
||||
@@ -292,111 +276,57 @@
|
||||
entity_id: switch.waterklep
|
||||
domain: switch
|
||||
mode: restart
|
||||
- id: '1661802357554'
|
||||
alias: Tuin - Knop verlichting aan
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: c976ab1909dcc67895eccdce5708b0dc
|
||||
type: action
|
||||
subtype: on_4
|
||||
discovery_id: 0x60a423fffe28320f action_on_4
|
||||
condition: []
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data: {}
|
||||
target:
|
||||
entity_id: scene.tuin_avond
|
||||
mode: single
|
||||
- id: '1661802390986'
|
||||
alias: Tuin - Knop tuin verlichting uit
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: c976ab1909dcc67895eccdce5708b0dc
|
||||
type: action
|
||||
subtype: off_4
|
||||
discovery_id: 0x60a423fffe28320f action_off_4
|
||||
condition: []
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
transition: 11
|
||||
target:
|
||||
entity_id: scene.tuin_uit
|
||||
mode: single
|
||||
- id: '1661802536602'
|
||||
alias: Woonkamer - Knop screen open
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: c976ab1909dcc67895eccdce5708b0dc
|
||||
type: action
|
||||
subtype: off_2
|
||||
discovery_id: 0x60a423fffe28320f action_off_2
|
||||
condition: []
|
||||
action:
|
||||
- device_id: a811912be259da54b0aa6a3779e0b3f3
|
||||
domain: cover
|
||||
entity_id: cover.nodeid_31_position
|
||||
type: set_position
|
||||
position: 100
|
||||
mode: single
|
||||
- id: '1661802562810'
|
||||
alias: Woonkamer - Knop screen dicht
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: c976ab1909dcc67895eccdce5708b0dc
|
||||
type: action
|
||||
subtype: on_2
|
||||
discovery_id: 0x60a423fffe28320f action_on_2
|
||||
condition:
|
||||
- type: is_not_open
|
||||
condition: device
|
||||
device_id: 3a24020f2cc036b7a7ff1658e0dbd7d6
|
||||
entity_id: binary_sensor.raam_eetkamer_contact
|
||||
domain: binary_sensor
|
||||
action:
|
||||
- device_id: a811912be259da54b0aa6a3779e0b3f3
|
||||
domain: cover
|
||||
entity_id: cover.nodeid_31_position
|
||||
type: set_position
|
||||
position: 0
|
||||
mode: single
|
||||
- id: '1661802788925'
|
||||
alias: Woonkamer - Knop screen Zon laag
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: c976ab1909dcc67895eccdce5708b0dc
|
||||
type: action
|
||||
subtype: brightness_stop_2
|
||||
discovery_id: 0x60a423fffe28320f action_brightness_stop_2
|
||||
condition: []
|
||||
action:
|
||||
- device_id: a811912be259da54b0aa6a3779e0b3f3
|
||||
domain: cover
|
||||
entity_id: cover.nodeid_31_position
|
||||
type: set_position
|
||||
position: 39
|
||||
mode: single
|
||||
- id: '1661803600011'
|
||||
alias: Woonkamer - ochtend
|
||||
alias: Woonkamer - Beweging
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: time
|
||||
at: 00:07:30
|
||||
condition: []
|
||||
- type: motion
|
||||
platform: device
|
||||
device_id: dba81805bffdc5ab5eb183b0c2d845dc
|
||||
entity_id: binary_sensor.beweging_woonkamer2_iaszone
|
||||
domain: binary_sensor
|
||||
for:
|
||||
hours: 0
|
||||
minutes: 0
|
||||
seconds: 3
|
||||
condition:
|
||||
- condition: or
|
||||
conditions:
|
||||
- condition: time
|
||||
after: 06:30:00
|
||||
before: 08:00:00
|
||||
weekday:
|
||||
- sun
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- sat
|
||||
- fri
|
||||
- condition: time
|
||||
after: '17:30:00'
|
||||
before: '23:00:00'
|
||||
weekday:
|
||||
- sun
|
||||
- mon
|
||||
- tue
|
||||
- wed
|
||||
- thu
|
||||
- fri
|
||||
- sat
|
||||
- condition: device
|
||||
type: is_off
|
||||
device_id: bc61b8f4ddf2fc04d3a0a6001ea7c7c8
|
||||
entity_id: light.lamp_sfeer_woonkamer
|
||||
domain: light
|
||||
for:
|
||||
hours: 0
|
||||
minutes: 10
|
||||
seconds: 0
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.woonkamer_ochtend_scene
|
||||
entity_id: scene.woonkamer_sfeer_verlichting_aan
|
||||
metadata: {}
|
||||
mode: single
|
||||
- id: '1662235717886'
|
||||
@@ -426,12 +356,11 @@
|
||||
alias: Slaapkamer - toggle rgb lamp
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: adc076a39e1a0df058ab1423acca5dde
|
||||
type: action
|
||||
subtype: single_left
|
||||
discovery_id: 0x00158d0002ec3873 action_single_left
|
||||
- device_id: dc42e9871d6dfc0ce76c594054038cd9
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_short_press
|
||||
subtype: button_2
|
||||
condition: []
|
||||
action:
|
||||
- if:
|
||||
@@ -441,11 +370,6 @@
|
||||
entity_id: light.lamp_rgb_slaapkamer
|
||||
domain: light
|
||||
then:
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.slaapkamer_rgb_wit
|
||||
metadata: {}
|
||||
enabled: false
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: scene.slaapkamer_dim_wit
|
||||
@@ -456,22 +380,6 @@
|
||||
entity_id: light.lamp_rgb_slaapkamer
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1665381406928'
|
||||
alias: Keuken - Aanrecht S2 - keuken lamp
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
type: changed_states
|
||||
device_id: d6af5907c10dd749aec17d4881e37f8c
|
||||
entity_id: light.lamp_aanrecht_keuken_dimmer_2
|
||||
domain: light
|
||||
condition: []
|
||||
action:
|
||||
- type: toggle
|
||||
device_id: 321e6c4fe63648395bb10ad472d79ebf
|
||||
entity_id: light.lamp_keuken_dimmer_1
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1666338442880'
|
||||
alias: Tuin - melding poort
|
||||
description: ''
|
||||
@@ -498,136 +406,465 @@
|
||||
alias: Slaapkamer - bed lamp feller
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: adc076a39e1a0df058ab1423acca5dde
|
||||
type: action
|
||||
subtype: hold_right
|
||||
discovery_id: 0x00158d0002ec3873 action_hold_right
|
||||
- device_id: dc42e9871d6dfc0ce76c594054038cd9
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_long_press
|
||||
subtype: button_2
|
||||
condition: []
|
||||
action:
|
||||
- device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
- device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
domain: light
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
type: brightness_increase
|
||||
mode: single
|
||||
- id: '1666506798460'
|
||||
alias: Slaapkamer - bedlamp uit (R single click)
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: adc076a39e1a0df058ab1423acca5dde
|
||||
type: action
|
||||
subtype: single_right
|
||||
discovery_id: 0x00158d0002ec3873 action_single_right
|
||||
condition:
|
||||
- condition: device
|
||||
type: is_on
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
domain: light
|
||||
action:
|
||||
- type: turn_off
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1666506915317'
|
||||
alias: Slaapkamer bedlamp max
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: adc076a39e1a0df058ab1423acca5dde
|
||||
type: action
|
||||
subtype: double_right
|
||||
discovery_id: 0x00158d0002ec3873 action_double_right
|
||||
condition:
|
||||
- condition: device
|
||||
type: is_on
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
domain: light
|
||||
action:
|
||||
- type: turn_on
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
domain: light
|
||||
brightness_pct: 90
|
||||
mode: single
|
||||
- id: '1670606586705'
|
||||
alias: schakers lamp bank
|
||||
alias: Woonkamer - lamp sfeer/ bank sync
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
type: changed_states
|
||||
device_id: 0366da9bdbe101d7da225ade40b958e6
|
||||
entity_id: light.lamp_woonkamer_2
|
||||
device_id: bc61b8f4ddf2fc04d3a0a6001ea7c7c8
|
||||
entity_id: light.lamp_sfeer_woonkamer
|
||||
domain: light
|
||||
condition: []
|
||||
condition:
|
||||
- condition: device
|
||||
device_id: e114f1eb7daa22b88511d015df1f12f7
|
||||
domain: select
|
||||
entity_id: select.harmony_hub_activities
|
||||
type: selected_option
|
||||
option: power_off
|
||||
action:
|
||||
- type: toggle
|
||||
device_id: f9dbed5d9d5ff3cfbfd777f7ddd3fe3b
|
||||
entity_id: light.lamp_bank
|
||||
domain: light
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: device
|
||||
type: is_on
|
||||
device_id: bc61b8f4ddf2fc04d3a0a6001ea7c7c8
|
||||
entity_id: light.lamp_sfeer_woonkamer
|
||||
domain: light
|
||||
sequence:
|
||||
- type: turn_on
|
||||
device_id: 9f4dd21a83f9473a5350876da52296d6
|
||||
entity_id: light.lamp_bank_light
|
||||
domain: light
|
||||
brightness_pct: 20
|
||||
- type: turn_on
|
||||
device_id: 4c2d45d53cd5318e416fdc1cc942f65a
|
||||
entity_id: light.lamp_dressoir_light
|
||||
domain: light
|
||||
brightness_pct: 20
|
||||
- conditions:
|
||||
- condition: device
|
||||
type: is_off
|
||||
device_id: bc61b8f4ddf2fc04d3a0a6001ea7c7c8
|
||||
entity_id: light.lamp_sfeer_woonkamer
|
||||
domain: light
|
||||
sequence:
|
||||
- type: turn_off
|
||||
device_id: 9f4dd21a83f9473a5350876da52296d6
|
||||
entity_id: light.lamp_bank_light
|
||||
domain: light
|
||||
- type: turn_off
|
||||
device_id: 4c2d45d53cd5318e416fdc1cc942f65a
|
||||
entity_id: light.lamp_dressoir_light
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1671052282402'
|
||||
alias: slaapkamer bedlamp fel
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: adc076a39e1a0df058ab1423acca5dde
|
||||
type: action
|
||||
subtype: double_right
|
||||
discovery_id: 0x00158d0002ec3873 action_double_right
|
||||
- device_id: dc42e9871d6dfc0ce76c594054038cd9
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_double_press
|
||||
subtype: button_2
|
||||
condition:
|
||||
- condition: device
|
||||
type: is_on
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
action:
|
||||
- type: turn_on
|
||||
device_id: d6fde94fb152332d9abf7e59c93fb32c
|
||||
entity_id: light.lamp_bed_slaapkamer
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
brightness_pct: 85
|
||||
brightness_pct: 100
|
||||
mode: single
|
||||
- id: '1671375517880'
|
||||
alias: Woonkamer - knoppen 4(on) (tuin aan)
|
||||
- id: '1671659606183'
|
||||
alias: Alles uit
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: c976ab1909dcc67895eccdce5708b0dc
|
||||
type: action
|
||||
subtype: on_4
|
||||
discovery_id: 0x60a423fffe28320f action_on_4
|
||||
subtype: brightness_move_down_1
|
||||
discovery_id: 0x60a423fffe28320f action_brightness_move_down_1
|
||||
condition: []
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data: {}
|
||||
target:
|
||||
entity_id: scene.beneden_alles_uit
|
||||
mode: single
|
||||
- id: '1672424581965'
|
||||
alias: slaapkamer tim - schakelaar (Actions)
|
||||
description: ''
|
||||
trigger:
|
||||
- device_id: 3910ebf2dce7c5e241c9a0972c05d25f
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_short_press
|
||||
subtype: left
|
||||
id: arrow_left_click
|
||||
- device_id: 3910ebf2dce7c5e241c9a0972c05d25f
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_short_press
|
||||
subtype: right
|
||||
id: arrow_right_click
|
||||
- device_id: 3910ebf2dce7c5e241c9a0972c05d25f
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_short_press
|
||||
subtype: turn_off
|
||||
id: off_action
|
||||
- device_id: 3910ebf2dce7c5e241c9a0972c05d25f
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_short_press
|
||||
subtype: turn_on
|
||||
id: on_action
|
||||
- device_id: 3910ebf2dce7c5e241c9a0972c05d25f
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_long_release
|
||||
subtype: dim_up
|
||||
id: brightness_move_up
|
||||
- device_id: 3910ebf2dce7c5e241c9a0972c05d25f
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_long_release
|
||||
subtype: dim_down
|
||||
id: brightness_move_down
|
||||
condition: []
|
||||
action:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: arrow_right_click
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: light.rgb_slaapkamer_tim_light
|
||||
data:
|
||||
color_temp: '{% if state_attr("light.rgb_slaapkamer_tim_light","color_temp")
|
||||
is none %} 454 {% elif state_attr("light.rgb_slaapkamer_tim_light","color_temp")|int
|
||||
> 350 %} 333 {% elif state_attr("light.rgb_slaapkamer_tim_light","color_temp")|int
|
||||
> 332 %} 285 {% elif state_attr("light.rgb_slaapkamer_tim_light","color_temp")|int
|
||||
> 284 %} 244 {% else %} 370 {% endif %}
|
||||
|
||||
'
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: off_action
|
||||
sequence:
|
||||
- type: turn_off
|
||||
device_id: 1834f301f21c8a1d8a7a16fe8ee2b6b2
|
||||
entity_id: light.rgb_slaapkamer_tim_light
|
||||
domain: light
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: arrow_left_click
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
data:
|
||||
rgb_color:
|
||||
- '{{ (range(0, 255)|random) }}'
|
||||
- '{{ (range(0, 255)|random) }}'
|
||||
- '{{ (range(0, 255)|random) }}'
|
||||
target:
|
||||
entity_id: light.rgb_slaapkamer_tim_light
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: on_action
|
||||
sequence:
|
||||
- type: turn_on
|
||||
device_id: 1834f301f21c8a1d8a7a16fe8ee2b6b2
|
||||
entity_id: light.rgb_slaapkamer_tim_light
|
||||
domain: light
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: brightness_move_up
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: light.rgb_slaapkamer_tim_light
|
||||
data:
|
||||
brightness: '{% if state_attr("light.rgb_slaapkamer_tim_light","brightness")
|
||||
is none %} 8 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 9 %} 16 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 17 %} 32 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 33 %} 64 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 65 %} 128 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 129 %} 160 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 161 %} 192 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 193 %} 224 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
< 225 %} 255 {% else %} 10 {% endif %}
|
||||
|
||||
'
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id: brightness_move_down
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: light.rgb_slaapkamer_tim_light
|
||||
data:
|
||||
brightness: '{% if state_attr("light.rgb_slaapkamer_tim_light","brightness")
|
||||
is none %} 32 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 254 %} 224 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 223 %} 192 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 191 %} 160 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 159 %} 128 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 127 %} 64 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 63 %} 32 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 31 %} 16 {% elif state_attr("light.rgb_slaapkamer_tim_light","brightness")|int
|
||||
> 15 %} 8 {% else %} 128 {% endif %}
|
||||
|
||||
'
|
||||
mode: single
|
||||
- id: '1673030409002'
|
||||
alias: Hal - voordeur deurbel [BP]
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: AngellusMortis/notification_ring_event.yaml
|
||||
input:
|
||||
doorbell_sensor:
|
||||
- binary_sensor.voordeur_doorbell
|
||||
cooldown: 29
|
||||
notify_target_app: notify.notify
|
||||
- id: '1674677403574'
|
||||
alias: Keuken - Lamp S2 association Aanrecht
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
type: changed_states
|
||||
device_id: 902cb3baf4ede5a269e89018c1ebd1cd
|
||||
entity_id: light.lamp_keuken_2
|
||||
domain: light
|
||||
condition: []
|
||||
action:
|
||||
- type: toggle
|
||||
device_id: 1281186f8b90c2b00053decdf33a6d72
|
||||
entity_id: light.lamp_aanrecht
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1674679921198'
|
||||
alias: Woonkamer - knoppen (robsmart) [BP]
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: Bekkie/robb-smart-8-switch-ROBB-ROB_200-007-0.yaml
|
||||
input:
|
||||
remote: b5245812a93ad1f15abe7ee901e5b43c
|
||||
on_button_4_short:
|
||||
- service: scene.turn_on
|
||||
data: {}
|
||||
target:
|
||||
entity_id: scene.tuin_avond
|
||||
off_button_4_short:
|
||||
- service: scene.turn_on
|
||||
data: {}
|
||||
target:
|
||||
entity_id: scene.tuin_uit
|
||||
on_button_1_short:
|
||||
- type: turn_on
|
||||
device_id: 9f4dd21a83f9473a5350876da52296d6
|
||||
entity_id: light.lamp_bank_light
|
||||
domain: light
|
||||
brightness_pct: 40
|
||||
on_button_2_long: []
|
||||
on_button_2_short:
|
||||
- type: turn_on
|
||||
device_id: 82e1a32555c372d3d5180521d1f84789
|
||||
entity_id: switch.screens_woonkamer
|
||||
domain: switch
|
||||
off_button_2_short:
|
||||
- type: turn_off
|
||||
device_id: 82e1a32555c372d3d5180521d1f84789
|
||||
entity_id: switch.screens_woonkamer
|
||||
domain: switch
|
||||
on_button_3_short:
|
||||
- type: turn_on
|
||||
device_id: 4ef8a164146ae2252807b12b461a9838
|
||||
entity_id: switch.rolluik_woonkamer_2
|
||||
domain: switch
|
||||
off_button_3_short:
|
||||
- type: turn_off
|
||||
device_id: 4ef8a164146ae2252807b12b461a9838
|
||||
entity_id: switch.rolluik_woonkamer_2
|
||||
domain: switch
|
||||
off_button_1_short:
|
||||
- type: turn_off
|
||||
device_id: 9f4dd21a83f9473a5350876da52296d6
|
||||
entity_id: light.lamp_bank_light
|
||||
domain: light
|
||||
- id: '1674681637235'
|
||||
alias: Slaapkamer i&w - knoppen bed willem [BP]
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: andordavoti/zha-aqara-wireless-switch-WXKG02LM.yaml
|
||||
input:
|
||||
aqara_switch: dc42e9871d6dfc0ce76c594054038cd9
|
||||
button_single_press_right:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: device
|
||||
type: is_off
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
sequence:
|
||||
- type: turn_on
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
brightness_pct: 10
|
||||
- conditions:
|
||||
- condition: device
|
||||
type: is_on
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
sequence:
|
||||
- type: turn_off
|
||||
device_id: 01b9a993ffea323f6f094e9c231f6d3c
|
||||
entity_id: light.lamp_bed_willem_light
|
||||
domain: light
|
||||
- id: '1675520145446'
|
||||
alias: Zolder - knoppen bureau willem (BP)
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: Bekkie/robb-smart-8-switch-ROBB-ROB_200-007-0.yaml
|
||||
input:
|
||||
remote: 7ed6c466f25f5b6aa59d9975cefc9e53
|
||||
on_button_1_short:
|
||||
- service: scene.turn_on
|
||||
data: {}
|
||||
target:
|
||||
entity_id: scene.werken_op_zolder
|
||||
off_button_1_short:
|
||||
- service: scene.turn_on
|
||||
data: {}
|
||||
target:
|
||||
entity_id: scene.klaar_met_werken_op_zolder
|
||||
on_button_2_short:
|
||||
- device_id: 9186cc61ae5a6d7206c02fc67cfdb878
|
||||
domain: climate
|
||||
entity_id: climate.ac_zolder
|
||||
type: set_hvac_mode
|
||||
hvac_mode: heat_cool
|
||||
off_button_2_short:
|
||||
- device_id: 9186cc61ae5a6d7206c02fc67cfdb878
|
||||
domain: climate
|
||||
entity_id: climate.ac_zolder
|
||||
type: set_hvac_mode
|
||||
hvac_mode: 'off'
|
||||
- id: '1675628615548'
|
||||
alias: Woonkamer - grover gaat smorgens poetsen
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: time
|
||||
at: 00:01:00
|
||||
condition:
|
||||
- condition: or
|
||||
conditions:
|
||||
- condition: template
|
||||
value_template: '{{ (as_timestamp(now()) - as_timestamp(states.sensor.roborock_vacuum_s5e_last_clean_end.last_updated)
|
||||
)/3600 > 8}}'
|
||||
- condition: and
|
||||
conditions:
|
||||
- condition: template
|
||||
value_template: " - condition: template\n value_template: >-\n {{
|
||||
(as_timestamp(now()) -\n as_timestamp(states.sensor.roborock_vacuum_s5e_last_clean_end.last_updated)\n
|
||||
\ )/3600 > 1}}"
|
||||
- condition: numeric_state
|
||||
entity_id: sensor.roborock_vacuum_s5e_last_clean_area
|
||||
below: 7
|
||||
action:
|
||||
- device_id: b99930765798a4796ca3ebb87e84299e
|
||||
domain: vacuum
|
||||
entity_id: vacuum.roborock_vacuum_s5e
|
||||
type: clean
|
||||
mode: single
|
||||
- id: '1676053221891'
|
||||
alias: Tuin - verlichting sunset
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: sun
|
||||
event: sunset
|
||||
offset: 0
|
||||
condition: []
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
transition: 10
|
||||
target:
|
||||
entity_id: scene.tuin_avond
|
||||
metadata: {}
|
||||
mode: single
|
||||
- id: '1671375563261'
|
||||
alias: woonkamer - knoppen 4-off (tuin uit)
|
||||
- id: '1677101568696'
|
||||
alias: slaapstand
|
||||
description: ''
|
||||
trigger:
|
||||
- platform: device
|
||||
domain: mqtt
|
||||
device_id: c976ab1909dcc67895eccdce5708b0dc
|
||||
type: action
|
||||
subtype: off_4
|
||||
discovery_id: 0x60a423fffe28320f action_off_4
|
||||
condition: []
|
||||
- device_id: dc42e9871d6dfc0ce76c594054038cd9
|
||||
domain: zha
|
||||
platform: device
|
||||
type: remote_button_double_press
|
||||
subtype: button_1
|
||||
condition:
|
||||
- type: is_no_motion
|
||||
condition: device
|
||||
device_id: dba81805bffdc5ab5eb183b0c2d845dc
|
||||
entity_id: binary_sensor.beweging_woonkamer2_iaszone
|
||||
domain: binary_sensor
|
||||
for:
|
||||
hours: 0
|
||||
minutes: 1
|
||||
seconds: 0
|
||||
- condition: time
|
||||
after: '22:00:00'
|
||||
before: 05:00:00
|
||||
- type: is_no_motion
|
||||
condition: device
|
||||
device_id: a55453469f5ec2003aa04648b125621d
|
||||
entity_id: binary_sensor.beweging_hal_motion_detection
|
||||
domain: binary_sensor
|
||||
for:
|
||||
hours: 0
|
||||
minutes: 0
|
||||
seconds: 30
|
||||
action:
|
||||
- service: scene.turn_on
|
||||
data:
|
||||
transition: 10
|
||||
target:
|
||||
entity_id: scene.tuin_uit
|
||||
- type: turn_off
|
||||
device_id: 1281186f8b90c2b00053decdf33a6d72
|
||||
entity_id: light.lamp_aanrecht
|
||||
domain: light
|
||||
- type: turn_off
|
||||
device_id: b6b1a8c1b1f73cb280f602415d0e836c
|
||||
entity_id: switch.lamp_hal
|
||||
domain: switch
|
||||
- type: turn_off
|
||||
device_id: 22f223be563ccfe1828f7837472fb18d
|
||||
entity_id: light.lamp_wc_beneden_light
|
||||
domain: light
|
||||
mode: single
|
||||
- id: '1677177131483'
|
||||
alias: hass - lowbatt meliding sensors naar iphone willem
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: gmlupatelli/low_battery_notification.yaml
|
||||
input:
|
||||
time: '19:40:00'
|
||||
actions:
|
||||
- service: notify.mobile_app_iphone_van_willem
|
||||
data:
|
||||
message: sensor batteries are low {{sensors}}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
script: !include scripts.yaml
|
||||
scene: !include scenes.yaml
|
||||
|
||||
frontend:
|
||||
themes: !include_dir_merge_named themes/
|
||||
|
||||
homeassistant:
|
||||
#packages: !include_dir_named packages/
|
||||
packages: !include_dir_named "integrations"
|
||||
|
||||
|
||||
|
||||
media_dirs:
|
||||
media: /media
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -15,7 +15,7 @@ SENSOR_TYPES = {
|
||||
|
||||
SENSOR_LOCATIONS_TO_URL = {
|
||||
"trashapi": [
|
||||
"http://trashapi.azurewebsites.net/trash?Location={0}&ZipCode={1}&HouseNumber={2}&HouseNumberSuffix={3}&DiftarCode={4}"
|
||||
"http://trashapi.azurewebsites.net/trash?Location={0}&ZipCode={1}&HouseNumber={2}&HouseNumberSuffix={3}&District={4}&DiftarCode={5}&ShowWholeYear={6}"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -66,6 +66,8 @@ CONF_LOCATION = "location"
|
||||
CONF_POSTCODE = "postcode"
|
||||
CONF_STREET_NUMBER = "streetnumber"
|
||||
CONF_STREET_NUMBER_SUFFIX = "streetnumbersuffix"
|
||||
CONF_DISTRICT = "district"
|
||||
CONF_GET_WHOLE_YEAR = "getwholeyear"
|
||||
CONF_DATE_FORMAT = "dateformat"
|
||||
CONF_TIMESPAN_IN_DAYS = "timespanindays"
|
||||
CONF_LOCALE = "locale"
|
||||
@@ -82,6 +84,7 @@ ATTR_YEAR_MONTH_DAY_DATE = "year_month_day_date"
|
||||
ATTR_FRIENDLY_NAME = "friendly_name"
|
||||
ATTR_LAST_COLLECTION_DATE = "last_collection_date"
|
||||
ATTR_TOTAL_COLLECTIONS_THIS_YEAR = "total_collections_this_year"
|
||||
ATTR_WHOLE_YEAR_DATES = "whole_year_dates"
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -16,38 +16,48 @@ class TrashApiAfval(object):
|
||||
postcode,
|
||||
street_number,
|
||||
street_number_suffix,
|
||||
district,
|
||||
diftar_code,
|
||||
get_whole_year,
|
||||
resources,
|
||||
):
|
||||
_LOGGER.debug("Updating Waste collection dates")
|
||||
|
||||
try:
|
||||
API_ENDPOINT = SENSOR_LOCATIONS_TO_URL["trashapi"][0].format(
|
||||
location, postcode, street_number, street_number_suffix, diftar_code
|
||||
location,
|
||||
postcode,
|
||||
street_number,
|
||||
street_number_suffix,
|
||||
district,
|
||||
diftar_code,
|
||||
get_whole_year,
|
||||
)
|
||||
|
||||
r = requests.get(url=API_ENDPOINT)
|
||||
dataList = r.json()
|
||||
|
||||
# Place all possible values in the dictionary even if they are not necessary
|
||||
waste_dict = {}
|
||||
waste_array = []
|
||||
|
||||
# _LOGGER.warning(dataList)
|
||||
|
||||
for data in dataList:
|
||||
|
||||
# find gft.
|
||||
if "gft" in resources and data["name"].lower() == "gft":
|
||||
waste_dict["gft"] = data["date"].split("T")[0]
|
||||
# find kerstboom.
|
||||
if "kerstboom" in resources and data["name"].lower() == "kerstboom":
|
||||
waste_dict["kerstboom"] = data["date"].split("T")[0]
|
||||
# find papier
|
||||
if "papier" in resources and data["name"].lower() == "papier":
|
||||
waste_dict["papier"] = data["date"].split("T")[0]
|
||||
# find pbd.
|
||||
if "pbd" in resources and data["name"].lower() == "pbd":
|
||||
waste_dict["pbd"] = data["date"].split("T")[0]
|
||||
# find gft, kerstboom, papier, pbd, takken or textiel
|
||||
if (
|
||||
("gft" in resources and data["name"].lower() == "gft")
|
||||
or (
|
||||
"kerstboom" in resources and data["name"].lower() == "kerstboom"
|
||||
)
|
||||
or ("papier" in resources and data["name"].lower() == "papier")
|
||||
or ("pbd" in resources and data["name"].lower() == "pbd")
|
||||
or ("takken" in resources and data["name"].lower() == "takken")
|
||||
or ("textiel" in resources and data["name"].lower() == "textiel")
|
||||
):
|
||||
waste_array.append(
|
||||
{data["name"].lower(): data["date"].split("T")[0]}
|
||||
)
|
||||
# find restafval.
|
||||
if "restafval" in resources and data["name"].lower() == "restafval":
|
||||
if (
|
||||
@@ -56,18 +66,20 @@ class TrashApiAfval(object):
|
||||
data["date"].split("T")[0], "%Y-%m-%d"
|
||||
).date()
|
||||
):
|
||||
waste_dict["restafval"] = data["date"].split("T")[0]
|
||||
waste_array.append(
|
||||
{data["name"].lower(): data["date"].split("T")[0]}
|
||||
)
|
||||
else:
|
||||
waste_dict["restafvaldiftardate"] = data["date"].split("T")[0]
|
||||
waste_dict["restafvaldiftarcollections"] = data["totalThisYear"]
|
||||
# find takken
|
||||
if "takken" in resources and data["name"].lower() == "takken":
|
||||
waste_dict["takken"] = data["date"].split("T")[0]
|
||||
# find textiel
|
||||
if "textiel" in resources and data["name"].lower() == "textiel":
|
||||
waste_dict["textiel"] = data["date"].split("T")[0]
|
||||
waste_array.append(
|
||||
{"restafvaldiftardate": data["date"].split("T")[0]}
|
||||
)
|
||||
waste_array.append(
|
||||
{"restafvaldiftarcollections": data["totalThisYear"]}
|
||||
)
|
||||
|
||||
return waste_dict
|
||||
# _LOGGER.warning(waste_array)
|
||||
|
||||
return waste_array
|
||||
except urllib.error.URLError as exc:
|
||||
_LOGGER.error("Error occurred while fetching data: %r", exc.reason)
|
||||
return False
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"domain": "afvalinfo",
|
||||
"name": "Afvalinfo",
|
||||
"version": "1.0.9",
|
||||
"version": "1.1.0",
|
||||
"documentation": "https://github.com/heyajohnny/afvalinfo",
|
||||
"issue_tracker": "https://github.com/heyajohnny/afvalinfo/issues",
|
||||
"dependencies": [],
|
||||
|
||||
@@ -16,10 +16,12 @@ from .const.const import (
|
||||
MIN_TIME_BETWEEN_UPDATES,
|
||||
_LOGGER,
|
||||
CONF_CITY,
|
||||
CONF_DISTRICT,
|
||||
CONF_LOCATION,
|
||||
CONF_POSTCODE,
|
||||
CONF_STREET_NUMBER,
|
||||
CONF_STREET_NUMBER_SUFFIX,
|
||||
CONF_GET_WHOLE_YEAR,
|
||||
CONF_DATE_FORMAT,
|
||||
CONF_TIMESPAN_IN_DAYS,
|
||||
CONF_NO_TRASH_TEXT,
|
||||
@@ -36,6 +38,7 @@ from .const.const import (
|
||||
ATTR_FRIENDLY_NAME,
|
||||
ATTR_LAST_COLLECTION_DATE,
|
||||
ATTR_TOTAL_COLLECTIONS_THIS_YEAR,
|
||||
ATTR_WHOLE_YEAR_DATES,
|
||||
SENSOR_TYPES,
|
||||
)
|
||||
|
||||
@@ -57,12 +60,14 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||
vol.Required(CONF_POSTCODE, default="3361AB"): cv.string,
|
||||
vol.Required(CONF_STREET_NUMBER, default="1"): cv.string,
|
||||
vol.Optional(CONF_STREET_NUMBER_SUFFIX, default=""): cv.string,
|
||||
vol.Optional(CONF_DISTRICT, default=""): cv.string,
|
||||
vol.Optional(CONF_DATE_FORMAT, default="%d-%m-%Y"): cv.string,
|
||||
vol.Optional(CONF_TIMESPAN_IN_DAYS, default="365"): cv.string,
|
||||
vol.Optional(CONF_LOCALE, default="en"): cv.string,
|
||||
vol.Optional(CONF_ID, default=""): cv.string,
|
||||
vol.Optional(CONF_NO_TRASH_TEXT, default="none"): cv.string,
|
||||
vol.Optional(CONF_DIFTAR_CODE, default=""): cv.string,
|
||||
vol.Optional(CONF_GET_WHOLE_YEAR, default="false"): cv.string,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -76,12 +81,14 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
postcode = config.get(CONF_POSTCODE).strip()
|
||||
street_number = config.get(CONF_STREET_NUMBER)
|
||||
street_number_suffix = config.get(CONF_STREET_NUMBER_SUFFIX)
|
||||
district = config.get(CONF_DISTRICT)
|
||||
date_format = config.get(CONF_DATE_FORMAT).strip()
|
||||
timespan_in_days = config.get(CONF_TIMESPAN_IN_DAYS)
|
||||
locale = config.get(CONF_LOCALE)
|
||||
id_name = config.get(CONF_ID)
|
||||
no_trash_text = config.get(CONF_NO_TRASH_TEXT)
|
||||
diftar_code = config.get(CONF_DIFTAR_CODE)
|
||||
get_whole_year = config.get(CONF_GET_WHOLE_YEAR)
|
||||
|
||||
try:
|
||||
resources = config[CONF_RESOURCES].copy()
|
||||
@@ -102,7 +109,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
postcode,
|
||||
street_number,
|
||||
street_number_suffix,
|
||||
district,
|
||||
diftar_code,
|
||||
get_whole_year,
|
||||
resourcesMinusTodayAndTomorrow,
|
||||
)
|
||||
except urllib.error.HTTPError as error:
|
||||
@@ -139,6 +148,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
timespan_in_days,
|
||||
locale,
|
||||
id_name,
|
||||
get_whole_year,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -175,7 +185,9 @@ class AfvalinfoData(object):
|
||||
postcode,
|
||||
street_number,
|
||||
street_number_suffix,
|
||||
district,
|
||||
diftar_code,
|
||||
get_whole_year,
|
||||
resources,
|
||||
):
|
||||
self.data = None
|
||||
@@ -183,7 +195,9 @@ class AfvalinfoData(object):
|
||||
self.postcode = postcode
|
||||
self.street_number = street_number
|
||||
self.street_number_suffix = street_number_suffix
|
||||
self.district = district
|
||||
self.diftar_code = diftar_code
|
||||
self.get_whole_year = get_whole_year
|
||||
self.resources = resources
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
@@ -194,7 +208,9 @@ class AfvalinfoData(object):
|
||||
self.postcode,
|
||||
self.street_number,
|
||||
self.street_number_suffix,
|
||||
self.district,
|
||||
self.diftar_code,
|
||||
self.get_whole_year,
|
||||
self.resources,
|
||||
)
|
||||
|
||||
@@ -209,6 +225,7 @@ class AfvalinfoSensor(Entity):
|
||||
timespan_in_days,
|
||||
locale,
|
||||
id_name,
|
||||
get_whole_year,
|
||||
):
|
||||
self.data = data
|
||||
self.type = sensor_type
|
||||
@@ -217,6 +234,7 @@ class AfvalinfoSensor(Entity):
|
||||
self.timespan_in_days = timespan_in_days
|
||||
self.locale = locale
|
||||
self._name = sensor_friendly_name
|
||||
self._get_whole_year = get_whole_year
|
||||
self.entity_id = "sensor." + (
|
||||
(
|
||||
SENSOR_PREFIX
|
||||
@@ -241,6 +259,7 @@ class AfvalinfoSensor(Entity):
|
||||
self._year_month_day_date = None
|
||||
self._last_collection_date = None
|
||||
self._total_collections_this_year = None
|
||||
self._whole_year_dates = None
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
@@ -266,98 +285,119 @@ class AfvalinfoSensor(Entity):
|
||||
ATTR_IS_COLLECTION_DATE_TODAY: self._is_collection_date_today,
|
||||
ATTR_LAST_COLLECTION_DATE: self._last_collection_date,
|
||||
ATTR_TOTAL_COLLECTIONS_THIS_YEAR: self._total_collections_this_year,
|
||||
ATTR_WHOLE_YEAR_DATES: self._whole_year_dates,
|
||||
}
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
def update(self):
|
||||
self.data.update()
|
||||
waste_data = self.data.data
|
||||
waste_array = self.data.data
|
||||
self._error = False
|
||||
|
||||
try:
|
||||
if waste_data:
|
||||
# Loop through all the dates to put the dates in the whole_year_dates attribute
|
||||
if self._get_whole_year == "True":
|
||||
whole_year_dates = []
|
||||
for waste_data in waste_array:
|
||||
if self.type in waste_data:
|
||||
collection_date = datetime.strptime(
|
||||
waste_data[self.type], "%Y-%m-%d"
|
||||
).date()
|
||||
whole_year_dates.append(
|
||||
datetime.strptime(waste_data[self.type], "%Y-%m-%d").date()
|
||||
)
|
||||
|
||||
# Date in date format "%Y-%m-%d"
|
||||
self._year_month_day_date = str(collection_date)
|
||||
self._whole_year_dates = whole_year_dates
|
||||
|
||||
if collection_date:
|
||||
# Set the values of the sensor
|
||||
self._last_update = datetime.today().strftime("%d-%m-%Y %H:%M")
|
||||
try:
|
||||
if waste_array:
|
||||
for waste_data in waste_array:
|
||||
if self.type in waste_data:
|
||||
collection_date = datetime.strptime(
|
||||
waste_data[self.type], "%Y-%m-%d"
|
||||
).date()
|
||||
|
||||
# Is the collection date today?
|
||||
self._is_collection_date_today = date.today() == collection_date
|
||||
# Date in date format "%Y-%m-%d"
|
||||
self._year_month_day_date = str(collection_date)
|
||||
|
||||
if (
|
||||
self.type == "restafval"
|
||||
and "restafvaldiftardate" in waste_data
|
||||
):
|
||||
self._last_collection_date = str(
|
||||
datetime.strptime(
|
||||
waste_data["restafvaldiftardate"], "%Y-%m-%d"
|
||||
).date()
|
||||
if collection_date:
|
||||
# Set the values of the sensor
|
||||
self._last_update = datetime.today().strftime(
|
||||
"%d-%m-%Y %H:%M"
|
||||
)
|
||||
self._total_collections_this_year = waste_data[
|
||||
"restafvaldiftarcollections"
|
||||
]
|
||||
|
||||
# Days until collection date
|
||||
delta = collection_date - date.today()
|
||||
self._days_until_collection_date = delta.days
|
||||
# Is the collection date today?
|
||||
self._is_collection_date_today = (
|
||||
date.today() == collection_date
|
||||
)
|
||||
|
||||
# Only show the value if the date is lesser than or equal to (today + timespan_in_days)
|
||||
if collection_date <= date.today() + relativedelta(
|
||||
days=int(self.timespan_in_days)
|
||||
):
|
||||
# if the date does not contain a named day or month, return the date as normal
|
||||
if (
|
||||
self.date_format.find("a") == -1
|
||||
and self.date_format.find("A") == -1
|
||||
and self.date_format.find("b") == -1
|
||||
and self.date_format.find("B") == -1
|
||||
self.type == "restafval"
|
||||
and "restafvaldiftardate" in waste_data
|
||||
):
|
||||
self._state = collection_date.strftime(self.date_format)
|
||||
# else convert the named values to the locale names
|
||||
self._last_collection_date = str(
|
||||
datetime.strptime(
|
||||
waste_data["restafvaldiftardate"], "%Y-%m-%d"
|
||||
).date()
|
||||
)
|
||||
self._total_collections_this_year = waste_data[
|
||||
"restafvaldiftarcollections"
|
||||
]
|
||||
|
||||
# Days until collection date
|
||||
delta = collection_date - date.today()
|
||||
self._days_until_collection_date = delta.days
|
||||
|
||||
# Only show the value if the date is lesser than or equal to (today + timespan_in_days)
|
||||
if collection_date <= date.today() + relativedelta(
|
||||
days=int(self.timespan_in_days)
|
||||
):
|
||||
# if the date does not contain a named day or month, return the date as normal
|
||||
if (
|
||||
self.date_format.find("a") == -1
|
||||
and self.date_format.find("A") == -1
|
||||
and self.date_format.find("b") == -1
|
||||
and self.date_format.find("B") == -1
|
||||
):
|
||||
self._state = collection_date.strftime(
|
||||
self.date_format
|
||||
)
|
||||
# else convert the named values to the locale names
|
||||
else:
|
||||
edited_date_format = self.date_format.replace(
|
||||
"%a", "EEE"
|
||||
)
|
||||
edited_date_format = edited_date_format.replace(
|
||||
"%A", "EEEE"
|
||||
)
|
||||
edited_date_format = edited_date_format.replace(
|
||||
"%b", "MMM"
|
||||
)
|
||||
edited_date_format = edited_date_format.replace(
|
||||
"%B", "MMMM"
|
||||
)
|
||||
|
||||
# half babel, half date string... something like EEEE 04-MMMM-2020
|
||||
half_babel_half_date = collection_date.strftime(
|
||||
edited_date_format
|
||||
)
|
||||
|
||||
# replace the digits with qquoted digits 01 --> '01'
|
||||
half_babel_half_date = re.sub(
|
||||
r"(\d+)", r"'\1'", half_babel_half_date
|
||||
)
|
||||
# transform the EEE, EEEE etc... to a real locale date, with babel
|
||||
locale_date = format_date(
|
||||
collection_date,
|
||||
half_babel_half_date,
|
||||
locale=self.locale,
|
||||
)
|
||||
|
||||
self._state = locale_date
|
||||
break # we have a result, break the loop
|
||||
else:
|
||||
edited_date_format = self.date_format.replace(
|
||||
"%a", "EEE"
|
||||
)
|
||||
edited_date_format = edited_date_format.replace(
|
||||
"%A", "EEEE"
|
||||
)
|
||||
edited_date_format = edited_date_format.replace(
|
||||
"%b", "MMM"
|
||||
)
|
||||
edited_date_format = edited_date_format.replace(
|
||||
"%B", "MMMM"
|
||||
)
|
||||
|
||||
# half babel, half date string... something like EEEE 04-MMMM-2020
|
||||
half_babel_half_date = collection_date.strftime(
|
||||
edited_date_format
|
||||
)
|
||||
|
||||
# replace the digits with qquoted digits 01 --> '01'
|
||||
half_babel_half_date = re.sub(
|
||||
r"(\d+)", r"'\1'", half_babel_half_date
|
||||
)
|
||||
# transform the EEE, EEEE etc... to a real locale date, with babel
|
||||
locale_date = format_date(
|
||||
collection_date,
|
||||
half_babel_half_date,
|
||||
locale=self.locale,
|
||||
)
|
||||
|
||||
self._state = locale_date
|
||||
self._hidden = True
|
||||
else:
|
||||
self._hidden = True
|
||||
else:
|
||||
raise ValueError()
|
||||
else:
|
||||
raise ValueError()
|
||||
# collection_date empty
|
||||
raise ValueError()
|
||||
# else:
|
||||
# No matching result data for current waste type, no problem
|
||||
else:
|
||||
raise ValueError()
|
||||
except ValueError:
|
||||
@@ -369,4 +409,5 @@ class AfvalinfoSensor(Entity):
|
||||
# self._is_collection_date_today = False
|
||||
# self._last_collection_date = None
|
||||
# self._total_collections_this_year = None
|
||||
# self._whole_year_dates = None
|
||||
self._last_update = datetime.today().strftime("%d-%m-%Y %H:%M")
|
||||
|
||||
@@ -12,8 +12,7 @@ def get_waste_data_raw(
|
||||
postal_code,
|
||||
street_number,
|
||||
suffix,
|
||||
): # sourcery skip: avoid-builtin-shadow
|
||||
|
||||
):
|
||||
if provider not in SENSOR_COLLECTORS_ICALENDAR.keys():
|
||||
raise ValueError(f"Invalid provider: {provider}, please verify")
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ def get_waste_data_raw(
|
||||
|
||||
try:
|
||||
bag_id = None
|
||||
suffix = suffix.strip().upper()
|
||||
_verify = provider != "suez"
|
||||
url = f"{SENSOR_COLLECTORS_OPZET[provider]}/rest/adressen/{postal_code}-{street_number}"
|
||||
raw_response = requests.get(url, verify=_verify)
|
||||
|
||||
@@ -5,7 +5,7 @@ _LOGGER = logging.getLogger(__name__)
|
||||
|
||||
API = "api"
|
||||
NAME = "afvalwijzer"
|
||||
VERSION = "2022.11.02"
|
||||
VERSION = "2023.01.01"
|
||||
ISSUE_URL = "https://github.com/xirixiz/homeassistant-afvalwijzer/issues"
|
||||
|
||||
SENSOR_COLLECTOR_TO_URL = {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"domain": "afvalwijzer",
|
||||
"name": "Afvalwijzer",
|
||||
"version": "2022.11.02",
|
||||
"version": "2023.01.01",
|
||||
"iot_class": "cloud_polling",
|
||||
"documentation": "https://github.com/xirixiz/homeassistant-afvalwijzer/blob/master/README.md",
|
||||
"issue_tracker": "https://github.com/xirixiz/homeassistant-afvalwijzer/issues",
|
||||
@@ -11,4 +11,4 @@
|
||||
"@xirixiz"
|
||||
],
|
||||
"requirements": []
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||
vol.Optional(CONF_SUFFIX, default=""): cv.string,
|
||||
vol.Optional(CONF_EXCLUDE_PICKUP_TODAY, default="true"): cv.string,
|
||||
vol.Optional(CONF_EXCLUDE_LIST, default=""): cv.string,
|
||||
vol.Optional(CONF_DEFAULT_LABEL, default="Geen"): cv.string,
|
||||
vol.Optional(CONF_DEFAULT_LABEL, default="geen"): cv.string,
|
||||
vol.Optional(CONF_ID.strip().lower(), default=""): cv.string,
|
||||
}
|
||||
)
|
||||
@@ -77,7 +77,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
||||
except ValueError as err:
|
||||
_LOGGER.error(f"Check afvalwijzer platform settings {err.args}")
|
||||
|
||||
fetch_data = AfvalwijzerData(config)
|
||||
fetch_data = AfvalwijzerData(hass, config)
|
||||
|
||||
waste_types_provider = collector.waste_types_provider
|
||||
_LOGGER.debug(f"Generating waste_types_provider list = {waste_types_provider}")
|
||||
@@ -98,7 +98,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
|
||||
|
||||
|
||||
class AfvalwijzerData(object):
|
||||
def __init__(self, config):
|
||||
def __init__(self, hass, config):
|
||||
self._hass = hass
|
||||
self.config = config
|
||||
|
||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||
|
||||
@@ -24,7 +24,7 @@ from ..collector.main_collector import MainCollector
|
||||
# Common
|
||||
suffix = ""
|
||||
exclude_pickup_today = "True"
|
||||
default_label = "Geen"
|
||||
default_label = "geen"
|
||||
exclude_list = ""
|
||||
|
||||
# DeAfvalapp
|
||||
@@ -42,6 +42,11 @@ exclude_list = ""
|
||||
# postal_code = "5146eg"
|
||||
# street_number = "1"
|
||||
|
||||
provider = "rmn"
|
||||
postal_code = "3701XK"
|
||||
street_number = "24"
|
||||
suffix = "b"
|
||||
|
||||
# Opzet
|
||||
# provider = "prezero"
|
||||
# postal_code = "6665CN"
|
||||
@@ -54,9 +59,9 @@ exclude_list = ""
|
||||
# suffix = "C"
|
||||
|
||||
# Ximmio
|
||||
provider = "meerlanden"
|
||||
postal_code = "2121xt"
|
||||
street_number = "38"
|
||||
# provider = "meerlanden"
|
||||
# postal_code = "2121xt"
|
||||
# street_number = "38"
|
||||
|
||||
# Ximmio
|
||||
# provider = "acv"
|
||||
|
||||
@@ -25,6 +25,7 @@ import voluptuous as vol
|
||||
|
||||
from .base import HacsBase
|
||||
from .const import DOMAIN, MINIMUM_HA_VERSION, STARTUP
|
||||
from .data_client import HacsDataClient
|
||||
from .enums import ConfigurationType, HacsDisabledReason, HacsStage, LovelaceMode
|
||||
from .frontend import async_register_frontend
|
||||
from .utils.configuration_schema import hacs_config_combined
|
||||
@@ -87,6 +88,10 @@ async def async_initialize_integration(
|
||||
hacs.hass = hass
|
||||
hacs.queue = QueueManager(hass=hass)
|
||||
hacs.data = HacsData(hacs=hacs)
|
||||
hacs.data_client = HacsDataClient(
|
||||
session=clientsession,
|
||||
client_name=f"HACS/{integration.version}",
|
||||
)
|
||||
hacs.system.running = True
|
||||
hacs.session = clientsession
|
||||
|
||||
@@ -153,8 +158,9 @@ async def async_initialize_integration(
|
||||
hacs.disable_hacs(HacsDisabledReason.RESTORE)
|
||||
return False
|
||||
|
||||
can_update = await hacs.async_can_update()
|
||||
hacs.log.debug("Can update %s repositories", can_update)
|
||||
if not hacs.configuration.experimental:
|
||||
can_update = await hacs.async_can_update()
|
||||
hacs.log.debug("Can update %s repositories", can_update)
|
||||
|
||||
hacs.set_active_categories()
|
||||
|
||||
@@ -168,7 +174,7 @@ async def async_initialize_integration(
|
||||
hacs.log.info("Update entities are only supported when using UI configuration")
|
||||
|
||||
else:
|
||||
hass.config_entries.async_setup_platforms(
|
||||
await hass.config_entries.async_forward_entry_setups(
|
||||
config_entry,
|
||||
[Platform.SENSOR, Platform.UPDATE]
|
||||
if hacs.configuration.experimental
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -28,11 +28,17 @@ from homeassistant.config_entries import ConfigEntry, ConfigEntryState
|
||||
from homeassistant.const import EVENT_HOMEASSISTANT_FINAL_WRITE, Platform
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
||||
from homeassistant.helpers.issue_registry import async_create_issue, IssueSeverity
|
||||
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
||||
from homeassistant.loader import Integration
|
||||
from homeassistant.util import dt
|
||||
|
||||
from .const import DOMAIN, TV
|
||||
from custom_components.hacs.repositories.base import (
|
||||
HACS_MANIFEST_KEYS_TO_EXPORT,
|
||||
REPOSITORY_KEYS_TO_EXPORT,
|
||||
)
|
||||
|
||||
from .const import DOMAIN, TV, URL_BASE
|
||||
from .data_client import HacsDataClient
|
||||
from .enums import (
|
||||
ConfigurationType,
|
||||
HacsCategory,
|
||||
@@ -47,6 +53,7 @@ from .exceptions import (
|
||||
HacsException,
|
||||
HacsExecutionStillInProgress,
|
||||
HacsExpectedException,
|
||||
HacsNotModifiedException,
|
||||
HacsRepositoryArchivedException,
|
||||
HacsRepositoryExistException,
|
||||
HomeAssistantCoreRepositoryException,
|
||||
@@ -164,6 +171,9 @@ class HacsStatus:
|
||||
|
||||
startup: bool = True
|
||||
new: bool = False
|
||||
active_frontend_endpoint_plugin: bool = False
|
||||
active_frontend_endpoint_theme: bool = False
|
||||
inital_fetch_done: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -174,6 +184,7 @@ class HacsSystem:
|
||||
running: bool = False
|
||||
stage = HacsStage.SETUP
|
||||
action: bool = False
|
||||
generator: bool = False
|
||||
|
||||
@property
|
||||
def disabled(self) -> bool:
|
||||
@@ -263,7 +274,7 @@ class HacsRepositories:
|
||||
|
||||
self._default_repositories.add(repo_id)
|
||||
|
||||
def set_repository_id(self, repository, repo_id):
|
||||
def set_repository_id(self, repository: HacsRepository, repo_id: str):
|
||||
"""Update a repository id."""
|
||||
existing_repo_id = str(repository.data.id)
|
||||
if existing_repo_id == repo_id:
|
||||
@@ -348,6 +359,7 @@ class HacsBase:
|
||||
configuration = HacsConfiguration()
|
||||
core = HacsCore()
|
||||
data: HacsData | None = None
|
||||
data_client: HacsDataClient | None = None
|
||||
frontend_version: str | None = None
|
||||
github: GitHub | None = None
|
||||
githubapi: GitHubAPI | None = None
|
||||
@@ -544,8 +556,6 @@ class HacsBase:
|
||||
if check:
|
||||
try:
|
||||
await repository.async_registration(ref)
|
||||
if self.status.new:
|
||||
repository.data.new = False
|
||||
if repository.validate.errors:
|
||||
self.common.skip.append(repository.data.full_name)
|
||||
if not self.status.startup:
|
||||
@@ -559,7 +569,11 @@ class HacsBase:
|
||||
repository.logger.info("%s Validation completed", repository.string)
|
||||
else:
|
||||
repository.logger.info("%s Registration completed", repository.string)
|
||||
except (HacsRepositoryExistException, HacsRepositoryArchivedException):
|
||||
except (HacsRepositoryExistException, HacsRepositoryArchivedException) as exception:
|
||||
if self.system.generator:
|
||||
repository.logger.error(
|
||||
"%s Registration Failed - %s", repository.string, exception
|
||||
)
|
||||
return
|
||||
except AIOGitHubAPIException as exception:
|
||||
self.common.skip.append(repository.data.full_name)
|
||||
@@ -567,6 +581,9 @@ class HacsBase:
|
||||
f"Validation for {repository_full_name} failed with {exception}."
|
||||
) from exception
|
||||
|
||||
if self.status.new:
|
||||
repository.data.new = False
|
||||
|
||||
if repository_id is not None:
|
||||
repository.data.id = repository_id
|
||||
|
||||
@@ -586,34 +603,7 @@ class HacsBase:
|
||||
async def startup_tasks(self, _=None) -> None:
|
||||
"""Tasks that are started after setup."""
|
||||
self.set_stage(HacsStage.STARTUP)
|
||||
|
||||
try:
|
||||
repository = self.repositories.get_by_full_name(HacsGitHubRepo.INTEGRATION)
|
||||
if repository is None:
|
||||
await self.async_register_repository(
|
||||
repository_full_name=HacsGitHubRepo.INTEGRATION,
|
||||
category=HacsCategory.INTEGRATION,
|
||||
default=True,
|
||||
)
|
||||
repository = self.repositories.get_by_full_name(HacsGitHubRepo.INTEGRATION)
|
||||
if repository is None:
|
||||
raise HacsException("Unknown error")
|
||||
|
||||
repository.data.installed = True
|
||||
repository.data.installed_version = self.integration.version.string
|
||||
repository.data.new = False
|
||||
repository.data.releases = True
|
||||
|
||||
self.repository = repository.repository_object
|
||||
self.repositories.mark_default(repository)
|
||||
except HacsException as exception:
|
||||
if "403" in str(exception):
|
||||
self.log.critical(
|
||||
"GitHub API is ratelimited, or the token is wrong.",
|
||||
)
|
||||
else:
|
||||
self.log.critical("Could not load HACS! - %s", exception)
|
||||
self.disable_hacs(HacsDisabledReason.LOAD_HACS)
|
||||
await self.async_load_hacs_from_github()
|
||||
|
||||
if critical := await async_load_from_store(self.hass, "critical"):
|
||||
for repo in critical:
|
||||
@@ -624,16 +614,38 @@ class HacsBase:
|
||||
)
|
||||
break
|
||||
|
||||
if not self.configuration.experimental:
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_update_downloaded_repositories, timedelta(hours=48)
|
||||
)
|
||||
)
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_update_all_repositories,
|
||||
timedelta(hours=96),
|
||||
)
|
||||
)
|
||||
else:
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_load_hacs_from_github,
|
||||
timedelta(hours=48),
|
||||
)
|
||||
)
|
||||
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_get_all_category_repositories, timedelta(hours=3)
|
||||
self.async_update_downloaded_custom_repositories, timedelta(hours=48)
|
||||
)
|
||||
)
|
||||
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_update_all_repositories, timedelta(hours=25)
|
||||
self.async_get_all_category_repositories, timedelta(hours=6)
|
||||
)
|
||||
)
|
||||
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_check_rate_limit, timedelta(minutes=5)
|
||||
@@ -644,14 +656,10 @@ class HacsBase:
|
||||
self.async_prosess_queue, timedelta(minutes=10)
|
||||
)
|
||||
)
|
||||
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_update_downloaded_repositories, timedelta(hours=2)
|
||||
)
|
||||
)
|
||||
self.recuring_tasks.append(
|
||||
self.hass.helpers.event.async_track_time_interval(
|
||||
self.async_handle_critical_repositories, timedelta(hours=2)
|
||||
self.async_handle_critical_repositories, timedelta(hours=6)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -659,6 +667,8 @@ class HacsBase:
|
||||
EVENT_HOMEASSISTANT_FINAL_WRITE, self.data.async_force_write
|
||||
)
|
||||
|
||||
self.log.debug("There are %s scheduled recurring tasks", len(self.recuring_tasks))
|
||||
|
||||
self.status.startup = False
|
||||
self.async_dispatch(HacsDispatchEvent.STATUS, {})
|
||||
|
||||
@@ -756,6 +766,42 @@ class HacsBase:
|
||||
if self.configuration.netdaemon:
|
||||
self.enable_hacs_category(HacsCategory.NETDAEMON)
|
||||
|
||||
async def async_load_hacs_from_github(self, _=None) -> None:
|
||||
"""Load HACS from GitHub."""
|
||||
if self.configuration.experimental and self.status.inital_fetch_done:
|
||||
return
|
||||
|
||||
try:
|
||||
repository = self.repositories.get_by_full_name(HacsGitHubRepo.INTEGRATION)
|
||||
if repository is None:
|
||||
await self.async_register_repository(
|
||||
repository_full_name=HacsGitHubRepo.INTEGRATION,
|
||||
category=HacsCategory.INTEGRATION,
|
||||
default=True,
|
||||
)
|
||||
repository = self.repositories.get_by_full_name(HacsGitHubRepo.INTEGRATION)
|
||||
elif self.configuration.experimental and not self.status.startup:
|
||||
self.log.error("Scheduling update of hacs/integration")
|
||||
self.queue.add(repository.common_update())
|
||||
if repository is None:
|
||||
raise HacsException("Unknown error")
|
||||
|
||||
repository.data.installed = True
|
||||
repository.data.installed_version = self.integration.version.string
|
||||
repository.data.new = False
|
||||
repository.data.releases = True
|
||||
|
||||
self.repository = repository.repository_object
|
||||
self.repositories.mark_default(repository)
|
||||
except HacsException as exception:
|
||||
if "403" in str(exception):
|
||||
self.log.critical(
|
||||
"GitHub API is ratelimited, or the token is wrong.",
|
||||
)
|
||||
else:
|
||||
self.log.critical("Could not load HACS! - %s", exception)
|
||||
self.disable_hacs(HacsDisabledReason.LOAD_HACS)
|
||||
|
||||
async def async_get_all_category_repositories(self, _=None) -> None:
|
||||
"""Get all category repositories."""
|
||||
if self.system.disabled:
|
||||
@@ -763,11 +809,62 @@ class HacsBase:
|
||||
self.log.info("Loading known repositories")
|
||||
await asyncio.gather(
|
||||
*[
|
||||
self.async_get_category_repositories(HacsCategory(category))
|
||||
self.async_get_category_repositories_experimental(category)
|
||||
if self.configuration.experimental
|
||||
else self.async_get_category_repositories(HacsCategory(category))
|
||||
for category in self.common.categories or []
|
||||
]
|
||||
)
|
||||
|
||||
async def async_get_category_repositories_experimental(self, category: str) -> None:
|
||||
"""Update all category repositories."""
|
||||
self.log.debug("Fetching updated content for %s", category)
|
||||
try:
|
||||
category_data = await self.data_client.get_data(category)
|
||||
except HacsNotModifiedException:
|
||||
self.log.debug("No updates for %s", category)
|
||||
return
|
||||
except HacsException as exception:
|
||||
self.log.error("Could not update %s - %s", category, exception)
|
||||
return
|
||||
|
||||
await self.data.register_unknown_repositories(category_data, category)
|
||||
|
||||
for repo_id, repo_data in category_data.items():
|
||||
repo = repo_data["full_name"]
|
||||
if self.common.renamed_repositories.get(repo):
|
||||
repo = self.common.renamed_repositories[repo]
|
||||
if self.repositories.is_removed(repo):
|
||||
continue
|
||||
if repo in self.common.archived_repositories:
|
||||
continue
|
||||
if repository := self.repositories.get_by_full_name(repo):
|
||||
self.repositories.set_repository_id(repository, repo_id)
|
||||
self.repositories.mark_default(repository)
|
||||
if repository.data.last_fetched is None or (
|
||||
repository.data.last_fetched.timestamp() < repo_data["last_fetched"]
|
||||
):
|
||||
repository.data.update_data({**dict(REPOSITORY_KEYS_TO_EXPORT), **repo_data})
|
||||
if (manifest := repo_data.get("manifest")) is not None:
|
||||
repository.repository_manifest.update_data(
|
||||
{**dict(HACS_MANIFEST_KEYS_TO_EXPORT), **manifest}
|
||||
)
|
||||
|
||||
if category == "integration":
|
||||
self.status.inital_fetch_done = True
|
||||
|
||||
if self.stage == HacsStage.STARTUP:
|
||||
for repository in self.repositories.list_all:
|
||||
if (
|
||||
repository.data.category == category
|
||||
and not repository.data.installed
|
||||
and not self.repositories.is_default(repository.data.id)
|
||||
):
|
||||
repository.logger.debug(
|
||||
"%s Unregister stale custom repository", repository.string
|
||||
)
|
||||
self.repositories.unregister(repository)
|
||||
|
||||
async def async_get_category_repositories(self, category: HacsCategory) -> None:
|
||||
"""Get repositories from category."""
|
||||
if self.system.disabled:
|
||||
@@ -843,7 +940,7 @@ class HacsBase:
|
||||
return
|
||||
can_update = await self.async_can_update()
|
||||
self.log.debug(
|
||||
"Can update %s repositories, " "items in queue %s",
|
||||
"Can update %s repositories, items in queue %s",
|
||||
can_update,
|
||||
self.queue.pending_tasks,
|
||||
)
|
||||
@@ -865,9 +962,12 @@ class HacsBase:
|
||||
self.log.info("Loading removed repositories")
|
||||
|
||||
try:
|
||||
removed_repositories = await self.async_github_get_hacs_default_file(
|
||||
HacsCategory.REMOVED
|
||||
)
|
||||
if self.configuration.experimental:
|
||||
removed_repositories = await self.data_client.get_data("removed")
|
||||
else:
|
||||
removed_repositories = await self.async_github_get_hacs_default_file(
|
||||
HacsCategory.REMOVED
|
||||
)
|
||||
except HacsException:
|
||||
return
|
||||
|
||||
@@ -913,7 +1013,7 @@ class HacsBase:
|
||||
|
||||
async def async_update_downloaded_repositories(self, _=None) -> None:
|
||||
"""Execute the task."""
|
||||
if self.system.disabled:
|
||||
if self.system.disabled or self.configuration.experimental:
|
||||
return
|
||||
self.log.info("Starting recurring background task for downloaded repositories")
|
||||
|
||||
@@ -923,6 +1023,21 @@ class HacsBase:
|
||||
|
||||
self.log.debug("Recurring background task for downloaded repositories done")
|
||||
|
||||
async def async_update_downloaded_custom_repositories(self, _=None) -> None:
|
||||
"""Execute the task."""
|
||||
if self.system.disabled or not self.configuration.experimental:
|
||||
return
|
||||
self.log.info("Starting recurring background task for downloaded custom repositories")
|
||||
|
||||
for repository in self.repositories.list_downloaded:
|
||||
if (
|
||||
repository.data.category in self.common.categories
|
||||
and not self.repositories.is_default(repository.data.id)
|
||||
):
|
||||
self.queue.add(repository.update_repository(ignore_issues=True))
|
||||
|
||||
self.log.debug("Recurring background task for downloaded custom repositories done")
|
||||
|
||||
async def async_handle_critical_repositories(self, _=None) -> None:
|
||||
"""Handle critical repositories."""
|
||||
critical_queue = QueueManager(hass=self.hass)
|
||||
@@ -931,8 +1046,11 @@ class HacsBase:
|
||||
was_installed = False
|
||||
|
||||
try:
|
||||
critical = await self.async_github_get_hacs_default_file("critical")
|
||||
except GitHubNotModifiedException:
|
||||
if self.configuration.experimental:
|
||||
critical = await self.data_client.get_data("critical")
|
||||
else:
|
||||
critical = await self.async_github_get_hacs_default_file("critical")
|
||||
except (GitHubNotModifiedException, HacsNotModifiedException):
|
||||
return
|
||||
except HacsException:
|
||||
pass
|
||||
@@ -984,3 +1102,43 @@ class HacsBase:
|
||||
if was_installed:
|
||||
self.log.critical("Restarting Home Assistant")
|
||||
self.hass.async_create_task(self.hass.async_stop(100))
|
||||
|
||||
@callback
|
||||
def async_setup_frontend_endpoint_plugin(self) -> None:
|
||||
"""Setup the http endpoints for plugins if its not already handled."""
|
||||
if self.status.active_frontend_endpoint_plugin or not os.path.exists(
|
||||
self.hass.config.path("www/community")
|
||||
):
|
||||
return
|
||||
|
||||
self.log.info("Setting up plugin endpoint")
|
||||
use_cache = self.core.lovelace_mode == "storage"
|
||||
self.log.info(
|
||||
"<HacsFrontend> %s mode, cache for /hacsfiles/: %s",
|
||||
self.core.lovelace_mode,
|
||||
use_cache,
|
||||
)
|
||||
|
||||
self.hass.http.register_static_path(
|
||||
URL_BASE,
|
||||
self.hass.config.path("www/community"),
|
||||
cache_headers=use_cache,
|
||||
)
|
||||
|
||||
self.status.active_frontend_endpoint_plugin = True
|
||||
|
||||
@callback
|
||||
def async_setup_frontend_endpoint_themes(self) -> None:
|
||||
"""Setup the http endpoints for themes if its not already handled."""
|
||||
if (
|
||||
self.configuration.experimental
|
||||
or self.status.active_frontend_endpoint_theme
|
||||
or not os.path.exists(self.hass.config.path("themes"))
|
||||
):
|
||||
return
|
||||
|
||||
self.log.info("Setting up themes endpoint")
|
||||
# Register themes
|
||||
self.hass.http.register_static_path(f"{URL_BASE}/themes", self.hass.config.path("themes"))
|
||||
|
||||
self.status.active_frontend_endpoint_theme = True
|
||||
|
||||
@@ -6,7 +6,9 @@ from aiogithubapi.common.const import ACCEPT_HEADERS
|
||||
NAME_SHORT = "HACS"
|
||||
DOMAIN = "hacs"
|
||||
CLIENT_ID = "395a8e669c5de9f7c6e8"
|
||||
MINIMUM_HA_VERSION = "2022.10.0"
|
||||
MINIMUM_HA_VERSION = "2022.11.0"
|
||||
|
||||
URL_BASE = "/hacsfiles"
|
||||
|
||||
TV = TypeVar("TV")
|
||||
|
||||
@@ -15,6 +17,8 @@ PACKAGE_NAME = "custom_components.hacs"
|
||||
DEFAULT_CONCURRENT_TASKS = 15
|
||||
DEFAULT_CONCURRENT_BACKOFF_TIME = 1
|
||||
|
||||
HACS_REPOSITORY_ID = "172733314"
|
||||
|
||||
HACS_ACTION_GITHUB_API_HEADERS = {
|
||||
"User-Agent": "HACS/action",
|
||||
"Accept": ACCEPT_HEADERS["preview"],
|
||||
|
||||
@@ -4,7 +4,7 @@ import sys
|
||||
|
||||
if sys.version_info.minor >= 11:
|
||||
# Needs Python 3.11
|
||||
from enum import StrEnum ## pylint: disable=no-name-in-module
|
||||
from enum import StrEnum # # pylint: disable=no-name-in-module
|
||||
else:
|
||||
try:
|
||||
# https://github.com/home-assistant/core/blob/dev/homeassistant/backports/enum.py
|
||||
|
||||
@@ -7,15 +7,13 @@ from aiohttp import web
|
||||
from homeassistant.components.http import HomeAssistantView
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
|
||||
from .const import DOMAIN
|
||||
from .hacs_frontend import locate_dir, VERSION as FE_VERSION
|
||||
from .const import DOMAIN, URL_BASE
|
||||
from .hacs_frontend import VERSION as FE_VERSION, locate_dir
|
||||
from .hacs_frontend_experimental import (
|
||||
locate_dir as experimental_locate_dir,
|
||||
VERSION as EXPERIMENTAL_FE_VERSION,
|
||||
locate_dir as experimental_locate_dir,
|
||||
)
|
||||
|
||||
URL_BASE = "/hacsfiles"
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .base import HacsBase
|
||||
|
||||
@@ -24,8 +22,8 @@ if TYPE_CHECKING:
|
||||
def async_register_frontend(hass: HomeAssistant, hacs: HacsBase) -> None:
|
||||
"""Register the frontend."""
|
||||
|
||||
# Register themes
|
||||
hass.http.register_static_path(f"{URL_BASE}/themes", hass.config.path("themes"))
|
||||
# Setup themes endpoint if needed
|
||||
hacs.async_setup_frontend_endpoint_themes()
|
||||
|
||||
# Register frontend
|
||||
if hacs.configuration.frontend_repo_url:
|
||||
@@ -50,20 +48,6 @@ def async_register_frontend(hass: HomeAssistant, hacs: HacsBase) -> None:
|
||||
hass.data["frontend_extra_module_url"] = set()
|
||||
hass.data["frontend_extra_module_url"].add(f"{URL_BASE}/iconset.js")
|
||||
|
||||
# Register www/community for all other files
|
||||
use_cache = hacs.core.lovelace_mode == "storage"
|
||||
hacs.log.info(
|
||||
"<HacsFrontend> %s mode, cache for /hacsfiles/: %s",
|
||||
hacs.core.lovelace_mode,
|
||||
use_cache,
|
||||
)
|
||||
|
||||
hass.http.register_static_path(
|
||||
URL_BASE,
|
||||
hass.config.path("www/community"),
|
||||
cache_headers=use_cache,
|
||||
)
|
||||
|
||||
hacs.frontend_version = (
|
||||
FE_VERSION if not hacs.configuration.experimental else EXPERIMENTAL_FE_VERSION
|
||||
)
|
||||
@@ -86,6 +70,9 @@ def async_register_frontend(hass: HomeAssistant, hacs: HacsBase) -> None:
|
||||
require_admin=True,
|
||||
)
|
||||
|
||||
# Setup plugin endpoint if needed
|
||||
hacs.async_setup_frontend_endpoint_plugin()
|
||||
|
||||
|
||||
class HacsFrontendDev(HomeAssistantView):
|
||||
"""Dev View Class for HACS."""
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
||||
const t=(t,e,n)=>t(`component.${e}.title`)||(null==n?void 0:n.name)||e,e=(t,e)=>t.callWS({type:"manifest/get",integration:e});export{t as d,e as f};
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,94 +0,0 @@
|
||||
import{P as e,Q as t,_ as o,j as i,e as n,y as a,d as r,n as l}from"./main-c66a9a06.js";e({_template:t`
|
||||
<style>
|
||||
:host {
|
||||
overflow: hidden; /* needed for text-overflow: ellipsis to work on ff */
|
||||
@apply --layout-vertical;
|
||||
@apply --layout-center-justified;
|
||||
@apply --layout-flex;
|
||||
}
|
||||
|
||||
:host([two-line]) {
|
||||
min-height: var(--paper-item-body-two-line-min-height, 72px);
|
||||
}
|
||||
|
||||
:host([three-line]) {
|
||||
min-height: var(--paper-item-body-three-line-min-height, 88px);
|
||||
}
|
||||
|
||||
:host > ::slotted(*) {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
:host > ::slotted([secondary]) {
|
||||
@apply --paper-font-body1;
|
||||
|
||||
color: var(--paper-item-body-secondary-color, var(--secondary-text-color));
|
||||
|
||||
@apply --paper-item-body-secondary;
|
||||
}
|
||||
</style>
|
||||
|
||||
<slot></slot>
|
||||
`,is:"paper-item-body"}),o([l("ha-settings-row")],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[n({type:Boolean,reflect:!0})],key:"narrow",value:void 0},{kind:"field",decorators:[n({type:Boolean,attribute:"three-line"})],key:"threeLine",value:()=>!1},{kind:"method",key:"render",value:function(){return a`
|
||||
<div class="prefix-wrap">
|
||||
<slot name="prefix"></slot>
|
||||
<paper-item-body
|
||||
?two-line=${!this.threeLine}
|
||||
?three-line=${this.threeLine}
|
||||
>
|
||||
<slot name="heading"></slot>
|
||||
<div secondary><slot name="description"></slot></div>
|
||||
</paper-item-body>
|
||||
</div>
|
||||
<div class="content"><slot></slot></div>
|
||||
`}},{kind:"get",static:!0,key:"styles",value:function(){return r`
|
||||
:host {
|
||||
display: flex;
|
||||
padding: 0 16px;
|
||||
align-content: normal;
|
||||
align-self: auto;
|
||||
align-items: center;
|
||||
}
|
||||
paper-item-body {
|
||||
padding: 8px 16px 8px 0;
|
||||
}
|
||||
paper-item-body[two-line] {
|
||||
min-height: calc(
|
||||
var(--paper-item-body-two-line-min-height, 72px) - 16px
|
||||
);
|
||||
flex: 1;
|
||||
}
|
||||
.content {
|
||||
display: contents;
|
||||
}
|
||||
:host(:not([narrow])) .content {
|
||||
display: var(--settings-row-content-display, flex);
|
||||
justify-content: flex-end;
|
||||
flex: 1;
|
||||
padding: 16px 0;
|
||||
}
|
||||
.content ::slotted(*) {
|
||||
width: var(--settings-row-content-width);
|
||||
}
|
||||
:host([narrow]) {
|
||||
align-items: normal;
|
||||
flex-direction: column;
|
||||
border-top: 1px solid var(--divider-color);
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
::slotted(ha-switch) {
|
||||
padding: 16px 0;
|
||||
}
|
||||
div[secondary] {
|
||||
white-space: normal;
|
||||
}
|
||||
.prefix-wrap {
|
||||
display: var(--settings-row-prefix-display);
|
||||
}
|
||||
:host([narrow]) .prefix-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
`}}]}}),i);
|
||||
Binary file not shown.
@@ -1,6 +0,0 @@
|
||||
import{_ as t,H as e,e as i,a7 as o,y as s,n as r}from"./main-c66a9a06.js";import{m as a}from"./c.ba59af11.js";import"./c.e8169f76.js";import"./c.73c7fa75.js";import"./c.743a15a1.js";import"./c.b914d43e.js";import"./c.8e28b461.js";let d=t([r("hacs-generic-dialog")],(function(t,e){return{F:class extends e{constructor(...e){super(...e),t(this)}},d:[{kind:"field",decorators:[i({type:Boolean})],key:"markdown",value:()=>!1},{kind:"field",decorators:[i()],key:"repository",value:void 0},{kind:"field",decorators:[i()],key:"header",value:void 0},{kind:"field",decorators:[i()],key:"content",value:void 0},{kind:"field",key:"_getRepository",value:()=>o(((t,e)=>null==t?void 0:t.find((t=>String(t.id)===e))))},{kind:"method",key:"render",value:function(){if(!this.active||!this.repository)return s``;const t=this._getRepository(this.hacs.repositories,this.repository);return s`
|
||||
<hacs-dialog .active=${this.active} .narrow=${this.narrow} .hass=${this.hass}>
|
||||
<div slot="header">${this.header||""}</div>
|
||||
${this.markdown?this.repository?a.html(this.content||"",t):a.html(this.content||""):this.content||""}
|
||||
</hacs-dialog>
|
||||
`}}]}}),e);export{d as HacsGenericDialog};
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1 +0,0 @@
|
||||
import{c as e}from"./c.6eb9fcd4.js";import{d as t}from"./c.a5550d10.js";import{bN as s,a7 as i}from"./main-c66a9a06.js";import{s as a}from"./c.874c8cfd.js";const n=(t,s,i)=>t.name_by_user||t.name||i&&((t,s)=>{for(const i of s||[]){const s="string"==typeof i?i:i.entity_id,a=t.states[s];if(a)return e(a)}})(s,i)||s.localize("ui.panel.config.devices.unnamed_device","type",s.localize(`ui.panel.config.devices.type.${t.entry_type||"device"}`)),r=e=>e.sendMessagePromise({type:"config/device_registry/list"}),c=(e,s)=>e.subscribeEvents(t((()=>r(e).then((e=>s.setState(e,!0)))),500,!0),"device_registry_updated"),o=(e,t)=>s("_dr",r,c,e,t),d=(e,t)=>{const s={};for(const i of t){const t=e[i.entity_id];null!=t&&t.domain&&null!==i.device_id&&(s[i.device_id]||(s[i.device_id]=[]),s[i.device_id].push(t.domain))}return s},_=(t,s)=>{if(s.name)return s.name;const i=t.states[s.entity_id];return i?e(i):s.original_name?s.original_name:s.entity_id},y=e=>e.sendMessagePromise({type:"config/entity_registry/list"}),m=(e,s)=>e.subscribeEvents(t((()=>y(e).then((e=>s.setState(e,!0)))),500,!0),"entity_registry_updated"),f=(e,t)=>s("_entityRegistry",y,m,e,t),g=i((e=>{const t={};for(const s of Object.values(e))t[s.id]=s;return t})),p=(e,t)=>e.callWS({type:"config/area_registry/create",...t}),u=e=>e.sendMessagePromise({type:"config/area_registry/list"}).then((e=>e.sort(((e,t)=>a(e.name,t.name))))),l=(e,s)=>e.subscribeEvents(t((()=>u(e).then((e=>s.setState(e,!0)))),500,!0),"area_registry_updated"),v=(e,t)=>s("_areaRegistry",u,l,e,t);export{n as a,v as b,_ as c,f as d,g as e,p as f,d as g,o as s};
|
||||
Binary file not shown.
@@ -1,113 +0,0 @@
|
||||
import{bw as a,bx as i,by as t,bz as e,bA as o,bB as l,bC as s,bD as d,bE as n,bF as r,bG as c,bH as u,bI as m,bJ as h,bK as v,bL as p,O as _,_ as b,j as g,e as y,t as k,y as f,k as x,aD as w,bM as $,d as z,n as j}from"./main-c66a9a06.js";import{s as U}from"./c.04ecc0ad.js";import{b as I,e as C}from"./c.07e395f8.js";import"./c.bbadaeea.js";const M=(a,i)=>a.callWS({type:"auth/sign_path",path:i}),q="browser",B={album:{icon:a,layout:"grid"},app:{icon:i,layout:"grid"},artist:{icon:t,layout:"grid",show_list_images:!0},channel:{icon:e,thumbnail_ratio:"portrait",layout:"grid"},composer:{icon:o,layout:"grid",show_list_images:!0},contributing_artist:{icon:t,layout:"grid",show_list_images:!0},directory:{icon:l,layout:"grid",show_list_images:!0},episode:{icon:e,layout:"grid",thumbnail_ratio:"portrait"},game:{icon:s,layout:"grid",thumbnail_ratio:"portrait"},genre:{icon:d,layout:"grid",show_list_images:!0},image:{icon:n,layout:"grid"},movie:{icon:r,thumbnail_ratio:"portrait",layout:"grid"},music:{icon:c},playlist:{icon:u,layout:"grid",show_list_images:!0},podcast:{icon:m,layout:"grid"},season:{icon:e,layout:"grid",thumbnail_ratio:"portrait"},track:{icon:h},tv_show:{icon:e,layout:"grid",thumbnail_ratio:"portrait"},url:{icon:v},video:{icon:p,layout:"grid"}},L=(a,i,t,e)=>a.callWS({type:"media_player/browse_media",entity_id:i,media_content_id:t,media_content_type:e}),W=[{name:"media_content_id",required:!1,selector:{text:{}}},{name:"media_content_type",required:!1,selector:{text:{}}}];let F=b([j("ha-selector-media")],(function(a,i){return{F:class extends i{constructor(...i){super(...i),a(this)}},d:[{kind:"field",decorators:[y({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[y({attribute:!1})],key:"selector",value:void 0},{kind:"field",decorators:[y({attribute:!1})],key:"value",value:void 0},{kind:"field",decorators:[y()],key:"label",value:void 0},{kind:"field",decorators:[y()],key:"helper",value:void 0},{kind:"field",decorators:[y({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[y({type:Boolean,reflect:!0})],key:"required",value:()=>!0},{kind:"field",decorators:[k()],key:"_thumbnailUrl",value:void 0},{kind:"method",key:"willUpdate",value:function(a){if(a.has("value")){var i,t,e,o;const s=null===(i=this.value)||void 0===i||null===(t=i.metadata)||void 0===t?void 0:t.thumbnail;if(s===(null===(e=a.get("value"))||void 0===e||null===(o=e.metadata)||void 0===o?void 0:o.thumbnail))return;if(s&&s.startsWith("/"))this._thumbnailUrl=void 0,M(this.hass,s).then((a=>{this._thumbnailUrl=a.path}));else if(s&&s.startsWith("https://brands.home-assistant.io")){var l;this._thumbnailUrl=I({domain:C(s),type:"icon",useFallback:!0,darkOptimized:null===(l=this.hass.themes)||void 0===l?void 0:l.darkMode})}else this._thumbnailUrl=s}}},{kind:"method",key:"render",value:function(){var a,i,t,e,o,l,s,d,n,r,c,u,m;const h=null!==(a=this.value)&&void 0!==a&&a.entity_id?this.hass.states[this.value.entity_id]:void 0,v=!(null!==(i=this.value)&&void 0!==i&&i.entity_id)||h&&U(h,131072);return f`<ha-entity-picker
|
||||
.hass=${this.hass}
|
||||
.value=${null===(t=this.value)||void 0===t?void 0:t.entity_id}
|
||||
.label=${this.label||this.hass.localize("ui.components.selectors.media.pick_media_player")}
|
||||
.disabled=${this.disabled}
|
||||
.helper=${this.helper}
|
||||
.required=${this.required}
|
||||
include-domains='["media_player"]'
|
||||
allow-custom-entity
|
||||
@value-changed=${this._entityChanged}
|
||||
></ha-entity-picker>
|
||||
${v?f`<ha-card
|
||||
outlined
|
||||
@click=${this._pickMedia}
|
||||
class=${this.disabled||null===(e=this.value)||void 0===e||!e.entity_id?"disabled":""}
|
||||
>
|
||||
<div
|
||||
class="thumbnail ${x({portrait:!(null===(o=this.value)||void 0===o||null===(l=o.metadata)||void 0===l||!l.media_class)&&"portrait"===B[this.value.metadata.children_media_class||this.value.metadata.media_class].thumbnail_ratio})}"
|
||||
>
|
||||
${null!==(s=this.value)&&void 0!==s&&null!==(d=s.metadata)&&void 0!==d&&d.thumbnail?f`
|
||||
<div
|
||||
class="${x({"centered-image":!!this.value.metadata.media_class&&["app","directory"].includes(this.value.metadata.media_class)})}
|
||||
image"
|
||||
style=${this._thumbnailUrl?`background-image: url(${this._thumbnailUrl});`:""}
|
||||
></div>
|
||||
`:f`
|
||||
<div class="icon-holder image">
|
||||
<ha-svg-icon
|
||||
class="folder"
|
||||
.path=${null!==(n=this.value)&&void 0!==n&&n.media_content_id?null!==(r=this.value)&&void 0!==r&&null!==(c=r.metadata)&&void 0!==c&&c.media_class?B["directory"===this.value.metadata.media_class&&this.value.metadata.children_media_class||this.value.metadata.media_class].icon:$:w}
|
||||
></ha-svg-icon>
|
||||
</div>
|
||||
`}
|
||||
</div>
|
||||
<div class="title">
|
||||
${null!==(u=this.value)&&void 0!==u&&u.media_content_id?(null===(m=this.value.metadata)||void 0===m?void 0:m.title)||this.value.media_content_id:this.hass.localize("ui.components.selectors.media.pick_media")}
|
||||
</div>
|
||||
</ha-card>`:f`<ha-alert>
|
||||
${this.hass.localize("ui.components.selectors.media.browse_not_supported")}
|
||||
</ha-alert>
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this.value}
|
||||
.schema=${W}
|
||||
.computeLabel=${this._computeLabelCallback}
|
||||
></ha-form>`}`}},{kind:"field",key:"_computeLabelCallback",value(){return a=>this.hass.localize(`ui.components.selectors.media.${a.name}`)}},{kind:"method",key:"_entityChanged",value:function(a){a.stopPropagation(),_(this,"value-changed",{value:{entity_id:a.detail.value,media_content_id:"",media_content_type:""}})}},{kind:"method",key:"_pickMedia",value:function(){var a,i,t;i=this,t={action:"pick",entityId:this.value.entity_id,navigateIds:null===(a=this.value.metadata)||void 0===a?void 0:a.navigateIds,mediaPickedCallback:a=>{var i;_(this,"value-changed",{value:{...this.value,media_content_id:a.item.media_content_id,media_content_type:a.item.media_content_type,metadata:{title:a.item.title,thumbnail:a.item.thumbnail,media_class:a.item.media_class,children_media_class:a.item.children_media_class,navigateIds:null===(i=a.navigateIds)||void 0===i?void 0:i.map((a=>({media_content_type:a.media_content_type,media_content_id:a.media_content_id})))}}})}},_(i,"show-dialog",{dialogTag:"dialog-media-player-browse",dialogImport:()=>import("./c.06557919.js").then((function(a){return a.d})),dialogParams:t})}},{kind:"get",static:!0,key:"styles",value:function(){return z`
|
||||
ha-entity-picker {
|
||||
display: block;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
mwc-button {
|
||||
margin-top: 8px;
|
||||
}
|
||||
ha-alert {
|
||||
display: block;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
ha-card {
|
||||
position: relative;
|
||||
width: 200px;
|
||||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
}
|
||||
ha-card.disabled {
|
||||
pointer-events: none;
|
||||
color: var(--disabled-text-color);
|
||||
}
|
||||
ha-card .thumbnail {
|
||||
width: 100%;
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
transition: padding-bottom 0.1s ease-out;
|
||||
padding-bottom: 100%;
|
||||
}
|
||||
ha-card .thumbnail.portrait {
|
||||
padding-bottom: 150%;
|
||||
}
|
||||
ha-card .image {
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
.folder {
|
||||
--mdc-icon-size: calc(var(--media-browse-item-size, 175px) * 0.4);
|
||||
}
|
||||
.title {
|
||||
font-size: 16px;
|
||||
padding-top: 16px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
margin-bottom: 16px;
|
||||
padding-left: 16px;
|
||||
padding-right: 4px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.image {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
.centered-image {
|
||||
margin: 0 8px;
|
||||
background-size: contain;
|
||||
}
|
||||
.icon-holder {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
`}}]}}),g);var O=Object.freeze({__proto__:null,HaMediaSelector:F});export{q as B,B as M,L as b,M as g,O as h};
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,16 +0,0 @@
|
||||
import{_ as e,j as a,e as i,y as l,bn as t,O as o,d,n as s}from"./main-c66a9a06.js";import{a as r}from"./c.31caccfc.js";import{f as n}from"./c.d9d8b90e.js";import"./c.a5550d10.js";const c=()=>import("./c.b5117688.js");e([s("ha-date-input")],(function(e,a){return{F:class extends a{constructor(...a){super(...a),e(this)}},d:[{kind:"field",decorators:[i({attribute:!1})],key:"locale",value:void 0},{kind:"field",decorators:[i()],key:"value",value:void 0},{kind:"field",decorators:[i({type:Boolean})],key:"disabled",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"required",value:()=>!1},{kind:"field",decorators:[i()],key:"label",value:void 0},{kind:"field",decorators:[i()],key:"helper",value:void 0},{kind:"method",key:"render",value:function(){return l`<ha-textfield
|
||||
.label=${this.label}
|
||||
.helper=${this.helper}
|
||||
.disabled=${this.disabled}
|
||||
iconTrailing
|
||||
helperPersistent
|
||||
@click=${this._openDialog}
|
||||
.value=${this.value?r(new Date(this.value),this.locale):""}
|
||||
.required=${this.required}
|
||||
>
|
||||
<ha-svg-icon slot="trailingIcon" .path=${t}></ha-svg-icon>
|
||||
</ha-textfield>`}},{kind:"method",key:"_openDialog",value:function(){var e,a;this.disabled||(e=this,a={min:"1970-01-01",value:this.value,onChange:e=>this._valueChanged(e),locale:this.locale.language,firstWeekday:n(this.locale)},o(e,"show-dialog",{dialogTag:"ha-dialog-date-picker",dialogImport:c,dialogParams:a}))}},{kind:"method",key:"_valueChanged",value:function(e){this.value!==e&&(this.value=e,o(this,"change"),o(this,"value-changed",{value:e}))}},{kind:"get",static:!0,key:"styles",value:function(){return d`
|
||||
ha-svg-icon {
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
`}}]}}),a);
|
||||
Binary file not shown.
@@ -1,17 +0,0 @@
|
||||
import{_ as e,j as a,e as t,y as i,O as d,d as l,n as s}from"./main-c66a9a06.js";import"./c.bbadaeea.js";import"./c.6912e15e.js";import"./c.a5550d10.js";import"./c.8e28b461.js";import"./c.41d13611.js";import"./c.930daaba.js";let o=e([s("ha-selector-boolean")],(function(e,a){return{F:class extends a{constructor(...a){super(...a),e(this)}},d:[{kind:"field",decorators:[t()],key:"hass",value:void 0},{kind:"field",decorators:[t()],key:"value",value:void 0},{kind:"field",decorators:[t()],key:"label",value:void 0},{kind:"field",decorators:[t()],key:"helper",value:void 0},{kind:"field",decorators:[t({type:Boolean})],key:"disabled",value:()=>!1},{kind:"method",key:"render",value:function(){return i`
|
||||
<ha-formfield alignEnd spaceBetween .label=${this.label}>
|
||||
<ha-switch
|
||||
.checked=${this.value}
|
||||
@change=${this._handleChange}
|
||||
.disabled=${this.disabled}
|
||||
></ha-switch>
|
||||
</ha-formfield>
|
||||
${this.helper?i`<ha-input-helper-text>${this.helper}</ha-input-helper-text>`:""}
|
||||
`}},{kind:"method",key:"_handleChange",value:function(e){const a=e.target.checked;this.value!==a&&d(this,"value-changed",{value:a})}},{kind:"get",static:!0,key:"styles",value:function(){return l`
|
||||
ha-formfield {
|
||||
display: flex;
|
||||
height: 56px;
|
||||
align-items: center;
|
||||
--mdc-typography-body2-font-size: 1em;
|
||||
}
|
||||
`}}]}}),a);export{o as HaBooleanSelector};
|
||||
Binary file not shown.
@@ -1,13 +0,0 @@
|
||||
import{_ as e,j as a,e as l,y as i,O as d,n as o}from"./main-c66a9a06.js";let r=e([o("ha-selector-icon")],(function(e,a){return{F:class extends a{constructor(...a){super(...a),e(this)}},d:[{kind:"field",decorators:[l()],key:"hass",value:void 0},{kind:"field",decorators:[l()],key:"selector",value:void 0},{kind:"field",decorators:[l()],key:"value",value:void 0},{kind:"field",decorators:[l()],key:"label",value:void 0},{kind:"field",decorators:[l()],key:"helper",value:void 0},{kind:"field",decorators:[l({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[l({type:Boolean})],key:"required",value:()=>!0},{kind:"method",key:"render",value:function(){var e,a;return i`
|
||||
<ha-icon-picker
|
||||
.hass=${this.hass}
|
||||
.label=${this.label}
|
||||
.value=${this.value}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
.helper=${this.helper}
|
||||
.fallbackPath=${null===(e=this.selector.icon)||void 0===e?void 0:e.fallbackPath}
|
||||
.placeholder=${null===(a=this.selector.icon)||void 0===a?void 0:a.placeholder}
|
||||
@value-changed=${this._valueChanged}
|
||||
></ha-icon-picker>
|
||||
`}},{kind:"method",key:"_valueChanged",value:function(e){d(this,"value-changed",{value:e.detail.value})}}]}}),a);export{r as HaIconSelector};
|
||||
Binary file not shown.
@@ -1,176 +0,0 @@
|
||||
import{P as t,Q as i,S as a}from"./main-c66a9a06.js";t({_template:i`
|
||||
<style>
|
||||
:host {
|
||||
display: block;
|
||||
position: absolute;
|
||||
outline: none;
|
||||
z-index: 1002;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
user-select: none;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
#tooltip {
|
||||
display: block;
|
||||
outline: none;
|
||||
@apply --paper-font-common-base;
|
||||
font-size: 10px;
|
||||
line-height: 1;
|
||||
background-color: var(--paper-tooltip-background, #616161);
|
||||
color: var(--paper-tooltip-text-color, white);
|
||||
padding: 8px;
|
||||
border-radius: 2px;
|
||||
@apply --paper-tooltip;
|
||||
}
|
||||
|
||||
@keyframes keyFrameScaleUp {
|
||||
0% {
|
||||
transform: scale(0.0);
|
||||
}
|
||||
100% {
|
||||
transform: scale(1.0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes keyFrameScaleDown {
|
||||
0% {
|
||||
transform: scale(1.0);
|
||||
}
|
||||
100% {
|
||||
transform: scale(0.0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes keyFrameFadeInOpacity {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes keyFrameFadeOutOpacity {
|
||||
0% {
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes keyFrameSlideDownIn {
|
||||
0% {
|
||||
transform: translateY(-2000px);
|
||||
opacity: 0;
|
||||
}
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes keyFrameSlideDownOut {
|
||||
0% {
|
||||
transform: translateY(0);
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
}
|
||||
10% {
|
||||
opacity: 0.2;
|
||||
}
|
||||
100% {
|
||||
transform: translateY(-2000px);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.fade-in-animation {
|
||||
opacity: 0;
|
||||
animation-delay: var(--paper-tooltip-delay-in, 500ms);
|
||||
animation-name: keyFrameFadeInOpacity;
|
||||
animation-iteration-count: 1;
|
||||
animation-timing-function: ease-in;
|
||||
animation-duration: var(--paper-tooltip-duration-in, 500ms);
|
||||
animation-fill-mode: forwards;
|
||||
@apply --paper-tooltip-animation;
|
||||
}
|
||||
|
||||
.fade-out-animation {
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
animation-delay: var(--paper-tooltip-delay-out, 0ms);
|
||||
animation-name: keyFrameFadeOutOpacity;
|
||||
animation-iteration-count: 1;
|
||||
animation-timing-function: ease-in;
|
||||
animation-duration: var(--paper-tooltip-duration-out, 500ms);
|
||||
animation-fill-mode: forwards;
|
||||
@apply --paper-tooltip-animation;
|
||||
}
|
||||
|
||||
.scale-up-animation {
|
||||
transform: scale(0);
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
animation-delay: var(--paper-tooltip-delay-in, 500ms);
|
||||
animation-name: keyFrameScaleUp;
|
||||
animation-iteration-count: 1;
|
||||
animation-timing-function: ease-in;
|
||||
animation-duration: var(--paper-tooltip-duration-in, 500ms);
|
||||
animation-fill-mode: forwards;
|
||||
@apply --paper-tooltip-animation;
|
||||
}
|
||||
|
||||
.scale-down-animation {
|
||||
transform: scale(1);
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
animation-delay: var(--paper-tooltip-delay-out, 500ms);
|
||||
animation-name: keyFrameScaleDown;
|
||||
animation-iteration-count: 1;
|
||||
animation-timing-function: ease-in;
|
||||
animation-duration: var(--paper-tooltip-duration-out, 500ms);
|
||||
animation-fill-mode: forwards;
|
||||
@apply --paper-tooltip-animation;
|
||||
}
|
||||
|
||||
.slide-down-animation {
|
||||
transform: translateY(-2000px);
|
||||
opacity: 0;
|
||||
animation-delay: var(--paper-tooltip-delay-out, 500ms);
|
||||
animation-name: keyFrameSlideDownIn;
|
||||
animation-iteration-count: 1;
|
||||
animation-timing-function: cubic-bezier(0.0, 0.0, 0.2, 1);
|
||||
animation-duration: var(--paper-tooltip-duration-out, 500ms);
|
||||
animation-fill-mode: forwards;
|
||||
@apply --paper-tooltip-animation;
|
||||
}
|
||||
|
||||
.slide-down-animation-out {
|
||||
transform: translateY(0);
|
||||
opacity: var(--paper-tooltip-opacity, 0.9);
|
||||
animation-delay: var(--paper-tooltip-delay-out, 500ms);
|
||||
animation-name: keyFrameSlideDownOut;
|
||||
animation-iteration-count: 1;
|
||||
animation-timing-function: cubic-bezier(0.4, 0.0, 1, 1);
|
||||
animation-duration: var(--paper-tooltip-duration-out, 500ms);
|
||||
animation-fill-mode: forwards;
|
||||
@apply --paper-tooltip-animation;
|
||||
}
|
||||
|
||||
.cancel-animation {
|
||||
animation-delay: -30s !important;
|
||||
}
|
||||
|
||||
/* Thanks IE 10. */
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="tooltip" class="hidden">
|
||||
<slot></slot>
|
||||
</div>
|
||||
`,is:"paper-tooltip",hostAttributes:{role:"tooltip",tabindex:-1},properties:{for:{type:String,observer:"_findTarget"},manualMode:{type:Boolean,value:!1,observer:"_manualModeChanged"},position:{type:String,value:"bottom"},fitToVisibleBounds:{type:Boolean,value:!1},offset:{type:Number,value:14},marginTop:{type:Number,value:14},animationDelay:{type:Number,value:500,observer:"_delayChange"},animationEntry:{type:String,value:""},animationExit:{type:String,value:""},animationConfig:{type:Object,value:function(){return{entry:[{name:"fade-in-animation",node:this,timing:{delay:0}}],exit:[{name:"fade-out-animation",node:this}]}}},_showing:{type:Boolean,value:!1}},listeners:{webkitAnimationEnd:"_onAnimationEnd"},get target(){var t=a(this).parentNode,i=a(this).getOwnerRoot();return this.for?a(i).querySelector("#"+this.for):t.nodeType==Node.DOCUMENT_FRAGMENT_NODE?i.host:t},attached:function(){this._findTarget()},detached:function(){this.manualMode||this._removeListeners()},playAnimation:function(t){"entry"===t?this.show():"exit"===t&&this.hide()},cancelAnimation:function(){this.$.tooltip.classList.add("cancel-animation")},show:function(){if(!this._showing){if(""===a(this).textContent.trim()){for(var t=!0,i=a(this).getEffectiveChildNodes(),n=0;n<i.length;n++)if(""!==i[n].textContent.trim()){t=!1;break}if(t)return}this._showing=!0,this.$.tooltip.classList.remove("hidden"),this.$.tooltip.classList.remove("cancel-animation"),this.$.tooltip.classList.remove(this._getAnimationType("exit")),this.updatePosition(),this._animationPlaying=!0,this.$.tooltip.classList.add(this._getAnimationType("entry"))}},hide:function(){if(this._showing){if(this._animationPlaying)return this._showing=!1,void this._cancelAnimation();this._onAnimationFinish(),this._showing=!1,this._animationPlaying=!0}},updatePosition:function(){if(this._target&&this.offsetParent){var t=this.offset;14!=this.marginTop&&14==this.offset&&(t=this.marginTop);var i,a,n=this.offsetParent.getBoundingClientRect(),e=this._target.getBoundingClientRect(),o=this.getBoundingClientRect(),s=(e.width-o.width)/2,r=(e.height-o.height)/2,l=e.left-n.left,p=e.top-n.top;switch(this.position){case"top":i=l+s,a=p-o.height-t;break;case"bottom":i=l+s,a=p+e.height+t;break;case"left":i=l-o.width-t,a=p+r;break;case"right":i=l+e.width+t,a=p+r}this.fitToVisibleBounds?(n.left+i+o.width>window.innerWidth?(this.style.right="0px",this.style.left="auto"):(this.style.left=Math.max(0,i)+"px",this.style.right="auto"),n.top+a+o.height>window.innerHeight?(this.style.bottom=n.height-p+t+"px",this.style.top="auto"):(this.style.top=Math.max(-n.top,a)+"px",this.style.bottom="auto")):(this.style.left=i+"px",this.style.top=a+"px")}},_addListeners:function(){this._target&&(this.listen(this._target,"mouseenter","show"),this.listen(this._target,"focus","show"),this.listen(this._target,"mouseleave","hide"),this.listen(this._target,"blur","hide"),this.listen(this._target,"tap","hide")),this.listen(this.$.tooltip,"animationend","_onAnimationEnd"),this.listen(this,"mouseenter","hide")},_findTarget:function(){this.manualMode||this._removeListeners(),this._target=this.target,this.manualMode||this._addListeners()},_delayChange:function(t){500!==t&&this.updateStyles({"--paper-tooltip-delay-in":t+"ms"})},_manualModeChanged:function(){this.manualMode?this._removeListeners():this._addListeners()},_cancelAnimation:function(){this.$.tooltip.classList.remove(this._getAnimationType("entry")),this.$.tooltip.classList.remove(this._getAnimationType("exit")),this.$.tooltip.classList.remove("cancel-animation"),this.$.tooltip.classList.add("hidden")},_onAnimationFinish:function(){this._showing&&(this.$.tooltip.classList.remove(this._getAnimationType("entry")),this.$.tooltip.classList.remove("cancel-animation"),this.$.tooltip.classList.add(this._getAnimationType("exit")))},_onAnimationEnd:function(){this._animationPlaying=!1,this._showing||(this.$.tooltip.classList.remove(this._getAnimationType("exit")),this.$.tooltip.classList.add("hidden"))},_getAnimationType:function(t){if("entry"===t&&""!==this.animationEntry)return this.animationEntry;if("exit"===t&&""!==this.animationExit)return this.animationExit;if(this.animationConfig[t]&&"string"==typeof this.animationConfig[t][0].name){if(this.animationConfig[t][0].timing&&this.animationConfig[t][0].timing.delay&&0!==this.animationConfig[t][0].timing.delay){var i=this.animationConfig[t][0].timing.delay;"entry"===t?this.updateStyles({"--paper-tooltip-delay-in":i+"ms"}):"exit"===t&&this.updateStyles({"--paper-tooltip-delay-out":i+"ms"})}return this.animationConfig[t][0].name}},_removeListeners:function(){this._target&&(this.unlisten(this._target,"mouseenter","show"),this.unlisten(this._target,"focus","show"),this.unlisten(this._target,"mouseleave","hide"),this.unlisten(this._target,"blur","hide"),this.unlisten(this._target,"tap","hide")),this.unlisten(this.$.tooltip,"animationend","_onAnimationEnd"),this.unlisten(this,"mouseenter","hide")}});
|
||||
Binary file not shown.
@@ -1,56 +0,0 @@
|
||||
import{_ as e,j as a,e as o,y as t,aF as i,k as s,aE as l,d as n,n as r,a7 as c,aB as d,af as h,aw as p,ag as m,aG as u,aH as f,aI as g,aJ as b,ax as v,aK as y,a4 as _,ai as w,aL as k,aM as $}from"./main-c66a9a06.js";import"./c.41d13611.js";import"./c.24287846.js";import{g as z}from"./c.f2bb3724.js";import{s as x}from"./c.4b0dc107.js";e([r("ha-icon-overflow-menu")],(function(e,a){return{F:class extends a{constructor(...a){super(...a),e(this)}},d:[{kind:"field",decorators:[o({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[o({type:Array})],key:"items",value:()=>[]},{kind:"field",decorators:[o({type:Boolean})],key:"narrow",value:()=>!1},{kind:"method",key:"render",value:function(){return t`
|
||||
${this.narrow?t` <!-- Collapsed representation for small screens -->
|
||||
<ha-button-menu
|
||||
@click=${this._handleIconOverflowMenuOpened}
|
||||
@closed=${this._handleIconOverflowMenuClosed}
|
||||
class="ha-icon-overflow-menu-overflow"
|
||||
corner="BOTTOM_START"
|
||||
absolute
|
||||
>
|
||||
<ha-icon-button
|
||||
.label=${this.hass.localize("ui.common.overflow_menu")}
|
||||
.path=${i}
|
||||
slot="trigger"
|
||||
></ha-icon-button>
|
||||
|
||||
${this.items.map((e=>e.divider?t`<li divider role="separator"></li>`:t`<mwc-list-item
|
||||
graphic="icon"
|
||||
?disabled=${e.disabled}
|
||||
@click=${e.action}
|
||||
class=${s({warning:Boolean(e.warning)})}
|
||||
>
|
||||
<div slot="graphic">
|
||||
<ha-svg-icon
|
||||
class=${s({warning:Boolean(e.warning)})}
|
||||
.path=${e.path}
|
||||
></ha-svg-icon>
|
||||
</div>
|
||||
${e.label}
|
||||
</mwc-list-item> `))}
|
||||
</ha-button-menu>`:t`
|
||||
<!-- Icon representation for big screens -->
|
||||
${this.items.map((e=>e.narrowOnly?"":e.divider?t`<div role="separator"></div>`:t`<div>
|
||||
${e.tooltip?t`<paper-tooltip animation-delay="0" position="left">
|
||||
${e.tooltip}
|
||||
</paper-tooltip>`:""}
|
||||
<ha-icon-button
|
||||
@click=${e.action}
|
||||
.label=${e.label}
|
||||
.path=${e.path}
|
||||
?disabled=${e.disabled}
|
||||
></ha-icon-button>
|
||||
</div> `))}
|
||||
`}
|
||||
`}},{kind:"method",key:"_handleIconOverflowMenuOpened",value:function(e){e.stopPropagation();const a=this.closest(".mdc-data-table__row");a&&(a.style.zIndex="1")}},{kind:"method",key:"_handleIconOverflowMenuClosed",value:function(){const e=this.closest(".mdc-data-table__row");e&&(e.style.zIndex="")}},{kind:"get",static:!0,key:"styles",value:function(){return[l,n`
|
||||
:host {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
li[role="separator"] {
|
||||
border-bottom-color: var(--divider-color);
|
||||
}
|
||||
div[role="separator"] {
|
||||
border-right: 1px solid var(--divider-color);
|
||||
width: 1px;
|
||||
}
|
||||
`]}}]}}),a);const E=c(((e,a)=>[..."HACS-EXPERIMENTAL-PANEL"===e.nodeName?[{path:d,label:e.hacs.localize("common.show"),action:()=>h(`/hacs/repository/${a.id}`)}]:[],{path:p,label:e.hacs.localize("common.repository"),action:()=>m.open(`https://github.com/${a.full_name}`,"_blank","noreferrer=true")},{path:u,label:e.hacs.localize("repository_card.update_information"),action:async()=>{await f(e.hass,String(a.id))}},...a.installed_version?[{path:g,label:e.hacs.localize("repository_card.redownload"),action:()=>O(e,a.id),hideForUninstalled:!0}]:[],..."plugin"===a.category&&a.installed_version?[{path:b,label:e.hacs.localize("repository_card.open_source"),action:()=>m.open(`/hacsfiles/${a.local_path.split("/").pop()}/${a.file_name}`,"_blank","noreferrer=true")}]:[],{divider:!0},{path:v,label:e.hacs.localize("repository_card.open_issue"),action:()=>m.open(`https://github.com/${a.full_name}/issues`,"_blank","noreferrer=true")},..."172733314"!==a.id&&a.installed_version?[{path:y,label:e.hacs.localize("repository_card.report"),action:()=>m.open(`https://github.com/hacs/integration/issues/new?assignees=ludeeus&labels=flag&template=removal.yml&repo=${a.full_name}&title=Request for removal of ${a.full_name}`,"_blank","noreferrer=true"),warning:!0},{path:_,label:e.hacs.localize("common.remove"),action:async()=>{if("integration"===a.category&&a.config_flow){if((await z(e.hass)).some((e=>e.domain===a.domain))){if(await x(e,{title:e.hacs.localize("dialog.configured.title"),text:e.hacs.localize("dialog.configured.message",{name:a.name}),dismissText:e.hacs.localize("common.ignore"),confirmText:e.hacs.localize("common.navigate"),confirm:()=>{h("/config/integrations",{replace:!0})}}))return}}e.dispatchEvent(new CustomEvent("hacs-dialog",{detail:{type:"progress",title:e.hacs.localize("dialog.remove.title"),confirmText:e.hacs.localize("dialog.remove.title"),content:e.hacs.localize("dialog.remove.message",{name:a.name}),confirm:async()=>{await I(e,a)}},bubbles:!0,composed:!0}))},warning:!0}]:[]])),O=(e,a)=>{e.dispatchEvent(new CustomEvent("hacs-dialog",{detail:{type:"download",repository:a},bubbles:!0,composed:!0}))},I=async(e,a)=>{var o;if("plugin"===a.category&&"yaml"!==(null===(o=e.hacs.info)||void 0===o?void 0:o.lovelace_mode)){(await w(e.hass)).filter((e=>e.url.startsWith(`/hacsfiles/${a.full_name.split("/")[1]}/${a.file_name}`))).forEach((async a=>{await k(e.hass,String(a.id))}))}await $(e.hass,String(a.id)),"HACS-REPOSITORY-PANEL"===e.nodeName&&history.back()},S=e=>a=>({kind:"method",placement:"prototype",key:a.key,descriptor:{set(e){this[`__${String(a.key)}`]=e},get(){return this[`__${String(a.key)}`]},enumerable:!0,configurable:!0},finisher(o){const t=o.prototype.connectedCallback;o.prototype.connectedCallback=function(){if(t.call(this),this[a.key]){const o=this.renderRoot.querySelector(e);if(!o)return;o.scrollTop=this[a.key]}}}});export{E as a,S as r};
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
import{I as e,J as s,L as t,N as r}from"./main-c66a9a06.js";import{m as l,u as n,r as o,p as i,a}from"./c.a5550d10.js";const u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},f=e(class extends s{constructor(e){if(super(e),e.type!==t.CHILD)throw Error("repeat() can only be used in text expressions")}ht(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],n=[];let o=0;for(const s of e)l[o]=r?r(s,o):o,n[o]=t(s,o),o++;return{values:n,keys:l}}render(e,s,t){return this.ht(e,s,t).values}update(e,[s,t,f]){var c;const h=l(e),{values:d,keys:p}=this.ht(s,t,f);if(!Array.isArray(h))return this.ut=p,d;const v=null!==(c=this.ut)&&void 0!==c?c:this.ut=[],y=[];let m,x,g=0,j=h.length-1,k=0,w=d.length-1;for(;g<=j&&k<=w;)if(null===h[g])g++;else if(null===h[j])j--;else if(v[g]===p[k])y[k]=n(h[g],d[k]),g++,k++;else if(v[j]===p[w])y[w]=n(h[j],d[w]),j--,w--;else if(v[g]===p[w])y[w]=n(h[g],d[w]),o(e,y[w+1],h[g]),g++,w--;else if(v[j]===p[k])y[k]=n(h[j],d[k]),o(e,h[g],h[j]),j--,k++;else if(void 0===m&&(m=u(p,k,w),x=u(v,g,j)),m.has(v[g]))if(m.has(v[j])){const s=x.get(p[k]),t=void 0!==s?h[s]:null;if(null===t){const s=o(e,h[g]);n(s,d[k]),y[k]=s}else y[k]=n(t,d[k]),o(e,h[g],t),h[s]=null;k++}else i(h[j]),j--;else i(h[g]),g++;for(;k<=w;){const s=o(e,y[w+1]);n(s,d[k]),y[k++]=s}for(;g<=j;){const e=h[g++];null!==e&&i(e)}return this.ut=p,a(e,y),r}});export{f as c};
|
||||
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
import{_ as e,j as t,e as a,y as i,eE as l,O as d,eF as r,d as s,n as o}from"./main-c66a9a06.js";import"./c.a5550d10.js";import"./c.8e28b461.js";import"./c.41d13611.js";let n=e([o("ha-selector-color_rgb")],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[a({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[a({attribute:!1})],key:"selector",value:void 0},{kind:"field",decorators:[a()],key:"value",value:void 0},{kind:"field",decorators:[a()],key:"label",value:void 0},{kind:"field",decorators:[a()],key:"helper",value:void 0},{kind:"field",decorators:[a({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[a({type:Boolean})],key:"required",value:()=>!0},{kind:"method",key:"render",value:function(){return i`
|
||||
<ha-textfield
|
||||
type="color"
|
||||
helperPersistent
|
||||
.value=${this.value?l(this.value):""}
|
||||
.label=${this.label||""}
|
||||
.required=${this.required}
|
||||
.helper=${this.helper}
|
||||
.disalbled=${this.disabled}
|
||||
@change=${this._valueChanged}
|
||||
></ha-textfield>
|
||||
`}},{kind:"method",key:"_valueChanged",value:function(e){const t=e.target.value;d(this,"value-changed",{value:r(t)})}},{kind:"field",static:!0,key:"styles",value:()=>s`
|
||||
:host {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
}
|
||||
ha-textfield {
|
||||
--text-field-padding: 8px;
|
||||
min-width: 75px;
|
||||
flex-grow: 1;
|
||||
margin: 0 4px;
|
||||
}
|
||||
`}]}}),t);export{n as HaColorRGBSelector};
|
||||
Binary file not shown.
@@ -1,11 +0,0 @@
|
||||
import{_ as e,j as d,e as i,y as a,n as r}from"./main-c66a9a06.js";import"./c.1cede1b9.js";import"./c.31caccfc.js";import"./c.3acef177.js";import"./c.743a15a1.js";import"./c.2610e8cd.js";import"./c.a0946910.js";import"./c.d9d8b90e.js";import"./c.a5550d10.js";import"./c.8e28b461.js";import"./c.41d13611.js";let o=e([r("ha-selector-date")],(function(e,d){return{F:class extends d{constructor(...d){super(...d),e(this)}},d:[{kind:"field",decorators:[i()],key:"hass",value:void 0},{kind:"field",decorators:[i()],key:"selector",value:void 0},{kind:"field",decorators:[i()],key:"value",value:void 0},{kind:"field",decorators:[i()],key:"label",value:void 0},{kind:"field",decorators:[i()],key:"helper",value:void 0},{kind:"field",decorators:[i({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"required",value:()=>!0},{kind:"method",key:"render",value:function(){return a`
|
||||
<ha-date-input
|
||||
.label=${this.label}
|
||||
.locale=${this.hass.locale}
|
||||
.disabled=${this.disabled}
|
||||
.value=${this.value}
|
||||
.required=${this.required}
|
||||
.helper=${this.helper}
|
||||
>
|
||||
</ha-date-input>
|
||||
`}}]}}),d);export{o as HaDateSelector};
|
||||
Binary file not shown.
@@ -1,29 +0,0 @@
|
||||
import{_ as e,j as t,e as i,y as a,d as s,O as l,n as d}from"./main-c66a9a06.js";import"./c.41d13611.js";import{s as r}from"./c.a5550d10.js";import"./c.8e28b461.js";e([d("ha-theme-picker")],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[i()],key:"value",value:void 0},{kind:"field",decorators:[i()],key:"label",value:void 0},{kind:"field",decorators:[i({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[i({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"required",value:()=>!1},{kind:"method",key:"render",value:function(){return a`
|
||||
<ha-select
|
||||
.label=${this.label||this.hass.localize("ui.components.theme-picker.theme")}
|
||||
.value=${this.value}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@selected=${this._changed}
|
||||
@closed=${r}
|
||||
fixedMenuPosition
|
||||
naturalMenuWidth
|
||||
>
|
||||
<mwc-list-item value="remove"
|
||||
>${this.hass.localize("ui.components.theme-picker.no_theme")}</mwc-list-item
|
||||
>
|
||||
${Object.keys(this.hass.themes.themes).sort().map((e=>a`<mwc-list-item .value=${e}>${e}</mwc-list-item>`))}
|
||||
</ha-select>
|
||||
`}},{kind:"get",static:!0,key:"styles",value:function(){return s`
|
||||
ha-select {
|
||||
width: 100%;
|
||||
}
|
||||
`}},{kind:"method",key:"_changed",value:function(e){this.hass&&""!==e.target.value&&(this.value="remove"===e.target.value?void 0:e.target.value,l(this,"value-changed",{value:this.value}))}}]}}),t);let o=e([d("ha-selector-theme")],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[i({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[i({attribute:!1})],key:"selector",value:void 0},{kind:"field",decorators:[i()],key:"value",value:void 0},{kind:"field",decorators:[i()],key:"label",value:void 0},{kind:"field",decorators:[i({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"required",value:()=>!0},{kind:"method",key:"render",value:function(){return a`
|
||||
<ha-theme-picker
|
||||
.hass=${this.hass}
|
||||
.value=${this.value}
|
||||
.label=${this.label}
|
||||
.disabled=${this.disabled}
|
||||
.required=${this.required}
|
||||
></ha-theme-picker>
|
||||
`}}]}}),t);export{o as HaThemeSelector};
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
import{a7 as a}from"./main-c66a9a06.js";import{p as e}from"./c.3acef177.js";e&&await e,a((a=>new Intl.DateTimeFormat(a.language,{weekday:"long",month:"long",day:"numeric"})));const n=(a,e)=>m(e).format(a),m=a((a=>new Intl.DateTimeFormat(a.language,{year:"numeric",month:"long",day:"numeric"}))),t=(a,e)=>r(e).format(a),r=a((a=>new Intl.DateTimeFormat(a.language,{year:"numeric",month:"numeric",day:"numeric"})));a((a=>new Intl.DateTimeFormat(a.language,{day:"numeric",month:"short"}))),a((a=>new Intl.DateTimeFormat(a.language,{month:"long",year:"numeric"}))),a((a=>new Intl.DateTimeFormat(a.language,{month:"long"}))),a((a=>new Intl.DateTimeFormat(a.language,{year:"numeric"})));export{t as a,n as f};
|
||||
Binary file not shown.
@@ -1,11 +0,0 @@
|
||||
import{_ as e,j as a,e as i,y as d,O as r,n as l}from"./main-c66a9a06.js";import"./c.6829e397.js";import"./c.bbadaeea.js";import"./c.a5550d10.js";import"./c.8e28b461.js";import"./c.41d13611.js";import"./c.930daaba.js";let o=e([l("ha-selector-navigation")],(function(e,a){return{F:class extends a{constructor(...a){super(...a),e(this)}},d:[{kind:"field",decorators:[i()],key:"hass",value:void 0},{kind:"field",decorators:[i()],key:"selector",value:void 0},{kind:"field",decorators:[i()],key:"value",value:void 0},{kind:"field",decorators:[i()],key:"label",value:void 0},{kind:"field",decorators:[i()],key:"helper",value:void 0},{kind:"field",decorators:[i({type:Boolean,reflect:!0})],key:"disabled",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"required",value:()=>!0},{kind:"method",key:"render",value:function(){return d`
|
||||
<ha-navigation-picker
|
||||
.hass=${this.hass}
|
||||
.label=${this.label}
|
||||
.value=${this.value}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
.helper=${this.helper}
|
||||
@value-changed=${this._valueChanged}
|
||||
></ha-navigation-picker>
|
||||
`}},{kind:"method",key:"_valueChanged",value:function(e){r(this,"value-changed",{value:e.detail.value})}}]}}),a);export{o as HaNavigationSelector};
|
||||
Binary file not shown.
@@ -1,29 +0,0 @@
|
||||
import{_ as e,j as t,e as i,i as a,y as o,n as d,E as s,G as l,O as r}from"./main-c66a9a06.js";import{S as u}from"./c.baaad129.js";import{f as n}from"./c.d0468013.js";import"./c.bbadaeea.js";import"./c.708f0e16.js";import"./c.a5550d10.js";import"./c.8e28b461.js";import"./c.41d13611.js";import"./c.31caccfc.js";import"./c.3acef177.js";import"./c.743a15a1.js";import"./c.2610e8cd.js";import"./c.a0946910.js";import"./c.e95db283.js";import"./c.930daaba.js";e([d("ha-entity-attribute-picker")],(function(e,t){return{F:class extends t{constructor(...t){super(...t),e(this)}},d:[{kind:"field",decorators:[i({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[i()],key:"entityId",value:void 0},{kind:"field",decorators:[i({type:Array,attribute:"hide-attributes"})],key:"hideAttributes",value:void 0},{kind:"field",decorators:[i({type:Boolean})],key:"autofocus",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"disabled",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"required",value:()=>!1},{kind:"field",decorators:[i({type:Boolean,attribute:"allow-custom-value"})],key:"allowCustomValue",value:void 0},{kind:"field",decorators:[i()],key:"label",value:void 0},{kind:"field",decorators:[i()],key:"value",value:void 0},{kind:"field",decorators:[i()],key:"helper",value:void 0},{kind:"field",decorators:[i({type:Boolean})],key:"_opened",value:()=>!1},{kind:"field",decorators:[a("ha-combo-box",!0)],key:"_comboBox",value:void 0},{kind:"method",key:"shouldUpdate",value:function(e){return!(!e.has("_opened")&&this._opened)}},{kind:"method",key:"updated",value:function(e){if(e.has("_opened")&&this._opened){const e=this.entityId?this.hass.states[this.entityId]:void 0;this._comboBox.items=e?Object.keys(e.attributes).filter((e=>{var t;return!(null!==(t=this.hideAttributes)&&void 0!==t&&t.includes(e))})).map((e=>({value:e,label:n(e)}))):[]}}},{kind:"method",key:"render",value:function(){var e;return this.hass?o`
|
||||
<ha-combo-box
|
||||
.hass=${this.hass}
|
||||
.value=${this.value?n(this.value):""}
|
||||
.autofocus=${this.autofocus}
|
||||
.label=${null!==(e=this.label)&&void 0!==e?e:this.hass.localize("ui.components.entity.entity-attribute-picker.attribute")}
|
||||
.disabled=${this.disabled||!this.entityId}
|
||||
.required=${this.required}
|
||||
.helper=${this.helper}
|
||||
.allowCustomValue=${this.allowCustomValue}
|
||||
item-value-path="value"
|
||||
item-label-path="label"
|
||||
@opened-changed=${this._openedChanged}
|
||||
@value-changed=${this._valueChanged}
|
||||
>
|
||||
</ha-combo-box>
|
||||
`:o``}},{kind:"method",key:"_openedChanged",value:function(e){this._opened=e.detail.value}},{kind:"method",key:"_valueChanged",value:function(e){this.value=e.detail.value}}]}}),t);let c=e([d("ha-selector-attribute")],(function(e,t){class a extends t{constructor(...t){super(...t),e(this)}}return{F:a,d:[{kind:"field",decorators:[i({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[i({attribute:!1})],key:"selector",value:void 0},{kind:"field",decorators:[i()],key:"value",value:void 0},{kind:"field",decorators:[i()],key:"label",value:void 0},{kind:"field",decorators:[i()],key:"helper",value:void 0},{kind:"field",decorators:[i({type:Boolean})],key:"disabled",value:()=>!1},{kind:"field",decorators:[i({type:Boolean})],key:"required",value:()=>!0},{kind:"field",decorators:[i({attribute:!1})],key:"context",value:void 0},{kind:"method",key:"render",value:function(){var e,t,i;return o`
|
||||
<ha-entity-attribute-picker
|
||||
.hass=${this.hass}
|
||||
.entityId=${(null===(e=this.selector.attribute)||void 0===e?void 0:e.entity_id)||(null===(t=this.context)||void 0===t?void 0:t.filter_entity)}
|
||||
.hideAttributes=${null===(i=this.selector.attribute)||void 0===i?void 0:i.hide_attributes}
|
||||
.value=${this.value}
|
||||
.label=${this.label}
|
||||
.helper=${this.helper}
|
||||
.disabled=${this.disabled}
|
||||
.required=${this.required}
|
||||
allow-custom-value
|
||||
></ha-entity-attribute-picker>
|
||||
`}},{kind:"method",key:"updated",value:function(e){var t;if(s(l(a.prototype),"updated",this).call(this,e),!this.value||null!==(t=this.selector.attribute)&&void 0!==t&&t.entity_id||!e.has("context"))return;const i=e.get("context");if(!this.context||(null==i?void 0:i.filter_entity)===this.context.filter_entity)return;let o=!1;if(this.context.filter_entity){const e=this.hass.states[this.context.filter_entity];e&&this.value in e.attributes||(o=!0)}else o=void 0!==this.value;o&&r(this,"value-changed",{value:void 0})}}]}}),u(t));export{c as HaSelectorAttribute};
|
||||
Binary file not shown.
@@ -1,63 +0,0 @@
|
||||
import{_ as e,j as i,e as t,y as s,O as d,d as a,n as l,t as c,a7 as r,E as o,G as n}from"./main-c66a9a06.js";import{g as v,d as u}from"./c.15496b0b.js";import{f as h,b as k}from"./c.6f18200a.js";import{S as p}from"./c.baaad129.js";import"./c.9381c7ae.js";import"./c.6eb9fcd4.js";import"./c.1024e243.js";import"./c.a5550d10.js";import"./c.8e28b461.js";import"./c.41d13611.js";import"./c.874c8cfd.js";import"./c.fa0ef026.js";import"./c.d2f13ac1.js";import"./c.bbadaeea.js";import"./c.930daaba.js";e([l("ha-devices-picker")],(function(e,i){return{F:class extends i{constructor(...i){super(...i),e(this)}},d:[{kind:"field",decorators:[t({attribute:!1})],key:"hass",value:void 0},{kind:"field",decorators:[t()],key:"value",value:void 0},{kind:"field",decorators:[t()],key:"helper",value:void 0},{kind:"field",decorators:[t({type:Boolean})],key:"disabled",value:void 0},{kind:"field",decorators:[t({type:Boolean})],key:"required",value:void 0},{kind:"field",decorators:[t({type:Array,attribute:"include-domains"})],key:"includeDomains",value:void 0},{kind:"field",decorators:[t({type:Array,attribute:"exclude-domains"})],key:"excludeDomains",value:void 0},{kind:"field",decorators:[t({attribute:"picked-device-label"}),t({type:Array,attribute:"include-device-classes"})],key:"includeDeviceClasses",value:void 0},{kind:"field",key:"pickedDeviceLabel",value:void 0},{kind:"field",decorators:[t({attribute:"pick-device-label"})],key:"pickDeviceLabel",value:void 0},{kind:"field",decorators:[t()],key:"deviceFilter",value:void 0},{kind:"method",key:"render",value:function(){if(!this.hass)return s``;const e=this._currentDevices;return s`
|
||||
${e.map((e=>s`
|
||||
<div>
|
||||
<ha-device-picker
|
||||
allow-custom-entity
|
||||
.curValue=${e}
|
||||
.hass=${this.hass}
|
||||
.deviceFilter=${this.deviceFilter}
|
||||
.includeDomains=${this.includeDomains}
|
||||
.excludeDomains=${this.excludeDomains}
|
||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||
.value=${e}
|
||||
.label=${this.pickedDeviceLabel}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._deviceChanged}
|
||||
></ha-device-picker>
|
||||
</div>
|
||||
`))}
|
||||
<div>
|
||||
<ha-device-picker
|
||||
allow-custom-entity
|
||||
.hass=${this.hass}
|
||||
.helper=${this.helper}
|
||||
.deviceFilter=${this.deviceFilter}
|
||||
.includeDomains=${this.includeDomains}
|
||||
.excludeDomains=${this.excludeDomains}
|
||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||
.label=${this.pickDeviceLabel}
|
||||
.disabled=${this.disabled}
|
||||
.required=${this.required&&!e.length}
|
||||
@value-changed=${this._addDevice}
|
||||
></ha-device-picker>
|
||||
</div>
|
||||
`}},{kind:"get",key:"_currentDevices",value:function(){return this.value||[]}},{kind:"method",key:"_updateDevices",value:async function(e){d(this,"value-changed",{value:e}),this.value=e}},{kind:"method",key:"_deviceChanged",value:function(e){e.stopPropagation();const i=e.currentTarget.curValue,t=e.detail.value;t!==i&&""===t&&(""===t?this._updateDevices(this._currentDevices.filter((e=>e!==i))):this._updateDevices(this._currentDevices.map((e=>e===i?t:e))))}},{kind:"method",key:"_addDevice",value:async function(e){e.stopPropagation();const i=e.detail.value;if(e.currentTarget.value="",!i)return;const t=this._currentDevices;t.includes(i)||this._updateDevices([...t,i])}},{kind:"field",static:!0,key:"styles",value:()=>a`
|
||||
div {
|
||||
margin-top: 8px;
|
||||
}
|
||||
`}]}}),i);let y=e([l("ha-selector-device")],(function(e,i){class d extends i{constructor(...i){super(...i),e(this)}}return{F:d,d:[{kind:"field",decorators:[t()],key:"hass",value:void 0},{kind:"field",decorators:[t()],key:"selector",value:void 0},{kind:"field",decorators:[c()],key:"_entitySources",value:void 0},{kind:"field",decorators:[c()],key:"_entities",value:void 0},{kind:"field",decorators:[t()],key:"value",value:void 0},{kind:"field",decorators:[t()],key:"label",value:void 0},{kind:"field",decorators:[t()],key:"helper",value:void 0},{kind:"field",decorators:[t({type:Boolean})],key:"disabled",value:()=>!1},{kind:"field",decorators:[t({type:Boolean})],key:"required",value:()=>!0},{kind:"field",key:"_deviceIntegrationLookup",value:()=>r(v)},{kind:"method",key:"hassSubscribe",value:function(){return[u(this.hass.connection,(e=>{this._entities=e.filter((e=>null!==e.device_id))}))]}},{kind:"method",key:"updated",value:function(e){var i;o(n(d.prototype),"updated",this).call(this,e),e.has("selector")&&null!==(i=this.selector.device)&&void 0!==i&&i.integration&&!this._entitySources&&h(this.hass).then((e=>{this._entitySources=e}))}},{kind:"method",key:"render",value:function(){var e,i,t,d,a,l,c,r;return null!==(e=this.selector.device)&&void 0!==e&&e.integration&&!this._entitySources?s``:null!==(i=this.selector.device)&&void 0!==i&&i.multiple?s`
|
||||
${this.label?s`<label>${this.label}</label>`:""}
|
||||
<ha-devices-picker
|
||||
.hass=${this.hass}
|
||||
.value=${this.value}
|
||||
.helper=${this.helper}
|
||||
.deviceFilter=${this._filterDevices}
|
||||
.includeDeviceClasses=${null!==(t=this.selector.device.entity)&&void 0!==t&&t.device_class?[this.selector.device.entity.device_class]:void 0}
|
||||
.includeDomains=${null!==(d=this.selector.device.entity)&&void 0!==d&&d.domain?[this.selector.device.entity.domain]:void 0}
|
||||
.disabled=${this.disabled}
|
||||
.required=${this.required}
|
||||
></ha-devices-picker>
|
||||
`:s`
|
||||
<ha-device-picker
|
||||
.hass=${this.hass}
|
||||
.value=${this.value}
|
||||
.label=${this.label}
|
||||
.helper=${this.helper}
|
||||
.deviceFilter=${this._filterDevices}
|
||||
.includeDeviceClasses=${null!==(a=this.selector.device)&&void 0!==a&&null!==(l=a.entity)&&void 0!==l&&l.device_class?[this.selector.device.entity.device_class]:void 0}
|
||||
.includeDomains=${null!==(c=this.selector.device)&&void 0!==c&&null!==(r=c.entity)&&void 0!==r&&r.domain?[this.selector.device.entity.domain]:void 0}
|
||||
.disabled=${this.disabled}
|
||||
.required=${this.required}
|
||||
allow-custom-entity
|
||||
></ha-device-picker>
|
||||
`}},{kind:"field",key:"_filterDevices",value(){return e=>{const i=this._entitySources&&this._entities?this._deviceIntegrationLookup(this._entitySources,this._entities):void 0;return!this.selector.device||k(this.selector.device,e,i)}}}]}}),p(i));export{y as HaDeviceSelector};
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1 +0,0 @@
|
||||
function r(r){return void 0===r||Array.isArray(r)?r:[r]}export{r as e};
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,14 +0,0 @@
|
||||
import{_ as e,H as i,e as t,y as s,n as o}from"./main-c66a9a06.js";import"./c.e8169f76.js";import"./c.b914d43e.js";import"./c.8e28b461.js";let c=e([o("hacs-progress-dialog")],(function(e,i){return{F:class extends i{constructor(...i){super(...i),e(this)}},d:[{kind:"field",decorators:[t()],key:"title",value:void 0},{kind:"field",decorators:[t()],key:"content",value:void 0},{kind:"field",decorators:[t()],key:"confirmText",value:void 0},{kind:"field",decorators:[t()],key:"confirm",value:void 0},{kind:"field",decorators:[t({type:Boolean})],key:"_inProgress",value:()=>!1},{kind:"method",key:"shouldUpdate",value:function(e){return e.has("active")||e.has("title")||e.has("content")||e.has("confirmText")||e.has("confirm")||e.has("_inProgress")}},{kind:"method",key:"render",value:function(){return this.active?s`
|
||||
<hacs-dialog .active=${this.active} .hass=${this.hass} title=${this.title||""}>
|
||||
<div class="content">
|
||||
${this.content||""}
|
||||
</div>
|
||||
<mwc-button slot="secondaryaction" ?disabled=${this._inProgress} @click=${this._close}>
|
||||
${this.hacs.localize("common.cancel")}
|
||||
</mwc-button>
|
||||
<mwc-button slot="primaryaction" @click=${this._confirmed}>
|
||||
${this._inProgress?s`<ha-circular-progress active size="small"></ha-circular-progress>`:this.confirmText||this.hacs.localize("common.yes")}</mwc-button
|
||||
>
|
||||
</mwc-button>
|
||||
</hacs-dialog>
|
||||
`:s``}},{kind:"method",key:"_confirmed",value:async function(){this._inProgress=!0,await this.confirm(),this._inProgress=!1,this._close()}},{kind:"method",key:"_close",value:function(){this.active=!1,this.dispatchEvent(new Event("hacs-dialog-closed",{bubbles:!0,composed:!0}))}}]}}),i);export{c as HacsProgressDialog};
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
import{O as o}from"./main-c66a9a06.js";const a=()=>import("./c.5faead67.js"),i=(i,l,m)=>new Promise((n=>{const r=l.cancel,s=l.confirm;o(i,"show-dialog",{dialogTag:"dialog-box",dialogImport:a,dialogParams:{...l,...m,cancel:()=>{n(!(null==m||!m.prompt)&&null),r&&r()},confirm:o=>{n(null==m||!m.prompt||o),s&&s(o)}}})})),l=(o,a)=>i(o,a),m=(o,a)=>i(o,a,{confirmation:!0}),n=(o,a)=>i(o,a,{prompt:!0});export{l as a,n as b,m as s};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user