From d71a6e662b53ca758ddf8e7ffb7bb8888cbf2ce6 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 26 Sep 2026 01:33:21 +0100 Subject: [PATCH] [snapshot] Use register_apply_action for snapshot.take (#19696) --- esphome/components/snapshot/__init__.py | 23 +++++------------------ esphome/components/snapshot/snapshot.cpp | 7 +++++-- esphome/components/snapshot/snapshot.h | 24 ++++-------------------- 3 files changed, 14 insertions(+), 40 deletions(-) diff --git a/esphome/components/snapshot/__init__.py b/esphome/components/snapshot/__init__.py index bf561a0e0d..068af830aa 100644 --- a/esphome/components/snapshot/__init__.py +++ b/esphome/components/snapshot/__init__.py @@ -12,9 +12,9 @@ from esphome import automation import esphome.codegen as cg import esphome.config_validation as cv from esphome.const import CONF_ID -from esphome.core import CORE, ID +from esphome.core import CORE from esphome.cpp_generator import MockObj -from esphome.types import ConfigType, TemplateArgsType +from esphome.types import ConfigType CODEOWNERS = ["@clydebarrow"] @@ -24,31 +24,18 @@ CONF_FILENAME = "filename" snapshot_ns = cg.esphome_ns.namespace("snapshot") Snapshot = snapshot_ns.class_("Snapshot") -SnapshotAction = snapshot_ns.class_("SnapshotAction", automation.Action) -@automation.register_action( +automation.register_apply_action( "snapshot.take", - SnapshotAction, automation.maybe_simple_id( { cv.GenerateID(): cv.use_id(Snapshot), - cv.Optional(CONF_FILENAME): cv.templatable(cv.string), + cv.Optional(CONF_FILENAME, default=""): cv.templatable(cv.string), } ), - synchronous=True, + automation.ApplyField(CONF_FILENAME, "take_snapshot_or_log", cg.std_string), ) -async def snapshot_take_to_code( - config: ConfigType, - action_id: ID, - template_arg: cg.TemplateArguments, - args: TemplateArgsType, -) -> MockObj: - var = cg.new_Pvariable(action_id, template_arg) - await cg.register_parented(var, config[CONF_ID]) - if (filename := config.get(CONF_FILENAME)) is not None: - cg.add(var.set_filename(await cg.templatable(filename, args, cg.std_string))) - return var @dataclass diff --git a/esphome/components/snapshot/snapshot.cpp b/esphome/components/snapshot/snapshot.cpp index 5aa0bcd0e1..1bf63f80b0 100644 --- a/esphome/components/snapshot/snapshot.cpp +++ b/esphome/components/snapshot/snapshot.cpp @@ -192,8 +192,11 @@ bool write_snapshot_file(const uint8_t *pixels, int width, int height, size_t ro } // namespace -// helper function since ESP_LOGW is disallowed in a header file -void Snapshot::log_action_failed() { ESP_LOGW(TAG, "snapshot.take did not write a file"); } +void Snapshot::take_snapshot_or_log(const char *filename) { + if (!this->take_snapshot(filename[0] != '\0' ? filename : nullptr)) { + ESP_LOGW(TAG, "snapshot.take did not write a file"); + } +} bool Snapshot::take_snapshot(const char *filename) { const int width = this->snapshot_width(); diff --git a/esphome/components/snapshot/snapshot.h b/esphome/components/snapshot/snapshot.h index bb670e639f..359d16536d 100644 --- a/esphome/components/snapshot/snapshot.h +++ b/esphome/components/snapshot/snapshot.h @@ -1,7 +1,6 @@ #pragma once #ifdef USE_HOST -#include "esphome/core/automation.h" #include #include @@ -34,8 +33,10 @@ class Snapshot { /// already there is never written over. Returns true if a file was written. bool take_snapshot(const char *filename); - /// Log that an action-triggered snapshot did not write a file. - static void log_action_failed(); + /// Take a snapshot for an automation: an empty name means a generated one, and a snapshot + /// that wrote nothing is logged. + void take_snapshot_or_log(const char *filename); + void take_snapshot_or_log(const std::string &filename) { this->take_snapshot_or_log(filename.c_str()); } protected: /// Width of the picture in pixels. @@ -50,23 +51,6 @@ class Snapshot { const char *snapshot_prefix_{"snapshot"}; }; -template class SnapshotAction final : public Action, public Parented { - public: - TEMPLATABLE_VALUE(std::string, filename) - - protected: - void play(const Ts &...x) override { - bool ok; - if (this->filename_.has_value()) { - ok = this->parent_->take_snapshot(this->filename_.value(x...).c_str()); - } else { - ok = this->parent_->take_snapshot(nullptr); - } - if (!ok) - this->parent_->log_action_failed(); - } -}; - } // namespace esphome::snapshot #endif