mirror of
https://github.com/esphome/esphome.git
synced 2026-01-16 23:14:52 -07:00
Compare commits
2 Commits
wiegand_to
...
uart_debug
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d6a4faf90 | ||
|
|
c28f68b6fa |
@@ -11,7 +11,7 @@ ci:
|
||||
repos:
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: v0.14.13
|
||||
rev: v0.14.11
|
||||
hooks:
|
||||
# Run the linter.
|
||||
- id: ruff
|
||||
|
||||
@@ -8,20 +8,17 @@ from esphome.const import (
|
||||
CONF_ICON,
|
||||
CONF_ID,
|
||||
CONF_INDEX,
|
||||
CONF_LAMBDA,
|
||||
CONF_MODE,
|
||||
CONF_MQTT_ID,
|
||||
CONF_ON_VALUE,
|
||||
CONF_OPERATION,
|
||||
CONF_OPTION,
|
||||
CONF_OPTIONS,
|
||||
CONF_TRIGGER_ID,
|
||||
CONF_WEB_SERVER,
|
||||
)
|
||||
from esphome.core import CORE, ID, CoroPriority, coroutine_with_priority
|
||||
from esphome.core import CORE, CoroPriority, coroutine_with_priority
|
||||
from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
|
||||
from esphome.cpp_generator import MockObjClass, TemplateArguments
|
||||
from esphome.cpp_types import global_ns
|
||||
from esphome.cpp_generator import MockObjClass
|
||||
|
||||
CODEOWNERS = ["@esphome/core"]
|
||||
IS_PLATFORM_COMPONENT = True
|
||||
@@ -41,9 +38,6 @@ SelectSetAction = select_ns.class_("SelectSetAction", automation.Action)
|
||||
SelectSetIndexAction = select_ns.class_("SelectSetIndexAction", automation.Action)
|
||||
SelectOperationAction = select_ns.class_("SelectOperationAction", automation.Action)
|
||||
|
||||
# Conditions
|
||||
SelectIsCondition = select_ns.class_("SelectIsCondition", automation.Condition)
|
||||
|
||||
# Enums
|
||||
SelectOperation = select_ns.enum("SelectOperation")
|
||||
SELECT_OPERATION_OPTIONS = {
|
||||
@@ -171,41 +165,6 @@ async def select_set_index_to_code(config, action_id, template_arg, args):
|
||||
return var
|
||||
|
||||
|
||||
@automation.register_condition(
|
||||
"select.is",
|
||||
SelectIsCondition,
|
||||
OPERATION_BASE_SCHEMA.extend(
|
||||
{
|
||||
cv.Optional(CONF_OPTIONS): cv.All(
|
||||
cv.ensure_list(cv.string_strict), cv.Length(min=1)
|
||||
),
|
||||
cv.Optional(CONF_LAMBDA): cv.returning_lambda,
|
||||
}
|
||||
).add_extra(cv.has_exactly_one_key(CONF_OPTIONS, CONF_LAMBDA)),
|
||||
)
|
||||
async def select_is_to_code(config, condition_id, template_arg, args):
|
||||
paren = await cg.get_variable(config[CONF_ID])
|
||||
if options := config.get(CONF_OPTIONS):
|
||||
# List of constant options
|
||||
# Create a constexpr and pass that with a template length
|
||||
arr_id = ID(
|
||||
f"{condition_id}_data",
|
||||
is_declaration=True,
|
||||
type=global_ns.namespace("constexpr char * const"),
|
||||
)
|
||||
arg = cg.static_const_array(arr_id, cg.ArrayInitializer(*options))
|
||||
template_arg = TemplateArguments(len(options), *template_arg)
|
||||
else:
|
||||
# Lambda
|
||||
arg = await cg.process_lambda(
|
||||
config[CONF_LAMBDA],
|
||||
[(global_ns.namespace("StringRef &").operator("const"), "current")] + args,
|
||||
return_type=cg.bool_,
|
||||
)
|
||||
template_arg = TemplateArguments(0, *template_arg)
|
||||
return cg.new_Pvariable(condition_id, template_arg, paren, arg)
|
||||
|
||||
|
||||
@automation.register_action(
|
||||
"select.operation",
|
||||
SelectOperationAction,
|
||||
|
||||
@@ -66,34 +66,4 @@ template<typename... Ts> class SelectOperationAction : public Action<Ts...> {
|
||||
Select *select_;
|
||||
};
|
||||
|
||||
template<size_t N, typename... Ts> class SelectIsCondition : public Condition<Ts...> {
|
||||
public:
|
||||
SelectIsCondition(Select *parent, const char *const *option_list) : parent_(parent), option_list_(option_list) {}
|
||||
|
||||
bool check(const Ts &...x) override {
|
||||
auto current = this->parent_->current_option();
|
||||
for (size_t i = 0; i != N; i++) {
|
||||
if (current == this->option_list_[i]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
Select *parent_;
|
||||
const char *const *option_list_;
|
||||
};
|
||||
|
||||
template<typename... Ts> class SelectIsCondition<0, Ts...> : public Condition<Ts...> {
|
||||
public:
|
||||
SelectIsCondition(Select *parent, std::function<bool(const StringRef &, const Ts &...)> &&f)
|
||||
: parent_(parent), f_(f) {}
|
||||
|
||||
bool check(const Ts &...x) override { return this->f_(this->parent_->current_option(), x...); }
|
||||
|
||||
protected:
|
||||
Select *parent_;
|
||||
std::function<bool(const StringRef &, const Ts &...)> f_;
|
||||
};
|
||||
} // namespace esphome::select
|
||||
|
||||
@@ -107,7 +107,7 @@ void UARTDebug::log_hex(UARTDirection direction, std::vector<uint8_t> bytes, uin
|
||||
if (i > 0) {
|
||||
res += separator;
|
||||
}
|
||||
sprintf(buf, "%02X", bytes[i]);
|
||||
buf_append_printf(buf, sizeof(buf), 0, "%02X", bytes[i]);
|
||||
res += buf;
|
||||
}
|
||||
ESP_LOGD(TAG, "%s", res.c_str());
|
||||
@@ -147,7 +147,7 @@ void UARTDebug::log_string(UARTDirection direction, std::vector<uint8_t> bytes)
|
||||
} else if (bytes[i] == 92) {
|
||||
res += "\\\\";
|
||||
} else if (bytes[i] < 32 || bytes[i] > 127) {
|
||||
sprintf(buf, "\\x%02X", bytes[i]);
|
||||
buf_append_printf(buf, sizeof(buf), 0, "\\x%02X", bytes[i]);
|
||||
res += buf;
|
||||
} else {
|
||||
res += bytes[i];
|
||||
@@ -166,11 +166,13 @@ void UARTDebug::log_int(UARTDirection direction, std::vector<uint8_t> bytes, uin
|
||||
} else {
|
||||
res += ">>> ";
|
||||
}
|
||||
char buf[4]; // max 3 digits for uint8_t (255) + null
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
if (i > 0) {
|
||||
res += separator;
|
||||
}
|
||||
res += to_string(bytes[i]);
|
||||
buf_append_printf(buf, sizeof(buf), 0, "%u", bytes[i]);
|
||||
res += buf;
|
||||
}
|
||||
ESP_LOGD(TAG, "%s", res.c_str());
|
||||
delay(10);
|
||||
@@ -189,7 +191,7 @@ void UARTDebug::log_binary(UARTDirection direction, std::vector<uint8_t> bytes,
|
||||
if (i > 0) {
|
||||
res += separator;
|
||||
}
|
||||
sprintf(buf, "0b" BYTE_TO_BINARY_PATTERN " (0x%02X)", BYTE_TO_BINARY(bytes[i]), bytes[i]);
|
||||
buf_append_printf(buf, sizeof(buf), 0, "0b" BYTE_TO_BINARY_PATTERN " (0x%02X)", BYTE_TO_BINARY(bytes[i]), bytes[i]);
|
||||
res += buf;
|
||||
}
|
||||
ESP_LOGD(TAG, "%s", res.c_str());
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "wiegand.h"
|
||||
#include <cinttypes>
|
||||
#include "esphome/core/helpers.h"
|
||||
#include "esphome/core/log.h"
|
||||
|
||||
@@ -70,35 +69,32 @@ void Wiegand::loop() {
|
||||
for (auto *trigger : this->raw_triggers_)
|
||||
trigger->trigger(count, value);
|
||||
if (count == 26) {
|
||||
char tag_buf[12]; // max 8 digits for 24-bit value + null
|
||||
buf_append_printf(tag_buf, sizeof(tag_buf), 0, "%" PRIu32, static_cast<uint32_t>((value >> 1) & 0xffffff));
|
||||
ESP_LOGD(TAG, "received 26-bit tag: %s", tag_buf);
|
||||
std::string tag = to_string((value >> 1) & 0xffffff);
|
||||
ESP_LOGD(TAG, "received 26-bit tag: %s", tag.c_str());
|
||||
if (!check_eparity(value, 13, 13) || !check_oparity(value, 0, 13)) {
|
||||
ESP_LOGW(TAG, "invalid parity");
|
||||
return;
|
||||
}
|
||||
for (auto *trigger : this->tag_triggers_)
|
||||
trigger->trigger(tag_buf);
|
||||
trigger->trigger(tag);
|
||||
} else if (count == 34) {
|
||||
char tag_buf[12]; // max 10 digits for 32-bit value + null
|
||||
buf_append_printf(tag_buf, sizeof(tag_buf), 0, "%" PRIu32, static_cast<uint32_t>((value >> 1) & 0xffffffff));
|
||||
ESP_LOGD(TAG, "received 34-bit tag: %s", tag_buf);
|
||||
std::string tag = to_string((value >> 1) & 0xffffffff);
|
||||
ESP_LOGD(TAG, "received 34-bit tag: %s", tag.c_str());
|
||||
if (!check_eparity(value, 17, 17) || !check_oparity(value, 0, 17)) {
|
||||
ESP_LOGW(TAG, "invalid parity");
|
||||
return;
|
||||
}
|
||||
for (auto *trigger : this->tag_triggers_)
|
||||
trigger->trigger(tag_buf);
|
||||
trigger->trigger(tag);
|
||||
} else if (count == 37) {
|
||||
char tag_buf[12]; // max 11 digits for 35-bit value + null
|
||||
buf_append_printf(tag_buf, sizeof(tag_buf), 0, "%" PRIu64, static_cast<uint64_t>((value >> 1) & 0x7ffffffff));
|
||||
ESP_LOGD(TAG, "received 37-bit tag: %s", tag_buf);
|
||||
std::string tag = to_string((value >> 1) & 0x7ffffffff);
|
||||
ESP_LOGD(TAG, "received 37-bit tag: %s", tag.c_str());
|
||||
if (!check_eparity(value, 18, 19) || !check_oparity(value, 0, 19)) {
|
||||
ESP_LOGW(TAG, "invalid parity");
|
||||
return;
|
||||
}
|
||||
for (auto *trigger : this->tag_triggers_)
|
||||
trigger->trigger(tag_buf);
|
||||
trigger->trigger(tag);
|
||||
} else if (count == 4) {
|
||||
for (auto *trigger : this->key_triggers_)
|
||||
trigger->trigger(value);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
pylint==4.0.4
|
||||
flake8==7.3.0 # also change in .pre-commit-config.yaml when updating
|
||||
ruff==0.14.13 # also change in .pre-commit-config.yaml when updating
|
||||
ruff==0.14.12 # also change in .pre-commit-config.yaml when updating
|
||||
pyupgrade==3.21.2 # also change in .pre-commit-config.yaml when updating
|
||||
pre-commit
|
||||
|
||||
|
||||
@@ -53,17 +53,6 @@ binary_sensor:
|
||||
// Garage Door is closed.
|
||||
return false;
|
||||
}
|
||||
- platform: template
|
||||
id: select_binary_sensor
|
||||
name: Select is one or two
|
||||
condition:
|
||||
any:
|
||||
- select.is:
|
||||
id: template_select
|
||||
options: [one, two]
|
||||
- select.is:
|
||||
id: template_select
|
||||
lambda: return current == id(template_text).state;
|
||||
- platform: template
|
||||
id: other_binary_sensor
|
||||
name: "Garage Door Closed"
|
||||
@@ -331,7 +320,6 @@ valve:
|
||||
|
||||
text:
|
||||
- platform: template
|
||||
id: template_text
|
||||
name: "Template text"
|
||||
optimistic: true
|
||||
min_length: 0
|
||||
|
||||
Reference in New Issue
Block a user