1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-30 14:43:51 +00:00

feat: add timer functionality to DynamicLampComponent with logging

This commit is contained in:
Oliver Kleinecke
2025-02-18 10:27:23 +01:00
parent 745393401c
commit 940ef6c50c
2 changed files with 52 additions and 0 deletions

View File

@@ -10,12 +10,31 @@
#include <optional>
#include <algorithm>
#include <cinttypes>
#include <bit>
namespace esphome {
namespace dynamic_lamp {
static const char *TAG = "dynamic_lamp";
struct DynamicLampTimer {
char lamp_name[32] : 256;
uint8_t mode : 1;
uint8_t hour : 5;
uint8_t minute : 6;
bool active : 1;
bool monday : 1;
bool tuesday : 1;
bool wednesday : 1;
bool thursday : 1;
bool friday : 1;
bool saturday : 1;
bool sunday : 1;
unsigned char :0;
ESPTime begin_date : 64;
ESPTime end_date : 64;
};
void DynamicLampComponent::setup() {
this->begin();
}
@@ -226,6 +245,36 @@ std::array<bool, 16> DynamicLampComponent::get_lamp_outputs_by_name(std::string
return bool_array;
}
bool DynamicLampComponent::add_timer(std::string lamp_name, bool timer_active, uint8_t mode, uint8_t hour,
uint8_t minute, bool monday, bool tuesday, bool wednesday, bool thursday,
bool friday, bool saturday, bool sunday) {
char const *lamp_name_cstr = lamp_name.c_str();
DynamicLampTimer new_timer;
std::strncpy(new_timer.lamp_name, lamp_name_cstr, 32);
new_timer.active = timer_active;
new_timer.mode = mode;
new_timer.hour = hour;
new_timer.minute = minute;
new_timer.monday = monday;
new_timer.tuesday = tuesday;
new_timer.wednesday = wednesday;
new_timer.thursday = thursday;
new_timer.friday = friday;
new_timer.saturday = saturday;
new_timer.sunday = sunday;
ESPTime now = this->time_->now();
time_t begin_date = now.to_time_t();
time_t end_date = now.increment_days(1).to_time_t();
new_timer.begin_date = begin_date;
new_timer.end_date = end_date;
ESP_LOGV(TAG, "Added new timer for lamp %s, active %d, mode %d, hour %d, minute %d, monday %d, tuesday %d, wednesday %d, thursday %d, friday %d, saturday %d, sunday %d, begin_date %s, end_date %s",
new_timer.lamp_name, new_timer.active, new_timer.mode, new_timer.hour, new_timer.minute, new_timer.monday, new_timer.tuesday, new_timer.wednesday,
new_timer.thursday, new_timer.friday, new_timer.saturday, new_timer.sunday,
new_timer.begin_date.to_string().c_str(), new_timer.end_date.to_string().c_str());
ESP_LOGV(TAG, "Size of struct is %" PRIu8 "", static_cast<uint8_t>(sizeof(new_timer)));
return true;
}
bool DynamicLampComponent::write_state_(uint8_t lamp_number, float state) {
if (this->active_lamps_[lamp_number].active) {
this->active_lamps_[lamp_number].state_ = state;

View File

@@ -79,6 +79,9 @@ class DynamicLampComponent : public Component {
void remove_output_from_lamp(std::string lamp_name, LinkedOutput *output);
std::array<bool, 16> get_lamp_outputs(uint8_t lamp_number);
std::array<bool, 16> get_lamp_outputs_by_name(std::string lamp_name);
bool add_timer(std::string lamp_name, bool timer_active, uint8_t mode, uint8_t hour,
uint8_t minute, bool monday, bool tuesday, bool wednesday, bool thursday,
bool friday, bool saturday, bool sunday);
protected:
friend class DynamicLamp;