mirror of
https://github.com/Threnklyn/esphome-dev.git
synced 2026-05-24 14:48:29 +02:00
6682c43dfa
## Description: Move esphome-core codebase into esphome (and a bunch of other refactors). See https://github.com/esphome/feature-requests/issues/97 Yes this is a shit ton of work and no there's no way to automate it :( But it will be worth it 👍 Progress: - Core support (file copy etc): 80% - Base Abstractions (light, switch): ~50% - Integrations: ~10% - Working? Yes, (but only with ported components). Other refactors: - Moves all codegen related stuff into a single class: `esphome.codegen` (imported as `cg`) - Rework coroutine syntax - Move from `component/platform.py` to `domain/component.py` structure as with HA - Move all defaults out of C++ and into config validation. - Remove `make_...` helpers from Application class. Reason: Merge conflicts with every single new integration. - Pointer Variables are stored globally instead of locally in setup(). Reason: stack size limit. Future work: - Rework const.py - Move all `CONF_...` into a conf class (usage `conf.UPDATE_INTERVAL` vs `CONF_UPDATE_INTERVAL`). Reason: Less convoluted import block - Enable loading from `custom_components` folder. **Related issue (if applicable):** https://github.com/esphome/feature-requests/issues/97 **Pull request in [esphome-docs](https://github.com/esphome/esphome-docs) with documentation (if applicable):** esphome/esphome-docs#<esphome-docs PR number goes here> ## Checklist: - [ ] The code change is tested and works locally. - [ ] Tests have been added to verify that the new code works (under `tests/` folder). If user exposed functionality or configuration variables are added/changed: - [ ] Documentation added/updated in [esphomedocs](https://github.com/OttoWinter/esphomedocs).
100 lines
2.8 KiB
C++
100 lines
2.8 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/component.h"
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <bitset>
|
|
|
|
namespace esphome {
|
|
namespace time {
|
|
|
|
/// A more user-friendly version of struct tm from time.h
|
|
struct ESPTime {
|
|
/** seconds after the minute [0-60]
|
|
* @note second is generally 0-59; the extra range is to accommodate leap seconds.
|
|
*/
|
|
uint8_t second;
|
|
/// minutes after the hour [0-59]
|
|
uint8_t minute;
|
|
/// hours since midnight [0-23]
|
|
uint8_t hour;
|
|
/// day of the week; sunday=1 [1-7]
|
|
uint8_t day_of_week;
|
|
/// day of the month [1-31]
|
|
uint8_t day_of_month;
|
|
/// day of the year [1-366]
|
|
uint16_t day_of_year;
|
|
/// month; january=1 [1-12]
|
|
uint8_t month;
|
|
/// year
|
|
uint16_t year;
|
|
/// daylight savings time flag
|
|
bool is_dst;
|
|
/// unix epoch time (seconds since UTC Midnight January 1, 1970)
|
|
time_t time;
|
|
|
|
/** Convert this ESPTime struct to a null-terminated c string buffer as specified by the format argument.
|
|
* Up to buffer_len bytes are written.
|
|
*
|
|
* @see https://www.gnu.org/software/libc/manual/html_node/Formatting-Calendar-Time.html#index-strftime
|
|
*/
|
|
size_t strftime(char *buffer, size_t buffer_len, const char *format);
|
|
|
|
/** Convert this ESPTime struct to a string as specified by the format argument.
|
|
* @see https://www.gnu.org/software/libc/manual/html_node/Formatting-Calendar-Time.html#index-strftime
|
|
*
|
|
* @warning This method uses dynamically allocated strings which can cause heap fragmentation with some
|
|
* microcontrollers.
|
|
*/
|
|
std::string strftime(const std::string &format);
|
|
|
|
bool is_valid() const;
|
|
|
|
bool in_range() const;
|
|
|
|
static ESPTime from_tm(struct tm *c_tm, time_t c_time);
|
|
|
|
struct tm to_c_tm();
|
|
|
|
void increment_second();
|
|
bool operator<(ESPTime other);
|
|
bool operator<=(ESPTime other);
|
|
bool operator==(ESPTime other);
|
|
bool operator>=(ESPTime other);
|
|
bool operator>(ESPTime other);
|
|
};
|
|
|
|
/// The RealTimeClock class exposes common timekeeping functions via the device's local real-time clock.
|
|
///
|
|
/// \note
|
|
/// The C library (newlib) available on ESPs only supports TZ strings that specify an offset and DST info;
|
|
/// you cannot specify zone names or paths to zoneinfo files.
|
|
/// \see https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html
|
|
class RealTimeClock : public Component {
|
|
public:
|
|
explicit RealTimeClock();
|
|
|
|
/// Set the time zone.
|
|
void set_timezone(const std::string &tz) { this->timezone_ = tz; }
|
|
|
|
/// Get the time zone currently in use.
|
|
std::string get_timezone() { return this->timezone_; }
|
|
|
|
/// Get the time in the currently defined timezone.
|
|
ESPTime now();
|
|
|
|
/// Get the time without any time zone or DST corrections.
|
|
ESPTime utcnow();
|
|
|
|
void call_setup() override;
|
|
|
|
protected:
|
|
/// Report a unix epoch as current time.
|
|
void synchronize_epoch_(uint32_t epoch);
|
|
|
|
std::string timezone_{};
|
|
};
|
|
|
|
} // namespace time
|
|
} // namespace esphome
|