This commit is contained in:
2024-10-13 22:59:09 +02:00
parent 63fb7f8f73
commit e426efb80f
107 changed files with 20616 additions and 5533 deletions

View File

@@ -1 +1 @@
2024.7.2
2024.10.2

2
.gitignore vendored
View File

@@ -12,6 +12,8 @@ home-assistant.log.fault
/custom_components/*
/tts/*
/blueprints/*
/zigbee2mqtt/log/*
# Example .gitignore file for your config dir.
# An * ensures that everything will be ignored.

View File

@@ -34,7 +34,7 @@
include_ambient: ambient_disabled
include_sun: sun_disabled
sun_elevation: 1
include_night_lights: night_lights_disabled
include_night_lights: night_lights_enabled
night_lights:
device_id: 1281186f8b90c2b00053decdf33a6d72
night_time_delay: 5.5
@@ -43,10 +43,10 @@
- use_brightness
night_light_brightness: 14
night_lights_after_time: '20:30:30'
night_lights_before_time: '23:00:00'
night_lights_before_time: 06:00:00
light_switch:
entity_id: light.lamp_aanrecht
motion_bypass: binary_sensor.contact_achterdeur_contact
motion_bypass: binary_sensor.contact_achterdeur_openen
night_lights_conditions:
- time_enabled
night_lights_entity_state: []
@@ -98,7 +98,7 @@
path: Blackshome/sensor-light47.yaml
input:
motion_trigger:
- binary_sensor.beweging_badkamer_occupancy
- binary_sensor.beweging_badkamer_bezetting
light_switch:
entity_id: light.lamp_badkamer
include_light_control:
@@ -161,7 +161,7 @@
metadata: {}
- type: turn_off
device_id: 6652a530d4f2c349be36ea58904e613f
entity_id: switch.display_woonkamer_browsee_screen
entity_id: switch.display_woonkamer_screen
domain: switch
- service: scene.turn_on
target:
@@ -212,24 +212,24 @@
from: 'off'
to: 'on'
condition:
- condition: or
- condition: and
conditions:
- condition: sun
after: sunset
before: sunrise
- condition: device
type: is_off
device_id: 497536ba6a270af14bbc9594502c79f9
entity_id: 5f3f158ec2ef6a1d76bd3729c55fa181
domain: light
- condition: numeric_state
entity_id: sensor.ep1_woonkamer_illuminance
below: 32
- condition: numeric_state
entity_id: sensor.ep1_woonkamer_illuminance
below: 32
- condition: device
type: is_off
device_id: 497536ba6a270af14bbc9594502c79f9
entity_id: 5f3f158ec2ef6a1d76bd3729c55fa181
domain: light
- condition: time
after: 00:19:00
before: 00:23:00
action:
- service: scene.turn_on
target:
- target:
entity_id: scene.woonkamer_sfeer_verlichting_aan
metadata: {}
action: scene.turn_on
mode: single
- id: '1670606586705'
alias: Woonkamer - lamp sfeer/ bank sync
@@ -318,42 +318,40 @@
alias: slaapkamer Luuk - knop verwarming uit
description: ''
trigger:
- platform: device
domain: mqtt
device_id: b302a6fc59c6e18c53e40eba7ef192b7
type: click
subtype: single
discovery_id: 0x00158d0008ad9560 click_single
- device_id: 2036a9ff728d3d64d360f8cef09b3e7b
domain: zha
platform: device
type: remote_button_long_press
subtype: remote_button_long_press
condition: []
action:
- service: climate.set_temperature
data:
- data:
temperature: 16
target:
entity_id: climate.kamer_luuk
action: climate.set_temperature
mode: single
- id: '1678902018862'
alias: slaapkamer luuk - longpress verwarming aan
description: ''
trigger:
- platform: device
domain: mqtt
device_id: b302a6fc59c6e18c53e40eba7ef192b7
type: action
subtype: hold
discovery_id: 0x00158d0008ad9560 action_hold
- device_id: 2036a9ff728d3d64d360f8cef09b3e7b
domain: zha
platform: device
type: remote_button_short_press
subtype: remote_button_short_press
condition: []
action:
- service: climate.set_preset_mode
data:
- data:
preset_mode: None
target:
entity_id: climate.kamer_luuk
- service: climate.set_temperature
data:
action: climate.set_preset_mode
- data:
temperature: 18.5
target:
entity_id: climate.kamer_luuk
action: climate.set_temperature
mode: single
- id: '1679849595183'
alias: woonkamer - alles uit als het licht is
@@ -371,7 +369,7 @@
- service: light.turn_off
data: {}
target:
entity_id: light.lamp_bed_willem
entity_id: light.lamp_bed_willem_licht
mode: single
- id: '1683566553338'
alias: awtrix_sensor_power_app
@@ -439,30 +437,13 @@
target:
entity_id: switch.display_woonkamer_screen
mode: single
- id: '1686848917898'
alias: Tuin - automatisch water op timer
description: ''
trigger:
- platform: device
type: turned_on
device_id: e1fd7471fc9fcde9a19ec7175a486dd9
entity_id: switch.valve
domain: switch
condition: []
action:
- service: notify.mobile_app_iphone_van_willem
data:
message: Water timer gestart
- service: script.tuin_water_op_timer
data: {}
mode: single
- id: '1688631089095'
alias: Keuken - Oven notificatie (als iemand thuis is)
description: ''
trigger:
- platform: state
entity_id:
- sensor.oven_operation_state
- sensor.siemens_hm676g0s6_68a40e7e43be_bsh_common_status_operationstate
to:
from: Run
condition: []
@@ -479,10 +460,10 @@
entity_id: sensor.ble_iphone_willem
state: keuken
then:
- service: notify.mobile_app_iphone_van_willem
data:
- data:
message: De oven is klaar
title: Oven
action: notify.mobile_app_iphone_van_willem
- if:
- condition: device
device_id: 1888dfa80ca38679556432ff10ab08c3
@@ -495,10 +476,10 @@
entity_id: sensor.ble_garmin_ilse
state: keuken
then:
- service: notify.mobile_app_iphone_van_ilse
data:
- data:
message: De oven is klaar
title: Oven
action: notify.mobile_app_iphone_van_ilse
mode: single
- id: '1688722609177'
alias: Hass- daily backup
@@ -535,10 +516,10 @@
entity_id: device_tracker.iphone_van_willem
type: is_home
then:
- service: notify.mobile_app_iphone_van_willem
data:
- data:
message: De wasmachine is klaar {{ states('sensor.wasmachine_status') }}
title: Wasmachine
action: notify.sarah
- if:
- condition: device
device_id: 1888dfa80ca38679556432ff10ab08c3
@@ -546,25 +527,21 @@
entity_id: device_tracker.iphone_van_ilse
type: is_home
then:
- service: notify.mobile_app_iphone_van_ilse
data:
- data:
message: De wasmachine is klaar
title: wasmachine
enabled: false
action: notify.mobile_app_iphone_van_ilse
enabled: true
mode: single
- id: '1689934123616'
alias: Garage - beweging
description: ''
use_blueprint:
path: Blackshome/sensor-light.yaml
path: freakshock88/motion_illuminance_activated_entity.yaml
input:
motion_trigger:
- binary_sensor.beweging_garage_beweging
include_bypass: []
include_ambient: ambient_enabled
include_sun: sun_disabled
light_switch:
entity_id: light.lamp_garage
motion_sensor: binary_sensor.beweging_garage_beweging
target_entity: light.lamp_garage
no_motion_wait: input_number.garage_beweging_timer
- id: '1693231308249'
alias: Tuin - speelhuisje contact WLED verloren
description: ''
@@ -1030,7 +1007,7 @@
awtrix_displays:
- 64af8393a844e43d5762a88a1fb2bd56
toggle_helper: input_boolean.awtrix_power_sensor_toggle
my_sensor: sensor.ikea_particles_temperature
my_sensor: sensor.hvac_ir_dsplay_temperature
my_icon: '9275'
push_icon: '0'
- id: '1709406707433'
@@ -1042,20 +1019,8 @@
awtrix_displays:
- 64af8393a844e43d5762a88a1fb2bd56
toggle_helper: input_boolean.awtrix_power_sensor_toggle
my_sensor: sensor.ikea_particles_pm25
my_sensor: sensor.aqs_woonkamer2_particulate_matter_2_5_m_concentration
my_icon: '6641'
- id: '1709406813204'
alias: awtrix woonkamer - bitcoins
description: ''
use_blueprint:
path: smarthomejunkie/awtrix_create_sensor_app.yaml
input:
awtrix_displays:
- 64af8393a844e43d5762a88a1fb2bd56
toggle_helper: input_boolean.awtrix_power_sensor_toggle
my_sensor: sensor.exchange_rate_1_btc
my_icon: '57014'
push_icon: '0'
- id: '1709464566779'
alias: Assist - bose harder
description: ''
@@ -1166,17 +1131,16 @@
controller_device: 90d420a2a2a3b98201fca84e124bad73
helper_last_controller_event: input_text.bp_last_knoppen_slaapkamer_tim_action
action_button_right_short:
- service: light.turn_on
target:
- target:
entity_id: light.rgb_slaapkamer_tim
data:
rgb_color:
- '{{ (range(0, 255)|random) }}'
- '{{ (range(0, 255)|random) }}'
- '{{ (range(0, 255)|random) }}'
action: light.turn_on
action_button_left_long:
- service: light.turn_on
target:
- target:
entity_id: light.rgb_slaapkamer_tim
data:
brightness: '{% if state_attr("light.rgb_slaapkamer_tim","brightness") is
@@ -1191,9 +1155,9 @@
< 225 %} 255 {% else %} 10 {% endif %}
'
action: light.turn_on
action_button_left_short:
- service: light.turn_on
target:
- target:
entity_id: light.rgb_slaapkamer_tim
data:
color_temp: '{% if state_attr("light.rgb_slaapkamer_tim","color_temp") is
@@ -1203,41 +1167,45 @@
> 284 %} 244 {% else %} 370 {% endif %}
'
action: light.turn_on
action_button_right_long:
- service: light.turn_on
target:
- target:
entity_id: light.rgb_slaapkamer_tim
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
brightness: '{% if state_attr("light.rgb_slaapkamer_tim","brightness") is
none %} 32 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 254 %} 224 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 223 %} 192 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 191 %} 160 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 159 %} 128 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 127 %} 64 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 63 %} 32 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 31 %} 16 {% elif state_attr("light.rgb_slaapkamer_tim","brightness")|int
> 15 %} 8 {% else %} 128 {% endif %}
'
action: light.turn_on
action_button_up_short:
- service: light.turn_on
- action: light.turn_on
metadata: {}
data: {}
data:
kelvin: 2000
brightness_pct: 40
target:
entity_id: light.rgb_slaapkamer_tim
device_id: a5c4a7221f63727d7554c259a7b76cc0
action_button_down_short:
- service: light.turn_off
metadata: {}
- metadata: {}
data: {}
target:
entity_id: light.rgb_slaapkamer_tim
- service: automation.trigger
metadata: {}
action: light.turn_off
- metadata: {}
data:
skip_condition: true
target:
entity_id: automation.slaap_trainer_tim_bedtijd
action: automation.trigger
action_button_up_release: []
- id: '1717308990858'
alias: '[BP ZHA] knoppen bed willem'
description: ''
@@ -1246,15 +1214,14 @@
input:
aqara_mini_switch: 61c4022b7cb861ed4c60ea3b7336baa9
button_single_press_left:
- service: light.toggle
metadata: {}
- action: light.toggle
data:
brightness_pct: 35
color_temp: 153
target:
entity_id: light.hvac_ir_rgb_slaapkamer_neopixel_light
entity_id: light.airco_ir_slaapkamer_neopixel_light
button_single_press_right:
- service: light.toggle
- action: light.toggle
metadata: {}
data:
brightness_pct: 15
@@ -1262,23 +1229,23 @@
target:
device_id: bfdb32c651d6c4a4301613f69523ce68
button_double_press_left:
- service: light.turn_on
- action: light.turn_on
metadata: {}
data:
color_temp: 153
brightness_pct: 100
target:
entity_id: light.hvac_ir_rgb_slaapkamer_neopixel_light
entity_id: light.airco_ir_slaapkamer_neopixel_light
button_long_press_left:
- service: light.turn_on
- action: light.turn_on
metadata: {}
data:
color_temp: 153
brightness_step_pct: 29
target:
entity_id: light.hvac_ir_rgb_slaapkamer_neopixel_light
entity_id: light.airco_ir_slaapkamer_neopixel_light
button_double_press_right:
- service: light.turn_on
- action: light.turn_on
target:
device_id:
- bfdb32c651d6c4a4301613f69523ce68
@@ -1286,7 +1253,7 @@
kelvin: 2000
brightness_pct: 100
button_long_press_right:
- service: light.turn_on
- action: light.turn_on
target:
entity_id: light.lamp_bed_willem_licht
data:
@@ -1298,9 +1265,80 @@
entity_id: 50a2b15de13d2e3f2d7e26c302ccd3ff
type: set_position
position: 100
alias: open curtains
button_long_press_both:
- device_id: cc0db2acf0bb2018d46ad2ffd2f89df1
domain: cover
entity_id: 50a2b15de13d2e3f2d7e26c302ccd3ff
type: set_position
position: 0
alias: close curtains
- id: '1724443240070'
alias: Hal - wc toggle lamp with switch
description: ''
trigger:
- platform: state
entity_id:
- binary_sensor.lamp_wc_input_0_input
condition: []
action:
- type: toggle
device_id: d97258d7ca7eb0ede371b5b2bd3b4aa9
entity_id: 284f2fcf6ebea7b570fa9c0dbf50468c
domain: light
mode: single
- id: '1727243468459'
alias: Lader gestopt
description: ''
triggers:
- entity_id:
- sensor.smartevse_state
from: Charging
trigger: state
for:
hours: 0
minutes: 10
seconds: 0
conditions: []
actions:
- action: notify.mobile_app_iphone_van_willem
data:
message: Lader gestopt
- if:
- condition: state
entity_id: input_boolean.vaatwasser_aan_als_laden_klaar_is
state: 'on'
then:
- action: script.keuken_vaatwasser_start
metadata: {}
data: {}
- action: input_boolean.turn_off
target:
entity_id: input_boolean.vaatwasser_aan_als_laden_klaar_is
data: {}
mode: single
- id: '1728146645423'
alias: Watchman report
description: ''
trigger:
- type: value
platform: device
device_id: f4f17ad4d0592f9dc6844ef6530627d4
entity_id: 099f4db4a8bd40575d544ee542242c74
domain: sensor
above: 0
- type: value
platform: device
device_id: f4f17ad4d0592f9dc6844ef6530627d4
entity_id: 9d1f623158feb4e90e2519ce917d52a6
domain: sensor
above: 0
condition: []
action:
- action: watchman.report
metadata: {}
data:
create_file: false
chunk_size: false
send_notification: true
mode: single

View File

@@ -26,4 +26,5 @@ homeassistant:
logger:
default: warning
#logs:
#custom_components.kia_uvo: debug

View File

@@ -0,0 +1,11 @@
# Example configuration.yaml entry
---
plant:
monstera:
sensors:
moisture: sensor.monstera_moisture
battery: sensor.monstera_battery
temperature: sensor.monstera_temperature
conductivity: sensor.monstera_conductivity
brightness: sensor.monstera_illuminance
min_moisture: 20

View File

@@ -1,27 +0,0 @@
# ---
# platform: afvalinfo
# id: Thuis # (optional, default = '') add some extra naming to make identification of multiple afvalinfo sensors easier
# resources: # (at least 1 required)
# - type: gft #(type is required)
# friendly_name: GFT #(friendly_name is optional)
# - type: kerstboom
# friendly_name: Kerstboom
# - type: pbd
# friendly_name: Pmd
# - type: papier
# friendly_name: Papier
# - type: restafval
# friendly_name: Restafval
# - type: trash_type_today
# friendly_name: Afval voor vandaag
# - type: trash_type_tomorrow
# friendly_name: Afval voor morgen
# location: sint-michielsgestel #(required, default = sliedrecht) name of the 'gemeente'
# postcode: 5275 BV #(required, default = 3361AB)
# streetnumber: 16 #(required, default = 1)
# #diftarcode: 12345678 #(optional, default = '')
# #streetnumbersuffix: "" #(optional, default = '')
# #dateformat: '%d-%m-%Y' (optional, default = %d-%m-%Y) day-month-year
# locale: "nl" #(optional, default = 'en')
# timespanindays: 365 #(optional, default = 365) number of days to look into the future
# notrashtext: "geen" #(Optional, default = 'none') the text to show for the today and tomorrow sensor when there is no trash to collect

View File

@@ -1,6 +0,0 @@
---
platform: bitcoin
currency: EUR
display_options:
- exchangerate
- trade_volume_btc

View File

@@ -103,9 +103,9 @@ sensor:
travel_ASML_name: >
{{ state_attr('sensor.werk_asml','friendly_name') }}
travel_Euretco_time: >
{{ state_attr('sensor.reistijd_hoeverlaken','duration') | round(2) }}
{{ state_attr('sensor.werk_ilse','duration') | round(2) }}
travel_Euretco_name: >
{{ state_attr('sensor.reistijd_hoeverlaken','friendly_name') }}
{{ state_attr('sensor.werk_ilse','friendly_name') }}
sun_next_rising: >
{{ state_attr('Sun.sun', 'next_rising') }}
sun_next_setting: >

View File

@@ -27,7 +27,7 @@ packages:
connection: !include common/wifi.yaml
status: !include templates/status.yaml
logger: !include templates/nologger.yaml
#bt_proxy: !include common/bluetooth.yaml
bt_proxy: !include common/bluetooth.yaml
#sensors
#mmwave: !include sensors/ld2420.yaml
pmsc: !include sensors/pmsx0003.yaml

View File

@@ -21,7 +21,7 @@ substitutions:
packages:
board: !include boards/esp32_wroom_arduino.yaml
i2c: !include interfaces/i2c_a.yaml
i2c: !include interfaces/i2c_a_slow.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
status: !include templates/status.yaml
@@ -29,7 +29,7 @@ packages:
bt_proxy: !include common/bluetooth.yaml
#sensors
#mmwave: !include sensors/ld2410.yaml
#mmwave: !include sensors/ld2420.yaml
pms: !include sensors/pm1006.yaml
co2: !include sensors/scd30.yaml
tvoc: !include sensors/sgp30.yaml

View File

@@ -12,10 +12,12 @@ substitutions:
subnet: !secret ip_subnet
ip: !secret badkamerradfan_ip
pin_temp: GPIO3
pin_pwm: GPIO4
pin_tach: GPIO2
pin_pwm: GPIO2
pin_tach1: GPIO6
pin_tach2: GPIO7
pin_tach3: GPIO9
pin_status: GPIO8
ledc_freq: "16000"
ledc_freq: "1000"
packages:
board: !include boards/esp32-C3.yaml
@@ -23,6 +25,7 @@ packages:
connection: !include common/wifi.yaml
status: !include templates/status.yaml
logger: !include templates/logger.yaml
bt_proxy: !include common/bluetooth.yaml
output:
- platform: ledc
@@ -35,7 +38,7 @@ fan:
output: pwm1
name: "Badkamer radiator Fan"
id: badkamerfan
restore_mode: RESTORE_DEFAULT_ON
restore_mode: RESTORE_DEFAULT_OFF
# Example configuration entry
one_wire:
@@ -45,7 +48,7 @@ one_wire:
# Individual sensors
sensor:
- platform: dallas_temp
address: 0x59800000081fd028
address: 0xb1800000081e5a28
name: "Radiataor Temperature"
id: radtemperature
on_value_range:
@@ -56,6 +59,52 @@ sensor:
then:
- fan.turn_off: badkamerfan
- platform: pulse_counter
pin:
number: ${pin_tach1}
mode:
input: true
pullup: true
name: fan1 PWM
id: fan_pulse1
unit_of_measurement: 'RPM'
filters:
- multiply: 0.5
count_mode:
rising_edge: INCREMENT
falling_edge: DISABLE
update_interval: 3s
- platform: pulse_counter
pin:
number: ${pin_tach2}
mode:
input: true
pullup: true
name: fan2 PWM
id: fan_pulse2
unit_of_measurement: 'RPM'
filters:
- multiply: 0.5
count_mode:
rising_edge: INCREMENT
falling_edge: DISABLE
update_interval: 3s
- platform: pulse_counter
pin:
number: ${pin_tach3}
mode:
input: true
pullup: true
name: fan3 PWM
id: fan_pulse3
unit_of_measurement: 'RPM'
filters:
- multiply: 0.5
count_mode:
rising_edge: INCREMENT
falling_edge: DISABLE
update_interval: 3s
number:
- platform: template
name: "Fan on temp"
@@ -75,4 +124,4 @@ number:
max_value: 65
restore_value: True
initial_value: 24
step: 1
step: 1

Submodule esphome/boards/.esphome/external_components/3a17a31a added at 5f1a08c922

View File

@@ -0,0 +1,14 @@
---
esp32:
board: esp32-c3-devkitm-1
framework:
type: esp-idf
sdkconfig_options:
CONFIG_BT_BLE_50_FEATURES_SUPPORTED: y
CONFIG_BT_BLE_42_FEATURES_SUPPORTED: y
CONFIG_ESP_TASK_WDT_TIMEOUT_S: "10"
esphome:
platformio_options:
board_build.mcu: esp32c3
board_build.variant: esp32c3

5
esphome/boards/esp32-gen.yaml Executable file
View File

@@ -0,0 +1,5 @@
---
esp32:
board: ${board}
framework:
type: ${framework}

View File

@@ -0,0 +1,4 @@
esp32:
board: esp32dev
framework:
type: esp-idf

View File

@@ -4,7 +4,7 @@ esp32:
flash_size: 16MB
framework:
type: esp-idf
version: 4.4.6
#version: 4.4.6
sdkconfig_options:
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
@@ -27,6 +27,9 @@ external_components:
- source: github://pr#5230
components: esp_adf
refresh: 0s
- source: github://jesserockz/esphome-components
components: [file]
refresh: 0s
# - source: github://X-Ryl669/esphome@esp-adf-take2 #pr#5230
# components: [esp_adf]
# refresh: 0s

View File

@@ -0,0 +1,58 @@
---
esp32:
board: esp32s3box
flash_size: 16MB
framework:
type: esp-idf
sdkconfig_options:
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
CONFIG_AUDIO_BOARD_CUSTOM: "y"
CONFIG_ESP32_S3_BOX_3_BOARD: "y"
components:
- name: esp32_s3_box_3_board
source: github://jesserockz/esp32-s3-box-3-board@main
refresh: 0s
# components:
# - name: esp32_s3_box_3_board
# source: github://X-Ryl669/esp32-s3-box-3-board@main
# refresh: 0s
psram:
mode: octal
speed: 80MHz
external_components:
- source:
type: git
url: https://github.com/gnumpi/esphome_audio
ref: dev-next
components: [ adf_pipeline, i2s_audio ]
refresh: 0s
# - source: github://X-Ryl669/esphome@esp-adf-take2 #pr#5230
# components: [esp_adf]
# refresh: 0s
# - source: github://X-Ryl669/esphome@at581x
# components: at581x
# refresh: 0s
# - source: github://pr#5894 #5198
# components: [ahtxx]
# refresh: 60s
esphome:
name: ${device_name}
friendly_name: ${friendly_name}
min_version: 2024.7.0
platformio_options:
board_build.flash_mode: dio
on_boot:
priority: 600
then:
- light.turn_on:
id: led
brightness: 100%
- display.page.show: loading_page
- component.update: s3_box_lcd
project:
name: "BigBobbas.s3box"
version: ${version}

29
esphome/bt-proxy-hal.yaml Normal file
View File

@@ -0,0 +1,29 @@
substitutions:
device_name: "btproxyhal"
friendly_name: "BT_proxy_hal"
comment: "ESP32-c3 proxy"
location: "hal"
board: "esp32-c3-devkitm-1"
framework: arduino
api_password: !secret bt_proxy_hal_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret bt_proxy_hal_ip
#pin_status: GPIO8
# update_interval: 10s
# pin_sda: GPIO8
# pin_scl: GPIO9
packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi_btprox.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
#status: !include templates/status.yaml
btproxy: !include templates/bt_proxy.yaml
#bme: !include sensors/bme280.yaml
#i2c: !include interfaces/i2c_a.yaml

View File

@@ -0,0 +1,24 @@
substitutions:
device_name: "btproxykeuken"
friendly_name: "BT_proxy_keuken"
comment: "ESP32-c3 proxy"
location: "keuken"
board: "esp32-c3-devkitm-1"
framework: arduino
api_password: !secret bt_proxy_keuken_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret bt_proxy_keuken_ip
pin_status: GPIO8
packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi_btprox.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
btproxy: !include templates/bt_proxy.yaml

View File

@@ -0,0 +1,24 @@
substitutions:
device_name: "btproxyspeelkamer"
friendly_name: "BT_proxy_speelkamer"
comment: "ESP32-c3 proxy"
location: "speelkamer"
board: "esp32-c3-devkitm-1"
framework: arduino
api_password: !secret bt_proxy_speelkamer_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret bt_proxy_speelkamer_ip
pin_status: GPIO8
packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi_btprox.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
btproxy: !include templates/bt_proxy.yaml

View File

@@ -0,0 +1,26 @@
substitutions:
device_name: "btproxywoonkamer"
friendly_name: "BT_proxy_woonkamer"
comment: "ESP32-c3 proxy"
location: "woonkamer"
board: "esp32-c3-devkitm-1"
framework: arduino
api_password: !secret bt_proxy_woonkamer_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret bt_proxy_woonkamer_ip
pin_status: GPIO8
packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi_btprox.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
#status: !include templates/status.yaml
btproxy: !include templates/bt_proxy.yaml

View File

@@ -0,0 +1,27 @@
substitutions:
device_name: "btproxyzolder"
friendly_name: "BT_proxy_zolder"
comment: "ESP32-c3 proxy"
location: "zolder"
board: "esp32-c3-devkitm-1"
#framework: esp-idf
framework: arduino
api_password: !secret bt_proxy_zolder_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret bt_proxy_zolder_ip
pin_status: GPIO8
packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi_btprox.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
#status: !include templates/status.yaml
btproxy: !include templates/bt_proxy.yaml

File diff suppressed because it is too large Load Diff

View File

@@ -5,8 +5,15 @@
# window: 1100ms # default 30ms
# active: true
bluetooth_proxy:
esp32_ble_tracker:
scan_parameters:
interval: 1100ms
window: 1100ms
active: true
bluetooth_proxy:
active: true
#cache_services: true #needs idf
# binary_sensor:
# - platform: ble_presence

View File

@@ -0,0 +1,30 @@
---
# esp32_ble_tracker:
# scan_parameters:
# interval: 1100ms # default 320ms
# window: 1100ms # default 30ms
# active: true
esp32_ble_tracker:
scan_parameters:
interval: 1100ms
window: 1100ms
active: true
bluetooth_proxy:
active: true
cache_services: true
# binary_sensor:
# - platform: ble_presence
# mac_address: C8:B8:49:1F:07:7C
# name: "BLE tracker 1"
# sensor:
# - platform: ble_rssi
# mac_address: C8:B8:49:1F:07:7C
# name: "BLE tracker 1"
# text_sensor:
# - platform: ble_scanner
# name: "BLE Devices Scanner"

View File

@@ -1,5 +1,7 @@
ota:
password: ${ota_password}
- platform: esphome
id: my_ota
password: ${ota_password}
api:
encryption:

View File

@@ -19,7 +19,7 @@ wifi:
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
# use_address: 192.168.2.63 #when changing fixed IP
#use_address: 192.168.2.235 #when changing fixed IP
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:

59
esphome/common/wifi_btprox.yaml Executable file
View File

@@ -0,0 +1,59 @@
# Enable Home Assistant API
api:
encryption:
key: ${api_password}
ota:
- platform: esphome
id: my_ota
password: ${ota_password}
wifi:
ssid: ${wifi_ssid}
password: ${wifi_password}
fast_connect: True
output_power: "8.5"
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
#use_address: 192.168.2.235 #when changing fixed IP
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: ${device_name}
password: ${wifi_password}
captive_portal:
sensor:
- platform: wifi_signal
name: "WiFi Signal "
update_interval: 10s
text_sensor:
- platform: wifi_info
ip_address:
name: IP Address
icon: mdi:wifi-strength-2
id: ipaddr
ssid:
name: "Connected SSID"
id: ssid
icon: mdi:wifi-strength-2
entity_category: diagnostic
bssid:
name: "Connected BSSID"
id: bssid
icon: mdi:wifi-strength-2
entity_category: diagnostic
mac_address:
name: "WiFi Mac Address"
id: macaddress
icon: mdi:wifi-strength-2
entity_category: diagnostic

View File

@@ -0,0 +1,72 @@
# Enable Home Assistant API
api:
encryption:
key: ${api_password}
on_client_connected:
- lambda: |-
id(api_connection) = true;
- component.update: s3_box_lcd
- script.execute: saver_enabled
on_client_disconnected:
- lambda: |-
id(api_connection) = false;
ota:
password: ${ota_password}
platform: esphome
wifi:
ssid: ${wifi_ssid}
password: ${wifi_password}
fast_connect: True
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
# use_address: 192.168.2.63 #when changing fixed IP
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: ${device_name}
password: ${wifi_password}
on_connect:
- lambda: |-
id(wifi_connection) = true;
- display.page.show: idle_page
- component.update: s3_box_lcd
on_disconnect:
- lambda: |-
id(wifi_connection) = false;
sensor:
- platform: wifi_signal
name: "WiFi Signal "
update_interval: 10s
text_sensor:
- platform: wifi_info
ip_address:
name: IP Address
icon: mdi:wifi-strength-2
id: ipaddr
ssid:
name: "Connected SSID"
id: ssid
icon: mdi:wifi-strength-2
entity_category: diagnostic
bssid:
name: "Connected BSSID"
id: bssid
icon: mdi:wifi-strength-2
entity_category: diagnostic
mac_address:
name: "WiFi Mac Address"
id: macaddress
icon: mdi:wifi-strength-2
entity_category: diagnostic

View File

@@ -17,6 +17,7 @@ packages:
connection: !include common/wifi_nosens.yaml
logger: !include templates/logger.yaml
#add include
esphome:
includes:

View File

@@ -34,6 +34,7 @@ packages:
logger: !include templates/logger.yaml
i2c: !include interfaces/i2c_a.yaml
bluetooth: !include common/bluetooth.yaml
bt_proxy: !include common/bluetooth.yaml
improv_serial:

View File

@@ -47,67 +47,89 @@ api:
esphome:
on_boot:
- priority: -200.0
then:
# - stepper.report_position: # Set stepper to global variable
# id: stepper_motor
# position: !lambda return id(stepper_motor_global);
# - stepper.set_target: # Set stepper to global variable
# id: stepper_motor
# target: !lambda return id(stepper_motor_global);
# # - sensor.template.publish:
# # id: motor_hal
# # state: !lambda return id(hall_pos_global);
# - if: # If blind is Closed
# condition:
# - lambda: 'return id(stepper_motor_global) == 0;'
# then: # Publish state etc.
# - cover.template.publish:
# id: ${blinds_name}
# state: CLOSED
# current_operation: IDLE
# - if: # If blind is Open
# condition:
# - lambda: 'return id(stepper_motor_global) == id(endstop).state;'
# then: # Publish state etc.
# - cover.template.publish:
# id: ${blinds_name}
# state: OPEN
# current_operation: IDLE
# - if: # If blind is Neither
# condition:
# - lambda: 'return (id(stepper_motor_global) != 0) && (id(stepper_motor_global) != id(endstop).state);'
# then: # # Publish state etc.
# - cover.template.publish:
# id: ${blinds_name}
# position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
# current_operation: IDLE
priority: -100
then:
- number.set:
id: endstop_open
value: !lambda "return id(endstop_open_global);"
- number.set:
id: endstop_closed
value: !lambda "return id(endstop_close_global);"
- number.set:
id: calibration_max
value: !lambda "return id(calibration_max_global);"
globals:
# - id: stepper_motor_global # Integer for storing the stepper position in case of reboot
# type: int
# restore_value: True
# initial_value: '0'
# - id: openclosed # Boolean to store OPEN/CLOSED state
# type: bool
# restore_value: True
# initial_value: '0'
- id: hall_pos_global
type: int
restore_value: True
initial_value: '0'
- id: hall_pos_old
- id: endstop_open_global
type: int
restore_value: False
restore_value: True
initial_value: '0'
- id: endstop_close_global
type: int
restore_value: True
initial_value: '0'
- id: calibration_max_global
type: int
restore_value: True
initial_value: '250'
number:
- platform: template
id: endstop_open
min_value: -50
max_value: 50
step: 1
name: endstop open
optimistic: true
on_value:
then:
- globals.set:
id: endstop_open_global
value: !lambda "return x;"
- logger.log: "endstop open stored"
- platform: template
id: endstop_closed
min_value: -50
max_value: 50
step: 1
name: enstop closed
optimistic: true
on_value:
then:
- globals.set:
id: endstop_close_global
value: !lambda "return x;"
- logger.log: "endstop open stored"
- platform: template
id: calibration_max
min_value: 0
max_value: 1000
step: 1
name: calibration max
optimistic: true
on_value:
then:
- globals.set:
id: calibration_max_global
value: !lambda "return x;"
- logger.log: "calirbation max stored"
- platform: template
name: Stepper Control
min_value: -100
max_value: 100
step: 1
set_action:
then:
- stepper.set_target:
id: stepper_motor
target: !lambda 'return x;'
sensor:
# - platform: template
# id: stepper_pos
# name: stepper_pos
- platform: template
id: motor_hal
name: motor_hal
@@ -134,7 +156,7 @@ binary_sensor:
on_release:
- then:
- lambda: |-
static int motorvalue;
static int motorvalue = id(hall_pos_global);
if(id(halldirection).state){
motorvalue += 1;
}
@@ -146,177 +168,148 @@ binary_sensor:
ESP_LOGD("on sensor", "motor hall: %d", motorvalue);
# number:
# - platform: template
# name: endstop Control
# id: endstop
# min_value: 0
# max_value: 2000
# step: 1
# mode: slider
# unit_of_measurement: steps
# restore_value: True
# optimistic: True
stepper:
- platform: a4988
id: stepper_motor
step_pin: ${pin_mot_stp}
dir_pin: ${pin_mot_dir}
max_speed: 200
# Optional:
sleep_pin: ${pin_mot_slp}
acceleration: inf
deceleration: inf
cover:
button:
- platform: template
name: Dining Room Blinds
id: ${blinds_name}
open_action:
then:
- logger.log: "Opening"
- stepper.set_target:
id: stepper_motor
target: 750
- while:
condition:
lambda: 'return id(stepper_motor).current_position < id(endstop).state;'
then:
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: OPENING
- delay: 1000 ms
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- globals.set: # Set toggle to OPEN (No need for 'optimistic mode')
id: openclosed
value: '1'
- cover.template.publish:
id: ${blinds_name}
state: OPEN
current_operation: IDLE
id: Calibrate_blinds
name: Calibrate blinds
on_press:
# reset all params
- globals.set:
id: hall_pos_global
value: "0"
#tell stepper that he is in the middle
- stepper.report_position:
id: stepper_motor
position: !lambda "return uint32_t(id(calibration_max));"
# It's best to call set_target directly after report_position, so that the stepper doesn't move
- stepper.set_target:
id: stepper_motor
target: !lambda "return uint32_t(id(calibration_max));"
#calibrate closed_endstop
- stepper.set_target:
id: stepper_motor
target: 0
- while:
condition:
lambda: 'return id(hall_pos_global) > -10;'
then:
- logger.log:
format: "hal pos = %i; stepper pos = %i"
args: [id(hall_pos_global), id(stepper_motor).current_position]
# cover:
# - platform: template
# name: Dining Room Blinds
# id: ${blinds_name}
# open_action:
# then:
# - logger.log: "Opening"
# - stepper.set_target:
# id: stepper_motor
# target: 750
# - while:
# condition:
# lambda: 'return id(stepper_motor).current_position < id(endstop).state;'
# then:
# - cover.template.publish:
# id: ${blinds_name}
# position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
# current_operation: OPENING
# - delay: 1000 ms
# - globals.set: # Set global to current position
# id: stepper_motor_global
# value: !lambda return id(stepper_motor).current_position;
# - sensor.template.publish:
# id: stepper_pos
# state: !lambda return id(stepper_motor).current_position;
# - globals.set: # Set toggle to OPEN (No need for 'optimistic mode')
# id: openclosed
# value: '1'
# - cover.template.publish:
# id: ${blinds_name}
# state: OPEN
# current_operation: IDLE
close_action:
then:
- logger.log: "Closing"
- stepper.set_target: # Send stepper to 0
id: stepper_motor
target: '0'
- while:
condition:
lambda: 'return id(stepper_motor).current_position > 0;'
then:
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: CLOSING
- delay: 1000 ms
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- globals.set: # Set toggle to CLOSED (No need for 'optimistic mode')
id: openclosed
value: '0'
- cover.template.publish:
id: ${blinds_name}
state: CLOSED
current_operation: IDLE
position_action:
then:
- stepper.set_target:
id: stepper_motor
target: !lambda return int(id(endstop).state * pos);
- while:
condition:
lambda: 'return id(stepper_motor).current_position != int(id(endstop).state * pos);'
then:
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
- delay: 1000 ms
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: IDLE
stop_action:
then:
- stepper.set_target:
id: stepper_motor
target: !lambda return id(stepper_motor).current_position;
- globals.set: # Set global to current position
id: stepper_motor_global
value: !lambda return id(stepper_motor).current_position;
- sensor.template.publish:
id: stepper_pos
state: !lambda return id(stepper_motor).current_position;
- cover.template.publish:
id: ${blinds_name}
position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
current_operation: IDLE
has_position: true
device_class: blind
# - while:
# condition:
# lambda: 'return id(stepper_motor).current_position > 0;'
# then:
# - cover.template.publish:
# id: ${blinds_name}
# position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
# current_operation: CLOSING
# - delay: 1000 ms
# - globals.set: # Set global to current position
# id: stepper_motor_global
# value: !lambda return id(stepper_motor).current_position;
# - sensor.template.publish:
# id: stepper_pos
# state: !lambda return id(stepper_motor).current_position;
# - globals.set: # Set toggle to CLOSED (No need for 'optimistic mode')
# id: openclosed
# value: '0'
# - cover.template.publish:
# id: ${blinds_name}
# state: CLOSED
# current_operation: IDLE
# position_action:
# then:
# - stepper.set_target:
# id: stepper_motor
# target: !lambda return int(id(endstop).state * pos);
# - while:
# condition:
# lambda: 'return id(stepper_motor).current_position != int(id(endstop).state * pos);'
# then:
# - cover.template.publish:
# id: ${blinds_name}
# position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
# - delay: 1000 ms
# - globals.set: # Set global to current position
# id: stepper_motor_global
# value: !lambda return id(stepper_motor).current_position;
# - sensor.template.publish:
# id: stepper_pos
# state: !lambda return id(stepper_motor).current_position;
# - cover.template.publish:
# id: ${blinds_name}
# position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
# current_operation: IDLE
# stop_action:
# then:
# - stepper.set_target:
# id: stepper_motor
# target: !lambda return id(stepper_motor).current_position;
# - globals.set: # Set global to current position
# id: stepper_motor_global
# value: !lambda return id(stepper_motor).current_position;
# - sensor.template.publish:
# id: stepper_pos
# state: !lambda return id(stepper_motor).current_position;
# - cover.template.publish:
# id: ${blinds_name}
# position: !lambda 'return (float(float(id(stepper_motor).current_position) / float(id(endstop).state)));'
# current_operation: IDLE
# has_position: true
# device_class: blind
# switch:
# - platform: template
# name: Reset Blinds
# id: calibrate
# turn_on_action:
# - lambda: |-
# bool stall = false;
# long steps = 40;
# int oldpos = id(hall_pos_global);
# while(!stall)
# {
# id(stepper_motor).set_target(steps);
# if(oldpos != id(hall_pos_global)){
# steps+=40;
# }else{
# stall = true;
# ESP_LOGD("reset", "end_pos1 %d", steps);
# }
# oldpos = id(hall_pos_global);
# }
# id(calibrate).publish_state(false);
# //rotate to stall
# - stepper.set_target:
# id: stepper_motor
# target: !lambda 'return id(endstop).state * 2;'
# - wait_until:
# lambda: 'return id(stepper_motor).current_position == id(endstop).state*2;'
# - delay: 1s
# - stepper.set_target:
# id: stepper_motor
# target: '0'
# - globals.set: # Set global to current position
# id: stepper_motor_global
# value: !lambda return id(stepper_motor).current_position;
# - sensor.template.publish:
# id: stepper_pos
# state: !lambda return id(stepper_motor).current_position;
# - globals.set: # Set toggle to CLOSED (No need for 'optimistic mode')
# id: openclosed
# value: '0'
# - cover.template.publish:
# id: ${blinds_name}
# state: CLOSED
# current_operation: IDLE
# - globals.set:
# id: hall_pos_global
# value: '0'

View File

@@ -0,0 +1,27 @@
substitutions:
name: "esp32-s3-box-3-voiceasist"
friendly_name: ESP32 S3 Box 3 5a7a54
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret esp32-s3-box-3_ip
packages:
esphome.voice-assistant: github://esphome/wake-word-voice-assistants/esp32-s3-box-3/esp32-s3-box-3.yaml@main
esphome:
name: ${name}
name_add_mac_suffix: false
friendly_name: ${friendly_name}
api:
encryption:
key: GKxKZNt/5rJJNTEoAvh1PLVESiUQRGnf1zWSHWZAnUw=
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1

View File

@@ -22,9 +22,9 @@ packages:
connection: !include common/wifi.yaml
device_base: !include common/common.yaml
climate: !include templates/climate_nosens.yaml
#status: !include templates/status.yaml
status: !include templates/nostatus.yaml
logger: !include templates/nologger.yaml
button: !include templates/button.yaml
#button: !include templates/button.yaml
light:
- platform: neopixelbus
@@ -39,12 +39,12 @@ light:
effects:
- random:
name: "Random"
transition_length: 4s
update_interval: 5s
transition_length: 2s
update_interval: 7s
- addressable_rainbow:
name: Rainbow Effect
speed: 20
width: 17
speed: 16
width: 4
#GPIO4 - status

View File

@@ -31,6 +31,7 @@ packages:
#status: !include templates/status.yaml
logger: !include templates/logger.yaml
sht3x: !include sensors/sht3x.yaml
smsl: !include templates/remote_smsl.yaml

View File

@@ -11,4 +11,5 @@ ethernet:
gateway: ${gateway}
subnet: ${subnet}
dns1: ${dns1}
dns2: ${dns2}
dns2: ${dns2}
#use_address: 192.168.2.235 #when changing fixed IP

View File

@@ -0,0 +1,6 @@
i2c:
- id: bus_a
sda: ${pin_sda}
scl: ${pin_scl}
frequency: 50kHz
scan: true

View File

@@ -0,0 +1,17 @@
---
i2c:
- id: bus_a
sda: ${pin_sda_a}
scl: ${pin_scl_a}
scan: false
sda_pullup_enabled: true
scl_pullup_enabled: true
frequency: 100kHz
- sda: ${pin_sda_b}
scl: ${pin_scl_b}
scan: false
sda_pullup_enabled: true
scl_pullup_enabled: true
frequency: 50kHz
id: bus_b

View File

@@ -0,0 +1,31 @@
---
switch:
- platform: gpio
id: enable_ir
name: "IR Power"
pin:
number: GPIO44
inverted: true
restore_mode: ALWAYS_ON
remote_receiver:
id: rcvr
pin:
number: 38
inverted: true
dump: all
rmt_channel: 4
memory_blocks: 4
# on_pronto:
# then:
# - lambda: 'id(ir_signals_vector).push_back(x.data);'
# - component.update: s3_box_lcd
remote_transmitter:
id: irtx
pin:
number: 39
inverted: false
carrier_duty_percent: 50%
rmt_channel: 0

View File

@@ -18,6 +18,7 @@ packages:
connection: !include common/wifi.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
#parameter list: https://tools.remeha.nl/wp-content/uploads/sites/3/2020/08/Lijst-van-parameters-voor-GTW08.pdf
#modbus registers

View File

@@ -20,12 +20,6 @@ packages:
bt_proxy: !include common/bluetooth.yaml
logger: !include templates/nologger.yaml
web_server:
port: 80
local: true
js_include: "include/www.js"
js_url: ""
binary_sensor:
- platform: gpio
pin:
@@ -60,7 +54,7 @@ light:
variant: ws2812X
pin: ${pin_leds}
num_leds: 1
name: "${device_name}_RGB_Light"
name: moon
id: RGB_Light
effects:
- random:

View File

@@ -1,59 +1,48 @@
uart:
- !include ../interfaces/uart_ld2420.yaml
external_components:
- source: github://descipher/esphome@component.ld2420
#github://pr#4847
components: [ ld2420 ]
refresh: 1days
# Example configuration entry
ld2420:
uart_id: uart_ld
presence_time_window: 120s
detection_gate_min: 1
detection_gate_max: 12
g0_move_threshold: 60000
g0_still_threshold: 40000
g1_move_threshold: 30000
g1_still_threshold: 20000
g2_move_threshold: 400
g2_still_threshold: 200
g3_move_threshold: 250
g3_still_threshold: 200
g4_move_threshold: 250
g4_still_threshold: 200
g5_move_threshold: 250
g5_still_threshold: 200
g6_move_threshold: 250
g6_still_threshold: 200
g7_move_threshold: 250
g7_still_threshold: 150
g8_move_threshold: 250
g8_still_threshold: 150
g9_move_threshold: 250
g9_still_threshold: 100
g10_move_threshold: 250
g10_still_threshold: 100
g11_move_threshold: 250
g11_still_threshold: 100
g12_move_threshold: 250
g12_still_threshold: 100
g13_move_threshold: 200
g13_still_threshold: 100
g14_move_threshold: 200
g14_still_threshold: 100
g15_move_threshold: 200
g15_still_threshold: 100
text_sensor:
- platform: ld2420
fw_version:
name: LD2420 Firmware
sensor:
- platform: ld2420
moving_distance:
name : Moving Distance
binary_sensor:
- platform: ld2420
has_target:
name: Presence
name: Presence
select:
- platform: ld2420
operating_mode:
name: Operating Mode
number:
- platform: ld2420
presence_timeout:
name: Detection Presence Timeout
min_gate_distance:
name: Detection Gate Minimum
max_gate_distance:
name: Detection Gate Maximum
# See "Number" section below for detail
gate_select:
name: Select Gate to Set
still_threshold:
name: Set Still Threshold Value
move_threshold:
name: Set Move Threshold Value
button:
- platform: ld2420
apply_config:
name: Apply Config
factory_reset:
name: Factory Reset
restart_module:
name: Restart Module
revert_config:
name: Undo Edits

View File

@@ -0,0 +1,11 @@
---
sensor:
- platform: aht10
i2c_id: bus_b
variant: AHT20
temperature:
name: "Temperature"
id: temp_local
humidity:
name: "Humidity"
update_interval: 60s

View File

@@ -0,0 +1,29 @@
---
sensor:
- platform: adc
pin: ${pin_vbatt}
name: "Battery voltage"
id: battery_voltage
unit_of_measurement: "V"
accuracy_decimals: 1
device_class: "voltage"
entity_category: "diagnostic"
disabled_by_default: true
update_interval: 30s
attenuation: auto
filters:
- multiply: 4.11
- platform: copy
id: battery_percent
source_id: battery_voltage
name: "Battery level"
unit_of_measurement: "%"
accuracy_decimals: 0
device_class: "battery"
entity_category: "diagnostic"
filters:
- lambda: return (x - 2.7) / (4.2 - 2.7) * 100;
- clamp:
min_value: 0
max_value: 100

View File

@@ -11,7 +11,7 @@ sensor:
accuracy_decimals: 1
temperature_offset: 1.5 °C
address: 0x61
update_interval: 1s
update_interval: 5s
button:
- platform: template

View File

@@ -0,0 +1,20 @@
---
esp32_ble_tracker:
id: ble_tracker
scan_parameters:
continuous: false
bluetooth_proxy:
active: true
esphome:
on_boot: #this is to avoid slow startup time because of BT and WiFi "interactions?" , check https://github.com/esphome/issues/issues/2941#issuecomment-1331851692
priority: 250
then:
- wait_until:
condition:
wifi.connected:
- lambda: >
id(ble_tracker).set_scan_continuous(true);
id(ble_tracker).start_scan();

View File

@@ -6,4 +6,6 @@ logger:
sensor: ERROR
cover: ERROR
switch: ERROR
wifi: ERROR
wifi: ERROR
pulse_counter: ERROR
remote_receiver: DEBUG

View File

@@ -1,3 +1,9 @@
# disable logging
logger:
baud_rate: 0
baud_rate: 0
logs:
display: ERROR
sensor: ERROR
cover: ERROR
switch: ERROR
wifi: ERROR

12
esphome/templates/nostatus.yaml Executable file
View File

@@ -0,0 +1,12 @@
output:
- platform: gpio
pin: ${pin_status}
id: status_led
light:
- platform: binary
name: "status_led"
output: status_led
restore_mode: Restore_and_off

View File

@@ -0,0 +1,62 @@
---
button:
- platform: template
name: SMSL Source
id: smsl_source
icon: mdi:audio-input-stereo-minijack
on_press:
- remote_transmitter.transmit_nec:
address: 0x3412
command: 0xF807
command_repeats: 1
# - remote_transmitter.transmit_pronto:
# data: "0000 006D 0022 0000 0159 00AE 0015 0016 0015 0043 0014 0016 0015 0016 0015 0043 0014 0016 0015 0016 0015 0017 0015 0016 0015 0016 0015 0043 0014 0016 0015 0043 0014 0043 0014 0017 0015 0017 0015 0043 0014 0043 0014 0043 0014 0016 0016 0015 0016 0015 0016 0015 0016 0016 0016 0015 0016 0015 0016 0015 0016 0042 0015 0041 0016 0041 0016 0042 0015 0042 0015 0181"
- platform: template
name: SMSL power
id: smsl_power
icon: mdi:power
on_press:
- remote_transmitter.transmit_nec:
address: 0x3412
command: 0xFE01
command_repeats: 1
- platform: template
name: SMSL up
id: smsl_up
icon: mdi:volume-plus
on_press:
- remote_transmitter.transmit_nec:
address: 0x3412
command: 0xFD02
command_repeats: 1
- platform: template
name: SMSL down
id: smsl_down
icon: mdi:volume-minus
on_press:
- remote_transmitter.transmit_nec:
address: 0x3412
command: 0xF906
command_repeats: 1
- platform: template
name: SMSL mute
id: smsl_mute
icon: mdi:volume-mute
on_press:
- remote_transmitter.transmit_nec:
address: 0x3412
command: 0xF609
command_repeats: 1
# smsl amp
# NEC: address=0x3412
# source 0xF807 - wierdness :/
# up 0xFD02
# down 0xF906
# power 0xFE01
# mute 0xF609
# function 0xF708
# ok 0xFB04
# left 0xFC03
# right 0xFA05

View File

@@ -28,7 +28,8 @@ packages:
# connection: !include common/wifi.yaml
device_base: !include common/common.yaml
ethernet: !include interfaces/eth_LAN8720A.yaml
# bt_proxy: !include templates/ble_proxy.yaml
bt_proxy: !include common/bluetooth.yaml
ota: !include common/ota.yaml
logger: !include templates/nologger.yaml
uptimesensor: !include sensors/uptime.yaml

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@@ -1,16 +1,44 @@
---
# influxdb:
# host: a0d7b954-influxdb
# port: 8086
# database: homeassistant
# username: homeassistant
# password: !secret influxdb
# max_retries: 3
# default_measurement: state
# include:
# domains:
# # - sensor
# # - binary_sensor
# # - sun
# entity_globs:
# - sensor.modbus_*
influxdb:
# host: a0d7b954-influxdb
# port: 8086
# database: homeassistant
# username: homeassistant
# password: !secret influxdb
# max_retries: 3
# default_measurement: state
# include:
# domains:
# # - sensor
# # - binary_sensor
# # - sun
# entity_globs:
# - sensor.modbus_*
api_version: 2 # Ensure the version matches your InfluxDB instance.
ssl: false # Can omit this if using https.
host: 192.168.2.195
port: 8086
token: 7lfykKI2wfK90MBdeuu9zFFMBPaF5fl_GbRT2DJuPcbU1cRbFwso_cDtG_fxLeyWF8IZeLr-2enl1_Z79a4L6Q==
organization: thuis # The InfluxDB organisation that the bucket will belong to.
bucket: hass # The name of the bucket where the data will be saved
include:
entities:
- weather.forecast_home
- sensor.modbus_aanvoer_apparaat
- sensor.modbus_aanvoer_wp
- sensor.modbus_buitentemperatuur
- sensor.modbus_compressor_starts
- sensor.modbus_retour_apparaat
- sensor.modbus_retour_wp
- sensor.modbus_seizoensmodus_actief
- sensor.modbus_teller_starts_backup1
- sensor.modbus_teller_branderstarts
- sensor.modbus_werkelijke_waterdruk
- sensor.warmtepomp_electric_consumption_kwh_2
- sensor.laadpaal_meter_energy
- sensor.wasmachine_opsomming_afgeleverd
- sensor.bodem_sensor_vochtigheid_aarde
- sensor.bodem_sensor_temperatuur
- sensor.zoutlamp_opsomming_afgeleverd
- sensor.server_electric_consumption_kwh

View File

@@ -1,10 +1,10 @@
---
plant:
plant_zolder_lepelplant:
sensors:
moisture: sensor.plant_sensor2_soil_moisture
#battery: sensor.my_sensor_battery
temperature: sensor.plant_sensor2_temperature_bme280
conductivity: sensor.plant_sensor2_soil_conductivity
brightness: sensor.plant_sensor2_bh1750_illuminance
min_moisture: 20
# plant:
# plant_zolder_lepelplant:
# sensors:
# moisture: sensor.plant_sensor2_soil_moisture
# #battery: sensor.my_sensor_battery
# temperature: sensor.plant_sensor2_temperature_bme280
# conductivity: sensor.plant_sensor2_soil_conductivity
# brightness: sensor.plant_sensor2_bh1750_illuminance
# min_moisture: 20

View File

@@ -0,0 +1,11 @@
---
telegram_bot:
- platform: polling
api_key: "7224749574:AAHBrPhHkibEU9KJsnQ0bAHO-cB_sXRun1I"
allowed_chat_ids:
- 17370240
notify:
- platform: telegram
name: "sarah"
chat_id: 17370240

4
integrations/zha.yaml Normal file
View File

@@ -0,0 +1,4 @@
---
zha:
enable_quirks: true
custom_quirks_path: /config/zha_quirks/

File diff suppressed because it is too large Load Diff

View File

@@ -24,21 +24,15 @@ tuin_water_op_timer:
device_id: e1fd7471fc9fcde9a19ec7175a486dd9
entity_id: b5d0e849686502315a2ae0904be553c9
domain: switch
- type: is_open
condition: device
device_id: dc10219c8d3c20e7e126548014043a5f
entity_id: 9db1315f061dba32ad7099d81e1872aa
domain: binary_sensor
sequence:
- service: notify.mobile_app_iphone_van_willem
data:
- data:
message: Water uit
- stop: ''
action: notify.mobile_app_iphone_van_willem
default:
- service: notify.mobile_app_iphone_van_willem
data:
- data:
message: Controleer beregening
title: Let op!
action: notify.mobile_app_iphone_van_willem
mode: single
icon: mdi:water-opacity
'1663069218288':
@@ -77,8 +71,8 @@ haloween:
- service: light.turn_off
target:
entity_id:
- light.rgb_lamp_tuin_rechts_voor_3_light_9
- light.rgb_lamp_tuin_rechts_voor_2_light_8
- light.rgb_lamp_tuin_rechts_voor_3
- light.rgb_lamp_tuin_rechts_voor_2
data: {}
- delay:
hours: 0
@@ -99,8 +93,8 @@ haloween:
brightness_pct: 100
target:
entity_id:
- light.rgb_lamp_tuin_rechts_voor_3_light_9
- light.rgb_lamp_tuin_rechts_voor_2_light_8
- light.rgb_lamp_tuin_rechts_voor_3
- light.rgb_lamp_tuin_rechts_voor_2
- service: light.turn_on
data:
rgb_color:
@@ -111,7 +105,7 @@ haloween:
brightness_pct: 100
target:
entity_id:
- light.rgb_lamp_tuin_rechts_light_7
- light.rgb_lamp_tuin_rechts
- delay:
hours: 0
minutes: 0
@@ -122,11 +116,11 @@ haloween:
led_tuin_fireworks:
alias: ' Tuin - ledstrip Fireworks'
sequence:
- service: select.select_option
- data:
option: Fireworks
action: select.select_option
target:
entity_id: select.ledstrip_huisje_preset
data:
option: Fireworks
mode: single
icon: mdi:firework
led_tuin_twinkle:
@@ -139,34 +133,6 @@ led_tuin_twinkle:
option: Twinkel
mode: single
icon: mdi:string-lights
kia_preheat:
alias: Kia - preheat
sequence:
- service: kia_uvo.start_climate
data:
device_id: b50e634242a175e32f229b1bc05f0b6b
temperature: 20
heating: '1'
mode: single
icon: mdi:heat-wave
kia_stop_preheat:
alias: Kia - stop preheat
sequence:
- service: kia_uvo.stop_climate
data:
device_id: b50e634242a175e32f229b1bc05f0b6b
mode: single
icon: mdi:close-octagon
kia_preheat_defrost:
alias: Kia - preheat + defrost
sequence:
- service: kia_uvo.start_climate
data:
device_id: b50e634242a175e32f229b1bc05f0b6b
temperature: 21
heating: '1'
mode: single
icon: mdi:heat-wave
keuken_delay_aanrecht_uit:
alias: Keuken - delay aanrecht uit
sequence:
@@ -392,7 +358,7 @@ radio_keuken_qmusic:
sequence:
- service: media_player.play_media
target:
entity_id: media_player.woonkamer
entity_id: media_player.bose_woonkamer
data:
media_content_id: media-source://radio_browser/003d3c6f-e183-11e9-a8ba-52543be04c81
media_content_type: audio/mpeg
@@ -446,7 +412,7 @@ radio_keuken_slamfm:
sequence:
- service: media_player.play_media
target:
entity_id: media_player.woonkamer
entity_id: media_player.bose_woonkamer
data:
media_content_id: media-source://radio_browser/962e7e22-0601-11e8-ae97-52543be04c81
media_content_type: audio/mpeg
@@ -475,18 +441,6 @@ sonos_keuken_mute:
entity_id: media_player.keuken
mode: single
icon: mdi:volume-mute
nieuw_script:
alias: House in den pauze
sequence:
- service: media_player.play_media
data_template:
entity_id: media_player.spotify_master_bedroom
media_content_id: spotify:user:spotify:playlist:IDECb4VFgyb
media_content_type: PLAYLIST
target:
device_id: 24d1977346e9fc44d02e017911d3e285
mode: single
icon: mdi:multimedia
reset_meter:
alias: reset_meter
sequence:
@@ -555,17 +509,6 @@ woonkamer_koelen_turbo:
entity_id: climate.airco_ir_woonkamer_airco
mode: single
icon: mdi:hvac
kia_koelen:
alias: Kia - koelen
sequence:
- service: kia_uvo.start_climate
data:
device_id: b50e634242a175e32f229b1bc05f0b6b
temperature: 22
heating: '0'
climate: true
mode: single
icon: mdi:car-seat-cooler
tuin_alles_aan:
alias: Tuin - alles aan
sequence:
@@ -576,8 +519,8 @@ tuin_alles_aan:
entity_id: switch.lamp_speelhuisje_2
- service: light.turn_on
data:
brightness_pct: 80
color_name: orange
kelvin: 2000
brightness_pct: 79
target:
entity_id: light.tuin_lamp_blokbomen
- service: light.turn_on
@@ -591,8 +534,8 @@ tuin_alles_aan:
milliseconds: 0
- service: light.turn_on
data:
brightness_pct: 80
color_name: orange
kelvin: 2000
brightness_pct: 79
target:
entity_id: light.tuin_lamp_voortuin_struiken
- delay:
@@ -602,8 +545,8 @@ tuin_alles_aan:
milliseconds: 0
- service: light.turn_on
data:
brightness_pct: 80
color_name: orange
kelvin: 2000
brightness_pct: 79
target:
entity_id: light.tuin_lamp_voortuin_pad_rechts
- delay:
@@ -613,8 +556,8 @@ tuin_alles_aan:
milliseconds: 0
- service: light.turn_on
data:
brightness_pct: 80
color_name: orange
kelvin: 2000
brightness_pct: 79
target:
entity_id: light.tuin_lamp_achtertuin_rest
- device_id: 15d642c4506394e005141bc068830751
@@ -636,12 +579,6 @@ tuin_alles_aan:
data: {}
target:
entity_id: light.lamp_speelhuisje
- service: light.turn_on
data:
brightness_pct: 80
color_name: orange
target:
entity_id: light.lamp_spot_afdak
- service: light.turn_on
data:
brightness_pct: 80
@@ -700,10 +637,6 @@ tuin_alles_uit:
target:
entity_id: light.lamp_speelhuisje
data: {}
- service: light.turn_off
target:
entity_id: light.lamp_spot_afdak
data: {}
- service: light.turn_off
data: {}
target:
@@ -859,14 +792,14 @@ tuin_nacht:
sequence:
- service: light.turn_on
data:
color_temp: 500
brightness_pct: 3
kelvin: 2000
brightness_pct: 15
target:
entity_id: light.tuin_lamp_blokbomen
- service: light.turn_on
data: {}
target:
entity_id: light.lamp_tuin_en_garage_l1
entity_id: light.lamp_tuin_garage
- delay:
hours: 0
minutes: 0
@@ -874,7 +807,7 @@ tuin_nacht:
milliseconds: 0
- service: light.turn_on
data:
color_temp: 500
kelvin: 2000
brightness_pct: 15
target:
entity_id: light.tuin_lamp_voortuin_struiken
@@ -885,7 +818,7 @@ tuin_nacht:
milliseconds: 0
- service: light.turn_on
data:
color_temp: 500
kelvin: 2000
brightness_pct: 15
target:
entity_id: light.tuin_lamp_voortuin_pad_rechts
@@ -941,3 +874,258 @@ bed_time_clean:
data: {}
description: ''
icon: mdi:vacuum-outline
zolder_koelen:
alias: Zolder - koelen
sequence:
- data:
hvac_mode: cool
temperature: 23
target:
entity_id: climate.airco_4
action: climate.set_temperature
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- data:
fan_mode: auto
target:
entity_id: climate.airco_4
action: climate.set_fan_mode
mode: single
icon: mdi:hvac
description: ''
zolder_verwarmen:
alias: zolder - verwarmen
sequence:
- action: climate.set_temperature
data:
hvac_mode: heat
temperature: 20
target:
entity_id: climate.airco_4
- delay:
hours: 0
minutes: 0
seconds: 5
milliseconds: 0
- action: climate.set_fan_mode
data:
fan_mode: auto
target:
entity_id: climate.airco_4
mode: single
icon: mdi:heat-wave
description: ''
stofzuiger_start_all:
alias: stofzuiger - start (all)
sequence:
- action: vacuum.start
metadata: {}
data: {}
target:
device_id: b99930765798a4796ca3ebb87e84299e
description: ''
icon: mdi:robot-vacuum
grover_clean_eetkamer_woonkamer:
mode: queued
alias: Roborock Room Cleaning
max: 30
sequence:
- choose:
- conditions:
- condition: or
conditions:
- condition: state
entity_id: vacuum.grover
state: cleaning
- condition: state
entity_id: vacuum.grover
state: error
sequence:
- wait_for_trigger:
- platform: state
entity_id: vacuum.grover
to: returning
- platform: state
entity_id: vacuum.grover
to: Docked
continue_on_timeout: false
timeout: 01:30:00
- target:
device_id: vacuum.grover
data_template:
command: app_segment_clean
params: '{% set room_id = states("input_number.roborock_room_enum_eetkamer")
| int %} {{ room_id }}
'
action: vacuum.send_command
- wait_for_trigger:
- platform: state
entity_id: vacuum.grover
to: returning
- platform: state
entity_id: vacuum.grover
to: docked
continue_on_timeout: false
timeout: 01:30:00
- conditions:
- condition: or
conditions:
- condition: state
entity_id: vacuum.grover
state: returning
- condition: state
entity_id: vacuum.grover
state: docked
- condition: state
entity_id: vacuum.grover
state: idle
sequence:
- target:
device_id: vacuum.grover
data_template:
command: app_segment_clean
params: '{% set room_id = states("input_number.roborock_room_enum_woonkamer")
| int %} {{ room_id }}
'
action: vacuum.send_command
- wait_for_trigger:
- platform: state
entity_id: vacuum.grover
to: returning
- platform: state
entity_id: vacuum.grover
to: docked
continue_on_timeout: false
timeout: 01:30:00
default: []
grover_clean_keuken:
alias: Grover - clean Keuken
sequence:
- if:
- condition: state
entity_id: input_select.stofzuiger_verdiepingen
state: Boven
then:
- action: script.woonkamer_roborock_selecteer_beneden
metadata: {}
data: {}
- delay:
hours: 0
minutes: 0
seconds: 15
milliseconds: 0
- action: vacuum.send_command
metadata: {}
data:
command: app_segment_clean
params: '{% set room_id = states("input_number.roborock_room_enum_keuken") |
int %} {{ room_id }}
'
target:
device_id: b99930765798a4796ca3ebb87e84299e
description: ''
icon: mdi:robot-vacuum
fields: {}
oven_preheat:
alias: Oven preheat
sequence:
- action: home_connect_alt.start_program
data:
options:
- key: Cooking.Oven.Option.FastPreHeat
value: true
- key: Cooking.Oven.Option.SetpointTemperature
value: 180
- key: BSH.Common.Option.Duration
value: 1200
program_key: Cooking.Oven.Program.HeatingMode.HotAir
device_id: 7f3553c6228085ca77f09c2cb79114bc
description: ''
icon: mdi:stove
keuken_vaatwasser_start:
alias: Keuken - vaatwasser start
sequence:
- action: home_connect_alt.start_program
data:
validate: true
device_id: 36c964af9128f66e4d805461232853d2
program_key: Dishcare.Dishwasher.Program.Auto2
options:
- key: Dishcare.Dishwasher.Option.VarioSpeedPlus
value: true
description: ''
icon: mdi:dishwasher
grover_clean_woonkamer:
alias: Grover - clean Woonkamer
sequence:
- if:
- condition: state
entity_id: input_select.stofzuiger_verdiepingen
state: Boven
then:
- action: script.woonkamer_roborock_selecteer_beneden
metadata: {}
data: {}
- delay:
hours: 0
minutes: 0
seconds: 15
milliseconds: 0
- action: vacuum.send_command
metadata: {}
data:
command: app_segment_clean
params: '{% set room_id = states("input_number.roborock_room_enum_woonkamer")
| int %} {{ room_id }}
'
target:
device_id: b99930765798a4796ca3ebb87e84299e
description: ''
icon: mdi:robot-vacuum
fields: {}
grover_clean_eetkamer:
alias: Grover - clean Eetkamer
sequence:
- if:
- condition: state
entity_id: input_select.stofzuiger_verdiepingen
state: Boven
then:
- action: script.woonkamer_roborock_selecteer_beneden
metadata: {}
data: {}
- delay:
hours: 0
minutes: 0
seconds: 15
milliseconds: 0
- action: vacuum.send_command
metadata: {}
data:
command: app_segment_clean
params: '{% set room_id = states("input_number.roborock_room_enum_eetkamer")
| int %} {{ room_id }}
'
target:
device_id: b99930765798a4796ca3ebb87e84299e
description: ''
icon: mdi:robot-vacuum
fields: {}
generate_watchman_report:
alias: generate_watchman_report
sequence:
- action: watchman.report
data:
create_file: false
send_notification: true
parse_config: true
description: ''
icon: mdi:alert

View File

@@ -5,7 +5,7 @@
#
ios-light-mode-blue-red-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-blue-red.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-blue-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -94,7 +94,7 @@ ios-light-mode-blue-red-alternative:
#
ios-light-mode-blue-red:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-blue-red.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-blue-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -183,7 +183,7 @@ ios-light-mode-blue-red:
#
ios-dark-mode-blue-red-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-blue-red.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-blue-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -272,7 +272,7 @@ ios-dark-mode-blue-red-alternative:
#
ios-dark-mode-blue-red:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-blue-red.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-blue-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -361,7 +361,7 @@ ios-dark-mode-blue-red:
#
ios-light-mode-dark-blue-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-blue.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-dark-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -450,7 +450,7 @@ ios-light-mode-dark-blue-alternative:
#
ios-light-mode-dark-blue:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-blue.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-dark-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -539,7 +539,7 @@ ios-light-mode-dark-blue:
#
ios-dark-mode-dark-blue-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-blue.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-dark-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -628,7 +628,7 @@ ios-dark-mode-dark-blue-alternative:
#
ios-dark-mode-dark-blue:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-blue.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-dark-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -717,7 +717,7 @@ ios-dark-mode-dark-blue:
#
ios-light-mode-dark-green-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-green.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-dark-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -806,7 +806,7 @@ ios-light-mode-dark-green-alternative:
#
ios-light-mode-dark-green:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-green.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-dark-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -895,7 +895,7 @@ ios-light-mode-dark-green:
#
ios-dark-mode-dark-green-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-green.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-dark-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -984,7 +984,7 @@ ios-dark-mode-dark-green-alternative:
#
ios-dark-mode-dark-green:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-dark-green.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-dark-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1073,7 +1073,7 @@ ios-dark-mode-dark-green:
#
ios-light-mode-light-blue-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-blue.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-light-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1162,7 +1162,7 @@ ios-light-mode-light-blue-alternative:
#
ios-light-mode-light-blue:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-blue.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-light-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1251,7 +1251,7 @@ ios-light-mode-light-blue:
#
ios-dark-mode-light-blue-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-blue.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-light-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1340,7 +1340,7 @@ ios-dark-mode-light-blue-alternative:
#
ios-dark-mode-light-blue:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-blue.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-light-blue.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1429,7 +1429,7 @@ ios-dark-mode-light-blue:
#
ios-light-mode-light-green-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-green.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-light-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1518,7 +1518,7 @@ ios-light-mode-light-green-alternative:
#
ios-light-mode-light-green:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-green.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-light-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1607,7 +1607,7 @@ ios-light-mode-light-green:
#
ios-dark-mode-light-green-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-green.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-light-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1696,7 +1696,7 @@ ios-dark-mode-light-green-alternative:
#
ios-dark-mode-light-green:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-light-green.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-light-green.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1785,7 +1785,7 @@ ios-dark-mode-light-green:
#
ios-light-mode-orange-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-orange.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-orange.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1874,7 +1874,7 @@ ios-light-mode-orange-alternative:
#
ios-light-mode-orange:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-orange.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-orange.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -1963,7 +1963,7 @@ ios-light-mode-orange:
#
ios-dark-mode-orange-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-orange.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-orange.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -2052,7 +2052,7 @@ ios-dark-mode-orange-alternative:
#
ios-dark-mode-orange:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-orange.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-orange.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -2141,7 +2141,7 @@ ios-dark-mode-orange:
#
ios-light-mode-red-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-red.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -2230,7 +2230,7 @@ ios-light-mode-red-alternative:
#
ios-light-mode-red:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-red.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9409" # from Apple systemOrange light mode
light-primary-color: "#2c2c2e" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -2319,7 +2319,7 @@ ios-light-mode-red:
#
ios-dark-mode-red-alternative:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-red.jpg')"
background-image: "center / cover no-repeat fixed url('/local/ios-themes/homekit-bg-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
@@ -2408,7 +2408,7 @@ ios-dark-mode-red-alternative:
#
ios-dark-mode-red:
# Global
background-image: "center / cover no-repeat fixed url('/hacsfiles/themes/ios-themes/homekit-bg-red.jpg')"
background-image: "center / cover no-repeat fixed url('https://cdn.jsdelivr.net/gh/basnijholt/lovelace-ios-themes@a37376d918fcfe4785be99910dc9a7200ac37da9/themes/homekit-bg-red.jpg')"
lovelace-background: var(--background-image)
primary-color: "#ff9f09" # from Apple systemOrange dark mode
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)

View File

@@ -0,0 +1,62 @@
import { dedupingMixin } from "https://unpkg.com/@polymer/polymer@3.4.1/lib/utils/mixin.js?module";
const LocalizeMixin = dedupingMixin(
(superClass) =>
class extends superClass {
static get properties() {
return {
hass: Object,
localize: Function,
};
}
connectedCallback() {
super.connectedCallback();
this.loadResources(this.hass.language);
}
async loadResources(language) {
let resources;
const languagesToTry = [language, language.split('-')[0], 'en'];
for (const lang of languagesToTry) {
try {
resources = await this.loadTranslationFile(lang);
if (resources) {
break;
}
} catch (e) {
console.error(`Failed to load translations for ${lang}:`, e);
}
}
if (!resources) {
console.warn('No translations could be loaded. Using default strings.');
resources = {};
}
this.localize = (key, ...args) => {
const translatedValue = key.split('.').reduce((o, i) => o && o[i], resources);
if (translatedValue === undefined) return key;
return translatedValue;
};
}
loadTranslationFile(lang) {
const url = `./translations/${lang}.js`;
return import(url)
.then(module => {
if (typeof module.default !== 'object') {
throw new Error('Translation file does not export a default object');
}
return module.default;
})
.catch(error => {
console.error(`Failed to load translations for ${lang}:`, error);
return null;
});
}
}
);
export const localize = LocalizeMixin;

View File

@@ -0,0 +1,167 @@
export function formatEntityValue(entity, useFormattedEntities, hass, localize) {
if (!entity || !hass) return null;
// If formatting is not enabled, return the state as-is
if (!useFormattedEntities) {
return entity.state;
}
// Use Home Assistant's built-in formatting functions
if (typeof hass.formatEntityState === 'function') {
return hass.formatEntityState(entity);
}
// Fallback to basic formatting if Home Assistant functions are not available
return entity.state;
}
function formatBinaryState(state, attributes, hass, localize) {
const isOn = state.toLowerCase() === 'on';
if (attributes.device_class) {
const key = `state.${attributes.device_class}.${isOn ? 'on' : 'off'}`;
return hass.localize(`component.binary_sensor.${key}`) || localize(key) || (isOn ? 'On' : 'Off');
}
return isOn ? 'On' : 'Off';
}
function formatDeviceTrackerState(state, attributes) {
const locationName = attributes.location_name || state;
if (locationName.toLowerCase() === 'home') {
return 'Home';
} else if (locationName.toLowerCase() === 'not_home') {
return 'Away';
} else {
return locationName.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
}
}
function formatSensorState(state, attributes) {
if (isISODateString(state)) {
return formatChargingEndTime(state);
}
if (!isNaN(parseFloat(state))) {
// Remove trailing zeros and decimal point if necessary
return formatNumberWithCommas(parseFloat(state).toFixed(0));
}
return formatGenericState(state);
}
function formatGenericState(state) {
// Convert snake_case to Title Case
return state.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
}
export async function getIconActiveState(entityId, hass, config) {
const state = hass.states[entityId];
if (!state) return false;
const stateStr = state.state.toLowerCase();
// Check custom active and inactive states from config
const activeState = config.activeState;
const inactiveState = config.inactiveState;
if (activeState) {
if (activeState === 'default') {
return isActiveState(stateStr);
} else if (activeState.startsWith('template:')) {
const templateResp = await (new Promise((resolve, reject) => {
hass.connection.subscribeMessage(
(msg) => resolve(msg),
{
type: "render_template",
template: activeState.slice(9),
}
)
}));
return templateResp.result === true ? true : false;
} else if (activeState.startsWith('attribute:')) {
const [, attributeName, attributeValue] = activeState.split(':');
return state.attributes[attributeName] === attributeValue;
} else if (activeState.startsWith('option:')) {
return stateStr === activeState.split(':')[1].toLowerCase();
} else {
return stateStr === activeState.toLowerCase();
}
}
if (inactiveState) {
if (inactiveState === 'default') {
return !isActiveState(stateStr);
} else if (inactiveState.startsWith('template:')) {
const renderResult = await hass.callApi("post", "template", {template: inactiveState.slice(9)});
return renderResult === "True" ? true : false;
} else if (inactiveState.startsWith('attribute:')) {
const [, attributeName, attributeValue] = inactiveState.split(':');
return state.attributes[attributeName] !== attributeValue;
} else if (inactiveState.startsWith('option:')) {
return stateStr !== inactiveState.split(':')[1].toLowerCase();
} else {
return stateStr !== inactiveState.toLowerCase();
}
}
// If no custom states are set, use the default behavior
return isActiveState(stateStr);
}
function isActiveState(state) {
const activeStates = [
"on", "active", "open", "connected", "running", "true", "1", "home", "above_horizon",
"charging", "full", "yes", "online", "present",
"armed", "occupied", "unlocked", "playing", "motion", "engaged", "awake", "detected"
];
return activeStates.includes(state);
}
export function formatBinarySensorState(state, attributes) {
return state;
}
export function isEngineOn(engineOnEntity) {
if (!engineOnEntity) return false;
const state = engineOnEntity.state.toLowerCase();
const attributes = engineOnEntity.attributes;
// Check attributes for 'engine_on' status
if (attributes) {
for (const [key, value] of Object.entries(attributes)) {
if (typeof value === 'string' && value.toLowerCase() === 'on') {
return true;
}
}
}
// Handle boolean entities
if (['on', 'off', 'true', 'false'].includes(state)) {
return state === 'on' || state === 'true';
}
// Handle numeric entities
if (!isNaN(state)) {
return parseFloat(state) > 0;
}
// Handle string-based entities
const engineOnStates = ['on', 'running', 'active', 'true'];
return engineOnStates.includes(state);
}
function formatNumberWithCommas(number) {
return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function isISODateString(value) {
return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/.test(value);
}
function formatChargingEndTime(isoDateString) {
const date = new Date(isoDateString);
const hours = date.getHours();
const minutes = date.getMinutes();
const ampm = hours >= 12 ? "PM" : "AM";
const formattedHours = hours % 12 || 12;
const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes;
return `${formattedHours}:${formattedMinutes} ${ampm}`;
}

View File

@@ -0,0 +1,213 @@
import { html, LitElement } from "https://unpkg.com/lit-element@2.4.0/lit-element.js?module";
class StateDropdown extends LitElement {
static get properties() {
return {
hass: { type: Object },
config: { type: Object },
entityId: { type: String },
stateType: { type: String }, // 'inactive' or 'active'
value: { type: String },
templateValue: { type: String },
attributeValue: { type: String },
disableDropdown: { type: Boolean },
localize: { type: Function },
};
}
constructor() {
super();
this.value = 'default';
this.templateValue = '';
this.attributeValue = '';
this.disableDropdown = false;
this.localize = (key) => key; // Default to returning the key if no localize function is provided
}
updated(changedProperties) {
super.updated(changedProperties);
if (changedProperties.has('config') || changedProperties.has('stateType')) {
this._updateValueFromConfig();
}
}
_updateValueFromConfig() {
const configValue = this.config[`${this.stateType}State`];
if (configValue) {
if (configValue.startsWith('template:')) {
this.value = 'template';
this.templateValue = configValue.slice(9);
} else if (configValue.startsWith('attribute:')) {
const [, attributeName, attributeValue] = configValue.split(':');
this.value = `attribute:${attributeName}`;
this.attributeValue = attributeValue || '';
} else {
this.value = configValue;
}
}
}
render() {
const options = this._getOptions();
const isTemplateSelected = this.value === 'template';
return html`
<style>
:host {
display: block;
}
ha-select {
width: 100%;
}
.template-input, .attribute-input {
margin-top: 8px;
}
.beta-warning {
color: #ff9800;
font-weight: bold;
margin-top: 4px;
margin-bottom: 4px;
}
ha-select[disabled] {
opacity: 0.5;
pointer-events: none;
}
</style>
<div @click="${this._handleContainerClick}" class="${isTemplateSelected ? 'template-selected' : ''}" data-state-type="${this.stateType}">
<ha-select
.value=${this.value}
@selected=${this._valueChanged}
@closed=${this._handleClick}
?disabled=${this.disableDropdown}
>
${options.map(option => html`
<mwc-list-item .value=${option.value}>${option.label}</mwc-list-item>
`)}
</ha-select>
${this.value === 'template' ? html`
<div class="template-info">
<h4>${this.localize("editor.template_mode")}</h4>
<p>${this.localize("editor.template_mode_description")}</p>
</div>
<div class="template-input">
${this._renderTemplateInput()}
</div>
` : ''}
${this.value.startsWith('attribute:') ? html`
<div class="attribute-input">
<ha-textfield
.value=${this.attributeValue}
@input=${this._attributeValueChanged}
placeholder="Enter attribute value"
style="width: 100%;"
></ha-textfield>
</div>
` : ''}
</div>
`;
}
_handleContainerClick(e) {
e.stopPropagation();
}
_getOptions() {
const options = [
{ value: 'default', label: 'Default' },
{ value: 'template', label: 'Template' },
];
if (this.entityId && this.hass.states[this.entityId]) {
const entity = this.hass.states[this.entityId];
if (entity.attributes.options) {
entity.attributes.options.forEach(option => {
options.push({ value: `option:${option}`, label: `Option: ${option}` });
});
}
Object.keys(entity.attributes).forEach(attr => {
if (attr !== 'options' && attr !== 'friendly_name' && attr !== 'icon') {
options.push({ value: `attribute:${attr}`, label: `Attribute: ${attr}` });
}
});
}
return options;
}
_renderTemplateInput() {
return html`
<ha-code-editor
mode="jinja2"
.value=${this.templateValue}
@value-changed=${this._templateChanged}
dir="ltr"
autocomplete-entities
autocomplete-icons
.hass=${this.hass}
style="width: 100%; overflow: hidden; resize: vertical;"
></ha-code-editor>
`;
}
_valueChanged(e) {
e.stopPropagation();
const newValue = e.target.value;
this.value = newValue;
if (newValue === 'template') {
this._updateConfig(`template:${this.templateValue}`);
} else if (newValue.startsWith('attribute:')) {
this._updateConfig(`${newValue}:${this.attributeValue}`);
} else {
this._updateConfig(newValue);
}
this.requestUpdate();
// Dispatch an event to notify the parent component about the template selection
const event = new CustomEvent('template-selected', {
detail: { selected: newValue === 'template', stateType: this.stateType },
bubbles: true,
composed: true
});
this.dispatchEvent(event);
}
_handleClick(e) {
e.stopPropagation();
}
_updateConfig(newValue) {
const newConfig = {
...this.config,
[`${this.stateType}State`]: newValue,
};
const event = new CustomEvent('state-dropdown-changed', {
detail: {
config: newConfig,
entityId: this.entityId,
stateType: this.stateType,
attributeValue: this.attributeValue
},
bubbles: true,
composed: true
});
this.dispatchEvent(event);
}
_templateChanged(e) {
e.stopPropagation();
this.templateValue = e.detail.value;
this._updateConfig(`template:${this.templateValue}`);
}
_attributeValueChanged(e) {
this.attributeValue = e.target.value;
this._updateConfig(`${this.value}:${this.attributeValue}`);
}
}
customElements.define('state-dropdown', StateDropdown);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,287 @@
export default {
common: {
battery: "Batteri",
fuel: "Brændstof",
range: "Rækkevidde",
charging: "Oplader",
mileage: "Kilometerstand",
location: "Placering",
car_state: "Bilstatus",
charge_limit: "Opladningsgrænse",
engine_on: "Motor Tændt",
away: "Ikke Hjemme",
charging_end_time: "Opladningen slutter",
charging_ending_soon: "Opladning er snart færdig",
charging_ending_in: "Opladning slutter om",
charging_until: "Oplader indtil",
minutes: "minutter",
minute: "minut",
hours: "timer",
hour: "time",
state: {
default: {
on: "Tændt",
off: "Slukket"
}
}
},
vehicle_types: {
ev: "Elbil",
fuel: "Benzin-/Dieselbil",
hybrid: "Hybridbil"
},
editor: {
title: "Ultra Vehicle Card",
layout_type: "Layout Type",
single_column: "Enkelt Kolonne",
double_column: "Dobbelt Kolonne",
card_title: "Korttitel",
vehicle_type: "Køretøjstype",
unit_type: "Enhedstype",
engine_on_image: "Motor Tændt Billede",
engine_on_image_height: "Motor Tændt Billedhøjde",
engine_off_image: "Motor Slukket Billede",
engine_off_image_height: "Motor Slukket Billedhøjde",
engine_on_image_section: "Motor Tændt Billedindstillinger",
show_battery: "Vis Batteri",
show_battery_range: "Vis Batterirækkevidde",
show_fuel: "Vis Brændstof",
show_fuel_range: "Vis Brændstofrækkevidde",
show_location: "Vis Placering",
show_mileage: "Vis Kilometerstand",
show_car_state: "Vis Bilstatus",
show_charge_limit: "Vis Opladningsgrænse",
hybrid_display_order: "Hybridvisningsrækkefølge",
fuel_first: "Brændstof Først",
battery_first: "Batteri Først",
images: "Billeder",
main_image: "Hovedbillede",
charging_image: "Opladningsbillede",
enter_image_url: "Indtast Billedets URL",
upload_image: "Upload Billede",
entity_settings: "Entitetsindstillinger",
battery_level: "Batteriniveau",
battery_range: "Batterirækkevidde",
fuel_level: "Brændstofniveau",
fuel_range: "Brændstofrækkevidde",
charging_status: "Opladningsstatus",
location: "Placering",
mileage: "Kilometerstand",
car_state: "Bilstatus",
charge_limit: "Opladningsgrænse",
engine_on: "Motor Tændt",
add_entity: "Tilføj Entitet",
add_row_separator: "Tilføj Rækkeseparator",
custom_icons: "Brugerdefinerede Ikoner",
inactive_icon: "Inaktivt Ikon",
active_icon: "Aktivt Ikon",
no_icon: "INTET IKON",
inactive_icon_color: "Inaktiv Ikonfarve",
active_icon_color: "Aktiv Ikonfarve",
icon_style: "Ikonstil",
icon_size: "Ikonstørrelse",
icon_size_description: "Størrelsen på ikonet.",
icon_label_position: "Placering af ikonetiket",
left: "Venstre",
top: "Top",
right: "Højre",
bottom: "Bund",
interaction: "Interaktion",
colors: "Farver",
cardBackgroundColor: "Kort Baggrundsfarve",
barBackgroundColor: "Bar Baggrundsfarve",
barBorderColor: "Bar Kantfarve",
barFillColor: "Bar Fyldfarve",
limitIndicatorColor: "Grænseindikatorfarve",
infoTextColor: "Info Tekstfarve",
carStateTextColor: "Bilstatus Tekstfarve",
rangeTextColor: "Rækkevidde Tekstfarve",
percentageTextColor: "Procent Tekstfarve",
none: "Ingen",
local_url: "local/url",
entity: "Entitet",
search_entities: "Søg Entiteter",
battery_level_description: "Vælg den entitet, der repræsenterer batteriniveauet i dit køretøj.",
battery_range_description: "Vælg den entitet, der repræsenterer den resterende rækkevidde af din elbil.",
charging_status_description: "Vælg den entitet, der angiver, om dit køretøj oplader.",
charge_limit_description: "Vælg den entitet, der repræsenterer opladningsgrænsen for dit køretøj.",
location_description: "Vælg den entitet, der angiver køretøjets nuværende placering.",
mileage_description: "Vælg den entitet, der repræsenterer den samlede kilometerstand eller kilometertæller for dit køretøj.",
car_state_description: "Vælg den entitet, der repræsenterer køretøjets aktuelle tilstand (f.eks. parkeret, kører, oplader).",
icon_grid_description: "Tilføj entiteter til ikongitteret. Søg og vælg entiteter for at tilføje dem. Brug trækgrebet for at ændre rækkefølgen på entiteterne. Klik på ikonet for at ændre det, og brug (×) for at fjerne en entitet fra gitteret.",
custom_colors_description: "Tilpas farverne på forskellige elementer for at matche din foretrukne stil eller tema.",
row_separator: "Rækkeseparator",
add_row_separator: "Tilføj Rækkeseparator",
separator_color: "Separator Farve",
separator_color_description: "Vælg farven til rækkeseparatoren.",
transparent: "Transparent",
set_color: "Indstil Farve",
separator_height: "Separator Højde",
separator_height_description: "Indstil højden på rækkeseparatoren i pixels.",
icon_gap_size: "Ikonafstand",
icon_gap_description: "Indstil afstanden mellem ikoner i pixels.",
horizontal_alignment: "Horisontal Justering",
vertical_alignment: "Vertikal Justering",
inactive_icon: "Inaktivt Ikon",
active_icon: "Aktivt Ikon",
no_icon: "INTET IKON",
inactive_icon_color: "Inaktiv Ikonfarve",
active_icon_color: "Aktiv Ikonfarve",
icon_style: "Ikonstil",
icon_size: "Ikonstørrelse",
icon_size_description: "Størrelsen på ikonet.",
icon_label_position: "Placering af ikonetiket",
interaction: "Interaktion",
more_info: "Mere Info",
bottom: "Bund",
select_entity: "Vælg en Entitet",
entity_provides_image: "Denne entitet leverer billedet til visningen.",
separator_color: "Separator Farve",
separator_color_description: "Vælg farven til rækkeseparatoren.",
inactive_icon_color: "Inaktiv Ikonfarve",
active_icon_color: "Aktiv Ikonfarve",
custom_colors_description: "Tilpas farverne på forskellige elementer for at matche din foretrukne stil eller tema.",
toggle: "Skift",
navigate: "Naviger",
url: "Åbn URL",
trigger: "Trigger",
none: "Ingen",
formatted_entities: "Formaterede Entiteter",
formatted_entities_description: "Ryd op i entitetsværdier ved at afrunde tal, erstatte understregninger med mellemrum, kapitalisere ord og tilføje kommaer til store tal.",
fuel_level_description: "Vælg den entitet, der repræsenterer brændstofniveauet i dit køretøj.",
fuel_range_description: "Vælg den entitet, der repræsenterer den resterende brændstofrækkevidde i dit køretøj.",
engine_on_description: "Vælg den entitet, der angiver, om køretøjets motor er tændt.",
main_image_height: "Hovedbilledhøjde",
charging_image_height: "Opladningsbilledhøjde",
main_image_section: "Hovedbilledindstillinger",
charging_image_section: "Opladningsbilledindstillinger",
use_bar_gradient: "Brug Bar Gradient",
bar_gradient_description: "Aktiver en farvegradient for statusbjælken. Dette giver dig mulighed for at indstille flere farvestop for en mere dynamisk visuel repræsentation af køretøjets status.",
percentage: "Procent",
color: "Farve",
cardTitleColor: "Kort Titelfarve",
add_gradient_stop: "Tilføj Gradient Stop",
reset_all_colors: "Nulstil Alle Farver",
reset_all_icon_colors: "Nulstil Alle Ikonfarver",
settings: "Indstillinger",
icon_grid: "Ikongitter",
customize: "Tilpas",
inactive_custom_label: "Inaktiv brugerdefineret etiket",
active_custom_label: "Aktiv brugerdefineret etiket",
custom_label_placeholder: "Indtast brugerdefineret etiket"
},
device_class: {
battery: {
on: "Lav",
off: "Normal"
},
battery_charging: {
on: "Oplader",
off: "Oplader Ikke"
},
carbon_monoxide: {
on: "Registreret",
off: "Intet Registreret"
},
cold: {
on: "Koldt",
off: "Normal"
},
connectivity: {
on: "Forbundet",
off: "Ikke Forbundet"
},
door: {
on: "Åben",
off: "Lukket"
},
garage_door: {
on: "Åben",
off: "Lukket"
},
gas: {
on: "Registreret",
off: "Ikke Registreret"
},
heat: {
on: "Varmt",
off: "Normal"
},
light: {
on: "Registreret",
off: "Ikke Registreret"
},
lock: {
on: "Ulåst",
off: "Låst"
},
moisture: {
on: "Vådt",
off: "Tørt"
},
motion: {
on: "Registreret",
off: "Ikke Registreret"
},
moving: {
on: "I Bevægelse",
off: "Standset"
},
occupancy: {
on: "Optaget",
off: "Ledig"
},
opening: {
on: "Åben",
off: "Lukket"
},
plug: {
on: "Tilsluttet",
off: "Frakoblet"
},
power: {
on: "Registreret",
off: "Ingen Strøm"
},
presence: {
on: "Hjemme",
off: "Ikke Hjemme"
},
problem: {
on: "Problem",
off: "OK"
},
running: {
on: "Kører",
off: "Standset"
},
safety: {
on: "Usikkert",
off: "Sikkert"
},
smoke: {
on: "Registreret",
off: "Ikke Registreret"
},
sound: {
on: "Registreret",
off: "Ikke Registreret"
},
tamper: {
on: "Registreret",
off: "Ikke Registreret"
},
update: {
on: "Tilgængelig",
off: "Opdateret"
},
vibration: {
on: "Registreret",
off: "Ikke Registreret"
},
window: {
on: "Åben",
off: "Lukket"
}
}
}

View File

@@ -0,0 +1,265 @@
export default {
common: {
battery: "Batterie",
fuel: "Kraftstoff",
range: "Reichweite",
charging: "Laden",
mileage: "Kilometerstand",
location: "Standort",
car_state: "Fahrzeugzustand",
charge_limit: "Ladelimit",
engine_on: "Motor an",
away: "Abwesend",
charging_end_time: "Ladeende",
charging_ending_soon: "Ladevorgang endet bald",
charging_ending_in: "Ladevorgang endet in",
charging_until: "Laden bis",
minutes: "Minuten",
minute: "Minute",
hours: "Stunden",
hour: "Stunde",
state: {
default: {
on: "An",
off: "Aus"
}
}
},
vehicle_types: {
ev: "Elektrofahrzeug",
fuel: "Kraftstofffahrzeug",
hybrid: "Hybridfahrzeug"
},
editor: {
title: "Ultra Fahrzeugkarte",
card_title: "Kartentitel",
vehicle_type: "Fahrzeugtyp",
unit_type: "Einheitentyp",
show_battery: "Batterie anzeigen",
show_battery_range: "Batteriereichweite anzeigen",
show_fuel: "Kraftstoff anzeigen",
show_fuel_range: "Kraftstoffreichweite anzeigen",
show_location: "Standort anzeigen",
show_mileage: "Kilometerstand anzeigen",
show_car_state: "Fahrzeugzustand anzeigen",
show_charge_limit: "Ladelimit anzeigen",
hybrid_display_order: "Hybridanzeige-Reihenfolge",
fuel_first: "Kraftstoff zuerst",
battery_first: "Batterie zuerst",
images: "Bilder",
main_image: "Hauptbild",
charging_image: "Ladebild",
enter_image_url: "Bild-URL eingeben",
upload_image: "Bild hochladen",
entity_settings: "Entitätseinstellungen",
battery_level: "Batteriestand",
battery_range: "Batteriereichweite",
fuel_level: "Kraftstoffstand",
fuel_range: "Kraftstoffreichweite",
charging_status: "Ladestatus",
location: "Standort",
mileage: "Kilometerstand",
car_state: "Fahrzeugzustand",
charge_limit: "Ladelimit",
engine_on: "Motor an",
icon_grid: "Symbol-Raster",
add_entity: "Entität hinzufügen",
add_row_separator: "Zeilentrennzeichen hinzufügen",
custom_icons: "Benutzerdefinierte Symbole",
inactive_icon: "Inaktives Symbol",
active_icon: "Aktives Symbol",
no_icon: "KEIN SYMBOL",
inactive_icon_color: "Inaktive Symbolfarbe",
active_icon_color: "Aktive Symbolfarbe",
icon_style: "Symbolstil",
icon_size: "Symbolgröße",
icon_size_description: "Größe des Symbols.",
icon_label_position: "Position der Symbolbeschriftung",
left: "Links",
top: "Oben",
right: "Rechts",
bottom: "Unten",
interaction: "Interaktion",
colors: "Farben",
cardBackgroundColor: "Kartenhintergrundfarbe",
barBackgroundColor: "Balkenhintergrundfarbe",
barBorderColor: "Balkenrahmenfarbe",
barFillColor: "Balkenfüllfarbe",
limitIndicatorColor: "Limitindikatorfarbe",
infoTextColor: "Infotextfarbe",
carStateTextColor: "Fahrzeugzustandtextfarbe",
rangeTextColor: "Reichweitentextfarbe",
percentageTextColor: "Prozenttextfarbe",
none: "Keine",
local_url: "Lokal/URL",
entity: "Entität",
search_entities: "Entitäten suchen",
battery_level_description: "Wählen Sie die Entität, die den Batteriestand Ihres Fahrzeugs repräsentiert.",
battery_range_description: "Wählen Sie die Entität, die die verbleibende Reichweite Ihres Elektrofahrzeugs repräsentiert.",
charging_status_description: "Wählen Sie die Entität, die anzeigt, ob Ihr Fahrzeug gerade lädt.",
charge_limit_description: "Wählen Sie die Entität, die das eingestellte Ladelimit für Ihr Fahrzeug repräsentiert.",
location_description: "Wählen Sie die Entität, die den aktuellen Standort Ihres Fahrzeugs angibt.",
mileage_description: "Wählen Sie die Entität, die den Gesamtkilometerstand oder die Tachoanzeige Ihres Fahrzeugs repräsentiert.",
car_state_description: "Wählen Sie die Entität, die den aktuellen Zustand Ihres Fahrzeugs repräsentiert (z.B. geparkt, fahrend, ladend).",
icon_grid_description: "Fügen Sie Entitäten zum Symbol-Raster hinzu. Suchen und wählen Sie Entitäten zum Hinzufügen. Verwenden Sie den Ziehgriff, um Entitäten neu anzuordnen. Klicken Sie auf das Symbol, um es zu ändern, und verwenden Sie (×), um eine Entität aus dem Raster zu entfernen.",
custom_colors_description: "Passen Sie die Farben verschiedener Elemente in der Karte an Ihren bevorzugten Stil oder Ihr Thema an.",
row_separator: "Zeilentrennzeichen",
add_row_separator: "Zeilentrennzeichen hinzufügen",
separator_color: "Trennzeichenfarbe",
separator_color_description: "Wählen Sie die Farbe für das Zeilentrennzeichen.",
transparent: "Transparent",
set_color: "Farbe festlegen",
separator_height: "Trennzeichenhöhe",
separator_height_description: "Legen Sie die Höhe des Zeilentrennzeichens in Pixeln fest.",
icon_gap_size: "Symbollückengrößen",
icon_gap_description: "Legen Sie den Abstand zwischen Symbolen in Pixeln fest.",
horizontal_alignment: "Horizontale Ausrichtung",
vertical_alignment: "Vertikale Ausrichtung",
more_info: "Mehr Informationen",
select_entity: "Entität auswählen",
entity_provides_image: "Diese Entität stellt das Bild für die Anzeige bereit.",
toggle: "Umschalten",
navigate: "Navigieren",
url: "URL öffnen",
trigger: "Auslösen",
formatted_entities: "Formatierte Entitäten",
formatted_entities_description: "Bereinigen Sie Entitätswerte, indem Sie Zahlen runden, Unterstriche durch Leerzeichen ersetzen, Wörter großschreiben und große Zahlen mit Kommas versehen.",
fuel_level_description: "Wählen Sie die Entität, die den Kraftstoffstand Ihres Fahrzeugs repräsentiert.",
fuel_range_description: "Wählen Sie die Entität, die die verbleibende Kraftstoffreichweite Ihres Fahrzeugs repräsentiert.",
engine_on_description: "Wählen Sie die Entität, die anzeigt, ob der Motor Ihres Fahrzeugs gerade läuft.",
main_image_height: "Hauptbildhöhe",
charging_image_height: "Ladebildhöhe",
main_image_section: "Hauptbild-Einstellungen",
charging_image_section: "Ladebild-Einstellungen",
layout_type: "Layout-Typ",
single_column: "Einzelspalte",
double_column: "Doppelspalte",
engine_on_image: "Bild für Motor an",
engine_on_image_height: "Höhe des Bildes für Motor an",
engine_off_image: "Bild für Motor aus",
engine_off_image_height: "Höhe des Bildes für Motor aus",
engine_on_image_section: "Einstellungen für Bild mit Motor an",
use_bar_gradient: "Balkengradient verwenden",
bar_gradient_description: "Aktivieren Sie einen Farbverlauf für den Fortschrittsbalken. Dies ermöglicht es Ihnen, mehrere Farbstopps für eine dynamischere visuelle Darstellung des Fahrzeugstatus festzulegen.",
percentage: "Prozentsatz",
color: "Farbe",
add_gradient_stop: "Gradientenstopp hinzufügen",
inactive_custom_label: "Inaktives benutzerdefiniertes Label",
active_custom_label: "Aktives benutzerdefiniertes Label",
custom_label_placeholder: "Benutzerdefiniertes Label eingeben"
},
device_class: {
battery: {
on: "Niedrig",
off: "Normal"
},
battery_charging: {
on: "Lädt",
off: "Lädt nicht"
},
carbon_monoxide: {
on: "Erkannt",
off: "Frei"
},
cold: {
on: "Kalt",
off: "Normal"
},
connectivity: {
on: "Verbunden",
off: "Getrennt"
},
door: {
on: "Offen",
off: "Geschlossen"
},
garage_door: {
on: "Offen",
off: "Geschlossen"
},
gas: {
on: "Erkannt",
off: "Frei"
},
heat: {
on: "Heiß",
off: "Normal"
},
light: {
on: "Erkannt",
off: "Frei"
},
lock: {
on: "Entriegelt",
off: "Verriegelt"
},
moisture: {
on: "Feucht",
off: "Trocken"
},
motion: {
on: "Erkannt",
off: "Frei"
},
moving: {
on: "Bewegt sich",
off: "Steht"
},
occupancy: {
on: "Belegt",
off: "Frei"
},
opening: {
on: "Offen",
off: "Geschlossen"
},
plug: {
on: "Eingesteckt",
off: "Ausgesteckt"
},
power: {
on: "Erkannt",
off: "Kein Strom"
},
presence: {
on: "Zuhause",
off: "Abwesend"
},
problem: {
on: "Problem",
off: "OK"
},
running: {
on: "Läuft",
off: "Läuft nicht"
},
safety: {
on: "Unsicher",
off: "Sicher"
},
smoke: {
on: "Erkannt",
off: "Frei"
},
sound: {
on: "Erkannt",
off: "Frei"
},
tamper: {
on: "Erkannt",
off: "Frei"
},
update: {
on: "Verfügbar",
off: "Aktuell"
},
vibration: {
on: "Erkannt",
off: "Frei"
},
window: {
on: "Offen",
off: "Geschlossen"
}
}
}

View File

@@ -0,0 +1,268 @@
export default {
common: {
battery: "Battery",
fuel: "Fuel",
range: "Range",
charging: "Charging",
mileage: "Mileage",
location: "Location",
car_state: "Car State",
charge_limit: "Charge Limit",
engine_on: "Engine On",
away: "Away",
charging_end_time: "Charging End Time",
charging_ending_soon: "Charging ending soon",
charging_ending_in: "Charging ending in",
charging_until: "Charging until",
minutes: "minutes",
minute: "minute",
hours: "hours",
hour: "hour",
state: {
default: {
on: "On",
off: "Off"
}
}
},
vehicle_types: {
ev: "Electric Vehicle",
fuel: "Fuel Vehicle",
hybrid: "Hybrid"
},
editor: {
title: "Ultra Vehicle Card",
card_title: "Card Title",
vehicle_type: "Vehicle Type",
unit_type: "Unit Type",
show_battery: "Show Battery",
show_battery_range: "Show Battery Range",
show_fuel: "Show Fuel",
show_fuel_range: "Show Fuel Range",
show_location: "Show Location",
show_mileage: "Show Mileage",
show_car_state: "Show Car State",
show_charge_limit: "Show Charge Limit",
hybrid_display_order: "Hybrid Display Order",
fuel_first: "Fuel First",
battery_first: "Battery First",
images: "Images",
main_image: "Main Image",
charging_image: "Charging Image",
enter_image_url: "Enter image URL",
upload_image: "Upload Image",
entity_settings: "Entity Settings",
battery_level: "Battery Level",
battery_range: "Battery Range",
fuel_level: "Fuel Level",
fuel_range: "Fuel Range",
charging_status: "Charging Status",
location: "Location",
mileage: "Mileage",
car_state: "Car State",
charge_limit: "Charge Limit",
engine_on: "Engine On",
icon_grid: "Icon Grid",
add_entity: "Add Entity",
add_row_separator: "Add Row Separator",
custom_icons: "Custom Icons",
inactive_icon: "Inactive Icon",
active_icon: "Active Icon",
no_icon: "NO ICON",
inactive_icon_color: "Inactive Icon Colour",
active_icon_color: "Active Icon Colour",
icon_style: "Icon Style",
icon_size: "Icon Size",
icon_size_description: "Size of the icon.",
icon_label_position: "Icon Label Position",
left: "Left",
top: "Top",
right: "Right",
bottom: "Bottom",
interaction: "Interaction",
colors: "Colours",
cardBackgroundColor: "Card Background Colour",
barBackgroundColor: "Bar Background Colour",
barBorderColor: "Bar Border Colour",
barFillColor: "Bar Fill Colour",
limitIndicatorColor: "Limit Indicator Colour",
infoTextColor: "Info Text Colour",
carStateTextColor: "Car State Text Colour",
rangeTextColor: "Range Text Colour",
percentageTextColor: "Percentage Text Colour",
none: "None",
local_url: "Local/URL",
entity: "Entity",
search_entities: "Search Entities",
battery_level_description: "Select the entity that represents the battery level of your vehicle.",
battery_range_description: "Select the entity that represents the remaining range of your electric vehicle.",
charging_status_description: "Select the entity that indicates whether your vehicle is currently charging.",
charge_limit_description: "Select the entity that represents the charging limit set for your vehicle.",
location_description: "Select the entity that provides the current location of your vehicle.",
mileage_description: "Select the entity that represents the total mileage or odometer reading of your vehicle.",
car_state_description: "Select the entity that represents the current state of your vehicle (e.g., parked, driving, charging).",
icon_grid_description: "Add entities to the icon grid. Search and select entities to add. Use the drag handle to reorder entities. Click on the icon to change it, and use (×) to remove an entity from the grid.",
custom_colors_description: "Customize the colors of various elements in the card to match your preferred style or theme.",
row_separator: "Row Separator",
add_row_separator: "Add Row Separator",
separator_color: "Separator Colour",
separator_color_description: "Choose the colour for the row separator.",
transparent: "Transparent",
set_color: "Set Colour",
separator_height: "Separator Height",
separator_height_description: "Set the height of the row separator in pixels.",
icon_gap_size: "Icon Gap Size",
icon_gap_description: "Set the gap between icons in pixels.",
horizontal_alignment: "Horizontal Alignment",
vertical_alignment: "Vertical Alignment",
more_info: "More Info",
select_entity: "Select an Entity",
entity_provides_image: "This entity provides the image for the display.",
toggle: "Toggle",
navigate: "Navigate",
url: "Open URL",
trigger: "Trigger",
formatted_entities: "Formatted Entities",
formatted_entities_description: "Clean up entity values by rounding numbers, replacing underscores with spaces, capitalizing words, and adding commas to large numbers.",
fuel_level_description: "Select the entity that represents the fuel level of your vehicle.",
fuel_range_description: "Select the entity that represents the remaining fuel range of your vehicle.",
engine_on_description: "Select the entity that indicates whether your vehicle's engine is currently running.",
main_image_height: "Main Image Height",
charging_image_height: "Charging Image Height",
main_image_section: "Main Image Settings",
charging_image_section: "Charging Image Settings",
layout_type: "Layout Type",
single_column: "Single Column",
double_column: "Double Column",
engine_on_image: "Engine On Image",
engine_on_image_height: "Engine On Image Height",
engine_off_image: "Engine Off Image",
engine_off_image_height: "Engine Off Image Height",
engine_on_image_section: "Engine On Image Settings",
use_bar_gradient: "Use Bar Gradient",
bar_gradient_description: "Enable a colour gradient for the progress bar. This allows you to set multiple colour stops for a more dynamic visual representation of the vehicle's status.",
percentage: "Percentage",
color: "Colour",
add_gradient_stop: "Add Gradient Stop",
reset_all_colors: "Reset All Colours",
reset_all_icon_colors: "Reset All Icon Colours",
settings: "Settings",
customize: "Customise",
template_mode: "Template Mode",
template_mode_description: "Enter your template code below. To exit template mode, select a different state from the dropdown above. Use {{ true }} and {{ false }} like statements to represent on and off states."
},
device_class: {
battery: {
on: "Low",
off: "Normal"
},
battery_charging: {
on: "Charging",
off: "Not Charging"
},
carbon_monoxide: {
on: "Detected",
off: "Clear"
},
cold: {
on: "Cold",
off: "Normal"
},
connectivity: {
on: "Connected",
off: "Disconnected"
},
door: {
on: "Open",
off: "Closed"
},
garage_door: {
on: "Open",
off: "Closed"
},
gas: {
on: "Detected",
off: "Clear"
},
heat: {
on: "Hot",
off: "Normal"
},
light: {
on: "Detected",
off: "Clear"
},
lock: {
on: "Unlocked",
off: "Locked"
},
moisture: {
on: "Wet",
off: "Dry"
},
motion: {
on: "Detected",
off: "Clear"
},
moving: {
on: "Moving",
off: "Stopped"
},
occupancy: {
on: "Occupied",
off: "Clear"
},
opening: {
on: "Open",
off: "Closed"
},
plug: {
on: "Plugged In",
off: "Unplugged"
},
power: {
on: "Detected",
off: "No Power"
},
presence: {
on: "Home",
off: "Away"
},
problem: {
on: "Problem",
off: "OK"
},
running: {
on: "Running",
off: "Not Running"
},
safety: {
on: "Unsafe",
off: "Safe"
},
smoke: {
on: "Detected",
off: "Clear"
},
sound: {
on: "Detected",
off: "Clear"
},
tamper: {
on: "Detected",
off: "Clear"
},
update: {
on: "Available",
off: "Up-to-date"
},
vibration: {
on: "Detected",
off: "Clear"
},
window: {
on: "Open",
off: "Closed"
}
}
}

View File

@@ -0,0 +1,289 @@
export default {
common: {
battery: "Battery",
fuel: "Fuel",
range: "Range",
charging: "Charging",
mileage: "Mileage",
location: "Location",
car_state: "Car State",
charge_limit: "Charge Limit",
engine_on: "Engine On",
away: "Away",
charging_end_time: "Charging End Time",
charging_ending_soon: "Charging ending soon",
charging_ending_in: "Charging ending in",
charging_until: "Charging until",
minutes: "minutes",
minute: "minute",
hours: "hours",
hour: "hour",
state: {
default: {
on: "On",
off: "Off"
}
}
},
vehicle_types: {
ev: "Electric Vehicle",
fuel: "Fuel Vehicle",
hybrid: "Hybrid"
},
editor: {
title: "Ultra Vehicle Card",
layout_type: "Layout Type",
single_column: "Single Column",
double_column: "Double Column",
card_title: "Card Title",
vehicle_type: "Vehicle Type",
unit_type: "Unit Type",
engine_on_image: "Engine On Image",
engine_on_image_height: "Engine On Image Height",
engine_off_image: "Engine Off Image",
engine_off_image_height: "Engine Off Image Height",
engine_on_image_section: "Engine On Image Settings",
show_battery: "Show Battery",
show_battery_range: "Show Battery Range",
show_fuel: "Show Fuel",
show_fuel_range: "Show Fuel Range",
show_location: "Show Location",
show_mileage: "Show Mileage",
show_car_state: "Show Car State",
show_charge_limit: "Show Charge Limit",
hybrid_display_order: "Hybrid Display Order",
fuel_first: "Fuel First",
battery_first: "Battery First",
images: "Images",
main_image: "Main Image",
charging_image: "Charging Image",
enter_image_url: "Enter image URL",
upload_image: "Upload Image",
entity_settings: "Entity Settings",
battery_level: "Battery Level",
battery_range: "Battery Range",
fuel_level: "Fuel Level",
fuel_range: "Fuel Range",
charging_status: "Charging Status",
location: "Location",
mileage: "Mileage",
car_state: "Car State",
charge_limit: "Charge Limit",
engine_on: "Engine On",
add_entity: "Add Entity",
add_row_separator: "Add Row Separator",
custom_icons: "Custom Icons",
inactive_icon: "Inactive Icon",
active_icon: "Active Icon",
no_icon: "NO ICON",
inactive_icon_color: "Inactive Icon Color",
active_icon_color: "Active Icon Color",
icon_style: "Icon Style",
icon_size: "Icon Size",
icon_size_description: "Size of the icon.",
icon_label_position: "Icon Label Position",
left: "Left",
top: "Top",
right: "Right",
bottom: "Bottom",
interaction: "Interaction",
colors: "Colors",
cardBackgroundColor: "Card Background Color",
barBackgroundColor: "Bar Background Color",
barBorderColor: "Bar Border Color",
barFillColor: "Bar Fill Color",
limitIndicatorColor: "Limit Indicator Color",
infoTextColor: "Info Text Color",
carStateTextColor: "Car State Text Color",
rangeTextColor: "Range Text Color",
percentageTextColor: "Percentage Text Color",
none: "None",
local_url: "Local/URL",
entity: "Entity",
search_entities: "Search Entities",
battery_level_description: "Select the entity that represents the battery level of your vehicle.",
battery_range_description: "Select the entity that represents the remaining range of your electric vehicle.",
charging_status_description: "Select the entity that indicates whether your vehicle is currently charging.",
charge_limit_description: "Select the entity that represents the charging limit set for your vehicle.",
location_description: "Select the entity that provides the current location of your vehicle.",
mileage_description: "Select the entity that represents the total mileage or odometer reading of your vehicle.",
car_state_description: "Select the entity that represents the current state of your vehicle (e.g., parked, driving, charging).",
icon_grid_description: "Add entities to the icon grid. Search and select entities to add. Use the drag handle to reorder entities. Click on the icon to change it, and use (×) to remove an entity from the grid.",
custom_colors_description: "Customize the colors of various elements in the card to match your preferred style or theme.",
row_separator: "Row Separator",
add_row_separator: "Add Row Separator",
separator_color: "Separator Color",
separator_color_description: "Choose the color for the row separator.",
transparent: "Transparent",
set_color: "Set Color",
separator_height: "Separator Height",
separator_height_description: "Set the height of the row separator in pixels.",
icon_gap_size: "Icon Gap Size",
icon_gap_description: "Set the gap between icons in pixels.",
horizontal_alignment: "Horizontal Alignment",
vertical_alignment: "Vertical Alignment",
inactive_icon: "Inactive Icon",
active_icon: "Active Icon",
no_icon: "NO ICON",
inactive_icon_color: "Inactive Icon Color",
active_icon_color: "Active Icon Color",
icon_style: "Icon Style",
icon_size: "Icon Size",
icon_size_description: "Size of the icon.",
icon_label_position: "Icon Label Position",
interaction: "Interaction",
more_info: "More Info",
bottom: "Bottom",
select_entity: "Select an Entity",
entity_provides_image: "This entity provides the image for the display.",
separator_color: "Separator Color",
separator_color_description: "Choose the color for the row separator.",
inactive_icon_color: "Inactive Icon Color",
active_icon_color: "Active Icon Color",
custom_colors_description: "Customize the colors of various elements in the card to match your preferred style or theme.",
toggle: "Toggle",
navigate: "Navigate",
url: "Open URL",
trigger: "Trigger",
none: "None",
formatted_entities: "Formatted Entities",
formatted_entities_description: "Clean up entity values by rounding numbers, replacing underscores with spaces, capitalizing words, and adding commas to large numbers.",
fuel_level_description: "Select the entity that represents the fuel level of your vehicle.",
fuel_range_description: "Select the entity that represents the remaining fuel range of your vehicle.",
engine_on_description: "Select the entity that indicates whether your vehicle's engine is currently running.",
main_image_height: "Main Image Height",
charging_image_height: "Charging Image Height",
main_image_section: "Main Image Settings",
charging_image_section: "Charging Image Settings",
use_bar_gradient: "Use Bar Gradient",
bar_gradient_description: "Enable a color gradient for the progress bar. This allows you to set multiple color stops for a more dynamic visual representation of the vehicle's status.",
percentage: "Percentage",
color: "Color",
cardTitleColor: "Card Title Color",
add_gradient_stop: "Add Gradient Stop",
reset_all_colors: "Reset All Colors",
reset_all_icon_colors: "Reset All Icon Colors",
settings: "Settings",
icon_grid: "Icon Grid",
customize: "Customize",
inactive_custom_label: "Inactive Custom Label",
active_custom_label: "Active Custom Label",
custom_label_placeholder: "Enter custom label",
template_mode: "Template Mode",
template_mode_description: "Enter your template code below. To exit template mode, select a different state from the dropdown above. Use {{ true }} and {{ false }} like statements to represent on and off states."
},
device_class: {
battery: {
on: "Low",
off: "Normal"
},
battery_charging: {
on: "Charging",
off: "Not Charging"
},
carbon_monoxide: {
on: "Detected",
off: "Clear"
},
cold: {
on: "Cold",
off: "Normal"
},
connectivity: {
on: "Connected",
off: "Disconnected"
},
door: {
on: "Open",
off: "Closed"
},
garage_door: {
on: "Open",
off: "Closed"
},
gas: {
on: "Detected",
off: "Clear"
},
heat: {
on: "Hot",
off: "Normal"
},
light: {
on: "Detected",
off: "Clear"
},
lock: {
on: "Unlocked",
off: "Locked"
},
moisture: {
on: "Wet",
off: "Dry"
},
motion: {
on: "Detected",
off: "Clear"
},
moving: {
on: "Moving",
off: "Stopped"
},
occupancy: {
on: "Occupied",
off: "Clear"
},
opening: {
on: "Open",
off: "Closed"
},
plug: {
on: "Plugged In",
off: "Unplugged"
},
power: {
on: "Detected",
off: "No Power"
},
presence: {
on: "Home",
off: "Away"
},
problem: {
on: "Problem",
off: "OK"
},
running: {
on: "Running",
off: "Not Running"
},
safety: {
on: "Unsafe",
off: "Safe"
},
smoke: {
on: "Detected",
off: "Clear"
},
sound: {
on: "Detected",
off: "Clear"
},
tamper: {
on: "Detected",
off: "Clear"
},
update: {
on: "Available",
off: "Up-to-date"
},
vibration: {
on: "Detected",
off: "Clear"
},
window: {
on: "Open",
off: "Closed"
}
}
}

View File

@@ -0,0 +1,268 @@
export default {
common: {
battery: "Batería",
fuel: "Combustible",
range: "Autonomía",
charging: "Cargando",
mileage: "Kilometraje",
location: "Ubicación",
car_state: "Estado del coche",
charge_limit: "Límite de carga",
engine_on: "Motor encendido",
away: "Fuera",
charging_end_time: "Fin de carga",
charging_ending_soon: "Carga finalizando pronto",
charging_ending_in: "Carga finalizando en",
charging_until: "Cargando hasta",
minutes: "minutos",
minute: "minuto",
hours: "horas",
hour: "hora",
state: {
default: {
on: "Encendido",
off: "Apagado"
}
}
},
vehicle_types: {
ev: "Vehículo eléctrico",
fuel: "Vehículo de combustible",
hybrid: "Híbrido"
},
editor: {
title: "Tarjeta Ultra de Vehículo",
card_title: "Título de la tarjeta",
vehicle_type: "Tipo de vehículo",
unit_type: "Tipo de unidad",
show_battery: "Mostrar batería",
show_battery_range: "Mostrar autonomía de batería",
show_fuel: "Mostrar combustible",
show_fuel_range: "Mostrar autonomía de combustible",
show_location: "Mostrar ubicación",
show_mileage: "Mostrar kilometraje",
show_car_state: "Mostrar estado del coche",
show_charge_limit: "Mostrar límite de carga",
hybrid_display_order: "Orden de visualización híbrida",
fuel_first: "Combustible primero",
battery_first: "Batería primero",
images: "Imágenes",
main_image: "Imagen principal",
charging_image: "Imagen de carga",
enter_image_url: "Introducir URL de imagen",
upload_image: "Subir imagen",
entity_settings: "Configuración de entidades",
battery_level: "Nivel de batería",
battery_range: "Autonomía de batería",
fuel_level: "Nivel de combustible",
fuel_range: "Autonomía de combustible",
charging_status: "Estado de carga",
location: "Ubicación",
mileage: "Kilometraje",
car_state: "Estado del coche",
charge_limit: "Límite de carga",
engine_on: "Motor encendido",
icon_grid: "Cuadrícula de iconos",
add_entity: "Añadir entidad",
add_row_separator: "Añadir separador de fila",
custom_icons: "Iconos personalizados",
inactive_icon: "Icono inactivo",
active_icon: "Icono activo",
no_icon: "SIN ICONO",
inactive_icon_color: "Color de icono inactivo",
active_icon_color: "Color de icono activo",
icon_style: "Estilo de icono",
icon_size: "Tamaño de icono",
icon_size_description: "Tamaño del icono.",
icon_label_position: "Posición de la etiqueta del icono",
left: "Izquierda",
top: "Arriba",
right: "Derecha",
bottom: "Abajo",
interaction: "Interacción",
colors: "Colores",
cardBackgroundColor: "Color de fondo de la tarjeta",
barBackgroundColor: "Color de fondo de la barra",
barBorderColor: "Color del borde de la barra",
barFillColor: "Color de relleno de la barra",
limitIndicatorColor: "Color del indicador de límite",
infoTextColor: "Color del texto de información",
carStateTextColor: "Color del texto del estado del coche",
rangeTextColor: "Color del texto de autonomía",
percentageTextColor: "Color del texto de porcentaje",
none: "Ninguno",
local_url: "Local/URL",
entity: "Entidad",
search_entities: "Buscar entidades",
battery_level_description: "Seleccione la entidad que representa el nivel de batería de su vehículo.",
battery_range_description: "Seleccione la entidad que representa la autonomía restante de su vehículo eléctrico.",
charging_status_description: "Seleccione la entidad que indica si su vehículo está cargando actualmente.",
charge_limit_description: "Seleccione la entidad que representa el límite de carga establecido para su vehículo.",
location_description: "Seleccione la entidad que proporciona la ubicación actual de su vehículo.",
mileage_description: "Seleccione la entidad que representa el kilometraje total o la lectura del odómetro de su vehículo.",
car_state_description: "Seleccione la entidad que representa el estado actual de su vehículo (por ejemplo, estacionado, en movimiento, cargando).",
icon_grid_description: "Añada entidades a la cuadrícula de iconos. Busque y seleccione entidades para añadir. Use el controlador de arrastre para reordenar entidades. Haga clic en el icono para cambiarlo y use (×) para eliminar una entidad de la cuadrícula.",
custom_colors_description: "Personalice los colores de varios elementos en la tarjeta para que coincidan con su estilo o tema preferido.",
row_separator: "Separador de fila",
add_row_separator: "Añadir separador de fila",
separator_color: "Color del separador",
separator_color_description: "Elija el color para el separador de fila.",
transparent: "Transparente",
set_color: "Establecer color",
separator_height: "Altura del separador",
separator_height_description: "Establezca la altura del separador de fila en píxeles.",
icon_gap_size: "Tamaño del espacio entre iconos",
icon_gap_description: "Establezca el espacio entre iconos en píxeles.",
horizontal_alignment: "Alineación horizontal",
vertical_alignment: "Alineación vertical",
more_info: "Más información",
select_entity: "Seleccionar una entidad",
entity_provides_image: "Esta entidad proporciona la imagen para la visualización.",
toggle: "Alternar",
navigate: "Navegar",
url: "Abrir URL",
trigger: "Activar",
formatted_entities: "Entidades formateadas",
formatted_entities_description: "Limpie los valores de las entidades redondeando números, reemplazando guiones bajos con espacios, capitalizando palabras y agregando comas a números grandes.",
fuel_level_description: "Seleccione la entidad que representa el nivel de combustible de su vehículo.",
fuel_range_description: "Seleccione la entidad que representa la autonomía de combustible restante de su vehículo.",
engine_on_description: "Seleccione la entidad que indica si el motor de su vehículo está actualmente en funcionamiento.",
main_image_height: "Altura de la imagen principal",
charging_image_height: "Altura de la imagen de carga",
main_image_section: "Configuración de la imagen principal",
charging_image_section: "Configuración de la imagen de carga",
layout_type: "Tipo de diseño",
single_column: "Columna única",
double_column: "Doble columna",
engine_on_image: "Imagen de motor encendido",
engine_on_image_height: "Altura de la imagen de motor encendido",
engine_off_image: "Imagen de motor apagado",
engine_off_image_height: "Altura de la imagen de motor apagado",
engine_on_image_section: "Configuración de la imagen de motor encendido",
use_bar_gradient: "Usar gradiente en la barra",
bar_gradient_description: "Habilita un gradiente de color para la barra de progreso. Esto te permite establecer múltiples puntos de color para una representación visual más dinámica del estado del vehículo.",
percentage: "Porcentaje",
color: "Color",
add_gradient_stop: "Añadir punto de gradiente",
customize: "Personalizar",
inactive_custom_label: "Etiqueta personalizada inactiva",
active_custom_label: "Etiqueta personalizada activa",
custom_label_placeholder: "Ingrese etiqueta personalizada",
template_mode: "Modo plantilla",
template_mode_description: "Ingrese su código de plantilla a continuación. Para salir del modo plantilla, seleccione un estado diferente del menú desplegable de arriba. Use {{ true }} y {{ false }} como expresiones para representar los estados de encendido y apagado."
},
device_class: {
battery: {
on: "Baja",
off: "Normal"
},
battery_charging: {
on: "Cargando",
off: "No cargando"
},
carbon_monoxide: {
on: "Detectado",
off: "Despejado"
},
cold: {
on: "Frío",
off: "Normal"
},
connectivity: {
on: "Conectado",
off: "Desconectado"
},
door: {
on: "Abierta",
off: "Cerrada"
},
garage_door: {
on: "Abierta",
off: "Cerrada"
},
gas: {
on: "Detectado",
off: "Despejado"
},
heat: {
on: "Caliente",
off: "Normal"
},
light: {
on: "Detectada",
off: "Despejado"
},
lock: {
on: "Desbloqueado",
off: "Bloqueado"
},
moisture: {
on: "Húmedo",
off: "Seco"
},
motion: {
on: "Detectado",
off: "Despejado"
},
moving: {
on: "Moviéndose",
off: "Parado"
},
occupancy: {
on: "Ocupado",
off: "Despejado"
},
opening: {
on: "Abierto",
off: "Cerrado"
},
plug: {
on: "Enchufado",
off: "Desenchufado"
},
power: {
on: "Detectada",
off: "Sin energía"
},
presence: {
on: "En casa",
off: "Fuera"
},
problem: {
on: "Problema",
off: "OK"
},
running: {
on: "Funcionando",
off: "Parado"
},
safety: {
on: "Inseguro",
off: "Seguro"
},
smoke: {
on: "Detectado",
off: "Despejado"
},
sound: {
on: "Detectado",
off: "Despejado"
},
tamper: {
on: "Detectado",
off: "Despejado"
},
update: {
on: "Disponible",
off: "Actualizado"
},
vibration: {
on: "Detectada",
off: "Despejado"
},
window: {
on: "Abierta",
off: "Cerrada"
}
}
}

View File

@@ -0,0 +1,268 @@
export default {
common: {
battery: "Batterie",
fuel: "Carburant",
range: "Autonomie",
charging: "Chargement",
mileage: "Kilométrage",
location: "Emplacement",
car_state: "État du véhicule",
charge_limit: "Limite de charge",
engine_on: "Moteur en marche",
away: "Absent",
charging_end_time: "Fin de charge",
charging_ending_soon: "Charge se terminant bientôt",
charging_ending_in: "Charge se terminant dans",
charging_until: "Charge jusqu'à",
minutes: "minutes",
minute: "minute",
hours: "heures",
hour: "heure",
state: {
default: {
on: "Allumé",
off: "Éteint"
}
}
},
vehicle_types: {
ev: "Véhicule électrique",
fuel: "Véhicule à carburant",
hybrid: "Hybride"
},
editor: {
title: "Carte Ultra Véhicule",
card_title: "Titre de la carte",
vehicle_type: "Type de véhicule",
unit_type: "Type d'unité",
show_battery: "Afficher la batterie",
show_battery_range: "Afficher l'autonomie de la batterie",
show_fuel: "Afficher le carburant",
show_fuel_range: "Afficher l'autonomie du carburant",
show_location: "Afficher l'emplacement",
show_mileage: "Afficher le kilométrage",
show_car_state: "Afficher l'état du véhicule",
show_charge_limit: "Afficher la limite de charge",
hybrid_display_order: "Ordre d'affichage hybride",
fuel_first: "Carburant en premier",
battery_first: "Batterie en premier",
images: "Images",
main_image: "Image principale",
charging_image: "Image de charge",
enter_image_url: "Entrer l'URL de l'image",
upload_image: "Télécharger une image",
entity_settings: "Paramètres des entités",
battery_level: "Niveau de batterie",
battery_range: "Autonomie de la batterie",
fuel_level: "Niveau de carburant",
fuel_range: "Autonomie du carburant",
charging_status: "État de charge",
location: "Emplacement",
mileage: "Kilométrage",
car_state: "État du véhicule",
charge_limit: "Limite de charge",
engine_on: "Moteur en marche",
icon_grid: "Grille d'icônes",
add_entity: "Ajouter une entité",
add_row_separator: "Ajouter un séparateur de ligne",
custom_icons: "Icônes personnalisées",
inactive_icon: "Icône inactive",
active_icon: "Icône active",
no_icon: "PAS D'ICÔNE",
inactive_icon_color: "Couleur de l'icône inactive",
active_icon_color: "Couleur de l'icône active",
icon_style: "Style d'icône",
icon_size: "Taille de l'icône",
icon_size_description: "Taille de l'icône.",
icon_label_position: "Position de l'étiquette de l'icône",
left: "Gauche",
top: "Haut",
right: "Droite",
bottom: "Bas",
interaction: "Interaction",
colors: "Couleurs",
cardBackgroundColor: "Couleur de fond de la carte",
barBackgroundColor: "Couleur de fond de la barre",
barBorderColor: "Couleur de bordure de la barre",
barFillColor: "Couleur de remplissage de la barre",
limitIndicatorColor: "Couleur de l'indicateur de limite",
infoTextColor: "Couleur du texte d'information",
carStateTextColor: "Couleur du texte d'état du véhicule",
rangeTextColor: "Couleur du texte d'autonomie",
percentageTextColor: "Couleur du texte de pourcentage",
none: "Aucun",
local_url: "Local/URL",
entity: "Entité",
search_entities: "Rechercher des entités",
battery_level_description: "Sélectionnez l'entité qui représente le niveau de batterie de votre véhicule.",
battery_range_description: "Sélectionnez l'entité qui représente l'autonomie restante de votre véhicule électrique.",
charging_status_description: "Sélectionnez l'entité qui indique si votre véhicule est actuellement en charge.",
charge_limit_description: "Sélectionnez l'entité qui représente la limite de charge définie pour votre véhicule.",
location_description: "Sélectionnez l'entité qui fournit l'emplacement actuel de votre véhicule.",
mileage_description: "Sélectionnez l'entité qui représente le kilométrage total ou la lecture de l'odomètre de votre véhicule.",
car_state_description: "Sélectionnez l'entité qui représente l'état actuel de votre véhicule (par exemple, stationné, en mouvement, en charge).",
icon_grid_description: "Ajoutez des entités à la grille d'icônes. Recherchez et sélectionnez des entités à ajouter. Utilisez la poignée de glissement pour réorganiser les entités. Cliquez sur l'icône pour la modifier et utilisez (×) pour supprimer une entité de la grille.",
custom_colors_description: "Personnalisez les couleurs de divers éléments de la carte pour correspondre à votre style ou thème préféré.",
row_separator: "Séparateur de ligne",
add_row_separator: "Ajouter un séparateur de ligne",
separator_color: "Couleur du séparateur",
separator_color_description: "Choisissez la couleur du séparateur de ligne.",
transparent: "Transparent",
set_color: "Définir la couleur",
separator_height: "Hauteur du séparateur",
separator_height_description: "Définissez la hauteur du séparateur de ligne en pixels.",
icon_gap_size: "Taille de l'espace entre les icônes",
icon_gap_description: "Définissez l'espace entre les icônes en pixels.",
horizontal_alignment: "Alignement horizontal",
vertical_alignment: "Alignement vertical",
more_info: "Plus d'informations",
select_entity: "Sélectionner une entité",
entity_provides_image: "Cette entité fournit l'image pour l'affichage.",
toggle: "Basculer",
navigate: "Naviguer",
url: "Ouvrir l'URL",
trigger: "Déclencher",
formatted_entities: "Entités formatées",
formatted_entities_description: "Nettoyez les valeurs des entités en arrondissant les nombres, en remplaçant les tirets bas par des espaces, en mettant les mots en majuscules et en ajoutant des virgules aux grands nombres.",
fuel_level_description: "Sélectionnez l'entité qui représente le niveau de carburant de votre véhicule.",
fuel_range_description: "Sélectionnez l'entité qui représente l'autonomie de carburant restante de votre véhicule.",
engine_on_description: "Sélectionnez l'entité qui indique si le moteur de votre véhicule est actuellement en marche.",
main_image_height: "Hauteur de l'image principale",
charging_image_height: "Hauteur de l'image de charge",
main_image_section: "Paramètres de l'image principale",
charging_image_section: "Paramètres de l'image de charge",
layout_type: "Type de mise en page",
single_column: "Colonne unique",
double_column: "Double colonne",
engine_on_image: "Image moteur en marche",
engine_on_image_height: "Hauteur de l'image moteur en marche",
engine_off_image: "Image moteur arrêté",
engine_off_image_height: "Hauteur de l'image moteur arrêté",
engine_on_image_section: "Paramètres de l'image moteur en marche",
use_bar_gradient: "Utiliser un dégradé pour la barre",
bar_gradient_description: "Activer un dégradé de couleur pour la barre de progression. Cela vous permet de définir plusieurs arrêts de couleur pour une représentation visuelle plus dynamique de l'état du véhicule.",
percentage: "Pourcentage",
color: "Couleur",
add_gradient_stop: "Ajouter un arrêt de dégradé",
customize: "Personnaliser",
inactive_custom_label: "Étiquette personnalisée inactive",
active_custom_label: "Étiquette personnalisée active",
custom_label_placeholder: "Entrez une étiquette personnalisée",
template_mode: "Mode modèle",
template_mode_description: "Entrez votre code de modèle ci-dessous. Pour quitter le mode modèle, sélectionnez un état différent dans la liste déroulante ci-dessus. Utilisez {{ true }} et {{ false }} comme expressions pour représenter les états activé et désactivé."
},
device_class: {
battery: {
on: "Faible",
off: "Normal"
},
battery_charging: {
on: "En charge",
off: "Pas en charge"
},
carbon_monoxide: {
on: "Détecté",
off: "Aucun"
},
cold: {
on: "Froid",
off: "Normal"
},
connectivity: {
on: "Connecté",
off: "Déconnecté"
},
door: {
on: "Ouverte",
off: "Fermée"
},
garage_door: {
on: "Ouverte",
off: "Fermée"
},
gas: {
on: "Détecté",
off: "Aucun"
},
heat: {
on: "Chaud",
off: "Normal"
},
light: {
on: "Détectée",
off: "Aucune"
},
lock: {
on: "Déverrouillé",
off: "Verrouillé"
},
moisture: {
on: "Humide",
off: "Sec"
},
motion: {
on: "Détecté",
off: "Aucun"
},
moving: {
on: "En mouvement",
off: "Arrêté"
},
occupancy: {
on: "Occupé",
off: "Libre"
},
opening: {
on: "Ouvert",
off: "Fermé"
},
plug: {
on: "Branché",
off: "Débranché"
},
power: {
on: "Détectée",
off: "Pas d'alimentation"
},
presence: {
on: "Présent",
off: "Absent"
},
problem: {
on: "Problème",
off: "OK"
},
running: {
on: "En marche",
off: "Arrêté"
},
safety: {
on: "Dangereux",
off: "Sûr"
},
smoke: {
on: "Détectée",
off: "Aucune"
},
sound: {
on: "Détecté",
off: "Aucun"
},
tamper: {
on: "Détectée",
off: "Aucune"
},
update: {
on: "Disponible",
off: "À jour"
},
vibration: {
on: "Détectée",
off: "Aucune"
},
window: {
on: "Ouverte",
off: "Fermée"
}
}
}

View File

@@ -0,0 +1,273 @@
export default {
common: {
battery: "Batteri",
fuel: "Drivstoff",
range: "Rekkevidde",
charging: "Lader",
mileage: "Kilometerstand",
location: "Plassering",
car_state: "Bilstatus",
charge_limit: "Ladelimit",
engine_on: "Motor på",
away: "Borte",
charging_end_time: "Ladeslutt",
charging_ending_soon: "Lading avsluttes snart",
charging_ending_in: "Lading avsluttes om",
charging_until: "Lader til",
minutes: "minutter",
minute: "minutt",
hours: "timer",
hour: "time",
state: {
default: {
on: "På",
off: "Av"
}
}
},
vehicle_types: {
ev: "Elektrisk kjøretøy",
fuel: "Drivstoffkjøretøy",
hybrid: "Hybrid"
},
editor: {
title: "Ultra Kjøretøykort",
card_title: "Korttittel",
vehicle_type: "Kjøretøytype",
unit_type: "Enhetstype",
show_battery: "Vis batteri",
show_battery_range: "Vis batterirekkevidde",
show_fuel: "Vis drivstoff",
show_fuel_range: "Vis drivstoffrekkevidde",
show_location: "Vis plassering",
show_mileage: "Vis kilometerstand",
show_car_state: "Vis bilstatus",
show_charge_limit: "Vis ladelimit",
hybrid_display_order: "Hybrid visningsrekkefølge",
fuel_first: "Drivstoff først",
battery_first: "Batteri først",
images: "Bilder",
main_image: "Hovedbilde",
charging_image: "Ladebilde",
enter_image_url: "Skriv inn bilde-URL",
upload_image: "Last opp bilde",
entity_settings: "Enhetsinnstillinger",
battery_level: "Batterinivå",
battery_range: "Batterirekkevidde",
fuel_level: "Drivstoffnivå",
fuel_range: "Drivstoffrekkevidde",
charging_status: "Ladestatus",
location: "Plassering",
mileage: "Kilometerstand",
car_state: "Bilstatus",
charge_limit: "Ladelimit",
engine_on: "Motor på",
icon_grid: "Ikonrutenett",
add_entity: "Legg til enhet",
add_row_separator: "Legg til radskiller",
custom_icons: "Tilpassede ikoner",
inactive_icon: "Inaktivt ikon",
active_icon: "Aktivt ikon",
no_icon: "INGEN IKON",
inactive_icon_color: "Inaktiv ikonfarge",
active_icon_color: "Aktiv ikonfarge",
icon_style: "Ikonstil",
icon_size: "Ikonstørrelse",
icon_size_description: "Størrelse på ikonet.",
icon_label_position: "Ikonetikettposisjon",
left: "Venstre",
top: "Topp",
right: "Høyre",
bottom: "Bunn",
interaction: "Interaksjon",
colors: "Farger",
cardBackgroundColor: "Kortbakgrunnsfarge",
barBackgroundColor: "Linjebakgrunnsfarge",
barBorderColor: "Linjekantfarge",
barFillColor: "Linjefyllfarge",
limitIndicatorColor: "Limitindikatorfarge",
infoTextColor: "Infotekstfarge",
carStateTextColor: "Bilstatustekstfarge",
rangeTextColor: "Rekkeviddtekstfarge",
percentageTextColor: "Prosenttekstfarge",
none: "Ingen",
local_url: "Lokal/URL",
entity: "Enhet",
search_entities: "Søk enheter",
battery_level_description: "Velg enheten som representerer batterinivået til kjøretøyet ditt.",
battery_range_description: "Velg enheten som representerer gjenværende rekkevidde for ditt elektriske kjøretøy.",
charging_status_description: "Velg enheten som indikerer om kjøretøyet ditt lader for øyeblikket.",
charge_limit_description: "Velg enheten som representerer ladelimiten satt for kjøretøyet ditt.",
location_description: "Velg enheten som gir den nåværende plasseringen til kjøretøyet ditt.",
mileage_description: "Velg enheten som representerer total kjørelengde eller kilometerstand for kjøretøyet ditt.",
car_state_description: "Velg enheten som representerer den nåværende tilstanden til kjøretøyet ditt (f.eks. parkert, kjrer, lader).",
icon_grid_description: "Legg til enheter i ikonrutenettet. Søk og velg enheter å legge til. Bruk drahåndtaket for å omorganisere enheter. Klikk på ikonet for å endre det, og bruk (×) for å fjerne en enhet fra rutenettet.",
custom_colors_description: "Tilpass fargene på ulike elementer i kortet for å matche din foretrukne stil eller tema.",
row_separator: "Radskiller",
add_row_separator: "Legg til radskiller",
separator_color: "Skillefarge",
separator_color_description: "Velg farge for radskilleren.",
transparent: "Gjennomsiktig",
set_color: "Sett farge",
separator_height: "Skillerhøyde",
separator_height_description: "Sett høyden på radskilleren i piksler.",
icon_gap_size: "Ikongapstørrelse",
icon_gap_description: "Sett gapet mellom ikoner i piksler.",
horizontal_alignment: "Horisontal justering",
vertical_alignment: "Vertikal justering",
more_info: "Mer info",
select_entity: "Velg en enhet",
entity_provides_image: "Denne enheten gir bildet for visningen.",
toggle: "Veksle",
navigate: "Naviger",
url: "Åpne URL",
trigger: "Utløs",
formatted_entities: "Formaterte enheter",
formatted_entities_description: "Rens enhetsverdier ved å runde av tall, erstatte understreker med mellomrom, kapitalisere ord og legge til komma i store tall.",
fuel_level_description: "Velg enheten som representerer drivstoffnivået til kjøretøyet ditt.",
fuel_range_description: "Velg enheten som representerer gjenværende drivstoffrekkevidde for kjøretøyet ditt.",
engine_on_description: "Velg enheten som indikerer om motoren til kjøretøyet ditt er i gang.",
main_image_height: "Hovedbildehøyde",
charging_image_height: "Ladebildehøyde",
main_image_section: "Hovedbildeinnstillinger",
charging_image_section: "Ladebildeinnstillinger",
layout_type: "Layouttype",
single_column: "Enkeltkolonne",
double_column: "Dobbeltkolonne",
engine_on_image: "Bilde for motor på",
engine_on_image_height: "Høyde på bilde for motor på",
engine_off_image: "Bilde for motor av",
engine_off_image_height: "Høyde på bilde for motor av",
engine_on_image_section: "Innstillinger for bilde med motor på",
use_bar_gradient: "Bruk gradientlinje",
bar_gradient_description: "Aktiver en fargegradient for fremdriftslinjen. Dette lar deg sette flere fargepunkter for en mer dynamisk visuell representasjon av kjøretøyets status.",
percentage: "Prosent",
color: "Farge",
add_gradient_stop: "Legg til gradientstoppunkt",
reset_all_colors: "Tilbakestill alle farger",
reset_all_icon_colors: "Tilbakestill alle ikonfarger",
settings: "Innstillinger",
customize: "Tilpass",
icon_grid: "Ikonrutenett",
customize: "Tilpass",
inactive_custom_label: "Inaktiv tilpasset etikett",
active_custom_label: "Aktiv tilpasset etikett",
custom_label_placeholder: "Skriv inn tilpasset etikett",
template_mode: "Mal-modus",
template_mode_description: "Skriv inn malkoden din nedenfor. For å avslutte mal-modus, velg en annen tilstand fra rullegardinmenyen ovenfor. Bruk {{ true }} og {{ false }} som uttrykk for å representere på- og av-tilstander."
},
device_class: {
battery: {
on: "Lav",
off: "Normal"
},
battery_charging: {
on: "Lader",
off: "Lader ikke"
},
carbon_monoxide: {
on: "Oppdaget",
off: "Klar"
},
cold: {
on: "Kald",
off: "Normal"
},
connectivity: {
on: "Tilkoblet",
off: "Frakoblet"
},
door: {
on: "Åpen",
off: "Lukket"
},
garage_door: {
on: "Åpen",
off: "Lukket"
},
gas: {
on: "Oppdaget",
off: "Klar"
},
heat: {
on: "Varm",
off: "Normal"
},
light: {
on: "Oppdaget",
off: "Klar"
},
lock: {
on: "Ulåst",
off: "Låst"
},
moisture: {
on: "Fuktig",
off: "Tørr"
},
motion: {
on: "Oppdaget",
off: "Klar"
},
moving: {
on: "Beveger seg",
off: "Stoppet"
},
occupancy: {
on: "Opptatt",
off: "Klar"
},
opening: {
on: "Åpen",
off: "Lukket"
},
plug: {
on: "Tilkoblet",
off: "Frakoblet"
},
power: {
on: "Oppdaget",
off: "Ingen strøm"
},
presence: {
on: "Hjemme",
off: "Borte"
},
problem: {
on: "Problem",
off: "OK"
},
running: {
on: "Kjører",
off: "Kjører ikke"
},
safety: {
on: "Usikker",
off: "Sikker"
},
smoke: {
on: "Oppdaget",
off: "Klar"
},
sound: {
on: "Oppdaget",
off: "Klar"
},
tamper: {
on: "Oppdaget",
off: "Klar"
},
update: {
on: "Tilgjengelig",
off: "Oppdatert"
},
vibration: {
on: "Oppdaget",
off: "Klar"
},
window: {
on: "Åpen",
off: "Lukket"
}
}
}

View File

@@ -0,0 +1,272 @@
export default {
common: {
battery: "Accu",
fuel: "Brandstof",
range: "Bereik",
charging: "Opladen",
mileage: "Kilometerstand",
location: "Locatie",
car_state: "Autostatus",
charge_limit: "Oplaadlimiet",
engine_on: "Motor aan",
away: "Afwezig",
charging_end_time: "Einde oplaadtijd",
charging_ending_soon: "Opladen eindigt binnenkort",
charging_ending_in: "Opladen eindigt over",
charging_until: "Opladen tot",
minutes: "minuten",
minute: "minuut",
hours: "uren",
hour: "uur",
state: {
default: {
on: "Aan",
off: "Uit"
}
}
},
vehicle_types: {
ev: "Elektrisch voertuig",
fuel: "Brandstofvoertuig",
hybrid: "Hybride"
},
editor: {
title: "Ultra Voertuigkaart",
card_title: "Kaarttitel",
vehicle_type: "Voertuigtype",
unit_type: "Eenheidstype",
show_battery: "Toon accu",
show_battery_range: "Toon accubereik",
show_fuel: "Toon brandstof",
show_fuel_range: "Toon brandstofbereik",
show_location: "Toon locatie",
show_mileage: "Toon kilometerstand",
show_car_state: "Toon autostatus",
show_charge_limit: "Toon oplaadlimiet",
hybrid_display_order: "Hybride weergavevolgorde",
fuel_first: "Brandstof eerst",
battery_first: "Accu eerst",
images: "Afbeeldingen",
main_image: "Hoofdafbeelding",
charging_image: "Oplaadafbeelding",
enter_image_url: "Voer afbeeldings-URL in",
upload_image: "Upload afbeelding",
entity_settings: "Entiteitsinstellingen",
battery_level: "Accuniveau",
battery_range: "Accubereik",
fuel_level: "Brandstofniveau",
fuel_range: "Brandstofbereik",
charging_status: "Oplaadstatus",
location: "Locatie",
mileage: "Kilometerstand",
car_state: "Autostatus",
charge_limit: "Oplaadlimiet",
engine_on: "Motor aan",
icon_grid: "Iconenraster",
add_entity: "Entiteit toevoegen",
add_row_separator: "Rijscheiding toevoegen",
custom_icons: "Aangepaste iconen",
inactive_icon: "Inactief icoon",
active_icon: "Actief icoon",
no_icon: "GEEN ICOON",
inactive_icon_color: "Inactieve icoonkleur",
active_icon_color: "Actieve icoonkleur",
icon_style: "Icoonstijl",
icon_size: "Icoongrootte",
icon_size_description: "Grootte van het icoon.",
icon_label_position: "Positie icoonlabel",
left: "Links",
top: "Boven",
right: "Rechts",
bottom: "Onder",
interaction: "Interactie",
colors: "Kleuren",
cardBackgroundColor: "Kaartachtergrondkleur",
barBackgroundColor: "Balkachtergrondkleur",
barBorderColor: "Balkrandkleur",
barFillColor: "Balkvulkleur",
limitIndicatorColor: "Limietindicatorkleur",
infoTextColor: "Infotekstkleur",
carStateTextColor: "Autostatustekstkleur",
rangeTextColor: "Bereiktekstkleur",
percentageTextColor: "Percentagetekstkleur",
none: "Geen",
local_url: "Lokaal/URL",
entity: "Entiteit",
search_entities: "Zoek entiteiten",
battery_level_description: "Selecteer de entiteit die het accuniveau van uw voertuig weergeeft.",
battery_range_description: "Selecteer de entiteit die het resterende bereik van uw elektrische voertuig weergeeft.",
charging_status_description: "Selecteer de entiteit die aangeeft of uw voertuig momenteel aan het opladen is.",
charge_limit_description: "Selecteer de entiteit die de ingestelde oplaadlimiet voor uw voertuig weergeeft.",
location_description: "Selecteer de entiteit die de huidige locatie van uw voertuig weergeeft.",
mileage_description: "Selecteer de entiteit die de totale kilometerstand of kilometertellerstand van uw voertuig weergeeft.",
car_state_description: "Selecteer de entiteit die de huidige status van uw voertuig weergeeft (bijv. geparkeerd, rijdend, opladen).",
icon_grid_description: "Voeg entiteiten toe aan het iconenraster. Zoek en selecteer entiteiten om toe te voegen. Gebruik de sleepgreep om entiteiten te herschikken. Klik op het icoon om het te wijzigen en gebruik (×) om een entiteit uit het raster te verwijderen.",
custom_colors_description: "Pas de kleuren van verschillende elementen in de kaart aan om te passen bij uw voorkeurssstijl of thema.",
row_separator: "Rijscheiding",
add_row_separator: "Rijscheiding toevoegen",
separator_color: "Scheidingskleur",
separator_color_description: "Kies de kleur voor de rijscheiding.",
transparent: "Transparant",
set_color: "Kleur instellen",
separator_height: "Scheidingshoogte",
separator_height_description: "Stel de hoogte van de rijscheiding in pixels in.",
icon_gap_size: "Icoonafstandgrootte",
icon_gap_description: "Stel de afstand tussen iconen in pixels in.",
horizontal_alignment: "Horizontale uitlijning",
vertical_alignment: "Verticale uitlijning",
more_info: "Meer info",
select_entity: "Selecteer een entiteit",
entity_provides_image: "Deze entiteit levert de afbeelding voor de weergave.",
toggle: "Schakelen",
navigate: "Navigeren",
url: "URL openen",
trigger: "Activeren",
formatted_entities: "Geformatteerde entiteiten",
formatted_entities_description: "Maak entiteitswaarden op door getallen af te ronden, underscores te vervangen door spaties, woorden te kapitaliseren en komma's toe te voegen aan grote getallen.",
fuel_level_description: "Selecteer de entiteit die het brandstofniveau van uw voertuig weergeeft.",
fuel_range_description: "Selecteer de entiteit die het resterende brandstofbereik van uw voertuig weergeeft.",
engine_on_description: "Selecteer de entiteit die aangeeft of de motor van uw voertuig momenteel draait.",
main_image_height: "Hoofdafbeeldingshoogte",
charging_image_height: "Oplaadafbeeldingshoogte",
main_image_section: "Hoofdafbeeldingsinstellingen",
charging_image_section: "Oplaadafbeeldingsinstellingen",
layout_type: "Lay-outtype",
single_column: "Enkele kolom",
double_column: "Dubbele kolom",
engine_on_image: "Afbeelding voor motor aan",
engine_on_image_height: "Hoogte van afbeelding voor motor aan",
engine_off_image: "Afbeelding voor motor uit",
engine_off_image_height: "Hoogte van afbeelding voor motor uit",
engine_on_image_section: "Instellingen voor afbeelding met motor aan",
use_bar_gradient: "Gebruik balkgradiënt",
bar_gradient_description: "Schakel een kleurgradiënt in voor de voortgangsbalk. Hiermee kunt u meerdere kleurstops instellen voor een meer dynamische visuele weergave van de voertuigstatus.",
percentage: "Percentage",
color: "Kleur",
add_gradient_stop: "Voeg gradiëntstop toe",
reset_all_colors: "Alle kleuren resetten",
reset_all_icon_colors: "Alle icoonkleuren resetten",
settings: "Instellingen",
icon_grid: "Iconenraster",
customize: "Aanpassen",
inactive_custom_label: "Inactief aangepast label",
active_custom_label: "Actief aangepast label",
custom_label_placeholder: "Voer aangepast label in",
template_mode: "Sjabloonmodus",
template_mode_description: "Voer hieronder uw sjablooncode in. Om de sjabloonmodus te verlaten, selecteert u een andere status uit de bovenstaande vervolgkeuzelijst. Gebruik {{ true }} en {{ false }} als uitdrukkingen om aan- en uit-toestanden weer te geven."
},
device_class: {
battery: {
on: "Laag",
off: "Normaal"
},
battery_charging: {
on: "Opladen",
off: "Niet opladen"
},
carbon_monoxide: {
on: "Gedetecteerd",
off: "Vrij"
},
cold: {
on: "Koud",
off: "Normaal"
},
connectivity: {
on: "Verbonden",
off: "Niet verbonden"
},
door: {
on: "Open",
off: "Gesloten"
},
garage_door: {
on: "Open",
off: "Gesloten"
},
gas: {
on: "Gedetecteerd",
off: "Vrij"
},
heat: {
on: "Heet",
off: "Normaal"
},
light: {
on: "Gedetecteerd",
off: "Vrij"
},
lock: {
on: "Ontgrendeld",
off: "Vergrendeld"
},
moisture: {
on: "Vochtig",
off: "Droog"
},
motion: {
on: "Gedetecteerd",
off: "Vrij"
},
moving: {
on: "Bewegend",
off: "Gestopt"
},
occupancy: {
on: "Bezet",
off: "Vrij"
},
opening: {
on: "Open",
off: "Gesloten"
},
plug: {
on: "Aangesloten",
off: "Niet aangesloten"
},
power: {
on: "Gedetecteerd",
off: "Geen stroom"
},
presence: {
on: "Thuis",
off: "Afwezig"
},
problem: {
on: "Probleem",
off: "OK"
},
running: {
on: "Actief",
off: "Inactief"
},
safety: {
on: "Onveilig",
off: "Veilig"
},
smoke: {
on: "Gedetecteerd",
off: "Vrij"
},
sound: {
on: "Gedetecteerd",
off: "Vrij"
},
tamper: {
on: "Gedetecteerd",
off: "Vrij"
},
update: {
on: "Beschikbaar",
off: "Bijgewerkt"
},
vibration: {
on: "Gedetecteerd",
off: "Vrij"
},
window: {
on: "Open",
off: "Gesloten"
}
}
}

View File

@@ -0,0 +1,272 @@
export default {
common: {
battery: "Batteri",
fuel: "Drivstoff",
range: "Rekkevidde",
charging: "Lading",
mileage: "Kilometerstand",
location: "Plassering",
car_state: "Bilstatus",
charge_limit: "Ladelimit",
engine_on: "Motor på",
away: "Borte",
charging_end_time: "Ladeslutt",
charging_ending_soon: "Lading avsluttast snart",
charging_ending_in: "Lading avsluttast om",
charging_until: "Lader til",
minutes: "minutt",
minute: "minutt",
hours: "timar",
hour: "time",
state: {
default: {
on: "På",
off: "Av"
}
}
},
vehicle_types: {
ev: "Elektrisk køyretøy",
fuel: "Drivstoffkøyretøy",
hybrid: "Hybrid"
},
editor: {
title: "Ultra Køyretøykort",
card_title: "Korttittel",
vehicle_type: "Køyretøytype",
unit_type: "Einingstype",
show_battery: "Vis batteri",
show_battery_range: "Vis batterirekkevidde",
show_fuel: "Vis drivstoff",
show_fuel_range: "Vis drivstoffrekkevidde",
show_location: "Vis plassering",
show_mileage: "Vis kilometerstand",
show_car_state: "Vis bilstatus",
show_charge_limit: "Vis ladelimit",
hybrid_display_order: "Hybrid visingsrekkjefølgje",
fuel_first: "Drivstoff først",
battery_first: "Batteri først",
images: "Bilete",
main_image: "Hovudbilete",
charging_image: "Ladebilete",
enter_image_url: "Skriv inn bilete-URL",
upload_image: "Last opp bilete",
entity_settings: "Einingsinnstillingar",
battery_level: "Batterinivå",
battery_range: "Batterirekkevidde",
fuel_level: "Drivstoffnivå",
fuel_range: "Drivstoffrekkevidde",
charging_status: "Ladestatus",
location: "Plassering",
mileage: "Kilometerstand",
car_state: "Bilstatus",
charge_limit: "Ladelimit",
engine_on: "Motor på",
icon_grid: "Ikonrutenett",
add_entity: "Legg til eining",
add_row_separator: "Legg til radskiljar",
custom_icons: "Tilpassa ikon",
inactive_icon: "Inaktivt ikon",
active_icon: "Aktivt ikon",
no_icon: "INGA IKON",
inactive_icon_color: "Inaktiv ikonfarge",
active_icon_color: "Aktiv ikonfarge",
icon_style: "Ikonstil",
icon_size: "Ikonstorleik",
icon_size_description: "Storleik på ikonet.",
icon_label_position: "Ikonetikettposisjon",
left: "Venstre",
top: "Topp",
right: "Høgre",
bottom: "Botn",
interaction: "Interaksjon",
colors: "Fargar",
cardBackgroundColor: "Kortbakgrunnsfarge",
barBackgroundColor: "Linjebakgrunnsfarge",
barBorderColor: "Linjekantfarge",
barFillColor: "Linjefyllfarge",
limitIndicatorColor: "Limitindikatorfarge",
infoTextColor: "Infotekstfarge",
carStateTextColor: "Bilstatustekstfarge",
rangeTextColor: "Rekkjeviddetekstfarge",
percentageTextColor: "Prosenttekstfarge",
none: "Ingen",
local_url: "Lokal/URL",
entity: "Eining",
search_entities: "Søk einingar",
battery_level_description: "Vel eininga som representerer batterinivået til køyretøyet ditt.",
battery_range_description: "Vel eininga som representerer attverande rekkevidde for det elektriske køyretøyet ditt.",
charging_status_description: "Vel eininga som indikerer om køyretøyet ditt ladar for augneblinken.",
charge_limit_description: "Vel eininga som representerer ladelimiten sett for køyretøyet ditt.",
location_description: "Vel eininga som gir den noverande plasseringa til køyretøyet ditt.",
mileage_description: "Vel eininga som representerer total køyrelengd eller kilometerstand for køyretøyet ditt.",
car_state_description: "Vel eininga som representerer den noverande tilstanden til køyretøyet ditt (t.d. parkert, køyrer, ladar).",
icon_grid_description: "Legg til einingar i ikonrutenettet. Søk og vel einingar å leggje til. Bruk drahandtaket for å omorganisere einingar. Klikk på ikonet for å endre det, og bruk (×) for å fjerne ei eining frå rutenettet.",
custom_colors_description: "Tilpass fargane på ulike element i kortet for å matche din føretrekte stil eller tema.",
row_separator: "Radskiljar",
add_row_separator: "Legg til radskiljar",
separator_color: "Skiljarfarge",
separator_color_description: "Vel farge for radskiljaren.",
transparent: "Gjennomsiktig",
set_color: "Set farge",
separator_height: "Skiljarhøgd",
separator_height_description: "Set høgda på radskiljaren i pikslar.",
icon_gap_size: "Ikongapstorleik",
icon_gap_description: "Set gapet mellom ikon i pikslar.",
horizontal_alignment: "Horisontal justering",
vertical_alignment: "Vertikal justering",
more_info: "Meir info",
select_entity: "Vel ei eining",
entity_provides_image: "Denne eininga gir biletet for visinga.",
toggle: "Veksle",
navigate: "Naviger",
url: "Opne URL",
trigger: "Utløys",
formatted_entities: "Formaterte einingar",
formatted_entities_description: "Reins einingsverdiar ved å runde av tal, erstatte understrek med mellomrom, kapitalisere ord og leggje til komma i store tal.",
fuel_level_description: "Vel eininga som representerer drivstoffnivået til køyretøyet ditt.",
fuel_range_description: "Vel eininga som representerer attverande drivstoffrekkevidde for køyretøyet ditt.",
engine_on_description: "Vel eininga som indikerer om motoren til køyretøyet ditt er i gang.",
main_image_height: "Hovudbiletehøgd",
charging_image_height: "Ladebiletehøgd",
main_image_section: "Hovudbiletinnstillingar",
charging_image_section: "Ladebiletinnstillingar",
layout_type: "Layouttype",
single_column: "Enkelkolonne",
double_column: "Dobbeltkolonne",
engine_on_image: "Bilete for motor på",
engine_on_image_height: "Høgd på bilete for motor på",
engine_off_image: "Bilete for motor av",
engine_off_image_height: "Høgd på bilete for motor av",
engine_on_image_section: "Innstillingar for bilete med motor på",
use_bar_gradient: "Bruk gradientlinje",
bar_gradient_description: "Aktiver ein fargegradient for framdriftslinjen. Dette lar deg setje fleire fargepunkt for ein meir dynamisk visuell representasjon av køyretøyet sin status.",
percentage: "Prosent",
color: "Farge",
add_gradient_stop: "Legg til gradientstoppunkt",
reset_all_colors: "Tilbakestill alle farger",
reset_all_icon_colors: "Tilbakestill alle ikonfarger",
settings: "Innstillinger",
icon_grid: "Ikonrutenett",
customize: "Tilpass",
inactive_custom_label: "Inaktiv tilpassa etikett",
active_custom_label: "Aktiv tilpassa etikett",
custom_label_placeholder: "Skriv inn tilpassa etikett",
template_mode: "Malskildringsmodus",
template_mode_description: "Skriv inn malskildringa di nedanfor. For å gå ut av malskildringsmodus, vel ein annan tilstand frå nedtrekkslista ovanfor. Bruk {{ true }} og {{ false }} som uttrykk for å representere på- og av-tilstandar."
},
device_class: {
battery: {
on: "Låg",
off: "Normal"
},
battery_charging: {
on: "Ladar",
off: "Ladar ikkje"
},
carbon_monoxide: {
on: "Oppdaga",
off: "Klart"
},
cold: {
on: "Kald",
off: "Normal"
},
connectivity: {
on: "Tilkopla",
off: "Fråkopla"
},
door: {
on: "Open",
off: "Lukka"
},
garage_door: {
on: "Open",
off: "Lukka"
},
gas: {
on: "Oppdaga",
off: "Klart"
},
heat: {
on: "Varm",
off: "Normal"
},
light: {
on: "Oppdaga",
off: "Klart"
},
lock: {
on: "Ulåst",
off: "Låst"
},
moisture: {
on: "Fuktig",
off: "Tørt"
},
motion: {
on: "Oppdaga",
off: "Klart"
},
moving: {
on: "Rører seg",
off: "Stoppa"
},
occupancy: {
on: "Opptatt",
off: "Klart"
},
opening: {
on: "Open",
off: "Lukka"
},
plug: {
on: "Tilkopla",
off: "Fråkopla"
},
power: {
on: "Oppdaga",
off: "Ingen straum"
},
presence: {
on: "Heime",
off: "Borte"
},
problem: {
on: "Problem",
off: "OK"
},
running: {
on: "Køyrer",
off: "Køyrer ikkje"
},
safety: {
on: "Utrygt",
off: "Trygt"
},
smoke: {
on: "Oppdaga",
off: "Klart"
},
sound: {
on: "Oppdaga",
off: "Klart"
},
tamper: {
on: "Oppdaga",
off: "Klart"
},
update: {
on: "Tilgjengeleg",
off: "Oppdatert"
},
vibration: {
on: "Oppdaga",
off: "Klart"
},
window: {
on: "Open",
off: "Lukka"
}
}
}

View File

@@ -0,0 +1,272 @@
export default {
common: {
battery: "Batteri",
fuel: "Bränsle",
range: "Räckvidd",
charging: "Laddar",
mileage: "Körsträcka",
location: "Plats",
car_state: "Bilstatus",
charge_limit: "Laddgräns",
engine_on: "Motor på",
away: "Borta",
charging_end_time: "Laddning slutar",
charging_ending_soon: "Laddning avslutas snart",
charging_ending_in: "Laddning avslutas om",
charging_until: "Laddar till",
minutes: "minuter",
minute: "minut",
hours: "timmar",
hour: "timme",
state: {
default: {
on: "På",
off: "Av"
}
}
},
vehicle_types: {
ev: "Elfordon",
fuel: "Bränslefordon",
hybrid: "Hybrid"
},
editor: {
title: "Ultra Fordonskort",
card_title: "Korttitel",
vehicle_type: "Fordonstyp",
unit_type: "Enhetstyp",
show_battery: "Visa batteri",
show_battery_range: "Visa batteriräckvidd",
show_fuel: "Visa bränsle",
show_fuel_range: "Visa bränsleräckvidd",
show_location: "Visa plats",
show_mileage: "Visa körsträcka",
show_car_state: "Visa bilstatus",
show_charge_limit: "Visa laddgräns",
hybrid_display_order: "Hybridvisningsordning",
fuel_first: "Bränsle först",
battery_first: "Batteri först",
images: "Bilder",
main_image: "Huvudbild",
charging_image: "Laddningsbild",
enter_image_url: "Ange bild-URL",
upload_image: "Ladda upp bild",
entity_settings: "Enhetsinställningar",
battery_level: "Batterinivå",
battery_range: "Batteriräckvidd",
fuel_level: "Bränslenivå",
fuel_range: "Bränsleräckvidd",
charging_status: "Laddningsstatus",
location: "Plats",
mileage: "Körsträcka",
car_state: "Bilstatus",
charge_limit: "Laddgräns",
engine_on: "Motor på",
icon_grid: "Ikonrutnät",
add_entity: "Lägg till enhet",
add_row_separator: "Lägg till radavskiljare",
custom_icons: "Anpassade ikoner",
inactive_icon: "Inaktiv ikon",
active_icon: "Aktiv ikon",
no_icon: "INGEN IKON",
inactive_icon_color: "Inaktiv ikonfärg",
active_icon_color: "Aktiv ikonfärg",
icon_style: "Ikonstil",
icon_size: "Ikonstorlek",
icon_size_description: "Storlek på ikonen.",
icon_label_position: "Ikonetikettposition",
left: "Vänster",
top: "Topp",
right: "Höger",
bottom: "Botten",
interaction: "Interaktion",
colors: "Färger",
cardBackgroundColor: "Kortbakgrundsfärg",
barBackgroundColor: "Stapelbakgrundsfärg",
barBorderColor: "Stapelkantfärg",
barFillColor: "Stapelfyllnadsfärg",
limitIndicatorColor: "Gränsindikatorsfärg",
infoTextColor: "Infotextfärg",
carStateTextColor: "Bilstatustextfärg",
rangeTextColor: "Räckviddsextfärg",
percentageTextColor: "Procenttextfärg",
none: "Ingen",
local_url: "Lokal/URL",
entity: "Enhet",
search_entities: "Sök enheter",
battery_level_description: "Välj enheten som representerar batterinivån för ditt fordon.",
battery_range_description: "Välj enheten som representerar återstående räckvidd för ditt elfordon.",
charging_status_description: "Välj enheten som indikerar om ditt fordon för närvarande laddas.",
charge_limit_description: "Välj enheten som representerar laddgränsen inställd för ditt fordon.",
location_description: "Välj enheten som ger den aktuella platsen för ditt fordon.",
mileage_description: "Välj enheten som representerar total körsträcka eller vägmätarställning för ditt fordon.",
car_state_description: "Välj enheten som representerar det aktuella tillståndet för ditt fordon (t.ex. parkerad, kör, laddar).",
icon_grid_description: "Lägg till enheter i ikonrutnätet. Sök och välj enheter att lägga till. Använd draghandtaget för att omorganisera enheter. Klicka på ikonen för att ändra den och använd (×) för att ta bort en enhet från rutnätet.",
custom_colors_description: "Anpassa färgerna på olika element i kortet för att matcha din föredragna stil eller tema.",
row_separator: "Radavskiljare",
add_row_separator: "Lägg till radavskiljare",
separator_color: "Avskiljarfärg",
separator_color_description: "Välj färg för radavskiljaren.",
transparent: "Transparent",
set_color: "Ställ in färg",
separator_height: "Avskiljarhöjd",
separator_height_description: "Ställ in höjden på radavskiljaren i pixlar.",
icon_gap_size: "Ikonavståndsstorlek",
icon_gap_description: "Ställ in avståndet mellan ikoner i pixlar.",
horizontal_alignment: "Horisontell justering",
vertical_alignment: "Vertikal justering",
more_info: "Mer info",
select_entity: "Välj en enhet",
entity_provides_image: "Denna enhet tillhandahåller bilden för visningen.",
toggle: "Växla",
navigate: "Navigera",
url: "Öppna URL",
trigger: "Utlös",
formatted_entities: "Formaterade enheter",
formatted_entities_description: "Rensa enhetsvärden genom att avrunda tal, ersätta understreck med mellanslag, kapitalisera ord och lägga till kommatecken i stora tal.",
fuel_level_description: "Välj enheten som representerar bränslenivån för ditt fordon.",
fuel_range_description: "Välj enheten som representerar återstående bränsleräckvidd för ditt fordon.",
engine_on_description: "Välj enheten som indikerar om motorn på ditt fordon för närvarande är igång.",
main_image_height: "Huvudbildhöjd",
charging_image_height: "Laddningsbildhöjd",
main_image_section: "Huvudbildinställningar",
charging_image_section: "Laddningsbildinställningar",
layout_type: "Layouttyp",
single_column: "Enkel kolumn",
double_column: "Dubbel kolumn",
engine_on_image: "Bild för motor på",
engine_on_image_height: "Höjd på bild för motor på",
engine_off_image: "Bild för motor av",
engine_off_image_height: "Höjd på bild för motor av",
engine_on_image_section: "Inställningar för bild med motor på",
use_bar_gradient: "Använd gradientfält",
bar_gradient_description: "Aktivera en färggradient för förloppsfältet. Detta låter dig ställa in flera färgstopp för en mer dynamisk visuell representation av fordonets status.",
percentage: "Procent",
color: "Färg",
add_gradient_stop: "Lägg till gradientstop",
reset_all_colors: "Återställ alla färger",
reset_all_icon_colors: "Återställ alla ikonfärger",
settings: "Inställningar",
icon_grid: "Ikonrutnät", // This entry already exists
customize: "Anpassa", // This entry already exists
inactive_custom_label: "Inaktiv anpassad etikett",
active_custom_label: "Aktiv anpassad etikett",
custom_label_placeholder: "Ange anpassad etikett",
template_mode: "Mallläge",
template_mode_description: "Ange din mallkod nedan. För att avsluta mallläget, välj ett annat tillstånd från rullgardinsmenyn ovan. Använd {{ true }} och {{ false }} som uttryck för att representera på- och av-tillstånd."
},
device_class: {
battery: {
on: "Låg",
off: "Normal"
},
battery_charging: {
on: "Laddar",
off: "Laddar inte"
},
carbon_monoxide: {
on: "Detekterad",
off: "Klar"
},
cold: {
on: "Kall",
off: "Normal"
},
connectivity: {
on: "Ansluten",
off: "Frånkopplad"
},
door: {
on: "Öppen",
off: "Stängd"
},
garage_door: {
on: "Öppen",
off: "Stängd"
},
gas: {
on: "Detekterad",
off: "Klar"
},
heat: {
on: "Varm",
off: "Normal"
},
light: {
on: "Detekterad",
off: "Klar"
},
lock: {
on: "Olåst",
off: "Låst"
},
moisture: {
on: "Fuktig",
off: "Torr"
},
motion: {
on: "Detekterad",
off: "Klar"
},
moving: {
on: "Rör sig",
off: "Stillastående"
},
occupancy: {
on: "Upptagen",
off: "Klar"
},
opening: {
on: "Öppen",
off: "Stängd"
},
plug: {
on: "Inkopplad",
off: "Urkopplad"
},
power: {
on: "Detekterad",
off: "Ingen ström"
},
presence: {
on: "Hemma",
off: "Borta"
},
problem: {
on: "Problem",
off: "OK"
},
running: {
on: "Kör",
off: "Kör inte"
},
safety: {
on: "Osäker",
off: "Säker"
},
smoke: {
on: "Detekterad",
off: "Klar"
},
sound: {
on: "Detekterad",
off: "Klar"
},
tamper: {
on: "Detekterad",
off: "Klar"
},
update: {
on: "Tillgänglig",
off: "Uppdaterad"
},
vibration: {
on: "Detekterad",
off: "Klar"
},
window: {
on: "Öppet",
off: "Stängt"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
// Upon any change to this file update 'import ... from 'version.js?v=0'' with a newer version number.
// In all files importing this file.
let version = 'undefined';
function setVersion(value) {
version = value;
}
export { version, setVersion };

View File

@@ -0,0 +1,257 @@
// I Used weather-card-editor.js from Weather Card as template
// https://github.com/bramkragten/weather-card
// 2023-02-25 card editor is likely broken as it doesn't show entities,
const fireEvent = (node, type, detail, options) => {
options = options || {};
detail = detail === null || detail === undefined ? {} : detail;
const event = new Event(type, {
bubbles: options.bubbles === undefined ? true : options.bubbles,
cancelable: Boolean(options.cancelable),
composed: options.composed === undefined ? true : options.composed,
});
event.detail = detail;
node.dispatchEvent(event);
return event;
};
if (
!customElements.get("ha-switch") &&
customElements.get("paper-toggle-button")
) {
customElements.define("ha-switch", customElements.get("paper-toggle-button"));
}
const LitElement = customElements.get("hui-masonry-view") ? Object.getPrototypeOf(customElements.get("hui-masonry-view")) : Object.getPrototypeOf(customElements.get("hui-view"));
const html = LitElement.prototype.html;
const css = LitElement.prototype.css;
const HELPERS = window.loadCardHelpers();
export class AirVisualCardEditor extends LitElement {
setConfig(config) {
this._config = { ...config };
}
static get properties() {
return { hass: {}, _config: {} };
}
get _air_pollution_level() {
return this._config.air_pollution_level || "sensor.u_s_air_pollution_level";
}
get _air_quality_index() {
return this._config.air_quality_index || "sensor.u_s_air_quality_index";
}
get _main_pollutant() {
return this._config.main_pollutant || "sensor.u_s_main_pollutant";
}
get _country() {
return this._config.country || "";
}
get _city() {
return this._config.city || "";
}
get _icons() {
return this._config.icons || "/hacsfiles/air-visual-card";
}
get _weather() {
return this._config.weather || "weather.home";
}
get _speed_unit() {
return this._config.speed_unit || "mp/h";
}
get _unit_of_measurement() {
return this._config.unit_of_measurement || "AQI";
}
get _hide_title() {
return this._config.hide_title !== false;
}
get _hide_face() {
return this._config.hide_face !== true;
}
get _hide_weather() {
return this._config.hide_weather !== false;
}
// WHAT DOES THIS DO?
firstUpdated() {
HELPERS.then(help => {
if (help.importMoreInfoControl) {
help.importMoreInfoControl("fan");
}
})
}
render() {
if (!this.hass) {
return html``;
}
// WHAT DOES THIS DO?
const entities = Object.keys(this.hass.states).filter(
(eid) => eid.substr(0, eid.indexOf(".")) === "sensor"
);
return html`
<div class="card-config">
<div>
${customElements.get("ha-entity-picker")
? html`
<ha-entity-picker
label="Air Pollution Level Sensor Entity"
.hass="${this.hass}"
.value="${this._air_pollution_level}"
.configValue=${"air_pollution_level"}
domain-filter="sensor"
@change="${this._valueChanged}"
allow-custom-entity
></ha-entity-picker>
`
: html``}
<ha-entity-picker
label="Air Quality Index Sensor"
.hass="${this.hass}"
.value="${this._air_quality_index}"
.configValue=${"air_quality_index"}
domain-filter="sensor"
@change="${this._valueChanged}"
allow-custom-entity
></ha-entity-picker>
<ha-entity-picker
label="Main Pollutant Sensor"
.hass="${this.hass}"
.value="${this._main_pollutant}"
.configValue=${"main_pollutant"}
domain-filter="sensor"
@change="${this._valueChanged}"
allow-custom-entity
></ha-entity-picker>
<ha-entity-picker
label="Weather Entity (Optional)"
.hass="${this.hass}"
.value="${this._weather}"
.configValue=${"weather"}
@change="${this._valueChanged}"
allow-custom-entity
></ha-entity-picker>
<paper-input
label="City Name (Optional)"
.value="${this._city}"
.configValue="${"city"}"
@value-changed="${this._valueChanged}"
></paper-input>
<paper-input
label="Country Name (Optional)"
.value="${this._country}"
.configValue="${"country"}"
@value-changed="${this._valueChanged}"
></paper-input>
<paper-input
label="Speed Unit (Optional)"
.value="${this._speed_unit}"
.configValue="${"speed_unit"}"
@value-changed="${this._valueChanged}"
></paper-input>
<paper-input
label="Unit of Measurement (Optional)"
.value="${this._unit_of_measurement}"
.configValue="${"unit_of_measurement"}"
@value-changed="${this._valueChanged}"
></paper-input>
<paper-input
label="Icons location (Optional)"
.value="${this._icons}"
.configValue="${"icons"}"
@value-changed="${this._valueChanged}"
></paper-input>
<div class="switches">
<div class="switch">
<ha-switch
.checked=${this._hide_title}
.configValue="${"hide_title"}"
@change="${this._valueChanged}"
></ha-switch
><span>Hide Title</span>
</div>
<div class="switch">
<ha-switch
.checked=${this._hide_weather}
.configValue="${"hide_weather"}"
@change="${this._valueChanged}"
></ha-switch
><span>Hide Weather</span>
</div>
<div class="switch">
<ha-switch
.checked=${this._hide_face}
.configValue="${"hide_face"}"
@change="${this._valueChanged}"
></ha-switch
><span>Hide Face</span>
</div>
</div>
</div>
</div>
`;
}
_valueChanged(ev) {
if (!this._config || !this.hass) {
return;
}
const target = ev.target;
if (this[`_${target.configValue}`] === target.value) {
return;
}
if (target.configValue) {
if (target.value === "") {
delete this._config[target.configValue];
} else {
this._config = {
...this._config,
[target.configValue]:
target.checked !== undefined ? target.checked : target.value,
};
}
}
fireEvent(this, "config-changed", { config: this._config });
}
static get styles() {
return css`
.switches {
margin: 8px 0;
display: flex;
justify-content: space-between;
}
.switch {
display: flex;
align-items: center;
justify-items: center;
}
.switches span {
padding: 0 16px;
}
`;
}
}
customElements.define("air-visual-card-editor", AirVisualCardEditor);

View File

@@ -0,0 +1,518 @@
// To study:
// Plant Picture Card: https://github.com/badguy99/PlantPictureCard/blob/master/dist/PlantPictureCard.js
// UPDATE FOR EACH RELEASE!!! From aftership-card. Version # is hard-coded for now.
console.info(
`%c AIR-VISUAL-CARD \n%c Version 2.0.3`,
'color: orange; font-weight: bold; background: black',
'color: white; font-weight: bold; background: dimgray',
);
// From weather-card
const fireEvent = (node, type, detail, options) => {
options = options || {};
detail = detail === null || detail === undefined ? {} : detail;
const event = new Event(type, {
bubbles: options.bubbles === undefined ? true : options.bubbles,
cancelable: Boolean(options.cancelable),
composed: options.composed === undefined ? true : options.composed
});
event.detail = detail;
node.dispatchEvent(event);
return event;
};
let oldStates = {}
class AirVisualCard extends HTMLElement {
// Placeholder for lovelace card editor
// static getConfigElement() {
// return document.createElement("air-visual-card-editor");
// }
static async getConfigElement() {
await import("./air-visual-card-editor.js");
return document.createElement("air-visual-card-editor");
}
static getStubConfig() {
return { air_pollution_level: "sensor.u_s_air_pollution_level",
air_quality_index: "sensor.u_s_air_quality_index",
main_pollutant: "sensor.u_s_main_pollutant",
weather: "weather.home",
hide_weather: 1,
hide_title: 1,
unit_of_measurement: "AQI",
hide_face: 0
}
}
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
setConfig(config) {
const root = this.shadowRoot;
if (root.lastChild) root.removeChild(root.lastChild);
const re = new RegExp("(sensor)");
if (!re.test(config.air_quality_index.split('.')[0])) throw new Error('Please define a sensor entity.');
const cardConfig = Object.assign({}, config);
const card = document.createElement('ha-card');
const content = document.createElement('div');
const style = document.createElement('style');
style.textContent = `
ha-card {
/* sample css */
background-color: rgba(0,0,0,0);
box-shadow: none;
overflow: hidden;
}
body {
margin: 0;
font-family: Arial, Helvetica, sans-serif;
}
.grid-container {
display: grid;
grid-template-areas: "city city city" "face aqiSensor aplSensor" "face country mainPollutantSensor" "temp humidity wind";
grid-template-columns: 85px 30% auto;
grid-template-rows: auto auto auto auto;
grid-gap: 0;
text-align: center;
}
.city {
grid-area: city;
font-size: 1.6em;
font-weight: bold;
color: var(--primary-text-color);
filter: opacity(80%);
padding-bottom: 5px;
}
.face {
border-radius: var(--ha-card-border-radius) 0px 0px ${cardConfig.hide_weather ? 'var(--ha-card-border-radius)' : '0px'};
grid-area: face;
justify-items: center;
align-items: center;
display: grid;
}
.face img {
display: block;
height: 60px;
}
.aqiSensor {
grid-area: aqiSensor;
font-size: 3em;
height: 60px;
padding-top: 4px;
display: flex;
align-items: center;
justify-content: center;
border-radius: ${cardConfig.hide_face ? 'var(--ha-card-border-radius)' : '0px'} 0px 0px 0px;
}
.aplSensor {
grid-area: aplSensor;
font-size: 1.4em;
display: flex;
align-items: center;
justify-content: center;
border-radius: 0px var(--ha-card-border-radius) 0px 0px;
}
.mainPollutantSensor {
grid-area: mainPollutantSensor;
border-radius: 0px 0px ${cardConfig.hide_weather ? 'var(--ha-card-border-radius)' : '0px'} 0px ;
display: flex;
align-items: center;
justify-content: center;
padding: 0px 0px 5px 0px;
}
.mainPollutantSensorText {
background-color: white;
border-radius: 4px;
font-size: 0.9em;
font-weight: bold;
width: 70%;
}
.country {
grid-area: country;
border-radius: 0px 0px 0px ${cardConfig.hide_face ? 'var(--ha-card-border-radius)' : '0px'};
}
.temp {
grid-area: temp;
text-align: left;
font-size: 1.2em;
background-color: rgba(255,255,255,0.2);
color: var(--text-color);
border-radius: 0px 0px 0px var(--ha-card-border-radius);
border-bottom: 1px solid rgba(230, 230, 230, 1);
border-left: 1px solid rgba(230, 230, 230, 1);
border-right: 1px solid rgba(230, 230, 230, 1);
display: flex;
align-items: center;
justify-content: center;
}
.temp img {
width: 34px;
padding-right: 2px;
}
.humidity {
grid-area: humidity;
color: var(--text-color);
border-bottom: 1px solid rgba(230, 230, 230, 1);
background-color: rgba(255,255,255,0.2);
display: flex;
align-items: center;
justify-content: center;
padding: 5px 0px 5px 0px;
}
.humidity img {
height: 25px;
padding-right: 2px;
}
.wind {
grid-area: wind;
background-color: rgba(255,255,255,0.2);
color: var(--text-color);
border-radius: 0px 0px var(--ha-card-border-radius) 0px;
border-bottom: 1px solid rgba(230, 230, 230, 1);
border-right: 1px solid rgba(230, 230, 230, 1);
display: flex;
align-items: center;
justify-content: center;
}
.wind img {
height: 14px;
padding-right: 2px;
}
`
content.innerHTML = `
<div id='content'>
</div>
`;
card.appendChild(content);
card.appendChild(style);
root.appendChild(card);
oldStates = {}
this._config = cardConfig;
}
shouldNotUpdate(config, hass) {
let clone = JSON.parse(JSON.stringify(config))
delete clone["city"]
delete clone["type"]
delete clone["icons"]
delete clone["hide_title"]
delete clone["hide_face"]
delete clone["hide_weather"]
delete clone["weather"]
delete clone["speed_unit"]
let states = {}
for (let entity of Object.values(clone)) {
states[entity] = hass.states[entity]
}
if (JSON.stringify(oldStates) === JSON.stringify(states)) {
return true
}
oldStates = states
return false
}
set hass(hass) {
const config = this._config;
const root = this.shadowRoot;
const card = root.lastChild;
if (this.shouldNotUpdate(config, hass)) {
return
}
const hideTitle = config.hide_title ? 1 : 0;
const hideFace = config.hide_face ? 1 : 0;
const hideAQI = config.hide_aqi ? 1 : 0;
const hideAPL = config.hide_apl ? 1 : 0;
const hideWeather = config.hide_weather || !config.weather ? 1 : 0;
const speedUnit = config.speed_unit || 'mp/h';
// points to local directory created by HACS installation
const iconDirectory = config.icons || "/hacsfiles/air-visual-card";
const country = config.country || 'US';
const city = config.city || '';
const weatherEntity = config.weather || '';
// value is used as a string instead of integer in order for
const aqiSensor = { name: 'aqiSensor', config: config.air_quality_index || null, value: 0 };
const aplSensor = { name: 'aplSensor', config: config.air_pollution_level || null, value: 0 };
const mainPollutantSensor = { name: 'mainPollutantSensor', config: config.main_pollutant || null, value: 0 };
const sensorList = [aqiSensor, aplSensor, mainPollutantSensor];
const unitOfMeasurement = config.unit_of_measurement || 'AQI';
const AQIbgColor = {
'1': `#B0E867`,
'2': '#E3C143',
'3': '#E48B4E',
'4': '#E45F5E',
'5': '#986EA9',
'6': '#A5516B',
};
const AQIfaceColor = {
'1': `#A8E05F`,
'2': '#FDD64B',
'3': '#FF9B57',
'4': '#FE6A69',
'5': '#A97ABC',
'6': '#A87383',
};
const AQIfontColor = {
'1': `#718B3A`,
'2': '#A57F23',
'3': '#B25826',
'4': '#AF2C3B',
'5': '#634675',
'6': '#683E51',
};
const weatherIcons = {
'clear-night': 'mdi:weather-night',
'cloudy': 'mdi:weather-cloudy',
'fog': 'mdi:weather-fog',
'hail': 'mdi:weather-hail',
'lightning': 'mdi:weather-lightning',
'lightning-rainy': 'mdi:weather-lightning-rainy',
'partlycloudy': 'mdi:weather-partly-cloudy',
'pouring': 'mdi:weather-pouring',
'rainy': 'mdi:weather-rainy',
'snowy': 'mdi:weather-snowy',
'snowy-rainy': 'mdi:weather-snowy-rainy',
'sunny': 'mdi:weather-sunny',
'windy': 'mdi:weather-windy',
'windy-variant': `mdi:weather-windy-variant`,
'exceptional': '!!',
}
const weatherSVG = {
'clear-night': 'night-clear-sky',
'cloudy': 'scattered-clouds',
'fog': 'scattered-clouds',
'hail': 'rain',
'lightning': 'rain',
'lightning-rainy': 'rain',
'partlycloudy': 'new-clouds',
'pouring': 'rain',
'rainy': 'rain',
'snowy': 'snow',
'snowy-rainy': 'snow',
'sunny': 'clear-sky',
'windy': 'scattered-clouds',
'windy-variant': `scattered-clouds`,
'exceptional': 'snow',
}
// WAQI sensor-specific stuff
// AirVisual sensors have the APL description as part of the sensor state, but WAQI doesn't. These APL states will be used as backup if AirVisual sensors is not used.
const APLdescription = {
'1': 'Good',
'2': 'Moderate',
'3': 'Unhealthy for Sensitive Groups',
'4': 'Unhealthy',
'5': 'Very Unhealthy',
'6': 'Hazardous',
}
const pollutantUnitValue = {
'pm25': 'µg/m³',
'pm10': 'µg/m³',
'o3': 'ppb',
'no2': 'ppb',
'so2': 'ppb',
}
const mainPollutantValue = {
'p2': 'PM2.5',
'pm25': 'PM2.5',
'pm10': 'PM10',
'o3': 'Ozone',
'no2': 'Nitrogen Dioxide',
'so2': 'Sulfur Dioxide',
}
const mainAirVisualPollutantValue = {
'p2': 'PM2.5',
'p1': 'PM10',
'co': 'Carbon Monoxide',
'o3': 'Ozone',
'n2': 'Nitrogen Dioxide',
's2': 'Sulfur Dioxide',
}
let currentCondition = '';
let humidity = '';
let windSpeed = '';
let tempValue = '';
let pollutantUnit = '';
let apl = '';
let mainPollutant = '';
let getAQI = function () {
switch (true) {
case (aqiSensor.value <= 50):
return '1'; // return string '1' to pull appropriate AQI icon filename ('ic-face-1.svg') in HTML
case (aqiSensor.value <= 100):
return '2';
case (aqiSensor.value <= 150):
return '3';
case (aqiSensor.value <= 200):
return '4';
case (aqiSensor.value <= 300):
return '5';
case (aqiSensor.value <= 9999):
return '6';
default:
return '1';
}
};
var i;
// Use this section to assign values (real or placeholder), after doing validation check
for (i = 0; i < sensorList.length; i++) {
if (typeof hass.states[sensorList[i].config] == "undefined") { continue; }
// if Main Pollutant is an Airvisual sensor, else if if it is an WAQI sensor
if (typeof hass.states[mainPollutantSensor.config] != "undefined") {
if (typeof hass.states[mainPollutantSensor.config].attributes['pollutant_unit'] != "undefined") {
pollutantUnit = hass.states[mainPollutantSensor.config].attributes['pollutant_unit'];
mainPollutant = mainAirVisualPollutantValue[hass.states[mainPollutantSensor.config].attributes['pollutant_symbol']];
} else if (typeof hass.states[mainPollutantSensor.config].attributes['dominentpol'] != "undefined") {
pollutantUnit = pollutantUnitValue[hass.states[mainPollutantSensor.config].attributes['dominentpol']];
mainPollutant = mainPollutantValue[hass.states[mainPollutantSensor.config].attributes['dominentpol']];
} else {
pollutantUnit = 'pollutant unit';
mainPollutant = 'main pollutant';
}
}
if (typeof hass.states[aqiSensor.config] != "undefined") {
aqiSensor.value = hass.states[aqiSensor.config].state;
}
// Check if APL is an WAQI sensor (because the state is an integer). Returns 'NaN' if it is not a number
if (typeof hass.states[aplSensor.config] != "undefined") {
let aplParse = parseInt(hass.states[aplSensor.config].state)
if (!isNaN(aplParse)) {
apl = APLdescription[getAQI()];
} else {
let aplState = hass.states[aplSensor.config].state;
apl = hass.localize("component.sensor.state.airvisual__pollutant_level." + aplState)
}
}
};
let faceHTML = ``;
let card_content = `<div class="grid-container">`;
if (!hideTitle) {
card_content += `<div class="city">${city} Air Quality Index</div>`;
}
if (weatherEntity.split('.')[0] == 'weather' && hass.states[weatherEntity]) {
tempValue = hass.states[weatherEntity].attributes['temperature'] + 'º';
currentCondition = hass.states[weatherEntity].state;
humidity = hass.states[weatherEntity].attributes['humidity'] + '%';
windSpeed = hass.states[weatherEntity].attributes['wind_speed'] + ' ' + speedUnit;
}
if (!hideWeather) {
card_content += `
<div class="temp" id="temp"><img src="${iconDirectory}/ic-w-${weatherSVG[currentCondition]}.svg"></img>${tempValue}</div>
<div class="humidity" id="humidity"><img src="${iconDirectory}/ic-humidity.svg"></img>${humidity}</div>
<div class="wind" id="wind"><img src="${iconDirectory}/ic-wind.svg"></img> ${windSpeed}</div>
`;
}
if (!hideFace){
card_content += `
<div class="face" id="face" style="background-color: ${AQIfaceColor[getAQI()]};">
<img src="${iconDirectory}/ic-face-${getAQI()}.svg"></img>
</div>
`;
}
if (!hideAQI){
card_content += `
<div class="aqiSensor" id="aqiSensor" style="background-color: ${AQIbgColor[getAQI()]}; color: ${AQIfontColor[getAQI()]}">
${aqiSensor.value}</div>
<div class="country" style="background-color: ${AQIbgColor[getAQI()]}; color: ${AQIfontColor[getAQI()]}">${country} ${unitOfMeasurement}</div>
`;
}
if (!hideAPL){
card_content += `
<div class="aplSensor" id="aplSensor" style="background-color: ${AQIbgColor[getAQI()]}; color: ${AQIfontColor[getAQI()]}">
${apl}
</div>
<div class="mainPollutantSensor" id="mainPollutantSensor" style="background-color: ${AQIbgColor[getAQI()]}; color: ${AQIfontColor[getAQI()]}">
<div class="mainPollutantSensorText">${mainPollutant} | ${pollutantUnit}</div>
</div>
`;
}
card_content += `
</div>
`;
root.lastChild.hass = hass;
root.getElementById('content').innerHTML = card_content;
// hard-coded version of click event
if (!hideFace){
card.querySelector('#face').addEventListener('click', event => { // when selecting HTML id, do not use dash '-'
fireEvent(this, "hass-more-info", { entityId: aqiSensor.config });
});
}
if (!hideAQI){
card.querySelector('#aqiSensor').addEventListener('click', event => { // when selecting HTML id, do not use dash '-'
fireEvent(this, "hass-more-info", { entityId: aqiSensor.config });
});
}
if (!hideAPL){
card.querySelector('#aplSensor').addEventListener('click', event => { // when selecting HTML id, do not use dash '-'
fireEvent(this, "hass-more-info", { entityId: aplSensor.config });
});
card.querySelector('#mainPollutantSensor').addEventListener('click', event => { // when selecting HTML id, do not use dash '-'
fireEvent(this, "hass-more-info", { entityId: mainPollutantSensor.config });
});
}
}
// The height of your card. Home Assistant uses this to automatically
// distribute all cards over the available columns.
getCardSize() {
return 1;
}
}
customElements.define('air-visual-card', AirVisualCard);
// Configure the preview in the Lovelace card picker
// https://developers.home-assistant.io/docs/frontend/custom-ui/lovelace-custom-card/
window.customCards = window.customCards || [];
window.customCards.push({
type: 'air-visual-card',
name: 'Air Visual Card',
preview: false,
description: 'This is a Home Assistant Lovelace card that uses the AirVisual Sensor to provide air quality index (AQI) data and creates a card like the ones found on AirVisual website. Requires the AirVisual Sensor to be setup. Tested with Yahoo and Darksky Weather component.'
});

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><g fill="none" fill-rule="evenodd"><path d="M0 48h48V0H0z"/><g fill="#718B3A"><path d="M22.579 30.814c.512.148.986.22 1.447.22.46 0 .934-.072 1.447-.22a.378.378 0 0 0 .076-.693.373.373 0 0 0-.284-.03c-.89.257-1.586.257-2.477 0a.377.377 0 0 0-.21.724"/><path d="M40.139 24.513a1.36 1.36 0 0 0-.924-.238c.377-1.81.637-3.614.777-5.363.382-4.79-.863-8.887-3.6-11.849-2.92-3.158-7.437-4.97-12.392-4.97-1.258 0-2.374.124-3.007.242a8.88 8.88 0 0 1-.759-.438l-.051-.035a.19.19 0 0 0-.26.052l-.334.492a.187.187 0 0 0-.03.144c.01.05.04.094.082.12l.054.035c.856.561 1.79.983 2.561 1.157.875.197 1.311.622 1.493.858l.032.04a.19.19 0 0 0 .236.053l.532-.278a.188.188 0 0 0 .065-.277l-.042-.06c-.172-.24-.653-.795-1.595-1.132.342-.019.783-.033 1.023-.033 4.697 0 8.963 1.701 11.701 4.668 2.59 2.807 3.719 6.554 3.353 11.137a43.37 43.37 0 0 1-.944 6.087l-.051.27a.254.254 0 0 0 .247.3h.362a.255.255 0 0 0 .154-.054l.057-.045c.245-.187.546-.236.716-.115.343.242.35 1.053.019 2.064l-.335 1.03-.01.027c-.192.595-.39 1.21-.637 1.943-.389 1.152-1.092 1.899-1.898 2.024l.063-.145c.047-.11.095-.22.142-.336a.255.255 0 0 0-.143-.327l-.408-.16a.255.255 0 0 0-.324.141c-1.775 4.454-3.995 7.823-6.986 10.603-1.625 1.51-3.206 1.82-5.079 1.82-1.872 0-3.453-.31-5.079-1.821-2.992-2.78-5.211-6.149-6.985-10.602a.253.253 0 0 0-.326-.14l-.407.16a.252.252 0 0 0-.141.327c.046.116.094.227.142.338l.06.137c-.014-.002-.027-.003-.04-.006-.796-.146-1.472-.88-1.855-2.013-.243-.718-.438-1.322-.627-1.907l-.354-1.095c-.332-1.01-.325-1.82.018-2.062.175-.123.47-.073.734.129l.067.042c.046.028.1.04.15.038l.357-.024a.222.222 0 0 0 .114-.039c.031.014.087.01.133-.002.351-.088.698-.396.95-.843.41-.727.704-1.79 1.044-3.02.684-2.48 1.537-5.566 3.756-6.964 2.485-1.567 4.625-1.291 7.106-.971 2.38.306 5.074.652 8.572-.574l.08.052c.257 1.897 1.445 4.389 4.016 5.73a.376.376 0 1 0 .347-.668c-2.394-1.249-3.448-3.569-3.636-5.324a.38.38 0 0 0-.172-.278l-.387-.245a.37.37 0 0 0-.33-.037c-3.418 1.24-6.063.898-8.406.595-2.51-.321-4.882-.624-7.592 1.083-2.465 1.553-3.36 4.796-4.08 7.401-.327 1.182-.608 2.203-.973 2.85-.152.269-.312.403-.42.459a42.846 42.846 0 0 1-.89-5.833c-.743-9.32 4.854-13.079 8.257-14.49l.046-.019c.42.184.812.318 1.167.398.875.197 1.312.622 1.494.858l.032.041a.192.192 0 0 0 .236.052l.532-.278a.188.188 0 0 0 .065-.277l-.043-.06c-.209-.29-.832-.998-2.102-1.286-.658-.147-1.473-.518-2.235-1.015l-.05-.034a.188.188 0 0 0-.261.051l-.334.492a.187.187 0 0 0-.03.144c.01.05.04.094.083.122l.053.033c.111.073.226.141.338.207-5.757 2.681-8.739 8.19-8.185 15.136.138 1.736.4 3.54.778 5.363a1.354 1.354 0 0 0-.924.237c-.423.3-1.032 1.102-.37 3.124l.343 1.057c.193.597.393 1.216.641 1.95.668 1.98 2.005 2.685 3.034 2.685.05 0 .1-.005.15-.01l.008-.001c1.733 3.91 3.835 6.934 6.612 9.515 1.959 1.821 3.907 2.072 5.72 2.072 1.812 0 3.76-.25 5.72-2.071 2.776-2.582 4.879-5.606 6.612-9.516h.007c.05.006.101.01.152.01 1.028 0 2.365-.705 3.032-2.683.253-.748.453-1.364.652-1.982l.332-1.025c.664-2.023.054-2.826-.368-3.125"/><path d="M31.026 24.643c0-.515-.689-.935-1.536-.935-.846 0-1.534.42-1.534.935 0 .524.673.934 1.534.934.847 0 1.536-.42 1.536-.934m-12.539.934c.848 0 1.537-.42 1.537-.934 0-.515-.69-.935-1.537-.935-.846 0-1.535.42-1.535.935 0 .524.674.934 1.535.934m9.093 9.999c-.404 1.021-1.388 2.631-3.58 2.631-2.19 0-3.176-1.61-3.58-2.631h7.16zM24 38.96c2.524 0 3.963-1.89 4.467-3.658a.375.375 0 0 0-.362-.48h-8.21a.378.378 0 0 0-.363.48c.505 1.768 1.944 3.658 4.468 3.658zm7.942-16.711a.372.372 0 0 0-.002-.288.373.373 0 0 0-.206-.203 6.035 6.035 0 0 0-2.239-.437c-.959 0-1.752.241-2.249.443a.377.377 0 0 0 .142.725.37.37 0 0 0 .141-.028 5.305 5.305 0 0 1 1.966-.387c.837 0 1.526.208 1.958.383a.38.38 0 0 0 .49-.208m-11.494.211a.375.375 0 0 0 .488-.495.376.376 0 0 0-.205-.202 6.042 6.042 0 0 0-2.249-.442c-.955 0-1.745.238-2.24.438a.377.377 0 0 0 .284.698 5.277 5.277 0 0 1 1.956-.383c.837 0 1.53.21 1.966.386"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1 @@
<svg height="48" viewBox="0 0 48 48" width="48" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M0 48h48V0H0z"/><g fill="#a57f23"><path d="M24.027 31.035c.46 0 .934-.072 1.446-.22a.377.377 0 0 0-.207-.725c-.892.259-1.587.258-2.479 0a.374.374 0 0 0-.466.257c-.057.2.059.41.258.467.513.149.987.22 1.448.22"/><path d="M40.139 24.513a1.358 1.358 0 0 0-.924-.238c.377-1.81.637-3.614.777-5.363.382-4.79-.863-8.887-3.6-11.849-2.92-3.158-7.437-4.97-12.392-4.97-1.258 0-2.374.124-3.007.242a8.836 8.836 0 0 1-.759-.438l-.051-.035a.191.191 0 0 0-.26.052l-.334.492a.189.189 0 0 0 .053.265l.053.034c.856.561 1.79.983 2.561 1.157.875.197 1.311.622 1.493.858l.033.041a.19.19 0 0 0 .235.052l.531-.278a.191.191 0 0 0 .066-.278l-.042-.059c-.172-.24-.653-.795-1.595-1.132.342-.019.783-.033 1.022-.033 4.698 0 8.964 1.701 11.702 4.668 2.59 2.807 3.719 6.554 3.353 11.137a43.37 43.37 0 0 1-.944 6.087l-.051.27a.254.254 0 0 0 .247.3h.362a.255.255 0 0 0 .154-.054l.057-.045c.245-.187.546-.236.716-.115.343.242.35 1.053.019 2.064l-.335 1.03-.01.027c-.192.595-.39 1.21-.637 1.943-.389 1.152-1.092 1.899-1.898 2.024l.063-.145c.047-.11.095-.22.142-.336a.255.255 0 0 0-.143-.327l-.408-.16a.255.255 0 0 0-.324.141c-1.775 4.454-3.995 7.823-6.986 10.603-1.625 1.51-3.206 1.82-5.079 1.82s-3.453-.31-5.079-1.821c-2.992-2.78-5.211-6.15-6.985-10.602a.252.252 0 0 0-.325-.14l-.408.16a.252.252 0 0 0-.141.327c.045.114.092.222.14.332l.061.143a.45.45 0 0 1-.039-.006c-.796-.146-1.472-.88-1.855-2.014a142.07 142.07 0 0 1-.628-1.911l-.353-1.09c-.333-1.01-.325-1.82.018-2.062.175-.123.47-.072.734.129l.067.042a.25.25 0 0 0 .15.038l.357-.024a.224.224 0 0 0 .114-.039.261.261 0 0 0 .133-.002c.352-.089.698-.396.95-.843.41-.727.704-1.79 1.044-3.019.684-2.48 1.537-5.566 3.756-6.965 2.486-1.568 4.627-1.291 7.106-.971 2.38.306 5.074.652 8.572-.574l.08.052c.257 1.897 1.445 4.389 4.016 5.73a.376.376 0 1 0 .347-.668c-2.394-1.249-3.448-3.569-3.636-5.324a.38.38 0 0 0-.172-.278l-.387-.245a.37.37 0 0 0-.33-.037c-3.418 1.24-6.063.898-8.406.595-2.512-.322-4.882-.625-7.592 1.083-2.466 1.554-3.361 4.796-4.08 7.401-.327 1.182-.608 2.203-.973 2.85-.153.27-.314.404-.42.46a42.807 42.807 0 0 1-.89-5.834c-.743-9.32 4.854-13.079 8.258-14.49a.635.635 0 0 1 .045-.019c.42.184.813.318 1.167.398.876.197 1.312.622 1.494.858l.032.041a.19.19 0 0 0 .236.052l.53-.277a.191.191 0 0 0 .097-.124.184.184 0 0 0-.03-.154l-.043-.06c-.208-.29-.831-.998-2.102-1.286-.658-.147-1.472-.518-2.235-1.015l-.05-.034a.19.19 0 0 0-.261.051l-.334.492a.189.189 0 0 0 .053.266l.053.033c.112.073.226.141.338.207-5.757 2.681-8.74 8.19-8.185 15.136a43.8 43.8 0 0 0 .777 5.363 1.362 1.362 0 0 0-.923.237c-.423.298-1.033 1.102-.37 3.124l.334 1.026c.209.648.402 1.245.65 1.982.668 1.978 2.005 2.684 3.034 2.684.05 0 .1-.005.15-.01l.008-.001c1.733 3.91 3.835 6.935 6.612 9.515 1.959 1.821 3.907 2.072 5.72 2.072 1.812 0 3.76-.25 5.72-2.071 2.776-2.582 4.879-5.606 6.612-9.516h.007c.05.006.101.01.152.01 1.028 0 2.365-.705 3.032-2.683.253-.748.453-1.364.652-1.982l.332-1.025c.664-2.023.054-2.826-.368-3.125"/><path d="M25.41 38.404v-.112a.365.365 0 0 0 0-.53v-.112h-2.814v.107a.367.367 0 0 0-.121.27c0 .101.043.199.12.27v.107h2.816zm2.611-2.498a.377.377 0 0 0-.376-.377h-7.29a.377.377 0 0 0 0 .755h7.29c.208 0 .376-.17.376-.378m4.044-14.184a.377.377 0 0 0-.376-.377h-4.396a.377.377 0 0 0 0 .753h4.396a.377.377 0 0 0 .376-.376m-2.575 3.855c.848 0 1.537-.42 1.537-.934 0-.515-.69-.935-1.537-.935-.846 0-1.535.42-1.535.935 0 .524.675.934 1.535.934m-8.428-3.855a.377.377 0 0 0-.376-.377H16.29a.377.377 0 0 0 0 .753h4.396a.377.377 0 0 0 .376-.376m-2.575 3.855c.848 0 1.537-.42 1.537-.934 0-.515-.69-.935-1.537-.935-.846 0-1.534.42-1.534.935 0 .524.674.934 1.534.934"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><g fill="none" fill-rule="evenodd"><path d="M0 48h48V0H0z"/><g fill="#B25826"><path d="M22.851 37.65a.377.377 0 0 0 0 .754h2.298a.376.376 0 0 0 0-.753h-2.298zm-.272-6.836c.513.148.986.22 1.448.22.46 0 .934-.072 1.446-.22a.378.378 0 0 0 .076-.693.372.372 0 0 0-.283-.03c-.892.257-1.587.257-2.479 0a.366.366 0 0 0-.283.03.372.372 0 0 0-.182.227.371.371 0 0 0 .032.287.373.373 0 0 0 .225.18m5.363 6.349a.375.375 0 0 0 .374-.418.374.374 0 0 0-.138-.252c-1.143-.92-2.496-1.387-4.025-1.387-1.53 0-2.883.466-4.026 1.387a.374.374 0 0 0-.057.53c.13.16.368.187.53.056 1.004-.81 2.2-1.22 3.553-1.22 1.353 0 2.548.41 3.553 1.22.068.055.15.084.236.084m4.072-14.527a.375.375 0 0 0 .324-.422.382.382 0 0 0-.423-.323c-1.588.21-3.277-.342-4.408-1.445a.378.378 0 0 0-.64.275.38.38 0 0 0 .114.265c1.093 1.065 2.686 1.702 4.262 1.702.259 0 .518-.018.771-.052M21.01 20.454a.373.373 0 0 0-.266-.114h-.004a.374.374 0 0 0-.262.107c-1.13 1.103-2.816 1.658-4.408 1.444a.374.374 0 0 0-.423.324.377.377 0 0 0 .324.422c.254.034.514.052.771.052 1.577 0 3.17-.637 4.263-1.703a.377.377 0 0 0 .005-.532m10.016 4.189c0-.515-.689-.935-1.536-.935-.846 0-1.534.42-1.534.935 0 .524.673.934 1.534.934.847 0 1.536-.42 1.536-.934m-12.539.934c.848 0 1.537-.42 1.537-.934 0-.515-.69-.935-1.537-.935-.846 0-1.534.42-1.534.935 0 .524.674.934 1.534.934"/><path d="M40.139 24.513a1.358 1.358 0 0 0-.924-.238c.377-1.81.637-3.614.777-5.363.382-4.79-.863-8.887-3.6-11.849-2.92-3.158-7.437-4.97-12.392-4.97-1.258 0-2.374.124-3.007.242a8.836 8.836 0 0 1-.759-.438l-.051-.035a.191.191 0 0 0-.26.052l-.334.492a.189.189 0 0 0 .053.265l.053.034c.856.561 1.79.983 2.561 1.157.875.197 1.311.622 1.493.858l.033.041a.19.19 0 0 0 .235.052l.531-.278a.191.191 0 0 0 .066-.278l-.042-.059c-.172-.24-.653-.795-1.595-1.132.342-.019.783-.033 1.022-.033 4.698 0 8.964 1.701 11.702 4.668 2.59 2.807 3.719 6.554 3.353 11.137a43.37 43.37 0 0 1-.944 6.087l-.051.27a.254.254 0 0 0 .247.3h.362a.255.255 0 0 0 .154-.054l.057-.045c.245-.187.546-.236.716-.115.343.242.35 1.053.019 2.064l-.335 1.03-.01.027c-.192.595-.39 1.21-.637 1.943-.389 1.152-1.092 1.899-1.898 2.024l.063-.145c.047-.11.095-.22.142-.336a.255.255 0 0 0-.143-.327l-.408-.16a.255.255 0 0 0-.324.141c-1.775 4.454-3.995 7.823-6.986 10.603-1.625 1.51-3.206 1.82-5.079 1.82-1.873 0-3.453-.31-5.078-1.821-2.993-2.78-5.212-6.15-6.985-10.602a.253.253 0 0 0-.326-.14l-.407.16a.25.25 0 0 0-.142.327c.046.116.094.227.143.338.02.046.04.09.058.137a.45.45 0 0 1-.039-.006c-.796-.146-1.472-.88-1.855-2.014a142.07 142.07 0 0 1-.628-1.911l-.353-1.09c-.333-1.01-.325-1.82.018-2.062.175-.123.47-.072.734.129l.067.042a.251.251 0 0 0 .15.038l.357-.024a.226.226 0 0 0 .114-.039.252.252 0 0 0 .133-.002c.352-.089.698-.396.95-.843.41-.727.704-1.79 1.044-3.019.684-2.48 1.537-5.566 3.756-6.965 2.486-1.568 4.627-1.291 7.106-.971 2.38.306 5.074.652 8.572-.574l.08.052c.257 1.897 1.445 4.389 4.016 5.73a.376.376 0 1 0 .347-.668c-2.394-1.249-3.448-3.569-3.636-5.324a.38.38 0 0 0-.172-.278l-.387-.245a.37.37 0 0 0-.33-.037c-3.418 1.24-6.063.898-8.406.595-2.512-.322-4.881-.625-7.592 1.083-2.466 1.554-3.361 4.796-4.08 7.401-.327 1.182-.608 2.203-.973 2.85-.153.27-.314.404-.42.46a42.807 42.807 0 0 1-.89-5.834c-.743-9.32 4.854-13.079 8.258-14.49a.635.635 0 0 1 .045-.019c.42.184.813.318 1.167.398.876.197 1.312.622 1.494.858l.032.041a.19.19 0 0 0 .236.052l.53-.277a.191.191 0 0 0 .097-.124.184.184 0 0 0-.03-.154l-.043-.06c-.208-.29-.831-.998-2.102-1.286-.658-.147-1.472-.518-2.235-1.015l-.05-.034a.19.19 0 0 0-.261.051l-.334.492a.189.189 0 0 0 .053.266l.053.033c.112.073.226.141.338.207-5.757 2.681-8.74 8.19-8.185 15.136a43.8 43.8 0 0 0 .777 5.363 1.361 1.361 0 0 0-.923.237c-.423.298-1.033 1.102-.37 3.124l.334 1.026c.209.648.402 1.245.65 1.982.668 1.978 2.005 2.684 3.034 2.684.05 0 .1-.005.15-.01l.008-.001c1.733 3.91 3.835 6.935 6.612 9.515 1.959 1.821 3.907 2.072 5.72 2.072 1.812 0 3.76-.25 5.72-2.071 2.776-2.58 4.878-5.605 6.611-9.516h.007c.05.006.101.01.153.01 1.028 0 2.365-.705 3.032-2.683.253-.748.453-1.364.652-1.982l.332-1.025c.664-2.023.054-2.826-.368-3.125"/></g></g></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><g fill="none" fill-rule="evenodd"><path d="M0 48h48V0H0z"/><g fill="#AF2C3C"><path d="M32.065 21.722a.377.377 0 0 0-.376-.377h-4.396a.376.376 0 0 0 0 .754h4.396c.207 0 .376-.17.376-.377m-4.11 2.921c0 .524.674.934 1.535.934.847 0 1.536-.42 1.536-.934 0-.516-.689-.935-1.536-.935-.846 0-1.535.42-1.535.935m-6.893-2.921a.377.377 0 0 0-.376-.377H16.29a.376.376 0 0 0 0 .754h4.396c.208 0 .376-.17.376-.377m-4.109 2.921c0 .524.674.934 1.534.934.847 0 1.536-.42 1.536-.934 0-.516-.689-.935-1.536-.935-.846 0-1.534.42-1.534.935m10.753 9.122h-7.411a.377.377 0 0 0 0 .754h7.41a.377.377 0 0 0 0-.754m.001 2.212h-7.411a.377.377 0 0 0 0 .753h7.41a.377.377 0 0 0 0-.753m.001 2.213h-7.411a.377.377 0 0 0 0 .752h7.41a.377.377 0 0 0 0-.753"/><path d="M11.586 32.41a2.976 2.976 0 0 1-.467-.072l-.024-.008c-.435-.118-1.237-.535-1.727-1.986-.245-.726-.443-1.338-.633-1.928l-.348-1.071c-.332-1.012-.324-1.822.018-2.064.171-.122.48-.074.715.115.1.079.136.145.147.185.477 1.834 1.227 4.102 2.007 6.067l.312.763zm23.771.777c-1.663 3.677-3.66 6.525-6.278 8.957-1.625 1.511-3.206 1.82-5.08 1.82-1.872 0-3.453-.309-5.078-1.82-2.619-2.433-4.615-5.281-6.278-8.957.574-.017 1.302-.132 2.336-.728a63.87 63.87 0 0 0 2.612-1.607l.024-.015c2.364-1.51 4.232-2.703 6.385-2.704 2.153.001 4.02 1.194 6.386 2.704a65.4 65.4 0 0 0 2.635 1.622c1.034.596 1.762.71 2.336.728zm4.257-5.842l-.349 1.071c-.19.591-.388 1.202-.633 1.929-.49 1.451-1.292 1.867-1.727 1.985l-.022.008c-.122.032-.28.056-.469.073l.312-.763c.78-1.964 1.53-4.232 2.006-6.065a.42.42 0 0 1 .148-.187.797.797 0 0 1 .48-.182c.09 0 .172.022.235.067.343.242.35 1.052.019 2.064zm.525-2.832a1.36 1.36 0 0 0-.924-.238c.377-1.81.637-3.614.777-5.363.382-4.79-.863-8.887-3.6-11.849-2.92-3.158-7.437-4.97-12.392-4.97-1.258 0-2.374.124-3.007.242a8.836 8.836 0 0 1-.759-.439l-.051-.034a.19.19 0 0 0-.26.052l-.334.491a.19.19 0 0 0 .053.265l.053.035c.856.561 1.79.983 2.561 1.157.875.197 1.311.622 1.493.858l.033.041a.19.19 0 0 0 .235.051l.531-.277a.191.191 0 0 0 .066-.278l-.042-.058c-.172-.24-.653-.795-1.595-1.134.343-.018.785-.032 1.022-.032 4.698 0 8.964 1.701 11.702 4.668 2.59 2.806 3.719 6.554 3.353 11.137a42.16 42.16 0 0 1-.943 6.085c-.471 2.041-1.554 5.263-2.525 7.513-.669.01-1.27-.099-2.19-.63a63.936 63.936 0 0 1-2.605-1.605c-2.37-1.512-4.415-2.818-6.795-2.822-2.37.003-4.416 1.309-6.787 2.822a63.116 63.116 0 0 1-2.606 1.605c-.92.53-1.529.64-2.188.63-.882-2.04-1.846-4.847-2.414-7.023.337-.1.667-.4.91-.83.41-.727.703-1.79 1.043-3.02.684-2.48 1.537-5.567 3.756-6.966 2.486-1.567 4.627-1.29 7.106-.97 2.38.306 5.074.652 8.572-.573l.08.051c.257 1.897 1.445 4.389 4.016 5.73a.376.376 0 1 0 .347-.668c-2.394-1.25-3.448-3.569-3.636-5.323a.38.38 0 0 0-.172-.279l-.387-.245a.37.37 0 0 0-.33-.037c-3.418 1.24-6.063.898-8.406.595-2.512-.322-4.882-.625-7.592 1.083-2.466 1.554-3.361 4.795-4.08 7.401-.327 1.182-.608 2.203-.973 2.85-.153.27-.314.404-.42.46a42.82 42.82 0 0 1-.89-5.834c-.743-9.32 4.854-13.079 8.258-14.49l.045-.019c.42.185.813.319 1.167.398.876.198 1.312.622 1.494.858l.032.04a.19.19 0 0 0 .236.053l.53-.278a.19.19 0 0 0 .067-.277l-.043-.06c-.208-.29-.831-.998-2.102-1.285-.658-.148-1.472-.519-2.235-1.016l-.05-.034a.19.19 0 0 0-.261.051l-.334.492a.189.189 0 0 0 .053.266l.053.033c.112.073.226.141.338.207-5.757 2.681-8.74 8.19-8.185 15.135.139 1.74.4 3.543.777 5.364a1.36 1.36 0 0 0-.923.237c-.423.298-1.033 1.102-.37 3.123l.334 1.027c.198.617.398 1.234.65 1.982.668 1.978 2.005 2.684 3.034 2.684.05 0 .101-.005.151-.01h.007c1.735 3.911 3.837 6.936 6.612 9.515 1.96 1.82 3.907 2.071 5.72 2.071 1.812 0 3.76-.25 5.72-2.072 2.776-2.58 4.878-5.604 6.613-9.515h.005c.05.006.101.01.153.01 1.028 0 2.365-.705 3.032-2.683.257-.759.463-1.395.652-1.982l.332-1.025c.664-2.023.054-2.826-.368-3.125z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><g fill="none" fill-rule="evenodd"><path d="M0 48h48V0H0z"/><g fill="#634675"><path d="M26.22 36.782a2.152 2.152 0 0 1-2.148 2.152 2.152 2.152 0 0 1 0-4.302 2.15 2.15 0 0 1 2.147 2.15m-2.147-2.9a2.9 2.9 0 0 0 0 5.802 2.901 2.901 0 0 0 0-5.802"/><path d="M27.889 36.914A3.696 3.696 0 0 1 24.2 40.61a3.696 3.696 0 0 1 0-7.389 3.695 3.695 0 0 1 3.688 3.694M24.2 32.471a4.445 4.445 0 0 0 0 8.888 4.445 4.445 0 0 0 0-8.888"/><path d="M38.206 36.981a.102.102 0 0 1-.007.08l-4.565 8.86a.104.104 0 0 1-.139.044l-1.017-.526 4.66-9.044 1.017.526a.102.102 0 0 1 .05.06zm-27.431-.06l1.017-.526 4.66 9.045-1.017.525a.107.107 0 0 1-.139-.044l-4.565-8.86a.105.105 0 0 1-.007-.08.105.105 0 0 1 .05-.06zm8.907 6.342c-.125.391-.393.71-.757.898l-1.808.935-4.66-9.044 1.808-.935a1.529 1.529 0 0 1 2.066.66l3.253 6.314c.188.364.223.78.098 1.172zm8.764-.213c-1.378.875-2.732.996-3.99.996-1.253 0-2.601-.12-3.975-.986a2.275 2.275 0 0 0-.232-1.313l-3.254-6.313c-.022-.044-.05-.083-.077-.123l-.018-.026c2.134-3.991 5.75-6.972 7.566-6.976 1.816.004 5.43 2.984 7.565 6.975l-.02.03a.976.976 0 0 0-.076.12l-3.254 6.313c-.205.4-.286.85-.235 1.303zm3.367 2.046l-1.808-.935a1.54 1.54 0 0 1-.659-2.07l3.253-6.314a1.525 1.525 0 0 1 1.364-.832c.246 0 .482.058.702.172l1.808.935-4.398 8.537-.262.507zm8.677-20.407a1.347 1.347 0 0 0-.918-.237c.374-1.802.633-3.597.771-5.337.38-4.767-.856-8.844-3.576-11.791-2.9-3.144-7.388-4.947-12.31-4.947-1.25 0-2.359.124-2.989.24-.29-.151-.53-.29-.753-.435l-.051-.034a.19.19 0 0 0-.258.051l-.332.49a.184.184 0 0 0-.03.141c.01.05.04.095.083.122l.053.034c.85.559 1.777.979 2.543 1.152.87.196 1.303.618 1.484.853l.032.041a.188.188 0 0 0 .234.052l.528-.277a.19.19 0 0 0 .066-.277l-.043-.058c-.17-.239-.648-.79-1.584-1.127.34-.018.778-.033 1.016-.033 4.667 0 8.904 1.694 11.624 4.646 2.574 2.793 3.695 6.522 3.332 11.083a43.229 43.229 0 0 1-.938 6.058l-.05.269a.248.248 0 0 0 .053.206.245.245 0 0 0 .192.091h.36a.255.255 0 0 0 .152-.053l.057-.044c.243-.187.542-.235.711-.115.34.241.348 1.048.02 2.054l-.347 1.066c-.19.588-.386 1.196-.63 1.92-.385 1.146-1.085 1.89-1.884 2.014.02-.05.041-.098.062-.146.047-.109.094-.218.14-.333a.253.253 0 0 0-.141-.325l-.407-.16a.253.253 0 0 0-.321.141c-.382.96-.795 1.884-1.258 2.816l-.023.03-.151-.079a2.256 2.256 0 0 0-1.74-.146c-.26.083-.5.21-.715.378a20.2 20.2 0 0 0-3.814-4.82c-1.611-1.482-3.127-2.3-4.277-2.303-1.143.003-2.66.822-4.27 2.304a20.203 20.203 0 0 0-3.815 4.82 2.263 2.263 0 0 0-.717-.379 2.255 2.255 0 0 0-1.739.146l-.151.078-.063-.078a36.789 36.789 0 0 1-1.238-2.767.25.25 0 0 0-.322-.14l-.406.16a.252.252 0 0 0-.14.326c.044.111.09.218.136.325l.064.147a.46.46 0 0 1-.04-.006c-.79-.145-1.462-.875-1.842-2.004-.24-.71-.433-1.309-.62-1.888l-.356-1.098c-.329-1.006-.321-1.812.02-2.053.173-.123.464-.072.729.128l.066.042a.244.244 0 0 0 .15.038l.354-.023a.235.235 0 0 0 .113-.04.25.25 0 0 0 .132-.002c.35-.088.693-.393.944-.838.408-.724.7-1.78 1.037-3.005.68-2.468 1.526-5.54 3.731-6.932 2.47-1.56 4.597-1.284 7.06-.966 2.365.304 5.04.649 8.516-.57l.08.051c.255 1.888 1.434 4.368 3.99 5.701a.375.375 0 0 0 .344-.664c-2.379-1.242-3.426-3.551-3.613-5.298a.377.377 0 0 0-.17-.276l-.384-.244a.369.369 0 0 0-.328-.037c-3.396 1.234-6.023.894-8.351.592-2.496-.32-4.851-.622-7.543 1.078-2.45 1.545-3.339 4.772-4.054 7.365-.324 1.176-.604 2.192-.967 2.836-.155.276-.318.409-.417.459A42.807 42.807 0 0 1 9.5 19.04c-.739-9.275 4.822-13.015 8.203-14.42l.045-.019c.418.184.808.317 1.16.397.87.196 1.303.619 1.484.853l.032.041a.19.19 0 0 0 .234.052l.527-.276a.19.19 0 0 0 .066-.277l-.042-.059c-.207-.289-.826-.994-2.089-1.28-.653-.147-1.462-.515-2.22-1.01l-.05-.034a.187.187 0 0 0-.259.051l-.332.49a.19.19 0 0 0 .052.263l.053.034c.111.073.225.14.337.205-5.72 2.669-8.683 8.152-8.132 15.063.137 1.73.397 3.526.772 5.337a1.358 1.358 0 0 0-.918.237c-.42.297-1.026 1.097-.366 3.108l.33 1.022c.198.614.396 1.228.647 1.972.663 1.97 1.992 2.671 3.014 2.671.05 0 .098-.005.146-.01h.01c.189.426.397.869.634 1.348l-2.492 1.288a1.044 1.044 0 0 0-.447 1.402l4.566 8.861a1.038 1.038 0 0 0 1.4.448l3.488-1.805c.411-.212.75-.532.986-.928 1.453.805 2.837.916 4.117.916 1.222 0 2.667-.11 4.129-.924.235.4.577.722.991.936l3.49 1.805a1.036 1.036 0 0 0 1.4-.448l4.565-8.86a1.043 1.043 0 0 0-.446-1.403l-2.508-1.295c.233-.472.44-.912.63-1.342l.012.001c.048.005.096.01.146.01 1.021 0 2.35-.702 3.013-2.671.254-.755.459-1.389.647-1.972l.33-1.02c.66-2.014.054-2.813-.365-3.11z"/><path d="M31.938 21.552a.375.375 0 0 0-.374-.376h-4.367a.374.374 0 0 0 0 .75h4.367a.374.374 0 0 0 .374-.374m-3.703 2.673c0 .521.67.929 1.525.929.841 0 1.526-.417 1.526-.929 0-.513-.685-.93-1.526-.93-.84 0-1.525.417-1.525.93m-6.885-2.673a.375.375 0 0 0-.374-.376h-4.367a.374.374 0 0 0 0 .75h4.367a.374.374 0 0 0 .374-.374m-4.409 2.673c0 .521.67.929 1.525.929.841 0 1.526-.417 1.526-.929 0-.513-.685-.93-1.526-.93-.84 0-1.525.417-1.525.93"/></g></g></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1 @@
<svg height="48" viewBox="0 0 48 48" width="48" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M0 48h48V0H0z"/><g fill="#683e51"><path d="M27.746 24.537c0-1.464.882-2.655 1.964-2.655 1.083 0 1.965 1.191 1.965 2.655 0 1.463-.882 2.655-1.965 2.655-1.082 0-1.964-1.192-1.964-2.655m1.964 3.408c1.499 0 2.717-1.529 2.717-3.408s-1.218-3.408-2.717-3.408c-1.498 0-2.716 1.53-2.716 3.408 0 1.879 1.218 3.408 2.716 3.408m-13.386-3.408c0-1.464.882-2.655 1.964-2.655 1.083 0 1.965 1.191 1.965 2.655 0 1.463-.882 2.655-1.965 2.655-1.082 0-1.964-1.192-1.964-2.655m1.964 3.408c1.499 0 2.717-1.529 2.717-3.408s-1.218-3.408-2.717-3.408c-1.498 0-2.716 1.53-2.716 3.408 0 1.879 1.218 3.408 2.716 3.408m1.865 11.492c.997-.617 2.385-.967 3.847-.967s2.85.35 3.848.967zm-1.383 1.746c.06-.345.225-.68.49-.994h9.48c.265.315.429.649.49.994zm8.833 2.5c-.982.533-2.251.825-3.603.825-1.353 0-2.62-.292-3.602-.825zm1.597-1.747c-.091.35-.287.684-.582.993h-9.236c-.295-.31-.49-.643-.582-.993zM24 45.262c3.317 0 6.015-1.693 6.015-3.773S27.317 37.717 24 37.717s-6.016 1.692-6.016 3.772 2.7 3.773 6.016 3.773z"/><path d="M17.74 38.036c.26-2.17 3.02-3.88 6.286-3.888 3.265.009 6.027 1.722 6.287 3.901.428 3.054.461 3.494.461 3.556 0 2.399-3.027 4.357-6.748 4.367-3.72-.01-6.748-1.968-6.748-4.367 0-.062.033-.502.462-3.569m6.285-21.54c5.077.007 9.18 2.16 10.21 5.357 1.212 3.769-1.398 9.52-4.534 13.573-1.334-1.265-3.439-2.024-5.65-2.036H24c-2.21.012-4.315.771-5.648 2.036-3.136-4.053-5.746-9.804-4.534-13.573 1.03-3.197 5.132-5.35 10.208-5.357m16.114 8.017a1.366 1.366 0 0 0-.924-.238c.377-1.81.638-3.614.777-5.363.382-4.79-.863-8.887-3.6-11.849-2.92-3.158-7.437-4.97-12.392-4.97-1.258 0-2.374.124-3.008.242a8.916 8.916 0 0 1-.758-.439l-.051-.033a.19.19 0 0 0-.26.052l-.334.49a.188.188 0 0 0 .053.265l.053.035c.857.562 1.791.984 2.56 1.157.876.197 1.312.622 1.494.857l.032.042a.19.19 0 0 0 .236.051l.531-.277a.19.19 0 0 0 .066-.278l-.042-.059c-.172-.24-.653-.794-1.595-1.133.342-.018.783-.032 1.022-.032 4.699 0 8.964 1.7 11.702 4.668 2.59 2.806 3.718 6.553 3.353 11.137a43.393 43.393 0 0 1-.944 6.088l-.051.27a.253.253 0 0 0 .247.298h.362a.254.254 0 0 0 .154-.052l.057-.046c.243-.187.546-.236.717-.115.342.243.349 1.052.018 2.064l-.335 1.03c-.22.678-.405 1.254-.647 1.97-.389 1.151-1.092 1.899-1.898 2.024l.063-.145c.047-.11.095-.22.141-.336a.253.253 0 0 0-.142-.327l-.408-.16a.255.255 0 0 0-.324.14c-1.29 3.237-2.844 5.928-4.75 8.22-.068-.504-.15-1.106-.25-1.815-.081-.68-.366-1.337-.846-1.95 3.307-4.232 6.047-10.306 4.737-14.376-1.129-3.51-5.522-5.874-10.93-5.882-5.407.008-9.799 2.372-10.929 5.882-1.31 4.07 1.43 10.144 4.737 14.376-.48.614-.764 1.27-.844 1.948-.104.733-.188 1.354-.258 1.87-1.929-2.309-3.498-5.016-4.795-8.272a.254.254 0 0 0-.326-.14l-.408.16a.252.252 0 0 0-.14.327c.045.115.093.226.14.338a2.1 2.1 0 0 1 .06.137.45.45 0 0 1-.039-.006c-.796-.146-1.472-.88-1.855-2.014-.244-.719-.439-1.325-.628-1.911l-.354-1.09c-.332-1.01-.324-1.82.019-2.063.175-.123.47-.072.735.13l.066.042a.255.255 0 0 0 .15.038l.358-.023a.229.229 0 0 0 .113-.04.24.24 0 0 0 .134-.003c.35-.087.697-.394.95-.841.41-.728.703-1.79 1.043-3.02.684-2.48 1.536-5.567 3.756-6.965 2.486-1.568 4.627-1.292 7.106-.971 2.38.306 5.074.651 8.572-.573l.08.05c.257 1.898 1.444 4.39 4.016 5.73a.38.38 0 0 0 .507-.16.372.372 0 0 0 .025-.288.37.37 0 0 0-.185-.22c-2.394-1.248-3.448-3.568-3.636-5.323a.381.381 0 0 0-.172-.278l-.387-.245a.372.372 0 0 0-.33-.036c-3.418 1.238-6.062.897-8.406.594-2.513-.321-4.883-.624-7.592 1.083-2.466 1.553-3.361 4.797-4.081 7.402-.326 1.18-.607 2.201-.973 2.85-.152.27-.312.403-.42.458a42.788 42.788 0 0 1-.888-5.833C8.203 9.517 13.8 5.759 17.203 4.348l.046-.019c.42.185.813.318 1.168.398.875.198 1.311.622 1.493.858l.032.04a.19.19 0 0 0 .236.053l.532-.278a.192.192 0 0 0 .095-.124.187.187 0 0 0-.03-.154l-.042-.058c-.209-.292-.832-1-2.103-1.286-.657-.148-1.472-.518-2.235-1.016l-.05-.034a.19.19 0 0 0-.26.052l-.335.491a.187.187 0 0 0 .053.265l.053.034c.111.073.226.14.339.206-5.758 2.682-8.74 8.192-8.186 15.137a43.8 43.8 0 0 0 .777 5.363 1.355 1.355 0 0 0-.924.236c-.422.3-1.032 1.103-.369 3.125l.334 1.026c.209.648.402 1.245.65 1.982.669 1.979 2.006 2.684 3.034 2.684.05 0 .1-.005.15-.01l.008-.001c1.338 3.019 2.942 5.555 4.903 7.75-.034.298-.05.469-.05.537 0 2.807 3.355 5.105 7.479 5.125h.052c4.124-.02 7.48-2.318 7.48-5.125 0-.071-.018-.26-.057-.589 1.94-2.185 3.529-4.704 4.857-7.698h.006c.05.006.1.01.152.01 1.028 0 2.366-.704 3.034-2.684.252-.747.452-1.363.65-1.98l.333-1.026c.664-2.023.054-2.826-.368-3.125"/></g></g></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72" viewBox="0 0 72 72"><g fill="none" fill-rule="evenodd"><path d="M0 72h72V0H0z"/><g stroke="#879CB2" stroke-linejoin="round" stroke-width="2.25"><path stroke-linecap="round" d="M36 49.5a6.758 6.758 0 0 1-6.75-6.75"/><path d="M47.678 36c-2.931-5.077-11.68-20.25-11.68-20.25L24.324 36a13.454 13.454 0 0 0-1.824 6.75c0 7.454 6.045 13.5 13.5 13.5 7.458 0 13.5-6.046 13.5-13.5 0-2.46-.672-4.762-1.821-6.75z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 480 B

