Compare commits

...

5 Commits

Author SHA1 Message Date
Beat 7b1f522769
Merge 21d490cb77 into 98df9e7f9a 2024-12-18 11:32:46 -10:00
pre-commit-ci[bot] 98df9e7f9a
[pre-commit.ci] pre-commit autoupdate (#333)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-12-18 11:32:43 -10:00
J. Nick Koston d6b4c012bf
chore: add black and isort to pre-commit (#348) 2024-12-18 11:32:27 -10:00
Beat 21d490cb77
Update ratgdo.cpp 2024-12-11 18:47:50 -05:00
Beat 60881341d8
Fix door close without obstruction sensor
With the old code, the door would not close the door when stopped, if you don't have the obstruction sensor connect (e.g door stopped)
2024-12-11 17:07:55 -05:00
4 changed files with 72 additions and 43 deletions

View File

@ -8,7 +8,7 @@ repos:
- id: end-of-file-fixer - id: end-of-file-fixer
- id: check-added-large-files - id: check-added-large-files
- repo: https://github.com/pre-commit/mirrors-clang-format - repo: https://github.com/pre-commit/mirrors-clang-format
rev: v19.1.2 rev: v19.1.5
hooks: hooks:
- id: clang-format - id: clang-format
types_or: types_or:
@ -16,3 +16,11 @@ repos:
- "c" - "c"
- "cuda" - "cuda"
args: [-style=Webkit, -i] args: [-style=Webkit, -i]
- repo: https://github.com/PyCQA/isort
rev: 5.13.2
hooks:
- id: isort
- repo: https://github.com/psf/black
rev: 24.10.0
hooks:
- id: black

View File

@ -2,8 +2,8 @@ import esphome.codegen as cg
import esphome.config_validation as cv import esphome.config_validation as cv
import voluptuous as vol import voluptuous as vol
from esphome import automation, pins from esphome import automation, pins
from esphome.const import CONF_ID, CONF_TRIGGER_ID
from esphome.components import binary_sensor from esphome.components import binary_sensor
from esphome.const import CONF_ID, CONF_TRIGGER_ID
DEPENDENCIES = ["preferences"] DEPENDENCIES = ["preferences"]
MULTI_CONF = True MULTI_CONF = True
@ -44,43 +44,59 @@ CONF_DRY_CONTACT_OPEN_SENSOR = "dry_contact_open_sensor"
CONF_DRY_CONTACT_CLOSE_SENSOR = "dry_contact_close_sensor" CONF_DRY_CONTACT_CLOSE_SENSOR = "dry_contact_close_sensor"
CONF_DRY_CONTACT_SENSOR_GROUP = "dry_contact_sensor_group" CONF_DRY_CONTACT_SENSOR_GROUP = "dry_contact_sensor_group"
def validate_protocol(config): def validate_protocol(config):
if config.get(CONF_PROTOCOL, None) == PROTOCOL_DRYCONTACT and (CONF_DRY_CONTACT_CLOSE_SENSOR not in config or CONF_DRY_CONTACT_OPEN_SENSOR not in config): if config.get(CONF_PROTOCOL, None) == PROTOCOL_DRYCONTACT and (
raise cv.Invalid("dry_contact_close_sensor and dry_contact_open_sensor are required when using protocol drycontact") CONF_DRY_CONTACT_CLOSE_SENSOR not in config
if config.get(CONF_PROTOCOL, None) != PROTOCOL_DRYCONTACT and (CONF_DRY_CONTACT_CLOSE_SENSOR in config or CONF_DRY_CONTACT_OPEN_SENSOR in config): or CONF_DRY_CONTACT_OPEN_SENSOR not in config
raise cv.Invalid("dry_contact_close_sensor and dry_contact_open_sensor are only valid when using protocol drycontact") ):
# if config.get(CONF_PROTOCOL, None) == PROTOCOL_DRYCONTACT and CONF_DRY_CONTACT_OPEN_SENSOR not in config: raise cv.Invalid(
# raise cv.Invalid("dry_contact_open_sensor is required when using protocol drycontact") "dry_contact_close_sensor and dry_contact_open_sensor are required when using protocol drycontact"
)
if config.get(CONF_PROTOCOL, None) != PROTOCOL_DRYCONTACT and (
CONF_DRY_CONTACT_CLOSE_SENSOR in config
or CONF_DRY_CONTACT_OPEN_SENSOR in config
):
raise cv.Invalid(
"dry_contact_close_sensor and dry_contact_open_sensor are only valid when using protocol drycontact"
)
# if config.get(CONF_PROTOCOL, None) == PROTOCOL_DRYCONTACT and CONF_DRY_CONTACT_OPEN_SENSOR not in config:
# raise cv.Invalid("dry_contact_open_sensor is required when using protocol drycontact")
return config return config
CONFIG_SCHEMA = cv.All( CONFIG_SCHEMA = cv.All(
cv.Schema( cv.Schema(
{ {
cv.GenerateID(): cv.declare_id(RATGDO), cv.GenerateID(): cv.declare_id(RATGDO),
cv.Optional( cv.Optional(
CONF_OUTPUT_GDO, default=DEFAULT_OUTPUT_GDO CONF_OUTPUT_GDO, default=DEFAULT_OUTPUT_GDO
): pins.gpio_output_pin_schema, ): pins.gpio_output_pin_schema,
cv.Optional( cv.Optional(
CONF_INPUT_GDO, default=DEFAULT_INPUT_GDO CONF_INPUT_GDO, default=DEFAULT_INPUT_GDO
): pins.gpio_input_pin_schema, ): pins.gpio_input_pin_schema,
cv.Optional(CONF_INPUT_OBST, default=DEFAULT_INPUT_OBST): cv.Any( cv.Optional(CONF_INPUT_OBST, default=DEFAULT_INPUT_OBST): cv.Any(
cv.none, pins.gpio_input_pin_schema cv.none, pins.gpio_input_pin_schema
), ),
cv.Optional(CONF_DISCRETE_OPEN_PIN): pins.gpio_output_pin_schema, cv.Optional(CONF_DISCRETE_OPEN_PIN): pins.gpio_output_pin_schema,
cv.Optional(CONF_DISCRETE_CLOSE_PIN): pins.gpio_output_pin_schema, cv.Optional(CONF_DISCRETE_CLOSE_PIN): pins.gpio_output_pin_schema,
cv.Optional(CONF_ON_SYNC_FAILED): automation.validate_automation( cv.Optional(CONF_ON_SYNC_FAILED): automation.validate_automation(
{ {
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(SyncFailed), cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(SyncFailed),
} }
), ),
cv.Optional(CONF_PROTOCOL, default=PROTOCOL_SECPLUSV2): cv.All(vol.In( cv.Optional(CONF_PROTOCOL, default=PROTOCOL_SECPLUSV2): cv.All(
SUPPORTED_PROTOCOLS vol.In(SUPPORTED_PROTOCOLS)
)), ),
# cv.Inclusive(CONF_DRY_CONTACT_OPEN_SENSOR,CONF_DRY_CONTACT_SENSOR_GROUP): cv.use_id(binary_sensor.BinarySensor), # cv.Inclusive(CONF_DRY_CONTACT_OPEN_SENSOR,CONF_DRY_CONTACT_SENSOR_GROUP): cv.use_id(binary_sensor.BinarySensor),
# cv.Inclusive(CONF_DRY_CONTACT_CLOSE_SENSOR,CONF_DRY_CONTACT_SENSOR_GROUP): cv.use_id(binary_sensor.BinarySensor), # cv.Inclusive(CONF_DRY_CONTACT_CLOSE_SENSOR,CONF_DRY_CONTACT_SENSOR_GROUP): cv.use_id(binary_sensor.BinarySensor),
cv.Optional(CONF_DRY_CONTACT_OPEN_SENSOR): cv.use_id(binary_sensor.BinarySensor), cv.Optional(CONF_DRY_CONTACT_OPEN_SENSOR): cv.use_id(
cv.Optional(CONF_DRY_CONTACT_CLOSE_SENSOR): cv.use_id(binary_sensor.BinarySensor), binary_sensor.BinarySensor
} ),
cv.Optional(CONF_DRY_CONTACT_CLOSE_SENSOR): cv.use_id(
binary_sensor.BinarySensor
),
}
).extend(cv.COMPONENT_SCHEMA), ).extend(cv.COMPONENT_SCHEMA),
validate_protocol, validate_protocol,
) )
@ -109,11 +125,18 @@ async def to_code(config):
cg.add(var.set_input_obst_pin(pin)) cg.add(var.set_input_obst_pin(pin))
if CONF_DRY_CONTACT_OPEN_SENSOR in config and config[CONF_DRY_CONTACT_OPEN_SENSOR]: if CONF_DRY_CONTACT_OPEN_SENSOR in config and config[CONF_DRY_CONTACT_OPEN_SENSOR]:
dry_contact_open_sensor = await cg.get_variable(config[CONF_DRY_CONTACT_OPEN_SENSOR]) dry_contact_open_sensor = await cg.get_variable(
config[CONF_DRY_CONTACT_OPEN_SENSOR]
)
cg.add(var.set_dry_contact_open_sensor(dry_contact_open_sensor)) cg.add(var.set_dry_contact_open_sensor(dry_contact_open_sensor))
if CONF_DRY_CONTACT_CLOSE_SENSOR in config and config[CONF_DRY_CONTACT_CLOSE_SENSOR]: if (
dry_contact_close_sensor = await cg.get_variable(config[CONF_DRY_CONTACT_CLOSE_SENSOR]) CONF_DRY_CONTACT_CLOSE_SENSOR in config
and config[CONF_DRY_CONTACT_CLOSE_SENSOR]
):
dry_contact_close_sensor = await cg.get_variable(
config[CONF_DRY_CONTACT_CLOSE_SENSOR]
)
cg.add(var.set_dry_contact_close_sensor(dry_contact_close_sensor)) cg.add(var.set_dry_contact_close_sensor(dry_contact_close_sensor))
for conf in config.get(CONF_ON_SYNC_FAILED, []): for conf in config.get(CONF_ON_SYNC_FAILED, []):

View File

@ -18,9 +18,7 @@ CoverOpeningTrigger = ratgdo_ns.class_(
CoverClosingTrigger = ratgdo_ns.class_( CoverClosingTrigger = ratgdo_ns.class_(
"CoverClosingTrigger", automation.Trigger.template() "CoverClosingTrigger", automation.Trigger.template()
) )
CoverStateTrigger = ratgdo_ns.class_( CoverStateTrigger = ratgdo_ns.class_("CoverStateTrigger", automation.Trigger.template())
"CoverStateTrigger", automation.Trigger.template()
)
CONF_ON_OPENING = "on_opening" CONF_ON_OPENING = "on_opening"
CONF_ON_CLOSING = "on_closing" CONF_ON_CLOSING = "on_closing"

View File

@ -460,11 +460,11 @@ namespace ratgdo {
return; return;
} }
if (this->obstruction_sensor_detected_) { if (!this->obstruction_sensor_detected_ && (*this->door_state == DoorState::OPEN || *this->door_state == DoorState::STOPPED)) {
this->door_action(DoorAction::CLOSE);
} else if (*this->door_state == DoorState::OPEN) {
ESP_LOGD(TAG, "No obstruction sensors detected. Close using TOGGLE."); ESP_LOGD(TAG, "No obstruction sensors detected. Close using TOGGLE.");
this->door_action(DoorAction::TOGGLE); this->door_action(DoorAction::TOGGLE);
} else {
this->door_action(DoorAction::CLOSE);
} }
if (*this->closing_duration > 0) { if (*this->closing_duration > 0) {