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:
2026-04-03 00:39:43 +02:00
parent 17883d85d9
commit bdbeec27aa
28 changed files with 6459 additions and 89839 deletions

View File

@@ -1 +1 @@
2026.3.3
2026.3.4

View File

@@ -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}

View File

@@ -174,7 +174,7 @@
use_blueprint:
path: freakshock88/motion_illuminance_activated_entity.yaml
input:
motion_sensor: binary_sensor.beweging_toilet
motion_sensor: binary_sensor.beweging_toilet_occupancy
target_entity: light.lamp_toilet
no_motion_wait: input_number.beweging_toilet_timer
- id: '1754287559178'
@@ -245,7 +245,7 @@
metadata: {}
data: {}
target:
entity_id: switch.boiler_2
entity_id: switch.boiler
- action: switch.turn_on
metadata: {}
target:
@@ -266,13 +266,13 @@
use_blueprint:
path: Blackshome/bathroom-humidity-exhaust-fan.yaml
input:
trigger: sensor.badkamer_luchtvochtigheid
trigger: sensor.badkamer_vocht_stijging
fan_switch:
device_id: 6e29c3c314df87528f187dbe4eb847d4
include_max_humidity: maximum_humidity_enabled
include_lights: lights_enabled
light_switch:
device_id: fd928c6d0fd2752492d952a375f9409a
entity_id: light.lamp_badkamer
include_manual_fan_switch: disable_manual_fan_switch
include_automation_link: enable_automation_link
automation_link:
@@ -295,44 +295,10 @@
use_blueprint:
path: freakshock88/motion_illuminance_activated_entity.yaml
input:
motion_sensor: binary_sensor.beweging_badkamer2_bezetting
motion_sensor: binary_sensor.beweging_badkamer_occupancy
target_entity: light.lamp_badkamer
no_motion_wait: input_number.badkamer_timer
turn_off_blocker_entity: input_boolean.in_de_douche
- id: '1756728579666'
alias: Button Open voordeur
description: ''
triggers:
- device_id: 0ccc5ec3c7c93aa278e95a47b9d56830
domain: zha
type: remote_button_double_press
subtype: remote_button_double_press
trigger: device
conditions: []
actions:
- if:
- condition: device
device_id: ead52fdd2817e1e0d5c981e717e3bf63
domain: lock
entity_id: 21ed9e61c7b8e284fe8e5ea9f30c1136
type: is_locked
then:
- action: lock.unlock
metadata: {}
data: {}
target:
device_id: ead52fdd2817e1e0d5c981e717e3bf63
alias: Unlock when locked
- action: lock.open
metadata: {}
data: {}
target:
device_id: ead52fdd2817e1e0d5c981e717e3bf63
- action: notify.mobile_app_iphone_van_willem
metadata: {}
data:
message: Voordeur is open
mode: single
- id: '1756826045048'
alias: Container reset op 1e van de maand
description: ''
@@ -361,7 +327,7 @@
path: Blackshome/sensor-light.yaml
input:
motion_trigger:
- binary_sensor.beweging_keuken_bezetting
- binary_sensor.beweging_keuken_occupancy
light_switch:
entity_id: light.lamp_keuken_main
include_light_control:
@@ -387,10 +353,10 @@
night_glow_light_colour_temperature: 2000
include_night_glow_light_control:
- use_brightness
include_dynamic_lighting: disable_dynamic_lighting
include_dynamic_lighting: enable_sun_elevation_colour
dynamic_lighting_min_colour_temp: 2500
include_night_lights: night_lights_enabled
dynamic_lighting_max_colour_temp: 4200
dynamic_lighting_max_colour_temp: 5000
night_lights_after_time: '22:00:00'
dynamic_lighting_max_brightness: 80
dynamic_lighting_min_brightness: 42
@@ -410,34 +376,6 @@
dim_before_off_boolean: input_boolean.keuken_dim_helper
include_device_tracker: device_tracker_disabled
time_delay: 10
- id: '1758800846641'
alias: Voordeur ontgrendelen met RFID
description: ''
triggers:
- tag_id: 04-DA-AF-A2-C0-16-90
trigger: tag
- tag_id: 7D-98-B0-99
trigger: tag
actions:
- target:
entity_id: lock.voordeur
action: lock.open
data: {}
enabled: true
- action: light.toggle
metadata: {}
data: {}
target:
entity_id: light.lamp_kast
enabled: false
- action: tts.speak
metadata: {}
data:
cache: true
message: toegang toegestaan, de deur gaat nu open
media_player_entity_id: media_player.esphome_web_0c8784_speaker_media_player
target:
device_id: ff2155e96d61ed2a7f60183d5e67eb62
- id: '1759405814831'
alias: schakelaar kids [BP]
description: ''
@@ -523,7 +461,7 @@
input:
primary_input: binary_sensor.slaapkamer_deur_input_0
secondary_input: binary_sensor.schakelaar_bed_rechts_1
lamp_entity: light.lamp_slaapkamer_2
lamp_entity: light.lamp_slaapkamer
confirm_switch: switch.schakelaars_slaapkamer_deur_confirm
tertiary_input: binary_sensor.schakelaar_bed_links_0
- id: '1759752615892'
@@ -699,7 +637,7 @@
path: willumpie82/shelly-detached-input3.yaml
input:
primary_input: binary_sensor.schakelaar_bed_rechts_0
lamp_entity: light.lanp_bed_rechts_dim
lamp_entity: light.lamp_bed_rechts_dim
- id: '1764014728235'
alias: Deurbel notificatie met snapshot
description: Stuur een notificatie bij de deurbel met link naar snapshot en deur
@@ -803,8 +741,9 @@
metadata: {}
data: {}
target:
device_id: 3bbf9bc0a07de0f76801fce9366f23fc
entity_id: light.lamp_kast
entity_id:
- light.lamp_kast
- light.lamp_tafel
- action: script.kerst_aan
metadata: {}
data: {}
@@ -950,7 +889,7 @@
data:
brightness_pct: 41
target:
entity_id: light.lamp_slaapkamer_2
entity_id: light.lamp_slaapkamer
- conditions:
- condition: trigger
id:
@@ -961,7 +900,7 @@
data:
brightness_pct: 26
target:
entity_id: light.lanp_bed_rechts_dim
entity_id: light.lamp_bed_rechts_dim
- conditions:
- condition: trigger
id:
@@ -1045,7 +984,7 @@
data:
brightness_pct: 99
target:
entity_id: light.lamp_slaapkamer_2
entity_id: light.lamp_slaapkamer
- conditions:
- condition: trigger
id:
@@ -1056,7 +995,7 @@
data:
brightness_pct: 99
target:
entity_id: light.lanp_bed_rechts_dim
entity_id: light.lamp_bed_links_dim
- conditions:
- condition: trigger
id:
@@ -1172,7 +1111,7 @@
alias: set woonkamer TRV external temperature
description: ''
triggers:
- entity_id: sensor.temperatuur_woonkamer_temperatuur
- entity_id: sensor.temperatuur_woonkamer_temperature
for: 00:00:30
trigger: state
conditions: []
@@ -1180,7 +1119,7 @@
- target:
entity_id: number.verwarming_woonkamer_blu_external_temperature
data:
value: '{{ states(''sensor.temperatuur_woonkamer_temperatuur'') | float(20)
value: '{{ states(''sensor.temperatuur_woonkamer_temperature'') | float(20)
}}'
action: number.set_value
mode: single
@@ -1199,7 +1138,7 @@
- action: light.toggle
metadata: {}
target:
entity_id: light.lamp_kantoor_2
entity_id: light.lamp_kantoor
data: {}
mode: single
- id: '1768681346869'
@@ -1211,7 +1150,7 @@
input_mode: button
primary_input: binary_sensor.dsmr_reader_running
shelly_device: 44635828f3e606accd12f83b58ae46b8
lamp_entity: light.lamp_kantoor_2
lamp_entity: light.lamp_kantoor
confirm_switch: switch.shelly_kantoor_confirm
- id: '1768902527272'
alias: Dashboard Willem bepaal context
@@ -1266,7 +1205,7 @@
- if:
- condition: light.is_on
target:
entity_id: light.lamp_kantoor_2
entity_id: light.lamp_kantoor
options:
behavior: any
then:
@@ -1307,10 +1246,13 @@
path: Blackshome/sensor-light.yaml
input:
motion_trigger:
- binary_sensor.beweging_keuken
- binary_sensor.beweging_keuken_occupancy
light_switch:
entity_id: switch.display_keuken_scherm
time_delay: 2
entity_id: script.display_keuken_aan
time_delay: 10
end_scenes:
- script.display_keuken_uit
boolean_scenes_scripts: input_boolean.display_keuken_toggle_helper
- id: '1771836870389'
alias: Meshcore - SNR Info Repeater
description: Collect SNR data of the last hop
@@ -1407,7 +1349,7 @@
triggers:
- trigger: state
entity_id:
- binary_sensor.contact_meterkastdeur
- binary_sensor.contact_meterkast_contact
from:
- 'on'
to:
@@ -1456,3 +1398,51 @@
target:
entity_id: tts.home_assistant_cloud
mode: single
- id: '1774731088637'
alias: Slimme plant waarschuwing - Pannenkoekenplant
description: Geeft gerichte meldingen (water/licht/voeding)
triggers:
- entity_id: plant.pannenkoekenplant
from: ok
to: problem
for: 00:05:00
trigger: state
conditions:
- condition: template
value_template: "{{ \n state_attr('plant.pannenkoekenplant', 'moisture') not
in [None, 'unknown'] and\n state_attr('plant.pannenkoekenplant', 'conductivity')
not in [None, 'unknown'] and\n state_attr('plant.pannenkoekenplant', 'illuminance')
not in [None, 'unknown']\n}}\n"
actions:
- variables:
moisture: '{{ state_attr(''plant.pannenkoekenplant'', ''moisture'') | float(0)
}}'
conductivity: '{{ state_attr(''plant.pannenkoekenplant'', ''conductivity'')
| float(0) }}'
illuminance: '{{ state_attr(''plant.pannenkoekenplant'', ''illuminance'') |
float(0) }}'
- data:
title: "\U0001F331 Pannenkoekenplant heeft hulp nodig"
message: "{% set msg = [] %}\n{# DREMPELS - pas aan naar jouw plant! #} {% if
moisture < 20 %}\n {% set msg = msg + ['\U0001F4A7 Heeft water nodig'] %}\n{%
elif moisture > 80 %}\n {% set msg = msg + ['\U0001F6AB Te nat'] %}\n{% endif
%}\n{% if conductivity < 300 %}\n {% set msg = msg + ['\U0001F9EA Voeding
nodig'] %}\n{% elif conductivity > 2000 %}\n {% set msg = msg + ['⚠️ Te veel
voeding'] %}\n{% endif %}\n{% if illuminance < 1000 %}\n {% set msg = msg
+ ['☀️ Meer licht nodig'] %}\n{% elif illuminance > 30000 %}\n {% set msg
= msg + ['\U0001F324 Te veel zonlicht'] %}\n{% endif %}\n{% if msg | length
== 0 %}\n {% set msg = ['⚠️ Controleer plant'] %}\n{% endif %}\nActie: {{
msg | join('\\n') }}\n--- Waarden: \U0001F4A7 Vocht: {{ moisture }}% ☀️ Licht:
{{ illuminance }} lx \U0001F9EA Voeding: {{ conductivity }} µS/cm\n"
action: notify.mobile_app_iphone_van_willem
mode: single
- id: '1775120635177'
alias: RobbSmart 8-knops switch - keuken
description: ''
use_blueprint:
path: willumpie82/robb_smart_8_z2m.yaml
input:
mqtt_topic: zigbee2mqtt/schakelaar keuken
pair_1_entity: light.lamp_keuken_main
pair_2_entity: light.lamp_keuken_kleur
pair_2_default_brightness: 100

View File

@@ -0,0 +1,5 @@
derivative:
- source: sensor.temperatuur_badkamer_humidity
name: Badkamer vocht stijging
unit_time: min
time_window: "00:05:00"

View File

@@ -1,112 +1,11 @@
---
trigger:
platform: time_pattern
minutes: "/4"
action:
- service: weather.get_forecasts
data:
type: daily
target:
entity_id: weather.forecast_home
response_variable: daily
sensor:
- sensor:
- name: e-ink Display Data
unique_id: e_ink_display_data
icon: ios:display-2
icon: mdi:display-2
state: "OK"
attributes:
greeting: >
{%- if now() > today_at('18:00') %}
Good evening
{%- elif now() > today_at('12:00') %}
Good afternoon
{%- elif now() > today_at('5:00') %}
Good morning
{%- else %}
Good night
{%- endif %}
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 }})
{%- if now() > today_at('18:00') %}Good evening{%- elif now() > today_at('12:00') %}Good afternoon{%- elif now() > today_at('5:00') %}Good morning{%- else %}Good night{%- endif %}
day_full: >
{% set days = ['Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag', 'Zondag'] %}
@@ -115,3 +14,21 @@ sensor:
datum: >
{% set months = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'] %}
{{ now().day }} {{ months[now().month-1] }} {{ now().year }}
weather_condition_now: >
{% set cond_now = states('weather.forecast_home') %}
{% 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 }}

