Update devices.yaml and state.json with new device configurations and states
- Refactored friendly names in devices.yaml for consistency and clarity. - Added new devices and updated existing ones in devices.yaml. - Populated state.json with detailed state information for various devices, including brightness, power, and link quality. - Included update information for devices where applicable.
This commit is contained in:
@@ -1 +1 @@
|
||||
2026.3.3
|
||||
2026.3.4
|
||||
@@ -1 +1 @@
|
||||
{"pid": 67, "version": 1, "ha_version": "2026.3.3", "start_ts": 1774433600.107569}
|
||||
{"pid": 67, "version": 1, "ha_version": "2026.3.4", "start_ts": 1775168237.1806254}
|
||||
164
automations.yaml
164
automations.yaml
@@ -174,7 +174,7 @@
|
||||
use_blueprint:
|
||||
path: freakshock88/motion_illuminance_activated_entity.yaml
|
||||
input:
|
||||
motion_sensor: binary_sensor.beweging_toilet
|
||||
motion_sensor: binary_sensor.beweging_toilet_occupancy
|
||||
target_entity: light.lamp_toilet
|
||||
no_motion_wait: input_number.beweging_toilet_timer
|
||||
- id: '1754287559178'
|
||||
@@ -245,7 +245,7 @@
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: switch.boiler_2
|
||||
entity_id: switch.boiler
|
||||
- action: switch.turn_on
|
||||
metadata: {}
|
||||
target:
|
||||
@@ -266,13 +266,13 @@
|
||||
use_blueprint:
|
||||
path: Blackshome/bathroom-humidity-exhaust-fan.yaml
|
||||
input:
|
||||
trigger: sensor.badkamer_luchtvochtigheid
|
||||
trigger: sensor.badkamer_vocht_stijging
|
||||
fan_switch:
|
||||
device_id: 6e29c3c314df87528f187dbe4eb847d4
|
||||
include_max_humidity: maximum_humidity_enabled
|
||||
include_lights: lights_enabled
|
||||
light_switch:
|
||||
device_id: fd928c6d0fd2752492d952a375f9409a
|
||||
entity_id: light.lamp_badkamer
|
||||
include_manual_fan_switch: disable_manual_fan_switch
|
||||
include_automation_link: enable_automation_link
|
||||
automation_link:
|
||||
@@ -295,44 +295,10 @@
|
||||
use_blueprint:
|
||||
path: freakshock88/motion_illuminance_activated_entity.yaml
|
||||
input:
|
||||
motion_sensor: binary_sensor.beweging_badkamer2_bezetting
|
||||
motion_sensor: binary_sensor.beweging_badkamer_occupancy
|
||||
target_entity: light.lamp_badkamer
|
||||
no_motion_wait: input_number.badkamer_timer
|
||||
turn_off_blocker_entity: input_boolean.in_de_douche
|
||||
- id: '1756728579666'
|
||||
alias: Button Open voordeur
|
||||
description: ''
|
||||
triggers:
|
||||
- device_id: 0ccc5ec3c7c93aa278e95a47b9d56830
|
||||
domain: zha
|
||||
type: remote_button_double_press
|
||||
subtype: remote_button_double_press
|
||||
trigger: device
|
||||
conditions: []
|
||||
actions:
|
||||
- if:
|
||||
- condition: device
|
||||
device_id: ead52fdd2817e1e0d5c981e717e3bf63
|
||||
domain: lock
|
||||
entity_id: 21ed9e61c7b8e284fe8e5ea9f30c1136
|
||||
type: is_locked
|
||||
then:
|
||||
- action: lock.unlock
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
device_id: ead52fdd2817e1e0d5c981e717e3bf63
|
||||
alias: Unlock when locked
|
||||
- action: lock.open
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
device_id: ead52fdd2817e1e0d5c981e717e3bf63
|
||||
- action: notify.mobile_app_iphone_van_willem
|
||||
metadata: {}
|
||||
data:
|
||||
message: Voordeur is open
|
||||
mode: single
|
||||
- id: '1756826045048'
|
||||
alias: Container reset op 1e van de maand
|
||||
description: ''
|
||||
@@ -361,7 +327,7 @@
|
||||
path: Blackshome/sensor-light.yaml
|
||||
input:
|
||||
motion_trigger:
|
||||
- binary_sensor.beweging_keuken_bezetting
|
||||
- binary_sensor.beweging_keuken_occupancy
|
||||
light_switch:
|
||||
entity_id: light.lamp_keuken_main
|
||||
include_light_control:
|
||||
@@ -387,10 +353,10 @@
|
||||
night_glow_light_colour_temperature: 2000
|
||||
include_night_glow_light_control:
|
||||
- use_brightness
|
||||
include_dynamic_lighting: disable_dynamic_lighting
|
||||
include_dynamic_lighting: enable_sun_elevation_colour
|
||||
dynamic_lighting_min_colour_temp: 2500
|
||||
include_night_lights: night_lights_enabled
|
||||
dynamic_lighting_max_colour_temp: 4200
|
||||
dynamic_lighting_max_colour_temp: 5000
|
||||
night_lights_after_time: '22:00:00'
|
||||
dynamic_lighting_max_brightness: 80
|
||||
dynamic_lighting_min_brightness: 42
|
||||
@@ -410,34 +376,6 @@
|
||||
dim_before_off_boolean: input_boolean.keuken_dim_helper
|
||||
include_device_tracker: device_tracker_disabled
|
||||
time_delay: 10
|
||||
- id: '1758800846641'
|
||||
alias: Voordeur ontgrendelen met RFID
|
||||
description: ''
|
||||
triggers:
|
||||
- tag_id: 04-DA-AF-A2-C0-16-90
|
||||
trigger: tag
|
||||
- tag_id: 7D-98-B0-99
|
||||
trigger: tag
|
||||
actions:
|
||||
- target:
|
||||
entity_id: lock.voordeur
|
||||
action: lock.open
|
||||
data: {}
|
||||
enabled: true
|
||||
- action: light.toggle
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
entity_id: light.lamp_kast
|
||||
enabled: false
|
||||
- action: tts.speak
|
||||
metadata: {}
|
||||
data:
|
||||
cache: true
|
||||
message: toegang toegestaan, de deur gaat nu open
|
||||
media_player_entity_id: media_player.esphome_web_0c8784_speaker_media_player
|
||||
target:
|
||||
device_id: ff2155e96d61ed2a7f60183d5e67eb62
|
||||
- id: '1759405814831'
|
||||
alias: schakelaar kids [BP]
|
||||
description: ''
|
||||
@@ -523,7 +461,7 @@
|
||||
input:
|
||||
primary_input: binary_sensor.slaapkamer_deur_input_0
|
||||
secondary_input: binary_sensor.schakelaar_bed_rechts_1
|
||||
lamp_entity: light.lamp_slaapkamer_2
|
||||
lamp_entity: light.lamp_slaapkamer
|
||||
confirm_switch: switch.schakelaars_slaapkamer_deur_confirm
|
||||
tertiary_input: binary_sensor.schakelaar_bed_links_0
|
||||
- id: '1759752615892'
|
||||
@@ -699,7 +637,7 @@
|
||||
path: willumpie82/shelly-detached-input3.yaml
|
||||
input:
|
||||
primary_input: binary_sensor.schakelaar_bed_rechts_0
|
||||
lamp_entity: light.lanp_bed_rechts_dim
|
||||
lamp_entity: light.lamp_bed_rechts_dim
|
||||
- id: '1764014728235'
|
||||
alias: Deurbel notificatie met snapshot
|
||||
description: Stuur een notificatie bij de deurbel met link naar snapshot en deur
|
||||
@@ -803,8 +741,9 @@
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
device_id: 3bbf9bc0a07de0f76801fce9366f23fc
|
||||
entity_id: light.lamp_kast
|
||||
entity_id:
|
||||
- light.lamp_kast
|
||||
- light.lamp_tafel
|
||||
- action: script.kerst_aan
|
||||
metadata: {}
|
||||
data: {}
|
||||
@@ -950,7 +889,7 @@
|
||||
data:
|
||||
brightness_pct: 41
|
||||
target:
|
||||
entity_id: light.lamp_slaapkamer_2
|
||||
entity_id: light.lamp_slaapkamer
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
@@ -961,7 +900,7 @@
|
||||
data:
|
||||
brightness_pct: 26
|
||||
target:
|
||||
entity_id: light.lanp_bed_rechts_dim
|
||||
entity_id: light.lamp_bed_rechts_dim
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
@@ -1045,7 +984,7 @@
|
||||
data:
|
||||
brightness_pct: 99
|
||||
target:
|
||||
entity_id: light.lamp_slaapkamer_2
|
||||
entity_id: light.lamp_slaapkamer
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
@@ -1056,7 +995,7 @@
|
||||
data:
|
||||
brightness_pct: 99
|
||||
target:
|
||||
entity_id: light.lanp_bed_rechts_dim
|
||||
entity_id: light.lamp_bed_links_dim
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
id:
|
||||
@@ -1172,7 +1111,7 @@
|
||||
alias: set woonkamer TRV external temperature
|
||||
description: ''
|
||||
triggers:
|
||||
- entity_id: sensor.temperatuur_woonkamer_temperatuur
|
||||
- entity_id: sensor.temperatuur_woonkamer_temperature
|
||||
for: 00:00:30
|
||||
trigger: state
|
||||
conditions: []
|
||||
@@ -1180,7 +1119,7 @@
|
||||
- target:
|
||||
entity_id: number.verwarming_woonkamer_blu_external_temperature
|
||||
data:
|
||||
value: '{{ states(''sensor.temperatuur_woonkamer_temperatuur'') | float(20)
|
||||
value: '{{ states(''sensor.temperatuur_woonkamer_temperature'') | float(20)
|
||||
}}'
|
||||
action: number.set_value
|
||||
mode: single
|
||||
@@ -1199,7 +1138,7 @@
|
||||
- action: light.toggle
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id: light.lamp_kantoor_2
|
||||
entity_id: light.lamp_kantoor
|
||||
data: {}
|
||||
mode: single
|
||||
- id: '1768681346869'
|
||||
@@ -1211,7 +1150,7 @@
|
||||
input_mode: button
|
||||
primary_input: binary_sensor.dsmr_reader_running
|
||||
shelly_device: 44635828f3e606accd12f83b58ae46b8
|
||||
lamp_entity: light.lamp_kantoor_2
|
||||
lamp_entity: light.lamp_kantoor
|
||||
confirm_switch: switch.shelly_kantoor_confirm
|
||||
- id: '1768902527272'
|
||||
alias: Dashboard Willem – bepaal context
|
||||
@@ -1266,7 +1205,7 @@
|
||||
- if:
|
||||
- condition: light.is_on
|
||||
target:
|
||||
entity_id: light.lamp_kantoor_2
|
||||
entity_id: light.lamp_kantoor
|
||||
options:
|
||||
behavior: any
|
||||
then:
|
||||
@@ -1307,10 +1246,13 @@
|
||||
path: Blackshome/sensor-light.yaml
|
||||
input:
|
||||
motion_trigger:
|
||||
- binary_sensor.beweging_keuken
|
||||
- binary_sensor.beweging_keuken_occupancy
|
||||
light_switch:
|
||||
entity_id: switch.display_keuken_scherm
|
||||
time_delay: 2
|
||||
entity_id: script.display_keuken_aan
|
||||
time_delay: 10
|
||||
end_scenes:
|
||||
- script.display_keuken_uit
|
||||
boolean_scenes_scripts: input_boolean.display_keuken_toggle_helper
|
||||
- id: '1771836870389'
|
||||
alias: Meshcore - SNR Info Repeater
|
||||
description: Collect SNR data of the last hop
|
||||
@@ -1407,7 +1349,7 @@
|
||||
triggers:
|
||||
- trigger: state
|
||||
entity_id:
|
||||
- binary_sensor.contact_meterkastdeur
|
||||
- binary_sensor.contact_meterkast_contact
|
||||
from:
|
||||
- 'on'
|
||||
to:
|
||||
@@ -1456,3 +1398,51 @@
|
||||
target:
|
||||
entity_id: tts.home_assistant_cloud
|
||||
mode: single
|
||||
- id: '1774731088637'
|
||||
alias: Slimme plant waarschuwing - Pannenkoekenplant
|
||||
description: Geeft gerichte meldingen (water/licht/voeding)
|
||||
triggers:
|
||||
- entity_id: plant.pannenkoekenplant
|
||||
from: ok
|
||||
to: problem
|
||||
for: 00:05:00
|
||||
trigger: state
|
||||
conditions:
|
||||
- condition: template
|
||||
value_template: "{{ \n state_attr('plant.pannenkoekenplant', 'moisture') not
|
||||
in [None, 'unknown'] and\n state_attr('plant.pannenkoekenplant', 'conductivity')
|
||||
not in [None, 'unknown'] and\n state_attr('plant.pannenkoekenplant', 'illuminance')
|
||||
not in [None, 'unknown']\n}}\n"
|
||||
actions:
|
||||
- variables:
|
||||
moisture: '{{ state_attr(''plant.pannenkoekenplant'', ''moisture'') | float(0)
|
||||
}}'
|
||||
conductivity: '{{ state_attr(''plant.pannenkoekenplant'', ''conductivity'')
|
||||
| float(0) }}'
|
||||
illuminance: '{{ state_attr(''plant.pannenkoekenplant'', ''illuminance'') |
|
||||
float(0) }}'
|
||||
- data:
|
||||
title: "\U0001F331 Pannenkoekenplant heeft hulp nodig"
|
||||
message: "{% set msg = [] %}\n{# DREMPELS - pas aan naar jouw plant! #} {% if
|
||||
moisture < 20 %}\n {% set msg = msg + ['\U0001F4A7 Heeft water nodig'] %}\n{%
|
||||
elif moisture > 80 %}\n {% set msg = msg + ['\U0001F6AB Te nat'] %}\n{% endif
|
||||
%}\n{% if conductivity < 300 %}\n {% set msg = msg + ['\U0001F9EA Voeding
|
||||
nodig'] %}\n{% elif conductivity > 2000 %}\n {% set msg = msg + ['⚠️ Te veel
|
||||
voeding'] %}\n{% endif %}\n{% if illuminance < 1000 %}\n {% set msg = msg
|
||||
+ ['☀️ Meer licht nodig'] %}\n{% elif illuminance > 30000 %}\n {% set msg
|
||||
= msg + ['\U0001F324️ Te veel zonlicht'] %}\n{% endif %}\n{% if msg | length
|
||||
== 0 %}\n {% set msg = ['⚠️ Controleer plant'] %}\n{% endif %}\nActie: {{
|
||||
msg | join('\\n') }}\n--- Waarden: \U0001F4A7 Vocht: {{ moisture }}% ☀️ Licht:
|
||||
{{ illuminance }} lx \U0001F9EA Voeding: {{ conductivity }} µS/cm\n"
|
||||
action: notify.mobile_app_iphone_van_willem
|
||||
mode: single
|
||||
- id: '1775120635177'
|
||||
alias: RobbSmart 8-knops switch - keuken
|
||||
description: ''
|
||||
use_blueprint:
|
||||
path: willumpie82/robb_smart_8_z2m.yaml
|
||||
input:
|
||||
mqtt_topic: zigbee2mqtt/schakelaar keuken
|
||||
pair_1_entity: light.lamp_keuken_main
|
||||
pair_2_entity: light.lamp_keuken_kleur
|
||||
pair_2_default_brightness: 100
|
||||
|
||||
5
entities/sensors/luchtvochtigheid.yaml
Normal file
5
entities/sensors/luchtvochtigheid.yaml
Normal file
@@ -0,0 +1,5 @@
|
||||
derivative:
|
||||
- source: sensor.temperatuur_badkamer_humidity
|
||||
name: Badkamer vocht stijging
|
||||
unit_time: min
|
||||
time_window: "00:05:00"
|
||||
@@ -1,30 +1,19 @@
|
||||
---
|
||||
trigger:
|
||||
platform: time_pattern
|
||||
minutes: "/4"
|
||||
action:
|
||||
- service: weather.get_forecasts
|
||||
data:
|
||||
type: daily
|
||||
target:
|
||||
entity_id: weather.forecast_home
|
||||
response_variable: daily
|
||||
sensor:
|
||||
- sensor:
|
||||
- name: e-ink Display Data
|
||||
unique_id: e_ink_display_data
|
||||
icon: ios:display-2
|
||||
icon: mdi:display-2
|
||||
state: "OK"
|
||||
attributes:
|
||||
greeting: >
|
||||
{%- if now() > today_at('18:00') %}
|
||||
Good evening
|
||||
{%- elif now() > today_at('12:00') %}
|
||||
Good afternoon
|
||||
{%- elif now() > today_at('5:00') %}
|
||||
Good morning
|
||||
{%- else %}
|
||||
Good night
|
||||
{%- endif %}
|
||||
{%- if now() > today_at('18:00') %}Good evening{%- elif now() > today_at('12:00') %}Good afternoon{%- elif now() > today_at('5:00') %}Good morning{%- else %}Good night{%- endif %}
|
||||
|
||||
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 }}
|
||||
|
||||
weather_condition_now: >
|
||||
{% set cond_now = states('weather.forecast_home') %}
|
||||
@@ -34,84 +23,12 @@ sensor:
|
||||
{{ cond_now }}
|
||||
{% endif %}
|
||||
|
||||
weather_condition_0: >
|
||||
{% set cond0 = daily["weather.forecast_home"].forecast[0].condition %}
|
||||
# {% set next_setting = as_timestamp(state_attr('sun.sun', 'next_setting')) %}
|
||||
# {% set next_rising = as_timestamp(state_attr('sun.sun', 'next_rising')) %}
|
||||
{% set cond0_time = as_timestamp(daily["weather.forecast_home"].forecast[0].datetime) %}
|
||||
{% if cond0_time > next_setting and cond0_time < next_rising %}
|
||||
{% if cond0 == 'sunny' %} night {% elif cond0 == 'partlycloudy' %} night-partly-cloudy {% else %} {{ cond0 }} {% endif %}
|
||||
{% else %}
|
||||
{{ cond0 }}
|
||||
{% endif %}
|
||||
weather_temperature_0: >
|
||||
{{ daily["weather.forecast_home"].forecast[0].temperature | round }}
|
||||
weather_timestamp_0: >
|
||||
{{ as_timestamp(daily["weather.forecast_home"].forecast[0].datetime) | timestamp_custom('%a') }}
|
||||
weather_condition_1: >
|
||||
{% set cond1 = daily["weather.forecast_home"].forecast[1].condition %}
|
||||
# {% set next_setting = as_timestamp(state_attr('sun.sun', 'next_setting')) %}
|
||||
# {% set next_rising = as_timestamp(state_attr('sun.sun', 'next_rising')) %}
|
||||
{% set cond1_time = as_timestamp(daily["weather.forecast_home"].forecast[1].datetime) %}
|
||||
{% if cond1_time > next_setting and cond1_time < next_rising %}
|
||||
{% if cond1 == 'sunny' %} night {% elif cond1 == 'partlycloudy' %} night-partly-cloudy {% else %} {{ cond1 }} {% endif %}
|
||||
{% else %}
|
||||
{{ cond1 }}
|
||||
{% endif %}
|
||||
weather_temperature_1: >
|
||||
{{ daily["weather.forecast_home"].forecast[1].temperature | round }}
|
||||
weather_timestamp_1: >
|
||||
{{ as_timestamp(daily["weather.forecast_home"].forecast[1].datetime) | timestamp_custom('%a') }}
|
||||
weather_condition_2: >
|
||||
{% set cond2 = daily["weather.forecast_home"].forecast[2].condition %}
|
||||
# {% set next_setting = as_timestamp(state_attr('sun.sun', 'next_setting')) %}
|
||||
# {% set next_rising = as_timestamp(state_attr('sun.sun', 'next_rising')) %}
|
||||
{% set cond2_time = as_timestamp(daily["weather.forecast_home"].forecast[2].datetime) %}
|
||||
{% if cond2_time > next_setting and cond2_time < next_rising %}
|
||||
{% if cond2 == 'sunny' %} night {% elif cond2 == 'partlycloudy' %} night-partly-cloudy {% else %} {{ cond2 }} {% endif %}
|
||||
{% else %}
|
||||
{{ cond2 }}
|
||||
{% endif %}
|
||||
weather_temperature_2: >
|
||||
{{ daily["weather.forecast_home"].forecast[2].temperature | round }}
|
||||
weather_timestamp_2: >
|
||||
{{ as_timestamp(daily["weather.forecast_home"].forecast[2].datetime) | timestamp_custom('%a') }}
|
||||
weather_condition_3: >
|
||||
{% set cond3 = daily["weather.forecast_home"].forecast[3].condition %}
|
||||
# {% set next_setting = as_timestamp(state_attr('sun.sun', 'next_setting')) %}
|
||||
# {% set next_rising = as_timestamp(state_attr('sun.sun', 'next_rising')) %}
|
||||
{% set cond3_time = as_timestamp(daily["weather.forecast_home"].forecast[3].datetime) %}
|
||||
{% if cond3_time > next_setting and cond3_time < next_rising %}
|
||||
{% if cond3 == 'sunny' %} night {% elif cond3 == 'partlycloudy' %} night-partly-cloudy {% else %} {{ cond3 }} {% endif %}
|
||||
{% else %}
|
||||
{{ cond3 }}
|
||||
{% endif %}
|
||||
weather_temperature_3: >
|
||||
{{ daily["weather.forecast_home"].forecast[3].temperature | round }}
|
||||
weather_timestamp_3: >
|
||||
{{ as_timestamp(daily["weather.forecast_home"].forecast[3].datetime) | timestamp_custom('%a') }}
|
||||
# afval_today: >
|
||||
# {{ states('sensor.afvalinfo_thuis_trash_type_today') }}
|
||||
# afval_tomorrow: >
|
||||
# {{ states('sensor.afvalinfo_thuis_trash_type_tomorrow') }}
|
||||
# sun_next_rising: >
|
||||
# {{ state_attr('Sun.sun', 'next_rising') }}
|
||||
# sun_next_setting: >
|
||||
# {{ state_attr('Sun.sun', 'next_setting') }}
|
||||
moon_phase_icon: >
|
||||
{{ state_attr('sensor.moon_phase', 'icon') }}
|
||||
{{ state_attr('sensor.moon_phase', 'icon') | default('🌙') }}
|
||||
|
||||
media_playing_status: >
|
||||
{{ states('media_player.keuken') }}
|
||||
media_playing_title: >
|
||||
{{ 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 }}
|
||||
{{ state_attr('media_player.keuken', 'media_artist') | title }}
|
||||
|
||||
87
entities/templates/homeassistant_status.yaml
Normal file
87
entities/templates/homeassistant_status.yaml
Normal file
@@ -0,0 +1,87 @@
|
||||
# SMOKE DETECTOR STATUS - Returns "OK" or error
|
||||
- sensor:
|
||||
- name: "Smoke Detector Status Summary"
|
||||
unique_id: smoke_detector_status_summary
|
||||
icon: mdi:fire
|
||||
state: >
|
||||
{% set overloop_battery = states('sensor.rookmelder_overloop_batterij') | float(100) %}
|
||||
{% set overloop_life = states('binary_sensor.rookmelder_overloop_is_life_end') %}
|
||||
{% set overloop_smoke = states('binary_sensor.rookmelder_overloop_rook') %}
|
||||
{% set hall_battery = states('sensor.rookmelder_hal_batterij') | float(100) %}
|
||||
|
||||
{% if overloop_battery < 10 or overloop_life == 'on' or overloop_smoke == 'on' or hall_battery < 10 %}
|
||||
ERROR
|
||||
{% else %}
|
||||
OK
|
||||
{% endif %}
|
||||
attributes:
|
||||
overloop_battery: "{{ states('sensor.rookmelder_overloop_batterij') }}"
|
||||
hall_battery: "{{ states('sensor.rookmelder_hal_batterij') }}"
|
||||
|
||||
# CAR DIAGNOSTICS STATUS - Returns "OK" or error
|
||||
- sensor:
|
||||
- name: "Car Diagnostics Summary"
|
||||
unique_id: car_diagnostics_summary
|
||||
icon: mdi:car-alert
|
||||
state: >
|
||||
{% set doors_open = states('binary_sensor.skoda_enyaq_deuren') %}
|
||||
{% set windows_open = states('binary_sensor.skoda_enyaq_ramen') %}
|
||||
{% set charge_pct = states('sensor.skoda_enyaq_accupercentage') | float(50) %}
|
||||
|
||||
{% if doors_open == 'on' or windows_open == 'on' or charge_pct < 15 %}
|
||||
ERROR
|
||||
{% else %}
|
||||
OK
|
||||
{% endif %}
|
||||
attributes:
|
||||
doors: "{{ states('binary_sensor.skoda_enyaq_deuren') }}"
|
||||
windows: "{{ states('binary_sensor.skoda_enyaq_ramen') }}"
|
||||
charge_pct: "{{ states('sensor.skoda_enyaq_accupercentage') }}"
|
||||
|
||||
# HOMELAB SERVICES STATUS - Returns "OK" or error if any service is down
|
||||
- sensor:
|
||||
- name: "Homelab Services Summary"
|
||||
unique_id: homelab_services_summary
|
||||
icon: mdi:server-network
|
||||
state: >
|
||||
{% set adguard = states('sensor.pi_hole_status_2') %}
|
||||
{% set gitea = states('sensor.gitea_status_2') %}
|
||||
{% set immich = states('sensor.immich_status_2') %}
|
||||
{% set ha = states('sensor.homeassistant_status_2') %}
|
||||
{% set jellyfin = states('sensor.jellyfin_status_2') %}
|
||||
{% set nginx = states('sensor.nginix_proxymananger_status_2') %}
|
||||
{% set mqtt = states('sensor.mqtt_broker_status_2') %}
|
||||
{% set truenas = states('sensor.truenas_status_2') %}
|
||||
{% set zigbee = states('sensor.zigbee_thread_status_2') %}
|
||||
{% set zwave = states('sensor.zwave_status_2') %}
|
||||
{% set last_backup = as_timestamp(states('sensor.backup_last_successful_automatic_backup')) %}
|
||||
{% set backup_hours_ago = ((now().timestamp() - last_backup) / 3600) | int %}
|
||||
|
||||
{% if adguard == 'off' or gitea == 'off' or immich == 'off' or ha == 'off' or jellyfin == 'off' or nginx == 'off' or mqtt == 'off' or truenas == 'off' or zigbee == 'off' or zwave == 'off' or backup_hours_ago > 48 %}
|
||||
ERROR
|
||||
{% else %}
|
||||
OK
|
||||
{% endif %}
|
||||
attributes:
|
||||
adguard: "{{ states('sensor.pi_hole_status_2') }}"
|
||||
jellyfin: "{{ states('sensor.jellyfin_status_2') }}"
|
||||
mqtt: "{{ states('sensor.mqtt_broker_status_2') }}"
|
||||
last_backup: "{{ states('sensor.backup_last_successful_automatic_backup') }}"
|
||||
|
||||
# BATTERY STATUS - Returns "OK" or error if any battery is critically low
|
||||
- sensor:
|
||||
- name: "Battery Status Summary"
|
||||
unique_id: battery_status_summary
|
||||
icon: mdi:battery-alert
|
||||
state: >
|
||||
{% set doorlock_battery = states('sensor.voordeur_batterij') | float(100) %}
|
||||
{% set car_battery = states('sensor.skoda_enyaq_accupercentage') | float(100) %}
|
||||
|
||||
{% if doorlock_battery < 10 or car_battery < 15 %}
|
||||
ERROR
|
||||
{% else %}
|
||||
OK
|
||||
{% endif %}
|
||||
attributes:
|
||||
doorlock: "{{ states('sensor.voordeur_batterij') }}"
|
||||
car: "{{ states('sensor.skoda_enyaq_accupercentage') }}"
|
||||
@@ -19,3 +19,44 @@ packages:
|
||||
logger: !include templates/logger.yaml
|
||||
btproxy: !include templates/bt_proxy.yaml
|
||||
|
||||
|
||||
# esp32_ble_tracker:
|
||||
# on_ble_advertise:
|
||||
# then:
|
||||
# - lambda: |-
|
||||
# ESP_LOGD("BLE", "MAC: %s | RSSI: %d", x.address_str().c_str(), x.get_rssi());
|
||||
|
||||
sensor:
|
||||
- platform: xiaomi_hhccjcy01
|
||||
mac_address: "5C:85:7E:13:17:A3"
|
||||
temperature:
|
||||
name: "Xiaomi MiFlora Temperature"
|
||||
moisture:
|
||||
name: "Xiaomi MiFlora Moisture"
|
||||
illuminance:
|
||||
name: "Xiaomi MiFlora Illuminance"
|
||||
conductivity:
|
||||
name: "Xiaomi MiFlora Soil Conductivity"
|
||||
battery_level:
|
||||
name: "Xiaomi MiFlora Battery Level"
|
||||
|
||||
esp32_ble_tracker:
|
||||
on_ble_advertise:
|
||||
then:
|
||||
- lambda: |-
|
||||
// MAC-adres als string
|
||||
std::string mac = x.address_str();
|
||||
|
||||
// RSSI ophalen via getter
|
||||
int rssi = x.get_rssi();
|
||||
|
||||
// Naam ophalen, lege string als onbekend
|
||||
std::string name = x.get_name(); // geen has_value(), gewoon std::string
|
||||
|
||||
// Filter: Xiaomi MAC-prefixes of Flowercare naam
|
||||
if (mac.rfind("A4:C1:38", 0) == 0 ||
|
||||
mac.rfind("62:26:28", 0) == 0 ||
|
||||
mac.rfind("4C:65:A8", 0) == 0 ||
|
||||
name.find("Flower") != std::string::npos) {
|
||||
ESP_LOGD("xiaomi_logger", "Xiaomi device found: %s (%s), RSSI: %d", mac.c_str(), name.c_str(), rssi);
|
||||
}
|
||||
1
esphome/components_local/waveshare_epaper/__init__.py
Normal file
1
esphome/components_local/waveshare_epaper/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
CODEOWNERS = ["@clydebarrow"]
|
||||
229
esphome/components_local/waveshare_epaper/display.py
Normal file
229
esphome/components_local/waveshare_epaper/display.py
Normal file
@@ -0,0 +1,229 @@
|
||||
import esphome.codegen as cg
|
||||
import esphome.config_validation as cv
|
||||
from esphome import core, pins
|
||||
from esphome.components import display, spi
|
||||
from esphome.const import (
|
||||
CONF_BUSY_PIN,
|
||||
CONF_DC_PIN,
|
||||
CONF_FULL_UPDATE_EVERY,
|
||||
CONF_ID,
|
||||
CONF_LAMBDA,
|
||||
CONF_MODEL,
|
||||
CONF_PAGES,
|
||||
CONF_RESET_DURATION,
|
||||
CONF_RESET_PIN,
|
||||
)
|
||||
|
||||
DEPENDENCIES = ["spi"]
|
||||
|
||||
waveshare_epaper_ns = cg.esphome_ns.namespace("waveshare_epaper")
|
||||
WaveshareEPaperBase = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaperBase", cg.PollingComponent, spi.SPIDevice, display.DisplayBuffer
|
||||
)
|
||||
WaveshareEPaper = waveshare_epaper_ns.class_("WaveshareEPaper", WaveshareEPaperBase)
|
||||
WaveshareEPaperBWR = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaperBWR", WaveshareEPaperBase
|
||||
)
|
||||
WaveshareEPaperPolled = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaperPolled", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaperTypeA = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaperTypeA", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P7In = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P7In", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P7InB = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P7InB", WaveshareEPaperBWR
|
||||
)
|
||||
WaveshareEPaper2P7InBV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P7InBV2", WaveshareEPaperBWR
|
||||
)
|
||||
WaveshareEPaper2P7InV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P7InV2", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P9InB = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P9InB", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P9InBV3 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P9InBV3", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P9InV2R2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P9InV2R2", WaveshareEPaper
|
||||
)
|
||||
GDEW029T5 = waveshare_epaper_ns.class_("GDEW029T5", WaveshareEPaper)
|
||||
WaveshareEPaper2P9InDKE = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P9InDKE", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper4P2In = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper4P2In", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper4P2InBV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper4P2InBV2", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper5P8In = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper5P8In", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper5P8InV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper5P8InV2", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper7P5In = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7P5In", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper7P5InBC = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7P5InBC", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper7P5InBV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7P5InBV2", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper7P5InBV3 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7P5InBV3", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper7P5InV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7P5InV2", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper7P5InV2alt = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7P5InV2alt", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper7P5InHDB = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7P5InHDB", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P13InDKE = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P13InDKE", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P13InV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P13InV2", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper2P13InV3 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper2P13InV3", WaveshareEPaper
|
||||
)
|
||||
WaveshareEPaper13P3InK = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper13P3InK", WaveshareEPaper
|
||||
)
|
||||
GDEW0154M09 = waveshare_epaper_ns.class_("GDEW0154M09", WaveshareEPaper)
|
||||
WaveshareEPaper7In5BV2 = waveshare_epaper_ns.class_(
|
||||
"WaveshareEPaper7In5BV2", WaveshareEPaperPolled
|
||||
)
|
||||
|
||||
WaveshareEPaperTypeAModel = waveshare_epaper_ns.enum("WaveshareEPaperTypeAModel")
|
||||
WaveshareEPaperTypeBModel = waveshare_epaper_ns.enum("WaveshareEPaperTypeBModel")
|
||||
|
||||
MODELS = {
|
||||
"1.54in": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_1_54_IN),
|
||||
"1.54inv2": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_1_54_IN_V2),
|
||||
"2.13in": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_13_IN),
|
||||
"2.13inv2": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_13_IN_V2),
|
||||
"2.13in-ttgo": ("a", WaveshareEPaperTypeAModel.TTGO_EPAPER_2_13_IN),
|
||||
"2.13in-ttgo-b1": ("a", WaveshareEPaperTypeAModel.TTGO_EPAPER_2_13_IN_B1),
|
||||
"2.13in-ttgo-b73": ("a", WaveshareEPaperTypeAModel.TTGO_EPAPER_2_13_IN_B73),
|
||||
"2.13in-ttgo-b74": ("a", WaveshareEPaperTypeAModel.TTGO_EPAPER_2_13_IN_B74),
|
||||
"2.90in": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_9_IN),
|
||||
"2.90inv2": ("a", WaveshareEPaperTypeAModel.WAVESHARE_EPAPER_2_9_IN_V2),
|
||||
"gdew029t5": ("c", GDEW029T5),
|
||||
"2.70in": ("b", WaveshareEPaper2P7In),
|
||||
"2.70in-b": ("b", WaveshareEPaper2P7InB),
|
||||
"2.70in-bv2": ("b", WaveshareEPaper2P7InBV2),
|
||||
"2.70inv2": ("b", WaveshareEPaper2P7InV2),
|
||||
"2.90in-b": ("b", WaveshareEPaper2P9InB),
|
||||
"2.90in-bv3": ("b", WaveshareEPaper2P9InBV3),
|
||||
"2.90inv2-r2": ("c", WaveshareEPaper2P9InV2R2),
|
||||
"2.90in-dke": ("c", WaveshareEPaper2P9InDKE),
|
||||
"4.20in": ("b", WaveshareEPaper4P2In),
|
||||
"4.20in-bv2": ("b", WaveshareEPaper4P2InBV2),
|
||||
"5.83in": ("b", WaveshareEPaper5P8In),
|
||||
"5.83inv2": ("b", WaveshareEPaper5P8InV2),
|
||||
"7.50in": ("b", WaveshareEPaper7P5In),
|
||||
"7.50in-bv2": ("b", WaveshareEPaper7P5InBV2),
|
||||
"7.50in-bv2-rb": ("b", WaveshareEPaper7In5BV2),
|
||||
"7.50in-bv3": ("b", WaveshareEPaper7P5InBV3),
|
||||
"7.50in-bc": ("b", WaveshareEPaper7P5InBC),
|
||||
"7.50inv2": ("b", WaveshareEPaper7P5InV2),
|
||||
"7.50inv2alt": ("b", WaveshareEPaper7P5InV2alt),
|
||||
"7.50in-hd-b": ("b", WaveshareEPaper7P5InHDB),
|
||||
"2.13in-ttgo-dke": ("c", WaveshareEPaper2P13InDKE),
|
||||
"2.13inv3": ("c", WaveshareEPaper2P13InV3),
|
||||
"1.54in-m5coreink-m09": ("c", GDEW0154M09),
|
||||
"13.3in-k": ("b", WaveshareEPaper13P3InK),
|
||||
}
|
||||
|
||||
RESET_PIN_REQUIRED_MODELS = ("2.13inv2", "2.13in-ttgo-b74")
|
||||
|
||||
|
||||
def validate_full_update_every_only_types_ac(value):
|
||||
if CONF_FULL_UPDATE_EVERY not in value:
|
||||
return value
|
||||
if MODELS[value[CONF_MODEL]][0] == "b":
|
||||
full_models = []
|
||||
for key, val in sorted(MODELS.items()):
|
||||
if val[0] != "b":
|
||||
full_models.append(key)
|
||||
raise cv.Invalid(
|
||||
"The 'full_update_every' option is only available for models "
|
||||
+ ", ".join(full_models)
|
||||
)
|
||||
return value
|
||||
|
||||
|
||||
def validate_reset_pin_required(config):
|
||||
if config[CONF_MODEL] in RESET_PIN_REQUIRED_MODELS and CONF_RESET_PIN not in config:
|
||||
raise cv.Invalid(
|
||||
f"'{CONF_RESET_PIN}' is required for model {config[CONF_MODEL]}"
|
||||
)
|
||||
return config
|
||||
|
||||
|
||||
CONFIG_SCHEMA = cv.All(
|
||||
display.FULL_DISPLAY_SCHEMA.extend(
|
||||
{
|
||||
cv.GenerateID(): cv.declare_id(WaveshareEPaperBase),
|
||||
cv.Required(CONF_DC_PIN): pins.gpio_output_pin_schema,
|
||||
cv.Required(CONF_MODEL): cv.one_of(*MODELS, lower=True),
|
||||
cv.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
|
||||
cv.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema,
|
||||
cv.Optional(CONF_FULL_UPDATE_EVERY): cv.int_range(min=1, max=4294967295),
|
||||
cv.Optional(CONF_RESET_DURATION): cv.All(
|
||||
cv.positive_time_period_milliseconds,
|
||||
cv.Range(max=core.TimePeriod(milliseconds=500)),
|
||||
),
|
||||
}
|
||||
)
|
||||
.extend(cv.polling_component_schema("1s"))
|
||||
.extend(spi.spi_device_schema()),
|
||||
validate_full_update_every_only_types_ac,
|
||||
validate_reset_pin_required,
|
||||
cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
|
||||
)
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
model_type, model = MODELS[config[CONF_MODEL]]
|
||||
if model_type == "a":
|
||||
rhs = WaveshareEPaperTypeA.new(model)
|
||||
var = cg.Pvariable(config[CONF_ID], rhs, WaveshareEPaperTypeA)
|
||||
elif model_type in ("b", "c"):
|
||||
rhs = model.new()
|
||||
var = cg.Pvariable(config[CONF_ID], rhs, model)
|
||||
else:
|
||||
raise NotImplementedError()
|
||||
|
||||
await display.register_display(var, config)
|
||||
await spi.register_spi_device(var, config)
|
||||
|
||||
dc = await cg.gpio_pin_expression(config[CONF_DC_PIN])
|
||||
cg.add(var.set_dc_pin(dc))
|
||||
|
||||
if CONF_LAMBDA in config:
|
||||
lambda_ = await cg.process_lambda(
|
||||
config[CONF_LAMBDA], [(display.DisplayRef, "it")], return_type=cg.void
|
||||
)
|
||||
cg.add(var.set_writer(lambda_))
|
||||
if CONF_RESET_PIN in config:
|
||||
reset = await cg.gpio_pin_expression(config[CONF_RESET_PIN])
|
||||
cg.add(var.set_reset_pin(reset))
|
||||
if CONF_BUSY_PIN in config:
|
||||
reset = await cg.gpio_pin_expression(config[CONF_BUSY_PIN])
|
||||
cg.add(var.set_busy_pin(reset))
|
||||
if CONF_FULL_UPDATE_EVERY in config:
|
||||
cg.add(var.set_full_update_every(config[CONF_FULL_UPDATE_EVERY]))
|
||||
if CONF_RESET_DURATION in config:
|
||||
cg.add(var.set_reset_duration(config[CONF_RESET_DURATION]))
|
||||
186
esphome/components_local/waveshare_epaper/waveshare_213v3.cpp
Normal file
186
esphome/components_local/waveshare_epaper/waveshare_213v3.cpp
Normal file
@@ -0,0 +1,186 @@
|
||||
#include "waveshare_epaper.h"
|
||||
#include "esphome/core/log.h"
|
||||
#include "esphome/core/application.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace waveshare_epaper {
|
||||
|
||||
static const char *const TAG = "waveshare_2.13v3";
|
||||
|
||||
static const uint8_t PARTIAL_LUT[] = {
|
||||
0x32, // cmd
|
||||
0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x40, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0xF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0,
|
||||
};
|
||||
|
||||
static const uint8_t FULL_LUT[] = {
|
||||
0x32, // CMD
|
||||
0x80, 0x4A, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x4A, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x80, 0x4A, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x4A, 0x80, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0xF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xF, 0x0, 0x0, 0xF, 0x0, 0x0, 0x2, 0xF, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0,
|
||||
};
|
||||
|
||||
static const uint8_t SW_RESET = 0x12;
|
||||
static const uint8_t ACTIVATE = 0x20;
|
||||
static const uint8_t WRITE_BUFFER = 0x24;
|
||||
static const uint8_t WRITE_BASE = 0x26;
|
||||
|
||||
static const uint8_t DRV_OUT_CTL[] = {0x01, 0x27, 0x01, 0x00}; // driver output control
|
||||
static const uint8_t GATEV[] = {0x03, 0x17};
|
||||
static const uint8_t SRCV[] = {0x04, 0x41, 0x0C, 0x32};
|
||||
static const uint8_t SLEEP[] = {0x10, 0x01};
|
||||
static const uint8_t DATA_ENTRY[] = {0x11, 0x03}; // data entry mode
|
||||
static const uint8_t TEMP_SENS[] = {0x18, 0x80}; // Temp sensor
|
||||
static const uint8_t DISPLAY_UPDATE[] = {0x21, 0x00, 0x80}; // Display update control
|
||||
static const uint8_t UPSEQ[] = {0x22, 0xC0};
|
||||
static const uint8_t ON_FULL[] = {0x22, 0xC7};
|
||||
static const uint8_t ON_PARTIAL[] = {0x22, 0x0F};
|
||||
static const uint8_t VCOM[] = {0x2C, 0x36};
|
||||
static const uint8_t CMD5[] = {0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00};
|
||||
static const uint8_t BORDER_PART[] = {0x3C, 0x80}; // border waveform
|
||||
static const uint8_t BORDER_FULL[] = {0x3C, 0x05}; // border waveform
|
||||
static const uint8_t CMD1[] = {0x3F, 0x22};
|
||||
static const uint8_t RAM_X_START[] = {0x44, 0x00, 121 / 8}; // set ram_x_address_start_end
|
||||
static const uint8_t RAM_Y_START[] = {0x45, 0x00, 0x00, 250 - 1, 0}; // set ram_y_address_start_end
|
||||
static const uint8_t RAM_X_POS[] = {0x4E, 0x00}; // set ram_x_address_counter
|
||||
// static const uint8_t RAM_Y_POS[] = {0x4F, 0x00, 0x00}; // set ram_y_address_counter
|
||||
#define SEND(x) this->cmd_data(x, sizeof(x))
|
||||
|
||||
void WaveshareEPaper2P13InV3::write_lut_(const uint8_t *lut) {
|
||||
this->wait_until_idle_();
|
||||
this->cmd_data(lut, sizeof(PARTIAL_LUT));
|
||||
SEND(CMD1);
|
||||
SEND(GATEV);
|
||||
SEND(SRCV);
|
||||
SEND(VCOM);
|
||||
}
|
||||
|
||||
// write the buffer starting on line top, up to line bottom.
|
||||
void WaveshareEPaper2P13InV3::write_buffer_(uint8_t cmd, int top, int bottom) {
|
||||
this->wait_until_idle_();
|
||||
this->set_window_(top, bottom);
|
||||
this->command(cmd);
|
||||
this->start_data_();
|
||||
auto width_bytes = this->get_width_internal() / 8;
|
||||
this->write_array(this->buffer_ + top * width_bytes, (bottom - top) * width_bytes);
|
||||
this->end_data_();
|
||||
}
|
||||
|
||||
void WaveshareEPaper2P13InV3::send_reset_() {
|
||||
if (this->reset_pin_ != nullptr) {
|
||||
this->reset_pin_->digital_write(false);
|
||||
delay(2);
|
||||
this->reset_pin_->digital_write(true);
|
||||
}
|
||||
}
|
||||
|
||||
void WaveshareEPaper2P13InV3::setup() {
|
||||
setup_pins_();
|
||||
delay(20);
|
||||
this->send_reset_();
|
||||
// as a one-off delay this is not worth working around.
|
||||
delay(100); // NOLINT
|
||||
this->wait_until_idle_();
|
||||
this->command(SW_RESET);
|
||||
this->wait_until_idle_();
|
||||
|
||||
SEND(DRV_OUT_CTL);
|
||||
SEND(DATA_ENTRY);
|
||||
SEND(CMD5);
|
||||
this->set_window_(0, this->get_height_internal());
|
||||
SEND(BORDER_FULL);
|
||||
SEND(DISPLAY_UPDATE);
|
||||
SEND(TEMP_SENS);
|
||||
this->wait_until_idle_();
|
||||
this->write_lut_(FULL_LUT);
|
||||
}
|
||||
|
||||
// t and b are y positions, i.e. line numbers.
|
||||
void WaveshareEPaper2P13InV3::set_window_(int t, int b) {
|
||||
uint8_t buffer[3];
|
||||
|
||||
SEND(RAM_X_START);
|
||||
SEND(RAM_Y_START);
|
||||
SEND(RAM_X_POS);
|
||||
buffer[0] = 0x4F;
|
||||
buffer[1] = (uint8_t) t;
|
||||
buffer[2] = (uint8_t) (t >> 8);
|
||||
SEND(buffer);
|
||||
}
|
||||
|
||||
// must implement, but we override setup to have more control
|
||||
void WaveshareEPaper2P13InV3::initialize() {}
|
||||
|
||||
void WaveshareEPaper2P13InV3::partial_update_() {
|
||||
this->send_reset_();
|
||||
this->set_timeout(100, [this] {
|
||||
this->write_lut_(PARTIAL_LUT);
|
||||
SEND(BORDER_PART);
|
||||
SEND(UPSEQ);
|
||||
this->command(ACTIVATE);
|
||||
this->set_timeout(100, [this] {
|
||||
this->wait_until_idle_();
|
||||
this->write_buffer_(WRITE_BUFFER, 0, this->get_height_internal());
|
||||
SEND(ON_PARTIAL);
|
||||
this->command(ACTIVATE); // Activate Display Update Sequence
|
||||
this->is_busy_ = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void WaveshareEPaper2P13InV3::full_update_() {
|
||||
ESP_LOGI(TAG, "Performing full e-paper update.");
|
||||
this->write_lut_(FULL_LUT);
|
||||
this->write_buffer_(WRITE_BUFFER, 0, this->get_height_internal());
|
||||
this->write_buffer_(WRITE_BASE, 0, this->get_height_internal());
|
||||
SEND(ON_FULL);
|
||||
this->command(ACTIVATE); // don't wait here
|
||||
this->is_busy_ = false;
|
||||
}
|
||||
|
||||
void WaveshareEPaper2P13InV3::display() {
|
||||
if (this->is_busy_ || (this->busy_pin_ != nullptr && this->busy_pin_->digital_read()))
|
||||
return;
|
||||
this->is_busy_ = true;
|
||||
const bool partial = this->at_update_ != 0;
|
||||
this->at_update_ = (this->at_update_ + 1) % this->full_update_every_;
|
||||
if (partial) {
|
||||
this->partial_update_();
|
||||
} else {
|
||||
this->full_update_();
|
||||
}
|
||||
}
|
||||
|
||||
int WaveshareEPaper2P13InV3::get_width_internal() { return 128; }
|
||||
|
||||
int WaveshareEPaper2P13InV3::get_height_internal() { return 250; }
|
||||
|
||||
uint32_t WaveshareEPaper2P13InV3::idle_timeout_() { return 5000; }
|
||||
|
||||
void WaveshareEPaper2P13InV3::dump_config() {
|
||||
LOG_DISPLAY("", "Waveshare E-Paper", this);
|
||||
ESP_LOGCONFIG(TAG, " Model: 2.13inV3");
|
||||
LOG_PIN(" CS Pin: ", this->cs_);
|
||||
LOG_PIN(" Reset Pin: ", this->reset_pin_);
|
||||
LOG_PIN(" DC Pin: ", this->dc_pin_);
|
||||
LOG_PIN(" Busy Pin: ", this->busy_pin_);
|
||||
LOG_UPDATE_INTERVAL(this);
|
||||
}
|
||||
|
||||
void WaveshareEPaper2P13InV3::set_full_update_every(uint32_t full_update_every) {
|
||||
this->full_update_every_ = full_update_every;
|
||||
}
|
||||
|
||||
} // namespace waveshare_epaper
|
||||
} // namespace esphome
|
||||
3194
esphome/components_local/waveshare_epaper/waveshare_epaper.cpp
Normal file
3194
esphome/components_local/waveshare_epaper/waveshare_epaper.cpp
Normal file
File diff suppressed because it is too large
Load Diff
864
esphome/components_local/waveshare_epaper/waveshare_epaper.h
Normal file
864
esphome/components_local/waveshare_epaper/waveshare_epaper.h
Normal file
@@ -0,0 +1,864 @@
|
||||
#pragma once
|
||||
|
||||
#include "esphome/core/component.h"
|
||||
#include "esphome/components/spi/spi.h"
|
||||
#include "esphome/components/display/display_buffer.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace waveshare_epaper {
|
||||
|
||||
class WaveshareEPaper : public display::DisplayBuffer,
|
||||
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
|
||||
spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_2MHZ> {
|
||||
public:
|
||||
void set_dc_pin(GPIOPin *dc_pin) { dc_pin_ = dc_pin; }
|
||||
float get_setup_priority() const override;
|
||||
void set_reset_pin(GPIOPin *reset) { this->reset_pin_ = reset; }
|
||||
void set_busy_pin(GPIOPin *busy) { this->busy_pin_ = busy; }
|
||||
void set_reset_duration(uint32_t reset_duration) { this->reset_duration_ = reset_duration; }
|
||||
|
||||
void command(uint8_t value);
|
||||
void data(uint8_t value);
|
||||
void cmd_data(const uint8_t *data, size_t length);
|
||||
|
||||
virtual void display() = 0;
|
||||
virtual void initialize() = 0;
|
||||
virtual void deep_sleep() = 0;
|
||||
|
||||
void update() override;
|
||||
|
||||
void setup() override {
|
||||
this->setup_pins_();
|
||||
this->initialize();
|
||||
}
|
||||
|
||||
void on_safe_shutdown() override;
|
||||
|
||||
display::DisplayType get_display_type() override;
|
||||
|
||||
void fill(Color color) override;
|
||||
|
||||
protected:
|
||||
bool wait_until_idle_();
|
||||
|
||||
void setup_pins_();
|
||||
|
||||
void reset_() {
|
||||
if (this->reset_pin_ != nullptr) {
|
||||
this->reset_pin_->digital_write(false);
|
||||
delay(reset_duration_); // NOLINT
|
||||
this->reset_pin_->digital_write(true);
|
||||
delay(20);
|
||||
}
|
||||
}
|
||||
|
||||
virtual int get_width_controller() { return this->get_width_internal(); };
|
||||
|
||||
uint32_t get_buffer_length_();
|
||||
uint32_t reset_duration_{200};
|
||||
|
||||
// Return the list of colors supported by the device
|
||||
virtual std::vector<Color> get_supported_colors() { return {display::COLOR_ON}; }
|
||||
|
||||
void draw_absolute_pixel_internal(int x, int y, Color color) override;
|
||||
|
||||
void start_command_();
|
||||
void end_command_();
|
||||
void start_data_();
|
||||
void end_data_();
|
||||
|
||||
GPIOPin *reset_pin_{nullptr};
|
||||
GPIOPin *dc_pin_;
|
||||
GPIOPin *busy_pin_{nullptr};
|
||||
virtual uint32_t idle_timeout_() { return 1000u; } // NOLINT(readability-identifier-naming)
|
||||
};
|
||||
|
||||
class WaveshareEPaperBWR : public WaveshareEPaper {
|
||||
public:
|
||||
std::vector<Color> get_supported_colors() override { return {display::COLOR_ON, Color(255, 0, 0, 0)}; }
|
||||
};
|
||||
|
||||
enum WaveshareEPaperTypeAModel {
|
||||
WAVESHARE_EPAPER_1_54_IN = 0,
|
||||
WAVESHARE_EPAPER_1_54_IN_V2,
|
||||
WAVESHARE_EPAPER_2_13_IN,
|
||||
WAVESHARE_EPAPER_2_13_IN_V2,
|
||||
WAVESHARE_EPAPER_2_9_IN,
|
||||
WAVESHARE_EPAPER_2_9_IN_V2,
|
||||
TTGO_EPAPER_2_13_IN,
|
||||
TTGO_EPAPER_2_13_IN_B73,
|
||||
TTGO_EPAPER_2_13_IN_B1,
|
||||
TTGO_EPAPER_2_13_IN_B74,
|
||||
};
|
||||
|
||||
class WaveshareEPaperTypeA : public WaveshareEPaper {
|
||||
public:
|
||||
WaveshareEPaperTypeA(WaveshareEPaperTypeAModel model);
|
||||
|
||||
void initialize() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
switch (this->model_) {
|
||||
// Models with specific deep sleep command and data
|
||||
case WAVESHARE_EPAPER_1_54_IN:
|
||||
case WAVESHARE_EPAPER_1_54_IN_V2:
|
||||
case WAVESHARE_EPAPER_2_9_IN_V2:
|
||||
case WAVESHARE_EPAPER_2_13_IN_V2:
|
||||
// COMMAND DEEP SLEEP MODE
|
||||
this->command(0x10);
|
||||
this->data(0x01);
|
||||
break;
|
||||
// Other models default to simple deep sleep command
|
||||
default:
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x10);
|
||||
break;
|
||||
}
|
||||
if (this->model_ != WAVESHARE_EPAPER_2_13_IN_V2) {
|
||||
// From panel specification:
|
||||
// "After this command initiated, the chip will enter Deep Sleep Mode, BUSY pad will keep output high."
|
||||
this->wait_until_idle_();
|
||||
}
|
||||
}
|
||||
|
||||
void set_full_update_every(uint32_t full_update_every);
|
||||
|
||||
protected:
|
||||
void write_lut_(const uint8_t *lut, uint8_t size);
|
||||
|
||||
void init_display_();
|
||||
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
|
||||
int get_width_controller() override;
|
||||
|
||||
uint32_t full_update_every_{30};
|
||||
uint32_t at_update_{0};
|
||||
WaveshareEPaperTypeAModel model_;
|
||||
uint32_t idle_timeout_() override;
|
||||
|
||||
bool deep_sleep_between_updates_{false};
|
||||
};
|
||||
|
||||
enum WaveshareEPaperTypeBModel {
|
||||
WAVESHARE_EPAPER_2_7_IN = 0,
|
||||
WAVESHARE_EPAPER_2_7_IN_B,
|
||||
WAVESHARE_EPAPER_2_7_IN_B_V2,
|
||||
WAVESHARE_EPAPER_4_2_IN,
|
||||
WAVESHARE_EPAPER_4_2_IN_B_V2,
|
||||
WAVESHARE_EPAPER_7_5_IN,
|
||||
WAVESHARE_EPAPER_7_5_INV2,
|
||||
WAVESHARE_EPAPER_7_5_IN_B_V2,
|
||||
WAVESHARE_EPAPER_13_3_IN_K,
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P7In : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P7InB : public WaveshareEPaperBWR {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND VCOM_AND_DATA_INTERVAL_SETTING
|
||||
this->command(0x50);
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07); // deep sleep
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P7InBV2 : public WaveshareEPaperBWR {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x10);
|
||||
this->data(0x01);
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class GDEW029T5 : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P7InV2 : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override { ; }
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class GDEW0154M09 : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
void display() override;
|
||||
void dump_config() override;
|
||||
void deep_sleep() override;
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
int get_height_internal() override;
|
||||
|
||||
private:
|
||||
static const uint8_t CMD_DTM1_DATA_START_TRANS = 0x10;
|
||||
static const uint8_t CMD_DTM2_DATA_START_TRANS2 = 0x13;
|
||||
static const uint8_t CMD_DISPLAY_REFRESH = 0x12;
|
||||
static const uint8_t CMD_AUTO_SEQ = 0x17;
|
||||
static const uint8_t DATA_AUTO_PON_DSR_POF_DSLP = 0xA7;
|
||||
static const uint8_t CMD_PSR_PANEL_SETTING = 0x00;
|
||||
static const uint8_t CMD_UNDOCUMENTED_0x4D = 0x4D; // NOLINT
|
||||
static const uint8_t CMD_UNDOCUMENTED_0xAA = 0xaa; // NOLINT
|
||||
static const uint8_t CMD_UNDOCUMENTED_0xE9 = 0xe9; // NOLINT
|
||||
static const uint8_t CMD_UNDOCUMENTED_0xB6 = 0xb6; // NOLINT
|
||||
static const uint8_t CMD_UNDOCUMENTED_0xF3 = 0xf3; // NOLINT
|
||||
static const uint8_t CMD_TRES_RESOLUTION_SETTING = 0x61;
|
||||
static const uint8_t CMD_TCON_TCONSETTING = 0x60;
|
||||
static const uint8_t CMD_CDI_VCOM_DATA_INTERVAL = 0x50;
|
||||
static const uint8_t CMD_POF_POWER_OFF = 0x02;
|
||||
static const uint8_t CMD_DSLP_DEEP_SLEEP = 0x07;
|
||||
static const uint8_t DATA_DSLP_DEEP_SLEEP = 0xA5;
|
||||
static const uint8_t CMD_PWS_POWER_SAVING = 0xe3;
|
||||
static const uint8_t CMD_PON_POWER_ON = 0x04;
|
||||
static const uint8_t CMD_PTL_PARTIAL_WINDOW = 0x90;
|
||||
|
||||
uint8_t *lastbuff_ = nullptr;
|
||||
void reset_();
|
||||
void clear_();
|
||||
void write_init_list_(const uint8_t *list);
|
||||
void init_internal_();
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P9InB : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P9InBV3 : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P9InV2R2 : public WaveshareEPaper {
|
||||
public:
|
||||
WaveshareEPaper2P9InV2R2();
|
||||
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override;
|
||||
|
||||
void set_full_update_every(uint32_t full_update_every);
|
||||
|
||||
protected:
|
||||
void write_lut_(const uint8_t *lut, uint8_t size);
|
||||
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
|
||||
int get_width_controller() override;
|
||||
|
||||
uint32_t full_update_every_{30};
|
||||
uint32_t at_update_{0};
|
||||
|
||||
private:
|
||||
void reset_();
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P9InDKE : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x10);
|
||||
this->data(0x01);
|
||||
}
|
||||
|
||||
void set_full_update_every(uint32_t full_update_every);
|
||||
|
||||
protected:
|
||||
uint32_t full_update_every_{30};
|
||||
uint32_t at_update_{0};
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper4P2In : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND VCOM AND DATA INTERVAL SETTING
|
||||
this->command(0x50);
|
||||
this->data(0x17); // border floating
|
||||
|
||||
// COMMAND VCM DC SETTING
|
||||
this->command(0x82);
|
||||
// COMMAND PANEL SETTING
|
||||
this->command(0x00);
|
||||
|
||||
delay(100); // NOLINT
|
||||
|
||||
// COMMAND POWER SETTING
|
||||
this->command(0x01);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
delay(100); // NOLINT
|
||||
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper4P2InBV2 : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND VCOM AND DATA INTERVAL SETTING
|
||||
this->command(0x50);
|
||||
this->data(0xF7); // border floating
|
||||
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check code
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper5P8In : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper5P8InV2 : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND VCOM AND DATA INTERVAL SETTING
|
||||
this->command(0x50);
|
||||
this->data(0x17); // border floating
|
||||
|
||||
// COMMAND VCM DC SETTING
|
||||
this->command(0x82);
|
||||
// COMMAND PANEL SETTING
|
||||
this->command(0x00);
|
||||
|
||||
delay(100); // NOLINT
|
||||
|
||||
// COMMAND POWER SETTING
|
||||
this->command(0x01);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
this->data(0x00);
|
||||
delay(100); // NOLINT
|
||||
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper7P5In : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper7P5InBV2 : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07); // deep sleep
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper7P5InBV3 : public WaveshareEPaper {
|
||||
public:
|
||||
bool wait_until_idle_();
|
||||
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
this->command(0x02); // Power off
|
||||
this->wait_until_idle_();
|
||||
this->command(0x07); // Deep sleep
|
||||
this->data(0xA5);
|
||||
}
|
||||
|
||||
void clear_screen();
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
|
||||
void reset_() {
|
||||
if (this->reset_pin_ != nullptr) {
|
||||
this->reset_pin_->digital_write(true);
|
||||
delay(200); // NOLINT
|
||||
this->reset_pin_->digital_write(false);
|
||||
delay(5);
|
||||
this->reset_pin_->digital_write(true);
|
||||
delay(200); // NOLINT
|
||||
}
|
||||
};
|
||||
|
||||
void init_display_();
|
||||
};
|
||||
|
||||
class WaveshareEPaper7P5InBC : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper7P5InV2 : public WaveshareEPaper {
|
||||
public:
|
||||
bool wait_until_idle_();
|
||||
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND POWER OFF
|
||||
this->command(0x02);
|
||||
this->wait_until_idle_();
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x07);
|
||||
this->data(0xA5); // check byte
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
|
||||
uint32_t idle_timeout_() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper7P5InV2alt : public WaveshareEPaper7P5InV2 {
|
||||
public:
|
||||
bool wait_until_idle_();
|
||||
void initialize() override;
|
||||
void dump_config() override;
|
||||
|
||||
protected:
|
||||
void reset_() {
|
||||
if (this->reset_pin_ != nullptr) {
|
||||
this->reset_pin_->digital_write(true);
|
||||
delay(200); // NOLINT
|
||||
this->reset_pin_->digital_write(false);
|
||||
delay(2);
|
||||
this->reset_pin_->digital_write(true);
|
||||
delay(20);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class WaveshareEPaper7P5InHDB : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// deep sleep
|
||||
this->command(0x10);
|
||||
this->data(0x01);
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P13InDKE : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND POWER DOWN
|
||||
this->command(0x10);
|
||||
this->data(0x01);
|
||||
// cannot wait until idle here, the device no longer responds
|
||||
}
|
||||
|
||||
void set_full_update_every(uint32_t full_update_every);
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
|
||||
uint32_t idle_timeout_() override;
|
||||
|
||||
uint32_t full_update_every_{30};
|
||||
uint32_t at_update_{0};
|
||||
};
|
||||
|
||||
class WaveshareEPaper2P13InV3 : public WaveshareEPaper {
|
||||
public:
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND POWER DOWN
|
||||
this->command(0x10);
|
||||
this->data(0x01);
|
||||
// cannot wait until idle here, the device no longer responds
|
||||
}
|
||||
|
||||
void set_full_update_every(uint32_t full_update_every);
|
||||
|
||||
void setup() override;
|
||||
void initialize() override;
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
int get_height_internal() override;
|
||||
uint32_t idle_timeout_() override;
|
||||
|
||||
void write_buffer_(uint8_t cmd, int top, int bottom);
|
||||
void set_window_(int t, int b);
|
||||
void send_reset_();
|
||||
void partial_update_();
|
||||
void full_update_();
|
||||
|
||||
uint32_t full_update_every_{30};
|
||||
uint32_t at_update_{0};
|
||||
bool is_busy_{false};
|
||||
void write_lut_(const uint8_t *lut);
|
||||
};
|
||||
|
||||
class WaveshareEPaper13P3InK : public WaveshareEPaper {
|
||||
public:
|
||||
void initialize() override;
|
||||
|
||||
void display() override;
|
||||
|
||||
void dump_config() override;
|
||||
|
||||
void deep_sleep() override {
|
||||
// COMMAND DEEP SLEEP
|
||||
this->command(0x10);
|
||||
this->data(0x01);
|
||||
}
|
||||
|
||||
protected:
|
||||
int get_width_internal() override;
|
||||
|
||||
int get_height_internal() override;
|
||||
|
||||
uint32_t idle_timeout_() override;
|
||||
};
|
||||
|
||||
// Generic Waveshare e-paper component that
|
||||
// avoids using any blocking wait to be able to support
|
||||
// big screens that are slow to update
|
||||
class WaveshareEPaperPolled : public WaveshareEPaper {
|
||||
// Will request a display refresh
|
||||
void update() override;
|
||||
|
||||
// Will move the state machine one state at a time
|
||||
// to refresh the display when requested by display()
|
||||
void loop() override;
|
||||
|
||||
// Unused method from parent
|
||||
void initialize() override {}
|
||||
|
||||
protected:
|
||||
// Below are display steps, called one after the other by loop()
|
||||
// Just implement these to support a new device.
|
||||
// Never sleep or wait in a step, the state machine will
|
||||
// handle it.
|
||||
|
||||
// Just after reset, set the power mode and power the driver on
|
||||
virtual void power_on() = 0;
|
||||
|
||||
// Send all the configuration required to display
|
||||
virtual void configure() = 0;
|
||||
|
||||
// Send image data and refresh the display
|
||||
void display() override = 0;
|
||||
|
||||
// Power off the driver
|
||||
virtual void power_off() = 0;
|
||||
|
||||
// Set the screen to deep sleep
|
||||
void deep_sleep() override = 0;
|
||||
|
||||
private:
|
||||
enum class State : uint8_t {
|
||||
SLEEPING,
|
||||
UPDATE_REQUESTED,
|
||||
RESETTING,
|
||||
INITIALIZING,
|
||||
POWERING_ON,
|
||||
CONFIGURING,
|
||||
DISPLAYING,
|
||||
POWERING_OFF,
|
||||
};
|
||||
|
||||
// Set the current state of the display
|
||||
void set_state_(State state);
|
||||
|
||||
// Current state of the display
|
||||
State state_{State::SLEEPING};
|
||||
// Timestamp of last state changed, used to wait between states
|
||||
uint32_t last_state_change_{0};
|
||||
};
|
||||
|
||||
// 7.5 inches screen supporting black and red color with
|
||||
// a v3 label on the back. Called EDP_7in5b_V2 in WaveShare examples.
|
||||
class WaveshareEPaper7In5BV2 : public WaveshareEPaperPolled {
|
||||
public:
|
||||
void dump_config() override;
|
||||
|
||||
void power_on() override;
|
||||
void configure() override;
|
||||
void display() override;
|
||||
void power_off() override;
|
||||
void deep_sleep() override;
|
||||
|
||||
std::vector<Color> get_supported_colors() override { return {display::COLOR_ON, Color(255, 0, 0, 0)}; }
|
||||
|
||||
protected:
|
||||
int get_width_internal() override { return 800; }
|
||||
int get_height_internal() override { return 480; }
|
||||
};
|
||||
|
||||
} // namespace waveshare_epaper
|
||||
} // namespace esphome
|
||||
375
esphome/display_hal.yaml
Normal file
375
esphome/display_hal.yaml
Normal file
@@ -0,0 +1,375 @@
|
||||
substitutions:
|
||||
device_name: "esp32-75epaper-hal"
|
||||
friendly_name: "Epaper display hal"
|
||||
comment: "7.5inch epaper display hal"
|
||||
location: "hal"
|
||||
api_password: !secret eink_display_api
|
||||
ota_password: !secret ota_password
|
||||
wifi_ssid: !secret wifi_ssid
|
||||
wifi_password: !secret wifi_password
|
||||
|
||||
|
||||
# Pins for Waveshare ePaper ESP32-S3
|
||||
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-S3.yaml
|
||||
device_base: !include common/common.yaml
|
||||
connection: !include common/wifi_nosens.yaml
|
||||
logger: !include templates/logger.yaml
|
||||
|
||||
esphome:
|
||||
includes:
|
||||
- include/epaper75.h
|
||||
- include/text_utils.h
|
||||
|
||||
external_components:
|
||||
# Use local patched waveshare component with red/black support
|
||||
- source:
|
||||
type: local
|
||||
path: components_local
|
||||
components: [ waveshare_epaper ]
|
||||
|
||||
sun:
|
||||
latitude: !secret home_latitude
|
||||
longitude: !secret home_longitude
|
||||
|
||||
globals:
|
||||
- id: data_updated
|
||||
type: bool
|
||||
restore_value: no
|
||||
initial_value: 'false'
|
||||
- id: initial_data_received
|
||||
type: bool
|
||||
restore_value: no
|
||||
initial_value: 'false'
|
||||
- id: recorded_display_refresh
|
||||
type: int
|
||||
restore_value: yes
|
||||
initial_value: '0'
|
||||
|
||||
time:
|
||||
- platform: homeassistant
|
||||
id: esptime
|
||||
on_time_sync:
|
||||
- then:
|
||||
- logger.log: "Time synced with Home Assistant"
|
||||
on_time:
|
||||
- minutes: 5
|
||||
then:
|
||||
- if:
|
||||
condition:
|
||||
lambda: 'return id(data_updated) == true;'
|
||||
then:
|
||||
- lambda: 'id(initial_data_received) = true;'
|
||||
- logger.log: "Sensor data updated: Refreshing display..."
|
||||
- component.update: eink_display
|
||||
- lambda: 'id(data_updated) = false;'
|
||||
- lambda: 'id(recorded_display_refresh) += 1;'
|
||||
- lambda: 'id(display_last_update).publish_state(id(esptime).now().timestamp);'
|
||||
else:
|
||||
- logger.log: "No sensors updated - skipping display refresh."
|
||||
|
||||
button:
|
||||
- platform: template
|
||||
name: "Hallway Display Refresh"
|
||||
id: refresh
|
||||
icon: "mdi:refresh"
|
||||
on_press:
|
||||
- logger.log: "Hallway display manual refresh"
|
||||
- component.update: eink_display
|
||||
|
||||
# Fonts for display
|
||||
font:
|
||||
- file: 'fonts/GothamRnd-Bold.ttf'
|
||||
id: font_date
|
||||
size: 42
|
||||
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-Bold.ttf'
|
||||
id: font_temperature
|
||||
size: 48
|
||||
glyphs: *default-glyphs
|
||||
|
||||
- file: 'fonts/GothamRnd-Book.ttf'
|
||||
id: font_weather_condition
|
||||
size: 20
|
||||
glyphs: *default-glyphs
|
||||
|
||||
- file: 'fonts/GothamRnd-Bold.ttf'
|
||||
id: font_section_title
|
||||
size: 20
|
||||
glyphs: *default-glyphs
|
||||
|
||||
- file: 'fonts/GothamRnd-Bold.ttf'
|
||||
id: font_section_header
|
||||
size: 28
|
||||
glyphs: *default-glyphs
|
||||
|
||||
- file: 'fonts/GothamRnd-Book.ttf'
|
||||
id: font_status_text
|
||||
size: 16
|
||||
glyphs: *default-glyphs
|
||||
|
||||
- file: 'fonts/GothamRnd-Book.ttf'
|
||||
id: font_small
|
||||
size: 12
|
||||
glyphs: *default-glyphs
|
||||
|
||||
# Material Design Icons
|
||||
- file: 'fonts/materialdesignicons-webfont.ttf'
|
||||
id: font_mdi_large
|
||||
size: 64
|
||||
glyphs:
|
||||
- "\U000F0590" # mdi-weather-cloudy
|
||||
- "\U000F0595" # mdi-weather-partly-cloudy
|
||||
- "\U000F0599" # mdi-weather-sunny
|
||||
- "\U000F0594" # mdi-weather-night
|
||||
- "\U000F0597" # mdi-weather-rainy
|
||||
- "\U000f010b" # mdi-car
|
||||
- "\U000F0575" # mdi-lock
|
||||
- "\U000F0576" # mdi-lock-open
|
||||
- "\U000F0E84" # mdi-home
|
||||
- "\U000F0048" # mdi-lightning-bolt
|
||||
|
||||
sensor:
|
||||
- platform: template
|
||||
name: "${device_name} Last Update"
|
||||
device_class: timestamp
|
||||
id: display_last_update
|
||||
|
||||
- platform: wifi_signal
|
||||
id: sensor_wifi_signal
|
||||
name: "${device_name} WiFi Signal"
|
||||
update_interval: 60s
|
||||
on_value:
|
||||
- component.update: sensor_wifi_signal_percentage
|
||||
|
||||
- platform: template
|
||||
id: sensor_wifi_signal_percentage
|
||||
name: "${device_name} WiFi Signal Percentage"
|
||||
icon: "mdi:wifi"
|
||||
unit_of_measurement: "%"
|
||||
update_interval: never
|
||||
lambda: |-
|
||||
if (id(sensor_wifi_signal).state) {
|
||||
if (id(sensor_wifi_signal).state <= -100 ) {
|
||||
return 0;
|
||||
} else if (id(sensor_wifi_signal).state >= -50) {
|
||||
return 100;
|
||||
} else {
|
||||
return 2 * (id(sensor_wifi_signal).state + 100);
|
||||
}
|
||||
} else {
|
||||
return NAN;
|
||||
}
|
||||
|
||||
- platform: template
|
||||
name: "${device_name} Display Refresh Count"
|
||||
lambda: 'return id(recorded_display_refresh);'
|
||||
unit_of_measurement: "refreshes"
|
||||
|
||||
# Placeholder sensor - will be overwritten by HA include
|
||||
- platform: template
|
||||
name: "Weather Temperature"
|
||||
id: weather_temp
|
||||
unit_of_measurement: "°C"
|
||||
lambda: 'return 22.0;' # Mock data
|
||||
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: weather_temperature_now, entity_id: sensor.hallway_display_data }}
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: car_charge_level, entity_id: sensor.hallway_display_data }}
|
||||
|
||||
text_sensor:
|
||||
# Pull data from Home Assistant hallway template sensor using reusable include
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: datum, entity_id: sensor.hallway_display_data }}
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: weather_condition_now, entity_id: sensor.hallway_display_data }}
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: door_status, entity_id: sensor.hallway_display_data }}
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: presence_status, entity_id: sensor.hallway_display_data }}
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: car_status, entity_id: sensor.hallway_display_data }}
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: car_range, entity_id: sensor.hallway_display_data }}
|
||||
- !include { file: sensors/homeassistant.yaml, vars: { id: last_change, entity_id: sensor.hallway_display_data }}
|
||||
|
||||
# Primary data source - pulls from Home Assistant hallway template sensor
|
||||
- platform: homeassistant
|
||||
id: display_data_source
|
||||
entity_id: sensor.hallway_display_data
|
||||
|
||||
binary_sensor:
|
||||
- platform: template
|
||||
name: "Door Locked"
|
||||
id: door_locked
|
||||
lambda: 'return true;' # Mock data
|
||||
|
||||
- platform: template
|
||||
name: "People Home"
|
||||
id: people_home
|
||||
lambda: 'return true;' # Mock data
|
||||
|
||||
- platform: template
|
||||
name: "Car Charging"
|
||||
id: car_charging
|
||||
lambda: 'return false;' # Mock data
|
||||
|
||||
# Define colors for e-paper BV2 (3-color: white background, black and red ink)
|
||||
color:
|
||||
- id: color_black
|
||||
red: 0%
|
||||
green: 0%
|
||||
blue: 0%
|
||||
white: 50%
|
||||
- id: color_white
|
||||
red: 0%
|
||||
green: 0%
|
||||
blue: 0%
|
||||
white: 0%
|
||||
- id: color_red
|
||||
red: 100%
|
||||
green: 0%
|
||||
blue: 0%
|
||||
white: 0%
|
||||
|
||||
# SPI configuration
|
||||
spi:
|
||||
clk_pin: ${pin_spi_clk}
|
||||
mosi_pin: ${pin_spi_mosi}
|
||||
|
||||
# Display configuration
|
||||
display:
|
||||
- platform: waveshare_epaper
|
||||
cs_pin: ${pin_ep_cs}
|
||||
dc_pin: ${pin_ep_dc}
|
||||
busy_pin:
|
||||
number: ${pin_ep_busy}
|
||||
inverted: true
|
||||
reset_pin: ${pin_ep_reset}
|
||||
reset_duration: 2ms
|
||||
model: 7.50in-bv2-rb
|
||||
update_interval: 30min
|
||||
id: eink_display
|
||||
rotation: 90°
|
||||
lambda: |-
|
||||
// Display: Waveshare 7.5" native 800x480, with rotation: 90° gives 480x800 (portrait)
|
||||
int w = it.get_width(); // 480 in portrait
|
||||
int h = it.get_height(); // 800 in portrait
|
||||
|
||||
// Fill background white
|
||||
it.fill(COLOR_OFF);
|
||||
|
||||
// ===== LAYOUT VARIABLES =====
|
||||
int margin = 8;
|
||||
int inner_margin = 12;
|
||||
int section_gap = 6;
|
||||
int section_width = w - 2 * margin;
|
||||
|
||||
// Sections sized to fit 800px height
|
||||
int header_y = margin;
|
||||
int header_height = 140;
|
||||
|
||||
int door_y = header_y + header_height + section_gap;
|
||||
int door_height = 110;
|
||||
|
||||
int car_y = door_y + door_height + section_gap;
|
||||
int car_height = 110;
|
||||
|
||||
int presence_y = car_y + car_height + section_gap;
|
||||
int presence_height = 110;
|
||||
|
||||
int energy_y = presence_y + presence_height + section_gap;
|
||||
int footer_height = 45;
|
||||
int footer_y = h - footer_height;
|
||||
int energy_height = footer_y - energy_y - section_gap;
|
||||
|
||||
// ===== HEADER: Date & Weather =====
|
||||
// Date - with fallback
|
||||
if (id(datum).has_state()) {
|
||||
it.printf(w / 2, header_y, id(font_date), TextAlign::TOP_CENTER, "%s", id(datum).state.c_str());
|
||||
} else {
|
||||
it.printf(w / 2, header_y, id(font_date), TextAlign::TOP_CENTER, "Loading...");
|
||||
}
|
||||
|
||||
int weather_y = header_y + 55;
|
||||
int icon_x = margin + 35;
|
||||
it.circle(icon_x, weather_y, 25);
|
||||
|
||||
int temp_col_x = icon_x + 45;
|
||||
if (id(weather_temperature_now).has_state()) {
|
||||
it.printf(temp_col_x, weather_y - 15, id(font_temperature), TextAlign::TOP_LEFT, "%2.0f°C", id(weather_temperature_now).state);
|
||||
} else {
|
||||
it.printf(temp_col_x, weather_y - 15, id(font_temperature), TextAlign::TOP_LEFT, "--°C");
|
||||
}
|
||||
|
||||
if (id(weather_condition_now).has_state()) {
|
||||
it.printf(temp_col_x, weather_y + 25, id(font_weather_condition), TextAlign::TOP_LEFT, "%s", id(weather_condition_now).state.c_str());
|
||||
} else {
|
||||
it.printf(temp_col_x, weather_y + 25, id(font_weather_condition), TextAlign::TOP_LEFT, "---");
|
||||
}
|
||||
|
||||
// Divider line
|
||||
int divider_y = header_y + header_height - 10;
|
||||
it.line(margin, divider_y, w - margin, divider_y);
|
||||
|
||||
// ===== SECTION 1: Door Lock Status =====
|
||||
it.rectangle(margin, door_y, section_width, door_height);
|
||||
it.printf(margin + inner_margin, door_y + 8, id(font_section_header), TextAlign::TOP_LEFT, "[Door]");
|
||||
if (id(door_status).has_state()) {
|
||||
it.printf(margin + inner_margin, door_y + 38, id(font_status_text), TextAlign::TOP_LEFT, "%s", id(door_status).state.c_str());
|
||||
} else {
|
||||
it.printf(margin + inner_margin, door_y + 38, id(font_status_text), TextAlign::TOP_LEFT, "Loading...");
|
||||
}
|
||||
|
||||
// ===== SECTION 2: Presence Status =====
|
||||
it.rectangle(margin, presence_y, section_width, presence_height);
|
||||
it.printf(margin + inner_margin, presence_y + 8, id(font_section_header), TextAlign::TOP_LEFT, "[Presence]");
|
||||
if (id(presence_status).has_state()) {
|
||||
it.printf(margin + inner_margin, presence_y + 38, id(font_status_text), TextAlign::TOP_LEFT, "%s", id(presence_status).state.c_str());
|
||||
} else {
|
||||
it.printf(margin + inner_margin, presence_y + 38, id(font_status_text), TextAlign::TOP_LEFT, "Loading...");
|
||||
}
|
||||
|
||||
// ===== SECTION 3: Car Battery Status =====
|
||||
it.rectangle(margin, car_y, section_width, car_height);
|
||||
it.printf(margin + inner_margin, car_y + 8, id(font_section_header), TextAlign::TOP_LEFT, "[Car]");
|
||||
if (id(car_charge_level).has_state()) {
|
||||
it.printf(margin + inner_margin, car_y + 38, id(font_status_text), TextAlign::TOP_LEFT, "Charge: %2.0f%%", id(car_charge_level).state);
|
||||
} else {
|
||||
it.printf(margin + inner_margin, car_y + 38, id(font_status_text), TextAlign::TOP_LEFT, "Charge: --%");
|
||||
}
|
||||
|
||||
// ===== SECTION 4: Energy Usage =====
|
||||
it.rectangle(margin, energy_y, section_width, energy_height);
|
||||
it.printf(margin + inner_margin, energy_y + 10, id(font_section_header), TextAlign::TOP_LEFT, "[Energy]");
|
||||
|
||||
int graph_left = margin + inner_margin;
|
||||
int graph_top = energy_y + 40;
|
||||
int graph_width = section_width - 2 * inner_margin;
|
||||
int graph_height = energy_height - 50;
|
||||
|
||||
int num_bars = 24;
|
||||
float bar_heights[] = {
|
||||
15, 28, 42, 38, 35, 48, 52, 45, 40, 55, 60, 50,
|
||||
45, 58, 62, 55, 48, 65, 70, 60, 52, 68, 75, 55
|
||||
};
|
||||
int bar_w = (graph_width - 6) / num_bars;
|
||||
|
||||
for (int i = 0; i < num_bars; i++) {
|
||||
int bh = (bar_heights[i] * graph_height) / 80;
|
||||
int bx = graph_left + (i * bar_w) + 2;
|
||||
int by = graph_top + graph_height - bh;
|
||||
it.filled_rectangle(bx, by, bar_w - 1, bh);
|
||||
}
|
||||
|
||||
// ===== FOOTER =====
|
||||
it.rectangle(margin, footer_y, section_width, footer_height);
|
||||
it.printf(w / 2, footer_y + 6, id(font_section_header), TextAlign::TOP_CENTER, "All Systems OK");
|
||||
it.printf(w - margin - inner_margin, footer_y + 20, id(font_small), TextAlign::TOP_RIGHT, "Updated");
|
||||
@@ -1,8 +1,8 @@
|
||||
substitutions:
|
||||
device_name: "hvac-ir-zolder"
|
||||
friendly_name: "IR-blaster Woonkamer"
|
||||
friendly_name: "IR-blaster Slaapkamer"
|
||||
comment: "ESP8266, Tuya-hack, IR"
|
||||
location: "woonkamer"
|
||||
location: "Slaapkamer"
|
||||
api_password: !secret hvac_zolder_api
|
||||
ota_password: !secret ota_password
|
||||
wifi_ssid: !secret wifi_ssid
|
||||
|
||||
@@ -13,3 +13,16 @@ remote_receiver:
|
||||
# pullup: true
|
||||
tolerance: 55%
|
||||
dump: all
|
||||
|
||||
# Example configuration entry
|
||||
infrared:
|
||||
# IR transmitter instance
|
||||
- platform: ir_rf_proxy
|
||||
name: IR Proxy Transmitter
|
||||
id: ir_proxy_tx
|
||||
remote_transmitter_id: irtx
|
||||
# IR receiver instance
|
||||
- platform: ir_rf_proxy
|
||||
name: IR Proxy Receiver
|
||||
id: ir_proxy_rx
|
||||
remote_receiver_id: rcvr
|
||||
@@ -1,32 +0,0 @@
|
||||
esphome:
|
||||
name: ttt
|
||||
friendly_name: Ttt
|
||||
|
||||
esp32:
|
||||
board: esp32-c3-devkitm-1
|
||||
framework:
|
||||
type: esp-idf
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
|
||||
# Enable Home Assistant API
|
||||
api:
|
||||
encryption:
|
||||
key: "znqjRmfKlS5XOwf4SZ0XlXkLi4VV/EIcLkg7tatYdc0="
|
||||
|
||||
ota:
|
||||
- platform: esphome
|
||||
password: "c21808863f56526f6cee79d38c0633d2"
|
||||
|
||||
wifi:
|
||||
ssid: !secret wifi_ssid
|
||||
password: !secret wifi_password
|
||||
|
||||
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||
ap:
|
||||
ssid: "Ttt Fallback Hotspot"
|
||||
password: "Ccn8S3iMyrvd"
|
||||
|
||||
captive_portal:
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
# https://www.home-assistant.io/integrations/sensor/
|
||||
sensor: !include_dir_list ../entities/sensors
|
||||
#sensor: !include_dir_merge_named ../entities/sensors
|
||||
|
||||
sensor:
|
||||
- platform: derivative
|
||||
source: sensor.temperatuur_badkamer_humidity
|
||||
name: Badkamer vocht stijging
|
||||
unit_time: min
|
||||
time_window: "00:05:00"
|
||||
|
||||
335
scenes.yaml
335
scenes.yaml
@@ -2,8 +2,16 @@
|
||||
name: sfeer
|
||||
entities:
|
||||
light.lamp_tafel:
|
||||
effect_list:
|
||||
- blink
|
||||
- breathe
|
||||
- channel_change
|
||||
- finish_effect
|
||||
- okay
|
||||
- stop_effect
|
||||
supported_color_modes:
|
||||
- brightness
|
||||
effect:
|
||||
color_mode: brightness
|
||||
brightness: 97
|
||||
entity_id:
|
||||
@@ -11,28 +19,24 @@
|
||||
- light.lamp_tafel2
|
||||
icon: mdi:lightbulb-group
|
||||
friendly_name: Lamp Tafel
|
||||
supported_features: 40
|
||||
supported_features: 44
|
||||
state: 'on'
|
||||
light.lamp_kast:
|
||||
effect_list:
|
||||
- blink
|
||||
- breathe
|
||||
- okay
|
||||
- channel_change
|
||||
- finish_effect
|
||||
- stop_effect
|
||||
supported_color_modes:
|
||||
- brightness
|
||||
effect:
|
||||
color_mode: brightness
|
||||
brightness: 140
|
||||
off_with_transition: false
|
||||
off_brightness:
|
||||
friendly_name: lamp kast
|
||||
supported_features: 40
|
||||
supported_features: 44
|
||||
state: 'on'
|
||||
switch.stopcontact_boven:
|
||||
friendly_name: Zout lamp
|
||||
state: 'on'
|
||||
select.kerstboom_voorinstelling:
|
||||
options:
|
||||
- Candle Multi
|
||||
- Colorful
|
||||
- Solid Glitter
|
||||
friendly_name: Kerstboom Voorinstelling
|
||||
state: Candle Multi
|
||||
light.ledstok:
|
||||
effect_list:
|
||||
- Solid
|
||||
@@ -240,18 +244,33 @@
|
||||
friendly_name: ledstok
|
||||
supported_features: 36
|
||||
state: 'on'
|
||||
light.zout_lamp:
|
||||
supported_color_modes:
|
||||
- onoff
|
||||
color_mode: onoff
|
||||
friendly_name: Zout lamp
|
||||
supported_features: 0
|
||||
state: 'on'
|
||||
icon: mdi:floor-lamp
|
||||
metadata:
|
||||
select.kerstboom_voorinstelling:
|
||||
entity_only: true
|
||||
light.ledstok:
|
||||
entity_only: true
|
||||
light.zout_lamp:
|
||||
entity_only: true
|
||||
- id: '1754858015842'
|
||||
name: sfeer uit
|
||||
entities:
|
||||
light.lamp_tafel:
|
||||
effect_list:
|
||||
- blink
|
||||
- breathe
|
||||
- channel_change
|
||||
- finish_effect
|
||||
- okay
|
||||
- stop_effect
|
||||
supported_color_modes:
|
||||
- brightness
|
||||
effect:
|
||||
color_mode:
|
||||
brightness:
|
||||
entity_id:
|
||||
@@ -259,34 +278,250 @@
|
||||
- light.lamp_tafel2
|
||||
icon: mdi:lightbulb-group
|
||||
friendly_name: Lamp Tafel
|
||||
supported_features: 40
|
||||
supported_features: 44
|
||||
state: 'off'
|
||||
light.lamp_kast:
|
||||
effect_list:
|
||||
- blink
|
||||
- breathe
|
||||
- okay
|
||||
- channel_change
|
||||
- finish_effect
|
||||
- stop_effect
|
||||
supported_color_modes:
|
||||
- brightness
|
||||
effect:
|
||||
color_mode:
|
||||
brightness:
|
||||
off_with_transition: false
|
||||
off_brightness: 140
|
||||
friendly_name: lamp kast
|
||||
supported_features: 40
|
||||
supported_features: 44
|
||||
state: 'off'
|
||||
light.ikea_of_sweden_tradfri_bulb_e27_ww_clear_250lm:
|
||||
light.lamp_zitkamer:
|
||||
effect_list:
|
||||
- blink
|
||||
- breathe
|
||||
- okay
|
||||
- channel_change
|
||||
- finish_effect
|
||||
- stop_effect
|
||||
supported_color_modes:
|
||||
- brightness
|
||||
effect:
|
||||
color_mode:
|
||||
brightness:
|
||||
off_with_transition: false
|
||||
off_brightness: 3
|
||||
friendly_name: Lamp Bank
|
||||
supported_features: 40
|
||||
friendly_name: Lamp Zitkamer
|
||||
supported_features: 44
|
||||
state: 'off'
|
||||
switch.stopcontact_boven:
|
||||
light.zout_lamp:
|
||||
supported_color_modes:
|
||||
- onoff
|
||||
color_mode:
|
||||
friendly_name: Zout lamp
|
||||
supported_features: 0
|
||||
state: 'off'
|
||||
light.ledstok:
|
||||
effect_list:
|
||||
- Solid
|
||||
- Blink
|
||||
- Breathe
|
||||
- Wipe
|
||||
- Wipe Random
|
||||
- Random Colors
|
||||
- Sweep
|
||||
- Dynamic
|
||||
- Colorloop
|
||||
- Rainbow
|
||||
- Scan
|
||||
- Scan Dual
|
||||
- Fade
|
||||
- Theater
|
||||
- Theater Rainbow
|
||||
- Running
|
||||
- Saw
|
||||
- Twinkle
|
||||
- Dissolve
|
||||
- Dissolve Rnd
|
||||
- Sparkle
|
||||
- Sparkle Dark
|
||||
- Sparkle+
|
||||
- Strobe
|
||||
- Strobe Rainbow
|
||||
- Strobe Mega
|
||||
- Blink Rainbow
|
||||
- Android
|
||||
- Chase
|
||||
- Chase Random
|
||||
- Chase Rainbow
|
||||
- Chase Flash
|
||||
- Chase Flash Rnd
|
||||
- Rainbow Runner
|
||||
- Colorful
|
||||
- Traffic Light
|
||||
- Sweep Random
|
||||
- Chase 2
|
||||
- Aurora
|
||||
- Stream
|
||||
- Scanner
|
||||
- Lighthouse
|
||||
- Fireworks
|
||||
- Rain
|
||||
- Tetrix
|
||||
- Fire Flicker
|
||||
- Gradient
|
||||
- Loading
|
||||
- Rolling Balls
|
||||
- Fairy
|
||||
- Two Dots
|
||||
- Fairytwinkle
|
||||
- Running Dual
|
||||
- RSVD
|
||||
- Chase 3
|
||||
- Tri Wipe
|
||||
- Tri Fade
|
||||
- Lightning
|
||||
- ICU
|
||||
- Multi Comet
|
||||
- Scanner Dual
|
||||
- Stream 2
|
||||
- Oscillate
|
||||
- Pride 2015
|
||||
- Juggle
|
||||
- Palette
|
||||
- Fire 2012
|
||||
- Colorwaves
|
||||
- Bpm
|
||||
- Fill Noise
|
||||
- Noise 1
|
||||
- Noise 2
|
||||
- Noise 3
|
||||
- Noise 4
|
||||
- Colortwinkles
|
||||
- Lake
|
||||
- Meteor
|
||||
- Meteor Smooth
|
||||
- Railway
|
||||
- Ripple
|
||||
- Twinklefox
|
||||
- Twinklecat
|
||||
- Halloween Eyes
|
||||
- Solid Pattern
|
||||
- Solid Pattern Tri
|
||||
- Spots
|
||||
- Spots Fade
|
||||
- Glitter
|
||||
- Candle
|
||||
- Fireworks Starburst
|
||||
- Fireworks 1D
|
||||
- Bouncing Balls
|
||||
- Sinelon
|
||||
- Sinelon Dual
|
||||
- Sinelon Rainbow
|
||||
- Popcorn
|
||||
- Drip
|
||||
- Plasma
|
||||
- Percent
|
||||
- Ripple Rainbow
|
||||
- Heartbeat
|
||||
- Pacifica
|
||||
- Candle Multi
|
||||
- Solid Glitter
|
||||
- Sunrise
|
||||
- Phased
|
||||
- Twinkleup
|
||||
- Noise Pal
|
||||
- Sine
|
||||
- Phased Noise
|
||||
- Flow
|
||||
- Chunchun
|
||||
- Dancing Shadows
|
||||
- Washing Machine
|
||||
- Rotozoomer
|
||||
- Blends
|
||||
- TV Simulator
|
||||
- Dynamic Smooth
|
||||
- Spaceships
|
||||
- Crazy Bees
|
||||
- Ghost Rider
|
||||
- Blobs
|
||||
- Scrolling Text
|
||||
- Drift Rose
|
||||
- Distortion Waves
|
||||
- Soap
|
||||
- Octopus
|
||||
- Waving Cell
|
||||
- Pixels
|
||||
- Pixelwave
|
||||
- Juggles
|
||||
- Matripix
|
||||
- Gravimeter
|
||||
- Plasmoid
|
||||
- Puddles
|
||||
- Midnoise
|
||||
- Noisemeter
|
||||
- Freqwave
|
||||
- Freqmatrix
|
||||
- GEQ
|
||||
- Waterfall
|
||||
- Freqpixels
|
||||
- RSVD
|
||||
- Noisefire
|
||||
- Puddlepeak
|
||||
- Noisemove
|
||||
- Noise2D
|
||||
- Perlin Move
|
||||
- Ripple Peak
|
||||
- Firenoise
|
||||
- Squared Swirl
|
||||
- RSVD
|
||||
- DNA
|
||||
- Matrix
|
||||
- Metaballs
|
||||
- Freqmap
|
||||
- Gravcenter
|
||||
- Gravcentric
|
||||
- Gravfreq
|
||||
- DJ Light
|
||||
- Funky Plank
|
||||
- RSVD
|
||||
- Pulser
|
||||
- Blurz
|
||||
- Drift
|
||||
- Waverly
|
||||
- Sun Radiation
|
||||
- Colored Bursts
|
||||
- Julia
|
||||
- RSVD
|
||||
- RSVD
|
||||
- RSVD
|
||||
- Game Of Life
|
||||
- Tartan
|
||||
- Polar Lights
|
||||
- Swirl
|
||||
- Lissajous
|
||||
- Frizzles
|
||||
- Plasma Ball
|
||||
- Flow Stripe
|
||||
- Hiphotic
|
||||
- Sindots
|
||||
- DNA Spiral
|
||||
- Black Hole
|
||||
- Wavesins
|
||||
- Rocktaves
|
||||
- Akemi
|
||||
supported_color_modes:
|
||||
- rgb
|
||||
effect:
|
||||
color_mode:
|
||||
brightness:
|
||||
hs_color:
|
||||
rgb_color:
|
||||
xy_color:
|
||||
friendly_name: ledstok
|
||||
supported_features: 36
|
||||
state: 'off'
|
||||
icon: mdi:floor-lamp-outline
|
||||
metadata:
|
||||
switch.stopcontact_boven:
|
||||
light.ledstok:
|
||||
entity_only: true
|
||||
- id: '1755326563698'
|
||||
name: Badkamer dag
|
||||
@@ -595,7 +830,7 @@
|
||||
- id: '1768907183363'
|
||||
name: kantoor_werk
|
||||
entities:
|
||||
light.lamp_kantoor_2:
|
||||
light.lamp_kantoor:
|
||||
min_color_temp_kelvin: 2202
|
||||
max_color_temp_kelvin: 4000
|
||||
min_mireds: 250
|
||||
@@ -641,7 +876,7 @@
|
||||
- id: '1768907224001'
|
||||
name: Kantoor Hobby
|
||||
entities:
|
||||
light.lamp_kantoor_2:
|
||||
light.lamp_kantoor:
|
||||
min_color_temp_kelvin: 2202
|
||||
max_color_temp_kelvin: 4000
|
||||
min_mireds: 250
|
||||
@@ -687,7 +922,7 @@
|
||||
- id: '1768907253718'
|
||||
name: kantoor Voorlezen
|
||||
entities:
|
||||
light.lamp_kantoor_2:
|
||||
light.lamp_kantoor:
|
||||
min_color_temp_kelvin: 2202
|
||||
max_color_temp_kelvin: 4000
|
||||
min_mireds: 250
|
||||
@@ -721,7 +956,7 @@
|
||||
- id: '1768907536768'
|
||||
name: kantoor uit
|
||||
entities:
|
||||
light.lamp_kantoor_2:
|
||||
light.lamp_kantoor:
|
||||
min_color_temp_kelvin: 2202
|
||||
max_color_temp_kelvin: 4000
|
||||
min_mireds: 250
|
||||
@@ -746,9 +981,7 @@
|
||||
- heat
|
||||
min_temp: 5
|
||||
max_temp: 30
|
||||
current_temperature: 17.6
|
||||
temperature: 18
|
||||
current_humidity: 43.84
|
||||
temperature: 13
|
||||
friendly_name: Thermostaat kantoor
|
||||
supported_features: 385
|
||||
state: heat
|
||||
@@ -766,8 +999,16 @@
|
||||
name: Woonkamer overdag
|
||||
entities:
|
||||
light.lamp_tafel:
|
||||
effect_list:
|
||||
- blink
|
||||
- breathe
|
||||
- channel_change
|
||||
- finish_effect
|
||||
- okay
|
||||
- stop_effect
|
||||
supported_color_modes:
|
||||
- brightness
|
||||
effect:
|
||||
color_mode: brightness
|
||||
brightness: 254
|
||||
entity_id:
|
||||
@@ -775,20 +1016,23 @@
|
||||
- light.lamp_tafel2
|
||||
icon: mdi:lightbulb-group
|
||||
friendly_name: Lamp Tafel
|
||||
supported_features: 40
|
||||
supported_features: 44
|
||||
state: 'on'
|
||||
light.lamp_kast:
|
||||
effect_list:
|
||||
- blink
|
||||
- breathe
|
||||
- okay
|
||||
- channel_change
|
||||
- finish_effect
|
||||
- stop_effect
|
||||
supported_color_modes:
|
||||
- brightness
|
||||
effect:
|
||||
color_mode: brightness
|
||||
brightness: 140
|
||||
off_with_transition: false
|
||||
off_brightness:
|
||||
friendly_name: lamp kast
|
||||
supported_features: 40
|
||||
state: 'on'
|
||||
switch.stopcontact_boven:
|
||||
friendly_name: Zout lamp
|
||||
supported_features: 44
|
||||
state: 'on'
|
||||
light.ledstok:
|
||||
effect_list:
|
||||
@@ -990,7 +1234,16 @@
|
||||
friendly_name: ledstok
|
||||
supported_features: 36
|
||||
state: 'off'
|
||||
light.zout_lamp:
|
||||
supported_color_modes:
|
||||
- onoff
|
||||
color_mode: onoff
|
||||
friendly_name: Zout lamp
|
||||
supported_features: 0
|
||||
state: 'on'
|
||||
icon: mdi:floor-lamp
|
||||
metadata:
|
||||
light.ledstok:
|
||||
entity_only: true
|
||||
light.zout_lamp:
|
||||
entity_only: true
|
||||
|
||||
42
scripts.yaml
42
scripts.yaml
@@ -634,7 +634,7 @@ keuken_alles_uit:
|
||||
- action: switch.turn_off
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id: switch.boiler_2
|
||||
entity_id: switch.boiler
|
||||
data: {}
|
||||
alias: Boiler uit
|
||||
- action: climate.set_temperature
|
||||
@@ -652,10 +652,10 @@ keuken_alles_uit:
|
||||
- light.lamp_keuken_main
|
||||
- light.lamp_toilet
|
||||
data: {}
|
||||
- action: switch.turn_off
|
||||
- action: switch.turn_on
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id: switch.display_keuken_scherm
|
||||
entity_id: switch.display_keuken_screensaver
|
||||
data: {}
|
||||
alias: Alles uit - Keuken
|
||||
description: ''
|
||||
@@ -666,9 +666,9 @@ slaapkamer_alles_uit:
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id:
|
||||
- light.lamp_slaapkamer_2
|
||||
- light.lamp_slaapkamer
|
||||
- light.lamp_bed_links_dim
|
||||
- light.lanp_bed_rechts_dim
|
||||
- light.lamp_bed_rechts_dim
|
||||
data: {}
|
||||
- action: climate.set_temperature
|
||||
metadata: {}
|
||||
@@ -689,8 +689,8 @@ woonkamer_alles_uit:
|
||||
target:
|
||||
entity_id:
|
||||
- light.lamp_kast
|
||||
- light.ikea_of_sweden_tradfri_bulb_e27_ww_clear_250lm
|
||||
- light.ikea_of_sweden_stoftmoln_ceiling_wall_lamp_ww37
|
||||
- light.lamp_bank
|
||||
- light.lamp_zitkamer
|
||||
- light.lamp_tafel
|
||||
- light.lamp_tafel_sfeer
|
||||
- light.zout_lamp
|
||||
@@ -746,7 +746,7 @@ alles_uit_kantoor:
|
||||
- action: light.turn_off
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id: light.lamp_kantoor_2
|
||||
entity_id: light.lamp_kantoor
|
||||
data: {}
|
||||
- action: climate.set_temperature
|
||||
metadata: {}
|
||||
@@ -961,7 +961,7 @@ film_kijken:
|
||||
metadata: {}
|
||||
data: {}
|
||||
target:
|
||||
device_id: a421097cef9b325efb84ae7009ff87be
|
||||
entity_id: light.lamp_kast_slaapkamer
|
||||
alias: Film kijken
|
||||
description: ''
|
||||
slapen_slaapkamer_willem:
|
||||
@@ -1005,3 +1005,27 @@ alles_uit_slaapkamer_kids:
|
||||
alias: Alles uit - Slaapkamer kids
|
||||
description: ''
|
||||
icon: mdi:bed-outline
|
||||
display_keuken_aan:
|
||||
sequence:
|
||||
- action: switch.turn_off
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id: switch.display_keuken_screensaver
|
||||
data: {}
|
||||
- action: number.set_value
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id: number.display_keuken_helderheid_screensaver
|
||||
data:
|
||||
value: '100'
|
||||
alias: display keuken aan
|
||||
description: ''
|
||||
display_keuken_uit:
|
||||
sequence:
|
||||
- action: switch.turn_on
|
||||
metadata: {}
|
||||
target:
|
||||
entity_id: switch.display_keuken_screensaver
|
||||
data: {}
|
||||
alias: display keuken uit
|
||||
description: ''
|
||||
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
Before Width: | Height: | Size: 25 KiB |
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<config>
|
||||
<header>
|
||||
<header_item key="X-BBL-Client-Type" value="slicer"/>
|
||||
<header_item key="X-BBL-Client-Version" value="02.05.00.66"/>
|
||||
</header>
|
||||
<plate>
|
||||
<metadata key="index" value="1"/>
|
||||
<metadata key="extruder_type" value="0"/>
|
||||
<metadata key="nozzle_volume_type" value="0"/>
|
||||
<metadata key="printer_model_id" value="BL-P001"/>
|
||||
<metadata key="nozzle_diameters" value="0.4"/>
|
||||
<metadata key="timelapse_type" value="0"/>
|
||||
<metadata key="prediction" value="2777"/>
|
||||
<metadata key="weight" value="11.04"/>
|
||||
<metadata key="first_layer_time" value="227.031586"/>
|
||||
<metadata key="outside" value="false"/>
|
||||
<metadata key="support_used" value="false"/>
|
||||
<metadata key="label_object_enabled" value="false"/>
|
||||
<metadata key="filament_maps" value="1 1 1 1"/>
|
||||
<metadata key="limit_filament_maps" value="0 0 0 0"/>
|
||||
<object identify_id="365" name="Assembly" skipped="false" />
|
||||
<filament id="3" tray_info_idx="GFG99" type="PETG" color="#161616" used_m="0.20" used_g="0.61" used_for_object="true" used_for_support="false" group_id="0" nozzle_diameter="0.40" volume_type="Standard"/>
|
||||
<filament id="4" tray_info_idx="GFG00" type="PETG" color="#B28B33" used_m="3.47" used_g="10.43" used_for_object="true" used_for_support="false" group_id="0" nozzle_diameter="0.40" volume_type="Standard"/>
|
||||
<warning msg="bed_temperature_too_high_than_filament" level="3" error_code ="1000C001" />
|
||||
<layer_filament_lists>
|
||||
<layer_filament_list filament_list="2" layer_ranges="15 17" />
|
||||
<layer_filament_list filament_list="3" layer_ranges="0 14" />
|
||||
</layer_filament_lists>
|
||||
</plate>
|
||||
</config>
|
||||
@@ -15,26 +15,32 @@ frontend:
|
||||
homeassistant:
|
||||
enabled: true
|
||||
advanced:
|
||||
pan_id: 0x0C56
|
||||
ext_pan_id: [0x4b, 0xcf, 0x12, 0x33, 0xab, 0x93, 0x4c, 0x57]
|
||||
pan_id: 3158
|
||||
ext_pan_id:
|
||||
- 75
|
||||
- 207
|
||||
- 18
|
||||
- 51
|
||||
- 171
|
||||
- 147
|
||||
- 76
|
||||
- 87
|
||||
channel: 25
|
||||
network_key:
|
||||
[
|
||||
0x15,
|
||||
0x6b,
|
||||
0x04,
|
||||
0x54,
|
||||
0xfb,
|
||||
0xc8,
|
||||
0x6c,
|
||||
0x8a,
|
||||
0xa5,
|
||||
0x6d,
|
||||
0x06,
|
||||
0x94,
|
||||
0xda,
|
||||
0x08,
|
||||
0x75,
|
||||
0x8c,
|
||||
]
|
||||
- 21
|
||||
- 107
|
||||
- 4
|
||||
- 84
|
||||
- 251
|
||||
- 200
|
||||
- 108
|
||||
- 138
|
||||
- 165
|
||||
- 109
|
||||
- 6
|
||||
- 148
|
||||
- 218
|
||||
- 8
|
||||
- 117
|
||||
- 140
|
||||
devices: devices.yaml
|
||||
|
||||
@@ -2,231 +2,431 @@
|
||||
"metadata": {
|
||||
"format": "zigpy/open-coordinator-backup",
|
||||
"version": 1,
|
||||
"source": "zigbee-herdsman@9.0.9",
|
||||
"source": "zigbee-herdsman@10.0.5",
|
||||
"internal": {
|
||||
"date": "2026-03-25T10:25:03.325Z",
|
||||
"date": "2026-04-02T12:18:16.206Z",
|
||||
"znpVersion": 1
|
||||
}
|
||||
},
|
||||
"stack_specific": {
|
||||
"zstack": {
|
||||
"tclk_seed": "eaf31b5477d32c2201c671e9789882de"
|
||||
"tclk_seed": "8615f9a0ceb9bbf9a842c8eba303cefc"
|
||||
}
|
||||
},
|
||||
"coordinator_ieee": "00124b0028d2e01a",
|
||||
"pan_id": "eed0",
|
||||
"extended_pan_id": "679240887e1aab54",
|
||||
"pan_id": "c56",
|
||||
"extended_pan_id": "574c93ab3312cf4b",
|
||||
"nwk_update_id": 0,
|
||||
"security_level": 5,
|
||||
"channel": 11,
|
||||
"channel": 25,
|
||||
"channel_mask": [
|
||||
11
|
||||
25
|
||||
],
|
||||
"network_key": {
|
||||
"key": "2fe2b61879185b4522e88d0a54f1314c",
|
||||
"key": "156b0454fbc86c8aa56d0694da08758c",
|
||||
"sequence_number": 0,
|
||||
"frame_counter": 1
|
||||
"frame_counter": 6969265
|
||||
},
|
||||
"devices": [
|
||||
{
|
||||
"nwk_address": "5d05",
|
||||
"ieee_address": "44e2f8fffe0fb2fa",
|
||||
"is_child": false
|
||||
"nwk_address": "3b41",
|
||||
"ieee_address": "4c5bb3fffea0e207",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "121b00304608a2e4452a4b5dfc7da7ca",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3278
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "e8f0",
|
||||
"ieee_address": "00158d0002e6c64d",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "d205",
|
||||
"ieee_address": "00158d0002c9572b",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "20dc",
|
||||
"ieee_address": "00158d0001b91af7",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "edd7",
|
||||
"ieee_address": "0c2a6ffffe64a7f5",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "8380",
|
||||
"ieee_address": "f84477fffef97efd",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "4764",
|
||||
"ieee_address": "44e2f8fffe17a9a7",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "784e",
|
||||
"ieee_address": "00158d00023783a0",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "168c",
|
||||
"ieee_address": "00158d0008ad9560",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "2a4f",
|
||||
"ieee_address": "90ab96fffe99035d",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "ae43",
|
||||
"ieee_address": "00124b00246d8628",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "49e3",
|
||||
"ieee_address": "00158d000450bc4d",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "c3de",
|
||||
"ieee_address": "a4c138151c812a2e",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "1af8",
|
||||
"ieee_address": "bc8d7efffe6522d5",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "dfed",
|
||||
"nwk_address": "9f2e",
|
||||
"ieee_address": "c4d8c8fffe49d80d",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "b3b3",
|
||||
"ieee_address": "c4d8c8fffe49da86",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "1928",
|
||||
"ieee_address": "c09b9efffec19a44",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "a507",
|
||||
"ieee_address": "54ef4410011728d1",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "d494",
|
||||
"ieee_address": "a4c13802af2affff",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "9939",
|
||||
"ieee_address": "000b57fffe3296f5",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "4bf",
|
||||
"ieee_address": "8c8b48fffe34e945",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "dbe6",
|
||||
"ieee_address": "54dce9fffead96ad",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "9675",
|
||||
"ieee_address": "781c9dfffe7899af",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "2d59",
|
||||
"ieee_address": "c02cedfffe21a3e3",
|
||||
"is_child": false
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "a59a81155ccb16388bcdb05e3171633d",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "22cc",
|
||||
"ieee_address": "54dce9fffea96e29",
|
||||
"is_child": false
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "e7d7120757ab14bf8a6d670279fc25f4",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3322
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "3b41",
|
||||
"ieee_address": "4c5bb3fffea0e207",
|
||||
"is_child": false
|
||||
"nwk_address": "e51d",
|
||||
"ieee_address": "00158d0002c9572b",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "e5ee72fba8cfddeb885407fe8698eca0",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "3a90",
|
||||
"ieee_address": "f84477fffe5326ce",
|
||||
"is_child": false
|
||||
"nwk_address": "668b",
|
||||
"ieee_address": "c09b9efffec19a44",
|
||||
"is_child": true,
|
||||
"link_key": {
|
||||
"key": "06522a5dfc5067465163613046256268",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "200b",
|
||||
"ieee_address": "f84477fffe8122ed",
|
||||
"is_child": false
|
||||
"nwk_address": "4bf",
|
||||
"ieee_address": "8c8b48fffe34e945",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "4627c878eab12b42fc52cd56bd80602f",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3487
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "6877",
|
||||
"ieee_address": "a4c138a0d4b497e0",
|
||||
"is_child": false
|
||||
"nwk_address": "49e3",
|
||||
"ieee_address": "00158d000450bc4d",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "8557f307ce719315b41c9ebdbb74bd42",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3806
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "b60e",
|
||||
"ieee_address": "d44867fffe2942ba",
|
||||
"is_child": false
|
||||
"nwk_address": "faca",
|
||||
"ieee_address": "00158d0002e6c64d",
|
||||
"is_child": true,
|
||||
"link_key": {
|
||||
"key": "b46ea4caeb2e16ceb140f3fba043acbb",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "9c2b",
|
||||
"ieee_address": "847127fffeb4d4f3",
|
||||
"is_child": false
|
||||
"nwk_address": "2a4f",
|
||||
"ieee_address": "90ab96fffe99035d",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "db16605e312f1069f54151155c95656c",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3806
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "d4c8",
|
||||
"ieee_address": "00158d0008ad9560",
|
||||
"is_child": true,
|
||||
"link_key": {
|
||||
"key": "a87e0e0bce719315993563b1bb74bd42",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "ffac",
|
||||
"ieee_address": "804b50fffe80a266",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "cd72",
|
||||
"ieee_address": "70c59cfffe2091be",
|
||||
"is_child": false
|
||||
},
|
||||
{
|
||||
"nwk_address": "2b2a",
|
||||
"ieee_address": "781c9dfffee7289f",
|
||||
"is_child": false
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "9f024e4744a9e3c2ae4923fd31accd95",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 1694
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "ef11",
|
||||
"ieee_address": "348d13fffecd5d71",
|
||||
"is_child": false
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "3395265dfcdd71b264a46d3046a8749c",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 1540
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "b3b3",
|
||||
"ieee_address": "c4d8c8fffe49da86",
|
||||
"is_child": true,
|
||||
"link_key": {
|
||||
"key": "4826cfeb0668167d3d23e1bc37237bc7",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3696
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "2b2a",
|
||||
"ieee_address": "781c9dfffee7289f",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "3c2b29027988e5d851915c0757dfd493",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 1650
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "784e",
|
||||
"ieee_address": "00158d00023783a0",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "2696cea2ce34aef908c1ffe9a38edbfc",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3828
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "5a7c",
|
||||
"ieee_address": "8c65a3fffee949aa",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "53e92747445acdce62a24afd315fe399",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "dbe6",
|
||||
"ieee_address": "54dce9fffead96ad",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "b86f0d30465225fcef5e465dfc2720d2",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3410
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "9675",
|
||||
"ieee_address": "781c9dfffe7899af",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "6120c30757dfd4930c9ab6027988e5d8",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3278
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "b60e",
|
||||
"ieee_address": "d44867fffe2942ba",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "43ea6b3614c44b1a46c43c075fa9f16f",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 2277
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "f83f",
|
||||
"ieee_address": "c02cedfffe2b4ebb",
|
||||
"is_child": false
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "75f7900757afe42b184de50279f8d560",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 1243
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "41a0",
|
||||
"ieee_address": "54ef441001422124",
|
||||
"is_child": false
|
||||
"nwk_address": "cd72",
|
||||
"ieee_address": "70c59cfffe2091be",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "767a83fd316043654731ee4744656d32",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 1705
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "3a90",
|
||||
"ieee_address": "f84477fffe5326ce",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "378e113614d4473632a046075fb9fd43",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 2970
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "a507",
|
||||
"ieee_address": "54ef4410011728d1",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "573deea1defd54ad796adfeab34721a8",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3696
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "1af8",
|
||||
"ieee_address": "bc8d7efffe6522d5",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "1b9bde07573c45577621ab02796b741c",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3445
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "1760",
|
||||
"ieee_address": "bc33acfffe1a21da",
|
||||
"is_child": false
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "d9efe678ea559372639ae356bd64d81f",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 792
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "10c7",
|
||||
"ieee_address": "8c65a3fffee949aa",
|
||||
"is_child": false
|
||||
"nwk_address": "2d59",
|
||||
"ieee_address": "c02cedfffe21a3e3",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "40a0ef0279f8d5602d1a9a0757afe42b",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3278
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "384c",
|
||||
"nwk_address": "200b",
|
||||
"ieee_address": "f84477fffe8122ed",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "23de07eb06d78a4156db29bc379ce7fb",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 2970
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "9c2b",
|
||||
"ieee_address": "847127fffeb4d4f3",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "482d1cbc37ccd2873d2832eb0687bf3d",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 1738
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "9939",
|
||||
"ieee_address": "000b57fffe3296f5",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "3d7d91fd31ab8d150c36fc4744aea342",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3608
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "edd7",
|
||||
"ieee_address": "0c2a6ffffe64a7f5",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "4e5eccbc3784890f3b5be2eb06cfe4b5",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3883
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "20dc",
|
||||
"ieee_address": "00158d0001b91af7",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "39e63f14f92ddbb94ce31143c866b603",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3850
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "8380",
|
||||
"ieee_address": "f84477fffef97efd",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "553c31155c748a047b6b005e31ceff01",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3883
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "29e1",
|
||||
"ieee_address": "a4c138a0d4b497e0",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "1c11a12d00f6781f193ff61c4b9bc26a",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "d494",
|
||||
"ieee_address": "a4c13802af2affff",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "145c2961febed45d5f319314fb90836c",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 3652
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "7eaf",
|
||||
"ieee_address": "00124b00246d8628",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "e63fd6dda809daeb8b85a3d8865eeba0",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "a875",
|
||||
"ieee_address": "54ef441001422124",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "ea98f9f8b80627bf87228cfd965116f4",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "9bf7",
|
||||
"ieee_address": "c4d8c8fffe045efe",
|
||||
"is_child": false
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "15fd0730034ecd3d5e90bd4506609a0c",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "e14e",
|
||||
"ieee_address": "44e2f8fffe17a9a7",
|
||||
"is_child": true,
|
||||
"link_key": {
|
||||
"key": "a467eb78ea01428a1e12ee56bd3009e7",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "870f",
|
||||
"ieee_address": "44e2f8fffe0fb2fa",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "031a4d36145be18a06341a075f365bff",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"nwk_address": "8d4e",
|
||||
"ieee_address": "60a423fffe28320f",
|
||||
"is_child": false,
|
||||
"link_key": {
|
||||
"key": "0cfcd478eada04aeb689d156bdeb4fc3",
|
||||
"rx_counter": 0,
|
||||
"tx_counter": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,82 +1,80 @@
|
||||
"0x00124b0028d2e01a":
|
||||
friendly_name: "Zigbee Meterkast"
|
||||
"0x00124b002e132f65":
|
||||
friendly_name: "Texas Instruments Coordinator"
|
||||
"0x90ab96fffe99035d":
|
||||
friendly_name: "aqs woonkamer"
|
||||
"0x44e2f8fffe17a9a7":
|
||||
friendly_name: "Temperatuur Keuken"
|
||||
"0x70c59cfffe2091be":
|
||||
friendly_name: "Lamp Zitkamer"
|
||||
"0xbc33acfffe1a21da":
|
||||
friendly_name: "Lamp Bank"
|
||||
"0x1c34f1fffeac6a84":
|
||||
friendly_name: "Lamp meterkast"
|
||||
"0x44e2f8fffe0fb2fa":
|
||||
friendly_name: "Temperatuur badkamer"
|
||||
"0x804b50fffe80a266":
|
||||
friendly_name: "Lamp kast slaapkamer"
|
||||
"0x00124b00246d8628":
|
||||
friendly_name: "Beweging toilet"
|
||||
"0x000b57fffe3296f5":
|
||||
friendly_name: "Lamp toilet"
|
||||
"0xc02cedfffe2b4ebb":
|
||||
friendly_name: "lamp tafel sfeer"
|
||||
"0x847127fffeb4d4f3":
|
||||
friendly_name: "Zout lamp"
|
||||
"0xc02cedfffe0e7804":
|
||||
friendly_name: "Lamp badkamer"
|
||||
"0x00158d0002e6c64d":
|
||||
friendly_name: "Contact Balkondeur"
|
||||
"0x00158d0002c9572b":
|
||||
friendly_name: "Contact Voordeur"
|
||||
"0x0c2a6ffffe64a7f5":
|
||||
friendly_name: "Lamp tafel1"
|
||||
"0xf84477fffef97efd":
|
||||
friendly_name: "Lamp tafel2"
|
||||
"0x00158d00023783a0":
|
||||
friendly_name: "Temperatuur 3D printer"
|
||||
"0x00158d0008ad9560":
|
||||
friendly_name: "Button Voordeur"
|
||||
"0xc4d8c8fffe49d80d":
|
||||
friendly_name: "Beweging keuken"
|
||||
"0xc4d8c8fffe49da86":
|
||||
friendly_name: "Beweging badkamer"
|
||||
"0x54ef4410011728d1":
|
||||
friendly_name: "Lamp Keuken"
|
||||
"0xa4c13802af2affff":
|
||||
friendly_name: "Stopcontact Aquahot"
|
||||
"0xbc8d7efffe6522d5":
|
||||
friendly_name: "Stopcontact Koelkast"
|
||||
"0x8c8b48fffe34e945":
|
||||
friendly_name: "lamp kast"
|
||||
"0x54dce9fffead96ad":
|
||||
friendly_name: "Stopcontact Oven"
|
||||
"0x781c9dfffe7899af":
|
||||
friendly_name: "Lamp slaapkamer"
|
||||
"0xc02cedfffe21a3e3":
|
||||
friendly_name: "Lamp slaapkamer kids"
|
||||
"0x54dce9fffea96e29":
|
||||
friendly_name: "stopcontact Boiler"
|
||||
"0x4c5bb3fffea0e207":
|
||||
friendly_name: "IKEA of Sweden RODRET Dimmer"
|
||||
"0xf84477fffe5326ce":
|
||||
friendly_name: "Lamp bed links dim"
|
||||
"0xf84477fffe8122ed":
|
||||
friendly_name: "Lamp bed rechts dim"
|
||||
"0xc09b9efffec19a44":
|
||||
friendly_name: "Temperatuur woonkamer"
|
||||
# '0xd44867fffe2942ba':
|
||||
# friendly_name: 'Temperatuur kantoor'
|
||||
"0x781c9dfffee7289f":
|
||||
friendly_name: "Lamp"
|
||||
"0x348d13fffecd5d71":
|
||||
friendly_name: "Lamp kantoor"
|
||||
# '0x8c65a3fffee949aa':
|
||||
# friendly_name: 'Temperatuur slaapkamer kids'
|
||||
"0xa4c138151c812a2e":
|
||||
friendly_name: "Temperatuur slaapkamer kids"
|
||||
"0xc4d8c8fffe045efe":
|
||||
friendly_name: "Contact meterkastdeur"
|
||||
"0xa4c138a0d4b497e0":
|
||||
friendly_name: "Temperatuur kantoor"
|
||||
'0x00124b0028d2e01a':
|
||||
friendly_name: Zigbee Meterkast
|
||||
'0x00124b002e132f65':
|
||||
friendly_name: Texas Instruments Coordinator
|
||||
'0x90ab96fffe99035d':
|
||||
friendly_name: aqs woonkamer
|
||||
'0x70c59cfffe2091be':
|
||||
friendly_name: Lamp Zitkamer
|
||||
'0xbc33acfffe1a21da':
|
||||
friendly_name: Lamp Bank
|
||||
'0x1c34f1fffeac6a84':
|
||||
friendly_name: Lamp meterkast
|
||||
'0x44e2f8fffe0fb2fa':
|
||||
friendly_name: Temperatuur badkamer
|
||||
'0x00158d0001f5636f':
|
||||
friendly_name: Temperatuur meterkast
|
||||
'0x804b50fffe80a266':
|
||||
friendly_name: Lamp kast slaapkamer
|
||||
'0x000b57fffe3296f5':
|
||||
friendly_name: Lamp toilet
|
||||
'0xc02cedfffe2b4ebb':
|
||||
friendly_name: lamp tafel sfeer
|
||||
'0x847127fffeb4d4f3':
|
||||
friendly_name: Zout lamp
|
||||
'0xc02cedfffe0e7804':
|
||||
friendly_name: Lamp badkamer
|
||||
'0x0c2a6ffffe64a7f5':
|
||||
friendly_name: Lamp tafel1
|
||||
'0xf84477fffef97efd':
|
||||
friendly_name: Lamp tafel2
|
||||
'0xc4d8c8fffe49da86':
|
||||
friendly_name: Beweging badkamer
|
||||
'0x54ef4410011728d1':
|
||||
friendly_name: Lamp Keuken
|
||||
'0xa4c13802af2affff':
|
||||
friendly_name: Stopcontact Aquahot
|
||||
'0xbc8d7efffe6522d5':
|
||||
friendly_name: Stopcontact Koelkast
|
||||
'0x8c8b48fffe34e945':
|
||||
friendly_name: lamp kast
|
||||
'0x54dce9fffead96ad':
|
||||
friendly_name: Stopcontact Oven
|
||||
'0x781c9dfffe7899af':
|
||||
friendly_name: Lamp slaapkamer
|
||||
'0xc02cedfffe21a3e3':
|
||||
friendly_name: Lamp slaapkamer kids
|
||||
'0x54dce9fffea96e29':
|
||||
friendly_name: Boiler
|
||||
'0xf84477fffe5326ce':
|
||||
friendly_name: Lamp bed links dim
|
||||
'0xf84477fffe8122ed':
|
||||
friendly_name: Lamp bed rechts dim
|
||||
'0xd44867fffe2942ba':
|
||||
friendly_name: Temperatuur slaapkamer kids
|
||||
'0x348d13fffecd5d71':
|
||||
friendly_name: Lamp kantoor
|
||||
'0xc4d8c8fffe045efe':
|
||||
friendly_name: Contact meterkast
|
||||
'0x54ef441001422124':
|
||||
friendly_name: Thermostaat Keuken
|
||||
'0x8c65a3fffee949aa':
|
||||
friendly_name: temperatuur kantoor
|
||||
'0xa4c138a0d4b497e0':
|
||||
friendly_name: Temperatuur slaapkamer
|
||||
'0xc4d8c8fffe49d80d':
|
||||
friendly_name: Beweging Keuken
|
||||
'0x00124b00246d8628':
|
||||
friendly_name: Beweging toilet
|
||||
'0x00158d0002c9572b':
|
||||
friendly_name: Contact Voordeur
|
||||
'0x00158d0002e6c64d':
|
||||
friendly_name: contact balkondeur
|
||||
'0x00158d0008ad9560':
|
||||
friendly_name: Button voordeur
|
||||
'0x44e2f8fffe17a9a7':
|
||||
friendly_name: Temperatuur keuken
|
||||
'0xc09b9efffec19a44':
|
||||
friendly_name: Temperatuur woonkamer
|
||||
'0x60a423fffe28320f':
|
||||
friendly_name: schakelaar keuken
|
||||
|
||||
@@ -1 +1,555 @@
|
||||
{}
|
||||
{
|
||||
"0x54ef4410011728d1": {
|
||||
"dimming_range_minimum": 1,
|
||||
"dimming_range_maximum": 100,
|
||||
"effect_speed": 80,
|
||||
"level_config_white": {
|
||||
"on_transition_time": 15,
|
||||
"off_transition_time": 15
|
||||
},
|
||||
"power_on_behavior": "previous",
|
||||
"level_config_rgb": {
|
||||
"off_transition_time": 15,
|
||||
"on_transition_time": 15
|
||||
},
|
||||
"device_temperature": 29,
|
||||
"power_outage_count": 32,
|
||||
"state": "OFF",
|
||||
"linkquality": 116,
|
||||
"state_rgb": "OFF",
|
||||
"state_white": "OFF",
|
||||
"brightness_white": 203,
|
||||
"color_mode_white": "color_temp",
|
||||
"color_temp_white": 370,
|
||||
"brightness_rgb": 254,
|
||||
"color_mode_rgb": "xy",
|
||||
"color_rgb": {
|
||||
"x": 0.329,
|
||||
"y": 0.424
|
||||
}
|
||||
},
|
||||
"0xf84477fffef97efd": {
|
||||
"brightness": 97,
|
||||
"linkquality": 145,
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16842756,
|
||||
"latest_version": 16842756,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-lds-bulb-hwpwm-ww_release_prod_v16842756_529d7965-cee3-4c32-bd28-e5dd17ddc256.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0xbc8d7efffe6522d5": {
|
||||
"state": "ON",
|
||||
"power_on_behavior": "on",
|
||||
"power": 37.3,
|
||||
"current": 0.28,
|
||||
"voltage": 232.8,
|
||||
"energy": 89.96,
|
||||
"linkquality": 123,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 33816645,
|
||||
"latest_version": 33816645,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/inspelning-smart-plug-soc_release_prod_v33816645_02579ff4-6fec-42f6-8957-4048def87def.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0x54dce9fffead96ad": {
|
||||
"state": "ON",
|
||||
"power_on_behavior": "on",
|
||||
"power": 0.9,
|
||||
"current": 0.23,
|
||||
"voltage": 233.6,
|
||||
"energy": 45.79,
|
||||
"linkquality": 65,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 33816645,
|
||||
"latest_version": 33816645,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/inspelning-smart-plug-soc_release_prod_v33816645_02579ff4-6fec-42f6-8957-4048def87def.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0x0c2a6ffffe64a7f5": {
|
||||
"brightness": 97,
|
||||
"linkquality": 116,
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16842756,
|
||||
"latest_version": 16842756,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-lds-bulb-hwpwm-ww_release_prod_v16842756_529d7965-cee3-4c32-bd28-e5dd17ddc256.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x847127fffeb4d4f3": {
|
||||
"state": "ON",
|
||||
"power_on_behavior": "previous",
|
||||
"linkquality": 91,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 587765297,
|
||||
"latest_version": 587765297,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/tradfri-control-outlet_release_prod_v587765297_20061876-85d6-4b39-8c9c-eb95620baa97.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0xbc33acfffe1a21da": {
|
||||
"state": "ON",
|
||||
"linkquality": 149,
|
||||
"brightness": 162,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 587806257,
|
||||
"latest_version": 587806257,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/tradfri-light-unified-w_release_prod_v587806257_147c8812-e7f3-4999-b7eb-3da91009ab65.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x54dce9fffea96e29": {
|
||||
"state": "ON",
|
||||
"power_on_behavior": "previous",
|
||||
"voltage": 233.2,
|
||||
"power": 0.6,
|
||||
"current": 0.01,
|
||||
"energy": 191.37,
|
||||
"linkquality": 174,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 33816645,
|
||||
"latest_version": 33816645,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/inspelning-smart-plug-soc_release_prod_v33816645_02579ff4-6fec-42f6-8957-4048def87def.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0x90ab96fffe99035d": {
|
||||
"temperature": 22,
|
||||
"humidity": 41,
|
||||
"pm25": 2,
|
||||
"linkquality": 145,
|
||||
"voc_index": 69,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16777233,
|
||||
"latest_version": 16777233,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/ota_t0x110f_m0x117c_v0x01000011.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0xf84477fffe5326ce": {
|
||||
"state": "OFF",
|
||||
"brightness": 87,
|
||||
"linkquality": 94,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16777282,
|
||||
"latest_version": 16777282,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-ww_release_prod_v16777282_a39f1e76-af87-4f04-bd7f-0faf71baf3e4.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x1c34f1fffeac6a84": {
|
||||
"state": "OFF",
|
||||
"linkquality": 80,
|
||||
"brightness": 254,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16842756,
|
||||
"latest_version": 16842756,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-lds-bulb-hwpwm-ww_release_prod_v16842756_529d7965-cee3-4c32-bd28-e5dd17ddc256.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x348d13fffecd5d71": {
|
||||
"color_temp": 250,
|
||||
"color_mode": "color_temp",
|
||||
"linkquality": 65,
|
||||
"state": "OFF",
|
||||
"brightness": 172,
|
||||
"color": {
|
||||
"x": 0.3804,
|
||||
"y": 0.3767
|
||||
},
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 33816584,
|
||||
"latest_version": 33816584,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-jetstrom-ws_release_prod_v33816584_33813e5d-0cc9-4b4a-9e93-9000ee44cbe4.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x781c9dfffe7899af": {
|
||||
"brightness": 102,
|
||||
"linkquality": 36,
|
||||
"state": "OFF",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16842759,
|
||||
"latest_version": 16842759,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/10082264-zingo_lds_stoftmoln-1.1.7.ota.ota.signed",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0xc02cedfffe21a3e3": {
|
||||
"state": "OFF",
|
||||
"linkquality": 116,
|
||||
"brightness": 254,
|
||||
"color_temp": 324,
|
||||
"color": {
|
||||
"x": 0.4313,
|
||||
"y": 0.4021,
|
||||
"hue": 35,
|
||||
"saturation": 73,
|
||||
"h": 35,
|
||||
"s": 73
|
||||
},
|
||||
"color_mode": "color_temp",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16777268,
|
||||
"latest_version": 16777268,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-jetstrom-cws_release_prod_v16777268_023f19b9-f55b-4c94-a3fe-00c97755eb78.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0xf84477fffe8122ed": {
|
||||
"state": "OFF",
|
||||
"linkquality": 25,
|
||||
"brightness": 1,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16777282,
|
||||
"latest_version": 16777282,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-ww_release_prod_v16777282_a39f1e76-af87-4f04-bd7f-0faf71baf3e4.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x000b57fffe3296f5": {
|
||||
"brightness": 46,
|
||||
"state": "OFF",
|
||||
"linkquality": 142,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 587810353,
|
||||
"latest_version": 587810353,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/tradfri-bulb-w-1000lm_release_prod_v587810353_5a161508-742d-4eab-8761-286c80d116eb.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x70c59cfffe2091be": {
|
||||
"state": "OFF",
|
||||
"linkquality": 109,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16842759,
|
||||
"latest_version": 16842759,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/10082264-zingo_lds_stoftmoln-1.1.7.ota.ota.signed",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0xa4c13802af2affff": {
|
||||
"current": 0,
|
||||
"voltage": 231.58,
|
||||
"power": 0,
|
||||
"outlet_control_protect": false,
|
||||
"overload_protection": {
|
||||
"enable_max_voltage": "ENABLE",
|
||||
"enable_min_current": "DISABLE",
|
||||
"enable_min_power": "DISABLE",
|
||||
"enable_min_voltage": "DISABLE",
|
||||
"max_current": 922550.528,
|
||||
"max_power": 0,
|
||||
"max_voltage": -45088.768,
|
||||
"min_current": 0,
|
||||
"min_power": 0,
|
||||
"min_voltage": 0.049
|
||||
},
|
||||
"state": "ON",
|
||||
"power_on_behavior": "on",
|
||||
"energy_yesterday": 0.44,
|
||||
"energy_today": 0.4,
|
||||
"energy_month": 0.84,
|
||||
"linkquality": 102,
|
||||
"energy": 84.34,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8194,
|
||||
"latest_version": 8194,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/SN-TLSR8656-S60-01-v2.0.2.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0xc02cedfffe2b4ebb": {
|
||||
"state": "OFF",
|
||||
"linkquality": 153,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16842756,
|
||||
"latest_version": 16842756,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-lds-bulb-hwpwm-ww_release_prod_v16842756_529d7965-cee3-4c32-bd28-e5dd17ddc256.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
},
|
||||
"brightness": 102
|
||||
},
|
||||
"0x8c8b48fffe34e945": {
|
||||
"brightness": 139,
|
||||
"state": "ON",
|
||||
"linkquality": 109,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16777220,
|
||||
"latest_version": 16777220,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/tradfri-driver-zingo_release_prod_v16777220_1fd2b92c-45c5-44d0-97c5-5c71c2ecb8d2.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0x804b50fffe80a266": {
|
||||
"state": "ON",
|
||||
"brightness": 254,
|
||||
"linkquality": 14,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 587753009,
|
||||
"latest_version": 587753009,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/tradfri-transformer_release_prod_v587753009_17d32c23-151f-44cb-a947-4c13a78f36e6.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0xc02cedfffe0e7804": {
|
||||
"state": "ON",
|
||||
"brightness": 246,
|
||||
"linkquality": 94,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16842759,
|
||||
"latest_version": 16842759,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/10082264-zingo_lds_stoftmoln-1.1.7.ota.ota.signed",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
}
|
||||
},
|
||||
"0xc4d8c8fffe045efe": {
|
||||
"tamper": false,
|
||||
"battery": 100,
|
||||
"voltage": 3100,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8704,
|
||||
"latest_version": 8704,
|
||||
"latest_source": null,
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"contact": true,
|
||||
"battery_low": false,
|
||||
"linkquality": 116
|
||||
},
|
||||
"0x54ef441001422124": {
|
||||
"device_temperature": 17,
|
||||
"power_outage_count": 5,
|
||||
"state": "OFF",
|
||||
"battery": 100,
|
||||
"system_mode": "heat",
|
||||
"occupied_heating_setpoint": 13,
|
||||
"fan_mode": "auto",
|
||||
"unused": "0",
|
||||
"thermostat_mode": "ON",
|
||||
"sampling": "low",
|
||||
"period": 1,
|
||||
"high_temperature": 60,
|
||||
"low_temperature": -20,
|
||||
"temp_report_mode": "threshold",
|
||||
"temp_period": 30,
|
||||
"temp_threshold": 0.5,
|
||||
"high_humidity": 99.99,
|
||||
"low_humidity": 0,
|
||||
"humi_report_mode": "threshold",
|
||||
"humi_period": 30,
|
||||
"humi_threshold": 3,
|
||||
"temperature": 17.48,
|
||||
"local_temperature": 17.48,
|
||||
"humidity": 48.11,
|
||||
"sensor": "internal",
|
||||
"auto_hide_middle_line": false,
|
||||
"PW": "0",
|
||||
"MW": "2",
|
||||
"TW": "15",
|
||||
"PMTSD_from_W100_Data": "2026-03-27 08:47:06_PW0_MW2_TW15",
|
||||
"linkquality": 116
|
||||
},
|
||||
"0xc4d8c8fffe49da86": {
|
||||
"occupancy": false,
|
||||
"battery": 100,
|
||||
"voltage": 2900,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8705,
|
||||
"latest_version": 8705,
|
||||
"latest_source": null,
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"illumination": "bright",
|
||||
"linkquality": 54
|
||||
},
|
||||
"0x44e2f8fffe0fb2fa": {
|
||||
"battery": 64,
|
||||
"temperature": 18,
|
||||
"humidity": 49.9,
|
||||
"comfort_temperature_min": 19,
|
||||
"comfort_temperature_max": 27,
|
||||
"comfort_humidity_min": 40,
|
||||
"comfort_humidity_max": 60,
|
||||
"temperature_units": "celsius",
|
||||
"temperature_calibration": 0,
|
||||
"humidity_calibration": 0,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8960,
|
||||
"latest_version": 8960,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/snzb-02d_v2.3.0.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 142
|
||||
},
|
||||
"0xd44867fffe2942ba": {
|
||||
"battery": 70,
|
||||
"temperature": 16.3,
|
||||
"humidity": 50.1,
|
||||
"comfort_temperature_min": 19,
|
||||
"comfort_temperature_max": 27,
|
||||
"comfort_humidity_min": 40,
|
||||
"comfort_humidity_max": 60,
|
||||
"temperature_units": "celsius",
|
||||
"temperature_calibration": 0,
|
||||
"humidity_calibration": 0,
|
||||
"linkquality": 76,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8960,
|
||||
"latest_version": 8960,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/snzb-02d_v2.3.0.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0x8c65a3fffee949aa": {
|
||||
"temperature": 18,
|
||||
"battery": 100,
|
||||
"humidity": 47.4,
|
||||
"comfort_temperature_min": 19,
|
||||
"comfort_temperature_max": 27,
|
||||
"comfort_humidity_min": 40,
|
||||
"comfort_humidity_max": 60,
|
||||
"temperature_units": "celsius",
|
||||
"temperature_calibration": 0,
|
||||
"humidity_calibration": 0,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8960,
|
||||
"latest_version": 8960,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/snzb-02d_v2.3.0.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 120
|
||||
},
|
||||
"0xa4c138a0d4b497e0": {
|
||||
"temperature_unit": "celsius",
|
||||
"temperature": 16.8,
|
||||
"humidity": 48,
|
||||
"battery_state": "high",
|
||||
"linkquality": 72
|
||||
},
|
||||
"0x00158d0001f5636f": {
|
||||
"temperature": 24.47,
|
||||
"humidity": 37.55,
|
||||
"pressure": 1015.9,
|
||||
"voltage": 3005,
|
||||
"battery": 100,
|
||||
"power_outage_count": 5386,
|
||||
"linkquality": 149
|
||||
},
|
||||
"0xc4d8c8fffe49d80d": {
|
||||
"occupancy": false,
|
||||
"battery": 100,
|
||||
"voltage": 2800,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8705,
|
||||
"latest_version": 8705,
|
||||
"latest_source": null,
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"illumination": "bright",
|
||||
"linkquality": 116
|
||||
},
|
||||
"0x00124b00246d8628": {
|
||||
"battery": 99.5,
|
||||
"voltage": 2900,
|
||||
"occupancy": false,
|
||||
"battery_low": false,
|
||||
"linkquality": 112
|
||||
},
|
||||
"0x00158d0002c9572b": {
|
||||
"voltage": 3035,
|
||||
"battery": 100,
|
||||
"device_temperature": 18,
|
||||
"power_outage_count": 1107,
|
||||
"trigger_count": 0,
|
||||
"contact": true,
|
||||
"linkquality": 105
|
||||
},
|
||||
"0x00158d0002e6c64d": {
|
||||
"voltage": 3035,
|
||||
"battery": 100,
|
||||
"device_temperature": 16,
|
||||
"power_outage_count": 33,
|
||||
"trigger_count": 0,
|
||||
"contact": true,
|
||||
"linkquality": 163
|
||||
},
|
||||
"0x00158d0008ad9560": {
|
||||
"voltage": 3095,
|
||||
"battery": 100,
|
||||
"device_temperature": 19,
|
||||
"power_outage_count": 88,
|
||||
"linkquality": 98
|
||||
},
|
||||
"0x44e2f8fffe17a9a7": {
|
||||
"battery": 100,
|
||||
"temperature": 17.6,
|
||||
"humidity": 48.5,
|
||||
"comfort_temperature_min": 19,
|
||||
"comfort_temperature_max": 27,
|
||||
"comfort_humidity_min": 40,
|
||||
"comfort_humidity_max": 60,
|
||||
"temperature_units": "celsius",
|
||||
"temperature_calibration": 0,
|
||||
"humidity_calibration": 0,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8960,
|
||||
"latest_version": 8960,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/snzb-02d_v2.3.0.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 43
|
||||
},
|
||||
"0xc09b9efffec19a44": {
|
||||
"humidity": 44.5,
|
||||
"battery": 100,
|
||||
"temperature": 18.3,
|
||||
"temperature_calibration": 0,
|
||||
"humidity_calibration": 0,
|
||||
"linkquality": 134,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 8704,
|
||||
"latest_version": 8704,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/snzb-02p_v2.2.0.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0x60a423fffe28320f": {
|
||||
"linkquality": 65,
|
||||
"battery": 50
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user