mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	[uptime] Add new timestamp type for uptime sensor (#7029)
* [uptime] Add new timestamp type for uptime sensor * Remove debug logs
This commit is contained in:
		| @@ -1,7 +1,9 @@ | |||||||
| import esphome.codegen as cg | import esphome.codegen as cg | ||||||
| import esphome.config_validation as cv | import esphome.config_validation as cv | ||||||
| from esphome.components import sensor | from esphome.components import sensor, time | ||||||
| from esphome.const import ( | from esphome.const import ( | ||||||
|  |     CONF_TIME_ID, | ||||||
|  |     DEVICE_CLASS_TIMESTAMP, | ||||||
|     ENTITY_CATEGORY_DIAGNOSTIC, |     ENTITY_CATEGORY_DIAGNOSTIC, | ||||||
|     STATE_CLASS_TOTAL_INCREASING, |     STATE_CLASS_TOTAL_INCREASING, | ||||||
|     UNIT_SECOND, |     UNIT_SECOND, | ||||||
| @@ -10,19 +12,50 @@ from esphome.const import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| uptime_ns = cg.esphome_ns.namespace("uptime") | uptime_ns = cg.esphome_ns.namespace("uptime") | ||||||
| UptimeSensor = uptime_ns.class_("UptimeSensor", sensor.Sensor, cg.PollingComponent) | UptimeSecondsSensor = uptime_ns.class_( | ||||||
|  |     "UptimeSecondsSensor", sensor.Sensor, cg.PollingComponent | ||||||
|  | ) | ||||||
|  | UptimeTimestampSensor = uptime_ns.class_( | ||||||
|  |     "UptimeTimestampSensor", sensor.Sensor, cg.Component | ||||||
|  | ) | ||||||
|  |  | ||||||
| CONFIG_SCHEMA = sensor.sensor_schema( |  | ||||||
|     UptimeSensor, | CONFIG_SCHEMA = cv.typed_schema( | ||||||
|     unit_of_measurement=UNIT_SECOND, |     { | ||||||
|     icon=ICON_TIMER, |         "seconds": sensor.sensor_schema( | ||||||
|     accuracy_decimals=0, |             UptimeSecondsSensor, | ||||||
|     state_class=STATE_CLASS_TOTAL_INCREASING, |             unit_of_measurement=UNIT_SECOND, | ||||||
|     device_class=DEVICE_CLASS_DURATION, |             icon=ICON_TIMER, | ||||||
|     entity_category=ENTITY_CATEGORY_DIAGNOSTIC, |             accuracy_decimals=0, | ||||||
| ).extend(cv.polling_component_schema("60s")) |             state_class=STATE_CLASS_TOTAL_INCREASING, | ||||||
|  |             device_class=DEVICE_CLASS_DURATION, | ||||||
|  |             entity_category=ENTITY_CATEGORY_DIAGNOSTIC, | ||||||
|  |         ).extend(cv.polling_component_schema("60s")), | ||||||
|  |         "timestamp": sensor.sensor_schema( | ||||||
|  |             UptimeTimestampSensor, | ||||||
|  |             icon=ICON_TIMER, | ||||||
|  |             accuracy_decimals=0, | ||||||
|  |             device_class=DEVICE_CLASS_TIMESTAMP, | ||||||
|  |             entity_category=ENTITY_CATEGORY_DIAGNOSTIC, | ||||||
|  |         ) | ||||||
|  |         .extend( | ||||||
|  |             cv.Schema( | ||||||
|  |                 { | ||||||
|  |                     cv.GenerateID(CONF_TIME_ID): cv.All( | ||||||
|  |                         cv.requires_component("time"), cv.use_id(time.RealTimeClock) | ||||||
|  |                     ), | ||||||
|  |                 } | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |         .extend(cv.COMPONENT_SCHEMA), | ||||||
|  |     }, | ||||||
|  |     default_type="seconds", | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| async def to_code(config): | async def to_code(config): | ||||||
|     var = await sensor.new_sensor(config) |     var = await sensor.new_sensor(config) | ||||||
|     await cg.register_component(var, config) |     await cg.register_component(var, config) | ||||||
|  |     if time_id_config := config.get(CONF_TIME_ID): | ||||||
|  |         time_id = await cg.get_variable(time_id_config) | ||||||
|  |         cg.add(var.set_time(time_id)) | ||||||
|   | |||||||
| @@ -1,14 +1,15 @@ | |||||||
| #include "uptime_sensor.h" | #include "uptime_seconds_sensor.h" | ||||||
| #include "esphome/core/log.h" | 
 | ||||||
| #include "esphome/core/helpers.h" |  | ||||||
| #include "esphome/core/hal.h" | #include "esphome/core/hal.h" | ||||||
|  | #include "esphome/core/helpers.h" | ||||||
|  | #include "esphome/core/log.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace uptime { | namespace uptime { | ||||||
| 
 | 
 | ||||||
| static const char *const TAG = "uptime.sensor"; | static const char *const TAG = "uptime.sensor"; | ||||||
| 
 | 
 | ||||||
| void UptimeSensor::update() { | void UptimeSecondsSensor::update() { | ||||||
|   const uint32_t ms = millis(); |   const uint32_t ms = millis(); | ||||||
|   const uint64_t ms_mask = (1ULL << 32) - 1ULL; |   const uint64_t ms_mask = (1ULL << 32) - 1ULL; | ||||||
|   const uint32_t last_ms = this->uptime_ & ms_mask; |   const uint32_t last_ms = this->uptime_ & ms_mask; | ||||||
| @@ -26,9 +27,12 @@ void UptimeSensor::update() { | |||||||
|   const float seconds = float(seconds_int) + (this->uptime_ % 1000ULL) / 1000.0f; |   const float seconds = float(seconds_int) + (this->uptime_ % 1000ULL) / 1000.0f; | ||||||
|   this->publish_state(seconds); |   this->publish_state(seconds); | ||||||
| } | } | ||||||
| std::string UptimeSensor::unique_id() { return get_mac_address() + "-uptime"; } | std::string UptimeSecondsSensor::unique_id() { return get_mac_address() + "-uptime"; } | ||||||
| float UptimeSensor::get_setup_priority() const { return setup_priority::HARDWARE; } | float UptimeSecondsSensor::get_setup_priority() const { return setup_priority::HARDWARE; } | ||||||
| void UptimeSensor::dump_config() { LOG_SENSOR("", "Uptime Sensor", this); } | void UptimeSecondsSensor::dump_config() { | ||||||
|  |   LOG_SENSOR("", "Uptime Sensor", this); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  Type: Seconds"); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| }  // namespace uptime
 | }  // namespace uptime
 | ||||||
| }  // namespace esphome
 | }  // namespace esphome
 | ||||||
| @@ -1,12 +1,12 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "esphome/core/component.h" |  | ||||||
| #include "esphome/components/sensor/sensor.h" | #include "esphome/components/sensor/sensor.h" | ||||||
|  | #include "esphome/core/component.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace uptime { | namespace uptime { | ||||||
| 
 | 
 | ||||||
| class UptimeSensor : public sensor::Sensor, public PollingComponent { | class UptimeSecondsSensor : public sensor::Sensor, public PollingComponent { | ||||||
|  public: |  public: | ||||||
|   void update() override; |   void update() override; | ||||||
|   void dump_config() override; |   void dump_config() override; | ||||||
							
								
								
									
										39
									
								
								esphome/components/uptime/uptime_timestamp_sensor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								esphome/components/uptime/uptime_timestamp_sensor.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | #include "uptime_timestamp_sensor.h" | ||||||
|  |  | ||||||
|  | #ifdef USE_TIME | ||||||
|  |  | ||||||
|  | #include "esphome/core/hal.h" | ||||||
|  | #include "esphome/core/helpers.h" | ||||||
|  | #include "esphome/core/log.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace uptime { | ||||||
|  |  | ||||||
|  | static const char *const TAG = "uptime.sensor"; | ||||||
|  |  | ||||||
|  | void UptimeTimestampSensor::setup() { | ||||||
|  |   this->time_->add_on_time_sync_callback([this]() { | ||||||
|  |     if (this->has_state_) | ||||||
|  |       return;  // No need to update the timestamp if it's already set | ||||||
|  |  | ||||||
|  |     auto now = this->time_->now(); | ||||||
|  |     const uint32_t ms = millis(); | ||||||
|  |     if (!now.is_valid()) | ||||||
|  |       return;  // No need to update the timestamp if the time is not valid | ||||||
|  |  | ||||||
|  |     time_t timestamp = now.timestamp; | ||||||
|  |     uint32_t seconds = ms / 1000; | ||||||
|  |     timestamp -= seconds; | ||||||
|  |     this->publish_state(timestamp); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  | float UptimeTimestampSensor::get_setup_priority() const { return setup_priority::HARDWARE; } | ||||||
|  | void UptimeTimestampSensor::dump_config() { | ||||||
|  |   LOG_SENSOR("", "Uptime Sensor", this); | ||||||
|  |   ESP_LOGCONFIG(TAG, "  Type: Timestamp"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | }  // namespace uptime | ||||||
|  | }  // namespace esphome | ||||||
|  |  | ||||||
|  | #endif  // USE_TIME | ||||||
							
								
								
									
										30
									
								
								esphome/components/uptime/uptime_timestamp_sensor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								esphome/components/uptime/uptime_timestamp_sensor.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "esphome/core/defines.h" | ||||||
|  |  | ||||||
|  | #ifdef USE_TIME | ||||||
|  |  | ||||||
|  | #include "esphome/components/sensor/sensor.h" | ||||||
|  | #include "esphome/components/time/real_time_clock.h" | ||||||
|  | #include "esphome/core/component.h" | ||||||
|  |  | ||||||
|  | namespace esphome { | ||||||
|  | namespace uptime { | ||||||
|  |  | ||||||
|  | class UptimeTimestampSensor : public sensor::Sensor, public Component { | ||||||
|  |  public: | ||||||
|  |   void setup() override; | ||||||
|  |   void dump_config() override; | ||||||
|  |  | ||||||
|  |   float get_setup_priority() const override; | ||||||
|  |  | ||||||
|  |   void set_time(time::RealTimeClock *time) { this->time_ = time; } | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   time::RealTimeClock *time_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | }  // namespace uptime | ||||||
|  | }  // namespace esphome | ||||||
|  |  | ||||||
|  | #endif  // USE_TIME | ||||||
| @@ -1,3 +1,15 @@ | |||||||
|  | wifi: | ||||||
|  |   ap: | ||||||
|  |  | ||||||
|  | time: | ||||||
|  |   - platform: sntp | ||||||
|  |  | ||||||
| sensor: | sensor: | ||||||
|   - platform: uptime |   - platform: uptime | ||||||
|     name: Uptime Sensor |     name: Uptime Sensor | ||||||
|  |   - platform: uptime | ||||||
|  |     name: Uptime Sensor Seconds | ||||||
|  |     type: seconds | ||||||
|  |   - platform: uptime | ||||||
|  |     name: Uptime Sensor Timestamp | ||||||
|  |     type: timestamp | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user