cleaned for new home

This commit is contained in:
2025-06-23 12:40:35 +02:00
parent e426efb80f
commit 1f4970c17c
173 changed files with 16228 additions and 24225 deletions

View File

@@ -1 +1 @@
2024.10.2
2025.6.1

2
.gitignore vendored
View File

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

1
.shopping_list.json Normal file
View File

@@ -0,0 +1 @@
[]

View File

@@ -1,35 +0,0 @@
<?xml version="1.0"?>
<main_log>info</main_log>
<upnp_log>info</upnp_log>
<util_log>warn</util_log>
<raop_log>info</raop_log>
<log_limit>-1</log_limit>
<max_players>32</max_players>
<binding>?</binding>
<ports>0:0</ports>
<enabled>1</enabled>
<max_volume>100</max_volume>
<http_length>-1</http_length>
<upnp_max>1</upnp_max>
<codec>flc</codec>
<metadata>1</metadata>
<flush>1</flush>
<artwork></artwork>
<latency>1000:2000</latency>
<drift>0</drift>
<pcm>http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</pcm>
<wav>http-get:*:audio/wav:DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</wav>
<flac>http-get:*:audio/flac:DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</flac>
<mp3>http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=0d500000000000000000000000000000</mp3>
<device>
<udn>uuid:RINCON_38420B93464001400</udn>
<name>Keuken+</name>
<mac>bb:bb:0b:93:46:40</mac>
<enabled>1</enabled>
</device>
<device>
<udn>uuid:BO5EBO5E-F00D-F00D-FEED-506583CEC197</udn>
<name>Bose woonkamer+</name>
<mac>bb:bb:7f:f3:34:e1</mac>
<enabled>1</enabled>
</device>

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,10 @@ homeassistant:
- type: trusted_networks
trusted_networks:
- 192.168.2.0/24
- 172.16.20.0/24
trusted_users:
192.168.2.170: d60f15dc903c4db087bfe493d3fba434
172.16.20.77: d60f15dc903c4db087bfe493d3fba434
allow_bypass_login: true
- type: homeassistant
#d60f15dc903c4db087bfe493d3fba434
@@ -26,5 +28,3 @@ homeassistant:
logger:
default: warning
#logs:

43
depr_packages/roborock.yaml Executable file
View File

@@ -0,0 +1,43 @@
---
camera:
- platform: xiaomi_cloud_map_extractor
host: !secret xiaomi_vacuum_host
token: !secret xiaomi_vacuum_token
username: !secret xiaomi_cloud_username
password: !secret xiaomi_cloud_password
draw: ["all"]
attributes:
- calibration_points
- rooms
- map_name
- no_go_areas
- no_mopping_areas
room_colors:
16: [240, 178, 122]
17: [133, 193, 233]
18: [217, 136, 128]
- platform: xiaomi_cloud_map_extractor
host: !secret xiaomi_vacuum_host
token: !secret xiaomi_vacuum_token
username: !secret xiaomi_cloud_username
password: !secret xiaomi_cloud_password
draw: ["all"]
attributes:
- calibration_points
- rooms
- map_name
- no_go_areas
- no_mopping_areas
room_colors:
16: [240, 178, 122]
17: [133, 193, 233]
18: [217, 136, 128]
# sensor:
# - platform: rest
# name: roborock_rooms
# resource: http://homeassistant.local:8123/local/roborooms.json
# value_template: "{{ now() }}"
# json_attributes:
# - rooms

View File

@@ -1,6 +0,0 @@
---
platform: template
sensors:
harmonyhub_status:
friendly_name: "Harmony Hub Status"
value_template: "{{ states.remote.harmony_hub.attributes.current_activity }}"

View File