View File

@@ -0,0 +1 @@
<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M0 24h24V0H0z"/><path d="M12 7.5A4.505 4.505 0 0 0 7.5 12c0 2.481 2.019 4.5 4.5 4.5s4.5-2.019 4.5-4.5c0-2.48-2.019-4.5-4.5-4.5m0 9.938a.375.375 0 0 0-.375.375v1.875a.375.375 0 0 0 .75 0v-1.875a.375.375 0 0 0-.375-.375m0-10.875a.375.375 0 0 0 .375-.375V4.313a.375.375 0 0 0-.75 0v1.875c0 .207.168.375.375.375m4.376 9.282a.375.375 0 0 0-.531.53L17.17 17.7a.372.372 0 0 0 .53 0 .374.374 0 0 0 .001-.53l-1.325-1.326zm-8.752-7.69a.376.376 0 0 0 .53 0 .374.374 0 0 0 .001-.53L6.83 6.299a.375.375 0 0 0-.531.53zm12.064 3.47h-1.875a.375.375 0 0 0 0 .75h1.875a.375.375 0 0 0 0-.75M6.563 12a.375.375 0 0 0-.375-.375H4.313a.375.375 0 0 0 0 .75h1.875A.375.375 0 0 0 6.563 12m9.547-3.735a.378.378 0 0 0 .266-.11l1.325-1.326a.375.375 0 0 0-.53-.53l-1.327 1.326a.375.375 0 0 0 .266.64m-8.486 7.58L6.299 17.17a.374.374 0 0 0 .001.53.372.372 0 0 0 .53 0l1.325-1.326a.375.375 0 0 0-.531-.53" fill="#fdd737"/></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none" fill-rule="evenodd"><path fill="none" d="M0 24h24V0H0z"/><path fill="#CAD4DB" d="M12.932 9.57a.374.374 0 0 1-.265.64.37.37 0 0 1-.265-.11 3.708 3.708 0 0 0-1.488-.898v.001a3.738 3.738 0 0 0-1.164-.202c-1.474 0-2.734.86-3.343 2.1.404.157.776.388 1.089.7a.374.374 0 0 1 0 .53.373.373 0 0 1-.53.002 2.398 2.398 0 0 0-.842-.54l.014.004a2.421 2.421 0 0 0-.888-.173 2.437 2.437 0 0 0 0 4.875h10.5a5.25 5.25 0 1 0 0-10.5c-2.17 0-3.64 1.215-4.483 2.518 0 0 .83.232 1.665 1.052"/><path fill="#FDD737" d="M5.661 10.902a4.493 4.493 0 0 1 4.09-2.65c.248 0 .5.023.76.072.22-.398.492-.756.791-1.088a3.916 3.916 0 0 0-3.423-2.01 3.942 3.942 0 0 0-3.938 3.938c0 .651.175 1.274.473 1.836.268-.074.545-.126.836-.126.138 0 .274.01.411.028M7.879 4.29a.375.375 0 0 1-.375-.376V2.04a.375.375 0 0 1 .75 0v1.875a.375.375 0 0 1-.375.375M4.166 5.827a.378.378 0 0 1-.266-.11L2.575 4.391a.375.375 0 0 1 .531-.53l1.326 1.326a.375.375 0 0 1-.266.64M2.629 9.54H.754a.375.375 0 0 1 0-.75h1.875a.375.375 0 0 1 0 .75m8.961-3.713a.378.378 0 0 1-.265-.11.377.377 0 0 1 0-.53l1.327-1.326a.375.375 0 1 1 .53.53l-1.325 1.326a.378.378 0 0 1-.266.11"/></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none" fill-rule="evenodd"><path d="M0 24h24V0H0z"/><path d="M6.587 11.235l-.288-.889.756-.549A.093.093 0 0 0 7 9.628h-.935l-.29-.889a.092.092 0 0 0-.087-.065.094.094 0 0 0-.09.065l-.288.89h-.935a.093.093 0 0 0-.055.168l.755.55-.288.888a.093.093 0 0 0 .034.104.088.088 0 0 0 .055.02c.02 0 .039-.007.055-.02l.757-.549.755.55a.09.09 0 0 0 .11 0 .091.091 0 0 0 .034-.105M9.419 6.15l-.385 1.185a.125.125 0 0 0 .193.14l1.008-.732 1.008.731a.125.125 0 1 0 .193-.139L11.05 6.15l1.008-.733a.126.126 0 0 0 .046-.14.127.127 0 0 0-.12-.086h-1.247l-.383-1.185a.126.126 0 0 0-.24 0L9.73 5.191H8.484a.127.127 0 0 0-.12.086.126.126 0 0 0 .047.14l1.008.733zm8.161 1.551a6.492 6.492 0 0 0-2.258-1.545l-.385-.159a.187.187 0 0 0-.248.235l.137.393a5.789 5.789 0 0 1-1.48 6.096A5.74 5.74 0 0 1 9.383 14.3a5.756 5.756 0 0 1-2.205-.435l-.386-.158a.187.187 0 0 0-.248.235l.137.393c.307.883.785 1.67 1.42 2.34a6.467 6.467 0 0 0 4.74 2.04 6.501 6.501 0 0 0 4.485-1.786 6.48 6.48 0 0 0 2.035-4.56 6.481 6.481 0 0 0-1.78-4.667" fill="#CAD4DB"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M0 24h24V0H0z"/><path d="M7.268 23.132a.374.374 0 0 0 .325.562.376.376 0 0 0 .325-.187l3.613-6.258h-.867zm4.684-2.922a.374.374 0 0 0 .325.561.376.376 0 0 0 .325-.187l1.925-3.335h-.866l-1.709 2.96zm-5.997 0a.374.374 0 0 0 .325.561.376.376 0 0 0 .325-.187L8.53 17.25h-.866z" fill="#61b6df"/><path d="M12.932 9.57a.374.374 0 0 1-.265.64.37.37 0 0 1-.265-.11 3.708 3.708 0 0 0-1.488-.898v.001a3.738 3.738 0 0 0-1.164-.202c-1.474 0-2.734.86-3.343 2.1.404.157.776.388 1.089.7a.374.374 0 0 1 0 .53.373.373 0 0 1-.53.002 2.398 2.398 0 0 0-.842-.54l.014.004a2.421 2.421 0 0 0-.888-.173 2.437 2.437 0 0 0 0 4.875h10.5a5.25 5.25 0 1 0 0-10.5c-2.17 0-3.64 1.215-4.483 2.518 0 0 .83.232 1.665 1.052" fill="#879cb2"/></g></svg>