View 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') }}"

View File

@@ -19,3 +19,44 @@ packages:
logger: !include templates/logger.yaml
btproxy: !include templates/bt_proxy.yaml
# esp32_ble_tracker:
# on_ble_advertise:
# then:
# - lambda: |-
# ESP_LOGD("BLE", "MAC: %s | RSSI: %d", x.address_str().c_str(), x.get_rssi());
sensor:
- platform: xiaomi_hhccjcy01
mac_address: "5C:85:7E:13:17:A3"
temperature:
name: "Xiaomi MiFlora Temperature"
moisture:
name: "Xiaomi MiFlora Moisture"
illuminance:
name: "Xiaomi MiFlora Illuminance"
conductivity:
name: "Xiaomi MiFlora Soil Conductivity"
battery_level:
name: "Xiaomi MiFlora Battery Level"
esp32_ble_tracker:
on_ble_advertise:
then:
- lambda: |-
// MAC-adres als string
std::string mac = x.address_str();
// RSSI ophalen via getter
int rssi = x.get_rssi();
// Naam ophalen, lege string als onbekend
std::string name = x.get_name(); // geen has_value(), gewoon std::string
// Filter: Xiaomi MAC-prefixes of Flowercare naam
if (mac.rfind("A4:C1:38", 0) == 0 ||
mac.rfind("62:26:28", 0) == 0 ||
mac.rfind("4C:65:A8", 0) == 0 ||
name.find("Flower") != std::string::npos) {
ESP_LOGD("xiaomi_logger", "Xiaomi device found: %s (%s), RSSI: %d", mac.c_str(), name.c_str(), rssi);
}