@@ -110,8 +110,8 @@ sensor:
{{ state_attr('Sun.sun', 'next_rising') }}
sun_next_setting: >
{{ state_attr('Sun.sun', 'next_setting') }}
# moon_phase_icon: >
# {{ state_attr('sensor.moon_phase', 'icon') }}
moon_phase_icon: >
{{ state_attr('sensor.moon_phase', 'icon') }}
media_playing_status: >
{{ states('media_player.keuken') }}
@@ -119,3 +119,11 @@ sensor:
{{ state_attr('media_player.keuken', 'media_title') | title }}
media_playing_artist: >
{{ state_attr('media_player.keuken', 'media_artist') | title }} (on {{ state_attr('media_player.office_sonos', 'media_channel') | title }})
day_full: >
{% set days = ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag'] %}
{{ days[now().weekday()] }}
datum: >
{% set months = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'] %}
{{ now().day }} {{ months[now().month-1] }} {{ now().year }}

View File

@@ -1,29 +1,29 @@
---
sensor:
- name: Temperatuur_Slaapkamer_Luuk
unique_id: kamer_luuk_temperatuur
unit_of_measurement: "°C"
device_class: temperature
state: >
{{ state_attr('climate.kamer_luuk','current_temperature') }}
# sensor:
# - name: Temperatuur_Slaapkamer_Luuk
# unique_id: kamer_luuk_temperatuur
# unit_of_measurement: "°C"
# device_class: temperature
# state: >
# {{ state_attr('climate.kamer_luuk','current_temperature') }}
- name: Temperatuur_Badkamer
unique_id: Temperatuur_Badkamer
unit_of_measurement: "°C"
device_class: temperature
state: >
{{ state_attr('climate.Badkamer','current_temperature') }}
# - name: Temperatuur_Badkamer
# unique_id: Temperatuur_Badkamer
# unit_of_measurement: "°C"
# device_class: temperature
# state: >
# {{ state_attr('climate.Badkamer','current_temperature') }}
- name: Temperatuur_Woonkamer
unique_id: Temperatuur_Woonkamer
unit_of_measurement: "°C"
device_class: temperature
state: >
{{ state_attr('climate.woonkamer','current_temperature')}}
# - name: Temperatuur_Woonkamer
# unique_id: Temperatuur_Woonkamer
# unit_of_measurement: "°C"
# device_class: temperature
# state: >
# {{ state_attr('climate.woonkamer','current_temperature')}}
- name: Temperatuur_Hal
unique_id: Temperatuur_Hal
unit_of_measurement: "°C"
device_class: temperature
state: >
{{ state_attr('climate.speel_hal', 'current_temperature') }}
# - name: Temperatuur_Hal
# unique_id: Temperatuur_Hal
# unit_of_measurement: "°C"
# device_class: temperature
# state: >
# {{ state_attr('climate.speel_hal', 'current_temperature') }}

View File

@@ -1,28 +0,0 @@
---
trigger:
platform: time_pattern
minutes: "/1"
action:
- service: weather.get_forecasts
data:
type: daily
target:
entity_id: weather.forecast_home
response_variable: daily
sensor:
- name: ttgo Display Data
unique_id: ttgo_display_data
icon: ios:display-2
availability: true
state: "OK"
attributes:
temperature: >
{{ daily["weather.forecast_home"].forecast[0].temperature | round }}
temperature_unit: >
{{ state_attr('weather.forecast_home', 'temperature_unit')}}
wind_speed: >
{{ daily["weather.forecast_home"].forecast[0].wind_speed }}
weather_condition_0: >
{{ daily["weather.forecast_home"].forecast[0].condition }}
netto_power: >
{{ states('sensor.dsmr_reading_electricity_currently_delivered')}}

View File

@@ -0,0 +1,32 @@
esphome:
name: display2
friendly_name: display2
esp32:
board: esp32-s3-devkitc-1
framework:
type: esp-idf
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "oYzH7FkN0cDSL7aTynztxyc1fiHIgbvxu9hvprJ1M8M="
ota:
- platform: esphome
password: "0a47dce7c6c30dcab46c0dff9d5b09e1"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Display2 Fallback Hotspot"
password: "i4FclugUojhf"
captive_portal:

View File

@@ -2,8 +2,8 @@
substitutions:
device_name: "badkamerradfan"
friendly_name: "badkamerradfan"
comment: "esp32-c3"
location: "badkamer"
comment: "esp32-c3 - BTproxy"
location: "Badkamer"
api_password: !secret badkamerradfan_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid

View File

@@ -1,10 +1,10 @@
substitutions:
device_name: "btproxykeuken"
friendly_name: "BT_proxy_keuken"
comment: "ESP32-c3 proxy"
comment: "ESP32-c3 BTproxy"
location: "keuken"
board: "esp32-c3-devkitm-1"
framework: arduino
framework: esp-idf
api_password: !secret bt_proxy_keuken_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid

View File

@@ -11,18 +11,18 @@ substitutions:
subnet: !secret ip_subnet
ip: !secret stepper_ip
update_interval: 30s
pin_mot_rst: GPIO26
pin_mot_slp: GPIO33
pin_mot_dir: GPIO38
pin_mot_stp: GPIO34
pin_mot_rst: GPIO13
pin_mot_slp: GPIO16
pin_mot_dir: GPIO18
pin_mot_stp: GPIO17
pin_mot_en: GPIO21
pin_hall_dir: GPIO39
pin_hall_stp: GPIO40
pin_hall_dir: GPIO34
pin_hall_stp: GPIO33
pin_sda: GPIO15
pin_scl: GPIO14
pin_led1: GPIO45
pin_led1: GPIO38
num_leds: "1"
chipset: ws2812
chipset: sk6812
blinds_name: speelkamer
packages:
@@ -30,7 +30,7 @@ packages:
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
logger: !include templates/logger.yaml
#leds: !include templates/light_rgbw_rmt.yaml
leds: !include templates/light_rgbw_rmt.yaml
i2c: !include interfaces/i2c_a.yaml
bme: !include sensors/bme280.yaml
light: !include sensors/light_tsl2591.yaml
@@ -58,6 +58,10 @@ esphome:
- number.set:
id: calibration_max
value: !lambda "return id(calibration_max_global);"
- number.set:
id: calibration_min
value: !lambda "return id(calibration_min_global);"
- lambda: id(motor_hal).publish_state(id(hall_pos_global));
globals:
- id: hall_pos_global
@@ -76,6 +80,10 @@ globals:
type: int
restore_value: True
initial_value: '250'
- id: calibration_min_global
type: int
restore_value: True
initial_value: '-250'
number:
- platform: template
@@ -106,7 +114,7 @@ number:
- logger.log: "endstop open stored"
- platform: template
id: calibration_max
min_value: 0
min_value: -1000
max_value: 1000
step: 1
name: calibration max
@@ -117,6 +125,20 @@ number:
id: calibration_max_global
value: !lambda "return x;"
- logger.log: "calirbation max stored"
- platform: template
id: calibration_min
min_value: -1000
max_value: 1000
step: 1
name: calibration min
optimistic: true
on_value:
then:
- globals.set:
id: calibration_min_global
value: !lambda "return x;"
- logger.log: "calirbation min stored"
- platform: template
name: Stepper Control
@@ -167,6 +189,12 @@ binary_sensor:
id(hall_pos_global) = motorvalue;
ESP_LOGD("on sensor", "motor hall: %d", motorvalue);
switch:
- platform: gpio
pin: ${pin_mot_rst}
id: stepper_reset
name: "stepper reset"
restore_mode: RESTORE_DEFAULT_OFF
stepper:
- platform: a4988
@@ -180,33 +208,92 @@ stepper:
button:
# - platform: template
# id: Calibrate_blinds
# name: Calibrate blinds
# on_press:
# # reset all params
# - globals.set:
# id: hall_pos_global
# value: "0"
# - logger.log:
# format: "hal pos set to 0 (hal pos = %i)"
# args: [id(hall_pos_global)]
# #tell stepper that he is in the middle
# - stepper.report_position:
# id: stepper_motor
# position: !lambda "return uint32_t(id(calibration_max));"
# - logger.log:
# format: "stepper pos set to 0 (stepper pos = %i)"
# args: [id(stepper_motor).current_position]
# # 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]
- platform: template
id: Calibrate_blinds
name: Calibrate blinds
id: steppermax
name: stepper Max
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
target: !lambda "return uint32_t(id(calibration_max).state);"
- platform: template
id: stepperreset
name: stepper reset
on_press:
- stepper.report_position:
id: stepper_motor
position: 0
- stepper.set_target:
id: stepper_motor
target: 0
- platform: template
id: steppermin
name: stepper Min
on_press:
- stepper.set_target:
id: stepper_motor
target: !lambda "return uint32_t(id(calibration_min).state);"
- platform: template
id: getstepperpos
name: Stepper Getpos
on_press:
- logger.log:
format: "hal pos = %i; stepper cur pos = %i; stepper target pos = %i"
args: [id(hall_pos_global), id(stepper_motor).current_position, id(stepper_motor).target_position]
- platform: template
id: hallreset
name: Hall Reset
on_press:
- globals.set:
id: hall_pos_global
value: "0"
- lambda: id(motor_hal).publish_state(id(hall_pos_global));
- platform: template
id: runtohalmin
name: Run to hall min
on_press:
- while:
condition:
lambda: 'return id(hall_pos_global) > -10;'
then:
- stepper.set_target:
id: stepper_motor
target: !lambda 'return id(stepper_motor).current_position + 10;'
- logger.log:
format: "hal pos = %i; stepper pos = %i"
args: [id(hall_pos_global), id(stepper_motor).current_position]
format: "hal pos = %i; stepper cur pos = %i; stepper target pos = %i"
args: [id(hall_pos_global), id(stepper_motor).current_position, id(stepper_motor).target_position]
@@ -242,12 +329,12 @@ button:
# 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'
# 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;'

View File

@@ -0,0 +1,38 @@
substitutions:
device_name: "esp32-c3-aqs-ikea-co2"
friendly_name: "AQS-ikea-co2"
comment: "esp32, pm, co2, display, BTproxy"
location: "zolder"
board: "esp32-c3-devkitm-1"
framework: esp-idf
api_password: !secret air_quality_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 aqs_ikea_co2_ip
update_interval: 1s
pin_status: GPIO8
pin_sda: GPIO6
pin_scl: GPIO7
#pin_led1: GPIO10
#chipset: WS2812
#num_leds: "1"
packages:
board: !include boards/esp32-gen.yaml
i2c: !include interfaces/i2c_a.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
#status: !include templates/status.yaml
logger: !include templates/logger.yaml
#bt_proxy: !include common/bluetooth.yaml
#leds: !include templates/light_rgbw_rmt.yaml
#sensors
co2: !include sensors/scd30.yaml
tvoc: !include sensors/sgp30.yaml

View File

@@ -1,7 +1,7 @@
substitutions:
device_name: "esp32-s2-aqs-ikea"
friendly_name: "AQS-zolder"
comment: "esp32, pm, co2, display, btprox"
comment: "esp32, pm, co2, display, BTproxy"
location: "zolder"
api_password: !secret air_quality_zolder_api
ota_password: !secret ota_password
@@ -21,7 +21,7 @@ substitutions:
packages:
board: !include boards/esp32_wroom_arduino.yaml
i2c: !include interfaces/i2c_a_slow.yaml
i2c: !include interfaces/i2c_a.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
status: !include templates/status.yaml
@@ -29,7 +29,6 @@ packages:
bt_proxy: !include common/bluetooth.yaml
#sensors
#mmwave: !include sensors/ld2420.yaml
pms: !include sensors/pm1006.yaml
co2: !include sensors/scd30.yaml
tvoc: !include sensors/sgp30.yaml

View File

@@ -1,10 +1,10 @@
substitutions:
device_name: "btproxyhal"
friendly_name: "BT_proxy_hal"
comment: "ESP32-c3 proxy"
comment: "ESP32-c3 BTproxy"
location: "hal"
board: "esp32-c3-devkitm-1"
framework: arduino
framework: esp-idf
api_password: !secret bt_proxy_hal_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
@@ -22,7 +22,7 @@ packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi_btprox.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
logger: !include templates/nologger.yaml
#status: !include templates/status.yaml
btproxy: !include templates/bt_proxy.yaml
#bme: !include sensors/bme280.yaml

View File

@@ -0,0 +1,26 @@
substitutions:
device_name: "btproxyslaapkameriw"
friendly_name: "BT_proxy_slaaplamer_iw"
comment: "ESP32-c3 BTproxy"
location: "Slaapkamer Tim"
board: "esp32-c3-devkitm-1"
framework: esp-idf
api_password: !secret bt_proxy_slaapkamer_iw_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_slaapkamer_iw_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

@@ -1,10 +1,10 @@
substitutions:
device_name: "btproxyspeelkamer"
friendly_name: "BT_proxy_speelkamer"
comment: "ESP32-c3 proxy"
comment: "ESP32-c3 BTproxy"
location: "speelkamer"
board: "esp32-c3-devkitm-1"
framework: arduino
framework: esp-idf
api_password: !secret bt_proxy_speelkamer_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid

View File

@@ -1,10 +1,10 @@
substitutions:
device_name: "btproxywoonkamer"
friendly_name: "BT_proxy_woonkamer"
comment: "ESP32-c3 proxy"
comment: "ESP32-c3 BTproxy"
location: "woonkamer"
board: "esp32-c3-devkitm-1"
framework: arduino
framework: esp-idf
api_password: !secret bt_proxy_woonkamer_api
ota_password: !secret ota_password

View File

@@ -1,7 +1,7 @@
substitutions:
device_name: "btproxyzolder"
friendly_name: "BT_proxy_zolder"
comment: "ESP32-c3 proxy"
comment: "ESP32-c3 BTproxy"
location: "zolder"
board: "esp32-c3-devkitm-1"
#framework: esp-idf

View File

@@ -0,0 +1,17 @@
substitutions:
name: everything-presence-lite-20946c
friendly_name: Everything Presence Lite 20946c
packages:
EverythingSmartTechnology.Everything_Presence_Lite: github://everythingsmarthome/everything-presence-lite/everything-presence-lite-ha.yaml@main
esphome:
name: ${name}
name_add_mac_suffix: false
friendly_name: ${friendly_name}
api:
encryption:
key: 0ZAfs0jaWqKlNuTPEiPYj5vgi1eA0GPZU1xYtJAEdAM=
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

View File

@@ -0,0 +1,55 @@
substitutions:
name: ${device_name}
device_name: "ep1_woonkamer"
location: "woonkamer"
comment: "esp32, mmwave, pir, BTproxy"
friendly_name: "ep1_woonkamer"
project_name: "Everything Smart Technology.Everything Presence One"
project_version: "1.1.3"
temperature_offset: "-3"
humidity_offset: "5"
temperature_update_interval: "60s"
illuminance_update_interval: "30s"
pir_delay_off: "10s"
occupancy_delay_off: "15s"
hidden_ssid: "false"
factory_reset_disabled: "true"
uart_target_output_disabled: "true"
uart_presence_output_disabled: "true"
api_password: !secret ep1_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 ep1_woonkamer_ip
pin_sda: GPIO26
pin_scl: GPIO25
pin_status: GPIO32
packages:
board: !include boards/esp32_wroom_arduino.yaml
device_base: !include common/common.yaml
device_version: !include common/ep_one-sen0395-stable.yaml
connection: !include common/wifi.yaml
logger: !include templates/logger.yaml
i2c: !include interfaces/i2c_a.yaml
bt_proxy: !include common/bluetooth.yaml
sen0395_base: !include sensors/sen0395_base.yaml
wifi:
on_connect:
- switch.turn_on: mmwave_sensor
esp32_improv:
authorizer: none
dashboard_import:
package_import_url: github://everythingsmarthome/everything-presence-one/everything-presence-one-ble.yaml@main
import_full_config: false
esphome:
project:
name: "${project_name}"
version: "${project_version}"

View File

@@ -2,7 +2,7 @@ substitutions:
name: ${device_name}
device_name: "ep1-zolder"
location: "Zolder"
comment: "esp32, mmwave, pir"
comment: "esp32, mmwave, pir, BTproxy"
friendly_name: "ep1-zolder"
project_name: "Everything Smart Technology.Everything Presence One"
project_version: "1.1.3"
@@ -33,7 +33,8 @@ packages:
connection: !include common/wifi.yaml
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

@@ -0,0 +1,28 @@
substitutions:
device_name: "halloween-ghost01"
friendly_name: "halloween-ghost01"
comment: "esp32c3, RGBled"
location: "Woonkamer"
board: "esp32-c3-devkitm-1"
framework: arduino
api_password: !secret halloween_ghost01_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 halloween_ghost01_ip
pin_led1: GPIO10
num_leds: "1"
chipset: WS2812
packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
leds: !include templates/light_rgbw_rmt.yaml
bt_proxy: !include common/bluetooth.yaml

View File

@@ -0,0 +1,17 @@
substitutions:
name: home-assistant-voice-095f77
friendly_name: Home Assistant Voice 095f77
packages:
Nabu Casa.Home Assistant Voice PE: github://esphome/home-assistant-voice-pe/home-assistant-voice.yaml
esphome:
name: ${name}
name_add_mac_suffix: false
friendly_name: ${friendly_name}
api:
encryption:
key: kfc7zAySq+LlWF4rdeDEwv7pXqcxIeCCkQE5yCWhi9s=
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

View File

@@ -14,8 +14,8 @@ substitutions:
pin_relay: GPIO14
pin_button: GPIO1
pin_status: GPIO13
pin_cf: GPIO05
pin_cf1: GPIO04
pin_cf: GPIO04
pin_cf1: GPIO05
pin_sel: GPIO12
@@ -52,21 +52,23 @@ switch:
sensor:
- platform: hlw8012
model: BL0937 # note that the model must be specified to use special calculation parameters
current_resistor: 0.001 # adjust it according to the actual resistor value on board
voltage_divider: 2012 # (2008.1K)/998 = 2004, adjust it according to the actual resistor values on board
current_resistor: 0.0010613489336676262 # adjust it according to the actual resistor value on board
voltage_divider: 1407.7685950413224 # (2008.1K)/998 = 2004, adjust it according to the actual resistor values on board
sel_pin:
number: ${pin_sel}
inverted: true # the logic of BL0937 is opposite from HLW8012
cf_pin: ${pin_cf}
cf1_pin: ${pin_cf1}
current:
name: '${device_name} Current'
name: 'Current'
filters:
- multiply: 0.7162477466468644
voltage:
name: '${device_name} Voltage'
name: 'Voltage'
power:
name: '${device_name} Power'
name: 'Power'
energy:
name: '${device_name} Energy'
name: 'Energy'
# convert to kWh
filters:
- multiply: 0.001

View File

@@ -0,0 +1,42 @@
substitutions:
device_name: "zemismart-curtain"
friendly_name: "zemismart curtain"
comment: "esp8266 tuya mcu curtain"
location: "overloop"
api_password: !secret zemismart_curtain
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 zemismart_curtain_ip
pin_curtain_rx: GPIO13
pin_curtain_tx: GPIO15
packages:
board: !include boards/esp01.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
logger: !include templates/nologger.yaml
uart:
- !include interfaces/uart_tywe1s.yaml
esphome:
includes:
- include/bcm500ds.h
cover:
- platform: custom
lambda: |-
auto curtain = new CustomCurtain();
App.register_component(curtain);
return {curtain};
covers:
- name: Curtain
device_class: curtain
custom_component:
- lambda: |-
return { new CustomAPI() };

View File

@@ -14,7 +14,7 @@ substitutions:
pin_led1: GPIO3
pin_led2: GPIO4
pin_led3: GPIO1
ledc_freq: "1220Hz"
ledc_freq: "25000Hz"
packages:
board: !include boards/esp32-C3.yaml

View File

@@ -1,6 +1,6 @@
substitutions:
device_name: "kersthuis-01"
friendly_name: "kersthuis-01"
friendly_name: "kersthuis-01_staircase"
comment: "esp32-c3"
location: "woonkamer"
api_password: !secret kersthuis-01_api
@@ -17,37 +17,28 @@ packages:
board: !include boards/esp32-C3.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
# status: !include templates/status.yaml
logger: !include templates/logger.yaml
#led packages
ledje1: !include
file: templates/LedWithEffects.yaml
vars:
entityID: led_lights
entityName: "led string 1"
pin_led: ${pin_led1}
light:
- platform: monochromatic
id: led_lights
restore_mode: RESTORE_DEFAULT_ON
output: leds
name: "led string 1"
effects:
- flicker:
name: "Flicker"
alpha: 95%
intensity: 1.5%
output:
- platform: ledc
pin: ${pin_led1}
id: leds
# binary_sensor:
# - platform: gpio
# name: "Button"
# pin: ${pin_button}
# filters:
# - delayed_on: 20ms
# on_click:
# min_length: 50ms
# max_length: 1000ms
# then:
# - light.toggle:
# id: led_lights
binary_sensor:
- platform: gpio
name: "Button"
pin: ${pin_button}
filters:
- delayed_on: 20ms
on_click:
min_length: 50ms
max_length: 1000ms
then:
- light.toggle:
id: led_lights

View File

@@ -1,8 +1,8 @@
substitutions:
device_name: "kersthuis-02"
friendly_name: "kersthuis-02"
comment: "esp32-c3"
friendly_name: "kersthuis-02_peperkoekman"
comment: "esp32-c3: SK6812"
location: "woonkamer"
api_password: !secret kersthuis-02_api
ip: !secret kersthuis-02_ip
@@ -11,6 +11,8 @@ substitutions:
wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
chipset: SK6812
num_leds: "3"
pin_led1: GPIO3
@@ -20,21 +22,22 @@ packages:
connection: !include common/wifi.yaml
# status: !include templates/status.yaml
logger: !include templates/logger.yaml
leds: !include templates/light_rgbw_rmt.yaml
light:
- platform: esp32_rmt_led_strip
rmt_channel: 0
is_rgbw: true
id: led_lights
restore_mode: RESTORE_DEFAULT_ON
name: "kersthuisje2"
chipset: SK6812
rgb_order: GRB
num_leds: 1
pin: ${pin_led1}
effects:
- flicker:
name: "Flicker"
alpha: 95%
intensity: 1.5%
# light:
# - platform: esp32_rmt_led_strip
# rmt_channel: 0
# is_rgbw: true
# id: led_lights
# restore_mode: RESTORE_DEFAULT_ON
# name: "kersthuisje2"
# chipset: SK6812
# rgb_order: GRB
# num_leds: 1
# pin: ${pin_led1}
# effects:
# - flicker:
# name: "Flicker"
# alpha: 95%
# intensity: 1.5%

View File

@@ -19,72 +19,27 @@ packages:
board: !include boards/esp32-C3.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
# status: !include templates/status.yaml
logger: !include templates/logger.yaml
light:
- platform: monochromatic
id: led_light1
restore_mode: RESTORE_DEFAULT_ON
output: led1
name: led_light1
effects:
- flicker:
name: "Flicker"
alpha: 95%
intensity: 1.5%
on_turn_on:
- light.turn_on:
id: led_light1
effect: flicker
brightness: 75%
- platform: monochromatic
id: led_light2
restore_mode: RESTORE_DEFAULT_ON
output: led2
name: led_light2
effects:
- flicker:
name: "Flicker"
alpha: 95%
intensity: 1.5%
on_turn_on:
- light.turn_on:
id: led_light2
effect: flicker
brightness: 75%
- platform: monochromatic
id: led_light3
restore_mode: RESTORE_DEFAULT_ON
output: led3
name: led_light3
effects:
- flicker:
name: "Flicker"
alpha: 95%
intensity: 1.5%
on_turn_on:
- light.turn_on:
id: led_light3
effect: flicker
brightness: 75%
output:
- platform: ledc
pin: ${pin_led1}
id: led1
- platform: ledc
pin: ${pin_led2}
id: led2
- platform: ledc
pin: ${pin_led3}
id: led3
#led packages
ledje1: !include
file: templates/LedWithEffects.yaml
vars:
entityID: led_light1
entityName: "led_light1"
pin_led: ${pin_led1}
ledje2: !include
file: templates/LedWithEffects.yaml
vars:
entityID: led_light2
entityName: "led_light2"
pin_led: ${pin_led2}
ledje3: !include
file: templates/LedWithEffects.yaml
vars:
entityID: led_light3
entityName: "led_light2"
pin_led: ${pin_led3}
binary_sensor:
- platform: gpio

View File

@@ -1,30 +1,9 @@
---
# 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 #needs idf
# 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

@@ -7,3 +7,9 @@ esphome:
button:
- platform: restart
name: 'Restart'
id: restart_internal
- platform: safe_mode
internal: false
name: Safe mode
entity_category: config
disabled_by_default: True

View File

@@ -0,0 +1,251 @@
uart:
id: uart_bus
tx_pin: GPIO13
rx_pin: GPIO14
baud_rate: 115200
debug:
direction: BOTH
dummy_receiver: true
after:
delimiter: "\n"
sequence:
- lambda: UARTDebug::log_string(direction, bytes);
binary_sensor:
- platform: gpio
name: mmWave
id: mmwave
device_class: occupancy
pin:
number: GPIO15
mode: INPUT_PULLDOWN
- platform: gpio
pin:
number: 33
mode: INPUT_PULLDOWN
name: PIR
id: pir_motion_sensor
device_class: motion
filters:
- delayed_off: !lambda 'return id(pir_off_latency).state * 1000.0;'
- platform: template
name: Occupancy
id: occupancy
device_class: occupancy
filters:
- delayed_off: !lambda 'return id(occupancy_off_latency).state * 1000.0;'
on_state:
- lambda: 'id(illuminance_sensor).update();'
lambda: |-
if ( id(mmwave).state or id(pir_motion_sensor).state) {
return true;
}
else if (id(mmwave).state == 0 and id(pir_motion_sensor).state == 0) {
return false;
}
else {
return id(occupancy).state;
}
number:
- platform: template
id: mmwave_distance
name: mmWave distance
icon: mdi:arrow-left-right
entity_category: config
min_value: 0
max_value: 800
initial_value: 315
optimistic: true
step: 15
restore_value: true
unit_of_measurement: cm
mode: slider
set_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: !lambda int cm = (int)ceil(x / 15.0);
std::string cms = "detRangeCfg -1 0 " + to_string(cm);
return std::vector<unsigned char>(cms.begin(), cms.end());
- delay: 1s
- uart.write: "saveCfg 0x45670123 0xCDEF89AB 0x956128C6 0xDF54AC89"
- delay: 1s
- switch.turn_on: mmwave_sensor
- platform: template
name: Occupancy off latency
icon: mdi:clock-end
entity_category: config
id: occupancy_off_latency
min_value: 1
max_value: 600
initial_value: 15
optimistic: true
step: 5
restore_value: true
unit_of_measurement: seconds
mode: slider
- platform: template
name: PIR off latency
icon: mdi:clock-end
entity_category: config
id: pir_off_latency
min_value: 1
max_value: 120
initial_value: 10
optimistic: true
step: 1
restore_value: true
unit_of_measurement: seconds
mode: slider
- platform: template
name: "Temperature Offset"
id: temperature_offset_ui
unit_of_measurement: "°C"
min_value: -20
max_value: 20
step: 0.1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 0
icon: "mdi:thermometer"
entity_category: config
on_value:
- lambda: 'id(shtc3_sensor).update();'
- platform: template
name: "Humidity Offset"
id: humidity_offset_ui
unit_of_measurement: "%"
min_value: -50
max_value: 50
step: 0.1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 0
icon: "mdi:water-percent"
entity_category: config
on_value:
- lambda: 'id(shtc3_sensor).update();'
- platform: template
name: "Illuminance Offset"
id: illuminance_offset_ui
unit_of_measurement: "lx"
min_value: -50
max_value: 50
step: 1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 0
icon: "mdi:brightness-5"
entity_category: config
on_value:
- lambda: 'id(illuminance_sensor).update();'
switch:
- platform: template
name: UART target output
id: uart_target_output
entity_category: config
internal: ${uart_target_output_disabled}
optimistic: true
assumed_state: false
turn_on_action:
- logger.log: "UART Target Output On"
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: "setUartOutput 2 1 1 1"
- delay: 1s
- uart.write: "saveConfig"
- delay: 3s
- switch.turn_on: mmwave_sensor
turn_off_action:
- logger.log: "UART Presence Output Off"
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: "setUartOutput 2 0"
- delay: 1s
- uart.write: "saveConfig"
- delay: 3s
- switch.turn_on: mmwave_sensor
light:
- platform: status_led
name: ESP32 status LED
pin: GPIO32
entity_category: config
disabled_by_default: False
sensor:
- platform: shtcx
id: "shtc3_sensor"
i2c_id: bus_a
temperature:
name: Temperature
id: temperature_sensor
filters:
- offset: ${temperature_offset}
- lambda: "return x + id(temperature_offset_ui).state;"
humidity:
name: Humidity
id: humidity_sensor
filters:
- offset: ${humidity_offset}
- lambda: "return x + id(humidity_offset_ui).state;"
address: 0x70
update_interval: ${temperature_update_interval}
- platform: bh1750
name: Illuminance
id: illuminance_sensor
i2c_id: bus_a
address: 0x23
update_interval: ${illuminance_update_interval}
filters:
- calibrate_linear:
method: exact
datapoints:
- 0.3 -> 0.3
- 0.9 -> 1.7
- 1.2 -> 3.6
- 3.2 -> 6.9
- 5.1 -> 10.2
- 6.8 -> 27.1
- 7.0 -> 13.5
- 7.4 -> 28.2
- 8.7 -> 21.7
- 8.9 -> 17.1
- 10.9 -> 20.4
- 12.8 -> 23.5
- 14.5 -> 31.2
- 14.9 -> 26.7
- 16.8 -> 41.1
- 16.9 -> 30.2
- 18.8 -> 33.4
- 19.1 -> 35.8
- 20.7 -> 37.0
- 24.3 -> 60.3
- 26.1 -> 68.6
- 26.7 -> 83.8
- 30.2 -> 75.9
- 32.6 -> 80.3
- 34.6 -> 83.2
- 40.4 -> 99.9
- 48.0 -> 183.7
- 48.3 -> 119.2
- 55.5 -> 141.3
- 55.8 -> 137.9
- 63.8 -> 157.6
- 71.5 -> 176.9
- 79.8 -> 197.1
- 84.3 -> 205.7
- lambda: "return x + id(illuminance_offset_ui).state;"
- clamp:
min_value: 0

View File

@@ -10,15 +10,18 @@ ota:
password: ${ota_password}
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
networks:
- ssid: ${wifi_ssid}
password: ${wifi_password}
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
- ssid: ${wifi_ssid2}
password: ${wifi_password2}
#use_address: 192.168.2.235 #when changing fixed IP
# Enable fallback hotspot (captive portal) in case wifi connection fails

View File

@@ -10,16 +10,18 @@ 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
networks:
- ssid: ${wifi_ssid}
password: ${wifi_password}
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
- ssid: ${wifi_ssid2}
password: ${wifi_password2}
#use_address: 192.168.2.235 #when changing fixed IP
# Enable fallback hotspot (captive portal) in case wifi connection fails

View File

@@ -10,15 +10,18 @@ ota:
password: ${ota_password}
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
networks:
- ssid: ${wifi_ssid}
password: ${wifi_password}
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
- ssid: ${wifi_ssid2}
password: ${wifi_password2}
# use_address: 192.168.2.63 #when changing fixed IP
ap:

View File

@@ -8,13 +8,17 @@ ota:
password: ${ota_password}
wifi:
ssid: ${wifi_ssid}
password: ${wifi_password}
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
networks:
- ssid: ${wifi_ssid}
password: ${wifi_password}
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
- ssid: ${wifi_ssid2}
password: ${wifi_password2}
# Enable fallback hotspot (captive portal) in case wifi connection fails

View File

@@ -8,15 +8,18 @@ ota:
password: ${ota_password}
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
networks:
- ssid: ${wifi_ssid}
password: ${wifi_password}
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
- ssid: ${wifi_ssid2}
password: ${wifi_password2}
# use_address: 192.168.2.63 #when changing fixed IP
# Enable fallback hotspot (captive portal) in case wifi connection fails

View File

@@ -17,15 +17,18 @@ ota:
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
networks:
- ssid: ${wifi_ssid}
password: ${wifi_password}
manual_ip:
static_ip: ${ip}
gateway: ${gateway}
subnet: ${subnet}
dns1: 192.169.2.15
dns2: 1.1.1.1
- ssid: ${wifi_ssid2}
password: ${wifi_password2}
# use_address: 192.168.2.63 #when changing fixed IP
# Enable fallback hotspot (captive portal) in case wifi connection fails

View File

@@ -0,0 +1,7 @@
```yaml
# example configuration:
cover:
platform: tuya_cover
name: Tuya cover
```

View File

@@ -0,0 +1,200 @@
#include "bcm500ds.h"
namespace esphome {
namespace tuya_cover {
// // Forward declarations
// bool read_command();
// void write_command(TUYACOVERCommandType command, const uint8_t *value, uint16_t length);
// uint8_t checksum();
/*
* Attempt to read an entire command from the serial UART into the command struct.
* Will fail early if unable to find the two-byte header in the current
* data stream. If the header is found, it will contine to read the complete
* TLV+checksum sequence off the port. If the entire sequence can be read
* and the checksum is valid, it will return true.
*/
bool bcm500ds::read_command()
{
// Shift bytes through until we find a valid header
bool valid_header = false;
while (Serial.available() >= 1)
{
uart_buffer_[0] = uart_buffer_[1];
uart_buffer_[1] = Serial.read();
command_.header = (uart_buffer_[0] << 8) + uart_buffer_[1];
if (command_.header == TUYA_COVER_HEADER)
{
valid_header = true;
break;
}
}
// Read the next 4 bytes (Version, Command, Data length)
// Read n bytes (Data length)
// Read the checksum byte
if (valid_header)
{
Serial.readBytes(uart_buffer_ + TUYA_COVER_HEADER_LEN, TUYA_COVER_BUFFER_LEN - TUYA_COVER_HEADER_LEN);
command_.version = uart_buffer_[2];
command_.command = uart_buffer_[3];
command_.length = (uart_buffer_[4] << 8) + uart_buffer_[5];
ESP_LOGV(TAG, "RX: Header = 0x%04X, Version = 0x%02X, Command = 0x%02X, Data length = 0x%04X", command_.header, command_.version, command_.command, command_.length);
if (command_.length < TUYA_COVER_MAX_LEN)
{
Serial.readBytes(command_.value, command_.length);
ESP_LOGV(TAG, "RX_RAW:");
for (size_t i = 0; i < command_.length; i++)
{
ESP_LOGV(TAG, "%02d: 0x%02X", i, command_.value[i]);
}
while (Serial.available() == 0) // Dirty
{
//Wait
}
command_.checksum = Serial.read();
ESP_LOGV(TAG, "RX_CHK: 0x%02X", command_.checksum);
uint8_t calc_checksum = checksum();
if (calc_checksum == command_.checksum)
{
// Clear buffer contents to start with beginning of next command
memset(uart_buffer_, 0, TUYA_COVER_BUFFER_LEN);
return true;
}
else
{
memset(uart_buffer_, 0, TUYA_COVER_BUFFER_LEN);
ESP_LOGE(TAG, "Checksum error: Read = 0x%02X != Calculated = 0x%02X", command_.checksum, calc_checksum);
}
}
else
{
memset(uart_buffer_, 0, TUYA_COVER_BUFFER_LEN);
ESP_LOGE(TAG, "Command length exceeds limit: %d >= %d", command_.length, TUYA_COVER_MAX_LEN);
}
}
// Do not clear buffer to allow for resume in case of reading partway through header RX
return false;
}
/*
* Store the given type, value, and length into the command struct and send
* it out the serial port. Automatically calculates the checksum as well.
*/
void bcm500ds::write_command(TUYACOVERCommandType command, const uint8_t *value, uint16_t length)
{
// Copy params into command struct
command_.header = TUYA_COVER_HEADER;
command_.version = TUYA_COVER_VERSION;
command_.command = command;
command_.length = length;
ESP_LOGV(TAG, "TX: Header = 0x%04X, Version = 0x%02X, Command = 0x%02X, Data length = 0x%04X", command_.header, command_.version, command_.command, command_.length);
memcpy(&command_.value, value, length);
ESP_LOGV(TAG, "TX_RAW");
for (size_t i = 0; i < command_.length; i++)
{
ESP_LOGV(TAG, "%02d: 0x%02X", i, command_.value[i]);
}
// Copy struct values into buffer, converting longs to big-endian
uart_buffer_[0] = command_.header >> 8;
uart_buffer_[1] = command_.header & 0xFF;
uart_buffer_[2] = command_.version;
uart_buffer_[3] = command_.command;
uart_buffer_[4] = command_.length >> 8;
uart_buffer_[5] = command_.length & 0xFF;
command_.checksum = checksum();
ESP_LOGV(TAG, "TX_CHK: 0x%02X", command_.checksum);
// Send buffer out via UART
Serial.write(uart_buffer_, TUYA_COVER_BUFFER_LEN);
Serial.write(command_.value, command_.length);
Serial.write(command_.checksum);
// Clear buffer contents to avoid re-reading our own payload
memset(uart_buffer_, 0, TUYA_COVER_BUFFER_LEN);
}
/*
* Calculate checksum from current UART buffer (header+type+length) plus command value.
*/
uint8_t bcm500ds::checksum()
{
uint8_t checksum = 0;
for (size_t i = 0; i < TUYA_COVER_BUFFER_LEN; i++)
{
checksum += uart_buffer_[i];
}
for (size_t i = 0; i < command_.length; i++)
{
checksum += command_.value[i];
}
return checksum;
}
void bcm500ds::setup()
{
write_command(TUYA_COVER_QUERY_STATUS, 0, 0);
}
void bcm500ds::loop()
{
unsigned long currentHeartbeatMillis = millis();
if (currentHeartbeatMillis - previousHeartbeatMillis >= HEARTBEAT_INTERVAL_MS)
{
previousHeartbeatMillis += HEARTBEAT_INTERVAL_MS;
ESP_LOGI(TAG, "TUYA_COVER_COMMAND = HEARTBEAT");
write_command(TUYA_COVER_HEARTBEAT, 0, 0);
}
}
void bcm500ds::command_close()
{
ESP_LOGI(TAG, "TUYA_COVER_COMMAND = CLOSE");
write_command(TUYA_COVER_COMMAND, tuya_cover_close, sizeof(tuya_cover_close));
}
void bcm500ds::command_open()
{
ESP_LOGI(TAG, "TUYA_COVER_COMMAND = OPEN");
write_command(TUYA_COVER_COMMAND, tuya_cover_open, sizeof(tuya_cover_open));
}
void bcm500ds::command_gotoPos(uint8_t pos)
{
tuya_cover_pos[7] = pos;
ESP_LOGI(TAG, "TUYA_COVER_COMMAND = POS = %d%%", pos);
write_command(TUYA_COVER_COMMAND, tuya_cover_pos, sizeof(tuya_cover_pos));
}
void bcm500ds::command_stop()
{
write_command(TUYA_COVER_COMMAND, tuya_cover_stop, sizeof(tuya_cover_stop));
}
uint8_t bcm500ds::query_pos()
{
return (1-((command_.value[7]) / 100.0f));
}
uint8_t bcm500ds::query_value(uint8_t index)
{
if(index <= TUYA_COVER_MAX_LEN)
{
return command_.value[index];
}
return 0;
}
uint8_t bcm500ds::query_cmd()
{
return command_.command;
}
} // namespace tuya_cover
} // namespace esphome

View File

@@ -0,0 +1,108 @@
#pragma once
#include "esphome.h"
namespace esphome {
namespace tuya_cover {
// protocol
#define TUYA_COVER_MAX_LEN 640 // Max length of message value
// #define TUYA_COVER_MAX_LEN 256 // Max length of message value
#define TUYA_COVER_BUFFER_LEN 6 // Length of serial buffer for header + type + length
#define TUYA_COVER_HEADER_LEN 2 // Length of fixed header
#define TUYA_COVER_MSG_LEN 5
// enable/disable reversed motor direction
// Normal = header (55AA) + (00060005) + 050100010011 "(55AA00060005050100010011)
// Reversed = header (55AA) + (00060005) + 050100010112 "(55AA00060005050100010112)"
#define TUYA_COVER_DISABLE_REVERSING { 0x69, 0x01, 0x00, 0x01, 0x00 } //dpid = 105, type = bool, len = 1, value = disable
#define TUYA_COVER_ENABLE_REVERSING { 0x69, 0x01, 0x00, 0x01, 0x01 } //dpid = 105, type = bool, len = 1, value = enable
// Curtain commands
// Open = header (55AA) + (00060005) + 6604000100 "(55aa000600056604000100)"
// Close = header (55AA) + (00060005) + 6604000101 "(55aa000600056604000101)"
// Stop = header (55AA) + (00060005) + 6604000102 "(55AA000600056604000102)"
#define TUYA_COVER_OPEN { 0x66, 0x04, 0x00, 0x01, 0x00 } //dpid = 101, type = enum, len = 1, value = OPEN
#define TUYA_COVER_CLOSE { 0x66, 0x04, 0x00, 0x01, 0x01 } //dpid = 101, type = enum, len = 1, value = CLOSE
#define TUYA_COVER_STOP { 0x66, 0x04, 0x00, 0x01, 0x02 } //dpid = 101, type = enum, len = 1, value = STOP
#define TUYA_COVER_SET_POSITION { 0x65, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00 } //"65020004000000" //dpid = 2, type = value, len = 4, value = 0x000000 + 1 byte (0x00-0x64)
struct TUYACOVERCommand
{
uint16_t header;
uint8_t version;
uint8_t command;
uint16_t length;
uint8_t value[TUYA_COVER_MAX_LEN];
uint8_t checksum;
};
struct TUYACOVERMessage
{
uint8_t dpid;
uint8_t type;
uint16_t len;
uint8_t value[TUYA_COVER_MAX_LEN - 4]; //Subtract dpid, type, len
};
class bcm500ds {
public:
const uint16_t TUYA_COVER_HEADER = 0x55AA;
//static const uint16_t TUYA_COVER_VERSION = 0x03;
const uint8_t TUYA_COVER_VERSION = 0x00;
const uint8_t tuya_cover_enable_reversing[TUYA_COVER_MSG_LEN]; // = TUYA_COVER_ENABLE_REVERSING;
const uint8_t tuya_cover_disable_reversing[TUYA_COVER_MSG_LEN];// = TUYA_COVER_DISABLE_REVERSING;
const uint8_t tuya_cover_open[TUYA_COVER_MSG_LEN];// = TUYA_COVER_OPEN;
const uint8_t tuya_cover_close[TUYA_COVER_MSG_LEN];// = TUYA_COVER_CLOSE;
const uint8_t tuya_cover_stop[TUYA_COVER_MSG_LEN];// = TUYA_COVER_STOP;
uint8_t tuya_cover_pos[8] = TUYA_COVER_SET_POSITION;
#define HEARTBEAT_INTERVAL_MS 10000
unsigned long previousHeartbeatMillis = 0;
// Variables
TUYACOVERCommand command_{TUYA_COVER_HEADER, TUYA_COVER_VERSION, 0, 0, {}, 0};
uint8_t uart_buffer_[TUYA_COVER_BUFFER_LEN]{0};
const char *TAG = "tuya_cover.cover";
enum TUYACOVERCommandType
{
TUYA_COVER_HEARTBEAT = 0x00,
TUYA_COVER_COMMAND = 0x06,
TUYA_COVER_RESPONSE = 0x07,
TUYA_COVER_QUERY_STATUS = 0x08
};
enum TUYACOVERdpidType
{
TUYA_COVER_DPID_POSITION= 0x65,
TUYA_COVER_DPID_DIRECTION = 0x64,
TUYA_COVER_DPID_UNKNOWN = 0x67,
TUYA_COVER_DPID_ERROR = 0x6E
};
bool read_command();
void write_command(TUYACOVERCommandType command, const uint8_t *value, uint16_t length);
uint8_t checksum();
bcm500ds(): tuya_cover_enable_reversing TUYA_COVER_ENABLE_REVERSING,
tuya_cover_disable_reversing TUYA_COVER_DISABLE_REVERSING,
tuya_cover_open TUYA_COVER_OPEN,
tuya_cover_close TUYA_COVER_CLOSE,
tuya_cover_stop TUYA_COVER_STOP
{}
void loop();
void setup();
bool read(){return read_command();}
void command_close();
void command_open();
void command_gotoPos(uint8_t pos);
void command_stop();
uint8_t query_pos();
uint8_t query_value(uint8_t index);
uint8_t query_cmd();
};
} //namespace tuya_cover
} //namespace esphome

View File

@@ -0,0 +1,17 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import cover
from esphome.const import CONF_ID
tuya_cover_ns = cg.esphome_ns.namespace("tuya_cover")
TuyaCover = tuya_cover_ns.class_("tuyaCover", cover.Cover, cg.Component)
CONFIG_SCHEMA = cover.COVER_SCHEMA.extend(
{cv.GenerateID(): cv.declare_id(TuyaCover)}
).extend(cv.COMPONENT_SCHEMA)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await cover.register_cover(var, config)

View File

@@ -0,0 +1,94 @@
#include "esphome/core/log.h"
#include "tuya_cover.h"
namespace esphome {
namespace tuya_cover {
bcm500ds driver;
static const char *TAG = "tuya_cover.cover";
void tuyaCover::setup() {
ESP_LOGI(TAG, "TUYA_COVER_COMMAND = QUERY_STATUS");
driver.setup();
}
void tuyaCover::loop() {
driver.loop();
bool have_message = driver.read();
if(have_message && driver.query_cmd() == bcm500ds::TUYA_COVER_HEARTBEAT)
{
ESP_LOGI(TAG, "TUYA_COVER_RESPONSE = %s", (driver.query_value(0) == 0) ? "FIRST_HEARTBEAT" : "HEARTBEAT");
}
else if (have_message && driver.query_cmd() == bcm500ds::TUYA_COVER_RESPONSE)
{
switch (driver.query_value(0))
{
case bcm500ds::TUYA_COVER_DPID_POSITION:
ESP_LOGI(TAG, "TUYA_COVER_DPID_POSITION = %d%%", driver.query_value(7));
this->position = driver.query_pos();
this->publish_state();
break;
case bcm500ds::TUYA_COVER_DPID_DIRECTION:
ESP_LOGI(TAG, "TUYA_COVER_DPID_DIRECTION = 0x%02X", driver.query_value(4));
break;
case bcm500ds::TUYA_COVER_DPID_UNKNOWN:
ESP_LOGI(TAG, "TUYA_COVER_DPID_UNKNOWN ENUM = 0x%02X", driver.query_value(4));
break;
case bcm500ds::TUYA_COVER_DPID_ERROR:
ESP_LOGI(TAG, "TUYA_COVER_DPID_ERROR BITMAP = 0x%02X", driver.query_value(4));
break;
default:
break;
}
}
}
void tuyaCover::dump_config() {
ESP_LOGCONFIG(TAG, "Tuya cover");
}
cover::CoverTraits tuyaCover::get_traits() {
auto traits = cover::CoverTraits();
traits.set_is_assumed_state(false);
traits.set_supports_position(false);
traits.set_supports_tilt(false);
return traits;
}
void tuyaCover::control(const cover::CoverCall &call) {
if (call.get_position().has_value())
{
// Write pos (range 0-1) to cover
// Cover pos (range 0x00-0x64) (closed - open)
uint8_t pos = (100-(*call.get_position() * 100));
ESP_LOGV(TAG, "POS = %d", pos);
switch (pos)
{
case 0:
driver.command_close();
break;
case 100:
driver.command_open();
break;
default:
driver.command_gotoPos(pos);
break;
}
// publish_state only when position is confirmed in loop()
}
if (call.get_stop())
{
// User requested cover stop
driver.command_stop();
ESP_LOGI(TAG, "TUYA_COVER_COMMAND = STOP");
}
}
} // namespace tuya_cover
} // namespace esphome

View File

@@ -0,0 +1,25 @@
#pragma once
#include "esphome/core/component.h"
#include "esphome/components/cover/cover.h"
#include "bcm500ds.h"
namespace esphome {
namespace tuya_cover {
class tuyaCover : public cover::Cover, public Component {
public:
void setup() override;
void loop() override;
void dump_config() override;
cover::CoverTraits get_traits() override;
protected:
void control(const cover::CoverCall &call) override;
};
} // namespace tuya_cover
} // namespace esphome

View File

@@ -7,12 +7,21 @@ substitutions:
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
wifi_ssid2: !secret wifi_ssid2
wifi_password2: !secret wifi_password2
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret eink_display_ip
#pins
pin_spi_clk: GPIO7
pin_spi_mosi: GPIO9
pin_ep_cs: GPIO2
pin_ep_dc: GPIO4
pin_ep_busy: GPIO3
pin_ep_reset: GPIO1
packages:
board: !include boards/esp32_wroom_arduino.yaml
board: !include boards/esp32-S3.yaml
device_base: !include common/common.yaml
connection: !include common/wifi_nosens.yaml
logger: !include templates/logger.yaml
@@ -22,6 +31,7 @@ packages:
esphome:
includes:
- include/epaper75.h
- include/text_utils.h
external_components:
# - source:
@@ -116,7 +126,14 @@ font:
- file: 'fonts/GothamRnd-Book.ttf'
id: font_weekday
size: 30
glyphs: ['a', 'd', 'e','F', 'h', 'i','M', 'n', 'o', 'r', 's','S', 't','T', 'u', 'W', 'y']
glyphs: &default-glyphs
['&', '@', '!', ',', '.', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','|', '/']
- file: 'fonts/GothamRnd-Book.ttf'
id: font_day
size: 65
@@ -194,6 +211,7 @@ sensor:
- !include { file: sensors/homeassistant.yaml, vars: { id: travel_euretco_time, entity_id: sensor.e_ink_display_data }}
- platform: wifi_signal
id: sensor_wifi_signal
name: "${device_name} WiFi"
@@ -225,6 +243,7 @@ sensor:
lambda: 'return id(recorded_display_refresh);'
unit_of_measurement: "refreshes"
text_sensor:
# - platform: homeassistant
# entity_id: weather.forecast_home
@@ -244,6 +263,8 @@ text_sensor:
- !include { file: sensors/homeassistant.yaml, vars: { id: travel_Best_name, entity_id: sensor.e_ink_display_data }}
- !include { file: sensors/homeassistant.yaml, vars: { id: travel_ASML_name, entity_id: sensor.e_ink_display_data }}
- !include { file: sensors/homeassistant.yaml, vars: { id: travel_euretco_name, entity_id: sensor.e_ink_display_data }}
- !include { file: sensors/homeassistant.yaml, vars: { id: day_full, entity_id: sensor.e_ink_display_data }}
- !include { file: sensors/homeassistant.yaml, vars: { id: datum, entity_id: sensor.e_ink_display_data }}
# Sunrise
- platform: sun
@@ -301,19 +322,19 @@ color:
# Pins for Waveshare ePaper ESP Board
spi:
clk_pin: GPIO13
mosi_pin: GPIO14
clk_pin: ${pin_spi_clk}
mosi_pin: ${pin_spi_mosi}
# Now render everything on the ePaper screen.
display:
- platform: waveshare_epaper
cs_pin: GPIO27
dc_pin: GPIO16
cs_pin: ${pin_ep_cs}
dc_pin: ${pin_ep_dc}
busy_pin:
number: 25
number: ${pin_ep_busy}
inverted: True
reset_pin: GPIO26
reset_pin: ${pin_ep_reset}
reset_duration: 2ms
model: 7.50in-bv2-rb
#model: 7.50in-bV2
@@ -327,25 +348,20 @@ display:
#define x_pad 10 // border padding
#define y_pad 10 // border padding
int wifi_x_a = xres-x_pad;
int wifi_y_a = yres-y_pad+2;
// int wifi_x_a = xres-x_pad;
// int wifi_y_a = yres-y_pad+2;
// Fill background in black.
it.fill(COLOR_OFF);
// clock section
int clk_yoffset = 50;
int clk_xoffset = 310;
int clk_xoffset = 50;
// Print full weekday name
it.strftime(clk_xoffset, clk_yoffset, id(font_weekday), TextAlign::TOP_RIGHT, "%A", id(esptime).now());
// Print time in HH:MM format 335
// it.strftime(clk_xoffset, clk_yoffset+105, id(font_time), TextAlign::BASELINE_RIGHT, "%H:%M", id(esptime).now());
it.printf(clk_xoffset, clk_yoffset, id(font_weekday), TextAlign::TOP_LEFT, "%s", id(day_full).state.c_str());
int day_size = GetTextWidth(&it, id(font_weekday), "%s", id(day_full).state.c_str());
it.printf(clk_xoffset + day_size+10, clk_yoffset, id(font_weekday), TextAlign::TOP_LEFT, "%s", id(datum).state.c_str());
// Print day of the month
it.strftime(clk_xoffset+100, clk_yoffset, id(font_day), TextAlign::TOP_RIGHT, "%d", id(esptime).now());
// Print abbreviated month name
it.strftime(clk_xoffset+100, clk_yoffset+105, id(font_month), TextAlign::BASELINE_RIGHT, "%b", id(esptime).now());
int sry_offset = 200; //sunrise/set y-offset
// Print sunrise
it.printf(60, sry_offset, id(font_mdi_medium), COLOR_RED, TextAlign::CENTER_RIGHT, "\U000F059C");
@@ -394,21 +410,23 @@ display:
it.line(30, forecast_yoffset+102, 420, forecast_yoffset+102);
// //afstand
int drvtime_yoffset = forecast_yoffset+132;
int drvtime_xoffset = 40;
it.printf(drvtime_xoffset, drvtime_yoffset, id(font_mdi_medium), COLOR_RED, TextAlign::TOP_CENTER, "%s", weather_icon_map["car"].c_str());
// int drvtime_xoffset = 40;
// it.printf(drvtime_xoffset, drvtime_yoffset, id(font_mdi_medium), COLOR_RED, TextAlign::TOP_CENTER, "%s", weather_icon_map["car"].c_str());
it.printf(drvtime_xoffset+90, drvtime_yoffset, id(font_small_bold), TextAlign::TOP_CENTER, "%s", id(travel_Best_name).state.c_str());
it.printf(drvtime_xoffset+90, drvtime_yoffset+30, id(font_small_bold), TextAlign::TOP_CENTER, "%2.0f min", id(travel_Best_time).state);
// it.printf(drvtime_xoffset+90, drvtime_yoffset, id(font_small_bold), TextAlign::TOP_CENTER, "%s", id(travel_Best_name).state.c_str());
// it.printf(drvtime_xoffset+90, drvtime_yoffset+30, id(font_small_bold), TextAlign::TOP_CENTER, "%2.0f min", id(travel_Best_time).state);
it.printf(drvtime_xoffset+210, drvtime_yoffset, id(font_small_bold), TextAlign::TOP_CENTER, "%s", id(travel_ASML_name).state.c_str());
it.printf(drvtime_xoffset+210, drvtime_yoffset+30, id(font_small_bold), TextAlign::TOP_CENTER, "%2.0f min", id(travel_ASML_time).state);
// it.printf(drvtime_xoffset+210, drvtime_yoffset, id(font_small_bold), TextAlign::TOP_CENTER, "%s", id(travel_ASML_name).state.c_str());
// it.printf(drvtime_xoffset+210, drvtime_yoffset+30, id(font_small_bold), TextAlign::TOP_CENTER, "%2.0f min", id(travel_ASML_time).state);
it.printf(drvtime_xoffset+330, drvtime_yoffset, id(font_small_bold), TextAlign::TOP_CENTER, "%s", id(travel_euretco_name).state.c_str());
it.printf(drvtime_xoffset+330, drvtime_yoffset+30, id(font_small_bold), TextAlign::TOP_CENTER, "%2.0f min", id(travel_euretco_time).state);
// it.printf(drvtime_xoffset+330, drvtime_yoffset, id(font_small_bold), TextAlign::TOP_CENTER, "%s", id(travel_euretco_name).state.c_str());
// it.printf(drvtime_xoffset+330, drvtime_yoffset+30, id(font_small_bold), TextAlign::TOP_CENTER, "%2.0f min", id(travel_euretco_time).state);
it.line(30, drvtime_yoffset+60, 420, drvtime_yoffset+60);
// it.line(30, drvtime_yoffset+60, 420, drvtime_yoffset+60);
// afval
int waste_yoffset = drvtime_yoffset+90;
int waste_xoffset = 60;
it.printf(waste_xoffset, waste_yoffset, id(font_mdi_medium), COLOR_RED, TextAlign::TOP_CENTER, "%s", weather_icon_map["trash"].c_str());

View File

@@ -1,591 +0,0 @@
substitutions:
name: ${device_name}
device_name: "ep1_woonkamer"
location: "woonkamer"
comment: "esp32, mmwave, pir"
friendly_name: "ep1_woonkamer"
project_name: "Everything Smart Technology.Everything Presence One"
project_version: "1.1.3"
temperature_offset: "-3"
humidity_offset: "5"
temperature_update_interval: "60s"
illuminance_update_interval: "30s"
pir_delay_off: "10s"
occupancy_delay_off: "15s"
hidden_ssid: "false"
factory_reset_disabled: "true"
uart_target_output_disabled: "true"
uart_presence_output_disabled: "true"
api_password: !secret ep1_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 ep1_woonkamer_ip
pin_sda: GPIO26
pin_scl: GPIO25
pin_status: GPIO32
packages:
board: !include boards/esp32_wroom_arduino.yaml
device_base: !include common/common.yaml
connection: !include common/wifi.yaml
logger: !include templates/logger.yaml
i2c: !include interfaces/i2c_a.yaml
bluetooth: !include common/bluetooth.yaml
bt_proxy: !include common/bluetooth.yaml
improv_serial:
esp32_improv:
authorizer: none
dashboard_import:
package_import_url: github://everythingsmarthome/presence-one/everything-presence-one.yaml@main
import_full_config: false
esphome:
project:
name: "${project_name}"
version: "${project_version}"
includes:
- include/SEN0395_distance.h
light:
- platform: status_led
name: ESP32 status LED
pin: ${pin_status}
entity_category: config
disabled_by_default: True
- platform: binary
name: mmWave LED
restore_mode: RESTORE_DEFAULT_OFF
output: mmwave_led_output
entity_category: config
disabled_by_default: True
output:
- platform: template
id: mmwave_led_output
type: binary
write_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- if:
condition:
lambda: !lambda return state;
then:
- uart.write: "setLedMode 1 0"
else:
- uart.write: "setLedMode 1 1"
- delay: 1s
- uart.write: "saveConfig"
- delay: 3s
- switch.turn_on: mmwave_sensor
i2c:
sda: 26
scl: 25
scan: true
sensor:
- platform: shtcx
id: "shtc3_sensor"
temperature:
name: Temperature
id: temperature_sensor
filters:
- offset: ${temperature_offset}
- lambda: "return x + id(temperature_offset_ui).state;"
humidity:
name: Humidity
id: humidity_sensor
filters:
- offset: ${humidity_offset}
- lambda: "return x + id(humidity_offset_ui).state;"
address: 0x70
update_interval: ${temperature_update_interval}
- platform: bh1750
name: Illuminance
id: illuminance_sensor
address: 0x23
update_interval: ${illuminance_update_interval}
filters:
- lambda: "return x + id(illuminance_offset_ui).state;"
- platform: template
name: Target 1 Distance # Don't change
id: target_distance_1_m
accuracy_decimals: 2
disabled_by_default: false
- platform: template
name: Target 2 Distance # Don't change
id: target_distance_2_m
accuracy_decimals: 2
disabled_by_default: True
- platform: template
name: Target 3 Distance # Don't change
id: target_distance_3_m
accuracy_decimals: 2
disabled_by_default: True
- platform: template
name: Target 4 Distance # Don't change
id: target_distance_4_m
accuracy_decimals: 2
disabled_by_default: True
- platform: template
name: "Target 1 SNR" # Don't change
disabled_by_default: True
- platform: template
name: "Target 2 SNR" # Don't change
disabled_by_default: True
- platform: template
name: "Target 3 SNR" # Don't change
disabled_by_default: True
- platform: template
name: "Target 4 SNR" # Don't change
disabled_by_default: True
binary_sensor:
- platform: gpio
name: mmWave
id: mmwave
device_class: occupancy
pin:
number: GPIO15
mode: INPUT_PULLDOWN
- platform: gpio
pin:
number: 33
mode: INPUT_PULLDOWN
name: PIR
id: pir_motion_sensor
device_class: motion
filters:
- delayed_off: ${pir_delay_off}
- platform: template
name: Occupancy
id: occupancy
device_class: occupancy
filters:
- delayed_off: ${occupancy_delay_off}
lambda: |-
if ( id(mmwave).state or id(pir_motion_sensor).state) {
return true;
}
else if (id(mmwave).state == 0 and id(pir_motion_sensor).state == 0) {
return false;
}
else {
return id(occupancy).state;
}
- platform: template
name: "Target 1 Active" # Don't change
disabled_by_default: False
- platform: template
name: "Target 2 Active" # Don't change
disabled_by_default: True
- platform: template
name: "Target 3 Active" # Don't change
disabled_by_default: True
- platform: template
name: "Target 4 Active" # Don't change
disabled_by_default: True
uart:
id: uart_bus
tx_pin: GPIO13
rx_pin: GPIO14
baud_rate: 115200
switch:
- platform: template
name: mmWave sensor
id: mmwave_sensor
disabled_by_default: True
entity_category: config
optimistic: true
restore_mode: RESTORE_DEFAULT_ON
turn_on_action:
- uart.write: "sensorStart"
- delay: 1s
turn_off_action:
- uart.write: "sensorStop"
- delay: 1s
- platform: template
name: UART presence output
id: uart_presence_output
entity_category: config
internal: ${uart_presence_output_disabled}
optimistic: true
turn_on_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: "setUartOutput 1 1"
- delay: 1s
- uart.write: "saveConfig"
- delay: 3s
- switch.turn_on: mmwave_sensor
turn_off_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: "setUartOutput 1 0"
- delay: 1s
- uart.write: "saveConfig"
- delay: 3s
- switch.turn_on: mmwave_sensor
- platform: template
name: UART target output
id: uart_target_output
entity_category: config
internal: ${uart_target_output_disabled}
optimistic: true
assumed_state: false
restore_mode: ALWAYS_ON
turn_on_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: "setUartOutput 2 1 1 1"
- delay: 1s
- uart.write: "saveConfig"
- delay: 3s
- switch.turn_on: mmwave_sensor
turn_off_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: "setUartOutput 2 0"
- delay: 1s
- uart.write: "saveConfig"
- delay: 3s
- switch.turn_on: mmwave_sensor
number:
- platform: template
id: mmwave_zone_1_start
name: mmWave Zone 1 Start
min_value: 0
max_value: 800
step: 15
initial_value: 0
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: False
icon: "mdi:arrow-left-right"
- platform: template
id: mmwave_zone_1_end
name: mmWave Zone 1 End
min_value: 0
max_value: 800
step: 15
initial_value: 315
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: False
icon: "mdi:arrow-left-right"
- platform: template
id: mmwave_zone_2_start
name: mmWave Zone 2 Start
min_value: 0
max_value: 800
step: 15
initial_value: 0
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: True
icon: "mdi:arrow-left-right"
- platform: template
id: mmwave_zone_2_end
name: mmWave Zone 2 End
min_value: 0
max_value: 800
step: 15
initial_value: 0
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: True
icon: "mdi:arrow-left-right"
- platform: template
id: mmwave_zone_3_start
name: mmWave Zone 3 Start
min_value: 0
max_value: 800
step: 15
initial_value: 0
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: True
icon: "mdi:arrow-left-right"
- platform: template
id: mmwave_zone_3_end
name: mmWave Zone 3 End
min_value: 0
max_value: 800
step: 15
initial_value: 0
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: True
icon: "mdi:arrow-left-right"
- platform: template
id: mmwave_zone_4_start
name: mmWave Zone 4 Start
min_value: 0
max_value: 800
step: 15
initial_value: 0
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: True
icon: "mdi:arrow-left-right"
- platform: template
id: mmwave_zone_4_end
name: mmWave Zone 4 End
min_value: 0
max_value: 800
step: 15
initial_value: 0
mode: slider
unit_of_measurement: cm
optimistic: true
entity_category: config
disabled_by_default: True
icon: "mdi:arrow-left-right"
- platform: template
name: mmWave off latency
icon: mdi:clock-end
entity_category: config
id: mmwave_off_latency
min_value: 1
max_value: 60
initial_value: 15
optimistic: true
step: 1
restore_value: true
unit_of_measurement: seconds
mode: slider
set_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: !lambda |-
std::string mss = "setLatency " + to_string(id(mmwave_on_latency).state) + " " + to_string(id(mmwave_off_latency).state);
return std::vector<unsigned char>(mss.begin(), mss.end());
- delay: 1s
- uart.write: "saveCfg 0x45670123 0xCDEF89AB 0x956128C6 0xDF54AC89"
- delay: 1s
- switch.turn_on: mmwave_sensor
- platform: template
name: mmWave on latency
icon: mdi:clock-start
id: mmwave_on_latency
entity_category: config
min_value: 0
max_value: 60
initial_value: 0
optimistic: true
step: 0.5
restore_value: true
unit_of_measurement: seconds
mode: slider
set_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: !lambda |-
std::string mss = "setLatency " + to_string(id(mmwave_on_latency).state) + " " + to_string(id(mmwave_off_latency).state);
return std::vector<unsigned char>(mss.begin(), mss.end());
- delay: 1s
- uart.write: "saveCfg 0x45670123 0xCDEF89AB 0x956128C6 0xDF54AC89"
- delay: 1s
- switch.turn_on: mmwave_sensor
- platform: template
name: mmWave sensitivity
icon: mdi:target-variant
id: mmwave_sensitivity
entity_category: config
min_value: 0
max_value: 9
initial_value: 7
optimistic: true
step: 1
restore_value: true
set_action:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write:
!lambda std::string mss = "setSensitivity " + to_string((int)x);
return std::vector<unsigned char>(mss.begin(), mss.end());
- delay: 1s
- uart.write: "saveConfig"
- delay: 1s
- switch.turn_on: mmwave_sensor
- platform: template
name: "Temperature Offset"
id: temperature_offset_ui
unit_of_measurement: "°C"
min_value: -20
max_value: 20
step: 0.1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 0
icon: "mdi:thermometer"
entity_category: config
on_value:
- lambda: 'id(shtc3_sensor).update();'
- platform: template
name: "Humidity Offset"
id: humidity_offset_ui
unit_of_measurement: "%"
min_value: -50
max_value: 50
step: 0.1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 0
icon: "mdi:water-percent"
entity_category: config
on_value:
- lambda: 'id(shtc3_sensor).update();'
- platform: template
name: "Illuminance Offset"
id: illuminance_offset_ui
unit_of_measurement: "lx"
min_value: -50
max_value: 50
step: 1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 0
icon: "mdi:brightness-5"
entity_category: config
on_value:
- lambda: 'id(illuminance_sensor).update();'
button:
- platform: restart
id: restart_internal
entity_category: config
internal: true
- platform: template
name: Restart mmWave sensor
id: restart_mmwave
entity_category: config
internal: true
on_press:
- uart.write: "resetSystem"
- platform: template
name: Restart
icon: mdi:restart
entity_category: config
disabled_by_default: True
on_press:
- button.press: restart_mmwave
- button.press: restart_internal
- platform: safe_mode
internal: false
name: Safe mode
entity_category: config
disabled_by_default: True
- platform: template
name: Factory reset mmWave
icon: mdi:cog-counterclockwise
id: factory_reset_mmwave
internal: ${factory_reset_disabled}
entity_category: config
on_press:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: "resetCfg"
- delay: 3s
- switch.turn_on: mmwave_sensor
- platform: template
name: mmWave Set Distance
id: mmwave_set_distance
icon: "mdi:arrow-left-right"
entity_category: config
on_press:
- switch.turn_off: mmwave_sensor
- delay: 1s
- uart.write: !lambda
int s1 = (int)ceil(id(mmwave_zone_1_start).state / 15.0);
int e1 = (int)ceil(id(mmwave_zone_1_end).state / 15.0);
int s2 = (int)ceil(id(mmwave_zone_2_start).state / 15.0);
int e2 = (int)ceil(id(mmwave_zone_2_end).state / 15.0);
int s3 = (int)ceil(id(mmwave_zone_3_start).state / 15.0);
int e3 = (int)ceil(id(mmwave_zone_3_end).state / 15.0);
int s4 = (int)ceil(id(mmwave_zone_4_start).state / 15.0);
int e4 = (int)ceil(id(mmwave_zone_4_end).state / 15.0);
std::string cmd = "detRangeCfg -1";
if(s1 < e1) {
cmd += " " + to_string(s1) + " " + to_string(e1);
}
if(s2 > e1 && s2 < e2) {
cmd += " " + to_string(s2) + " " + to_string(e2);
}
if(s3 > e2 && s3 < e3) {
cmd += " " + to_string(s3) + " " + to_string(e3);
}
if(s4 > e3 && s4 < e4) {
cmd += " " + to_string(s4) + " " + to_string(e4);
}
if(cmd != "detRangeCfg -1") {
std::vector<unsigned char> cmd_vec(cmd.begin(), cmd.end());
ESP_LOGI("set_mmwave_distance", "Sending command to sensor %s", cmd.c_str());
id(distance_zone_status).publish_state("Successfully sent to sensor! " + cmd.substr(14));
return cmd_vec;
} else {
ESP_LOGE("set_mmwave_distance", "No valid segments configured. Please adjust the sliders.");
id(distance_zone_status).publish_state("No valid segments configured. Please adjust the sliders.");
return std::vector<unsigned char>();
}
- delay: 1s
- uart.write: "saveCfg 0x45670123 0xCDEF89AB 0x956128C6 0xDF54AC89"
- delay: 1s
- switch.turn_on: mmwave_sensor
text_sensor:
- platform: template
name: "Distance Zones Status"
id: "distance_zone_status"
custom_component:
- lambda: |-
auto my_custom = new Sen0395Distance(id(uart_bus));
return {my_custom};

View File

@@ -1,26 +1,5 @@
#include "esphome.h"
// protocol
#define TUYA_COVER_MAX_LEN 640 // Max length of message value
// #define TUYA_COVER_MAX_LEN 256 // Max length of message value
#define TUYA_COVER_BUFFER_LEN 6 // Length of serial buffer for header + type + length
#define TUYA_COVER_HEADER_LEN 2 // Length of fixed header
// enable/disable reversed motor direction
// Normal = header (55AA) + (00060005) + 050100010011 "(55AA00060005050100010011)
// Reversed = header (55AA) + (00060005) + 050100010112 "(55AA00060005050100010112)"
#define TUYA_COVER_DISABLE_REVERSING { 0x69, 0x01, 0x00, 0x01, 0x00 } //dpid = 105, type = bool, len = 1, value = disable
#define TUYA_COVER_ENABLE_REVERSING { 0x69, 0x01, 0x00, 0x01, 0x01 } //dpid = 105, type = bool, len = 1, value = enable
// Curtain commands
// Open = header (55AA) + (00060005) + 6604000100 "(55aa000600056604000100)"
// Close = header (55AA) + (00060005) + 6604000101 "(55aa000600056604000101)"
// Stop = header (55AA) + (00060005) + 6604000102 "(55AA000600056604000102)"
#define TUYA_COVER_OPEN { 0x66, 0x04, 0x00, 0x01, 0x00 } //dpid = 101, type = enum, len = 1, value = OPEN
#define TUYA_COVER_CLOSE { 0x66, 0x04, 0x00, 0x01, 0x01 } //dpid = 101, type = enum, len = 1, value = CLOSE
#define TUYA_COVER_STOP { 0x66, 0x04, 0x00, 0x01, 0x02 } //dpid = 101, type = enum, len = 1, value = STOP
#define TUYA_COVER_SET_POSITION { 0x65, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00 } //"65020004000000" //dpid = 2, type = value, len = 4, value = 0x000000 + 1 byte (0x00-0x64)
static const char *TAG = "TUYACOVER";
static const uint16_t TUYA_COVER_HEADER = 0x55AA;
//static const uint16_t TUYA_COVER_VERSION = 0x03;
@@ -71,7 +50,7 @@ enum TUYACOVERdpidType
};
// Variables
TUYACOVERCommand command_{TUYA_COVER_HEADER, TUYA_COVER_VERSION, 0, 0, {}, 0};
//TUYACOVERCommand command_{TUYA_COVER_HEADER, TUYA_COVER_VERSION, 0, 0, {}, 0};
uint8_t uart_buffer_[TUYA_COVER_BUFFER_LEN]{0};
// Forward declarations

View File

@@ -1,6 +1,32 @@
#include <string>
#include <iostream>
std::map<std::string, std::string> moon_icon_map
{
{"first_quarter", "G"},
{"full_moon", "1"},
{"last_quarter", "T"},
{"new_moon", "0"},
{"waning_crescent", "W"},
{"waning_gibbous", "Q"},
{"waxing_crescent", "D"},
{"waxing_gibbous", "J"},
};
std::map<std::string, std::string> moon_description
{
{"first_quarter", "Eerste kwartier"},
{"full_moon", "Volle maan"},
{"last_quarter", "Laatste kwartier"},
{"new_moon", "Nieuwe maan"},
{"waning_crescent", "Afnemende halve maan"},
{"waning_gibbous", "Afnemende maan"},
{"waxing_crescent", "Wassende halve maan"},
{"waxing_gibbous", "Wassende maan"},
};
// Map weather states to MDI characters.
std::map<std::string, std::string> weather_icon_map
@@ -41,64 +67,4 @@ std::map<std::string, std::string> weather_icon_map
// #define ICON_w_clear_night "\U000F0594"
// #define ICON_w_cloudy "\U000F0590"
// #define ICON_w_fog "\U000F0591"
// #define ICON_w_hail "\U000F0592"
// #define ICON_w_lightning "\U000F0593"
// #define ICON_w_lightning_rainy "\U000F067E"
// #define ICON_w_night_partly_cloudy "\U000F0F31"
// #define ICON_w_partly_cloudy "\U000F0595"
// #define ICON_w_pouring "\U000F0596"
// #define ICON_w_rainy "\U000F0597"
// #define ICON_w_snowy "\U000F0F36"
// #define ICON_w_snowy_rainy "\U000F067F"
// #define ICON_w_sunny "\U000F0599"
// #define ICON_w_windy "\U000F059D"
// #define ICON_w_windy_variant "\U000F059E"
// #define ICON_w_exceptional "\U000F0F38"
// std::string conditionToIcon(std::string condition, bool daytime)
// {
// if (condition == "clear") return ICON_w_clear_night;
// if (condition == "clear-night") return ICON_w_clear_night;
// if (condition == "cloudy") return ICON_w_cloudy;
// if (condition == "dust") return ICON_w_fog;
// if (condition == "dusty") return ICON_w_fog;
// if (condition == "fog") return ICON_w_fog;
// if (condition == "frost") return ICON_w_snowy;
// if (condition == "hail") return ICON_w_hail;
// if (condition == "haze") return ICON_w_fog;
// if (condition == "hazy") return ICON_w_fog;
// if (condition == "heavy_shower") return ICON_w_rainy;
// if (condition == "heavy_showers") return ICON_w_rainy;
// if (condition == "light_rain") return ICON_w_rainy;
// if (condition == "light_showers") return ICON_w_rainy;
// if (condition == "light_shower") return ICON_w_rainy;
// if (condition == "lightning") return ICON_w_lightning;
// if (condition == "lightning-rainy") return ICON_w_lightning_rainy;
// if (condition == "mostly_sunny") return ICON_w_sunny;
// if (condition == "night") return ICON_w_clear_night;
// if (condition == "partlycloudy" && !daytime) return ICON_w_night_partly_cloudy;
// if (condition == "partlycloudy" && daytime) return ICON_w_partly_cloudy;
// if (condition == "partly_cloudy" && !daytime) return ICON_w_night_partly_cloudy;
// if (condition == "partly_cloudy" && daytime) return ICON_w_partly_cloudy;
// if (condition == "pouring") return ICON_w_pouring;
// if (condition == "rain") return ICON_w_rainy;
// if (condition == "rainy") return ICON_w_rainy;
// if (condition == "shower") return ICON_w_rainy;
// if (condition == "showers") return ICON_w_rainy;
// if (condition == "snow") return ICON_w_snowy;
// if (condition == "snowy") return ICON_w_snowy;
// if (condition == "snowy-rainy") return ICON_w_snowy_rainy;
// if (condition == "storm") return ICON_w_lightning_rainy;
// if (condition == "storms") return ICON_w_lightning_rainy;
// if (condition == "sunny") return ICON_w_sunny;
// if (condition == "wind") return ICON_w_windy;
// if (condition == "windy") return ICON_w_windy;
// if (condition == "windy-variant") return ICON_w_windy_variant;
// if (condition == "exceptional") return ICON_w_exceptional;
// return "";
// }

View File

@@ -0,0 +1,42 @@
int GetTextBounds(esphome::display::Display* it, esphome::font::Font *font, const char *buffer)
{
int x1 = 0; // A pointer to store the returned x coordinate of the upper left corner in.
int y1 = 0; // A pointer to store the returned y coordinate of the upper left corner in.
int width = 0; // A pointer to store the returned text width in.
int height = 0; // A pointer to store the returned text height in.
it->get_text_bounds(0, 0, buffer, font, TextAlign::TOP_LEFT, &x1, &y1, &width, &height);
return width;
}
int GetTextWidth(esphome::display::Display* it, esphome::font::Font *font, const char* formatting, const char *raw_text){
char temp_buffer[80];
sprintf(temp_buffer, formatting, raw_text);
return GetTextBounds(it, font, temp_buffer);
}
int GetTextWidth(esphome::display::Display* it, esphome::font::Font *font, const char* formatting){
char temp_buffer[80];
sprintf(temp_buffer, formatting);
return GetTextBounds(it, font, temp_buffer);
}
int GetTextWidth(esphome::display::Display* it, esphome::font::Font *font, const char* formatting, float& raw_text){
char temp_buffer[80];
sprintf(temp_buffer, formatting, raw_text);
return GetTextBounds(it, font, temp_buffer);
}
int GetTextWidth(esphome::display::Display* it, esphome::font::Font *font, const char* formatting, float& raw_text1, float& raw_text2){
char temp_buffer[80];
sprintf(temp_buffer, formatting, raw_text1, raw_text2);
return GetTextBounds(it, font, temp_buffer);
}
// Calculate the width of time format
int GetTextWidth(esphome::display::Display* it, esphome::font::Font *font, const char* formatting, esphome::ESPTime time){
auto c_tm = time.to_c_tm();
size_t buffer_length = 80;
char temp_buffer[buffer_length];
strftime(temp_buffer, buffer_length, formatting, &c_tm);
return GetTextBounds(it, font, temp_buffer);
}

View File

@@ -9,7 +9,7 @@ sensor:
humidity:
name: "Humidity"
accuracy_decimals: 1
temperature_offset: 1.5 °C
temperature_offset: 0 °C
address: 0x61
update_interval: 5s

View File

@@ -27,7 +27,7 @@ sensor:
- platform: "tuya"
name: "humidity"
sensor_datapoint: 102
unit_of_measurement: "%rh"
unit_of_measurement: "%"
device_class: "humidity"
state_class: "measurement"
accuracy_decimals: 1

View File

@@ -7,6 +7,8 @@ substitutions:
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
wifi_ssid2: !secret wifi_ssid2
wifi_password2: !secret wifi_password2
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret slaaptrainer_ip

View File

@@ -0,0 +1,44 @@
substitutions:
device_name: "slaaptrainer_luuk"
friendly_name: "slaaptrainer Luuk"
comment: "esp-C3, RGBled"
api_password: !secret slaaptrainer_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
wifi_ssid2: !secret wifi_ssid2
wifi_password2: !secret wifi_password2
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret slaaptrainer_luuk_ip
location: "slaapkamer Luuk"
board: "esp32-c3-devkitm-1"
framework: esp-idf
pin_led1: GPIO09
num_leds: "36"
chipset: WS2812
is_rgbw: "false"
packages:
board: !include boards/esp32-gen.yaml
connection: !include common/wifi.yaml
device_base: !include common/common.yaml
logger: !include templates/logger.yaml
leds: !include templates/light_rgbw_rmt.yaml
colororange: !include color/COLOR_CSS_ORANGE
colorgreen: !include color/COLOR_CSS_GREEN
colorred: !include color/COLOR_CSS_RED
# time:
# - platform: sntp
# on_time:
# # Every morning on weekdays
# - seconds: 0
# minutes: 00
# hours: 7
# days_of_week: MON-FRI
# then:
# - light.turn_on: my_light

View File

@@ -0,0 +1,21 @@
light:
- platform: monochromatic
id: ${entityID}
restore_mode: RESTORE_DEFAULT_ON
output: ${entityID}_out
name: ${entityName}
effects:
- flicker:
name: "Flicker"
alpha: 95%
intensity: 1.5%
on_turn_on:
- light.turn_on:
id: led_light1
effect: flicker
brightness: 75%
output:
- platform: ledc
pin: ${pin_led}
id: ${entityID}_out

View File

@@ -21,18 +21,6 @@ light:
it.range(1, x) = Color(0,255,0);
x += 1;
}
# - addressable_color_wipe:
# name: "Wipe In-green"
# colors:
# - red: 0%
# green: 100%
# blue: 0%
# num_leds: 6
# gradient: true
# add_led_interval: 25714ms
# reverse: false
- addressable_lambda:
name: star-orange
update_interval: 12ms
@@ -45,4 +33,13 @@ light:
if (x < it.size()) {
it[x] = COLOR_CSS_ORANGE;
x += 5;
}
}
- random:
name: "Random"
transition_length: 4s
update_interval: 5s
- addressable_rainbow:
name: Rainbow Effect
speed: 100
width: 50
- addressable_flicker:

