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:
|
use_blueprint:
|
||||||
path: freakshock88/motion_illuminance_activated_entity.yaml
|
path: freakshock88/motion_illuminance_activated_entity.yaml
|
||||||
input:
|
input:
|
||||||
motion_sensor: binary_sensor.beweging_toilet
|
motion_sensor: binary_sensor.beweging_toilet_occupancy
|
||||||
target_entity: light.lamp_toilet
|
target_entity: light.lamp_toilet
|
||||||
no_motion_wait: input_number.beweging_toilet_timer
|
no_motion_wait: input_number.beweging_toilet_timer
|
||||||
- id: '1754287559178'
|
- id: '1754287559178'
|
||||||
@@ -245,7 +245,7 @@
|
|||||||
metadata: {}
|
metadata: {}
|
||||||
data: {}
|
data: {}
|
||||||
target:
|
target:
|
||||||
entity_id: switch.boiler_2
|
entity_id: switch.boiler
|
||||||
- action: switch.turn_on
|
- action: switch.turn_on
|
||||||
metadata: {}
|
metadata: {}
|
||||||
target:
|
target:
|
||||||
@@ -266,13 +266,13 @@
|
|||||||
use_blueprint:
|
use_blueprint:
|
||||||
path: Blackshome/bathroom-humidity-exhaust-fan.yaml
|
path: Blackshome/bathroom-humidity-exhaust-fan.yaml
|
||||||
input:
|
input:
|
||||||
trigger: sensor.badkamer_luchtvochtigheid
|
trigger: sensor.badkamer_vocht_stijging
|
||||||
fan_switch:
|
fan_switch:
|
||||||
device_id: 6e29c3c314df87528f187dbe4eb847d4
|
device_id: 6e29c3c314df87528f187dbe4eb847d4
|
||||||
include_max_humidity: maximum_humidity_enabled
|
include_max_humidity: maximum_humidity_enabled
|
||||||
include_lights: lights_enabled
|
include_lights: lights_enabled
|
||||||
light_switch:
|
light_switch:
|
||||||
device_id: fd928c6d0fd2752492d952a375f9409a
|
entity_id: light.lamp_badkamer
|
||||||
include_manual_fan_switch: disable_manual_fan_switch
|
include_manual_fan_switch: disable_manual_fan_switch
|
||||||
include_automation_link: enable_automation_link
|
include_automation_link: enable_automation_link
|
||||||
automation_link:
|
automation_link:
|
||||||
@@ -295,44 +295,10 @@
|
|||||||
use_blueprint:
|
use_blueprint:
|
||||||
path: freakshock88/motion_illuminance_activated_entity.yaml
|
path: freakshock88/motion_illuminance_activated_entity.yaml
|
||||||
input:
|
input:
|
||||||
motion_sensor: binary_sensor.beweging_badkamer2_bezetting
|
motion_sensor: binary_sensor.beweging_badkamer_occupancy
|
||||||
target_entity: light.lamp_badkamer
|
target_entity: light.lamp_badkamer
|
||||||
no_motion_wait: input_number.badkamer_timer
|
no_motion_wait: input_number.badkamer_timer
|
||||||
turn_off_blocker_entity: input_boolean.in_de_douche
|
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'
|
- id: '1756826045048'
|
||||||
alias: Container reset op 1e van de maand
|
alias: Container reset op 1e van de maand
|
||||||
description: ''
|
description: ''
|
||||||
@@ -361,7 +327,7 @@
|
|||||||
path: Blackshome/sensor-light.yaml
|
path: Blackshome/sensor-light.yaml
|
||||||
input:
|
input:
|
||||||
motion_trigger:
|
motion_trigger:
|
||||||
- binary_sensor.beweging_keuken_bezetting
|
- binary_sensor.beweging_keuken_occupancy
|
||||||
light_switch:
|
light_switch:
|
||||||
entity_id: light.lamp_keuken_main
|
entity_id: light.lamp_keuken_main
|
||||||
include_light_control:
|
include_light_control:
|
||||||
@@ -387,10 +353,10 @@
|
|||||||
night_glow_light_colour_temperature: 2000
|
night_glow_light_colour_temperature: 2000
|
||||||
include_night_glow_light_control:
|
include_night_glow_light_control:
|
||||||
- use_brightness
|
- use_brightness
|
||||||
include_dynamic_lighting: disable_dynamic_lighting
|
include_dynamic_lighting: enable_sun_elevation_colour
|
||||||
dynamic_lighting_min_colour_temp: 2500
|
dynamic_lighting_min_colour_temp: 2500
|
||||||
include_night_lights: night_lights_enabled
|
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'
|
night_lights_after_time: '22:00:00'
|
||||||
dynamic_lighting_max_brightness: 80
|
dynamic_lighting_max_brightness: 80
|
||||||
dynamic_lighting_min_brightness: 42
|
dynamic_lighting_min_brightness: 42
|
||||||
@@ -410,34 +376,6 @@
|
|||||||
dim_before_off_boolean: input_boolean.keuken_dim_helper
|
dim_before_off_boolean: input_boolean.keuken_dim_helper
|
||||||
include_device_tracker: device_tracker_disabled
|
include_device_tracker: device_tracker_disabled
|
||||||
time_delay: 10
|
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'
|
- id: '1759405814831'
|
||||||
alias: schakelaar kids [BP]
|
alias: schakelaar kids [BP]
|
||||||
description: ''
|
description: ''
|
||||||
@@ -523,7 +461,7 @@
|
|||||||
input:
|
input:
|
||||||
primary_input: binary_sensor.slaapkamer_deur_input_0
|
primary_input: binary_sensor.slaapkamer_deur_input_0
|
||||||
secondary_input: binary_sensor.schakelaar_bed_rechts_1
|
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
|
confirm_switch: switch.schakelaars_slaapkamer_deur_confirm
|
||||||
tertiary_input: binary_sensor.schakelaar_bed_links_0
|
tertiary_input: binary_sensor.schakelaar_bed_links_0
|
||||||
- id: '1759752615892'
|
- id: '1759752615892'
|
||||||
@@ -699,7 +637,7 @@
|
|||||||
path: willumpie82/shelly-detached-input3.yaml
|
path: willumpie82/shelly-detached-input3.yaml
|
||||||
input:
|
input:
|
||||||
primary_input: binary_sensor.schakelaar_bed_rechts_0
|
primary_input: binary_sensor.schakelaar_bed_rechts_0
|
||||||
lamp_entity: light.lanp_bed_rechts_dim
|
lamp_entity: light.lamp_bed_rechts_dim
|
||||||
- id: '1764014728235'
|
- id: '1764014728235'
|
||||||
alias: Deurbel notificatie met snapshot
|
alias: Deurbel notificatie met snapshot
|
||||||
description: Stuur een notificatie bij de deurbel met link naar snapshot en deur
|
description: Stuur een notificatie bij de deurbel met link naar snapshot en deur
|
||||||
@@ -803,8 +741,9 @@
|
|||||||
metadata: {}
|
metadata: {}
|
||||||
data: {}
|
data: {}
|
||||||
target:
|
target:
|
||||||
device_id: 3bbf9bc0a07de0f76801fce9366f23fc
|
entity_id:
|
||||||
entity_id: light.lamp_kast
|
- light.lamp_kast
|
||||||
|
- light.lamp_tafel
|
||||||
- action: script.kerst_aan
|
- action: script.kerst_aan
|
||||||
metadata: {}
|
metadata: {}
|
||||||
data: {}
|
data: {}
|
||||||
@@ -950,7 +889,7 @@
|
|||||||
data:
|
data:
|
||||||
brightness_pct: 41
|
brightness_pct: 41
|
||||||
target:
|
target:
|
||||||
entity_id: light.lamp_slaapkamer_2
|
entity_id: light.lamp_slaapkamer
|
||||||
- conditions:
|
- conditions:
|
||||||
- condition: trigger
|
- condition: trigger
|
||||||
id:
|
id:
|
||||||
@@ -961,7 +900,7 @@
|
|||||||
data:
|
data:
|
||||||
brightness_pct: 26
|
brightness_pct: 26
|
||||||
target:
|
target:
|
||||||
entity_id: light.lanp_bed_rechts_dim
|
entity_id: light.lamp_bed_rechts_dim
|
||||||
- conditions:
|
- conditions:
|
||||||
- condition: trigger
|
- condition: trigger
|
||||||
id:
|
id:
|
||||||
@@ -1045,7 +984,7 @@
|
|||||||
data:
|
data:
|
||||||
brightness_pct: 99
|
brightness_pct: 99
|
||||||
target:
|
target:
|
||||||
entity_id: light.lamp_slaapkamer_2
|
entity_id: light.lamp_slaapkamer
|
||||||
- conditions:
|
- conditions:
|
||||||
- condition: trigger
|
- condition: trigger
|
||||||
id:
|
id:
|
||||||
@@ -1056,7 +995,7 @@
|
|||||||
data:
|
data:
|
||||||
brightness_pct: 99
|
brightness_pct: 99
|
||||||
target:
|
target:
|
||||||
entity_id: light.lanp_bed_rechts_dim
|
entity_id: light.lamp_bed_links_dim
|
||||||
- conditions:
|
- conditions:
|
||||||
- condition: trigger
|
- condition: trigger
|
||||||
id:
|
id:
|
||||||
@@ -1172,7 +1111,7 @@
|
|||||||
alias: set woonkamer TRV external temperature
|
alias: set woonkamer TRV external temperature
|
||||||
description: ''
|
description: ''
|
||||||
triggers:
|
triggers:
|
||||||
- entity_id: sensor.temperatuur_woonkamer_temperatuur
|
- entity_id: sensor.temperatuur_woonkamer_temperature
|
||||||
for: 00:00:30
|
for: 00:00:30
|
||||||
trigger: state
|
trigger: state
|
||||||
conditions: []
|
conditions: []
|
||||||
@@ -1180,7 +1119,7 @@
|
|||||||
- target:
|
- target:
|
||||||
entity_id: number.verwarming_woonkamer_blu_external_temperature
|
entity_id: number.verwarming_woonkamer_blu_external_temperature
|
||||||
data:
|
data:
|
||||||
value: '{{ states(''sensor.temperatuur_woonkamer_temperatuur'') | float(20)
|
value: '{{ states(''sensor.temperatuur_woonkamer_temperature'') | float(20)
|
||||||
}}'
|
}}'
|
||||||
action: number.set_value
|
action: number.set_value
|
||||||
mode: single
|
mode: single
|
||||||
@@ -1199,7 +1138,7 @@
|
|||||||
- action: light.toggle
|
- action: light.toggle
|
||||||
metadata: {}
|
metadata: {}
|
||||||
target:
|
target:
|
||||||
entity_id: light.lamp_kantoor_2
|
entity_id: light.lamp_kantoor
|
||||||
data: {}
|
data: {}
|
||||||
mode: single
|
mode: single
|
||||||
- id: '1768681346869'
|
- id: '1768681346869'
|
||||||
@@ -1211,7 +1150,7 @@
|
|||||||
input_mode: button
|
input_mode: button
|
||||||
primary_input: binary_sensor.dsmr_reader_running
|
primary_input: binary_sensor.dsmr_reader_running
|
||||||
shelly_device: 44635828f3e606accd12f83b58ae46b8
|
shelly_device: 44635828f3e606accd12f83b58ae46b8
|
||||||
lamp_entity: light.lamp_kantoor_2
|
lamp_entity: light.lamp_kantoor
|
||||||
confirm_switch: switch.shelly_kantoor_confirm
|
confirm_switch: switch.shelly_kantoor_confirm
|
||||||
- id: '1768902527272'
|
- id: '1768902527272'
|
||||||
alias: Dashboard Willem – bepaal context
|
alias: Dashboard Willem – bepaal context
|
||||||
@@ -1266,7 +1205,7 @@
|
|||||||
- if:
|
- if:
|
||||||
- condition: light.is_on
|
- condition: light.is_on
|
||||||
target:
|
target:
|
||||||
entity_id: light.lamp_kantoor_2
|
entity_id: light.lamp_kantoor
|
||||||
options:
|
options:
|
||||||
behavior: any
|
behavior: any
|
||||||
then:
|
then:
|
||||||
@@ -1307,10 +1246,13 @@
|
|||||||
path: Blackshome/sensor-light.yaml
|
path: Blackshome/sensor-light.yaml
|
||||||
input:
|
input:
|
||||||
motion_trigger:
|
motion_trigger:
|
||||||
- binary_sensor.beweging_keuken
|
- binary_sensor.beweging_keuken_occupancy
|
||||||
light_switch:
|
light_switch:
|
||||||
entity_id: switch.display_keuken_scherm
|
entity_id: script.display_keuken_aan
|
||||||
time_delay: 2
|
time_delay: 10
|
||||||
|
end_scenes:
|
||||||
|
- script.display_keuken_uit
|
||||||
|
boolean_scenes_scripts: input_boolean.display_keuken_toggle_helper
|
||||||
- id: '1771836870389'
|
- id: '1771836870389'
|
||||||
alias: Meshcore - SNR Info Repeater
|
alias: Meshcore - SNR Info Repeater
|
||||||
description: Collect SNR data of the last hop
|
description: Collect SNR data of the last hop
|
||||||
@@ -1407,7 +1349,7 @@
|
|||||||
triggers:
|
triggers:
|
||||||
- trigger: state
|
- trigger: state
|
||||||
entity_id:
|
entity_id:
|
||||||
- binary_sensor.contact_meterkastdeur
|
- binary_sensor.contact_meterkast_contact
|
||||||
from:
|
from:
|
||||||
- 'on'
|
- 'on'
|
||||||
to:
|
to:
|
||||||
@@ -1456,3 +1398,51 @@
|
|||||||
target:
|
target:
|
||||||
entity_id: tts.home_assistant_cloud
|
entity_id: tts.home_assistant_cloud
|
||||||
mode: single
|
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,112 +1,11 @@
|
|||||||
---
|
- sensor:
|
||||||
trigger:
|
|
||||||
platform: time_pattern
|
|
||||||
minutes: "/4"
|
|
||||||
action:
|
|
||||||
- service: weather.get_forecasts
|
|
||||||
data:
|
|
||||||
type: daily
|
|
||||||
target:
|
|
||||||
entity_id: weather.forecast_home
|
|
||||||
response_variable: daily
|
|
||||||
sensor:
|
|
||||||
- name: e-ink Display Data
|
- name: e-ink Display Data
|
||||||
unique_id: e_ink_display_data
|
unique_id: e_ink_display_data
|
||||||
icon: ios:display-2
|
icon: mdi:display-2
|
||||||
state: "OK"
|
state: "OK"
|
||||||
attributes:
|
attributes:
|
||||||
greeting: >
|
greeting: >
|
||||||
{%- if now() > today_at('18:00') %}
|
{%- 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 %}
|
||||||
Good evening
|
|
||||||
{%- elif now() > today_at('12:00') %}
|
|
||||||
Good afternoon
|
|
||||||
{%- elif now() > today_at('5:00') %}
|
|
||||||
Good morning
|
|
||||||
{%- else %}
|
|
||||||
Good night
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
weather_condition_now: >
|
|
||||||
{% set cond_now = states('weather.forecast_home') %}
|
|
||||||
{% if states('sun.sun') == 'below_horizon' %}
|
|
||||||
{% if cond_now == 'sunny' %} night {% elif cond_now == 'partlycloudy' %} night-partly-cloudy {% else %} {{ cond_now }} {% endif %}
|
|
||||||
{% else %}
|
|
||||||
{{ 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') }}
|
|
||||||
|
|
||||||
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: >
|
day_full: >
|
||||||
{% set days = ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag'] %}
|
{% set days = ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag'] %}
|
||||||
@@ -115,3 +14,21 @@ sensor:
|
|||||||
datum: >
|
datum: >
|
||||||
{% set months = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'] %}
|
{% set months = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'] %}
|
||||||
{{ now().day }} {{ months[now().month-1] }} {{ now().year }}
|
{{ now().day }} {{ months[now().month-1] }} {{ now().year }}
|
||||||
|
|
||||||
|
weather_condition_now: >
|
||||||
|
{% set cond_now = states('weather.forecast_home') %}
|
||||||
|
{% if states('sun.sun') == 'below_horizon' %}
|
||||||
|
{% if cond_now == 'sunny' %}night{% elif cond_now == 'partlycloudy' %}night-partly-cloudy{% else %}{{ cond_now }}{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{{ cond_now }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
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 }}
|
||||||
|
|||||||
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
|
logger: !include templates/logger.yaml
|
||||||
btproxy: !include templates/bt_proxy.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:
|
substitutions:
|
||||||
device_name: "hvac-ir-zolder"
|
device_name: "hvac-ir-zolder"
|
||||||
friendly_name: "IR-blaster Woonkamer"
|
friendly_name: "IR-blaster Slaapkamer"
|
||||||
comment: "ESP8266, Tuya-hack, IR"
|
comment: "ESP8266, Tuya-hack, IR"
|
||||||
location: "woonkamer"
|
location: "Slaapkamer"
|
||||||
api_password: !secret hvac_zolder_api
|
api_password: !secret hvac_zolder_api
|
||||||
ota_password: !secret ota_password
|
ota_password: !secret ota_password
|
||||||
wifi_ssid: !secret wifi_ssid
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
|||||||
@@ -13,3 +13,16 @@ remote_receiver:
|
|||||||
# pullup: true
|
# pullup: true
|
||||||
tolerance: 55%
|
tolerance: 55%
|
||||||
dump: all
|
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/
|
# 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
|
name: sfeer
|
||||||
entities:
|
entities:
|
||||||
light.lamp_tafel:
|
light.lamp_tafel:
|
||||||
|
effect_list:
|
||||||
|
- blink
|
||||||
|
- breathe
|
||||||
|
- channel_change
|
||||||
|
- finish_effect
|
||||||
|
- okay
|
||||||
|
- stop_effect
|
||||||
supported_color_modes:
|
supported_color_modes:
|
||||||
- brightness
|
- brightness
|
||||||
|
effect:
|
||||||
color_mode: brightness
|
color_mode: brightness
|
||||||
brightness: 97
|
brightness: 97
|
||||||
entity_id:
|
entity_id:
|
||||||
@@ -11,28 +19,24 @@
|
|||||||
- light.lamp_tafel2
|
- light.lamp_tafel2
|
||||||
icon: mdi:lightbulb-group
|
icon: mdi:lightbulb-group
|
||||||
friendly_name: Lamp Tafel
|
friendly_name: Lamp Tafel
|
||||||
supported_features: 40
|
supported_features: 44
|
||||||
state: 'on'
|
state: 'on'
|
||||||
light.lamp_kast:
|
light.lamp_kast:
|
||||||
|
effect_list:
|
||||||
|
- blink
|
||||||
|
- breathe
|
||||||
|
- okay
|
||||||
|
- channel_change
|
||||||
|
- finish_effect
|
||||||
|
- stop_effect
|
||||||
supported_color_modes:
|
supported_color_modes:
|
||||||
- brightness
|
- brightness
|
||||||
|
effect:
|
||||||
color_mode: brightness
|
color_mode: brightness
|
||||||
brightness: 140
|
brightness: 140
|
||||||
off_with_transition: false
|
|
||||||
off_brightness:
|
|
||||||
friendly_name: lamp kast
|
friendly_name: lamp kast
|
||||||
supported_features: 40
|
supported_features: 44
|
||||||
state: 'on'
|
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:
|
light.ledstok:
|
||||||
effect_list:
|
effect_list:
|
||||||
- Solid
|
- Solid
|
||||||
@@ -240,18 +244,33 @@
|
|||||||
friendly_name: ledstok
|
friendly_name: ledstok
|
||||||
supported_features: 36
|
supported_features: 36
|
||||||
state: 'on'
|
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
|
icon: mdi:floor-lamp
|
||||||
metadata:
|
metadata:
|
||||||
select.kerstboom_voorinstelling:
|
|
||||||
entity_only: true
|
|
||||||
light.ledstok:
|
light.ledstok:
|
||||||
entity_only: true
|
entity_only: true
|
||||||
|
light.zout_lamp:
|
||||||
|
entity_only: true
|
||||||
- id: '1754858015842'
|
- id: '1754858015842'
|
||||||
name: sfeer uit
|
name: sfeer uit
|
||||||
entities:
|
entities:
|
||||||
light.lamp_tafel:
|
light.lamp_tafel:
|
||||||
|
effect_list:
|
||||||
|
- blink
|
||||||
|
- breathe
|
||||||
|
- channel_change
|
||||||
|
- finish_effect
|
||||||
|
- okay
|
||||||
|
- stop_effect
|
||||||
supported_color_modes:
|
supported_color_modes:
|
||||||
- brightness
|
- brightness
|
||||||
|
effect:
|
||||||
color_mode:
|
color_mode:
|
||||||
brightness:
|
brightness:
|
||||||
entity_id:
|
entity_id:
|
||||||
@@ -259,34 +278,250 @@
|
|||||||
- light.lamp_tafel2
|
- light.lamp_tafel2
|
||||||
icon: mdi:lightbulb-group
|
icon: mdi:lightbulb-group
|
||||||
friendly_name: Lamp Tafel
|
friendly_name: Lamp Tafel
|
||||||
supported_features: 40
|
supported_features: 44
|
||||||
state: 'off'
|
state: 'off'
|
||||||
light.lamp_kast:
|
light.lamp_kast:
|
||||||
|
effect_list:
|
||||||
|
- blink
|
||||||
|
- breathe
|
||||||
|
- okay
|
||||||
|
- channel_change
|
||||||
|
- finish_effect
|
||||||
|
- stop_effect
|
||||||
supported_color_modes:
|
supported_color_modes:
|
||||||
- brightness
|
- brightness
|
||||||
|
effect:
|
||||||
color_mode:
|
color_mode:
|
||||||
brightness:
|
brightness:
|
||||||
off_with_transition: false
|
|
||||||
off_brightness: 140
|
|
||||||
friendly_name: lamp kast
|
friendly_name: lamp kast
|
||||||
supported_features: 40
|
supported_features: 44
|
||||||
state: 'off'
|
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:
|
supported_color_modes:
|
||||||
- brightness
|
- brightness
|
||||||
|
effect:
|
||||||
color_mode:
|
color_mode:
|
||||||
brightness:
|
brightness:
|
||||||
off_with_transition: false
|
friendly_name: Lamp Zitkamer
|
||||||
off_brightness: 3
|
supported_features: 44
|
||||||
friendly_name: Lamp Bank
|
|
||||||
supported_features: 40
|
|
||||||
state: 'off'
|
state: 'off'
|
||||||
switch.stopcontact_boven:
|
light.zout_lamp:
|
||||||
|
supported_color_modes:
|
||||||
|
- onoff
|
||||||
|
color_mode:
|
||||||
friendly_name: Zout lamp
|
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'
|
state: 'off'
|
||||||
icon: mdi:floor-lamp-outline
|
icon: mdi:floor-lamp-outline
|
||||||
metadata:
|
metadata:
|
||||||
switch.stopcontact_boven:
|
light.ledstok:
|
||||||
entity_only: true
|
entity_only: true
|
||||||
- id: '1755326563698'
|
- id: '1755326563698'
|
||||||
name: Badkamer dag
|
name: Badkamer dag
|
||||||
@@ -595,7 +830,7 @@
|
|||||||
- id: '1768907183363'
|
- id: '1768907183363'
|
||||||
name: kantoor_werk
|
name: kantoor_werk
|
||||||
entities:
|
entities:
|
||||||
light.lamp_kantoor_2:
|
light.lamp_kantoor:
|
||||||
min_color_temp_kelvin: 2202
|
min_color_temp_kelvin: 2202
|
||||||
max_color_temp_kelvin: 4000
|
max_color_temp_kelvin: 4000
|
||||||
min_mireds: 250
|
min_mireds: 250
|
||||||
@@ -641,7 +876,7 @@
|
|||||||
- id: '1768907224001'
|
- id: '1768907224001'
|
||||||
name: Kantoor Hobby
|
name: Kantoor Hobby
|
||||||
entities:
|
entities:
|
||||||
light.lamp_kantoor_2:
|
light.lamp_kantoor:
|
||||||
min_color_temp_kelvin: 2202
|
min_color_temp_kelvin: 2202
|
||||||
max_color_temp_kelvin: 4000
|
max_color_temp_kelvin: 4000
|
||||||
min_mireds: 250
|
min_mireds: 250
|
||||||
@@ -687,7 +922,7 @@
|
|||||||
- id: '1768907253718'
|
- id: '1768907253718'
|
||||||
name: kantoor Voorlezen
|
name: kantoor Voorlezen
|
||||||
entities:
|
entities:
|
||||||
light.lamp_kantoor_2:
|
light.lamp_kantoor:
|
||||||
min_color_temp_kelvin: 2202
|
min_color_temp_kelvin: 2202
|
||||||
max_color_temp_kelvin: 4000
|
max_color_temp_kelvin: 4000
|
||||||
min_mireds: 250
|
min_mireds: 250
|
||||||
@@ -721,7 +956,7 @@
|
|||||||
- id: '1768907536768'
|
- id: '1768907536768'
|
||||||
name: kantoor uit
|
name: kantoor uit
|
||||||
entities:
|
entities:
|
||||||
light.lamp_kantoor_2:
|
light.lamp_kantoor:
|
||||||
min_color_temp_kelvin: 2202
|
min_color_temp_kelvin: 2202
|
||||||
max_color_temp_kelvin: 4000
|
max_color_temp_kelvin: 4000
|
||||||
min_mireds: 250
|
min_mireds: 250
|
||||||
@@ -746,9 +981,7 @@
|
|||||||
- heat
|
- heat
|
||||||
min_temp: 5
|
min_temp: 5
|
||||||
max_temp: 30
|
max_temp: 30
|
||||||
current_temperature: 17.6
|
temperature: 13
|
||||||
temperature: 18
|
|
||||||
current_humidity: 43.84
|
|
||||||
friendly_name: Thermostaat kantoor
|
friendly_name: Thermostaat kantoor
|
||||||
supported_features: 385
|
supported_features: 385
|
||||||
state: heat
|
state: heat
|
||||||
@@ -766,8 +999,16 @@
|
|||||||
name: Woonkamer overdag
|
name: Woonkamer overdag
|
||||||
entities:
|
entities:
|
||||||
light.lamp_tafel:
|
light.lamp_tafel:
|
||||||
|
effect_list:
|
||||||
|
- blink
|
||||||
|
- breathe
|
||||||
|
- channel_change
|
||||||
|
- finish_effect
|
||||||
|
- okay
|
||||||
|
- stop_effect
|
||||||
supported_color_modes:
|
supported_color_modes:
|
||||||
- brightness
|
- brightness
|
||||||
|
effect:
|
||||||
color_mode: brightness
|
color_mode: brightness
|
||||||
brightness: 254
|
brightness: 254
|
||||||
entity_id:
|
entity_id:
|
||||||
@@ -775,20 +1016,23 @@
|
|||||||
- light.lamp_tafel2
|
- light.lamp_tafel2
|
||||||
icon: mdi:lightbulb-group
|
icon: mdi:lightbulb-group
|
||||||
friendly_name: Lamp Tafel
|
friendly_name: Lamp Tafel
|
||||||
supported_features: 40
|
supported_features: 44
|
||||||
state: 'on'
|
state: 'on'
|
||||||
light.lamp_kast:
|
light.lamp_kast:
|
||||||
|
effect_list:
|
||||||
|
- blink
|
||||||
|
- breathe
|
||||||
|
- okay
|
||||||
|
- channel_change
|
||||||
|
- finish_effect
|
||||||
|
- stop_effect
|
||||||
supported_color_modes:
|
supported_color_modes:
|
||||||
- brightness
|
- brightness
|
||||||
|
effect:
|
||||||
color_mode: brightness
|
color_mode: brightness
|
||||||
brightness: 140
|
brightness: 140
|
||||||
off_with_transition: false
|
|
||||||
off_brightness:
|
|
||||||
friendly_name: lamp kast
|
friendly_name: lamp kast
|
||||||
supported_features: 40
|
supported_features: 44
|
||||||
state: 'on'
|
|
||||||
switch.stopcontact_boven:
|
|
||||||
friendly_name: Zout lamp
|
|
||||||
state: 'on'
|
state: 'on'
|
||||||
light.ledstok:
|
light.ledstok:
|
||||||
effect_list:
|
effect_list:
|
||||||
@@ -990,7 +1234,16 @@
|
|||||||
friendly_name: ledstok
|
friendly_name: ledstok
|
||||||
supported_features: 36
|
supported_features: 36
|
||||||
state: 'off'
|
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
|
icon: mdi:floor-lamp
|
||||||
metadata:
|
metadata:
|
||||||
light.ledstok:
|
light.ledstok:
|
||||||
entity_only: true
|
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
|
- action: switch.turn_off
|
||||||
metadata: {}
|
metadata: {}
|
||||||
target:
|
target:
|
||||||
entity_id: switch.boiler_2
|
entity_id: switch.boiler
|
||||||
data: {}
|
data: {}
|
||||||
alias: Boiler uit
|
alias: Boiler uit
|
||||||
- action: climate.set_temperature
|
- action: climate.set_temperature
|
||||||
@@ -652,10 +652,10 @@ keuken_alles_uit:
|
|||||||
- light.lamp_keuken_main
|
- light.lamp_keuken_main
|
||||||
- light.lamp_toilet
|
- light.lamp_toilet
|
||||||
data: {}
|
data: {}
|
||||||
- action: switch.turn_off
|
- action: switch.turn_on
|
||||||
metadata: {}
|
metadata: {}
|
||||||
target:
|
target:
|
||||||
entity_id: switch.display_keuken_scherm
|
entity_id: switch.display_keuken_screensaver
|
||||||
data: {}
|
data: {}
|
||||||
alias: Alles uit - Keuken
|
alias: Alles uit - Keuken
|
||||||
description: ''
|
description: ''
|
||||||
@@ -666,9 +666,9 @@ slaapkamer_alles_uit:
|
|||||||
metadata: {}
|
metadata: {}
|
||||||
target:
|
target:
|
||||||
entity_id:
|
entity_id:
|
||||||
- light.lamp_slaapkamer_2
|
- light.lamp_slaapkamer
|
||||||
- light.lamp_bed_links_dim
|
- light.lamp_bed_links_dim
|
||||||
- light.lanp_bed_rechts_dim
|
- light.lamp_bed_rechts_dim
|
||||||
data: {}
|
data: {}
|
||||||
- action: climate.set_temperature
|
- action: climate.set_temperature
|
||||||
metadata: {}
|
metadata: {}
|
||||||
@@ -689,8 +689,8 @@ woonkamer_alles_uit:
|
|||||||
target:
|
target:
|
||||||
entity_id:
|
entity_id:
|
||||||
- light.lamp_kast
|
- light.lamp_kast
|
||||||
- light.ikea_of_sweden_tradfri_bulb_e27_ww_clear_250lm
|
- light.lamp_bank
|
||||||
- light.ikea_of_sweden_stoftmoln_ceiling_wall_lamp_ww37
|
- light.lamp_zitkamer
|
||||||
- light.lamp_tafel
|
- light.lamp_tafel
|
||||||
- light.lamp_tafel_sfeer
|
- light.lamp_tafel_sfeer
|
||||||
- light.zout_lamp
|
- light.zout_lamp
|
||||||
@@ -746,7 +746,7 @@ alles_uit_kantoor:
|
|||||||
- action: light.turn_off
|
- action: light.turn_off
|
||||||
metadata: {}
|
metadata: {}
|
||||||
target:
|
target:
|
||||||
entity_id: light.lamp_kantoor_2
|
entity_id: light.lamp_kantoor
|
||||||
data: {}
|
data: {}
|
||||||
- action: climate.set_temperature
|
- action: climate.set_temperature
|
||||||
metadata: {}
|
metadata: {}
|
||||||
@@ -961,7 +961,7 @@ film_kijken:
|
|||||||
metadata: {}
|
metadata: {}
|
||||||
data: {}
|
data: {}
|
||||||
target:
|
target:
|
||||||
device_id: a421097cef9b325efb84ae7009ff87be
|
entity_id: light.lamp_kast_slaapkamer
|
||||||
alias: Film kijken
|
alias: Film kijken
|
||||||
description: ''
|
description: ''
|
||||||
slapen_slaapkamer_willem:
|
slapen_slaapkamer_willem:
|
||||||
@@ -1005,3 +1005,27 @@ alles_uit_slaapkamer_kids:
|
|||||||
alias: Alles uit - Slaapkamer kids
|
alias: Alles uit - Slaapkamer kids
|
||||||
description: ''
|
description: ''
|
||||||
icon: mdi:bed-outline
|
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:
|
homeassistant:
|
||||||
enabled: true
|
enabled: true
|
||||||
advanced:
|
advanced:
|
||||||
pan_id: 0x0C56
|
pan_id: 3158
|
||||||
ext_pan_id: [0x4b, 0xcf, 0x12, 0x33, 0xab, 0x93, 0x4c, 0x57]
|
ext_pan_id:
|
||||||
|
- 75
|
||||||
|
- 207
|
||||||
|
- 18
|
||||||
|
- 51
|
||||||
|
- 171
|
||||||
|
- 147
|
||||||
|
- 76
|
||||||
|
- 87
|
||||||
channel: 25
|
channel: 25
|
||||||
network_key:
|
network_key:
|
||||||
[
|
- 21
|
||||||
0x15,
|
- 107
|
||||||
0x6b,
|
- 4
|
||||||
0x04,
|
- 84
|
||||||
0x54,
|
- 251
|
||||||
0xfb,
|
- 200
|
||||||
0xc8,
|
- 108
|
||||||
0x6c,
|
- 138
|
||||||
0x8a,
|
- 165
|
||||||
0xa5,
|
- 109
|
||||||
0x6d,
|
- 6
|
||||||
0x06,
|
- 148
|
||||||
0x94,
|
- 218
|
||||||
0xda,
|
- 8
|
||||||
0x08,
|
- 117
|
||||||
0x75,
|
- 140
|
||||||
0x8c,
|
|
||||||
]
|
|
||||||
devices: devices.yaml
|
devices: devices.yaml
|
||||||
|
|||||||
@@ -2,231 +2,431 @@
|
|||||||
"metadata": {
|
"metadata": {
|
||||||
"format": "zigpy/open-coordinator-backup",
|
"format": "zigpy/open-coordinator-backup",
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"source": "zigbee-herdsman@9.0.9",
|
"source": "zigbee-herdsman@10.0.5",
|
||||||
"internal": {
|
"internal": {
|
||||||
"date": "2026-03-25T10:25:03.325Z",
|
"date": "2026-04-02T12:18:16.206Z",
|
||||||
"znpVersion": 1
|
"znpVersion": 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stack_specific": {
|
"stack_specific": {
|
||||||
"zstack": {
|
"zstack": {
|
||||||
"tclk_seed": "eaf31b5477d32c2201c671e9789882de"
|
"tclk_seed": "8615f9a0ceb9bbf9a842c8eba303cefc"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"coordinator_ieee": "00124b0028d2e01a",
|
"coordinator_ieee": "00124b0028d2e01a",
|
||||||
"pan_id": "eed0",
|
"pan_id": "c56",
|
||||||
"extended_pan_id": "679240887e1aab54",
|
"extended_pan_id": "574c93ab3312cf4b",
|
||||||
"nwk_update_id": 0,
|
"nwk_update_id": 0,
|
||||||
"security_level": 5,
|
"security_level": 5,
|
||||||
"channel": 11,
|
"channel": 25,
|
||||||
"channel_mask": [
|
"channel_mask": [
|
||||||
11
|
25
|
||||||
],
|
],
|
||||||
"network_key": {
|
"network_key": {
|
||||||
"key": "2fe2b61879185b4522e88d0a54f1314c",
|
"key": "156b0454fbc86c8aa56d0694da08758c",
|
||||||
"sequence_number": 0,
|
"sequence_number": 0,
|
||||||
"frame_counter": 1
|
"frame_counter": 6969265
|
||||||
},
|
},
|
||||||
"devices": [
|
"devices": [
|
||||||
{
|
{
|
||||||
"nwk_address": "5d05",
|
"nwk_address": "3b41",
|
||||||
"ieee_address": "44e2f8fffe0fb2fa",
|
"ieee_address": "4c5bb3fffea0e207",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
|
"link_key": {
|
||||||
|
"key": "121b00304608a2e4452a4b5dfc7da7ca",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 3278
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "e8f0",
|
"nwk_address": "9f2e",
|
||||||
"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",
|
|
||||||
"ieee_address": "c4d8c8fffe49d80d",
|
"ieee_address": "c4d8c8fffe49d80d",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
},
|
"link_key": {
|
||||||
{
|
"key": "a59a81155ccb16388bcdb05e3171633d",
|
||||||
"nwk_address": "b3b3",
|
"rx_counter": 0,
|
||||||
"ieee_address": "c4d8c8fffe49da86",
|
"tx_counter": 0
|
||||||
"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
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "22cc",
|
"nwk_address": "22cc",
|
||||||
"ieee_address": "54dce9fffea96e29",
|
"ieee_address": "54dce9fffea96e29",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
|
"link_key": {
|
||||||
|
"key": "e7d7120757ab14bf8a6d670279fc25f4",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 3322
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "3b41",
|
"nwk_address": "e51d",
|
||||||
"ieee_address": "4c5bb3fffea0e207",
|
"ieee_address": "00158d0002c9572b",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
|
"link_key": {
|
||||||
|
"key": "e5ee72fba8cfddeb885407fe8698eca0",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 0
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "3a90",
|
"nwk_address": "668b",
|
||||||
"ieee_address": "f84477fffe5326ce",
|
"ieee_address": "c09b9efffec19a44",
|
||||||
"is_child": false
|
"is_child": true,
|
||||||
|
"link_key": {
|
||||||
|
"key": "06522a5dfc5067465163613046256268",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 0
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "200b",
|
"nwk_address": "4bf",
|
||||||
"ieee_address": "f84477fffe8122ed",
|
"ieee_address": "8c8b48fffe34e945",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
|
"link_key": {
|
||||||
|
"key": "4627c878eab12b42fc52cd56bd80602f",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 3487
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "6877",
|
"nwk_address": "49e3",
|
||||||
"ieee_address": "a4c138a0d4b497e0",
|
"ieee_address": "00158d000450bc4d",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
|
"link_key": {
|
||||||
|
"key": "8557f307ce719315b41c9ebdbb74bd42",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 3806
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "b60e",
|
"nwk_address": "faca",
|
||||||
"ieee_address": "d44867fffe2942ba",
|
"ieee_address": "00158d0002e6c64d",
|
||||||
"is_child": false
|
"is_child": true,
|
||||||
|
"link_key": {
|
||||||
|
"key": "b46ea4caeb2e16ceb140f3fba043acbb",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 0
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "9c2b",
|
"nwk_address": "2a4f",
|
||||||
"ieee_address": "847127fffeb4d4f3",
|
"ieee_address": "90ab96fffe99035d",
|
||||||
"is_child": false
|
"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",
|
"nwk_address": "ffac",
|
||||||
"ieee_address": "804b50fffe80a266",
|
"ieee_address": "804b50fffe80a266",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
},
|
"link_key": {
|
||||||
{
|
"key": "9f024e4744a9e3c2ae4923fd31accd95",
|
||||||
"nwk_address": "cd72",
|
"rx_counter": 0,
|
||||||
"ieee_address": "70c59cfffe2091be",
|
"tx_counter": 1694
|
||||||
"is_child": false
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"nwk_address": "2b2a",
|
|
||||||
"ieee_address": "781c9dfffee7289f",
|
|
||||||
"is_child": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "ef11",
|
"nwk_address": "ef11",
|
||||||
"ieee_address": "348d13fffecd5d71",
|
"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",
|
"nwk_address": "f83f",
|
||||||
"ieee_address": "c02cedfffe2b4ebb",
|
"ieee_address": "c02cedfffe2b4ebb",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
|
"link_key": {
|
||||||
|
"key": "75f7900757afe42b184de50279f8d560",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 1243
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "41a0",
|
"nwk_address": "cd72",
|
||||||
"ieee_address": "54ef441001422124",
|
"ieee_address": "70c59cfffe2091be",
|
||||||
"is_child": false
|
"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",
|
"nwk_address": "1760",
|
||||||
"ieee_address": "bc33acfffe1a21da",
|
"ieee_address": "bc33acfffe1a21da",
|
||||||
"is_child": false
|
"is_child": false,
|
||||||
|
"link_key": {
|
||||||
|
"key": "d9efe678ea559372639ae356bd64d81f",
|
||||||
|
"rx_counter": 0,
|
||||||
|
"tx_counter": 792
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nwk_address": "10c7",
|
"nwk_address": "2d59",
|
||||||
"ieee_address": "8c65a3fffee949aa",
|
"ieee_address": "c02cedfffe21a3e3",
|
||||||
"is_child": false
|
"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",
|
"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":
|
'0x00124b0028d2e01a':
|
||||||
friendly_name: "Zigbee Meterkast"
|
friendly_name: Zigbee Meterkast
|
||||||
"0x00124b002e132f65":
|
'0x00124b002e132f65':
|
||||||
friendly_name: "Texas Instruments Coordinator"
|
friendly_name: Texas Instruments Coordinator
|
||||||
"0x90ab96fffe99035d":
|
'0x90ab96fffe99035d':
|
||||||
friendly_name: "aqs woonkamer"
|
friendly_name: aqs woonkamer
|
||||||
"0x44e2f8fffe17a9a7":
|
'0x70c59cfffe2091be':
|
||||||
friendly_name: "Temperatuur Keuken"
|
friendly_name: Lamp Zitkamer
|
||||||
"0x70c59cfffe2091be":
|
'0xbc33acfffe1a21da':
|
||||||
friendly_name: "Lamp Zitkamer"
|
friendly_name: Lamp Bank
|
||||||
"0xbc33acfffe1a21da":
|
'0x1c34f1fffeac6a84':
|
||||||
friendly_name: "Lamp Bank"
|
friendly_name: Lamp meterkast
|
||||||
"0x1c34f1fffeac6a84":
|
'0x44e2f8fffe0fb2fa':
|
||||||
friendly_name: "Lamp meterkast"
|
friendly_name: Temperatuur badkamer
|
||||||
"0x44e2f8fffe0fb2fa":
|
'0x00158d0001f5636f':
|
||||||
friendly_name: "Temperatuur badkamer"
|
friendly_name: Temperatuur meterkast
|
||||||
"0x804b50fffe80a266":
|
'0x804b50fffe80a266':
|
||||||
friendly_name: "Lamp kast slaapkamer"
|
friendly_name: Lamp kast slaapkamer
|
||||||
"0x00124b00246d8628":
|
'0x000b57fffe3296f5':
|
||||||
friendly_name: "Beweging toilet"
|
friendly_name: Lamp toilet
|
||||||
"0x000b57fffe3296f5":
|
'0xc02cedfffe2b4ebb':
|
||||||
friendly_name: "Lamp toilet"
|
friendly_name: lamp tafel sfeer
|
||||||
"0xc02cedfffe2b4ebb":
|
'0x847127fffeb4d4f3':
|
||||||
friendly_name: "lamp tafel sfeer"
|
friendly_name: Zout lamp
|
||||||
"0x847127fffeb4d4f3":
|
'0xc02cedfffe0e7804':
|
||||||
friendly_name: "Zout lamp"
|
friendly_name: Lamp badkamer
|
||||||
"0xc02cedfffe0e7804":
|
'0x0c2a6ffffe64a7f5':
|
||||||
friendly_name: "Lamp badkamer"
|
friendly_name: Lamp tafel1
|
||||||
"0x00158d0002e6c64d":
|
'0xf84477fffef97efd':
|
||||||
friendly_name: "Contact Balkondeur"
|
friendly_name: Lamp tafel2
|
||||||
"0x00158d0002c9572b":
|
'0xc4d8c8fffe49da86':
|
||||||
friendly_name: "Contact Voordeur"
|
friendly_name: Beweging badkamer
|
||||||
"0x0c2a6ffffe64a7f5":
|
'0x54ef4410011728d1':
|
||||||
friendly_name: "Lamp tafel1"
|
friendly_name: Lamp Keuken
|
||||||
"0xf84477fffef97efd":
|
'0xa4c13802af2affff':
|
||||||
friendly_name: "Lamp tafel2"
|
friendly_name: Stopcontact Aquahot
|
||||||
"0x00158d00023783a0":
|
'0xbc8d7efffe6522d5':
|
||||||
friendly_name: "Temperatuur 3D printer"
|
friendly_name: Stopcontact Koelkast
|
||||||
"0x00158d0008ad9560":
|
'0x8c8b48fffe34e945':
|
||||||
friendly_name: "Button Voordeur"
|
friendly_name: lamp kast
|
||||||
"0xc4d8c8fffe49d80d":
|
'0x54dce9fffead96ad':
|
||||||
friendly_name: "Beweging keuken"
|
friendly_name: Stopcontact Oven
|
||||||
"0xc4d8c8fffe49da86":
|
'0x781c9dfffe7899af':
|
||||||
friendly_name: "Beweging badkamer"
|
friendly_name: Lamp slaapkamer
|
||||||
"0x54ef4410011728d1":
|
'0xc02cedfffe21a3e3':
|
||||||
friendly_name: "Lamp Keuken"
|
friendly_name: Lamp slaapkamer kids
|
||||||
"0xa4c13802af2affff":
|
'0x54dce9fffea96e29':
|
||||||
friendly_name: "Stopcontact Aquahot"
|
friendly_name: Boiler
|
||||||
"0xbc8d7efffe6522d5":
|
'0xf84477fffe5326ce':
|
||||||
friendly_name: "Stopcontact Koelkast"
|
friendly_name: Lamp bed links dim
|
||||||
"0x8c8b48fffe34e945":
|
'0xf84477fffe8122ed':
|
||||||
friendly_name: "lamp kast"
|
friendly_name: Lamp bed rechts dim
|
||||||
"0x54dce9fffead96ad":
|
'0xd44867fffe2942ba':
|
||||||
friendly_name: "Stopcontact Oven"
|
friendly_name: Temperatuur slaapkamer kids
|
||||||
"0x781c9dfffe7899af":
|
'0x348d13fffecd5d71':
|
||||||
friendly_name: "Lamp slaapkamer"
|
friendly_name: Lamp kantoor
|
||||||
"0xc02cedfffe21a3e3":
|
'0xc4d8c8fffe045efe':
|
||||||
friendly_name: "Lamp slaapkamer kids"
|
friendly_name: Contact meterkast
|
||||||
"0x54dce9fffea96e29":
|
'0x54ef441001422124':
|
||||||
friendly_name: "stopcontact Boiler"
|
friendly_name: Thermostaat Keuken
|
||||||
"0x4c5bb3fffea0e207":
|
'0x8c65a3fffee949aa':
|
||||||
friendly_name: "IKEA of Sweden RODRET Dimmer"
|
friendly_name: temperatuur kantoor
|
||||||
"0xf84477fffe5326ce":
|
'0xa4c138a0d4b497e0':
|
||||||
friendly_name: "Lamp bed links dim"
|
friendly_name: Temperatuur slaapkamer
|
||||||
"0xf84477fffe8122ed":
|
'0xc4d8c8fffe49d80d':
|
||||||
friendly_name: "Lamp bed rechts dim"
|
friendly_name: Beweging Keuken
|
||||||
"0xc09b9efffec19a44":
|
'0x00124b00246d8628':
|
||||||
friendly_name: "Temperatuur woonkamer"
|
friendly_name: Beweging toilet
|
||||||
# '0xd44867fffe2942ba':
|
'0x00158d0002c9572b':
|
||||||
# friendly_name: 'Temperatuur kantoor'
|
friendly_name: Contact Voordeur
|
||||||
"0x781c9dfffee7289f":
|
'0x00158d0002e6c64d':
|
||||||
friendly_name: "Lamp"
|
friendly_name: contact balkondeur
|
||||||
"0x348d13fffecd5d71":
|
'0x00158d0008ad9560':
|
||||||
friendly_name: "Lamp kantoor"
|
friendly_name: Button voordeur
|
||||||
# '0x8c65a3fffee949aa':
|
'0x44e2f8fffe17a9a7':
|
||||||
# friendly_name: 'Temperatuur slaapkamer kids'
|
friendly_name: Temperatuur keuken
|
||||||
"0xa4c138151c812a2e":
|
'0xc09b9efffec19a44':
|
||||||
friendly_name: "Temperatuur slaapkamer kids"
|
friendly_name: Temperatuur woonkamer
|
||||||
"0xc4d8c8fffe045efe":
|
'0x60a423fffe28320f':
|
||||||
friendly_name: "Contact meterkastdeur"
|
friendly_name: schakelaar keuken
|
||||||
"0xa4c138a0d4b497e0":
|
|
||||||
friendly_name: "Temperatuur kantoor"
|
|
||||||
|
|||||||
@@ -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