View File

@@ -0,0 +1 @@
CODEOWNERS = ["@clydebarrow"]

View 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]))

View 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

File diff suppressed because it is too large Load Diff

View 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
View 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");

View File

@@ -1,8 +1,8 @@
substitutions:
device_name: "hvac-ir-zolder"
friendly_name: "IR-blaster Woonkamer"
friendly_name: "IR-blaster Slaapkamer"
comment: "ESP8266, Tuya-hack, IR"
location: "woonkamer"
location: "Slaapkamer"
api_password: !secret hvac_zolder_api
ota_password: !secret ota_password
wifi_ssid: !secret wifi_ssid

View File

@@ -12,4 +12,17 @@ remote_receiver:
# input: true
# pullup: true
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

View File

@@ -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:

View File

@@ -1,3 +1,10 @@
---
# https://www.home-assistant.io/integrations/sensor/
sensor: !include_dir_list ../entities/sensors
#sensor: !include_dir_merge_named ../entities/sensors
sensor:
- platform: derivative
source: sensor.temperatuur_badkamer_humidity
name: Badkamer vocht stijging
unit_time: min
time_window: "00:05:00"

View File

@@ -2,8 +2,16 @@
name: sfeer
entities:
light.lamp_tafel:
effect_list:
- blink
- breathe
- channel_change
- finish_effect
- okay
- stop_effect
supported_color_modes:
- brightness
effect:
color_mode: brightness
brightness: 97
entity_id:
@@ -11,28 +19,24 @@
- light.lamp_tafel2
icon: mdi:lightbulb-group
friendly_name: Lamp Tafel
supported_features: 40
supported_features: 44
state: 'on'
light.lamp_kast:
effect_list:
- blink
- breathe
- okay
- channel_change
- finish_effect
- stop_effect
supported_color_modes:
- brightness
effect:
color_mode: brightness
brightness: 140
off_with_transition: false
off_brightness:
friendly_name: lamp kast
supported_features: 40
supported_features: 44
state: 'on'
switch.stopcontact_boven:
friendly_name: Zout lamp
state: 'on'
select.kerstboom_voorinstelling:
options:
- Candle Multi
- Colorful
- Solid Glitter
friendly_name: Kerstboom Voorinstelling
state: Candle Multi
light.ledstok:
effect_list:
- Solid
@@ -240,18 +244,33 @@
friendly_name: ledstok
supported_features: 36
state: 'on'
light.zout_lamp:
supported_color_modes:
- onoff
color_mode: onoff
friendly_name: Zout lamp
supported_features: 0
state: 'on'
icon: mdi:floor-lamp
metadata:
select.kerstboom_voorinstelling:
entity_only: true
light.ledstok:
entity_only: true
light.zout_lamp:
entity_only: true
- id: '1754858015842'
name: sfeer uit
entities:
light.lamp_tafel:
effect_list:
- blink
- breathe
- channel_change
- finish_effect
- okay
- stop_effect
supported_color_modes:
- brightness
effect:
color_mode:
brightness:
entity_id:
@@ -259,34 +278,250 @@
- light.lamp_tafel2
icon: mdi:lightbulb-group
friendly_name: Lamp Tafel
supported_features: 40
supported_features: 44
state: 'off'
light.lamp_kast:
effect_list:
- blink
- breathe
- okay
- channel_change
- finish_effect
- stop_effect
supported_color_modes:
- brightness
effect:
color_mode:
brightness:
off_with_transition: false
off_brightness: 140
friendly_name: lamp kast
supported_features: 40
supported_features: 44
state: 'off'
light.ikea_of_sweden_tradfri_bulb_e27_ww_clear_250lm:
light.lamp_zitkamer:
effect_list:
- blink
- breathe
- okay
- channel_change
- finish_effect
- stop_effect
supported_color_modes:
- brightness
effect:
color_mode:
brightness:
off_with_transition: false
off_brightness: 3
friendly_name: Lamp Bank
supported_features: 40
friendly_name: Lamp Zitkamer
supported_features: 44
state: 'off'
switch.stopcontact_boven:
light.zout_lamp:
supported_color_modes:
- onoff
color_mode:
friendly_name: Zout lamp
supported_features: 0
state: 'off'
light.ledstok:
effect_list:
- Solid
- Blink
- Breathe
- Wipe
- Wipe Random
- Random Colors
- Sweep
- Dynamic
- Colorloop
- Rainbow
- Scan
- Scan Dual
- Fade
- Theater
- Theater Rainbow
- Running
- Saw
- Twinkle
- Dissolve
- Dissolve Rnd
- Sparkle
- Sparkle Dark
- Sparkle+
- Strobe
- Strobe Rainbow
- Strobe Mega
- Blink Rainbow
- Android
- Chase
- Chase Random
- Chase Rainbow
- Chase Flash
- Chase Flash Rnd
- Rainbow Runner
- Colorful
- Traffic Light
- Sweep Random
- Chase 2
- Aurora
- Stream
- Scanner
- Lighthouse
- Fireworks
- Rain
- Tetrix
- Fire Flicker
- Gradient
- Loading
- Rolling Balls
- Fairy
- Two Dots
- Fairytwinkle
- Running Dual
- RSVD
- Chase 3
- Tri Wipe
- Tri Fade
- Lightning
- ICU
- Multi Comet
- Scanner Dual
- Stream 2
- Oscillate
- Pride 2015
- Juggle
- Palette
- Fire 2012
- Colorwaves
- Bpm
- Fill Noise
- Noise 1
- Noise 2
- Noise 3
- Noise 4
- Colortwinkles
- Lake
- Meteor
- Meteor Smooth
- Railway
- Ripple
- Twinklefox
- Twinklecat
- Halloween Eyes
- Solid Pattern
- Solid Pattern Tri
- Spots
- Spots Fade
- Glitter
- Candle
- Fireworks Starburst
- Fireworks 1D
- Bouncing Balls
- Sinelon
- Sinelon Dual
- Sinelon Rainbow
- Popcorn
- Drip
- Plasma
- Percent
- Ripple Rainbow
- Heartbeat
- Pacifica
- Candle Multi
- Solid Glitter
- Sunrise
- Phased
- Twinkleup
- Noise Pal
- Sine
- Phased Noise
- Flow
- Chunchun
- Dancing Shadows
- Washing Machine
- Rotozoomer
- Blends
- TV Simulator
- Dynamic Smooth
- Spaceships
- Crazy Bees
- Ghost Rider
- Blobs
- Scrolling Text
- Drift Rose
- Distortion Waves
- Soap
- Octopus
- Waving Cell
- Pixels
- Pixelwave
- Juggles
- Matripix
- Gravimeter
- Plasmoid
- Puddles
- Midnoise
- Noisemeter
- Freqwave
- Freqmatrix
- GEQ
- Waterfall
- Freqpixels
- RSVD
- Noisefire
- Puddlepeak
- Noisemove
- Noise2D
- Perlin Move
- Ripple Peak
- Firenoise
- Squared Swirl
- RSVD
- DNA
- Matrix
- Metaballs
- Freqmap
- Gravcenter
- Gravcentric
- Gravfreq
- DJ Light
- Funky Plank
- RSVD
- Pulser
- Blurz
- Drift
- Waverly
- Sun Radiation
- Colored Bursts
- Julia
- RSVD
- RSVD
- RSVD
- Game Of Life
- Tartan
- Polar Lights
- Swirl
- Lissajous
- Frizzles
- Plasma Ball
- Flow Stripe
- Hiphotic
- Sindots
- DNA Spiral
- Black Hole
- Wavesins
- Rocktaves
- Akemi
supported_color_modes:
- rgb
effect:
color_mode:
brightness:
hs_color:
rgb_color:
xy_color:
friendly_name: ledstok
supported_features: 36
state: 'off'
icon: mdi:floor-lamp-outline
metadata:
switch.stopcontact_boven:
light.ledstok:
entity_only: true
- id: '1755326563698'
name: Badkamer dag
@@ -595,7 +830,7 @@
- id: '1768907183363'
name: kantoor_werk
entities:
light.lamp_kantoor_2:
light.lamp_kantoor:
min_color_temp_kelvin: 2202
max_color_temp_kelvin: 4000
min_mireds: 250
@@ -641,7 +876,7 @@
- id: '1768907224001'
name: Kantoor Hobby
entities:
light.lamp_kantoor_2:
light.lamp_kantoor:
min_color_temp_kelvin: 2202
max_color_temp_kelvin: 4000
min_mireds: 250
@@ -687,7 +922,7 @@
- id: '1768907253718'
name: kantoor Voorlezen
entities:
light.lamp_kantoor_2:
light.lamp_kantoor:
min_color_temp_kelvin: 2202
max_color_temp_kelvin: 4000
min_mireds: 250
@@ -721,7 +956,7 @@
- id: '1768907536768'
name: kantoor uit
entities:
light.lamp_kantoor_2:
light.lamp_kantoor:
min_color_temp_kelvin: 2202
max_color_temp_kelvin: 4000
min_mireds: 250
@@ -746,9 +981,7 @@
- heat
min_temp: 5
max_temp: 30
current_temperature: 17.6
temperature: 18
current_humidity: 43.84
temperature: 13
friendly_name: Thermostaat kantoor
supported_features: 385
state: heat
@@ -766,8 +999,16 @@
name: Woonkamer overdag
entities:
light.lamp_tafel:
effect_list:
- blink
- breathe
- channel_change
- finish_effect
- okay
- stop_effect
supported_color_modes:
- brightness
effect:
color_mode: brightness
brightness: 254
entity_id:
@@ -775,20 +1016,23 @@
- light.lamp_tafel2
icon: mdi:lightbulb-group
friendly_name: Lamp Tafel
supported_features: 40
supported_features: 44
state: 'on'
light.lamp_kast:
effect_list:
- blink
- breathe
- okay
- channel_change
- finish_effect
- stop_effect
supported_color_modes:
- brightness
effect:
color_mode: brightness
brightness: 140
off_with_transition: false
off_brightness:
friendly_name: lamp kast
supported_features: 40
state: 'on'
switch.stopcontact_boven:
friendly_name: Zout lamp
supported_features: 44
state: 'on'
light.ledstok:
effect_list:
@@ -990,7 +1234,16 @@
friendly_name: ledstok
supported_features: 36
state: 'off'
light.zout_lamp:
supported_color_modes:
- onoff
color_mode: onoff
friendly_name: Zout lamp
supported_features: 0
state: 'on'
icon: mdi:floor-lamp
metadata:
light.ledstok:
entity_only: true
light.zout_lamp:
entity_only: true