View File

@@ -1,8 +1,8 @@
---
light:
- platform: esp32_rmt_led_strip
rmt_channel: 0
is_rgbw: True
#rmt_channel: 0
is_rgbw: ${is_rgbw}
id: led_lights
restore_mode: RESTORE_DEFAULT_ON
name: ${device_name}_leds
@@ -14,4 +14,52 @@ light:
- flicker:
name: "Flicker"
alpha: 95%
intensity: 1.5%
intensity: 1.5%
- addressable_lambda:
name: "Wipe In-green"
update_interval: 25714ms
lambda: |-
static int x = 0;
if (initial_run) {
x = 0;
it[x] = Color(0,255,0);
}
if (x < it.size()) {
it.range(1, x) = Color(0,255,0);
x += 1;
}
- addressable_lambda:
name: star-orange
update_interval: 12ms
lambda: |-
static int x = 0;
if (initial_run) {
x = 0;
it.all() = Color::BLACK;
}
if (x < it.size()) {
it[x] = COLOR_CSS_ORANGE;
x += 5;
}
- addressable_lambda:
name: star-red
update_interval: 12ms
lambda: |-
static int x = 0;
if (initial_run) {
x = 0;
it.all() = Color::BLACK;
}
if (x < it.size()) {
it[x] = COLOR_CSS_RED;
x += 5;
}
- random:
name: "Random"
transition_length: 4s
update_interval: 5s
- addressable_rainbow:
name: Rainbow Effect
speed: 100
width: 50
- addressable_flicker:

