ESPHome 2025.5.0
Loading...
Searching...
No Matches
date_entity.cpp
Go to the documentation of this file.
1#include "date_entity.h"
2
3#ifdef USE_DATETIME_DATE
4
5#include "esphome/core/log.h"
6
7namespace esphome {
8namespace datetime {
9
10static const char *const TAG = "datetime.date_entity";
11
13 if (this->year_ == 0 || this->month_ == 0 || this->day_ == 0) {
14 this->has_state_ = false;
15 return;
16 }
17 if (this->year_ < 1970 || this->year_ > 3000) {
18 this->has_state_ = false;
19 ESP_LOGE(TAG, "Year must be between 1970 and 3000");
20 return;
21 }
22 if (this->month_ < 1 || this->month_ > 12) {
23 this->has_state_ = false;
24 ESP_LOGE(TAG, "Month must be between 1 and 12");
25 return;
26 }
27 if (this->day_ > days_in_month(this->month_, this->year_)) {
28 this->has_state_ = false;
29 ESP_LOGE(TAG, "Day must be between 1 and %d for month %d", days_in_month(this->month_, this->year_), this->month_);
30 return;
31 }
32 this->has_state_ = true;
33 ESP_LOGD(TAG, "'%s': Sending date %d-%d-%d", this->get_name().c_str(), this->year_, this->month_, this->day_);
34 this->state_callback_.call();
35}
36
38
40 if (this->year_.has_value() && (this->year_ < 1970 || this->year_ > 3000)) {
41 ESP_LOGE(TAG, "Year must be between 1970 and 3000");
42 this->year_.reset();
43 this->month_.reset();
44 this->day_.reset();
45 }
46 if (this->month_.has_value() && (this->month_ < 1 || this->month_ > 12)) {
47 ESP_LOGE(TAG, "Month must be between 1 and 12");
48 this->month_.reset();
49 this->day_.reset();
50 }
51 if (this->day_.has_value()) {
52 uint16_t year = 0;
53 uint8_t month = 0;
54 if (this->month_.has_value()) {
55 month = *this->month_;
56 } else {
57 if (this->parent_->month != 0) {
58 month = this->parent_->month;
59 } else {
60 ESP_LOGE(TAG, "Month must be set to validate day");
61 this->day_.reset();
62 }
63 }
64 if (this->year_.has_value()) {
65 year = *this->year_;
66 } else {
67 if (this->parent_->year != 0) {
68 year = this->parent_->year;
69 } else {
70 ESP_LOGE(TAG, "Year must be set to validate day");
71 this->day_.reset();
72 }
73 }
74 if (this->day_.has_value() && *this->day_ > days_in_month(month, year)) {
75 ESP_LOGE(TAG, "Day must be between 1 and %d for month %d", days_in_month(month, year), month);
76 this->day_.reset();
77 }
78 }
79}
80
82 this->validate_();
83 ESP_LOGD(TAG, "'%s' - Setting", this->parent_->get_name().c_str());
84
85 if (this->year_.has_value()) {
86 ESP_LOGD(TAG, " Year: %d", *this->year_);
87 }
88 if (this->month_.has_value()) {
89 ESP_LOGD(TAG, " Month: %d", *this->month_);
90 }
91 if (this->day_.has_value()) {
92 ESP_LOGD(TAG, " Day: %d", *this->day_);
93 }
94 this->parent_->control(*this);
95}
96
97DateCall &DateCall::set_date(uint16_t year, uint8_t month, uint8_t day) {
98 this->year_ = year;
99 this->month_ = month;
100 this->day_ = day;
101 return *this;
102};
103
104DateCall &DateCall::set_date(ESPTime time) { return this->set_date(time.year, time.month, time.day_of_month); };
105
106DateCall &DateCall::set_date(const std::string &date) {
107 ESPTime val{};
108 if (!ESPTime::strptime(date, val)) {
109 ESP_LOGE(TAG, "Could not convert the date string to an ESPTime object");
110 return *this;
111 }
112 return this->set_date(val);
113}
114
116 DateCall call = date->make_call();
117 call.set_date(this->year, this->month, this->day);
118 return call;
119}
120
122 date->year_ = this->year;
123 date->month_ = this->month;
124 date->day_ = this->day;
125 date->publish_state();
126}
127
128} // namespace datetime
129} // namespace esphome
130
131#endif // USE_DATETIME_DATE
const StringRef & get_name() const
constexpr const char * c_str() const
Definition string_ref.h:68
DateCall & set_date(uint16_t year, uint8_t month, uint8_t day)
optional< uint8_t > day_
Definition date_entity.h:97
optional< uint8_t > month_
Definition date_entity.h:96
optional< int16_t > year_
Definition date_entity.h:95
virtual void control(const DateCall &call)=0
CallbackManager< void()> state_callback_
bool has_value() const
Definition optional.h:87
uint8_t month
Definition date_entity.h:1
uint16_t year
Definition date_entity.h:0
uint8_t day
Definition date_entity.h:2
mopeka_std_values val[4]
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
uint8_t days_in_month(uint8_t month, uint16_t year)
Definition time.cpp:8
A more user-friendly version of struct tm from time.h.
Definition time.h:15
static bool strptime(const std::string &time_to_parse, ESPTime &esp_time)
Convert a string to ESPTime struct as specified by the format argument.
Definition time.cpp:67
uint8_t day_of_month
day of the month [1-31]
Definition time.h:27
uint16_t year
year
Definition time.h:33
uint8_t month
month; january=1 [1-12]
Definition time.h:31