View File

@@ -634,7 +634,7 @@ keuken_alles_uit:
- action: switch.turn_off
metadata: {}
target:
entity_id: switch.boiler_2
entity_id: switch.boiler
data: {}
alias: Boiler uit
- action: climate.set_temperature
@@ -652,10 +652,10 @@ keuken_alles_uit:
- light.lamp_keuken_main
- light.lamp_toilet
data: {}
- action: switch.turn_off
- action: switch.turn_on
metadata: {}
target:
entity_id: switch.display_keuken_scherm
entity_id: switch.display_keuken_screensaver
data: {}
alias: Alles uit - Keuken
description: ''
@@ -666,9 +666,9 @@ slaapkamer_alles_uit:
metadata: {}
target:
entity_id:
- light.lamp_slaapkamer_2
- light.lamp_slaapkamer
- light.lamp_bed_links_dim
- light.lanp_bed_rechts_dim
- light.lamp_bed_rechts_dim
data: {}
- action: climate.set_temperature
metadata: {}
@@ -689,8 +689,8 @@ woonkamer_alles_uit:
target:
entity_id:
- light.lamp_kast
- light.ikea_of_sweden_tradfri_bulb_e27_ww_clear_250lm
- light.ikea_of_sweden_stoftmoln_ceiling_wall_lamp_ww37
- light.lamp_bank
- light.lamp_zitkamer
- light.lamp_tafel
- light.lamp_tafel_sfeer
- light.zout_lamp
@@ -746,7 +746,7 @@ alles_uit_kantoor:
- action: light.turn_off
metadata: {}
target:
entity_id: light.lamp_kantoor_2
entity_id: light.lamp_kantoor
data: {}
- action: climate.set_temperature
metadata: {}
@@ -961,7 +961,7 @@ film_kijken:
metadata: {}
data: {}
target:
device_id: a421097cef9b325efb84ae7009ff87be
entity_id: light.lamp_kast_slaapkamer
alias: Film kijken
description: ''
slapen_slaapkamer_willem:
@@ -1005,3 +1005,27 @@ alles_uit_slaapkamer_kids:
alias: Alles uit - Slaapkamer kids
description: ''
icon: mdi:bed-outline
display_keuken_aan:
sequence:
- action: switch.turn_off
metadata: {}
target:
entity_id: switch.display_keuken_screensaver
data: {}
- action: number.set_value
metadata: {}
target:
entity_id: number.display_keuken_helderheid_screensaver
data:
value: '100'
alias: display keuken aan
description: ''
display_keuken_uit:
sequence:
- action: switch.turn_on
metadata: {}
target:
entity_id: switch.display_keuken_screensaver
data: {}
alias: display keuken uit
description: ''

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -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>