View File

@@ -7,5 +7,9 @@ logger:
cover: ERROR
switch: ERROR
wifi: ERROR
light: ERROR
pulse_counter: ERROR
remote_receiver: DEBUG
remote_receiver: DEBUG
binary_sensor: WARN
on sensor: ERROR
tsl2591: WARN

161
esphome/uzg-poe-dr.yaml Normal file
View File

@@ -0,0 +1,161 @@
esphome:
name: tubeszb-dual-radio-kit-cc2652
project:
name: tubezb.cc2652+zw
version: "3.0"
on_boot:
priority: 600
then:
- switch.turn_on: zRST_gpio
- delay: 15ms
- switch.turn_off: zRST_gpio
- lambda: |-
id(mdns0).add_extra_service({ "_zigbee-coordinator", "_tcp", 6638, {{"radio_type", "znp"}, {"name", "TubesZB"},{"serial_number", get_mac_address()}} });
id(mdns0).add_extra_service({ "_zwave", "_tcp", 6639, {{"version", "1.0"}, {"name", "TubesZB"},{"serial_number", get_mac_address()}} });
esp32:
board: esp32-poe
framework:
type: esp-idf
external_components:
- source: github://oxan/esphome-stream-server
#Olimex ESP32-PoE Ethernet
ethernet:
type: LAN8720
mdc_pin: GPIO23
mdio_pin: GPIO18
clk_mode: GPIO17_OUT
phy_addr: 0
power_pin: GPIO5
# Optional manual IP
# manual_ip:
# static_ip: STATIC_IP
# gateway: GATEWAY
# subnet: SUBNET
# Enable logging
logger:
level: DEBUG
# Enable Home Assistant API
api:
reboot_timeout: 0s
ota:
platform: esphome
web_server:
port: 80
local: true
script:
- id: fw_update_mode
then:
- switch.turn_on: zBSL
- delay: 1s
- switch.turn_on: zRST_gpio
- delay: 1s
- switch.turn_off: zRST_gpio
- logger.log: "Delaying ~10 seconds for cc2652p2 to settle"
- delay: 11s
- switch.turn_off: zBSL
- logger.log: "Please try update with cc2538-bsl tool now"
- logger.log: "cc-bsl usage: cc2538-bsl.py -p socket://ip-of-gw:6638 -evw firmware.hex"
switch:
- platform: gpio
pin: 16
id: zRST_gpio
inverted: no
restore_mode: ALWAYS_OFF
- platform: gpio
pin: 33
id: z_mode
restore_mode: ALWAYS_OFF
name: "zigbee-uart mode"
on_turn_on:
then:
- light.turn_on: usb_led
on_turn_off:
then:
- light.turn_off: usb_led
- platform: gpio
pin: 15
name: "Zigbee Module Bootloader Pin"
id: zBSL
inverted: no
restore_mode: ALWAYS_OFF
disabled_by_default: false
output:
- platform: gpio
pin: GPIO12
id: LED_USB
button:
- platform: restart
name: "Restart the ESP32 Device"
- platform: template
name: "Trigger Zigbee Module Reset"
disabled_by_default: false
id: zRST
on_press:
- switch.turn_on: zRST_gpio
- delay: 15ms
- switch.turn_off: zRST_gpio
- platform: template
name: "Trigger Zigbee Module Bootloader"
disabled_by_default: false
on_press:
- script.execute: fw_update_mode
light:
- platform: status_led
name: "state"
pin: GPIO14
- platform: binary
name: "usb_led"
output: LED_USB
id: usb_led
uart:
- id: uart_bus_zb
rx_pin: GPIO36
tx_pin: GPIO4
baud_rate: 115200
# rx_buffer_size: 1024
- id: uart_bus_zw
rx_pin: GPIO13
tx_pin: GPIO2
baud_rate: 115200
stream_server:
- id: zb
uart_id: uart_bus_zb
port: 6638 # optional, default is 6638
# buffer_size: 1024
- id: zw
uart_id: uart_bus_zw
port: 6639
binary_sensor:
- platform: stream_server
stream_server: zb
connected:
name: "TubesZB Zigbee Serial Connected"
- platform: stream_server
stream_server: zw
connected:
name: "TubesZB Z-Wave Serial Connected"
mdns:
id: mdns0

