weather station esphome and others
This commit is contained in:
@@ -9,6 +9,6 @@
|
|||||||
action:
|
action:
|
||||||
- type: turn_off
|
- type: turn_off
|
||||||
device_id: 4a9f71fc64e158f1c9286d6e43ce782e
|
device_id: 4a9f71fc64e158f1c9286d6e43ce782e
|
||||||
entity_id: remote.sony_kd_55x85k
|
entity_id: remote.lounge_tv
|
||||||
domain: remote
|
domain: remote
|
||||||
mode: single
|
mode: single
|
||||||
|
@@ -29,16 +29,9 @@ logger:
|
|||||||
custom_components.evnex: debug
|
custom_components.evnex: debug
|
||||||
evnex: debug
|
evnex: debug
|
||||||
|
|
||||||
|
zha:
|
||||||
|
enable_quirks: true
|
||||||
|
custom_quirks_path: /config/custom_zha_quirks/
|
||||||
|
|
||||||
device_tracker:
|
device_tracker:
|
||||||
- platform: bluetooth_le_tracker
|
- platform: bluetooth_le_tracker
|
||||||
|
|
||||||
input_boolean:
|
|
||||||
foxhole_occupied:
|
|
||||||
name: Foxhole Guest Occupied
|
|
||||||
icon: mdi:briefcase-plus-outline
|
|
||||||
quiet_time:
|
|
||||||
name: Quiet time for no notifications
|
|
||||||
icon: mdi:shield-moon
|
|
||||||
away_occupied_routine:
|
|
||||||
name: Automation for Lights etc when away
|
|
||||||
icon: mdi:shield-lock
|
|
||||||
|
BIN
custom_zha_quirks/__pycache__/ts0601_smoke.cpython-312.pyc
Normal file
BIN
custom_zha_quirks/__pycache__/ts0601_smoke.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
174
custom_zha_quirks/ts0601_smoke.py
Normal file
174
custom_zha_quirks/ts0601_smoke.py
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
"""
|
||||||
|
DY-YG400A Smoke Sensor, TS0601 from _TZE204_ntcy3xu1
|
||||||
|
https://www.aliexpress.com/item/1005005863519099.html
|
||||||
|
https://www.aliexpress.com/item/1005005854203557.html
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import zigpy.profiles.zha
|
||||||
|
from zigpy.quirks import CustomDevice
|
||||||
|
import zigpy.types as t
|
||||||
|
from zigpy.zcl.clusters.general import (
|
||||||
|
Basic,
|
||||||
|
Groups,
|
||||||
|
Ota,
|
||||||
|
Scenes,
|
||||||
|
Time,
|
||||||
|
BinaryInput,
|
||||||
|
BatterySize,
|
||||||
|
)
|
||||||
|
from zigpy.zcl.clusters.security import IasZone
|
||||||
|
from zhaquirks import Bus
|
||||||
|
from zhaquirks.const import (
|
||||||
|
DEVICE_TYPE,
|
||||||
|
ENDPOINTS,
|
||||||
|
INPUT_CLUSTERS,
|
||||||
|
MODELS_INFO,
|
||||||
|
OUTPUT_CLUSTERS,
|
||||||
|
PROFILE_ID,
|
||||||
|
ZONE_TYPE,
|
||||||
|
)
|
||||||
|
from zhaquirks.tuya import (
|
||||||
|
TuyaLocalCluster,
|
||||||
|
TuyaManufCluster,
|
||||||
|
TuyaManufClusterAttributes,
|
||||||
|
TuyaPowerConfigurationCluster,
|
||||||
|
)
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
TUYA_SMOKE_DETECTED_ATTR = 0x0401 # [0]/[1] [Detected]/[Clear]!
|
||||||
|
TUYA_SMOKE_TAMPERED_ATTR = 0x0104 # [0]/[1] [Clear]/[Tampered]!
|
||||||
|
TUYA_SMOKE_BATTERY_ATTR = 0x040e # [0]/[1]/[2] [Low]/[Med]]/[Full]!
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaSmokeDetectorCluster(TuyaManufClusterAttributes):
|
||||||
|
"""Manufacturer Specific Cluster of the TS0601 smoke detector."""
|
||||||
|
|
||||||
|
attributes = {
|
||||||
|
TUYA_SMOKE_DETECTED_ATTR: ("smoke_detected", t.uint8_t, True),
|
||||||
|
TUYA_SMOKE_TAMPERED_ATTR: ("tampered_device", t.uint8_t, True),
|
||||||
|
TUYA_SMOKE_BATTERY_ATTR: ("battery_status", t.uint8_t, True),
|
||||||
|
}
|
||||||
|
|
||||||
|
def _update_attribute(self, attrid, value):
|
||||||
|
super()._update_attribute(attrid, value)
|
||||||
|
if attrid == TUYA_SMOKE_DETECTED_ATTR:
|
||||||
|
status = IasZone.ZoneStatus.Alarm_1 if value == 0 else 0
|
||||||
|
self.endpoint.device.ias_bus.listener_event("update_attribute", "zone_status", status)
|
||||||
|
elif attrid == TUYA_SMOKE_TAMPERED_ATTR:
|
||||||
|
self.endpoint.device.tamper_detection_bus.listener_event(
|
||||||
|
"update_attribute", "present_value", bool(value)
|
||||||
|
)
|
||||||
|
elif attrid == TUYA_SMOKE_BATTERY_ATTR:
|
||||||
|
batt = 5 if value == 0 else 40 if value == 1 else 100
|
||||||
|
self.endpoint.device.battery_bus.listener_event("battery_change", batt)
|
||||||
|
else:
|
||||||
|
_LOGGER.warning(
|
||||||
|
"[0x%04x:%s:0x%04x] unhandled attribute: 0x%04x",
|
||||||
|
self.endpoint.device.nwk,
|
||||||
|
self.endpoint.endpoint_id,
|
||||||
|
self.cluster_id,
|
||||||
|
attrid,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaIasZone(TuyaLocalCluster, IasZone):
|
||||||
|
"""
|
||||||
|
IAS Zone: this generates the "Smoke" entity for HA.
|
||||||
|
Receives updates from TuyaSmokeDetectorCluster.
|
||||||
|
"""
|
||||||
|
|
||||||
|
_CONSTANT_ATTRIBUTES = {ZONE_TYPE: IasZone.ZoneType.Fire_Sensor}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
"""Init."""
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.endpoint.device.ias_bus.add_listener(self)
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaPowerConfigCluster(TuyaPowerConfigurationCluster):
|
||||||
|
"""
|
||||||
|
Power Config Cluster: this generates the "Battery" entity for HA.
|
||||||
|
Receives updates from TuyaSmokeDetectorCluster.
|
||||||
|
"""
|
||||||
|
|
||||||
|
_CONSTANT_ATTRIBUTES = {
|
||||||
|
TuyaPowerConfigurationCluster.attributes_by_name["battery_size"].id: BatterySize.AAA,
|
||||||
|
TuyaPowerConfigurationCluster.attributes_by_name["battery_quantity"].id: 2,
|
||||||
|
TuyaPowerConfigurationCluster.attributes_by_name["battery_rated_voltage"].id: 15,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaTamperDetection(TuyaLocalCluster, BinaryInput):
|
||||||
|
"""
|
||||||
|
Tamper Detection Cluster: this generates the "Binary input" entity for HA, which is updated
|
||||||
|
with the Tampered state. Receives updates from TuyaSmokeDetectorCluster.
|
||||||
|
"""
|
||||||
|
|
||||||
|
_CONSTANT_ATTRIBUTES = {
|
||||||
|
BinaryInput.attributes_by_name["description"].id: "Tamper Detected",
|
||||||
|
BinaryInput.attributes_by_name["active_text"].id: "Tampered",
|
||||||
|
BinaryInput.attributes_by_name["inactive_text"].id: "Clear",
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
"""Init."""
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.endpoint.device.tamper_detection_bus.add_listener(self)
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaSmokeDetector0601(CustomDevice):
|
||||||
|
"""TS0601 Smoke detector quirk."""
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
"""Init."""
|
||||||
|
self.ias_bus = Bus()
|
||||||
|
self.battery_bus = Bus()
|
||||||
|
self.tamper_detection_bus = Bus()
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
signature = {
|
||||||
|
MODELS_INFO: [
|
||||||
|
("_TZE200_uebojraa", "TS0601"),
|
||||||
|
],
|
||||||
|
ENDPOINTS: {
|
||||||
|
1: {
|
||||||
|
PROFILE_ID: zigpy.profiles.zha.PROFILE_ID,
|
||||||
|
DEVICE_TYPE: zigpy.profiles.zha.DeviceType.SMART_PLUG,
|
||||||
|
INPUT_CLUSTERS: [
|
||||||
|
Basic.cluster_id,
|
||||||
|
Groups.cluster_id,
|
||||||
|
Scenes.cluster_id,
|
||||||
|
TuyaManufCluster.cluster_id,
|
||||||
|
],
|
||||||
|
OUTPUT_CLUSTERS: [
|
||||||
|
Time.cluster_id,
|
||||||
|
Ota.cluster_id,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
replacement = {
|
||||||
|
ENDPOINTS: {
|
||||||
|
1: {
|
||||||
|
PROFILE_ID: zigpy.profiles.zha.PROFILE_ID,
|
||||||
|
DEVICE_TYPE: zigpy.profiles.zha.DeviceType.IAS_ZONE,
|
||||||
|
INPUT_CLUSTERS: [
|
||||||
|
Basic.cluster_id,
|
||||||
|
Groups.cluster_id,
|
||||||
|
Scenes.cluster_id,
|
||||||
|
TuyaIasZone,
|
||||||
|
TuyaSmokeDetectorCluster,
|
||||||
|
TuyaPowerConfigCluster,
|
||||||
|
TuyaTamperDetection,
|
||||||
|
],
|
||||||
|
OUTPUT_CLUSTERS: [
|
||||||
|
Time.cluster_id,
|
||||||
|
Ota.cluster_id,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
149
custom_zha_quirks/ts0601_valve_garden.py
Normal file
149
custom_zha_quirks/ts0601_valve_garden.py
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
"""Tuya valve devices."""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
from zigpy.profiles import zha
|
||||||
|
from zigpy.quirks import CustomDevice
|
||||||
|
import zigpy.types as t
|
||||||
|
from zigpy.zcl import foundation
|
||||||
|
from zigpy.zcl.clusters.general import (
|
||||||
|
Basic,
|
||||||
|
Groups,
|
||||||
|
Ota,
|
||||||
|
PowerConfiguration,
|
||||||
|
Scenes,
|
||||||
|
Time,
|
||||||
|
)
|
||||||
|
|
||||||
|
from zhaquirks.const import (
|
||||||
|
DEVICE_TYPE,
|
||||||
|
ENDPOINTS,
|
||||||
|
INPUT_CLUSTERS,
|
||||||
|
MODELS_INFO,
|
||||||
|
OUTPUT_CLUSTERS,
|
||||||
|
PROFILE_ID,
|
||||||
|
)
|
||||||
|
from zhaquirks.tuya import NoManufacturerCluster
|
||||||
|
from zhaquirks.tuya.mcu import (
|
||||||
|
DPToAttributeMapping,
|
||||||
|
TuyaAttributesCluster,
|
||||||
|
TuyaDPType,
|
||||||
|
TuyaLevelControl,
|
||||||
|
TuyaMCUCluster,
|
||||||
|
TuyaOnOff,
|
||||||
|
TuyaOnOffNM,
|
||||||
|
TuyaPowerConfigurationCluster,
|
||||||
|
)
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaLevelControlNM(NoManufacturerCluster, TuyaLevelControl):
|
||||||
|
"""Tuya LevelControl cluster with NoManufacturerID."""
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaValveManufCluster(TuyaMCUCluster):
|
||||||
|
"""Tuya valve manufacturer cluster."""
|
||||||
|
|
||||||
|
attributes = TuyaMCUCluster.attributes.copy()
|
||||||
|
attributes.update(
|
||||||
|
{
|
||||||
|
0xEF03: ("dp_3", t.uint32_t, True),
|
||||||
|
0xEF65: ("dp_101", t.uint32_t, True),
|
||||||
|
0xEF66: ("dp_102", t.uint32_t, True), # <-- new cluster attribute with fake IDs (102=0x66).Format= ID: ("name", type, True)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
dp_to_attribute: Dict[int, DPToAttributeMapping] = {
|
||||||
|
2: DPToAttributeMapping(
|
||||||
|
TuyaOnOffNM.ep_attribute,
|
||||||
|
"on_off",
|
||||||
|
dp_type=TuyaDPType.BOOL,
|
||||||
|
),
|
||||||
|
1: DPToAttributeMapping(
|
||||||
|
TuyaLevelControlNM.ep_attribute,
|
||||||
|
"current_level",
|
||||||
|
dp_type=TuyaDPType.VALUE,
|
||||||
|
converter=lambda x: (x * 255) // 100,
|
||||||
|
dp_converter=lambda x: (x * 100) // 255,
|
||||||
|
),
|
||||||
|
3: DPToAttributeMapping(
|
||||||
|
TuyaMCUCluster.ep_attribute,
|
||||||
|
"dp_3",
|
||||||
|
dp_type=TuyaDPType.VALUE,
|
||||||
|
),
|
||||||
|
101: DPToAttributeMapping(
|
||||||
|
TuyaMCUCluster.ep_attribute,
|
||||||
|
"dp_101",
|
||||||
|
dp_type=TuyaDPType.VALUE,
|
||||||
|
),
|
||||||
|
102: DPToAttributeMapping( # <-- device DP102
|
||||||
|
TuyaMCUCluster.ep_attribute, # <-- reference to the cluster which has the attribute
|
||||||
|
"dp_102", # <-- attribute "name"
|
||||||
|
dp_type=TuyaDPType.VALUE, # <-- DP Type it is related to the attribute type
|
||||||
|
),
|
||||||
|
108: DPToAttributeMapping(
|
||||||
|
TuyaPowerConfigurationCluster.ep_attribute,
|
||||||
|
"battery_percentage_remaining",
|
||||||
|
dp_type=TuyaDPType.VALUE,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
data_point_handlers = {
|
||||||
|
2: "_dp_2_attr_update",
|
||||||
|
1: "_dp_2_attr_update",
|
||||||
|
3: "_dp_2_attr_update",
|
||||||
|
101: "_dp_2_attr_update",
|
||||||
|
102: "_dp_2_attr_update",
|
||||||
|
108: "_dp_2_attr_update",
|
||||||
|
}
|
||||||
|
|
||||||
|
async def write_attributes(self, attributes, manufacturer=None):
|
||||||
|
"""Overwrite to force manufacturer code."""
|
||||||
|
|
||||||
|
return await super().write_attributes(
|
||||||
|
attributes, manufacturer=foundation.ZCLHeader.NO_MANUFACTURER_ID
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TuyaValve(CustomDevice):
|
||||||
|
"""Tuya valve device."""
|
||||||
|
|
||||||
|
signature = {
|
||||||
|
MODELS_INFO: [("_TZE200_sh1btabb", "TS0601")],
|
||||||
|
ENDPOINTS: {
|
||||||
|
# <SimpleDescriptor endpoint=1 profile=260 device_type=0x0051
|
||||||
|
# input_clusters=[0x0000, 0x0004, 0x0005, 0xef00]
|
||||||
|
# output_clusters=[0x000a, 0x0019]>
|
||||||
|
1: {
|
||||||
|
PROFILE_ID: zha.PROFILE_ID,
|
||||||
|
DEVICE_TYPE: zha.DeviceType.SMART_PLUG,
|
||||||
|
INPUT_CLUSTERS: [
|
||||||
|
Basic.cluster_id,
|
||||||
|
Groups.cluster_id,
|
||||||
|
Scenes.cluster_id,
|
||||||
|
TuyaValveManufCluster.cluster_id,
|
||||||
|
],
|
||||||
|
OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
replacement = {
|
||||||
|
ENDPOINTS: {
|
||||||
|
1: {
|
||||||
|
DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
|
||||||
|
INPUT_CLUSTERS: [
|
||||||
|
Basic.cluster_id,
|
||||||
|
Groups.cluster_id,
|
||||||
|
Scenes.cluster_id,
|
||||||
|
TuyaValveManufCluster,
|
||||||
|
TuyaOnOffNM,
|
||||||
|
TuyaLevelControlNM,
|
||||||
|
TuyaPowerConfigurationCluster,
|
||||||
|
],
|
||||||
|
OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,82 +1,115 @@
|
|||||||
#############################################
|
#############################################
|
||||||
# Common
|
#############################################
|
||||||
|
# BYD ATTO3 12V Battery Monitor
|
||||||
|
# Monitoring the status of a vehicle 12V battery with
|
||||||
|
# an esp8266 (D1 Mini). It will obviously only
|
||||||
|
# transmit when the vehicle is within wifi range.
|
||||||
|
# Voltage is measured with a resistor voltage divider
|
||||||
|
# into the analogue GPIO on the esp8266.
|
||||||
|
# https://zorruno.com/2022/vehicle-12v-battery-monitoring/
|
||||||
|
##############################################
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Variable Substitutions
|
||||||
#############################################
|
#############################################
|
||||||
substitutions:
|
substitutions:
|
||||||
devicename: esp-attobat
|
devicename: "esp-attobat"
|
||||||
nice_devicename: "Atto Battery Monitor"
|
friendly_name: "Atto3 12V Battery Monitor"
|
||||||
|
description_comment: "Atto3 12V Battery Monitor (when home)"
|
||||||
|
api_key: !secret esp-attobat_api_key #unfortunately you can't use substitutions in secrets names
|
||||||
|
ota_pass: !secret esp-attobat_ota_pass #unfortunately you can't use substitutions in secrets names
|
||||||
|
mqtt_topic: "esphome" #main topic for the mqtt server, call it what you like
|
||||||
|
update_time: 30s #update time for for temp sensors etc
|
||||||
|
#Add these if we are giving it a static ip, or remove them in the Wifi section
|
||||||
|
static_ip_address: !secret esp-attobat_static_ip
|
||||||
|
static_ip_gateway: !secret esp-attobat_gateway
|
||||||
|
static_ip_subnet: !secret esp-attobat_subnet
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# ESPHome
|
# ESPHome
|
||||||
#############################################
|
#############################################
|
||||||
esphome:
|
esphome:
|
||||||
name: $devicename
|
name: $devicename
|
||||||
|
comment: ${description_comment} #appears on the esphome page in HA
|
||||||
|
|
||||||
########################################
|
#############################################
|
||||||
# Specific board for ESPHome device
|
# ESP Platform and Framework
|
||||||
########################################
|
# https://esphome.io/components/esp8266.html
|
||||||
|
# https://esphome.io/components/esp32.html
|
||||||
|
#############################################
|
||||||
esp8266:
|
esp8266:
|
||||||
board: d1_mini
|
board: d1_mini
|
||||||
|
framework:
|
||||||
|
version: latest #recommended, latest or dev
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# ESPHome Logging Enable
|
# ESPHome Logging Enable
|
||||||
|
# https://esphome.io/components/logger.html
|
||||||
#############################################
|
#############################################
|
||||||
logger:
|
logger:
|
||||||
|
level: INFO #INFO Level suggested, or DEBUG for testing
|
||||||
|
#baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||||||
|
#esp8266_store_log_strings_in_flash: false
|
||||||
|
#tx_buffer_size: 64
|
||||||
|
|
||||||
########################################
|
#############################################
|
||||||
# Enable the Home Assistant API
|
# Enable the Home Assistant API
|
||||||
########################################
|
# https://esphome.io/components/api.html
|
||||||
|
#############################################
|
||||||
api:
|
api:
|
||||||
encryption:
|
encryption:
|
||||||
key: !secret esp-attobat_api_key
|
key: ${api_key}
|
||||||
|
|
||||||
########################################
|
#############################################
|
||||||
# Enable Over the Air Update Capability
|
# Enable Over the Air Update Capability
|
||||||
# Safe mode will detect boot loops
|
# https://esphome.io/components/ota.html?highlight=ota
|
||||||
########################################
|
#############################################
|
||||||
ota:
|
ota:
|
||||||
safe_mode: true
|
safe_mode: true #Safe mode will detect boot loops
|
||||||
password: !secret esp-attobat_ota_pass
|
password: ${ota_pass}
|
||||||
|
|
||||||
########################################
|
#############################################
|
||||||
# Use Wifi
|
# Wifi Settings
|
||||||
# (credentials are in secrets file)
|
# https://esphome.io/components/wifi.html
|
||||||
########################################
|
#############################################
|
||||||
wifi:
|
wifi:
|
||||||
ssid: !secret wifi_ssid
|
ssid: !secret wifi_ssid
|
||||||
password: !secret wifi_password
|
password: !secret wifi_password
|
||||||
# Details for fallback hotspot (captive portal) in case wifi connection fails
|
#power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||||
ap:
|
|
||||||
ssid: "Esp-attobat2 Fallback Hotspot"
|
|
||||||
password: !secret fallback_ap_password
|
|
||||||
# Static IP (for lower power/quicker on time)
|
# Static IP (for lower power/quicker on time)
|
||||||
manual_ip:
|
manual_ip:
|
||||||
static_ip: !secret esp-attobat_static_ip
|
static_ip: ${static_ip_address}
|
||||||
gateway: !secret esp-attobat_gateway
|
gateway: ${static_ip_gateway}
|
||||||
subnet: !secret esp-attobat_subnet
|
subnet: ${static_ip_subnet}
|
||||||
|
ap: #Details for fallback hotspot (captive portal) in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode
|
||||||
|
ssid: ${devicename} fallback AP
|
||||||
|
password: !secret fallback_ap_password
|
||||||
|
ap_timeout: 5min #default is 1min
|
||||||
|
captive_portal: # Fallback captive portal https://esphome.io/components/captive_portal.html
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Fallback captive portal
|
|
||||||
#############################################
|
|
||||||
captive_portal:
|
|
||||||
|
|
||||||
########################################
|
|
||||||
# Web Portal for display and monitoring
|
# Web Portal for display and monitoring
|
||||||
########################################
|
#############################################
|
||||||
web_server:
|
web_server:
|
||||||
port: 80
|
port: 80
|
||||||
|
version: 2
|
||||||
|
include_internal: true
|
||||||
|
ota: false
|
||||||
auth:
|
auth:
|
||||||
username: !secret web_server_username
|
username: !secret web_server_username
|
||||||
password: !secret web_server_password
|
password: !secret web_server_password
|
||||||
|
|
||||||
########################################
|
#############################################
|
||||||
# MQTT Monitoring
|
# MQTT Monitoring
|
||||||
########################################
|
# https://esphome.io/components/mqtt.html?highlight=mqtt
|
||||||
|
# MUST also have api enabled if you enable MQTT
|
||||||
|
#############################################
|
||||||
mqtt:
|
mqtt:
|
||||||
broker: !secret mqtt_server
|
broker: !secret mqtt_server
|
||||||
topic_prefix: esphome/esp-attobat
|
topic_prefix: ${mqtt_topic}/${devicename}
|
||||||
username: !secret mqtt_username
|
#username: !secret mqtt_username
|
||||||
password: !secret mqtt_password
|
#password: !secret mqtt_password
|
||||||
#
|
#
|
||||||
# Availability Topic
|
# Availability Topic
|
||||||
#birth_message:
|
#birth_message:
|
||||||
@@ -98,6 +131,7 @@ mqtt:
|
|||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Deep Sleep
|
# Deep Sleep
|
||||||
|
# https://esphome.io/components/deep_sleep.html
|
||||||
########################################
|
########################################
|
||||||
deep_sleep:
|
deep_sleep:
|
||||||
run_duration: 20s
|
run_duration: 20s
|
||||||
|
@@ -1,75 +1,117 @@
|
|||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
# OVEN POWER MONITOR
|
||||||
|
# Monitoring power of an oven (at the main
|
||||||
|
# switchboard) using a sonoff basic (esp8266)
|
||||||
|
# and a PZEM-004T. The relay also allows disabling
|
||||||
|
# of the oven with a contactor (eg on smoke detection)
|
||||||
|
# https://zorruno.com/2022/nodered-oven-notifications/
|
||||||
|
##############################################
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Variable Substitutions
|
||||||
|
#############################################
|
||||||
|
substitutions:
|
||||||
|
devicename: "esp-mainovenmonitor"
|
||||||
|
friendly_name: "esp-mainovenmonitor"
|
||||||
|
description_comment: "Oven power monitoring and disable, with a sonoff basic"
|
||||||
|
api_key: !secret esp-mainovenmonitor_api_key #unfortunately you can't use substitutions in secrets names
|
||||||
|
ota_pass: !secret esp-mainovenmonitor_ota_pass #unfortunately you can't use substitutions in secrets names
|
||||||
|
mqtt_topic: "esphome" #main topic for the mqtt server, call it what you like
|
||||||
|
#update_time: 30s #update time for for temp sensors etc
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# ESPHome
|
# ESPHome
|
||||||
#############################################
|
#############################################
|
||||||
esphome:
|
esphome:
|
||||||
name: "esp-mainovenmonitor"
|
name: ${devicename}
|
||||||
|
comment: ${description_comment} #appears on the esphome page in HA
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Specific board for ESPHome device
|
# ESP Platform and Framework
|
||||||
|
# https://esphome.io/components/esp8266.html
|
||||||
|
# https://esphome.io/components/esp32.html
|
||||||
#############################################
|
#############################################
|
||||||
esp8266:
|
esp8266:
|
||||||
board: sonoff_basic
|
#board: sonoff_basic
|
||||||
|
#board: esp01_1m
|
||||||
|
board: esp8285
|
||||||
|
framework:
|
||||||
|
version: latest #recommended, latest or dev
|
||||||
|
#esp32:
|
||||||
|
# board: nodemcu-32s
|
||||||
|
# framework:
|
||||||
|
# type: arduino
|
||||||
|
# #type: esp-idf #Suggested Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
# version: recommended #recommended, latest or dev
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# ESPHome Logging Enable
|
# ESPHome Logging Enable
|
||||||
|
# https://esphome.io/components/logger.html
|
||||||
#############################################
|
#############################################
|
||||||
# NOTE: Baudrate set to 0 as we are using the UART with PZEM
|
|
||||||
logger:
|
logger:
|
||||||
baud_rate: 0
|
level: INFO #INFO Level suggested, or DEBUG for testing
|
||||||
|
baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||||||
|
#esp8266_store_log_strings_in_flash: false
|
||||||
|
#tx_buffer_size: 64
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Enable the Home Assistant API
|
# Enable the Home Assistant API
|
||||||
|
# https://esphome.io/components/api.html
|
||||||
#############################################
|
#############################################
|
||||||
api:
|
api:
|
||||||
encryption:
|
encryption:
|
||||||
key: !secret esp-mainovenmonitor_api_key
|
key: ${api_key}
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Enable Over the Air Update Capability
|
# Enable Over the Air Update Capability
|
||||||
# Safe mode will detect boot loops
|
# https://esphome.io/components/ota.html?highlight=ota
|
||||||
#############################################
|
#############################################
|
||||||
ota:
|
ota:
|
||||||
safe_mode: true
|
safe_mode: true #Safe mode will detect boot loops
|
||||||
password: !secret esp-mainovenmonitor_ota_pass
|
password: ${ota_pass}
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Use Wifi
|
# Wifi Settings
|
||||||
|
# https://esphome.io/components/wifi.html
|
||||||
#############################################
|
#############################################
|
||||||
wifi:
|
wifi:
|
||||||
ssid: !secret wifi_ssid
|
ssid: !secret wifi_ssid
|
||||||
password: !secret wifi_password
|
password: !secret wifi_password
|
||||||
# Details for fallback hotspot (captive portal)
|
#power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||||
# in case wifi connection fails
|
#manual_ip: #optional static IP address
|
||||||
ap:
|
#static_ip: 192.168.x.x
|
||||||
ssid: "Mainovenmonitor Fallback Hotspot"
|
#gateway: 192.168.X.x
|
||||||
|
#subnet: 255.255.255.0
|
||||||
|
ap: #Details for fallback hotspot (captive portal) in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode
|
||||||
|
ssid: $devicename fallback AP
|
||||||
password: !secret fallback_ap_password
|
password: !secret fallback_ap_password
|
||||||
# manual_ip:
|
ap_timeout: 5min #default is 1min
|
||||||
# static_ip: 192.168.x.x
|
captive_portal: # Fallback captive portal https://esphome.io/components/captive_portal.html
|
||||||
# gateway: 192.168.X.x
|
|
||||||
# subnet: 255.255.255.0
|
|
||||||
|
|
||||||
#############################################
|
|
||||||
# Fallback captive portal
|
|
||||||
#############################################
|
|
||||||
captive_portal:
|
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Web Portal for display and monitoring
|
# Web Portal for display and monitoring
|
||||||
#############################################
|
#############################################
|
||||||
web_server:
|
web_server:
|
||||||
port: 80
|
port: 80
|
||||||
auth:
|
version: 2
|
||||||
username: !secret web_server_username
|
include_internal: true
|
||||||
password: !secret web_server_password
|
ota: false
|
||||||
|
# auth:
|
||||||
|
# username: !secret web_server_username
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# MQTT Monitoring
|
# MQTT Monitoring
|
||||||
|
# https://esphome.io/components/mqtt.html?highlight=mqtt
|
||||||
|
# MUST also have api enabled if you enable MQTT
|
||||||
#############################################
|
#############################################
|
||||||
mqtt:
|
mqtt:
|
||||||
broker: !secret mqtt_server
|
broker: !secret mqtt_server
|
||||||
topic_prefix: esphome/esp-mainovenmonitor
|
topic_prefix: ${mqtt_topic}/${devicename}
|
||||||
username: !secret mqtt_username
|
#username: !secret mqtt_username
|
||||||
password: !secret mqtt_password
|
#password: !secret mqtt_password
|
||||||
|
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
@@ -116,9 +158,9 @@ switch:
|
|||||||
name: "Main Oven Disable"
|
name: "Main Oven Disable"
|
||||||
pin: GPIO12
|
pin: GPIO12
|
||||||
|
|
||||||
#button:
|
button:
|
||||||
# - platform: restart
|
- platform: restart
|
||||||
# name: "Main Oven ESPHome Restart"
|
name: "Main Oven ESPHome Restart"
|
||||||
|
|
||||||
|
|
||||||
# LED Flashes on errors or warnings
|
# LED Flashes on errors or warnings
|
||||||
|
370
esphome/esp-mmwave-office-7776ec copy.yaml.old
Normal file
370
esphome/esp-mmwave-office-7776ec copy.yaml.old
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
# https://digiblur.com/2023/05/24/esphome-mmwave-presence-how-to-guide/
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
name: esp-mmwave-office-7776ec
|
||||||
|
friendly_name: esp-mmwave-office
|
||||||
|
update_time: 30s
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
name: ${name}
|
||||||
|
friendly_name: ${friendly_name}
|
||||||
|
name_add_mac_suffix: false
|
||||||
|
#project:
|
||||||
|
#name: esphome.web
|
||||||
|
#version: '1.0'
|
||||||
|
on_boot: #LD1125H Initial Setting
|
||||||
|
priority: -200
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
#############################################
|
||||||
|
# NOTE: Baudrate set to 0 as we are using the UART with PZEM
|
||||||
|
logger:
|
||||||
|
level: INFO #You Can Use "INFO" Level
|
||||||
|
baud_rate: 0
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
#encryption:
|
||||||
|
# key: !secret esp-mainovenmonitor_api_key
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# Safe mode will detect boot loops
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
# safe_mode: true
|
||||||
|
# password: !secret esp-mainovenmonitor_ota_pass
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Use Wifi
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
power_save_mode: LIGHT
|
||||||
|
# Details for fallback hotspot (captive portal)
|
||||||
|
# in case wifi connection fails
|
||||||
|
ap:
|
||||||
|
ssid: "MMwave Office Fallback Hotspot"
|
||||||
|
password: !secret fallback_ap_password
|
||||||
|
# manual_ip:
|
||||||
|
# static_ip: 192.168.x.x
|
||||||
|
# gateway: 192.168.X.x
|
||||||
|
# subnet: 255.255.255.0
|
||||||
|
|
||||||
|
|
||||||
|
# Allow provisioning Wi-Fi via serial
|
||||||
|
#improv_serial:
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Fallback captive portal
|
||||||
|
#############################################
|
||||||
|
# In combination with the `ap` this allows the user
|
||||||
|
# to provision wifi credentials to the device via WiFi AP.
|
||||||
|
captive_portal:
|
||||||
|
|
||||||
|
#dashboard_import:
|
||||||
|
# package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
|
||||||
|
# import_full_config: true
|
||||||
|
|
||||||
|
# Sets up Bluetooth LE (Only on ESP32) to allow the user
|
||||||
|
# to provision wifi credentials to the device.
|
||||||
|
##esp32_improv:
|
||||||
|
## authorizer: none
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
#############################################
|
||||||
|
#web_server:
|
||||||
|
# port: 80
|
||||||
|
# auth:
|
||||||
|
# username: !secret web_server_username
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
|
||||||
|
i2c:
|
||||||
|
sda: GPIO19
|
||||||
|
scl: GPIO21
|
||||||
|
scan: True
|
||||||
|
|
||||||
|
#esp32:
|
||||||
|
# board: esp32dev
|
||||||
|
# framework:
|
||||||
|
# type: arduino
|
||||||
|
esp32:
|
||||||
|
board: nodemcu-32s
|
||||||
|
framework:
|
||||||
|
type: esp-idf #Suggest Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
|
||||||
|
external_components:
|
||||||
|
- source:
|
||||||
|
type: git
|
||||||
|
url: https://github.com/ssieb/custom_components #Thanks for @ssieb components.
|
||||||
|
components: [ serial ]
|
||||||
|
|
||||||
|
|
||||||
|
uart:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# rx_pin: GPIO1 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# tx_pin: GPIO0 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
baud_rate: 115200
|
||||||
|
data_bits: 8
|
||||||
|
stop_bits: 1
|
||||||
|
parity: NONE
|
||||||
|
# debug:
|
||||||
|
# direction: BOTH
|
||||||
|
# dummy_receiver: false
|
||||||
|
# after:
|
||||||
|
# delimiter: "\n"
|
||||||
|
# sequence:
|
||||||
|
# - lambda: UARTDebug::log_string(direction, bytes);
|
||||||
|
globals:
|
||||||
|
- id: LD1125H_Last_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Last_Mov_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Clearence_Status
|
||||||
|
type: bool
|
||||||
|
restore_value: no
|
||||||
|
initial_value: "false"
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #ESP32 OnBroad LED
|
||||||
|
inverted: false
|
||||||
|
#web_server: #Avoid Using Web Server To Prevent Hang
|
||||||
|
# port: 80
|
||||||
|
interval:
|
||||||
|
- interval: 1s #Clearance Scan Time
|
||||||
|
setup_priority: -200
|
||||||
|
then:
|
||||||
|
lambda: |-
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) {
|
||||||
|
if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Clearance");
|
||||||
|
id(LD1125H_Clearence_Status) = true;
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == true) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth1 #mth1 is 0~2.8m Sensitivity.
|
||||||
|
id: LD1125H_mth1
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "60.0" #Default mth1 Setting
|
||||||
|
min_value: 10.0
|
||||||
|
max_value: 600.0
|
||||||
|
step: 5.0
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth2 #mth2 is 2.8~8m Sensitivity.
|
||||||
|
id: LD1125H_mth2
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "30" #Default mth2 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 300
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth3 #mth3 is above 8m Sensitivity.
|
||||||
|
id: LD1125H_mth3
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "20" #Default mth3 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 200
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H rmax #rmax is max detection distance.
|
||||||
|
id: LD1125H_rmax
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "8" #Default rmax Setting
|
||||||
|
min_value: 0.4
|
||||||
|
max_value: 12
|
||||||
|
step: 0.1
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Clearence Time
|
||||||
|
id: LD1125H_Clear_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 20
|
||||||
|
step: 0.5
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement Time
|
||||||
|
id: LD1125H_Mov_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "1" #LD1125H Mov > Occ Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 10
|
||||||
|
step: 0.5
|
||||||
|
sensor:
|
||||||
|
- platform: bme280_i2c
|
||||||
|
temperature:
|
||||||
|
name: ${upper_devicename} BME280 Temp
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
pressure:
|
||||||
|
name: ${upper_devicename} BME280 Pressure
|
||||||
|
oversampling: 2x
|
||||||
|
humidity:
|
||||||
|
name: ${upper_devicename} BME280 Humidity
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
address: 0x76
|
||||||
|
update_interval: ${update_time}
|
||||||
|
# - platform: aht10
|
||||||
|
# temperature:
|
||||||
|
# accuracy_decimals: 2
|
||||||
|
# name: ${upper_devicename} AHT21 Temp
|
||||||
|
# humidity:
|
||||||
|
# accuracy_decimals: 2
|
||||||
|
# name: ${upper_devicename} AHT21 Humidity
|
||||||
|
# update_interval: ${update_time}
|
||||||
|
# - platform: wifi_signal
|
||||||
|
# name: ${upper_devicename} WiFi Signal
|
||||||
|
# update_interval: 60s
|
||||||
|
- platform: uptime
|
||||||
|
name: ${upper_devicename} Uptime
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Distance
|
||||||
|
id: LD1125H_Distance
|
||||||
|
icon: "mdi:signal-distance-variant"
|
||||||
|
unit_of_measurement: "m"
|
||||||
|
accuracy_decimals: 2
|
||||||
|
filters: # Use Fliter To Debounce
|
||||||
|
- sliding_window_moving_average:
|
||||||
|
window_size: 8
|
||||||
|
send_every: 2
|
||||||
|
- heartbeat: 0.2s
|
||||||
|
text_sensor:
|
||||||
|
- platform: serial
|
||||||
|
uart_id: LD1125H_UART_BUS
|
||||||
|
name: ${upper_devicename} LD1125H UART Text
|
||||||
|
id: LD1125H_UART_Text
|
||||||
|
icon: "mdi:format-text"
|
||||||
|
internal: True #If Don't Want to See UART Receive Data, Set To True
|
||||||
|
on_value:
|
||||||
|
lambda: |-
|
||||||
|
if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Occupancy");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
id(LD1125H_Occupancy).publish_state("Movement");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == false) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Mov_Time) = time(NULL);
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy Status
|
||||||
|
id: LD1125H_Occupancy
|
||||||
|
icon: "mdi:motion-sensor"
|
||||||
|
binary_sensor:
|
||||||
|
- platform: status
|
||||||
|
name: ${upper_devicename} Status
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy or Movement
|
||||||
|
id: LD1125H_MovOcc_Binary
|
||||||
|
device_class: occupancy
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement
|
||||||
|
id: LD1125H_Mov_Binary
|
||||||
|
device_class: motion
|
437
esphome/esp-occupancyoffice.yaml
Normal file
437
esphome/esp-occupancyoffice.yaml
Normal file
@@ -0,0 +1,437 @@
|
|||||||
|
|
||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
# HiLink LD1125H mmWave sensor, with BME280 Temp/Hum/Pres Sensor on an ESP32
|
||||||
|
# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/tree/main
|
||||||
|
# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/blob/main/LD1125H/ESP32-LD1125H-Complete.yaml
|
||||||
|
#
|
||||||
|
# mth1: 0 to 2.8m sensitive
|
||||||
|
# mth2: 2.8 to 8m sensitive
|
||||||
|
# mth3: above 8m sensitive
|
||||||
|
# rmax: max distance
|
||||||
|
# Clearance Time: Mov/Occ to Clearance waiting time
|
||||||
|
# Movement Time: Mov to Occ waiting time
|
||||||
|
#
|
||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Variable Substitutions
|
||||||
|
#############################################
|
||||||
|
substitutions:
|
||||||
|
devicename: "esp-occupancyoffice"
|
||||||
|
friendly_name: "Office State"
|
||||||
|
description_comment: "D1 Mini ESP32 with LD1125H mmWave and environment sensors for downstairs office"
|
||||||
|
api_key: !secret esp-occupancyoffice_api_key #unfortunately you can't use substitutions in secrets names
|
||||||
|
ota_pass: !secret esp-occupancyoffice_ota_pass #unfortunately you can't use substitutions in secrets names
|
||||||
|
mqtt_topic: "esphome" #main topic for the mqtt server, call it what you like
|
||||||
|
update_time: 30s #update time for for temp sensors etc
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome
|
||||||
|
# https://esphome.io/components/esphome.html
|
||||||
|
#############################################
|
||||||
|
esphome:
|
||||||
|
name: ${devicename}
|
||||||
|
comment: ${description_comment} #appears on the esphome page in HA
|
||||||
|
on_boot: #LD1125H Initial Setting, will remember previous values (if set)
|
||||||
|
priority: -200
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESP Platform and Framework
|
||||||
|
# https://esphome.io/components/esp32.html
|
||||||
|
#############################################
|
||||||
|
esp32:
|
||||||
|
#board: nodemcu-32s
|
||||||
|
board: esp32dev
|
||||||
|
framework:
|
||||||
|
#type: arduino
|
||||||
|
type: esp-idf #Suggested Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
version: recommended #recommended, latest or dev
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# i2s bus
|
||||||
|
# https://esphome.io/components/i2c.html
|
||||||
|
#############################################
|
||||||
|
i2c:
|
||||||
|
sda: GPIO19
|
||||||
|
scl: GPIO21
|
||||||
|
scan: True
|
||||||
|
frequency: 100kHz #10, 50, 100, 200, 800 are possible settings, 100kHz was reliable for me
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome external or custom components to use
|
||||||
|
# https://esphome.io/components/external_components.html
|
||||||
|
#############################################
|
||||||
|
external_components:
|
||||||
|
- source:
|
||||||
|
type: git
|
||||||
|
url: https://github.com/ssieb/custom_components #Thanks for @ssieb components.
|
||||||
|
components: [ serial ] #text_sensor that reads lines for a uart. Also, a sensor that reads single values from the uart.
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
# https://esphome.io/components/logger.html
|
||||||
|
#############################################
|
||||||
|
logger:
|
||||||
|
level: INFO #INFO Level suggested, or DEBUG for testing
|
||||||
|
baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||||||
|
#esp8266_store_log_strings_in_flash: false
|
||||||
|
#tx_buffer_size: 64
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
# https://esphome.io/components/api.html
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: ${api_key}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# https://esphome.io/components/ota.html?highlight=ota
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
safe_mode: true #Safe mode will detect boot loops
|
||||||
|
password: ${ota_pass}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Wifi Settings
|
||||||
|
# https://esphome.io/components/wifi.html
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
#power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||||
|
#manual_ip: #optional static IP address
|
||||||
|
#static_ip: 192.168.x.x
|
||||||
|
#gateway: 192.168.X.x
|
||||||
|
#subnet: 255.255.255.0
|
||||||
|
ap: #Details for fallback hotspot (captive portal) in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode
|
||||||
|
ssid: $devicename fallback AP
|
||||||
|
password: !secret fallback_ap_password
|
||||||
|
ap_timeout: 5min #default is 1min
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
# Turning this off is probably a good idea to save resources.
|
||||||
|
# https://esphome.io/components/web_server.html
|
||||||
|
#############################################
|
||||||
|
web_server:
|
||||||
|
port: 80
|
||||||
|
# username: !secret web_server_username #probably a good idea to secure it
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# MQTT Monitoring
|
||||||
|
# https://esphome.io/components/mqtt.html?highlight=mqtt
|
||||||
|
# MUST also have api enabled if you enable MQTT
|
||||||
|
#############################################
|
||||||
|
mqtt:
|
||||||
|
broker: !secret mqtt_server
|
||||||
|
topic_prefix: ${mqtt_topic}/${devicename}
|
||||||
|
username: !secret mqtt_username
|
||||||
|
password: !secret mqtt_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Bluetooth
|
||||||
|
# https://esphome.io/components/bluetooth_proxy.html
|
||||||
|
# https://esphome.io/components/esp32_ble_tracker.html
|
||||||
|
# Remember that this takes a LOT of processing. On the
|
||||||
|
# ESP32, enable the IDF framework, and disable the
|
||||||
|
# Web server component. Changing to the IDF framework
|
||||||
|
# needs to be via cable not OTA to change the
|
||||||
|
# partition setup.
|
||||||
|
#############################################
|
||||||
|
#bluetooth_proxy:
|
||||||
|
|
||||||
|
#esp32_ble_tracker:
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# UART Serial
|
||||||
|
# hardware on EPS32, but software, and can be glitchy on ESP8266
|
||||||
|
# https://esphome.io/components/uart.html?highlight=uart
|
||||||
|
#############################################
|
||||||
|
uart:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# rx_pin: GPIO1 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# tx_pin: GPIO0 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
baud_rate: 115200
|
||||||
|
data_bits: 8
|
||||||
|
stop_bits: 1
|
||||||
|
parity: NONE
|
||||||
|
# debug:
|
||||||
|
# direction: BOTH
|
||||||
|
# dummy_receiver: false
|
||||||
|
# after:
|
||||||
|
# delimiter: "\n"
|
||||||
|
# sequence:
|
||||||
|
# - lambda: UARTDebug::log_string(direction, bytes);
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Global Variables for use in automations etc
|
||||||
|
# https://esphome.io/guides/automations.html?highlight=globals#global-variables
|
||||||
|
#############################################
|
||||||
|
globals:
|
||||||
|
- id: LD1125H_Last_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Last_Mov_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Clearence_Status
|
||||||
|
type: bool
|
||||||
|
restore_value: no
|
||||||
|
initial_value: "false"
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General esp status LED
|
||||||
|
# https://esphome.io/components/status_led.html
|
||||||
|
#############################################
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #ESP32 Onboard LED
|
||||||
|
ignore_strapping_warning: True #https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
|
||||||
|
inverted: false
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Interval Automations
|
||||||
|
# https://esphome.io/guides/automations.html
|
||||||
|
#############################################
|
||||||
|
interval:
|
||||||
|
- interval: 1s #Clearance Scan Time
|
||||||
|
setup_priority: -200
|
||||||
|
then:
|
||||||
|
lambda: |-
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) {
|
||||||
|
if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Clearance");
|
||||||
|
id(LD1125H_Clearence_Status) = true;
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == true) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Number Sensors (custom component)
|
||||||
|
# refer https://github.com/ssieb/esphome_components/tree/master/components/serial
|
||||||
|
#############################################
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H mth1 #mth1 is 0~2.8m Sensitivity.
|
||||||
|
id: LD1125H_mth1
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "60.0" #Default mth1 Setting
|
||||||
|
min_value: 10.0
|
||||||
|
max_value: 600.0
|
||||||
|
step: 5.0
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H mth2 #mth2 is 2.8~8m Sensitivity.
|
||||||
|
id: LD1125H_mth2
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "30" #Default mth2 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 300
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H mth3 #mth3 is above 8m Sensitivity.
|
||||||
|
id: LD1125H_mth3
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "20" #Default mth3 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 200
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H rmax #rmax is max detection distance.
|
||||||
|
id: LD1125H_rmax
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "8" #Default rmax Setting
|
||||||
|
min_value: 0.4
|
||||||
|
max_value: 12
|
||||||
|
step: 0.1
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Clearence Time
|
||||||
|
id: LD1125H_Clear_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 20
|
||||||
|
step: 0.5
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Movement Time
|
||||||
|
id: LD1125H_Mov_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "1" #LD1125H Mov > Occ Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 10
|
||||||
|
step: 0.5
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General Sensors
|
||||||
|
# https://esphome.io/components/sensor/index.html
|
||||||
|
#############################################
|
||||||
|
sensor:
|
||||||
|
- platform: bme280_i2c
|
||||||
|
temperature:
|
||||||
|
name: ${friendly_name} BME280 Temp
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
pressure:
|
||||||
|
name: ${friendly_name} BME280 Pressure
|
||||||
|
oversampling: 2x
|
||||||
|
humidity:
|
||||||
|
name: ${friendly_name} BME280 Humidity
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
address: 0x76
|
||||||
|
update_interval: ${update_time}
|
||||||
|
- platform: uptime
|
||||||
|
name: ${friendly_name} Uptime
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Distance
|
||||||
|
id: LD1125H_Distance
|
||||||
|
icon: "mdi:signal-distance-variant"
|
||||||
|
unit_of_measurement: "m"
|
||||||
|
accuracy_decimals: 2
|
||||||
|
filters: # Use Fliter To Debounce
|
||||||
|
- sliding_window_moving_average:
|
||||||
|
window_size: 8
|
||||||
|
send_every: 2
|
||||||
|
- heartbeat: 0.2s
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Text Sensors (custom component)
|
||||||
|
# refer https://github.com/ssieb/esphome_components/tree/master/components/serial
|
||||||
|
#############################################
|
||||||
|
text_sensor:
|
||||||
|
- platform: serial
|
||||||
|
uart_id: LD1125H_UART_BUS
|
||||||
|
name: ${friendly_name} LD1125H UART Text
|
||||||
|
id: LD1125H_UART_Text
|
||||||
|
icon: "mdi:format-text"
|
||||||
|
internal: True #If Don't Want to See UART Receive Data, Set To True
|
||||||
|
on_value:
|
||||||
|
lambda: |-
|
||||||
|
if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Occupancy");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
id(LD1125H_Occupancy).publish_state("Movement");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == false) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Mov_Time) = time(NULL);
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Occupancy Status
|
||||||
|
id: LD1125H_Occupancy
|
||||||
|
icon: "mdi:motion-sensor"
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Binary Sensors
|
||||||
|
# https://esphome.io/components/binary_sensor/index.html
|
||||||
|
#############################################
|
||||||
|
binary_sensor:
|
||||||
|
- platform: status
|
||||||
|
name: ${friendly_name} Status
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Occupancy or Movement
|
||||||
|
id: LD1125H_MovOcc_Binary
|
||||||
|
device_class: occupancy
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Movement
|
||||||
|
id: LD1125H_Mov_Binary
|
||||||
|
device_class: motion
|
404
esphome/esp-occupancystair.yaml
Normal file
404
esphome/esp-occupancystair.yaml
Normal file
@@ -0,0 +1,404 @@
|
|||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
# HiLink LD2410 mmWave sensor, with BME280 Temp/Hum/Pres Sensor on an ESP32
|
||||||
|
# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/tree/main
|
||||||
|
# https://github.com/patrick3399/Hi-Link_mmWave_Radar_ESPHome/blob/main/LD1125H/ESP32-LD1125H-Complete.yaml
|
||||||
|
#
|
||||||
|
# https://esphome.io/components/sensor/ld2410.html
|
||||||
|
# https://www.simplysmart.house/blog/presence-detection-ld2410-home-assistant
|
||||||
|
#
|
||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Variable Substitutions
|
||||||
|
#############################################
|
||||||
|
substitutions:
|
||||||
|
devicename: "esp-occupancystair"
|
||||||
|
friendly_name: "Stair Occupancy"
|
||||||
|
description_comment: "D1 Mini ESP32 with LD2410 mmWave for internal stairwell and environment sensors for under house"
|
||||||
|
api_key: !secret esp-occupancystair_api_key #unfortunately you can't use substitutions in secrets names
|
||||||
|
ota_pass: !secret esp-occupancystair_ota_pass #unfortunately you can't use substitutions in secrets names
|
||||||
|
mqtt_topic: "esphome" #main topic for the mqtt server, call it what you like
|
||||||
|
update_time: 30s #update time for for temp sensors etc
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome
|
||||||
|
# https://esphome.io/components/esphome.html
|
||||||
|
#############################################
|
||||||
|
esphome:
|
||||||
|
name: ${devicename}
|
||||||
|
comment: ${description_comment} #appears on the esphome page in HA
|
||||||
|
#on_boot: #Initial Setting, will remember previous values (if set)
|
||||||
|
#priority: -200
|
||||||
|
#then:
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESP Platform and Framework
|
||||||
|
# https://esphome.io/components/esp32.html
|
||||||
|
#############################################
|
||||||
|
esp32:
|
||||||
|
board: esp32dev
|
||||||
|
framework:
|
||||||
|
#type: arduino
|
||||||
|
type: esp-idf #Suggested Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
version: recommended #recommended, latest or dev
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# i2s bus
|
||||||
|
# https://esphome.io/components/i2c.html
|
||||||
|
#############################################
|
||||||
|
i2c:
|
||||||
|
sda: GPIO19
|
||||||
|
scl: GPIO21
|
||||||
|
scan: True
|
||||||
|
frequency: 100kHz #10, 50, 100, 200, 800 are possible settings, 100kHz was reliable for me
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
# https://esphome.io/components/logger.html
|
||||||
|
#############################################
|
||||||
|
logger:
|
||||||
|
level: INFO #INFO Level suggested, or DEBUG for testing
|
||||||
|
baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||||||
|
#esp8266_store_log_strings_in_flash: false
|
||||||
|
#tx_buffer_size: 64
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
# https://esphome.io/components/api.html
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: ${api_key}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# https://esphome.io/components/ota.html?highlight=ota
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
safe_mode: true #Safe mode will detect boot loops
|
||||||
|
password: ${ota_pass}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Wifi Settings
|
||||||
|
# https://esphome.io/components/wifi.html
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
#power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||||
|
#manual_ip: #optional static IP address
|
||||||
|
#static_ip: 192.168.x.x
|
||||||
|
#gateway: 192.168.X.x
|
||||||
|
#subnet: 255.255.255.0
|
||||||
|
ap: #Details for fallback hotspot (captive portal) in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode
|
||||||
|
ssid: $devicename fallback AP
|
||||||
|
password: !secret fallback_ap_password
|
||||||
|
ap_timeout: 5min #default is 1min
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
# Turning this off is probably a good idea to save resources.
|
||||||
|
# https://esphome.io/components/web_server.html
|
||||||
|
#############################################
|
||||||
|
web_server:
|
||||||
|
port: 80
|
||||||
|
# username: !secret web_server_username #probably a good idea to secure it
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# MQTT Monitoring
|
||||||
|
# https://esphome.io/components/mqtt.html?highlight=mqtt
|
||||||
|
# MUST also have api enabled if you enable MQTT
|
||||||
|
#############################################
|
||||||
|
mqtt:
|
||||||
|
broker: !secret mqtt_server
|
||||||
|
topic_prefix: ${mqtt_topic}/${devicename}
|
||||||
|
username: !secret mqtt_username
|
||||||
|
password: !secret mqtt_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Bluetooth
|
||||||
|
# https://esphome.io/components/bluetooth_proxy.html
|
||||||
|
# https://esphome.io/components/esp32_ble_tracker.html
|
||||||
|
# Remember that this takes a LOT of processing. On the
|
||||||
|
# ESP32, enable the IDF framework, and disable the
|
||||||
|
# Web server component. Changing to the IDF framework
|
||||||
|
# needs to be via cable not OTA to change the
|
||||||
|
# partition setup.
|
||||||
|
#############################################
|
||||||
|
#bluetooth_proxy:
|
||||||
|
|
||||||
|
#esp32_ble_tracker:
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# UART Serial
|
||||||
|
# hardware on EPS32, but software, and can be glitchy on ESP8266
|
||||||
|
# https://esphome.io/components/uart.html?highlight=uart
|
||||||
|
#############################################
|
||||||
|
uart:
|
||||||
|
id: ld2410_uart
|
||||||
|
rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# rx_pin: GPIO1 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# tx_pin: GPIO0 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
baud_rate: 256000 # default for LD2410 is 25600, 8, 0, NONE
|
||||||
|
data_bits: 8
|
||||||
|
stop_bits: 1
|
||||||
|
parity: NONE
|
||||||
|
# debug:
|
||||||
|
# direction: BOTH
|
||||||
|
# dummy_receiver: false
|
||||||
|
# after:
|
||||||
|
# delimiter: "\n"
|
||||||
|
# sequence:
|
||||||
|
# - lambda: UARTDebug::log_string(direction, bytes);
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General esp status LED
|
||||||
|
# https://esphome.io/components/status_led.html
|
||||||
|
#############################################
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #ESP32 Onboard LED
|
||||||
|
ignore_strapping_warning: True #https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
|
||||||
|
inverted: false
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# LD2410 Sensors
|
||||||
|
# https://esphome.io/components/sensor/ld2410.html
|
||||||
|
# https://www.hlktech.net/index.php?id=988
|
||||||
|
#############################################
|
||||||
|
ld2410:
|
||||||
|
uart_id: ld2410_uart
|
||||||
|
#uart_id (Optional, ID): Manually specify the ID of the UART Component if you want to use multiple UART buses.
|
||||||
|
#throttle (Optional, int): Time in milliseconds to control the rate of data updates. Defaults to 1000ms.
|
||||||
|
#id (Optional, ID): Manually specify the ID for this LD2410 Sensor component if you need multiple components.
|
||||||
|
|
||||||
|
# light (Optional, int): When in engineering mode, indicates the light sensitivity, otherwise unknown. Value between 0 and 255 inclusive. Though it seems that the value 85 is the lowest value at complete darkness. All options from Sensor.
|
||||||
|
# moving_distance (Optional, int): Distance in cm of detected moving target. All options from Sensor.
|
||||||
|
# still_distance (Optional, int): Distance in cm of detected still target. All options from Sensor.
|
||||||
|
# moving_energy (Optional, int): Energy for moving target. Value between 0 and 100 inclusive. All options from Sensor.
|
||||||
|
# still_energy (Optional, int): Energy for still target. Value between 0 and 100 inclusive. All options from Sensor.
|
||||||
|
# detection_distance (Optional, int): Distance in cm of target. All options from Sensor.
|
||||||
|
# gX (Optional): Energies for the Xth gate (X => 0 to 8).
|
||||||
|
# move_energy (Optional, int): When in engineering mode, the move energy of the gate, otherwise unknown. Value between 0 and 100 inclusive. All options from Sensor.
|
||||||
|
#still_energy (Optional, int): When in engineering mode, the still energy of the gate, otherwise unknown. Value between 0 and 100 inclusive. All options from Sensor.
|
||||||
|
#ld2410_id (Optional, ID): Manually specify the ID for the LD2410 Sensor component if you are using multiple components.
|
||||||
|
|
||||||
|
#The ld2410 number values for setting thresholds
|
||||||
|
# timeout: 5s
|
||||||
|
# max_move_distance: 2.25m
|
||||||
|
# max_still_distance: 2.25m
|
||||||
|
# g0_move_threshold: 40 # 0m / 0'
|
||||||
|
# g0_still_threshold: 10 # 0m / 0'
|
||||||
|
# g1_move_threshold: 40 # 0 - 0.75m / 0 - 2.46'
|
||||||
|
# g1_still_threshold: 10 # 0 - 0.75m / 0 - 2.46'
|
||||||
|
# g2_move_threshold: 40 # 0.75 - 1.5m / 2.46' - 4.92'
|
||||||
|
# g2_still_threshold: 10 # 0.75 - 1.5m / 2.46' - 4.92'
|
||||||
|
# g3_move_threshold: 40 # 1.5 - 2.25m / 4.92' - 7.38'
|
||||||
|
# g3_still_threshold: 10 # 1.5 - 2.25m / 4.92' - 7.38'
|
||||||
|
# g4_move_threshold: 40 # 2.25 - 3m' / 7.38' - 9.84'
|
||||||
|
# g4_still_threshold: 40 # 2.25 - 3m' / 7.38' - 9.84'
|
||||||
|
# g5_move_threshold: 40 # 3 - 3.75 / 9.84' - 12.30'
|
||||||
|
# g5_still_threshold: 40 # 3 - 3.75 / 9.84' - 12.30'
|
||||||
|
# g6_move_threshold: 30 # 3.75 - 4.5m / 12.30' - 14.76'
|
||||||
|
# g6_still_threshold: 15 # 3.75 - 4.5m / 12.30' - 14.76'
|
||||||
|
# g7_move_threshold: 30 # 4.5 - 5.25m / 14.76' - 17.22'
|
||||||
|
# g7_still_threshold: 15 # 4.5 - 5.25m / 14.76' - 17.22'
|
||||||
|
# g8_move_threshold: 30 # 5.25 - 6m / 17.22' - 19.68'
|
||||||
|
# g8_still_threshold: 15 # 5.25 - 6m / 17.22' - 19.68'
|
||||||
|
number:
|
||||||
|
- platform: ld2410
|
||||||
|
timeout:
|
||||||
|
name: Timeout
|
||||||
|
light_threshold:
|
||||||
|
name: Light Threshold
|
||||||
|
max_move_distance_gate:
|
||||||
|
name: Max Move Distance Gate
|
||||||
|
max_still_distance_gate:
|
||||||
|
name: Max Still Distance Gate
|
||||||
|
g0:
|
||||||
|
move_threshold:
|
||||||
|
name: g0 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g0 still threshold
|
||||||
|
g1:
|
||||||
|
move_threshold:
|
||||||
|
name: g1 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g1 still threshold
|
||||||
|
g2:
|
||||||
|
move_threshold:
|
||||||
|
name: g2 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g2 still threshold
|
||||||
|
g3:
|
||||||
|
move_threshold:
|
||||||
|
name: g3 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g3 still threshold
|
||||||
|
g4:
|
||||||
|
move_threshold:
|
||||||
|
name: g4 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g4 still threshold
|
||||||
|
g5:
|
||||||
|
move_threshold:
|
||||||
|
name: g5 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g5 still threshold
|
||||||
|
g6:
|
||||||
|
move_threshold:
|
||||||
|
name: g6 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g6 still threshold
|
||||||
|
g7:
|
||||||
|
move_threshold:
|
||||||
|
name: g7 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g7 still threshold
|
||||||
|
g8:
|
||||||
|
move_threshold:
|
||||||
|
name: g8 move threshold
|
||||||
|
still_threshold:
|
||||||
|
name: g8 still threshold
|
||||||
|
|
||||||
|
#The ld2410 select allows you to control your LD2410 Sensor.
|
||||||
|
#distance_resolution (Optional): Control the gates distance resolution. Can be 0.75m or 0.2m. Defaults to 0.75m. All options from Select.
|
||||||
|
#baud_rate (Optional): Control the serial port baud rate. Defaults to 256000. Once changed, all sensors will stop working until a fresh install with an updated UART Component configuration. All options from Select.
|
||||||
|
#light_function (Optional): If set, will affect the OUT pin value, based on light threshold. Can be off, low or above. Defaults to off. All options from Select.
|
||||||
|
#out_pin_level (Optional): Control OUT pin away value. Can be low or high. Defaults to low. All options from Select.
|
||||||
|
#ld2410_id (Optional, ID): Manually specify the ID for the LD2410 Sensor component if you are using multiple components.
|
||||||
|
select:
|
||||||
|
- platform: ld2410
|
||||||
|
distance_resolution:
|
||||||
|
name: "distance resolution"
|
||||||
|
baud_rate:
|
||||||
|
name: "baud rate"
|
||||||
|
light_function:
|
||||||
|
name: light function
|
||||||
|
out_pin_level:
|
||||||
|
name: out pin level
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General Sensors
|
||||||
|
# https://esphome.io/components/sensor/index.html
|
||||||
|
#############################################
|
||||||
|
sensor:
|
||||||
|
- platform: bme280_i2c
|
||||||
|
temperature:
|
||||||
|
name: ${friendly_name} BME280 Temp
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
pressure:
|
||||||
|
name: ${friendly_name} BME280 Pressure
|
||||||
|
oversampling: 2x
|
||||||
|
humidity:
|
||||||
|
name: ${friendly_name} BME280 Humidity
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
address: 0x76
|
||||||
|
update_interval: ${update_time}
|
||||||
|
- platform: uptime
|
||||||
|
name: ${friendly_name} Uptime
|
||||||
|
#The ld2410 sensor values
|
||||||
|
- platform: ld2410
|
||||||
|
light:
|
||||||
|
name: Light
|
||||||
|
moving_distance:
|
||||||
|
name : Moving Distance
|
||||||
|
still_distance:
|
||||||
|
name: Still Distance
|
||||||
|
moving_energy:
|
||||||
|
name: Move Energy
|
||||||
|
still_energy:
|
||||||
|
name: Still Energy
|
||||||
|
detection_distance:
|
||||||
|
name: Detection Distance
|
||||||
|
g0:
|
||||||
|
move_energy:
|
||||||
|
name: g0 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g0 still energy
|
||||||
|
g1:
|
||||||
|
move_energy:
|
||||||
|
name: g1 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g1 still energy
|
||||||
|
g2:
|
||||||
|
move_energy:
|
||||||
|
name: g2 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g2 still energy
|
||||||
|
g3:
|
||||||
|
move_energy:
|
||||||
|
name: g3 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g3 still energy
|
||||||
|
g4:
|
||||||
|
move_energy:
|
||||||
|
name: g4 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g4 still energy
|
||||||
|
g5:
|
||||||
|
move_energy:
|
||||||
|
name: g5 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g5 still energy
|
||||||
|
g6:
|
||||||
|
move_energy:
|
||||||
|
name: g6 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g6 still energy
|
||||||
|
g7:
|
||||||
|
move_energy:
|
||||||
|
name: g7 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g7 still energy
|
||||||
|
g8:
|
||||||
|
move_energy:
|
||||||
|
name: g8 move energy
|
||||||
|
still_energy:
|
||||||
|
name: g8 still energy
|
||||||
|
|
||||||
|
# The ld2410 switch allows you to control your LD2410 Sensor.
|
||||||
|
switch:
|
||||||
|
- platform: ld2410
|
||||||
|
engineering_mode:
|
||||||
|
name: "Engineering Mode"
|
||||||
|
bluetooth:
|
||||||
|
name: "Control Bluetooth"
|
||||||
|
|
||||||
|
#The ld2410 binary sensors to get presence notification
|
||||||
|
binary_sensor:
|
||||||
|
- platform: ld2410
|
||||||
|
has_target:
|
||||||
|
name: Presence
|
||||||
|
has_moving_target:
|
||||||
|
name: Moving Target
|
||||||
|
has_still_target:
|
||||||
|
name: Still Target
|
||||||
|
out_pin_presence_status:
|
||||||
|
name: Out Pin Presence Status
|
||||||
|
|
||||||
|
#The ld2410 button allows resetting
|
||||||
|
button:
|
||||||
|
- platform: ld2410
|
||||||
|
factory_reset:
|
||||||
|
name: "Factory reset"
|
||||||
|
restart:
|
||||||
|
name: "Restart"
|
||||||
|
query_params:
|
||||||
|
name: Query Parameters
|
||||||
|
|
||||||
|
#The ld2410 text sensor allows you to get information about your LD2410 Sensor.
|
||||||
|
text_sensor:
|
||||||
|
- platform: ld2410
|
||||||
|
version:
|
||||||
|
name: "Firmware Version"
|
||||||
|
mac_address:
|
||||||
|
name: "MAC Address"
|
@@ -2,7 +2,7 @@
|
|||||||
# ESPHome
|
# ESPHome
|
||||||
#############################################
|
#############################################
|
||||||
esphome:
|
esphome:
|
||||||
name: esp-netcupfan2
|
name: esp-ranchsliderfans
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
# Specific board for ESPHome device
|
# Specific board for ESPHome device
|
||||||
@@ -20,7 +20,7 @@ logger:
|
|||||||
#############################################
|
#############################################
|
||||||
api:
|
api:
|
||||||
encryption:
|
encryption:
|
||||||
key: !secret esp-netcupfan2_api_key
|
key: !secret esp-ranchsliderfans_api_key
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Enable Over the Air Update Capability
|
# Enable Over the Air Update Capability
|
||||||
@@ -28,18 +28,19 @@ api:
|
|||||||
#############################################
|
#############################################
|
||||||
ota:
|
ota:
|
||||||
safe_mode: true
|
safe_mode: true
|
||||||
password: !secret esp-netcupfan2_ota_pass
|
password: !secret esp-ranchsliderfans_ota_pass
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
# Use Wifi
|
# Use Wifi
|
||||||
#############################################
|
#############################################
|
||||||
wifi:
|
wifi:
|
||||||
|
#use_address: esp-netcupfan2.local
|
||||||
ssid: !secret wifi_ssid
|
ssid: !secret wifi_ssid
|
||||||
password: !secret wifi_password
|
password: !secret wifi_password
|
||||||
# Details for fallback hotspot
|
# Details for fallback hotspot
|
||||||
# in case wifi connection fails
|
# in case wifi connection fails
|
||||||
ap:
|
ap:
|
||||||
ssid: "Netcupfan2 Fallback Hotspot"
|
ssid: "Ranchsliderfans Fallback Hotspot"
|
||||||
password: !secret fallback_ap_password
|
password: !secret fallback_ap_password
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
@@ -61,7 +62,7 @@ web_server:
|
|||||||
#############################################
|
#############################################
|
||||||
mqtt:
|
mqtt:
|
||||||
broker: !secret mqtt_server
|
broker: !secret mqtt_server
|
||||||
topic_prefix: esphome/esp-netcupfan2
|
topic_prefix: esphome/esp-ranchsliderfans
|
||||||
username: !secret mqtt_username
|
username: !secret mqtt_username
|
||||||
password: !secret mqtt_password
|
password: !secret mqtt_password
|
||||||
|
|
||||||
@@ -74,14 +75,14 @@ mqtt:
|
|||||||
# Relay Output on a GPIO Pin
|
# Relay Output on a GPIO Pin
|
||||||
switch:
|
switch:
|
||||||
- platform: gpio
|
- platform: gpio
|
||||||
name: "Relay_Main"
|
name: "Ranch Slider Fan Boost"
|
||||||
pin: GPIO15
|
pin: GPIO15
|
||||||
|
|
||||||
# Allows a fan control point in Home Assistant
|
# Allows a fan control point in Home Assistant
|
||||||
fan:
|
fan:
|
||||||
- platform: speed
|
- platform: speed
|
||||||
output: pwm_output
|
output: pwm_output
|
||||||
name: "Net Cupboard Fan 2 Speed"
|
name: "Ranch Slider Fans Speed"
|
||||||
speed_count: 500
|
speed_count: 500
|
||||||
|
|
||||||
# PWM Fan Output on the GPIO Pin
|
# PWM Fan Output on the GPIO Pin
|
855
esphome/esp-weatherstation.yaml
Normal file
855
esphome/esp-weatherstation.yaml
Normal file
@@ -0,0 +1,855 @@
|
|||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
# Opengreen energy weather station board, with ESP8266 D1 Mini
|
||||||
|
# https://www.opengreenenergy.com/solar-powered-wifi-weather-station-v2-0/
|
||||||
|
# zorruno 2024-05-04 V0.0 Untested
|
||||||
|
# zorruno 2024-05-23 V1.0 Tidied up sensor info and added BMP280
|
||||||
|
# zorruno 2024-05-24 V1.1 Tested ok and added some V calibration for mine
|
||||||
|
# zorruno 2024-05-25 V2 A bunch more sensors added (wind direction not yet sorted)
|
||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# SENSORS INCLUDED
|
||||||
|
#
|
||||||
|
# TESTED WORKING
|
||||||
|
# status_led:
|
||||||
|
# uptime:
|
||||||
|
# wifi_signal:
|
||||||
|
# battery voltage (adc A0)
|
||||||
|
#
|
||||||
|
# ads1115: 4 Channel A->D (0x48 i2c)
|
||||||
|
# dht: DHT22 Temp/Humidity, Remote (GPIO15)
|
||||||
|
# bmp280: Temp/pressure on the board (0x76 i2c)
|
||||||
|
# pulse_meter: Wind Speed (GPIO13)
|
||||||
|
#
|
||||||
|
# text_sensor: Beaufort Wind Scale Labelling
|
||||||
|
# text:sensor: Temp (av) Average of all temps
|
||||||
|
#
|
||||||
|
# TO TEST (HAVE SENSOR or doesn't need one)
|
||||||
|
# tsl2561: Ambient Light sensor (0x39 i2c)
|
||||||
|
# ads1115 A1_GND: UV Index
|
||||||
|
# ads1115 A0_GND: Wind Direction
|
||||||
|
# pulse_meter: Rainfall (GPIO??)
|
||||||
|
# battery life: Time from battery starting to drop (retain)
|
||||||
|
#
|
||||||
|
# ORDERED BUT DON'T HAVE YET
|
||||||
|
# ltr390: Ambient Light and UV sensor (0x53 i2c)
|
||||||
|
# pmsx003: PM Particulate Filter (UART)
|
||||||
|
#
|
||||||
|
# NOT USED (code commented)
|
||||||
|
# bme280_i2c: Temp/humid/press (not used)
|
||||||
|
#
|
||||||
|
# POSSIBLY ADD
|
||||||
|
# Analogue for Solar V?
|
||||||
|
# Lightning?
|
||||||
|
# ground movement/earthquake?
|
||||||
|
# water sensor (rain now)
|
||||||
|
#
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# WIND SENSOR
|
||||||
|
# looks like this one
|
||||||
|
# https://www.sparkfun.com/datasheets/Sensors/Weather/Weather%20Sensor%20Assembly..pdf
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# USEFUL LINKS
|
||||||
|
# Wind Sensing
|
||||||
|
# https://community.home-assistant.io/t/measuring-wind-speed/395693/20
|
||||||
|
# https://community.home-assistant.io/t/measuring-wind-speed/395693/21
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Pulse Meter Issues 202405
|
||||||
|
# https://github.com/esphome/issues/issues/4807
|
||||||
|
# https://github.com/esphome/issues/issues/3143
|
||||||
|
#############################################
|
||||||
|
external_components:
|
||||||
|
- source: github://TrentHouliston/esphome@loop_pulse_isr
|
||||||
|
components: [ pulse_meter ]
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Variable Substitutions
|
||||||
|
# Give this a useful name & description here
|
||||||
|
# and change values accordingly
|
||||||
|
#############################################
|
||||||
|
substitutions:
|
||||||
|
devicename: "esp-weatherstation"
|
||||||
|
friendly_name: "Weather Station"
|
||||||
|
description_comment: "Opengreen energy board, with BME280 Temp/Hum/Pres Sensor on an ESP8266 D1 Mini"
|
||||||
|
api_key: !secret esp-weatherstation_api_key #unfortunately you can't use substitutions in secrets names
|
||||||
|
ota_pass: !secret esp-weatherstation_ota_pass #unfortunately you can't use substitutions in secrets names
|
||||||
|
wifi_ssid: !secret wifi_ssid
|
||||||
|
wifi_pass: !secret wifi_password
|
||||||
|
mqtt_server: 192.168.3.200
|
||||||
|
mqtt_topic: "esphome" #main topic for the mqtt server, call it what you like
|
||||||
|
update_time: 30s #update time for for temp sensors etc
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome
|
||||||
|
# https://esphome.io/components/esphome.html
|
||||||
|
#############################################
|
||||||
|
esphome:
|
||||||
|
name: ${devicename}
|
||||||
|
comment: ${description_comment} #appears on the esphome page in HA
|
||||||
|
#on_boot: #Initial Setting stuff
|
||||||
|
#priority: -200
|
||||||
|
#then:
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESP Platform and Framework
|
||||||
|
# https://esphome.io/components/esp32.html OR
|
||||||
|
# https://esphome.io/components/esp8266.html
|
||||||
|
#############################################
|
||||||
|
#esp32:
|
||||||
|
# board:
|
||||||
|
# framework:
|
||||||
|
# type: arduino
|
||||||
|
# #type: esp-idf #Suggested Use ESP-IDF Framework for ESP32, or unplugging the UART Cable Might Cause ESP32 Hang.
|
||||||
|
# version: recommended #recommended, latest or dev
|
||||||
|
|
||||||
|
esp8266:
|
||||||
|
board: d1_mini
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# i2c bus
|
||||||
|
# https://esphome.io/components/i2c.html
|
||||||
|
# Put the relevant pins here, 4/5 are default for ESP8266
|
||||||
|
# and 21/22 for esp32 (although esp32 can have two buses)
|
||||||
|
#############################################
|
||||||
|
i2c:
|
||||||
|
sda: GPIO4
|
||||||
|
scl: GPIO5
|
||||||
|
scan: True
|
||||||
|
#frequency: 100kHz #10, 50, 100, 200, 800 are possible settings, 100kHz was reliable for me for ESP32, default is 50kHz
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
# https://esphome.io/components/logger.html
|
||||||
|
#############################################
|
||||||
|
logger:
|
||||||
|
level: DEBUG #INFO Level suggested, or DEBUG for testing
|
||||||
|
#baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||||||
|
#esp8266_store_log_strings_in_flash: false
|
||||||
|
#tx_buffer_size: 64
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
# https://esphome.io/components/api.html
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: ${api_key}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# https://esphome.io/components/ota.html?highlight=ota
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
safe_mode: true #Safe mode will detect boot loops
|
||||||
|
password: ${ota_pass}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Wifi Settings
|
||||||
|
# https://esphome.io/components/wifi.html
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: ${wifi_ssid}
|
||||||
|
password: ${wifi_pass}
|
||||||
|
#power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||||
|
#manual_ip: #optional static IP address
|
||||||
|
#static_ip: 192.168.x.x
|
||||||
|
#gateway: 192.168.X.x
|
||||||
|
#subnet: 255.255.255.0
|
||||||
|
ap: #Details for fallback hotspot (captive portal) in case wifi connection fails https://esphome.io/components/wifi.html#access-point-mode
|
||||||
|
ssid: $devicename fallback AP
|
||||||
|
password: !secret fallback_ap_password
|
||||||
|
ap_timeout: 5min #default is 1min
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
# Turning this off if you don't really need it
|
||||||
|
# is probably a good idea to save resources.
|
||||||
|
# Also, don't use it with other big ESP32 components
|
||||||
|
# such as Bluetooth proxy (it will run out of flash
|
||||||
|
# and not compile, or it will crash occasionally)
|
||||||
|
# https://esphome.io/components/web_server.html
|
||||||
|
#############################################
|
||||||
|
#web_server:
|
||||||
|
# port: 80
|
||||||
|
# version: 1 #V1 occasionally works better, V2 The nicer page
|
||||||
|
# username: !secret web_server_username #probably a good idea to secure it
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# MQTT Monitoring
|
||||||
|
# https://esphome.io/components/mqtt.html?highlight=mqtt
|
||||||
|
# MUST also have api enabled if you enable MQTT
|
||||||
|
#############################################
|
||||||
|
mqtt:
|
||||||
|
broker: ${mqtt_server}
|
||||||
|
topic_prefix: ${mqtt_topic}/${devicename}
|
||||||
|
#username: !secret mqtt_username
|
||||||
|
#password: !secret mqtt_password
|
||||||
|
|
||||||
|
#A way to prevent deep sleep using MQTT command
|
||||||
|
#on_message:
|
||||||
|
#- topic: ${mqtt_topic}/${devicename}/deepsleepoff
|
||||||
|
#payload: 'ON'
|
||||||
|
#then:
|
||||||
|
#- deep_sleep.prevent: deep_sleep_1
|
||||||
|
#- topic: ${mqtt_topic}/${devicename}/deepsleepon
|
||||||
|
#payload: 'ON'
|
||||||
|
#then:
|
||||||
|
#- deep_sleep.enter: deep_sleep_1
|
||||||
|
|
||||||
|
########################################
|
||||||
|
# Deep Sleep
|
||||||
|
# https://esphome.io/components/deep_sleep.html
|
||||||
|
########################################
|
||||||
|
#deep_sleep:
|
||||||
|
# run_duration: 20s
|
||||||
|
# sleep_duration: 10min
|
||||||
|
# id: deep_sleep_1
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General espHome status LED
|
||||||
|
# Not needed, but can be useful to see issues
|
||||||
|
# https://esphome.io/components/status_led.html
|
||||||
|
#############################################
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #Wemos ESP32 and ESP8266 Onboard LEDs use GPIO2
|
||||||
|
inverted: false
|
||||||
|
#ignore_strapping_warning: True #https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
|
||||||
|
|
||||||
|
################################
|
||||||
|
# 4 Input A->D sensor
|
||||||
|
# Analog sensor for voltage reading
|
||||||
|
# https://esphome.io/components/sensor/ads1115.html
|
||||||
|
################################
|
||||||
|
ads1115:
|
||||||
|
- address: 0x48 #On the ADS1115 pull address pin to VCC for 0x49. Default is 0x48
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Text Sensors
|
||||||
|
# https://esphome.io/components/text_sensor/index.html
|
||||||
|
#############################################
|
||||||
|
text_sensor:
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} Beaufort Wind Scale
|
||||||
|
icon: "mdi:tailwind"
|
||||||
|
id: wind_scale
|
||||||
|
update_interval: never
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} Wind Direction
|
||||||
|
icon: "mdi:tailwind"
|
||||||
|
id: wind_dir
|
||||||
|
update_interval: never
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General Sensors
|
||||||
|
# https://esphome.io/components/sensor/index.html
|
||||||
|
#############################################
|
||||||
|
sensor:
|
||||||
|
|
||||||
|
################################
|
||||||
|
# BMP280 temp/pressure
|
||||||
|
# https://esphome.io/components/sensor/bmp280.html
|
||||||
|
################################
|
||||||
|
- platform: bmp280
|
||||||
|
address: 0x76
|
||||||
|
iir_filter: 16X
|
||||||
|
update_interval: ${update_time}
|
||||||
|
temperature:
|
||||||
|
name: ${friendly_name} BMP280 Temperature
|
||||||
|
id: bmp280_temp
|
||||||
|
unit_of_measurement: "°C"
|
||||||
|
oversampling: 16x
|
||||||
|
#retain: true #MQTT retain useful if sleeping
|
||||||
|
pressure:
|
||||||
|
name: ${friendly_name} BMP280 Pressure
|
||||||
|
unit_of_measurement: "hPa"
|
||||||
|
oversampling: 16X
|
||||||
|
#retain: true #MQTT retain useful if sleeping
|
||||||
|
|
||||||
|
|
||||||
|
################################
|
||||||
|
# BME280 temp/humidity/pressure
|
||||||
|
# https://esphome.io/cookbook/bme280_environment.html
|
||||||
|
################################
|
||||||
|
#- platform: bme280_i2c
|
||||||
|
# address: 0x76
|
||||||
|
# update_interval: ${update_time}
|
||||||
|
# temperature:
|
||||||
|
# name: ${friendly_name} BME280 Temp
|
||||||
|
# accuracy_decimals: 1
|
||||||
|
# oversampling: 2x
|
||||||
|
# unit_of_measurement: "°C"
|
||||||
|
# #retain: true #MQTT retain useful if sleeping
|
||||||
|
# pressure:
|
||||||
|
# name: ${friendly_name} BME280 Pressure
|
||||||
|
# oversampling: 2x
|
||||||
|
# unit_of_measurement: "hPa"
|
||||||
|
# #retain: true #MQTT retain useful if sleeping
|
||||||
|
# humidity:
|
||||||
|
# name: ${friendly_name} BME280 Humidity
|
||||||
|
# accuracy_decimals: 1
|
||||||
|
# oversampling: 2x
|
||||||
|
# unit_of_measurement: "%"
|
||||||
|
# #retain: true #MQTT retain useful if sleeping
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################
|
||||||
|
# DHT temp/humidity
|
||||||
|
# https://esphome.io/components/sensor/dht.html
|
||||||
|
################################
|
||||||
|
- platform: dht
|
||||||
|
pin: GPIO15 #D8 on the D1 Mini ESP8266
|
||||||
|
update_interval: ${update_time}
|
||||||
|
temperature:
|
||||||
|
name: ${friendly_name} DHT22 Temperature
|
||||||
|
id: dht_temp
|
||||||
|
unit_of_measurement: "°C"
|
||||||
|
#retain: true #retain useful if sleeping
|
||||||
|
humidity:
|
||||||
|
name: ${friendly_name} DHT22 Humidity
|
||||||
|
unit_of_measurement: "%"
|
||||||
|
#retain: true #retain useful if sleeping
|
||||||
|
|
||||||
|
################################
|
||||||
|
# TSL2561 ambient light sensor
|
||||||
|
# https://esphome.io/components/sensor/tsl2561.html
|
||||||
|
################################
|
||||||
|
#- platform: tsl2561
|
||||||
|
# name: ${friendly_name} Ambient Light
|
||||||
|
# address: 0x39
|
||||||
|
# update_interval: 60s
|
||||||
|
|
||||||
|
################################
|
||||||
|
# LTR390 Ambient Light and UV Sensor
|
||||||
|
# https://esphome.io/components/sensor/ltr390.html
|
||||||
|
################################
|
||||||
|
#- platform: ltr390
|
||||||
|
# address: 0x35
|
||||||
|
# uv_index:
|
||||||
|
# name: ${friendly_name} 390 UV Index
|
||||||
|
# uv:
|
||||||
|
# name: ${friendly_name} 390 UV Sensor Counts
|
||||||
|
# light:
|
||||||
|
# name: ${friendly_name} 390 Light
|
||||||
|
# ambient_light:
|
||||||
|
# name: ${friendly_name} 390 UV Sensor Counts
|
||||||
|
# update_interval: 60s
|
||||||
|
|
||||||
|
################################
|
||||||
|
# PMSX003 Particulate sensor
|
||||||
|
# NEEDS UART SET FIRST
|
||||||
|
# https://esphome.io/components/sensor/pmsx003.html
|
||||||
|
################################
|
||||||
|
#- platform: pmsx003
|
||||||
|
# type: PMSX003
|
||||||
|
# pm_1_0:
|
||||||
|
# name: ${friendly_name} Particulate Matter <1.0µm
|
||||||
|
# pm_2_5:
|
||||||
|
# name: ${friendly_name} <2.5µm
|
||||||
|
# pm_10_0:
|
||||||
|
# name: ${friendly_name} <10.0µm Concentration
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Device uptime info
|
||||||
|
# https://esphome.io/components/sensor/uptime.html
|
||||||
|
################################
|
||||||
|
- platform: uptime
|
||||||
|
name: ${friendly_name} Uptime
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Quality of Wifi in dBm
|
||||||
|
# https://esphome.io/components/sensor/wifi_signal.html
|
||||||
|
################################
|
||||||
|
- platform: wifi_signal
|
||||||
|
name: ${friendly_name} WiFi Signal
|
||||||
|
update_interval: ${update_time}
|
||||||
|
#retain: true #retain useful if sleeping
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Analog sensor for voltage reading
|
||||||
|
# (A0 on esp8266)
|
||||||
|
# https://esphome.io/components/sensor/adc.html
|
||||||
|
################################
|
||||||
|
- platform: adc
|
||||||
|
name: ${friendly_name} Battery Voltage
|
||||||
|
id: battery_voltage
|
||||||
|
pin: A0
|
||||||
|
unit_of_measurement: "V"
|
||||||
|
accuracy_decimals: 5
|
||||||
|
update_interval: ${update_time}
|
||||||
|
#retain: true #retain useful if sleeping
|
||||||
|
filters:
|
||||||
|
- multiply: 5.223 # tested with multimeter
|
||||||
|
- calibrate_linear:
|
||||||
|
- 3.89 -> 3.90
|
||||||
|
- 3.85 -> 3.92
|
||||||
|
- 4.09 -> 4.14
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} Av Battery Voltage over 5 mins
|
||||||
|
id: battery_voltage_5minav
|
||||||
|
unit_of_measurement: "V"
|
||||||
|
accuracy_decimals: 5
|
||||||
|
update_interval: 30s #updates every 30s
|
||||||
|
lambda: >
|
||||||
|
return id(battery_voltage).state; //grabs values from the battery_voltage
|
||||||
|
filters:
|
||||||
|
- sliding_window_moving_average:
|
||||||
|
window_size: 20 #20x 30s = 10 mins
|
||||||
|
send_every: 1
|
||||||
|
send_first_at: 1
|
||||||
|
|
||||||
|
- platform: duty_time
|
||||||
|
id: battery_discharge_time
|
||||||
|
name: ${friendly_name} Time battery is discharging
|
||||||
|
unit_of_measurement: "Mins"
|
||||||
|
retain: true #retain this as when device dies, we still want the value
|
||||||
|
# Support logical sources (optional): 'binary_sensor'
|
||||||
|
accuracy_decimals: 0
|
||||||
|
filters:
|
||||||
|
- multiply: 0.01666666
|
||||||
|
- round: 0
|
||||||
|
lambda: >
|
||||||
|
return { id(battery_voltage).state <= id(battery_voltage_5minav).state };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Wind Direction, Analogue on ADS115
|
||||||
|
# Analog sensor for voltage reading
|
||||||
|
# https://esphome.io/components/sensor/ads1115.html
|
||||||
|
################################
|
||||||
|
# Using a analog wind direction sensor that has an output
|
||||||
|
# of 0 - 5 V for 360° representing the position of the arrow
|
||||||
|
# from the north pole. This is 5V divided by 8 resistor
|
||||||
|
# values giving the output voltage value for each azimuth.
|
||||||
|
# We could also report a compass direction.
|
||||||
|
################################
|
||||||
|
- platform: ads1115
|
||||||
|
multiplexer: 'A0_GND'
|
||||||
|
gain: 6.144
|
||||||
|
name: ${friendly_name} Wind Direction
|
||||||
|
id: wind_direction
|
||||||
|
update_interval: 5s
|
||||||
|
# filters:
|
||||||
|
# lambda: |-
|
||||||
|
# if( (x * (360.0/5.0)) >= 10.0 && (x * (360.0/5.0)) <= 70.0 ) { return x = 45 };
|
||||||
|
# else if( (x * (360.0/5.0)) > 70.0 && (x * (360.0/5.0)) <= 120.0 ) { return x = 90 };
|
||||||
|
# else if( (x * (360.0/5.0)) > 120.0 && (x * (360.0/5.0)) <= 170.0 ) { return x = 135 };
|
||||||
|
# else if( (x * (360.0/5.0)) > 170.0 && (x * (360.0/5.0)) <= 215.0 ) { return x = 180 };
|
||||||
|
# else if( (x * (360.0/5.0)) > 215.0 && (x * (360.0/5.0)) <= 262.0 ) { return x = 225 };
|
||||||
|
# else if( (x * (360.0/5.0)) > 262.0 && (x * (360.0/5.0)) <= 330.0 ) { return x = 270 };
|
||||||
|
# else if( (x * (360.0/5.0)) > 330.0 && (x * (360.0/5.0)) <= 355.0 ) { return x = 315 };
|
||||||
|
# else if(((x * (360.0/5.0)) > 355.0 && (x * (360.0/5.0)) <= 360.0) || ((x * (360.0/5.0)) >= 0.0 && (x * (360.0/5.0)) <= 10.0)) { return x = 0 };
|
||||||
|
|
||||||
|
# - platform: template
|
||||||
|
# name: ${friendly_name} Winddirection Degrees
|
||||||
|
# id: wind_direction_voltage
|
||||||
|
# lambda: return id(wind_direction_voltage).state;
|
||||||
|
# unit_of_measurement: "degrees"
|
||||||
|
# update_interval: 5s
|
||||||
|
# filters:
|
||||||
|
# - throttle_average: 5s
|
||||||
|
# on_value:
|
||||||
|
# lambda: |-
|
||||||
|
# if (id(wind_direction_voltage).state * (360.0/5.0) >= 10.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 70.0) {
|
||||||
|
# id(wind_dir).publish_state("45");
|
||||||
|
# } else if (id(wind_direction_voltage).state * (360.0/5.0) = 70.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 120.0) {
|
||||||
|
# id(wind_dir).publish_state("90");
|
||||||
|
# } else if (id(wind_direction_voltage).state * (360.0/5.0) = 120.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 170.0) {
|
||||||
|
# id(wind_dir).publish_state("135");
|
||||||
|
# } else if (id(wind_direction_voltage).state * (360.0/5.0) = 170.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 215.0) {
|
||||||
|
# id(wind_dir).publish_state("180");
|
||||||
|
# } else if (id(wind_direction_voltage).state * (360.0/5.0) = 215.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 262.0) {
|
||||||
|
# id(wind_dir).publish_state("225");
|
||||||
|
# } else if (id(wind_direction_voltage).state * (360.0/5.0) = 262.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 330.0) {
|
||||||
|
# id(wind_dir).publish_state("270");
|
||||||
|
# } else if (id(wind_direction_voltage).state * (360.0/5.0) = 330.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 355.0) {
|
||||||
|
# id(wind_dir).publish_state("315");
|
||||||
|
# } else if (id(wind_direction_voltage).state * (360.0/5.0) = 355.0 && id(wind_direction_voltage).state * (360.0/5.0) <= 360.0) {
|
||||||
|
# id(wind_dir).publish_state("0");
|
||||||
|
# } else {
|
||||||
|
# id(wind_dir).publish_state("0");
|
||||||
|
# }
|
||||||
|
|
||||||
|
# - platform: ads1115
|
||||||
|
# multiplexer: "A1_GND"
|
||||||
|
# gain: 6.144
|
||||||
|
# name: ${friendly_name} UV Index
|
||||||
|
# update_interval: 10s
|
||||||
|
# unit_of_measurement: "mW/cm2"
|
||||||
|
# accuracy_decimals: 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# - platform: pulse_meter
|
||||||
|
# pin:
|
||||||
|
# number: GPIO13 #This is Pin D7 on the D1 Mini ESP8266
|
||||||
|
# mode:
|
||||||
|
# input: true
|
||||||
|
# pullup: true
|
||||||
|
# name: ${friendly_name} Wind speed
|
||||||
|
# id: wind_meter
|
||||||
|
# unit_of_measurement: m/s
|
||||||
|
# accuracy_decimals: 1
|
||||||
|
# timeout: 5s
|
||||||
|
# internal_filter_mode: EDGE
|
||||||
|
# internal_filter: 10ms
|
||||||
|
|
||||||
|
# A wind speed of 2.4km/h (1.492mph) causes the switch to close once per second.
|
||||||
|
# that is 0.667m/s.
|
||||||
|
# Switch closes twice per revolution
|
||||||
|
|
||||||
|
# rotations_per_sec = pulses / 2 / 60
|
||||||
|
# circ_m = 0.09 * 2 * 3.14 = 0.5652
|
||||||
|
# mps = 1.18 * circ_m * rotations_per_sec
|
||||||
|
# mps = 1.18 * (0.5652 / 2 / 60) = 0.0055578
|
||||||
|
#
|
||||||
|
# filters:
|
||||||
|
# # - multiply: 0.0055578 #use for m/s
|
||||||
|
# # - multiply: 2.237 #m/s to mph
|
||||||
|
# # - multiply: 0.0124327986 #m/s * mph conversion
|
||||||
|
# # - multiply: ? #m/s to kph
|
||||||
|
# - multiply: 0.0055578
|
||||||
|
# - sliding_window_moving_average: # Helps prevent too many datapoints
|
||||||
|
# window_size: 10
|
||||||
|
# send_every: 10
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Pulse Meter for measuring wind speed
|
||||||
|
# Analog sensor for voltage reading
|
||||||
|
# https://esphome.io/components/sensor/pulse_meter.html
|
||||||
|
#
|
||||||
|
# This Anenometer https://www.sparkfun.com/datasheets/Sensors/Weather/Weather%20Sensor%20Assembly..pdf
|
||||||
|
#
|
||||||
|
# The cup-type anemometer measures wind speed by closing a contact
|
||||||
|
# as a magnet moves past a reed switch. A wind speed of 1.492mph (2.4km/h) (0.667m/s)
|
||||||
|
# causes the switch to close once per second. The reed switch closes twice per revolution.
|
||||||
|
# 1rps = 60rpm = 2.4kmh
|
||||||
|
# 1pulse/min = 2.4kmh/60 = 0.04kmh
|
||||||
|
# Pulse meter component measures the time between rising edges on a pin,
|
||||||
|
# for each pulse it outputs the frequency in pulses/min.
|
||||||
|
################################
|
||||||
|
- platform: pulse_meter # https://community.home-assistant.io/t/measuring-wind-speed/395693
|
||||||
|
id: wind_meter
|
||||||
|
pin:
|
||||||
|
number: GPIO13
|
||||||
|
mode:
|
||||||
|
input: true
|
||||||
|
pullup: true
|
||||||
|
#internal: true # If true, don't send to HA/MQTT etc
|
||||||
|
internal_filter_mode: EDGE
|
||||||
|
internal_filter: 10ms
|
||||||
|
name: ${friendly_name} Wind speed
|
||||||
|
icon: "mdi:weather-windy"
|
||||||
|
unit_of_measurement: "km/h"
|
||||||
|
accuracy_decimals: 1
|
||||||
|
timeout: 5s
|
||||||
|
filters:
|
||||||
|
- timeout:
|
||||||
|
timeout: "5s" #after 5 seconds, if no pulses received....
|
||||||
|
value: 0 #make the value = 0
|
||||||
|
- multiply: 0.04 #kmh
|
||||||
|
- sliding_window_moving_average: # Moving average to prevent too many data points
|
||||||
|
window_size: 10
|
||||||
|
send_every: 10
|
||||||
|
- clamp:
|
||||||
|
min_value: 0
|
||||||
|
max_value: 250 #if anything over that, we have debounce issues or are going to die
|
||||||
|
ignore_out_of_range: true
|
||||||
|
|
||||||
|
# on_value:
|
||||||
|
# lambda: |-
|
||||||
|
# if(x > id(g_WindGust_10min)) {
|
||||||
|
# id(g_WindGust_10min) = x;
|
||||||
|
# id(id_wind_gust_10min).publish_state(id(g_WindGust_10min));
|
||||||
|
# };
|
||||||
|
# //id(g_wind_run) += (x>0) ? 0.000666982 : 0;
|
||||||
|
# if(x > id(g_WindGust_10s)) {
|
||||||
|
# id(g_WindGust_10s) = x;
|
||||||
|
# id(id_wind_gust_10s).publish_state(id(g_WindGust_10s));
|
||||||
|
# };
|
||||||
|
# if(x > id(g_WindGust_60s)) {
|
||||||
|
# id(g_WindGust_60s) = x;
|
||||||
|
# id(id_wind_gust_60s).publish_state(id(g_WindGust_60s));
|
||||||
|
# };
|
||||||
|
|
||||||
|
|
||||||
|
# if(id(g_WindSpeedMin_Reset)){
|
||||||
|
# id(g_WindSpeedMin_10s) = x;
|
||||||
|
# id(g_WindSpeedMin_Reset) = false;
|
||||||
|
# } else {
|
||||||
|
# if(x < id(g_WindSpeedMin_10s)) {id(g_WindSpeedMin_10s) = x;};
|
||||||
|
# }
|
||||||
|
# total:
|
||||||
|
# name: "Roof Wind Run daily"
|
||||||
|
# id: id_wind_run_daily
|
||||||
|
# internal: false
|
||||||
|
# unit_of_measurement: "km"
|
||||||
|
# accuracy_decimals: 3
|
||||||
|
# filters:
|
||||||
|
# - multiply: 0.000666982
|
||||||
|
# - throttle: 30s
|
||||||
|
|
||||||
|
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} Windspeed Gust (Max last 10m)
|
||||||
|
unit_of_measurement: "km/h"
|
||||||
|
update_interval: 2s #updates every 2s
|
||||||
|
lambda: >
|
||||||
|
return id(wind_meter).state; //grabs values from the wind_sensor
|
||||||
|
filters:
|
||||||
|
- filter_out: nan #in case there is no value
|
||||||
|
- max:
|
||||||
|
window_size: 300 #10 Min window as 2s update x 300 = 10min
|
||||||
|
send_every: 1 #updates on the 1st 2s check
|
||||||
|
send_first_at: 1 #on restart, send after first 10s
|
||||||
|
|
||||||
|
|
||||||
|
# https://www.reddit.com/r/Esphome/comments/kndues/take_max_value_over_time/
|
||||||
|
# - platform: template
|
||||||
|
# name: ${friendly_name} Windspeed last 10min max
|
||||||
|
# #id: ${node_name}_pm_1_0_rolling_30_minute_average
|
||||||
|
# unit_of_measurement: "km/h"
|
||||||
|
# update_interval: 60s
|
||||||
|
# lambda: |-
|
||||||
|
# const size_t window_size_ = 10;
|
||||||
|
# const size_t send_every_ = 10;
|
||||||
|
# static size_t send_at_ = 0;
|
||||||
|
|
||||||
|
# static std::deque<float> queue_;
|
||||||
|
# if (!isnan(x)) {
|
||||||
|
# if (queue_.size() >= window_size_) {
|
||||||
|
# queue_.pop_front();
|
||||||
|
# }
|
||||||
|
# queue_.push_back(x);
|
||||||
|
# }
|
||||||
|
|
||||||
|
# if (++send_at_ >= send_every_) {
|
||||||
|
# send_at_ = 0;
|
||||||
|
# if (!queue_.empty()) {
|
||||||
|
# std::deque<float>::iterator it = std::max_element(queue_.begin(), queue_.end());
|
||||||
|
# return *it;
|
||||||
|
# }
|
||||||
|
# return 0.0f;
|
||||||
|
# }
|
||||||
|
# return {};
|
||||||
|
|
||||||
|
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind Run daily"
|
||||||
|
# icon: "mdi:weather-windy"
|
||||||
|
# unit_of_measurement: "km"
|
||||||
|
# accuracy_decimals: 3
|
||||||
|
# update_interval: 30s
|
||||||
|
# internal: true
|
||||||
|
# lambda: |-
|
||||||
|
# return id(g_wind_run_count)*0.000666982;
|
||||||
|
# id: id_wind_run_daily_g
|
||||||
|
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind gust 10s"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# update_interval: 10s
|
||||||
|
# id: id_wind_gust_10s
|
||||||
|
# lambda: return id(g_WindGust_10s);
|
||||||
|
#
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind gust 60s"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# state_class: "measurement"
|
||||||
|
# update_interval: 60s
|
||||||
|
# id: id_wind_gust_60s
|
||||||
|
# lambda: return id(g_WindGust_60s);
|
||||||
|
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind gust 10min"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# state_class: "measurement"
|
||||||
|
# update_interval: 10min
|
||||||
|
# id: id_wind_gust_10min
|
||||||
|
# lambda: return id(g_WindGust_10min);
|
||||||
|
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind speed avg 1s"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# update_interval: 333ms
|
||||||
|
# lambda: |-
|
||||||
|
# return id(id_wind_speed).state;
|
||||||
|
# filters:
|
||||||
|
# throttle_average: 1s
|
||||||
|
# id: id_wind_speed_avg_1s
|
||||||
|
#
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind speed avg 10s"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# update_interval: 333ms
|
||||||
|
# lambda: |-
|
||||||
|
# return id(id_wind_speed).state;
|
||||||
|
# filters:
|
||||||
|
# throttle_average: 10s
|
||||||
|
# id: id_wind_speed_avg_10s
|
||||||
|
#
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind Speed Min 10s"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# id: id_wind_speed_min_10s
|
||||||
|
#
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind speed avg 1min"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# state_class: "measurement"
|
||||||
|
# update_interval: '1s'
|
||||||
|
# lambda: |-
|
||||||
|
# return id(id_wind_speed).state;
|
||||||
|
# filters:
|
||||||
|
# - throttle_average: 1min
|
||||||
|
# id: id_wind_speed_avg_1min
|
||||||
|
#
|
||||||
|
# - platform: template
|
||||||
|
# name: "Roof Wind speed avg 10min"
|
||||||
|
# unit_of_measurement: 'km/h'
|
||||||
|
# state_class: "measurement"
|
||||||
|
# update_interval: 1s
|
||||||
|
# lambda: |-
|
||||||
|
# return id(id_wind_speed).state;
|
||||||
|
# filters:
|
||||||
|
# - throttle_average: 10min
|
||||||
|
# id: id_wind_speed_avg_10min
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Averaging for the various temp sensors on board
|
||||||
|
################################
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} Temp (av)
|
||||||
|
icon: "mdi:thermometer"
|
||||||
|
unit_of_measurement: "°C"
|
||||||
|
lambda: |-
|
||||||
|
return (
|
||||||
|
id(bmp280_temp).state
|
||||||
|
+
|
||||||
|
id(dht_temp).state
|
||||||
|
) / 2;
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Template for Beaufort for measuring wind speed
|
||||||
|
# https://windy.app/blog/wind-speed-beaufort-scale.html
|
||||||
|
################################
|
||||||
|
# - platform: template
|
||||||
|
# name: ${friendly_name} Windspeed Scale
|
||||||
|
# icon: "mdi:weather-windy"
|
||||||
|
# id: wind_meter_scale
|
||||||
|
# lambda: return id(wind_meter).state;
|
||||||
|
# unit_of_measurement: "m/s"
|
||||||
|
# update_interval: 5s
|
||||||
|
# filters:
|
||||||
|
# - throttle_average: 5s
|
||||||
|
# on_value:
|
||||||
|
# lambda: |-
|
||||||
|
# if (id(wind_meter_scale).state < 0.1) {
|
||||||
|
# id(wind_scale).publish_state("Calm");
|
||||||
|
# } else if (id(wind_meter_scale).state > 0 && id(wind_meter_scale).state < 2) {
|
||||||
|
# id(wind_scale).publish_state("Light Air");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 2 && id(wind_meter_scale).state < 3) {
|
||||||
|
# id(wind_scale).publish_state("Light Breeze");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 3 && id(wind_meter_scale).state < 5) {
|
||||||
|
# id(wind_scale).publish_state("Gentle Breeze");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 5 && id(wind_meter_scale).state < 8) {
|
||||||
|
# id(wind_scale).publish_state("Moderate Breeze");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 8 && id(wind_meter_scale).state < 11) {
|
||||||
|
# id(wind_scale).publish_state("Fresh Breeze");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 11 && id(wind_meter_scale).state < 14) {
|
||||||
|
# id(wind_scale).publish_state("Strong Breeze");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 14 && id(wind_meter_scale).state < 17) {
|
||||||
|
# id(wind_scale).publish_state("Near Gale");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 17 && id(wind_meter_scale).state < 21) {
|
||||||
|
# id(wind_scale).publish_state("Gale");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 21 && id(wind_meter_scale).state < 24) {
|
||||||
|
# id(wind_scale).publish_state("Severe Gale");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 24 && id(wind_meter_scale).state < 28) {
|
||||||
|
# id(wind_scale).publish_state("Storm");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 28 && id(wind_meter_scale).state < 33) {
|
||||||
|
# id(wind_scale).publish_state("Violent Storm");
|
||||||
|
# } else if (id(wind_meter_scale).state >= 33) {
|
||||||
|
# id(wind_scale).publish_state("Hurricane Force");
|
||||||
|
# } else {
|
||||||
|
# id(wind_scale).publish_state("");
|
||||||
|
# }
|
||||||
|
|
||||||
|
#switch:
|
||||||
|
# - platform: template
|
||||||
|
# optimistic: true
|
||||||
|
# name: switch
|
||||||
|
# #internal: True
|
||||||
|
# id: g_WindSpeedMin_Reset
|
||||||
|
|
||||||
|
#interval:
|
||||||
|
# - interval: 10s
|
||||||
|
# then:
|
||||||
|
# - lambda: |-
|
||||||
|
# id(g_WindSpeedMin_Reset).state == true;
|
||||||
|
# //id(id_wind_gust_10s).publish_state(id(g_WindGust_10s));
|
||||||
|
# id(id_wind_speed_min_10s).publish_state(id(g_WindSpeedMin_10s));
|
||||||
|
# //id(id_wind_gust_60s).publish_state(id(g_WindGust_60s));
|
||||||
|
# //id(id_wind_gust_10min).publish_state(id(g_WindGust_10min));
|
||||||
|
# id(g_WindGust_10s) = 0;
|
||||||
|
# // id(g_WindSpeedMin_10s) = 9999.9;
|
||||||
|
# id(g_WindSpeedMin_Reset) = true;
|
||||||
|
# - interval: 60s
|
||||||
|
# then:
|
||||||
|
# - lambda: |-
|
||||||
|
# id(g_WindGust_60s) = 0;
|
||||||
|
# //maintain rain
|
||||||
|
# //if (++id(g_minute) > 59) id(g_minute) = 0;
|
||||||
|
# //id(gt_rain_hour)[id(g_minute)] = 0;
|
||||||
|
# - interval: 10min
|
||||||
|
# then:
|
||||||
|
# - lambda: |-
|
||||||
|
# id(g_WindGust_10min) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
#globals:
|
||||||
|
# global variables for wind/rain sensors
|
||||||
|
# - id: g_WindGust_10min
|
||||||
|
# type: float
|
||||||
|
# restore_value: no
|
||||||
|
# initial_value: '0.0'
|
||||||
|
# - id: g_wind_run_count
|
||||||
|
# type: int
|
||||||
|
# restore_value: no
|
||||||
|
# initial_value: '0'
|
||||||
|
# - id: g_rain_count
|
||||||
|
# type: int
|
||||||
|
# restore_value: no
|
||||||
|
# initial_value: '0'
|
||||||
|
# - id: gt_rain_hour
|
||||||
|
# type: byte[60]
|
||||||
|
# restore_value: no
|
||||||
|
# - id: g_minute
|
||||||
|
# type: byte
|
||||||
|
# restore_value: no
|
||||||
|
# initial_value: '0'
|
||||||
|
# - id: g_WindGust_10s
|
||||||
|
# type: float
|
||||||
|
# restore_value: no
|
||||||
|
# initial_value: '0.0'
|
||||||
|
# - id: g_WindSpeedMin_10s
|
||||||
|
# type: float
|
||||||
|
# restore_value: no
|
||||||
|
# initial_value: '9999.9'
|
||||||
|
# - id: g_WindGust_60s
|
||||||
|
# type: float
|
||||||
|
# restore_value: no
|
||||||
|
# initial_value: '0.0'
|
381
esphome/esphome-web-7776ec copy.yaml.old
Normal file
381
esphome/esphome-web-7776ec copy.yaml.old
Normal file
@@ -0,0 +1,381 @@
|
|||||||
|
# https://digiblur.com/2023/05/24/esphome-mmwave-presence-how-to-guide/
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
name: "esphome-web-7776ec"
|
||||||
|
friendly_name: "esp-mmwave-office"
|
||||||
|
upper_devicename: "esp-mmwave-office"
|
||||||
|
update_time: 30s
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
name: ${name}
|
||||||
|
friendly_name: ${friendly_name}
|
||||||
|
name_add_mac_suffix: false
|
||||||
|
#project:
|
||||||
|
#name: esphome.web
|
||||||
|
#version: '1.0'
|
||||||
|
on_boot: #LD1125H Initial Setting
|
||||||
|
priority: -200
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
i2c:
|
||||||
|
sda: GPIO19
|
||||||
|
scl: GPIO21
|
||||||
|
scan: True
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
#############################################
|
||||||
|
# NOTE: Baudrate set to 0 as we are using the UART with PZEM
|
||||||
|
logger:
|
||||||
|
level: INFO #You Can Use "INFO" Level
|
||||||
|
baud_rate: 0
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
#encryption:
|
||||||
|
# key: !secret esp-mainovenmonitor_api_key
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# Safe mode will detect boot loops
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
# safe_mode: true
|
||||||
|
# password: !secret esp-mainovenmonitor_ota_pass
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Use Wifi
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
#power_save_mode: LIGHT
|
||||||
|
# Details for fallback hotspot (captive portal)
|
||||||
|
# in case wifi connection fails
|
||||||
|
ap:
|
||||||
|
ssid: "MMwave Office Fallback Hotspot"
|
||||||
|
password: !secret fallback_ap_password
|
||||||
|
# manual_ip:
|
||||||
|
# static_ip: 192.168.x.x
|
||||||
|
# gateway: 192.168.X.x
|
||||||
|
# subnet: 255.255.255.0
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# MQTT Monitoring
|
||||||
|
#############################################
|
||||||
|
mqtt:
|
||||||
|
broker: !secret mqtt_server
|
||||||
|
topic_prefix: esphome/esp-mmwave-office
|
||||||
|
username: !secret mqtt_username
|
||||||
|
password: !secret mqtt_password
|
||||||
|
|
||||||
|
# Allow provisioning Wi-Fi via serial
|
||||||
|
#improv_serial:
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Fallback captive portal
|
||||||
|
#############################################
|
||||||
|
# In combination with the `ap` this allows the user
|
||||||
|
# to provision wifi credentials to the device via WiFi AP.
|
||||||
|
#captive_portal:
|
||||||
|
|
||||||
|
#dashboard_import:
|
||||||
|
# package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
|
||||||
|
# import_full_config: true
|
||||||
|
|
||||||
|
# Sets up Bluetooth LE (Only on ESP32) to allow the user
|
||||||
|
# to provision wifi credentials to the device.
|
||||||
|
##esp32_improv:
|
||||||
|
## authorizer: none
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
#############################################
|
||||||
|
#web_server:
|
||||||
|
# port: 80
|
||||||
|
# auth:
|
||||||
|
# username: !secret web_server_username
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
|
||||||
|
#esp32:
|
||||||
|
# board: esp32dev
|
||||||
|
# framework:
|
||||||
|
# type: arduino
|
||||||
|
esp32:
|
||||||
|
board: esp32dev
|
||||||
|
framework:
|
||||||
|
type: esp-idf #Suggest Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
|
||||||
|
external_components:
|
||||||
|
- source:
|
||||||
|
type: git
|
||||||
|
url: https://github.com/ssieb/custom_components #Thanks for @ssieb components.
|
||||||
|
components: [ serial ]
|
||||||
|
|
||||||
|
|
||||||
|
uart:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# rx_pin: GPIO1 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# tx_pin: GPIO0 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
baud_rate: 115200
|
||||||
|
data_bits: 8
|
||||||
|
stop_bits: 1
|
||||||
|
parity: NONE
|
||||||
|
# debug:
|
||||||
|
# direction: BOTH
|
||||||
|
# dummy_receiver: false
|
||||||
|
# after:
|
||||||
|
# delimiter: "\n"
|
||||||
|
# sequence:
|
||||||
|
# - lambda: UARTDebug::log_string(direction, bytes);
|
||||||
|
globals:
|
||||||
|
- id: LD1125H_Last_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Last_Mov_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Clearence_Status
|
||||||
|
type: bool
|
||||||
|
restore_value: no
|
||||||
|
initial_value: "false"
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #ESP32 OnBroad LED
|
||||||
|
inverted: false
|
||||||
|
#web_server: #Avoid Using Web Server To Prevent Hang
|
||||||
|
# port: 80
|
||||||
|
interval:
|
||||||
|
- interval: 1s #Clearance Scan Time
|
||||||
|
setup_priority: -200
|
||||||
|
then:
|
||||||
|
lambda: |-
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) {
|
||||||
|
if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Clearance");
|
||||||
|
id(LD1125H_Clearence_Status) = true;
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == true) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth1 #mth1 is 0~2.8m Sensitivity.
|
||||||
|
id: LD1125H_mth1
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "60.0" #Default mth1 Setting
|
||||||
|
min_value: 10.0
|
||||||
|
max_value: 600.0
|
||||||
|
step: 5.0
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth2 #mth2 is 2.8~8m Sensitivity.
|
||||||
|
id: LD1125H_mth2
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "30" #Default mth2 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 300
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth3 #mth3 is above 8m Sensitivity.
|
||||||
|
id: LD1125H_mth3
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "20" #Default mth3 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 200
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H rmax #rmax is max detection distance.
|
||||||
|
id: LD1125H_rmax
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "8" #Default rmax Setting
|
||||||
|
min_value: 0.4
|
||||||
|
max_value: 12
|
||||||
|
step: 0.1
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Clearence Time
|
||||||
|
id: LD1125H_Clear_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 20
|
||||||
|
step: 0.5
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement Time
|
||||||
|
id: LD1125H_Mov_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "1" #LD1125H Mov > Occ Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 10
|
||||||
|
step: 0.5
|
||||||
|
sensor:
|
||||||
|
- platform: bme280_i2c
|
||||||
|
temperature:
|
||||||
|
name: ${upper_devicename} BME280 Temp
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
pressure:
|
||||||
|
name: ${upper_devicename} BME280 Pressure
|
||||||
|
oversampling: 2x
|
||||||
|
humidity:
|
||||||
|
name: ${upper_devicename} BME280 Humidity
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
address: 0x76
|
||||||
|
update_interval: ${update_time}
|
||||||
|
# - platform: aht10
|
||||||
|
# temperature:
|
||||||
|
# accuracy_decimals: 2
|
||||||
|
# name: ${upper_devicename} AHT21 Temp
|
||||||
|
# humidity:
|
||||||
|
# accuracy_decimals: 2
|
||||||
|
# name: ${upper_devicename} AHT21 Humidity
|
||||||
|
# update_interval: ${update_time}
|
||||||
|
# - platform: wifi_signal
|
||||||
|
# name: ${upper_devicename} WiFi Signal
|
||||||
|
# update_interval: 60s
|
||||||
|
- platform: uptime
|
||||||
|
name: ${upper_devicename} Uptime
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Distance
|
||||||
|
id: LD1125H_Distance
|
||||||
|
icon: "mdi:signal-distance-variant"
|
||||||
|
unit_of_measurement: "m"
|
||||||
|
accuracy_decimals: 2
|
||||||
|
filters: # Use Fliter To Debounce
|
||||||
|
- sliding_window_moving_average:
|
||||||
|
window_size: 8
|
||||||
|
send_every: 2
|
||||||
|
- heartbeat: 0.2s
|
||||||
|
text_sensor:
|
||||||
|
- platform: serial
|
||||||
|
uart_id: LD1125H_UART_BUS
|
||||||
|
name: ${upper_devicename} LD1125H UART Text
|
||||||
|
id: LD1125H_UART_Text
|
||||||
|
icon: "mdi:format-text"
|
||||||
|
internal: True #If Don't Want to See UART Receive Data, Set To True
|
||||||
|
on_value:
|
||||||
|
lambda: |-
|
||||||
|
if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Occupancy");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
id(LD1125H_Occupancy).publish_state("Movement");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == false) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Mov_Time) = time(NULL);
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy Status
|
||||||
|
id: LD1125H_Occupancy
|
||||||
|
icon: "mdi:motion-sensor"
|
||||||
|
binary_sensor:
|
||||||
|
- platform: status
|
||||||
|
name: ${upper_devicename} Status
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy or Movement
|
||||||
|
id: LD1125H_MovOcc_Binary
|
||||||
|
device_class: occupancy
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement
|
||||||
|
id: LD1125H_Mov_Binary
|
||||||
|
device_class: motion
|
370
esphome/trash/esp-mmwave-office-7776ec.yaml
Normal file
370
esphome/trash/esp-mmwave-office-7776ec.yaml
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
# https://digiblur.com/2023/05/24/esphome-mmwave-presence-how-to-guide/
|
||||||
|
|
||||||
|
substitutions:
|
||||||
|
name: esp-mmwave-office-7776ec
|
||||||
|
friendly_name: esp-mmwave-office
|
||||||
|
update_time: 30s
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
name: ${name}
|
||||||
|
friendly_name: ${friendly_name}
|
||||||
|
name_add_mac_suffix: false
|
||||||
|
#project:
|
||||||
|
#name: esphome.web
|
||||||
|
#version: '1.0'
|
||||||
|
on_boot: #LD1125H Initial Setting
|
||||||
|
priority: -200
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
#############################################
|
||||||
|
# NOTE: Baudrate set to 0 as we are using the UART with PZEM
|
||||||
|
logger:
|
||||||
|
level: INFO #You Can Use "INFO" Level
|
||||||
|
baud_rate: 0
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
#encryption:
|
||||||
|
# key: !secret esp-mainovenmonitor_api_key
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# Safe mode will detect boot loops
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
# safe_mode: true
|
||||||
|
# password: !secret esp-mainovenmonitor_ota_pass
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Use Wifi
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
power_save_mode: LIGHT
|
||||||
|
# Details for fallback hotspot (captive portal)
|
||||||
|
# in case wifi connection fails
|
||||||
|
ap:
|
||||||
|
ssid: "MMwave Office Fallback Hotspot"
|
||||||
|
password: !secret fallback_ap_password
|
||||||
|
# manual_ip:
|
||||||
|
# static_ip: 192.168.x.x
|
||||||
|
# gateway: 192.168.X.x
|
||||||
|
# subnet: 255.255.255.0
|
||||||
|
|
||||||
|
|
||||||
|
# Allow provisioning Wi-Fi via serial
|
||||||
|
#improv_serial:
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Fallback captive portal
|
||||||
|
#############################################
|
||||||
|
# In combination with the `ap` this allows the user
|
||||||
|
# to provision wifi credentials to the device via WiFi AP.
|
||||||
|
captive_portal:
|
||||||
|
|
||||||
|
#dashboard_import:
|
||||||
|
# package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
|
||||||
|
# import_full_config: true
|
||||||
|
|
||||||
|
# Sets up Bluetooth LE (Only on ESP32) to allow the user
|
||||||
|
# to provision wifi credentials to the device.
|
||||||
|
##esp32_improv:
|
||||||
|
## authorizer: none
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
#############################################
|
||||||
|
#web_server:
|
||||||
|
# port: 80
|
||||||
|
# auth:
|
||||||
|
# username: !secret web_server_username
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
|
||||||
|
i2c:
|
||||||
|
sda: GPIO19
|
||||||
|
scl: GPIO21
|
||||||
|
scan: True
|
||||||
|
|
||||||
|
#esp32:
|
||||||
|
# board: esp32dev
|
||||||
|
# framework:
|
||||||
|
# type: arduino
|
||||||
|
esp32:
|
||||||
|
board: nodemcu-32s
|
||||||
|
framework:
|
||||||
|
type: esp-idf #Suggest Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
|
||||||
|
external_components:
|
||||||
|
- source:
|
||||||
|
type: git
|
||||||
|
url: https://github.com/ssieb/custom_components #Thanks for @ssieb components.
|
||||||
|
components: [ serial ]
|
||||||
|
|
||||||
|
|
||||||
|
uart:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# rx_pin: GPIO1 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# tx_pin: GPIO0 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
baud_rate: 115200
|
||||||
|
data_bits: 8
|
||||||
|
stop_bits: 1
|
||||||
|
parity: NONE
|
||||||
|
# debug:
|
||||||
|
# direction: BOTH
|
||||||
|
# dummy_receiver: false
|
||||||
|
# after:
|
||||||
|
# delimiter: "\n"
|
||||||
|
# sequence:
|
||||||
|
# - lambda: UARTDebug::log_string(direction, bytes);
|
||||||
|
globals:
|
||||||
|
- id: LD1125H_Last_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Last_Mov_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Clearence_Status
|
||||||
|
type: bool
|
||||||
|
restore_value: no
|
||||||
|
initial_value: "false"
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #ESP32 OnBroad LED
|
||||||
|
inverted: false
|
||||||
|
#web_server: #Avoid Using Web Server To Prevent Hang
|
||||||
|
# port: 80
|
||||||
|
interval:
|
||||||
|
- interval: 1s #Clearance Scan Time
|
||||||
|
setup_priority: -200
|
||||||
|
then:
|
||||||
|
lambda: |-
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) {
|
||||||
|
if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Clearance");
|
||||||
|
id(LD1125H_Clearence_Status) = true;
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == true) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth1 #mth1 is 0~2.8m Sensitivity.
|
||||||
|
id: LD1125H_mth1
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "60.0" #Default mth1 Setting
|
||||||
|
min_value: 10.0
|
||||||
|
max_value: 600.0
|
||||||
|
step: 5.0
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth2 #mth2 is 2.8~8m Sensitivity.
|
||||||
|
id: LD1125H_mth2
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "30" #Default mth2 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 300
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth3 #mth3 is above 8m Sensitivity.
|
||||||
|
id: LD1125H_mth3
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "20" #Default mth3 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 200
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H rmax #rmax is max detection distance.
|
||||||
|
id: LD1125H_rmax
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "8" #Default rmax Setting
|
||||||
|
min_value: 0.4
|
||||||
|
max_value: 12
|
||||||
|
step: 0.1
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Clearence Time
|
||||||
|
id: LD1125H_Clear_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 20
|
||||||
|
step: 0.5
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement Time
|
||||||
|
id: LD1125H_Mov_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "1" #LD1125H Mov > Occ Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 10
|
||||||
|
step: 0.5
|
||||||
|
sensor:
|
||||||
|
- platform: bme280_i2c
|
||||||
|
temperature:
|
||||||
|
name: ${upper_devicename} BME280 Temp
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
pressure:
|
||||||
|
name: ${upper_devicename} BME280 Pressure
|
||||||
|
oversampling: 2x
|
||||||
|
humidity:
|
||||||
|
name: ${upper_devicename} BME280 Humidity
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
address: 0x76
|
||||||
|
update_interval: ${update_time}
|
||||||
|
# - platform: aht10
|
||||||
|
# temperature:
|
||||||
|
# accuracy_decimals: 2
|
||||||
|
# name: ${upper_devicename} AHT21 Temp
|
||||||
|
# humidity:
|
||||||
|
# accuracy_decimals: 2
|
||||||
|
# name: ${upper_devicename} AHT21 Humidity
|
||||||
|
# update_interval: ${update_time}
|
||||||
|
# - platform: wifi_signal
|
||||||
|
# name: ${upper_devicename} WiFi Signal
|
||||||
|
# update_interval: 60s
|
||||||
|
- platform: uptime
|
||||||
|
name: ${upper_devicename} Uptime
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Distance
|
||||||
|
id: LD1125H_Distance
|
||||||
|
icon: "mdi:signal-distance-variant"
|
||||||
|
unit_of_measurement: "m"
|
||||||
|
accuracy_decimals: 2
|
||||||
|
filters: # Use Fliter To Debounce
|
||||||
|
- sliding_window_moving_average:
|
||||||
|
window_size: 8
|
||||||
|
send_every: 2
|
||||||
|
- heartbeat: 0.2s
|
||||||
|
text_sensor:
|
||||||
|
- platform: serial
|
||||||
|
uart_id: LD1125H_UART_BUS
|
||||||
|
name: ${upper_devicename} LD1125H UART Text
|
||||||
|
id: LD1125H_UART_Text
|
||||||
|
icon: "mdi:format-text"
|
||||||
|
internal: True #If Don't Want to See UART Receive Data, Set To True
|
||||||
|
on_value:
|
||||||
|
lambda: |-
|
||||||
|
if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Occupancy");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
id(LD1125H_Occupancy).publish_state("Movement");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == false) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Mov_Time) = time(NULL);
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy Status
|
||||||
|
id: LD1125H_Occupancy
|
||||||
|
icon: "mdi:motion-sensor"
|
||||||
|
binary_sensor:
|
||||||
|
- platform: status
|
||||||
|
name: ${upper_devicename} Status
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy or Movement
|
||||||
|
id: LD1125H_MovOcc_Binary
|
||||||
|
device_class: occupancy
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement
|
||||||
|
id: LD1125H_Mov_Binary
|
||||||
|
device_class: motion
|
31
esphome/trash/esp-mmwave-office.yaml
Normal file
31
esphome/trash/esp-mmwave-office.yaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
esphome:
|
||||||
|
name: esp-mmwave-office
|
||||||
|
friendly_name: esp-mmwave-office
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
board: esp32dev
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
|
||||||
|
# Enable logging
|
||||||
|
logger:
|
||||||
|
|
||||||
|
# Enable Home Assistant API
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: "KbgRoOmslFkhfRnWgr3RKK6P3Ed3dhHJ+l9FVYZX8lo="
|
||||||
|
|
||||||
|
ota:
|
||||||
|
password: "b3a0a1de8ea89ebf360fbeac40af7a0a"
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
|
||||||
|
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||||
|
ap:
|
||||||
|
ssid: "Esp-Mmwave-Office"
|
||||||
|
password: "EsNR8kqAOUu8"
|
||||||
|
|
||||||
|
captive_portal:
|
||||||
|
|
401
esphome/trash/esp-mmwaveoffice-7776ec.yaml
Normal file
401
esphome/trash/esp-mmwaveoffice-7776ec.yaml
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
#############################################
|
||||||
|
# Variable Substitutions
|
||||||
|
#############################################
|
||||||
|
substitutions:
|
||||||
|
devicename: "esp-mmwaveoffice-7776ec"
|
||||||
|
friendly_name: "Office Occupancy"
|
||||||
|
mqtt_topic: "esphome"
|
||||||
|
update_time: 30s #for temp sensors etc
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome
|
||||||
|
# https://esphome.io/components/esphome.html
|
||||||
|
#############################################
|
||||||
|
esphome:
|
||||||
|
name: ${devicename}
|
||||||
|
comment: D1 Mini ESP32 with mmWave and environment sensors for main office #appears on the esphome page in HA
|
||||||
|
on_boot: #LD1125H Initial Setting
|
||||||
|
priority: -200
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESP Platform and Framework
|
||||||
|
# https://esphome.io/components/esp32.html
|
||||||
|
#############################################
|
||||||
|
esp32:
|
||||||
|
board: nodemcu-32s
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
#type: esp-idf #Suggested Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
version: recommended #recommended, latest or dev
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# i2s bus
|
||||||
|
# https://esphome.io/components/i2c.html
|
||||||
|
#############################################
|
||||||
|
i2c:
|
||||||
|
sda: GPIO19
|
||||||
|
scl: GPIO21
|
||||||
|
scan: True
|
||||||
|
frequency: 100kHz #10, 50, 100, 200, 800 are possible settings, 100kHz was reliable for me
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome external or custom components to use
|
||||||
|
# https://esphome.io/components/external_components.html
|
||||||
|
#############################################
|
||||||
|
external_components:
|
||||||
|
- source:
|
||||||
|
type: git
|
||||||
|
url: https://github.com/ssieb/custom_components #Thanks for @ssieb components.
|
||||||
|
components: [ serial ] #text_sensor that reads lines for a uart. Also, a sensor that reads single values from the uart.
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
# https://esphome.io/components/logger.html
|
||||||
|
#############################################
|
||||||
|
logger:
|
||||||
|
level: INFO #INFO Level suggested, or DEBUG for testing
|
||||||
|
baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||||||
|
#esp8266_store_log_strings_in_flash: false
|
||||||
|
#tx_buffer_size: 64
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
# https://esphome.io/components/api.html
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: !secret esp-mmwaveoffice_api_key
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# Safe mode will detect boot loops
|
||||||
|
# https://esphome.io/components/ota.html?highlight=ota
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
safe_mode: true
|
||||||
|
password: !secret esp-mmwaveoffice_ota_pass
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Wifi Settings
|
||||||
|
# https://esphome.io/components/wifi.html
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
#power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||||
|
#manual_ip:
|
||||||
|
#static_ip: 192.168.x.x
|
||||||
|
#gateway: 192.168.X.x
|
||||||
|
#subnet: 255.255.255.0
|
||||||
|
#ap: #Details for fallback hotspot (captive portal) in case wifi connection fails
|
||||||
|
#ssid: "? Fallback Hotspot"
|
||||||
|
#password: !secret fallback_ap_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
# Turning this off is probably a good idea to save resources.
|
||||||
|
# https://esphome.io/components/web_server.html
|
||||||
|
#############################################
|
||||||
|
web_server:
|
||||||
|
port: 80
|
||||||
|
# username: !secret web_server_username
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# MQTT Monitoring
|
||||||
|
# https://esphome.io/components/mqtt.html?highlight=mqtt
|
||||||
|
# MUST also have api enabled if you enable MQTT
|
||||||
|
#############################################
|
||||||
|
mqtt:
|
||||||
|
broker: !secret mqtt_server
|
||||||
|
topic_prefix: ${mqtt_topic}/${devicename}
|
||||||
|
username: !secret mqtt_username
|
||||||
|
password: !secret mqtt_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# UART Serial
|
||||||
|
# hardware on EPS32, but software, and can be glitchy on ESP8266
|
||||||
|
# https://esphome.io/components/uart.html?highlight=uart
|
||||||
|
#############################################
|
||||||
|
uart:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# rx_pin: GPIO1 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# tx_pin: GPIO0 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
baud_rate: 115200
|
||||||
|
data_bits: 8
|
||||||
|
stop_bits: 1
|
||||||
|
parity: NONE
|
||||||
|
# debug:
|
||||||
|
# direction: BOTH
|
||||||
|
# dummy_receiver: false
|
||||||
|
# after:
|
||||||
|
# delimiter: "\n"
|
||||||
|
# sequence:
|
||||||
|
# - lambda: UARTDebug::log_string(direction, bytes);
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Global Variables for use in automations etc
|
||||||
|
# https://esphome.io/guides/automations.html?highlight=globals#global-variables
|
||||||
|
#############################################
|
||||||
|
globals:
|
||||||
|
- id: LD1125H_Last_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Last_Mov_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Clearence_Status
|
||||||
|
type: bool
|
||||||
|
restore_value: no
|
||||||
|
initial_value: "false"
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General esp status LED
|
||||||
|
# https://esphome.io/components/status_led.html
|
||||||
|
#############################################
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #ESP32 Onboard LED
|
||||||
|
inverted: false
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Interval Automations
|
||||||
|
# https://esphome.io/guides/automations.html
|
||||||
|
#############################################
|
||||||
|
interval:
|
||||||
|
- interval: 1s #Clearance Scan Time
|
||||||
|
setup_priority: -200
|
||||||
|
then:
|
||||||
|
lambda: |-
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) {
|
||||||
|
if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Clearance");
|
||||||
|
id(LD1125H_Clearence_Status) = true;
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == true) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Number Sensors (custom component)
|
||||||
|
# refer https://github.com/ssieb/esphome_components/tree/master/components/serial
|
||||||
|
#############################################
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H mth1 #mth1 is 0~2.8m Sensitivity.
|
||||||
|
id: LD1125H_mth1
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "60.0" #Default mth1 Setting
|
||||||
|
min_value: 10.0
|
||||||
|
max_value: 600.0
|
||||||
|
step: 5.0
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H mth2 #mth2 is 2.8~8m Sensitivity.
|
||||||
|
id: LD1125H_mth2
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "30" #Default mth2 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 300
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H mth3 #mth3 is above 8m Sensitivity.
|
||||||
|
id: LD1125H_mth3
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "20" #Default mth3 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 200
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H rmax #rmax is max detection distance.
|
||||||
|
id: LD1125H_rmax
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "8" #Default rmax Setting
|
||||||
|
min_value: 0.4
|
||||||
|
max_value: 12
|
||||||
|
step: 0.1
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Clearence Time
|
||||||
|
id: LD1125H_Clear_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 20
|
||||||
|
step: 0.5
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Movement Time
|
||||||
|
id: LD1125H_Mov_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "1" #LD1125H Mov > Occ Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 10
|
||||||
|
step: 0.5
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General Sensors
|
||||||
|
# https://esphome.io/components/sensor/index.html
|
||||||
|
#############################################
|
||||||
|
sensor:
|
||||||
|
- platform: bme280_i2c
|
||||||
|
temperature:
|
||||||
|
name: ${friendly_name} BME280 Temp
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
pressure:
|
||||||
|
name: ${friendly_name} BME280 Pressure
|
||||||
|
oversampling: 2x
|
||||||
|
humidity:
|
||||||
|
name: ${friendly_name} BME280 Humidity
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
address: 0x76
|
||||||
|
update_interval: ${update_time}
|
||||||
|
- platform: uptime
|
||||||
|
name: ${friendly_name} Uptime
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Distance
|
||||||
|
id: LD1125H_Distance
|
||||||
|
icon: "mdi:signal-distance-variant"
|
||||||
|
unit_of_measurement: "m"
|
||||||
|
accuracy_decimals: 2
|
||||||
|
filters: # Use Fliter To Debounce
|
||||||
|
- sliding_window_moving_average:
|
||||||
|
window_size: 8
|
||||||
|
send_every: 2
|
||||||
|
- heartbeat: 0.2s
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Text Sensors (custom component)
|
||||||
|
# refer https://github.com/ssieb/esphome_components/tree/master/components/serial
|
||||||
|
#############################################
|
||||||
|
text_sensor:
|
||||||
|
- platform: serial
|
||||||
|
uart_id: LD1125H_UART_BUS
|
||||||
|
name: ${friendly_name} LD1125H UART Text
|
||||||
|
id: LD1125H_UART_Text
|
||||||
|
icon: "mdi:format-text"
|
||||||
|
internal: True #If Don't Want to See UART Receive Data, Set To True
|
||||||
|
on_value:
|
||||||
|
lambda: |-
|
||||||
|
if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Occupancy");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
id(LD1125H_Occupancy).publish_state("Movement");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == false) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Mov_Time) = time(NULL);
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Occupancy Status
|
||||||
|
id: LD1125H_Occupancy
|
||||||
|
icon: "mdi:motion-sensor"
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Binary Sensors
|
||||||
|
# https://esphome.io/components/binary_sensor/index.html
|
||||||
|
#############################################
|
||||||
|
binary_sensor:
|
||||||
|
- platform: status
|
||||||
|
name: ${friendly_name} Status
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Occupancy or Movement
|
||||||
|
id: LD1125H_MovOcc_Binary
|
||||||
|
device_class: occupancy
|
||||||
|
- platform: template
|
||||||
|
name: ${friendly_name} LD1125H Movement
|
||||||
|
id: LD1125H_Mov_Binary
|
||||||
|
device_class: motion
|
393
esphome/trash/esphome-web-7776ec.yaml
Normal file
393
esphome/trash/esphome-web-7776ec.yaml
Normal file
@@ -0,0 +1,393 @@
|
|||||||
|
#############################################
|
||||||
|
# Variable Substitutions
|
||||||
|
#############################################
|
||||||
|
substitutions:
|
||||||
|
devicename: "esphome-web-7776ec"
|
||||||
|
friendly_name: "esp-web-7776ec"
|
||||||
|
upper_devicename: "esp-web-7776ec"
|
||||||
|
mqtt_topic: "esphome"
|
||||||
|
update_time: 30s #for temp sensors etc
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome
|
||||||
|
# https://esphome.io/components/esphome.html#esphome-core-configuration
|
||||||
|
#############################################
|
||||||
|
esphome:
|
||||||
|
name: ${devicename}
|
||||||
|
comment: D1 Mini ESP32 with mmWave and environment sensors for main office #appears on the esphome page in HA
|
||||||
|
on_boot: #LD1125H Initial Setting
|
||||||
|
priority: -200
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESP Platform and Framework
|
||||||
|
# https://esphome.io/components/esp32.html
|
||||||
|
#############################################
|
||||||
|
esp32:
|
||||||
|
board: nodemcu-32s
|
||||||
|
framework:
|
||||||
|
type: arduino
|
||||||
|
#type: esp-idf #Suggested Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang.
|
||||||
|
version: recommended #recommended, latest or dev
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# i2s bus
|
||||||
|
# https://esphome.io/components/i2c.html
|
||||||
|
#############################################
|
||||||
|
i2c:
|
||||||
|
sda: GPIO19
|
||||||
|
scl: GPIO21
|
||||||
|
scan: True
|
||||||
|
frequency: 100kHz #10, 50, 100, 200, 800 are possible settings, 100kHz was reliable for me
|
||||||
|
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome external or custom components to use
|
||||||
|
#############################################
|
||||||
|
external_components:
|
||||||
|
- source:
|
||||||
|
type: git
|
||||||
|
url: https://github.com/ssieb/custom_components #Thanks for @ssieb components.
|
||||||
|
components: [ serial ] #text_sensor that reads lines for a uart. Also, a sensor that reads single values from the uart.
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# ESPHome Logging Enable
|
||||||
|
#############################################
|
||||||
|
logger:
|
||||||
|
level: INFO #INFO Level suggested, or DEBUG for testing
|
||||||
|
baud_rate: 0 #set to 0 for no logging via UART, needed if you are using it for other serial things (eg PZEM)
|
||||||
|
#esp8266_store_log_strings_in_flash: false
|
||||||
|
#tx_buffer_size: 64
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable the Home Assistant API
|
||||||
|
#############################################
|
||||||
|
api:
|
||||||
|
#encryption:
|
||||||
|
#key: !secret esp-?_api_key
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Enable Over the Air Update Capability
|
||||||
|
# Safe mode will detect boot loops
|
||||||
|
#############################################
|
||||||
|
ota:
|
||||||
|
safe_mode: true
|
||||||
|
password: !secret esp-mmwaveoffice_ota_pass
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Wifi Settings
|
||||||
|
#############################################
|
||||||
|
wifi:
|
||||||
|
ssid: !secret wifi_ssid
|
||||||
|
password: !secret wifi_password
|
||||||
|
#power_save_mode: LIGHT #https://esphome.io/components/wifi.html#wifi-power-save-mode
|
||||||
|
#manual_ip:
|
||||||
|
#static_ip: 192.168.x.x
|
||||||
|
#gateway: 192.168.X.x
|
||||||
|
#subnet: 255.255.255.0
|
||||||
|
#ap: #Details for fallback hotspot (captive portal) in case wifi connection fails
|
||||||
|
#ssid: "? Fallback Hotspot"
|
||||||
|
#password: !secret fallback_ap_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Web Portal for display and monitoring
|
||||||
|
# Turning this off is probably a good idea to save resources.
|
||||||
|
#############################################
|
||||||
|
web_server:
|
||||||
|
port: 80
|
||||||
|
# username: !secret web_server_username
|
||||||
|
# password: !secret web_server_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# MQTT Monitoring
|
||||||
|
#############################################
|
||||||
|
mqtt:
|
||||||
|
broker: !secret mqtt_server
|
||||||
|
topic_prefix: ${mqtt_topic}/${devicename}
|
||||||
|
username: !secret mqtt_username
|
||||||
|
password: !secret mqtt_password
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
# MAIN SENSORS
|
||||||
|
#############################################
|
||||||
|
#############################################
|
||||||
|
uart:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
rx_pin: GPIO16 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
tx_pin: GPIO17 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# rx_pin: GPIO1 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
# tx_pin: GPIO0 #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
|
||||||
|
baud_rate: 115200
|
||||||
|
data_bits: 8
|
||||||
|
stop_bits: 1
|
||||||
|
parity: NONE
|
||||||
|
# debug:
|
||||||
|
# direction: BOTH
|
||||||
|
# dummy_receiver: false
|
||||||
|
# after:
|
||||||
|
# delimiter: "\n"
|
||||||
|
# sequence:
|
||||||
|
# - lambda: UARTDebug::log_string(direction, bytes);
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Global Variables for use in templates etc
|
||||||
|
#############################################
|
||||||
|
globals:
|
||||||
|
- id: LD1125H_Last_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Last_Mov_Time
|
||||||
|
type: time_t
|
||||||
|
restore_value: no
|
||||||
|
initial_value: time(NULL)
|
||||||
|
- id: LD1125H_Clearence_Status
|
||||||
|
type: bool
|
||||||
|
restore_value: no
|
||||||
|
initial_value: "false"
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General esp status LED
|
||||||
|
#############################################
|
||||||
|
status_led:
|
||||||
|
pin:
|
||||||
|
number: GPIO2 #ESP32 OnBroad LED
|
||||||
|
inverted: false
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Interval Automations
|
||||||
|
# https://esphome.io/guides/automations.html#interval-component
|
||||||
|
#############################################
|
||||||
|
interval:
|
||||||
|
- interval: 1s #Clearance Scan Time
|
||||||
|
setup_priority: -200
|
||||||
|
then:
|
||||||
|
lambda: |-
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) {
|
||||||
|
if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Clearance");
|
||||||
|
id(LD1125H_Clearence_Status) = true;
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == true) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Number Sensors (custom component)
|
||||||
|
# refer https://github.com/ssieb/esphome_components/tree/master/components/serial
|
||||||
|
#############################################
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth1 #mth1 is 0~2.8m Sensitivity.
|
||||||
|
id: LD1125H_mth1
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "60.0" #Default mth1 Setting
|
||||||
|
min_value: 10.0
|
||||||
|
max_value: 600.0
|
||||||
|
step: 5.0
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th1st.begin(), th1st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth2 #mth2 is 2.8~8m Sensitivity.
|
||||||
|
id: LD1125H_mth2
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "30" #Default mth2 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 300
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th2st.begin(), th2st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H mth3 #mth3 is above 8m Sensitivity.
|
||||||
|
id: LD1125H_mth3
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "20" #Default mth3 Setting
|
||||||
|
min_value: 5
|
||||||
|
max_value: 200
|
||||||
|
step: 5
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(th3st.begin(), th3st.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H rmax #rmax is max detection distance.
|
||||||
|
id: LD1125H_rmax
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "8" #Default rmax Setting
|
||||||
|
min_value: 0.4
|
||||||
|
max_value: 12
|
||||||
|
step: 0.1
|
||||||
|
set_action:
|
||||||
|
then:
|
||||||
|
- uart.write:
|
||||||
|
id: LD1125H_UART_BUS
|
||||||
|
data: !lambda |-
|
||||||
|
std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n";
|
||||||
|
return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Clearence Time
|
||||||
|
id: LD1125H_Clear_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 20
|
||||||
|
step: 0.5
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement Time
|
||||||
|
id: LD1125H_Mov_Time
|
||||||
|
icon: "mdi:cogs"
|
||||||
|
optimistic: true
|
||||||
|
restore_value: true #If you don't want to store the setting at ESP, set it to false.
|
||||||
|
initial_value: "1" #LD1125H Mov > Occ Time Here
|
||||||
|
min_value: 0.5
|
||||||
|
max_value: 10
|
||||||
|
step: 0.5
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# General Sensors
|
||||||
|
# https://esphome.io/components/sensor/index.html
|
||||||
|
#############################################
|
||||||
|
sensor:
|
||||||
|
- platform: bme280_i2c
|
||||||
|
temperature:
|
||||||
|
name: ${upper_devicename} BME280 Temp
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
pressure:
|
||||||
|
name: ${upper_devicename} BME280 Pressure
|
||||||
|
oversampling: 2x
|
||||||
|
humidity:
|
||||||
|
name: ${upper_devicename} BME280 Humidity
|
||||||
|
accuracy_decimals: 1
|
||||||
|
oversampling: 2x
|
||||||
|
address: 0x76
|
||||||
|
update_interval: ${update_time}
|
||||||
|
- platform: uptime
|
||||||
|
name: ${upper_devicename} Uptime
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Distance
|
||||||
|
id: LD1125H_Distance
|
||||||
|
icon: "mdi:signal-distance-variant"
|
||||||
|
unit_of_measurement: "m"
|
||||||
|
accuracy_decimals: 2
|
||||||
|
filters: # Use Fliter To Debounce
|
||||||
|
- sliding_window_moving_average:
|
||||||
|
window_size: 8
|
||||||
|
send_every: 2
|
||||||
|
- heartbeat: 0.2s
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Text Sensors (custom component)
|
||||||
|
# refer https://github.com/ssieb/esphome_components/tree/master/components/serial
|
||||||
|
#############################################
|
||||||
|
text_sensor:
|
||||||
|
- platform: serial
|
||||||
|
uart_id: LD1125H_UART_BUS
|
||||||
|
name: ${upper_devicename} LD1125H UART Text
|
||||||
|
id: LD1125H_UART_Text
|
||||||
|
icon: "mdi:format-text"
|
||||||
|
internal: True #If Don't Want to See UART Receive Data, Set To True
|
||||||
|
on_value:
|
||||||
|
lambda: |-
|
||||||
|
if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) {
|
||||||
|
id(LD1125H_Occupancy).publish_state("Occupancy");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == true) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") {
|
||||||
|
id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
|
||||||
|
id(LD1125H_Occupancy).publish_state("Movement");
|
||||||
|
if (id(LD1125H_MovOcc_Binary).state == false) {
|
||||||
|
id(LD1125H_MovOcc_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
if (id(LD1125H_Mov_Binary).state == false) {
|
||||||
|
id(LD1125H_Mov_Binary).publish_state(true);
|
||||||
|
}
|
||||||
|
id(LD1125H_Last_Mov_Time) = time(NULL);
|
||||||
|
id(LD1125H_Last_Time) = time(NULL);
|
||||||
|
if (id(LD1125H_Clearence_Status) == true) {
|
||||||
|
id(LD1125H_Clearence_Status) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy Status
|
||||||
|
id: LD1125H_Occupancy
|
||||||
|
icon: "mdi:motion-sensor"
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# Binary Sensors
|
||||||
|
# https://esphome.io/components/binary_sensor/index.html
|
||||||
|
#############################################
|
||||||
|
binary_sensor:
|
||||||
|
- platform: status
|
||||||
|
name: ${upper_devicename} Status
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Occupancy or Movement
|
||||||
|
id: LD1125H_MovOcc_Binary
|
||||||
|
device_class: occupancy
|
||||||
|
- platform: template
|
||||||
|
name: ${upper_devicename} LD1125H Movement
|
||||||
|
id: LD1125H_Mov_Binary
|
||||||
|
device_class: motion
|
@@ -1,55 +0,0 @@
|
|||||||
var:
|
|
||||||
covid_daily:
|
|
||||||
friendly_name: "Daily Covid count"
|
|
||||||
initial_value: 0
|
|
||||||
icon: mdi:virus-outline
|
|
||||||
covid_yesterday_total:
|
|
||||||
friendly_name: "Yesterdays NZ Cumulative Total Covid Cases"
|
|
||||||
initial_value: 0
|
|
||||||
icon: mdi:virus-outline
|
|
||||||
|
|
||||||
automation:
|
|
||||||
- id: add_covid_confirmed_stats_only_if_increases
|
|
||||||
alias: add_covid_confirmed_stats_only_if_increases
|
|
||||||
#description:
|
|
||||||
# "Check new state of sensor.new_zealand_coronavirus_confirmed and store it
|
|
||||||
# in input_number.new_zealand_coronavirus_confirmed_previous_value if it has increased"
|
|
||||||
trigger:
|
|
||||||
- platform: state
|
|
||||||
entity_id: sensor.new_zealand_coronavirus_confirmed
|
|
||||||
condition:
|
|
||||||
- condition: template
|
|
||||||
value_template:
|
|
||||||
"{{ (states('sensor.new_zealand_coronavirus_confirmed') | float
|
|
||||||
> states('var.covid_yesterday_total') | float) }}"
|
|
||||||
action:
|
|
||||||
- service: var.set
|
|
||||||
data_template:
|
|
||||||
entity_id: var.covid_daily
|
|
||||||
value:
|
|
||||||
"{{ states('sensor.new_zealand_coronavirus_confirmed') | float - states('var.covid_yesterday_total')
|
|
||||||
| float }}"
|
|
||||||
- service: var.set
|
|
||||||
data_template:
|
|
||||||
entity_id: var.covid_yesterday_total
|
|
||||||
value: "{{ states('sensor.new_zealand_coronavirus_confirmed') | float }}"
|
|
||||||
|
|
||||||
sensor:
|
|
||||||
- platform: statistics
|
|
||||||
entity_id: sensor.coronavirus_totals_normalised
|
|
||||||
sampling_size: 200000
|
|
||||||
state_characteristic: mean
|
|
||||||
max_age:
|
|
||||||
days: 1
|
|
||||||
name: "Coronavirus Statistics"
|
|
||||||
- platform: template
|
|
||||||
sensors:
|
|
||||||
coronavirus_totals_normalised:
|
|
||||||
friendly_name: "NZ Coronavirus Totals (Normalised)"
|
|
||||||
value_template: >
|
|
||||||
{% set new_state = states('sensor.new_zealand_coronavirus_confirmed') | float %}
|
|
||||||
{% if new_state >= states('input_number.new_zealand_coronavirus_confirmed_previous_value') | float %}
|
|
||||||
{{ new_state }}
|
|
||||||
{% else %}
|
|
||||||
{{ states('input_number.new_zealand_coronavirus_confirmed_previous_value') | float }}
|
|
||||||
{% endif %}
|
|
@@ -1,27 +1,39 @@
|
|||||||
mqtt:
|
mqtt:
|
||||||
sensor:
|
sensor:
|
||||||
- unique_id: 32a_ev_charger_power
|
- unique_id: 32a_ev_wallcharger_power
|
||||||
name: "32A EV Charger Power"
|
name: "32A EV Wallcharger Power"
|
||||||
|
device_class: power
|
||||||
|
unit_of_measurement: kW
|
||||||
state_topic: "stat/tasmo-wemosd1-7280-powermon-1/EnergyMeterCount"
|
state_topic: "stat/tasmo-wemosd1-7280-powermon-1/EnergyMeterCount"
|
||||||
value_template: "{{ value_json.EVChargerWhCount * 2 * 60 }}"
|
value_template: "{{ value_json.EVChargerWhCount * 2 * 60 / 1000 }}"
|
||||||
- unique_id: 16a_ev_charger_power
|
- unique_id: 16a_ev_wallcharger_power
|
||||||
name: "16A EV Charger Power"
|
name: "16A EV Wallcharger Power"
|
||||||
|
device_class: power
|
||||||
|
unit_of_measurement: kW
|
||||||
state_topic: "stat/tasmo-s4chan-7594-garage-1/EnergyMeterCount"
|
state_topic: "stat/tasmo-s4chan-7594-garage-1/EnergyMeterCount"
|
||||||
value_template: "{{ value_json.EVChargerWhCount * 2 * 60 }}"
|
value_template: "{{ value_json.EVChargerWhCount * 2 * 60 / 1000 }}"
|
||||||
|
|
||||||
|
# Use the Riemann sum integral to calculate energy in kWh
|
||||||
|
# from the contimuous power measuring sensors
|
||||||
sensor:
|
sensor:
|
||||||
- platform: integration
|
- platform: integration
|
||||||
unique_id: 32a_ev_charger_power_total
|
unique_id: 32a_ev_wallcharger_power_total
|
||||||
name: "32A EV Charger Power Total"
|
name: "32A EV Wallcharger Power Total"
|
||||||
source: sensor.32a_ev_charger_power
|
source: sensor.32a_ev_wallcharger_power
|
||||||
#unit_prefix: k
|
#device_class: energy
|
||||||
#round: 2
|
#unit_of_measurement: Wh
|
||||||
|
#unit_time: h
|
||||||
|
#unit_prefix: k # Show in kWh
|
||||||
|
round: 0 # Only need 0 decimals accuracy
|
||||||
- platform: integration
|
- platform: integration
|
||||||
unique_id: 16a_ev_charger_power_total
|
unique_id: 16a_ev_wallcharger_power_total
|
||||||
name: "16A EV Charger Power Total"
|
name: "16A EV Wallcharger Power Total"
|
||||||
source: sensor.16a_ev_charger_power
|
source: sensor.16a_ev_wallcharger_power
|
||||||
|
#device_class: energy
|
||||||
|
#unit_of_measurement: Wh
|
||||||
|
#unit_time: h
|
||||||
#unit_prefix: k
|
#unit_prefix: k
|
||||||
#round: 2
|
round: 0
|
||||||
|
|
||||||
input_select:
|
input_select:
|
||||||
leaf_ev_charging_mode:
|
leaf_ev_charging_mode:
|
||||||
|
4
packages/foxhole_controls.yaml
Normal file
4
packages/foxhole_controls.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
input_boolean:
|
||||||
|
foxhole_occupied:
|
||||||
|
name: Foxhole Guest Occupied
|
||||||
|
icon: mdi:briefcase-plus-outline
|
@@ -1,7 +0,0 @@
|
|||||||
sensor:
|
|
||||||
- platform: google_keep
|
|
||||||
username: !secret google_keep.username
|
|
||||||
password: !secret google_keep.password
|
|
||||||
labels:
|
|
||||||
- "Home Assistant"
|
|
||||||
pinned: true
|
|
12
packages/mqtt_statestream.yaml
Normal file
12
packages/mqtt_statestream.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
mqtt_statestream:
|
||||||
|
base_topic: hamqtt
|
||||||
|
publish_attributes: true
|
||||||
|
publish_timestamps: true
|
||||||
|
include:
|
||||||
|
entities:
|
||||||
|
- sensor.main_bathroom_humidity_change_rate
|
||||||
|
entity_globs:
|
||||||
|
- sensor.*_zt*
|
||||||
|
#exclude:
|
||||||
|
# entity_globs:
|
||||||
|
# - sensor.*zoruno*
|
@@ -7,32 +7,61 @@
|
|||||||
# value_template: "{{ value_json.ZbReceived.Office_Media_Button.Power }}"
|
# value_template: "{{ value_json.ZbReceived.Office_Media_Button.Power }}"
|
||||||
|
|
||||||
automation:
|
automation:
|
||||||
- id: "1629271273952"
|
- id: pause_office_tv_on_media_button
|
||||||
alias: Pause Office TV on Media Button
|
alias: Pause Office TV on Media Button
|
||||||
description: ""
|
description: ""
|
||||||
trigger:
|
trigger:
|
||||||
- platform: state
|
- platform: event
|
||||||
entity_id: sensor.media_button_office_zbt04_action
|
event_type: zha_event
|
||||||
to: "single"
|
event_data:
|
||||||
|
device_ieee: 00:15:8d:00:06:79:46:c8
|
||||||
|
command: click
|
||||||
|
args:
|
||||||
|
click_type: single
|
||||||
condition: []
|
condition: []
|
||||||
action:
|
action:
|
||||||
- service: media_player.media_pause
|
- service: media_player.media_pause
|
||||||
target:
|
target:
|
||||||
device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa
|
device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa
|
||||||
mode: single
|
mode: single
|
||||||
- id: "1629271457675"
|
- id: play_office_tv_on_media_button
|
||||||
alias: Play Office TV on Media Button
|
alias: Play Office TV on Media Button
|
||||||
description: ""
|
description: ""
|
||||||
trigger:
|
trigger:
|
||||||
- platform: state
|
- platform: event
|
||||||
entity_id: sensor.media_button_office_zbt04_action
|
event_type: zha_event
|
||||||
to: "double"
|
event_data:
|
||||||
|
device_ieee: 00:15:8d:00:06:79:46:c8
|
||||||
|
command: click
|
||||||
|
args:
|
||||||
|
click_type: double
|
||||||
condition: []
|
condition: []
|
||||||
action:
|
action:
|
||||||
- service: media_player.media_play
|
- service: media_player.media_play
|
||||||
target:
|
target:
|
||||||
device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa
|
device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa
|
||||||
mode: single
|
mode: single
|
||||||
|
- id: seek_office_tv_on_media_button
|
||||||
|
alias: Seek Office TV on Media Button
|
||||||
|
description: ""
|
||||||
|
trigger:
|
||||||
|
- platform: event
|
||||||
|
event_type: zha_event
|
||||||
|
event_data:
|
||||||
|
device_ieee: 00:15:8d:00:06:79:46:c8
|
||||||
|
command: click
|
||||||
|
args:
|
||||||
|
click_type: triple
|
||||||
|
condition: []
|
||||||
|
action:
|
||||||
|
- service: media_player.media_seek
|
||||||
|
data:
|
||||||
|
seek_position: >-
|
||||||
|
{{ state_attr("media_player.office_tv",
|
||||||
|
"media_position")|int + (seek_amount|default(-30)|int(-30)) }}
|
||||||
|
target:
|
||||||
|
device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa
|
||||||
|
mode: single
|
||||||
# - id: "1629271273958"
|
# - id: "1629271273958"
|
||||||
# alias: Pause office TV on MQTT
|
# alias: Pause office TV on MQTT
|
||||||
# description: ""
|
# description: ""
|
||||||
@@ -60,3 +89,32 @@ automation:
|
|||||||
# data:
|
# data:
|
||||||
# seek_position: 30
|
# seek_position: 30
|
||||||
# mode: single
|
# mode: single
|
||||||
|
|
||||||
|
#automation:
|
||||||
|
# - id: "1629271273952"
|
||||||
|
# unique_id: pause_office_tv_on_media_button
|
||||||
|
# alias: Pause Office TV on Media Button
|
||||||
|
# description: ""
|
||||||
|
# trigger:
|
||||||
|
# - platform: state
|
||||||
|
# entity_id: sensor.media_button_office_zbt04_action
|
||||||
|
# to: "single"
|
||||||
|
# condition: []
|
||||||
|
# action:
|
||||||
|
# - service: media_player.media_pause
|
||||||
|
# target:
|
||||||
|
# device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa
|
||||||
|
# mode: single
|
||||||
|
# - id: "1629271457675"
|
||||||
|
# alias: Play Office TV on Media Button
|
||||||
|
# description: ""
|
||||||
|
# trigger:
|
||||||
|
# - platform: state
|
||||||
|
# entity_id: sensor.media_button_office_zbt04_action
|
||||||
|
# to: "double"
|
||||||
|
# condition: []
|
||||||
|
# action:
|
||||||
|
# - service: media_player.media_play
|
||||||
|
# target:
|
||||||
|
# device_id: abb6b5a6b4e4925dcb3a77ea2c293eaa
|
||||||
|
# mode: single
|
||||||
|
@@ -1,3 +1,11 @@
|
|||||||
|
sensor:
|
||||||
|
- platform: integration
|
||||||
|
unique_id: pool_pump_power_total
|
||||||
|
name: "Pool pump power total"
|
||||||
|
source: sensor.tasmo_athplug_5853_3_poolpump_energy_power
|
||||||
|
unit_prefix: k
|
||||||
|
#round: 2
|
||||||
|
|
||||||
input_select:
|
input_select:
|
||||||
pool_light_colour_select:
|
pool_light_colour_select:
|
||||||
icon: mdi:swimming-pool
|
icon: mdi:swimming-pool
|
||||||
|
@@ -75,3 +75,24 @@ sensor:
|
|||||||
state_topic: !secret btb09_topic
|
state_topic: !secret btb09_topic
|
||||||
timeout: 60
|
timeout: 60
|
||||||
away_timeout: 120 # number of seconds after which the enitity will get status not_home
|
away_timeout: 120 # number of seconds after which the enitity will get status not_home
|
||||||
|
- platform: mqtt_room
|
||||||
|
unique_id: !secret btb10_uID
|
||||||
|
device_id: !secret btb10_dID
|
||||||
|
name: !secret btb10_name
|
||||||
|
state_topic: !secret btb10_topic
|
||||||
|
timeout: 60
|
||||||
|
away_timeout: 120 # number of seconds after which the enitity will get status not_home
|
||||||
|
- platform: mqtt_room
|
||||||
|
unique_id: !secret btb11_uID
|
||||||
|
device_id: !secret btb11_dID
|
||||||
|
name: !secret btb11_name
|
||||||
|
state_topic: !secret btb11_topic
|
||||||
|
timeout: 60
|
||||||
|
away_timeout: 120 # number of seconds after which the enitity will get status not_home
|
||||||
|
- platform: mqtt_room
|
||||||
|
unique_id: !secret btb12_uID
|
||||||
|
device_id: !secret btb12_dID
|
||||||
|
name: !secret btb12_name
|
||||||
|
state_topic: !secret btb12_topic
|
||||||
|
timeout: 60
|
||||||
|
away_timeout: 120 # number of seconds after which the enitity will get status not_home
|
||||||
|
7
packages/security_and_notifications.yaml
Normal file
7
packages/security_and_notifications.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
input_boolean:
|
||||||
|
quiet_time:
|
||||||
|
name: Quiet time for no notifications
|
||||||
|
icon: mdi:shield-moon
|
||||||
|
away_occupied_routine:
|
||||||
|
name: Automation for Lights etc when away
|
||||||
|
icon: mdi:shield-lock
|
7
packages/shower_controls.yaml
Normal file
7
packages/shower_controls.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
sensor:
|
||||||
|
- platform: derivative
|
||||||
|
name: Main Bathroom Humidity Change Rate
|
||||||
|
source: sensor.main_bathroom_environment_zth04_humidity
|
||||||
|
round: 1
|
||||||
|
unit_time: s # the resulting "unit_of_measurement" will be %H/s if the sensor.temperate has set %H as its unit
|
||||||
|
time_window: "00:00:10" # we look at the change over the last 10 seconds
|
5
packages/tautulli.yaml
Normal file
5
packages/tautulli.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
sensor:
|
||||||
|
- platform: tautulli
|
||||||
|
api_key: !secret tautulli_api_key
|
||||||
|
host: !secret tautulli_api_host
|
||||||
|
port: !secret tautulli_api_port
|
@@ -3,3 +3,53 @@ waste_collection_schedule:
|
|||||||
- name: aucklandcouncil_govt_nz
|
- name: aucklandcouncil_govt_nz
|
||||||
args:
|
args:
|
||||||
area_number: 12344403722 # see 'How to get the source argument below'
|
area_number: 12344403722 # see 'How to get the source argument below'
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
- platform: waste_collection_schedule
|
||||||
|
#source_index: 0
|
||||||
|
name: Auckland Council Waste
|
||||||
|
details_format: upcoming
|
||||||
|
count: 1
|
||||||
|
leadtime: 1
|
||||||
|
#value_template: VALUE_TEMPLATE
|
||||||
|
#date_template: DATE_TEMPLATE
|
||||||
|
add_days_to: true
|
||||||
|
#event_index: EVENT_INDEX
|
||||||
|
types:
|
||||||
|
- rubbish
|
||||||
|
- platform: waste_collection_schedule
|
||||||
|
#source_index: 0
|
||||||
|
name: Auckland Council Recycling
|
||||||
|
details_format: upcoming
|
||||||
|
count: 1
|
||||||
|
leadtime: 1
|
||||||
|
#value_template: VALUE_TEMPLATE
|
||||||
|
#date_template: DATE_TEMPLATE
|
||||||
|
add_days_to: true
|
||||||
|
#event_index: EVENT_INDEX
|
||||||
|
types:
|
||||||
|
- recycle
|
||||||
|
- platform: waste_collection_schedule
|
||||||
|
#source_index: 0
|
||||||
|
name: Auckland Council Food-Waste
|
||||||
|
details_format: upcoming
|
||||||
|
count: 1
|
||||||
|
leadtime: 1
|
||||||
|
#value_template: VALUE_TEMPLATE
|
||||||
|
#date_template: DATE_TEMPLATE
|
||||||
|
add_days_to: true
|
||||||
|
#event_index: EVENT_INDEX
|
||||||
|
types:
|
||||||
|
- food-waste
|
||||||
|
|
||||||
|
mqtt:
|
||||||
|
sensor:
|
||||||
|
- unique_id: auckland_council_red_waste_bin_out
|
||||||
|
name: "Red Waste Bin Out"
|
||||||
|
state_topic: "viewroad-status/rubbishbinstatus/redbin-out"
|
||||||
|
- unique_id: auckland_council_green_recycling_bin_out
|
||||||
|
name: "Green Recycling Bin Out"
|
||||||
|
state_topic: "viewroad-status/rubbishbinstatus/greenbin-out"
|
||||||
|
- unique_id: auckland_council_food_waste_bin_out
|
||||||
|
name: "Food Waste Bin Out"
|
||||||
|
state_topic: "viewroad-status/rubbishbinstatus/foodbin-out"
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
check_config:
|
#check_config:
|
||||||
sequence: []
|
# sequence: []
|
||||||
alias: Check Configuration
|
# alias: Check Configuration
|
||||||
|
2
scripts/zha.yaml
Normal file
2
scripts/zha.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
zha:
|
||||||
|
custom_quirks_path: /config/custom_zha_quirks/
|
Reference in New Issue
Block a user