After

Width:  |  Height:  |  Size: 840 B

View File

@@ -0,0 +1 @@
<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M0 24h24V0H0z"/><path d="M12.932 9.57a.373.373 0 0 1 0 .53.373.373 0 0 1-.53 0 3.722 3.722 0 0 0-1.487-.897 3.743 3.743 0 0 0-1.165-.202c-1.475 0-2.734.86-3.344 2.1a3.17 3.17 0 0 1 1.09.7.376.376 0 0 1-.265.641.374.374 0 0 1-.264-.11 2.42 2.42 0 0 0-.843-.539l.014.004a2.426 2.426 0 0 0-.888-.172 2.438 2.438 0 1 0 0 4.875h10.5a5.25 5.25 0 0 0 0-10.5c-2.169 0-3.64 1.215-4.483 2.518 0 0 .83.232 1.665 1.051" fill="#cad4db"/></g></svg>

After

Width:  |  Height:  |  Size: 561 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none" fill-rule="evenodd"><path d="M0 24h24V0H0z"/><path d="M12.932 9.57a.374.374 0 0 1-.265.64.37.37 0 0 1-.265-.11 3.708 3.708 0 0 0-1.488-.898v.001a3.738 3.738 0 0 0-1.164-.202c-1.474 0-2.734.86-3.343 2.1.404.157.776.388 1.089.7a.374.374 0 0 1 0 .53.373.373 0 0 1-.53.002 2.398 2.398 0 0 0-.842-.54l.014.004a2.421 2.421 0 0 0-.888-.173 2.437 2.437 0 0 0 0 4.875h10.5a5.25 5.25 0 1 0 0-10.5c-2.17 0-3.64 1.215-4.483 2.518 0 0 .83.232 1.665 1.052m-.277 12.389h-.923l.462-.799a.225.225 0 0 0-.39-.225l-.46.798-.462-.798a.225.225 0 0 0-.39.225l.461.8h-.923a.225.225 0 0 0 0 .45h.923l-.462.8a.226.226 0 0 0 .391.223l.461-.798.46.798a.227.227 0 0 0 .308.083.226.226 0 0 0 .083-.307l-.462-.8h.923a.225.225 0 0 0 0-.45m3.55-2.842h-.922l.461-.799a.226.226 0 0 0-.39-.224l-.46.798-.462-.798a.226.226 0 0 0-.391.224l.461.8h-.922a.225.225 0 0 0 0 .45h.923l-.462.8a.226.226 0 0 0 .391.223l.461-.798.46.798a.227.227 0 0 0 .308.083.226.226 0 0 0 .083-.307l-.462-.8h.923a.225.225 0 0 0 0-.45m-7.099 0h-.922l.461-.799a.226.226 0 0 0-.39-.224l-.46.798-.462-.798a.226.226 0 0 0-.391.224l.461.8h-.922a.225.225 0 0 0 0 .45h.923l-.462.8a.226.226 0 0 0 .391.223l.461-.798.46.798a.227.227 0 0 0 .308.083.226.226 0 0 0 .083-.307l-.462-.8h.923a.225.225 0 0 0 0-.45" fill="#CAD4DB"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="13" viewBox="0 0 16 13"><g fill="none" fill-rule="evenodd"><path d="M-4 19h24V-5H-4z"/><path stroke="#879CB2" stroke-linecap="round" stroke-linejoin="round" stroke-width=".748" d="M8 13l7.236-12L8 6.118.764 1z"/></g></svg>

After

Width:  |  Height:  |  Size: 281 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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