View File

@@ -7,6 +7,8 @@ substitutions:
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
wifi_ssid2: !secret wifi_ssid2
wifi_password2: !secret wifi_password2
gateway: !secret ip_gateway
subnet: !secret ip_subnet
ip: !secret zemismart_curtain_ip
@@ -23,20 +25,18 @@ packages:
uart:
- !include interfaces/uart_tywe1s.yaml
esphome:
includes:
- include/bcm500ds.h
# esphome:
# includes:
# - include/bcm500ds.h
external_components:
- source: components
components: [ tuya_cover ]
cover:
- platform: custom
lambda: |-
auto curtain = new CustomCurtain();
App.register_component(curtain);
return {curtain};
covers:
- name: Curtain
device_class: curtain
platform: tuya_cover
name: Tuya cover
custom_component:
- lambda: |-
return { new CustomAPI() };
# custom_component:
# - lambda: |-
# return { new CustomAPI() };

View File

@@ -5,8 +5,8 @@ substitutions:
location: "hass"
api_password: !secret zigbee_server_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
# wifi_ssid: !secret wifi_ssid
# wifi_password: !secret wifi_password
gateway: !secret ip_gateway
subnet: !secret ip_subnet
dns1: !secret ip_dns1
@@ -25,10 +25,8 @@ substitutions:
packages:
board: !include boards/esp32_wroom_arduino.yaml
# connection: !include common/wifi.yaml
device_base: !include common/common.yaml
ethernet: !include interfaces/eth_LAN8720A.yaml
bt_proxy: !include common/bluetooth.yaml
ota: !include common/ota.yaml
logger: !include templates/nologger.yaml
@@ -39,17 +37,6 @@ external_components:
- source: github://tube0013/esphome-stream-server-v2
- source: github://syssi/esphome-zeroconf@main
# web_server:
# port: 80
# switch:
# - platform: gpio
# pin: ${pin_efrReset}
# id: zRST_gpio
# inverted: yes
# restore_mode: ALWAYS_OFF
button:
- platform: restart
name: "Restart the Gateway"