View File

@@ -15,26 +15,32 @@ frontend:
homeassistant:
enabled: true
advanced:
pan_id: 0x0C56
ext_pan_id: [0x4b, 0xcf, 0x12, 0x33, 0xab, 0x93, 0x4c, 0x57]
pan_id: 3158
ext_pan_id:
- 75
- 207
- 18
- 51
- 171
- 147
- 76
- 87
channel: 25
network_key:
[
0x15,
0x6b,
0x04,
0x54,
0xfb,
0xc8,
0x6c,
0x8a,
0xa5,
0x6d,
0x06,
0x94,
0xda,
0x08,
0x75,
0x8c,
]
- 21
- 107
- 4
- 84
- 251
- 200
- 108
- 138
- 165
- 109
- 6
- 148
- 218
- 8
- 117
- 140
devices: devices.yaml

View File

@@ -2,231 +2,431 @@
"metadata": {
"format": "zigpy/open-coordinator-backup",
"version": 1,
"source": "zigbee-herdsman@9.0.9",
"source": "zigbee-herdsman@10.0.5",
"internal": {
"date": "2026-03-25T10:25:03.325Z",
"date": "2026-04-02T12:18:16.206Z",
"znpVersion": 1
}
},
"stack_specific": {
"zstack": {
"tclk_seed": "eaf31b5477d32c2201c671e9789882de"
"tclk_seed": "8615f9a0ceb9bbf9a842c8eba303cefc"
}
},
"coordinator_ieee": "00124b0028d2e01a",
"pan_id": "eed0",
"extended_pan_id": "679240887e1aab54",
"pan_id": "c56",
"extended_pan_id": "574c93ab3312cf4b",
"nwk_update_id": 0,
"security_level": 5,
"channel": 11,
"channel": 25,
"channel_mask": [
11
25
],
"network_key": {
"key": "2fe2b61879185b4522e88d0a54f1314c",
"key": "156b0454fbc86c8aa56d0694da08758c",
"sequence_number": 0,
"frame_counter": 1
"frame_counter": 6969265
},
"devices": [
{
"nwk_address": "5d05",
"ieee_address": "44e2f8fffe0fb2fa",
"is_child": false
"nwk_address": "3b41",
"ieee_address": "4c5bb3fffea0e207",
"is_child": false,
"link_key": {
"key": "121b00304608a2e4452a4b5dfc7da7ca",
"rx_counter": 0,
"tx_counter": 3278
}
},
{
"nwk_address": "e8f0",
"ieee_address": "00158d0002e6c64d",
"is_child": false
},
{
"nwk_address": "d205",
"ieee_address": "00158d0002c9572b",
"is_child": false
},
{
"nwk_address": "20dc",
"ieee_address": "00158d0001b91af7",
"is_child": false
},
{
"nwk_address": "edd7",
"ieee_address": "0c2a6ffffe64a7f5",
"is_child": false
},
{
"nwk_address": "8380",
"ieee_address": "f84477fffef97efd",
"is_child": false
},
{
"nwk_address": "4764",
"ieee_address": "44e2f8fffe17a9a7",
"is_child": false
},
{
"nwk_address": "784e",
"ieee_address": "00158d00023783a0",
"is_child": false
},
{
"nwk_address": "168c",
"ieee_address": "00158d0008ad9560",
"is_child": false
},
{
"nwk_address": "2a4f",
"ieee_address": "90ab96fffe99035d",
"is_child": false
},
{
"nwk_address": "ae43",
"ieee_address": "00124b00246d8628",
"is_child": false
},
{
"nwk_address": "49e3",
"ieee_address": "00158d000450bc4d",
"is_child": false
},
{
"nwk_address": "c3de",
"ieee_address": "a4c138151c812a2e",
"is_child": false
},
{
"nwk_address": "1af8",
"ieee_address": "bc8d7efffe6522d5",
"is_child": false
},
{
"nwk_address": "dfed",
"nwk_address": "9f2e",
"ieee_address": "c4d8c8fffe49d80d",
"is_child": false
},
{
"nwk_address": "b3b3",
"ieee_address": "c4d8c8fffe49da86",
"is_child": false
},
{
"nwk_address": "1928",
"ieee_address": "c09b9efffec19a44",
"is_child": false
},
{
"nwk_address": "a507",
"ieee_address": "54ef4410011728d1",
"is_child": false
},
{
"nwk_address": "d494",
"ieee_address": "a4c13802af2affff",
"is_child": false
},
{
"nwk_address": "9939",
"ieee_address": "000b57fffe3296f5",
"is_child": false
},
{
"nwk_address": "4bf",
"ieee_address": "8c8b48fffe34e945",
"is_child": false
},
{
"nwk_address": "dbe6",
"ieee_address": "54dce9fffead96ad",
"is_child": false
},
{
"nwk_address": "9675",
"ieee_address": "781c9dfffe7899af",
"is_child": false
},
{
"nwk_address": "2d59",
"ieee_address": "c02cedfffe21a3e3",
"is_child": false
"is_child": false,
"link_key": {
"key": "a59a81155ccb16388bcdb05e3171633d",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "22cc",
"ieee_address": "54dce9fffea96e29",
"is_child": false
"is_child": false,
"link_key": {
"key": "e7d7120757ab14bf8a6d670279fc25f4",
"rx_counter": 0,
"tx_counter": 3322
}
},
{
"nwk_address": "3b41",
"ieee_address": "4c5bb3fffea0e207",
"is_child": false
"nwk_address": "e51d",
"ieee_address": "00158d0002c9572b",
"is_child": false,
"link_key": {
"key": "e5ee72fba8cfddeb885407fe8698eca0",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "3a90",
"ieee_address": "f84477fffe5326ce",
"is_child": false
"nwk_address": "668b",
"ieee_address": "c09b9efffec19a44",
"is_child": true,
"link_key": {
"key": "06522a5dfc5067465163613046256268",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "200b",
"ieee_address": "f84477fffe8122ed",
"is_child": false
"nwk_address": "4bf",
"ieee_address": "8c8b48fffe34e945",
"is_child": false,
"link_key": {
"key": "4627c878eab12b42fc52cd56bd80602f",
"rx_counter": 0,
"tx_counter": 3487
}
},
{
"nwk_address": "6877",
"ieee_address": "a4c138a0d4b497e0",
"is_child": false
"nwk_address": "49e3",
"ieee_address": "00158d000450bc4d",
"is_child": false,
"link_key": {
"key": "8557f307ce719315b41c9ebdbb74bd42",
"rx_counter": 0,
"tx_counter": 3806
}
},
{
"nwk_address": "b60e",
"ieee_address": "d44867fffe2942ba",
"is_child": false
"nwk_address": "faca",
"ieee_address": "00158d0002e6c64d",
"is_child": true,
"link_key": {
"key": "b46ea4caeb2e16ceb140f3fba043acbb",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "9c2b",
"ieee_address": "847127fffeb4d4f3",
"is_child": false
"nwk_address": "2a4f",
"ieee_address": "90ab96fffe99035d",
"is_child": false,
"link_key": {
"key": "db16605e312f1069f54151155c95656c",
"rx_counter": 0,
"tx_counter": 3806
}
},
{
"nwk_address": "d4c8",
"ieee_address": "00158d0008ad9560",
"is_child": true,
"link_key": {
"key": "a87e0e0bce719315993563b1bb74bd42",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "ffac",
"ieee_address": "804b50fffe80a266",
"is_child": false
},
{
"nwk_address": "cd72",
"ieee_address": "70c59cfffe2091be",
"is_child": false
},
{
"nwk_address": "2b2a",
"ieee_address": "781c9dfffee7289f",
"is_child": false
"is_child": false,
"link_key": {
"key": "9f024e4744a9e3c2ae4923fd31accd95",
"rx_counter": 0,
"tx_counter": 1694
}
},
{
"nwk_address": "ef11",
"ieee_address": "348d13fffecd5d71",
"is_child": false
"is_child": false,
"link_key": {
"key": "3395265dfcdd71b264a46d3046a8749c",
"rx_counter": 0,
"tx_counter": 1540
}
},
{
"nwk_address": "b3b3",
"ieee_address": "c4d8c8fffe49da86",
"is_child": true,
"link_key": {
"key": "4826cfeb0668167d3d23e1bc37237bc7",
"rx_counter": 0,
"tx_counter": 3696
}
},
{
"nwk_address": "2b2a",
"ieee_address": "781c9dfffee7289f",
"is_child": false,
"link_key": {
"key": "3c2b29027988e5d851915c0757dfd493",
"rx_counter": 0,
"tx_counter": 1650
}
},
{
"nwk_address": "784e",
"ieee_address": "00158d00023783a0",
"is_child": false,
"link_key": {
"key": "2696cea2ce34aef908c1ffe9a38edbfc",
"rx_counter": 0,
"tx_counter": 3828
}
},
{
"nwk_address": "5a7c",
"ieee_address": "8c65a3fffee949aa",
"is_child": false,
"link_key": {
"key": "53e92747445acdce62a24afd315fe399",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "dbe6",
"ieee_address": "54dce9fffead96ad",
"is_child": false,
"link_key": {
"key": "b86f0d30465225fcef5e465dfc2720d2",
"rx_counter": 0,
"tx_counter": 3410
}
},
{
"nwk_address": "9675",
"ieee_address": "781c9dfffe7899af",
"is_child": false,
"link_key": {
"key": "6120c30757dfd4930c9ab6027988e5d8",
"rx_counter": 0,
"tx_counter": 3278
}
},
{
"nwk_address": "b60e",
"ieee_address": "d44867fffe2942ba",
"is_child": false,
"link_key": {
"key": "43ea6b3614c44b1a46c43c075fa9f16f",
"rx_counter": 0,
"tx_counter": 2277
}
},
{
"nwk_address": "f83f",
"ieee_address": "c02cedfffe2b4ebb",
"is_child": false
"is_child": false,
"link_key": {
"key": "75f7900757afe42b184de50279f8d560",
"rx_counter": 0,
"tx_counter": 1243
}
},
{
"nwk_address": "41a0",
"ieee_address": "54ef441001422124",
"is_child": false
"nwk_address": "cd72",
"ieee_address": "70c59cfffe2091be",
"is_child": false,
"link_key": {
"key": "767a83fd316043654731ee4744656d32",
"rx_counter": 0,
"tx_counter": 1705
}
},
{
"nwk_address": "3a90",
"ieee_address": "f84477fffe5326ce",
"is_child": false,
"link_key": {
"key": "378e113614d4473632a046075fb9fd43",
"rx_counter": 0,
"tx_counter": 2970
}
},
{
"nwk_address": "a507",
"ieee_address": "54ef4410011728d1",
"is_child": false,
"link_key": {
"key": "573deea1defd54ad796adfeab34721a8",
"rx_counter": 0,
"tx_counter": 3696
}
},
{
"nwk_address": "1af8",
"ieee_address": "bc8d7efffe6522d5",
"is_child": false,
"link_key": {
"key": "1b9bde07573c45577621ab02796b741c",
"rx_counter": 0,
"tx_counter": 3445
}
},
{
"nwk_address": "1760",
"ieee_address": "bc33acfffe1a21da",
"is_child": false
"is_child": false,
"link_key": {
"key": "d9efe678ea559372639ae356bd64d81f",
"rx_counter": 0,
"tx_counter": 792
}
},
{
"nwk_address": "10c7",
"ieee_address": "8c65a3fffee949aa",
"is_child": false
"nwk_address": "2d59",
"ieee_address": "c02cedfffe21a3e3",
"is_child": false,
"link_key": {
"key": "40a0ef0279f8d5602d1a9a0757afe42b",
"rx_counter": 0,
"tx_counter": 3278
}
},
{
"nwk_address": "384c",
"nwk_address": "200b",
"ieee_address": "f84477fffe8122ed",
"is_child": false,
"link_key": {
"key": "23de07eb06d78a4156db29bc379ce7fb",
"rx_counter": 0,
"tx_counter": 2970
}
},
{
"nwk_address": "9c2b",
"ieee_address": "847127fffeb4d4f3",
"is_child": false,
"link_key": {
"key": "482d1cbc37ccd2873d2832eb0687bf3d",
"rx_counter": 0,
"tx_counter": 1738
}
},
{
"nwk_address": "9939",
"ieee_address": "000b57fffe3296f5",
"is_child": false,
"link_key": {
"key": "3d7d91fd31ab8d150c36fc4744aea342",
"rx_counter": 0,
"tx_counter": 3608
}
},
{
"nwk_address": "edd7",
"ieee_address": "0c2a6ffffe64a7f5",
"is_child": false,
"link_key": {
"key": "4e5eccbc3784890f3b5be2eb06cfe4b5",
"rx_counter": 0,
"tx_counter": 3883
}
},
{
"nwk_address": "20dc",
"ieee_address": "00158d0001b91af7",
"is_child": false,
"link_key": {
"key": "39e63f14f92ddbb94ce31143c866b603",
"rx_counter": 0,
"tx_counter": 3850
}
},
{
"nwk_address": "8380",
"ieee_address": "f84477fffef97efd",
"is_child": false,
"link_key": {
"key": "553c31155c748a047b6b005e31ceff01",
"rx_counter": 0,
"tx_counter": 3883
}
},
{
"nwk_address": "29e1",
"ieee_address": "a4c138a0d4b497e0",
"is_child": false,
"link_key": {
"key": "1c11a12d00f6781f193ff61c4b9bc26a",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "d494",
"ieee_address": "a4c13802af2affff",
"is_child": false,
"link_key": {
"key": "145c2961febed45d5f319314fb90836c",
"rx_counter": 0,
"tx_counter": 3652
}
},
{
"nwk_address": "7eaf",
"ieee_address": "00124b00246d8628",
"is_child": false,
"link_key": {
"key": "e63fd6dda809daeb8b85a3d8865eeba0",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "a875",
"ieee_address": "54ef441001422124",
"is_child": false,
"link_key": {
"key": "ea98f9f8b80627bf87228cfd965116f4",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "9bf7",
"ieee_address": "c4d8c8fffe045efe",
"is_child": false
"is_child": false,
"link_key": {
"key": "15fd0730034ecd3d5e90bd4506609a0c",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "e14e",
"ieee_address": "44e2f8fffe17a9a7",
"is_child": true,
"link_key": {
"key": "a467eb78ea01428a1e12ee56bd3009e7",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "870f",
"ieee_address": "44e2f8fffe0fb2fa",
"is_child": false,
"link_key": {
"key": "031a4d36145be18a06341a075f365bff",
"rx_counter": 0,
"tx_counter": 0
}
},
{
"nwk_address": "8d4e",
"ieee_address": "60a423fffe28320f",
"is_child": false,
"link_key": {
"key": "0cfcd478eada04aeb689d156bdeb4fc3",
"rx_counter": 0,
"tx_counter": 0
}
}
]
}

View File

@@ -1,82 +1,80 @@
"0x00124b0028d2e01a":
friendly_name: "Zigbee Meterkast"
"0x00124b002e132f65":
friendly_name: "Texas Instruments Coordinator"
"0x90ab96fffe99035d":
friendly_name: "aqs woonkamer"
"0x44e2f8fffe17a9a7":
friendly_name: "Temperatuur Keuken"
"0x70c59cfffe2091be":
friendly_name: "Lamp Zitkamer"
"0xbc33acfffe1a21da":
friendly_name: "Lamp Bank"
"0x1c34f1fffeac6a84":
friendly_name: "Lamp meterkast"
"0x44e2f8fffe0fb2fa":
friendly_name: "Temperatuur badkamer"
"0x804b50fffe80a266":
friendly_name: "Lamp kast slaapkamer"
"0x00124b00246d8628":
friendly_name: "Beweging toilet"
"0x000b57fffe3296f5":
friendly_name: "Lamp toilet"
"0xc02cedfffe2b4ebb":
friendly_name: "lamp tafel sfeer"
"0x847127fffeb4d4f3":
friendly_name: "Zout lamp"
"0xc02cedfffe0e7804":
friendly_name: "Lamp badkamer"
"0x00158d0002e6c64d":
friendly_name: "Contact Balkondeur"
"0x00158d0002c9572b":
friendly_name: "Contact Voordeur"
"0x0c2a6ffffe64a7f5":
friendly_name: "Lamp tafel1"
"0xf84477fffef97efd":
friendly_name: "Lamp tafel2"
"0x00158d00023783a0":
friendly_name: "Temperatuur 3D printer"
"0x00158d0008ad9560":
friendly_name: "Button Voordeur"
"0xc4d8c8fffe49d80d":
friendly_name: "Beweging keuken"
"0xc4d8c8fffe49da86":
friendly_name: "Beweging badkamer"
"0x54ef4410011728d1":
friendly_name: "Lamp Keuken"
"0xa4c13802af2affff":
friendly_name: "Stopcontact Aquahot"
"0xbc8d7efffe6522d5":
friendly_name: "Stopcontact Koelkast"
"0x8c8b48fffe34e945":
friendly_name: "lamp kast"
"0x54dce9fffead96ad":
friendly_name: "Stopcontact Oven"
"0x781c9dfffe7899af":
friendly_name: "Lamp slaapkamer"
"0xc02cedfffe21a3e3":
friendly_name: "Lamp slaapkamer kids"
"0x54dce9fffea96e29":
friendly_name: "stopcontact Boiler"
"0x4c5bb3fffea0e207":
friendly_name: "IKEA of Sweden RODRET Dimmer"
"0xf84477fffe5326ce":
friendly_name: "Lamp bed links dim"
"0xf84477fffe8122ed":
friendly_name: "Lamp bed rechts dim"
"0xc09b9efffec19a44":
friendly_name: "Temperatuur woonkamer"
# '0xd44867fffe2942ba':
# friendly_name: 'Temperatuur kantoor'
"0x781c9dfffee7289f":
friendly_name: "Lamp"
"0x348d13fffecd5d71":
friendly_name: "Lamp kantoor"
# '0x8c65a3fffee949aa':
# friendly_name: 'Temperatuur slaapkamer kids'
"0xa4c138151c812a2e":
friendly_name: "Temperatuur slaapkamer kids"
"0xc4d8c8fffe045efe":
friendly_name: "Contact meterkastdeur"
"0xa4c138a0d4b497e0":
friendly_name: "Temperatuur kantoor"
'0x00124b0028d2e01a':
friendly_name: Zigbee Meterkast
'0x00124b002e132f65':
friendly_name: Texas Instruments Coordinator
'0x90ab96fffe99035d':
friendly_name: aqs woonkamer
'0x70c59cfffe2091be':
friendly_name: Lamp Zitkamer
'0xbc33acfffe1a21da':
friendly_name: Lamp Bank
'0x1c34f1fffeac6a84':
friendly_name: Lamp meterkast
'0x44e2f8fffe0fb2fa':
friendly_name: Temperatuur badkamer
'0x00158d0001f5636f':
friendly_name: Temperatuur meterkast
'0x804b50fffe80a266':
friendly_name: Lamp kast slaapkamer
'0x000b57fffe3296f5':
friendly_name: Lamp toilet
'0xc02cedfffe2b4ebb':
friendly_name: lamp tafel sfeer
'0x847127fffeb4d4f3':
friendly_name: Zout lamp
'0xc02cedfffe0e7804':
friendly_name: Lamp badkamer
'0x0c2a6ffffe64a7f5':
friendly_name: Lamp tafel1
'0xf84477fffef97efd':
friendly_name: Lamp tafel2
'0xc4d8c8fffe49da86':
friendly_name: Beweging badkamer
'0x54ef4410011728d1':
friendly_name: Lamp Keuken
'0xa4c13802af2affff':
friendly_name: Stopcontact Aquahot
'0xbc8d7efffe6522d5':
friendly_name: Stopcontact Koelkast
'0x8c8b48fffe34e945':
friendly_name: lamp kast
'0x54dce9fffead96ad':
friendly_name: Stopcontact Oven
'0x781c9dfffe7899af':
friendly_name: Lamp slaapkamer
'0xc02cedfffe21a3e3':
friendly_name: Lamp slaapkamer kids
'0x54dce9fffea96e29':
friendly_name: Boiler
'0xf84477fffe5326ce':
friendly_name: Lamp bed links dim
'0xf84477fffe8122ed':
friendly_name: Lamp bed rechts dim
'0xd44867fffe2942ba':
friendly_name: Temperatuur slaapkamer kids
'0x348d13fffecd5d71':
friendly_name: Lamp kantoor
'0xc4d8c8fffe045efe':
friendly_name: Contact meterkast
'0x54ef441001422124':
friendly_name: Thermostaat Keuken
'0x8c65a3fffee949aa':
friendly_name: temperatuur kantoor
'0xa4c138a0d4b497e0':
friendly_name: Temperatuur slaapkamer
'0xc4d8c8fffe49d80d':
friendly_name: Beweging Keuken
'0x00124b00246d8628':
friendly_name: Beweging toilet
'0x00158d0002c9572b':
friendly_name: Contact Voordeur
'0x00158d0002e6c64d':
friendly_name: contact balkondeur
'0x00158d0008ad9560':
friendly_name: Button voordeur
'0x44e2f8fffe17a9a7':
friendly_name: Temperatuur keuken
'0xc09b9efffec19a44':
friendly_name: Temperatuur woonkamer
'0x60a423fffe28320f':
friendly_name: schakelaar keuken

View File

@@ -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
}
}