View File

@@ -1,157 +0,0 @@
# MQTT Connection, if empty will query and use hassio provided mqtt
mqtt:
host: 192.168.2.15
port: 1883
ssl: false
username:
password:
# This gets added to the x,y,z to derive a gps location
gps:
latitude: 51.664540
longitude: 5.367980
elevation: 12
# How long before device considered stale
timeout: 30
# How long before device is considered away
away_timeout: 120
optimization:
enabled: true
interval_secs: 60
limits:
absorption_min: 2.5
absorption_max: 3.5
tx_ref_rssi_min: -70
tx_ref_rssi_max: -50
rx_adj_rssi_min: -15
rx_adj_rssi_max: 20
weighting:
algorithm: gaussian
props:
sigma: 0.10
# Floors w/ the points to draw it in meters
floors:
- id: Beneden
name: Beganegrond
# Bounds (x,y,z) of map in meters
bounds: [[0, 0, 0], [11, 9, 1.5]]
rooms:
- name: Woonkamer
points:
- [0, 0]
- [7, 0]
- [7, 5]
- [0, 5]
- name: Eetkamer
points:
- [7, 0]
- [11, 0]
- [11, 5]
- [7, 5]
- name: Keuken
points:
- [6, 5]
- [11, 5]
- [11, 9]
- [6, 9]
- name: Speelkamer
points:
- [0, 5]
- [3, 5]
- [3, 9]
- [0 ,9]
- name: Toilet
points:
- [6, 8]
- [7.2, 8]
- [7.2, 9]
- [6, 9]
- name: Hal
points:
- [3, 5]
- [6, 5]
- [6, 9]
- [3, 9]
- id: Boven
name: Boven
bounds: [[0, 0, 0], [7, 9, 4.5]]
rooms:
- name: Master
points:
- [3, 0]
- [7, 0]
- [7, 5]
- [3, 5]
- name: Slaapkamer Luuk
points:
- [0, 0]
- [3, 0]
- [3, 5]
- [0, 5]
- name: Badkamer
points:
- [0, 6]
- [3, 6]
- [3, 9]
- [0, 9]
# - name: Master Bathroom
# points:
# - [0, 15]
# - [2, 15]
# - [2, 9]
# - [0, 9]
# - [0, 15]
# - name: Master Closet
# points:
# - [0, 18]
# - [1.5, 18]
# - [1.5, 19.2]
# - [4, 19.2]
# - [4, 15]
# - [0, 15]
# - [0, 18]
# - id: outside
# name: Outside
# bounds: [[-10, -10, -10], [28, 30, 20]]
# Locations of espresense nodes in meters
nodes:
- name: woonkamer
point: [9, 4.7, 0.5]
floors: ["Beneden"]
- name: keuken
point: [7.5, 5.3, 0.7]
floors: ["Beneden"]
- name: hal
points: [5.7, 7.5, 0.9]
floors: ["Beneden"]
# Devices to track
devices:
- id: " irk:d8830797536ce55edf6cf3fb0d87bf9a"
name: "Giphone willem"
- id: "garmin:90f157105b61"
name: "Garmin Ilse"
- id: "garmin:90f157e3fbcf"
name: "Garmin Willem"
- id: "iBeacon:fda50693-a4e2-4fb1-afcf-c6eb07647825-5-6"
name: "BLE tag2"
- id: "apple:1007:11-12"
name: "iphone willem"
- id: "ble_iphone_willem"
name: "iphone willem"
- id: "iphone_ilse"
name: "Iphone Ilse"
# - id: "iBeacon:*"
# - name: "*" # Track all named devices
# - id: watch:darrell
# name: Darrell's Watch
# - id: phone:darrell
# name: Darrell's iPhone

View File

@@ -1,9 +1,7 @@
{
"Activities": {
"-1": "PowerOff",
"44798695": "Apple TV kijken 2",
"51944300": "Tv kijken",
"52211243": "Gamen"
"52985017": "Tv kijken 2"
},
"Devices": {
"Apple TV": {
@@ -71,10 +69,8 @@
],
"id": "40063342"
},
"Tv van Panasonic": {
"TCL Tv": {
"commands": [
"PowerOff",
"PowerOn",
"PowerToggle",
"0",
"1",
@@ -89,7 +85,6 @@
"Mute",
"VolumeDown",
"VolumeUp",
"LastView",
"ChannelDown",
"ChannelUp",
"DirectionDown",
@@ -103,12 +98,11 @@
"Pause",
"FastForward",
"Record",
"ChapterPrev",
"ChapterNext",
"Back/Return",
"Menu",
"Subtitle",
"Back",
"Teletext",
"ChannelList",
"Green",
"Red",
"Blue",
@@ -116,25 +110,13 @@
"Guide",
"Info",
"Exit",
"Aspect",
"Netflix",
"3D",
"Apps",
"AV",
"EHelp",
"Home",
"InputComponent",
"InputHdmi1",
"InputHdmi2",
"InputHdmi3",
"InputHdmi4",
"InputVideo1",
"InputVideo2",
"Language",
"Option",
"SdCard/Usb",
"TV"
"SmartTv",
"Source"
],
"id": "21062178"
"id": "81651993"
}
}
}

View File

@@ -1,4 +0,0 @@
---
evohome:
username: "willem@oldemans.nl"
password: !secret Evohome

View File

@@ -1,44 +0,0 @@
---
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,17 +1,17 @@
openhasp:
plate01:
objects:
- obj: "p1b2" # switch, checkbox or btn with toggle true
properties:
"val": '{{ 1 if is_state("light.lamp_zolder_werkbank", "on") else 0 }}'
"text": '{{ "\uE6E8" if is_state("light.lamp_zolder_werkbank", "on") else "\uE335" | e }}'
event:
"down":
- service: homeassistant.toggle
entity_id: "light.lamp_zolder_werkbank"
- obj: "p0b1"
properties:
"text": "{{ states('sensor.zolder_temperatuur') }}"
- obj: "p0b2"
properties:
"text_color": "{% if -30 <= state_attr('openhasp.plate01','rssi') |int %}green{% elif -31 > state_attr('openhasp.plate01','rssi') |int >= -50 %}orange{% elif -51 > state_attr('openhasp.plate01','rssi') |int >= -80 %}tomato{% else %}red{% endif %}"
# openhasp:
# plate01:
# objects:
# - obj: "p1b2" # switch, checkbox or btn with toggle true
# properties:
# "val": '{{ 1 if is_state("light.lamp_zolder_werkbank", "on") else 0 }}'
# "text": '{{ "\uE6E8" if is_state("light.lamp_zolder_werkbank", "on") else "\uE335" | e }}'
# event:
# "down":
# - service: homeassistant.toggle
# entity_id: "light.lamp_zolder_werkbank"
# - obj: "p0b1"
# properties:
# "text": "{{ states('sensor.zolder_temperatuur') }}"
# - obj: "p0b2"
# properties:
# "text_color": "{% if -30 <= state_attr('openhasp.plate01','rssi') |int %}green{% elif -31 > state_attr('openhasp.plate01','rssi') |int >= -50 %}orange{% elif -51 > state_attr('openhasp.plate01','rssi') |int >= -80 %}tomato{% else %}red{% endif %}"

View File

@@ -1,27 +1,27 @@
timer:
wasdroger_delayed_job_completion_timer:
name: wasdroger - Delayed Job Completion Timer
duration: "00:15:00" # <- Notice the time here. Leave as it is (15 min)
restore: true
icon: mdi:tumble-dryer
# timer:
# wasdroger_delayed_job_completion_timer:
# name: wasdroger - Delayed Job Completion Timer
# duration: "00:15:00" # <- Notice the time here. Leave as it is (15 min)
# restore: true
# icon: mdi:tumble-dryer
input_boolean:
wasdroger_job_cycle:
name: wasdroger - Job Cycle
icon: mdi:tumble-dryer
# input_boolean:
# wasdroger_job_cycle:
# name: wasdroger - Job Cycle
# icon: mdi:tumble-dryer
wasdroger_automation_self_trigger:
name: wasdroger - Automation Self-trigger
icon: mdi:tumble-dryer
# wasdroger_automation_self_trigger:
# name: wasdroger - Automation Self-trigger
# icon: mdi:tumble-dryer
input_select:
wasdroger_state_machine:
name: wasdroger - State Machine
options:
- unplugged
- idle
- paused
- detached_overload
- job_ongoing
- job_completed
icon: mdi:tumble-dryer
# input_select:
# wasdroger_state_machine:
# name: wasdroger - State Machine
# options:
# - unplugged
# - idle
# - paused
# - detached_overload
# - job_ongoing
# - job_completed
# icon: mdi:tumble-dryer

View File

@@ -1,10 +0,0 @@
---
# 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

@@ -1,18 +0,0 @@
---
camera:
- platform: xiaomi_cloud_map_extractor
host: !secret xiaomi_vacuum_host
token: !secret xiaomi_vacuum_token
username: !secret xiaomi_cloud_username
password: !secret xiaomi_cloud_password
draw: ["all"]
attributes:
- calibration_points
- rooms
- map_name
- no_go_areas
- no_mopping_areas
room_colors:
16: [240, 178, 122]
17: [133, 193, 233]
18: [217, 136, 128]

View File

@@ -1,4 +0,0 @@
---
# https://www.home-assistant.io/integrations/tts/
tts:
- platform: picotts

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,123 @@
visionos:
modes:
light:
background-image: "center / cover no-repeat fixed url('https://raw.githubusercontent.com/Nezz/homeassistant-visionos-theme/1.1/themes/day.jpg')"
primary-background-color: rgb(84, 80, 76)
secondary-background-color: rgb(84, 80, 76)
app-header-background-color: rgba(84, 80, 76, 0.3)
ha-card-background: rgba(128, 128, 128, 0.3)
app-theme-color: rgb(122, 114, 106) # Average header color, used on the top of the browser
dark:
background-image: "center / cover no-repeat fixed url('https://raw.githubusercontent.com/Nezz/homeassistant-visionos-theme/1.1/themes/night.jpg')"
primary-background-color: rgb(25, 24, 22)
secondary-background-color: rgb(25, 24, 22)
app-header-background-color: rgba(25, 24, 22, 0.3)
ha-card-background: rgba(0, 0, 0, 0.3)
app-theme-color: rgb(0, 0, 0)
# Global
lovelace-background: var(--background-image)
primary-color: var(--orange-color)
light-primary-color: "#B6B6C1" # (icons on left menu) (light: systemGray5 from iOS dark mode, dark: XXX)
divider-color: rgba(152, 152, 157, 0.3) # from Apple systemGray dark mode
accent-color: var(--primary-color)
# Text
primary-text-color: rgba(255, 255, 255, 0.96)
secondary-text-color: "#d3d3d3"
text-primary-color: var(--primary-text-color)
disabled-text-color: rgba(208, 208, 208, 0.5) # XXX: https://github.com/basnijholt/lovelace-ios-dark-mode-theme/issues/2
text-dark-color: var(--primary-text-color)
# Sidebar Menu
sidebar-background-color: var(--secondary-background-color)
sidebar-icon-color: var(--light-primary-color)
sidebar-text-color: "#F1F1F1"
sidebar-selected-background-color: var(--primary-background-color)
sidebar-selected-icon-color: var(--primary-text-color)
sidebar-selected-text-color: var(--sidebar-selected-icon-color)
# States and Badges
state-icon-color: var(--primary-text-color)
state-icon-active-color: var(--yellow-color)
state-icon-unavailable-color: var(--disabled-text-color)
state-inactive-color: var(--disabled-text-color)
paper-item-icon-active-color: var(--state-icon-active-color) # see https://github.com/basnijholt/lovelace-ios-dark-mode-theme/issues/30
# Sliders
paper-slider-knob-color: "#FFFFFF"
paper-slider-knob-start-color: var(--paper-slider-knob-color)
paper-slider-pin-color: var(--paper-slider-knob-color)
paper-slider-active-color: "#0984ff" # from Apple systemBlue dark mode
paper-slider-secondary-color: var(--paper-slider-knob-color)
paper-slider-container-color: rgba(255, 255, 255, 0.5)
paper-slider-font-color: "#000"
ha-slider-background: none !important
# Labels
label-badge-background-color: "#23232E"
label-badge-text-color: "#F1F1F1"
label-badge-red: rgba(255, 159, 9, 0.7) # from Apple systemOrange dark mode
# Cards
card-background-color: var(--secondary-background-color) # Data table background
paper-listbox-background-color: var(--primary-background-color)
ha-card-border-radius: 20px
paper-card-background-color: var(--ha-card-background)
rgb-card-background-color: rgb(10, 10, 10) # see https://github.com/basnijholt/lovelace-ios-themes/issues/60
ha-card-border-width: 0 # https://github.com/basnijholt/lovelace-ios-dark-mode-theme/issues/82#event-7732695357
ha-card-backdrop-filter: blur(20px)
ha-card-box-shadow: 0.5px 0.5px 1px 0px rgba(255, 255, 255, 0.40) inset, -0.5px -0.5px 1px 0px rgba(255, 255, 255, 0.10) inset, 0px 1px 2px 0px rgba(0, 0, 0, 0.10)
# Toggles
paper-toggle-button-checked-button-color: "#484848"
paper-toggle-button-checked-bar-color: "#484848"
paper-toggle-button-unchecked-button-color: var(--paper-toggle-button-checked-button-color)
paper-toggle-button-unchecked-bar-color: var(--disabled-text-color)
# Table row
table-row-background-color: var(--primary-background-color)
table-row-alternative-background-color: var(--secondary-background-color)
# Switches
switch-checked-track-color: var(--green-color)
switch-checked-button-color: "#FFF"
switch-unchecked-track-color: var(--disabled-text-color)
switch-unchecked-button-color: "#FFF"
# Dialog
ha-dialog-surface-backdrop-filter: var(--ha-card-backdrop-filter)
dialog-box-shadow: var(--ha-card-box-shadow)
ha-dialog-surface-background: var(--ha-card-background)
# Header
app-header-backdrop-filter: var(--ha-card-backdrop-filter)
app-header-edit-background-color: rgba(0, 0, 0, 0.2)
# Colors
red-color: "#FF453A"
pink-color: "#FF375F"
purple-color: "#BF5AF2"
indigo-color: "#5E5CE6"
blue-color: "#0A84FF"
light-blue-color: "#66D4CF"
cyan-color: "#5AC8F5"
teal-color: "#6AC4DC"
green-color: "#32D74B"
yellow-color: "#FFD60A"
orange-color: "#FF9F0A"
brown-color: "#AC8E68"
# Other
paper-dialog-background-color: rgba(55, 55, 55, 0.8) # e.g., background of more-info
paper-item-icon-color: white # also should mini-media-player icon white (but doesn't work by itself)
more-info-header-background: rgba(25, 25, 25, 0.5)
lumo-body-text-color: var(--primary-text-color) # see https://github.com/basnijholt/lovelace-ios-dark-mode-theme/issues/42
markdown-code-background-color: "#464646"
code-editor-background-color: "#161616"
clear-background-color: var(--ha-card-background) # see https://github.com/basnijholt/lovelace-ios-themes/issues/64
mdc-theme-surface: var(--secondary-background-color) # this should be opaque as it's used by default for many overlays
material-background-color: var(--secondary-background-color)
mdc-checkbox-unchecked-color: "#FFF"
mdc-radio-unchecked-color: "#FFF"
# Custom
mcg-title-letter-spacing: .15em
mini-media-player-base-color: white
mini-media-player-icon-color: white
# Added for https://github.com/basnijholt/lovelace-ios-dark-mode-theme/issues/72
input-ink-color: var(--primary-text-color)
input-fill-color: transparent
input-disabled-fill-color: transparent
input-label-ink-color: var(--primary-text-color)
input-disabled-ink-color: var(--disabled-text-color)
input-dropdown-icon-color: var(--primary-text-color)
input-idle-line-color: var(--secondary-text-color)
input-hover-line-color: var(--secondary-text-color)
codemirror-property: var(--accent-color)
md-list-container-color: none # ha-md-list already has a card background

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,130 @@
import { LitElement, TemplateResult } from 'lit';
import { HomeAssistant } from 'custom-card-helpers';
import { UltraVehicleCardConfig } from '../types';
declare module 'custom-card-helpers' {
interface HomeAssistant {
__uvc_template_strings?: {
[key: string]: string;
};
}
}
export declare class UltraVehicleCard extends LitElement {
hass: HomeAssistant;
private config;
private _templateService?;
private static readonly DEFAULT_ACTIVE_STATES;
private static readonly DEFAULT_INACTIVE_STATES;
private _lastRenderTime;
private _lastImageUrl;
private _mapPopupData;
private _iconActiveStates;
private _iconsAwaitingConfirmation;
private _templateSubscriptions;
private _templateResults;
private _confirmationCancelListeners;
private _iconStateDebounceTimers;
private _highlightedSections;
static getConfigElement(): HTMLElement;
static getStubConfig(): {
title: string;
title_alignment: string;
title_size: number;
formatted_entities: boolean;
show_units: boolean;
vehicle_image_type: string;
sections_order: string[];
};
static get properties(): {
hass: {};
config: {};
};
static get styles(): import("lit").CSSResult;
setConfig(config: UltraVehicleCardConfig): void;
private _migrateBarsToIndividual;
private _cleanupInfoSections;
private _saveConfigChanges;
private _checkForGradientOrAnimationChanges;
private _forceFullRender;
protected render(): TemplateResult<1>;
private _renderImage;
private _getFriendlyName;
/**
* Check if an entity is a location tracking entity with coordinate data
*/
private _isLocationTrackingEntity;
/**
* Render a map view for location tracking entities
*/
private _renderMapImage;
private _formatValue;
private _handleImageError;
private _renderBar;
private _renderPercentageText;
private _getBarAnimationClass;
private _getEntityState;
private _renderIconRows;
private _renderIconRow;
private _renderCardIcon;
private _debouncedIconStateUpdate;
private _handleIconClick;
/**
* Shows a toast notification
* @param message The message to display
* @param type The type of toast (success, error, or info)
*/
private _showToast;
/**
* Opens a location map for the entity
*/
private _openLocationMap;
private _handleDragStart;
private _handleDragEnd;
private _hexToRgb;
private _hsToRgb;
private _colorTempToRgb;
private _getZoneInfo;
private _renderVehicleInfo;
private _computeImageStyle;
private _normalizeState;
private _renderBarLabels;
/**
* Process bar template and return the rendered result
* Similar to how templates are handled for icons
*/
private _processBarTemplate;
private _showMoreInfo;
firstUpdated(): void;
connectedCallback(): void;
disconnectedCallback(): void;
private _handleForceGradientRefresh;
private _refreshInterval;
private _setupRefreshInterval;
private _entityStates;
private _entityImageUrls;
protected updated(changedProperties: Map<string, any>): void;
private _evaluateTemplate;
private _subscribeToTemplate;
private _parseTemplateResult;
private _unsubscribeAllTemplates;
private _renderMapPopup;
private _formatCoordinates;
private _getEntityForCoordinates;
private _isDarkMode;
private _closeMapPopup;
private _shouldRenderSection;
private _cancelConfirmation;
private _checkBarSideCondition;
private _processPercentageTemplate;
private _renderInfoRowsFromConfig;
private _renderSingleInfoRow;
private _renderSingleInfoEntity;
private _handleInfoEntityClick;
private _getDisplaySections;
private _cleanupSectionsOrder;
private _ensureInfoAndIconRowsInSectionsOrder;
private _handleHighlightSections;
private _isHighlighted;
private _getHighlightClass;
private _getImageHighlightStyle;
private _handleClearHighlight;
}

View File

@@ -0,0 +1,9 @@
import { LitElement } from 'lit';
export declare class UltraVehicleColorPicker extends LitElement {
value?: string;
label?: string;
private _getDisplayColor;
private _colorChanged;
render(): import("lit").TemplateResult<1>;
static get styles(): import("lit").CSSResult;
}

View File

@@ -0,0 +1,39 @@
import { LitElement, TemplateResult } from 'lit';
import { HomeAssistant } from 'custom-card-helpers';
import { ActionImageConfig } from '../types';
export declare class ActionImageRow extends LitElement {
hass: HomeAssistant;
config: ActionImageConfig;
lang: string;
initialExpanded: boolean;
private expanded;
private _cropExpanded;
private _sliderInputValue?;
private _hasInitialized;
protected updated(changedProperties: Map<string, any>): void;
protected render(): TemplateResult<1>;
private _renderPreview;
private _renderImageInput;
private _toggleExpand;
private _handleDelete;
private _handleDuplicate;
private _handleEntityFormChange;
private _handleStateChange;
private _handleImageTypeChange;
private _handleImageUrlChange;
private _handleImageEntityFormChange;
private _handleFileUpload;
private _handleConfigChange;
private _getImageTypeName;
private _truncatePath;
private _handleDragStart;
private _handleDragEnd;
private _renderCropControls;
private _createDefaultCropSettings;
private _updateImageCrop;
private _handleWidthChange;
private _handleSliderInput;
private _handleWidthInput;
private _handleWidthInputChange;
static styles: import("lit").CSSResult;
}

View File

@@ -0,0 +1,14 @@
import { LitElement } from 'lit';
export declare class ColorPicker extends LitElement {
value?: string;
label?: string;
configValue?: string;
showResetButton: boolean;
private _getDisplayColor;
private _rgbToHex;
private _onColorChanged;
private _fireChangeEvent;
private _resetColor;
render(): import("lit").TemplateResult<1>;
static get styles(): import("lit").CSSResult;
}

View File

@@ -0,0 +1,11 @@
import { LitElement } from 'lit';
import { HomeAssistant } from 'custom-card-helpers';
export declare class UltraEntityPicker extends LitElement {
hass: HomeAssistant;
label: string;
value?: string;
entityFilter?: (entityId: string) => boolean;
static get styles(): import("lit").CSSResult;
protected render(): import("lit").TemplateResult<1>;
private _valueChanged;
}

View File

@@ -0,0 +1,39 @@
import { LitElement } from 'lit';
export interface GradientStop {
id: string;
position: number;
color: string;
}
export declare function generateGradientString(stops: GradientStop[]): string;
export declare function createDefaultGradientStops(): GradientStop[];
export declare function createLinearGradient(stops: GradientStop[]): string;
export declare function getColorAtPosition(stops: GradientStop[], position: number): string;
export declare function createStopAtLargestGap(stops: GradientStop[]): GradientStop;
export declare function normalizeBoundaryStops(stops: GradientStop[]): GradientStop[];
export declare class GradientEditor extends LitElement {
stops: GradientStop[];
barSize: 'thin' | 'regular' | 'thick' | 'thiccc';
barRadius: 'round' | 'square' | 'rounded-square';
barStyle: string;
private _draggedIndex;
static styles: import("lit").CSSResult;
render(): import("lit").TemplateResult<1>;
private _renderStopItem;
private _addStop;
private _resetStops;
private _deleteStop;
private _handleColorChange;
private _handlePositionChange;
private _validateAndSortStops;
private _notifyChange;
private _dispatchResetEvent;
private _handleDragStart;
private _handleDragEnd;
private _handleDragOver;
private _handleDrop;
}
declare global {
interface HTMLElementTagNameMap {
'gradient-editor': GradientEditor;
}
}

View File

@@ -0,0 +1,4 @@
// Ultra Vehicle Card Debug Info
// Version: 2.9.1
// Build Date: 2025-06-04T20:50:34.534Z
// Build Mode: production

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