mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	[gps] Add hdop sensor (#8680)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
		| @@ -25,6 +25,7 @@ GPS = gps_ns.class_("GPS", cg.Component, uart.UARTDevice) | |||||||
| GPSListener = gps_ns.class_("GPSListener") | GPSListener = gps_ns.class_("GPSListener") | ||||||
|  |  | ||||||
| CONF_GPS_ID = "gps_id" | CONF_GPS_ID = "gps_id" | ||||||
|  | CONF_HDOP = "hdop" | ||||||
| MULTI_CONF = True | MULTI_CONF = True | ||||||
| CONFIG_SCHEMA = cv.All( | CONFIG_SCHEMA = cv.All( | ||||||
|     cv.Schema( |     cv.Schema( | ||||||
| @@ -40,7 +41,7 @@ CONFIG_SCHEMA = cv.All( | |||||||
|             ), |             ), | ||||||
|             cv.Optional(CONF_SPEED): sensor.sensor_schema( |             cv.Optional(CONF_SPEED): sensor.sensor_schema( | ||||||
|                 unit_of_measurement=UNIT_KILOMETER_PER_HOUR, |                 unit_of_measurement=UNIT_KILOMETER_PER_HOUR, | ||||||
|                 accuracy_decimals=6, |                 accuracy_decimals=3, | ||||||
|             ), |             ), | ||||||
|             cv.Optional(CONF_COURSE): sensor.sensor_schema( |             cv.Optional(CONF_COURSE): sensor.sensor_schema( | ||||||
|                 unit_of_measurement=UNIT_DEGREES, |                 unit_of_measurement=UNIT_DEGREES, | ||||||
| @@ -48,12 +49,16 @@ CONFIG_SCHEMA = cv.All( | |||||||
|             ), |             ), | ||||||
|             cv.Optional(CONF_ALTITUDE): sensor.sensor_schema( |             cv.Optional(CONF_ALTITUDE): sensor.sensor_schema( | ||||||
|                 unit_of_measurement=UNIT_METER, |                 unit_of_measurement=UNIT_METER, | ||||||
|                 accuracy_decimals=1, |                 accuracy_decimals=2, | ||||||
|             ), |             ), | ||||||
|             cv.Optional(CONF_SATELLITES): sensor.sensor_schema( |             cv.Optional(CONF_SATELLITES): sensor.sensor_schema( | ||||||
|                 accuracy_decimals=0, |                 accuracy_decimals=0, | ||||||
|                 state_class=STATE_CLASS_MEASUREMENT, |                 state_class=STATE_CLASS_MEASUREMENT, | ||||||
|             ), |             ), | ||||||
|  |             cv.Optional(CONF_HDOP): sensor.sensor_schema( | ||||||
|  |                 accuracy_decimals=3, | ||||||
|  |                 state_class=STATE_CLASS_MEASUREMENT, | ||||||
|  |             ), | ||||||
|         } |         } | ||||||
|     ) |     ) | ||||||
|     .extend(cv.polling_component_schema("20s")) |     .extend(cv.polling_component_schema("20s")) | ||||||
| @@ -92,5 +97,9 @@ async def to_code(config): | |||||||
|         sens = await sensor.new_sensor(config[CONF_SATELLITES]) |         sens = await sensor.new_sensor(config[CONF_SATELLITES]) | ||||||
|         cg.add(var.set_satellites_sensor(sens)) |         cg.add(var.set_satellites_sensor(sens)) | ||||||
|  |  | ||||||
|  |     if hdop_config := config.get(CONF_HDOP): | ||||||
|  |         sens = await sensor.new_sensor(hdop_config) | ||||||
|  |         cg.add(var.set_hdop_sensor(sens)) | ||||||
|  |  | ||||||
|     # https://platformio.org/lib/show/1655/TinyGPSPlus |     # https://platformio.org/lib/show/1655/TinyGPSPlus | ||||||
|     cg.add_library("mikalhart/TinyGPSPlus", "1.0.2") |     cg.add_library("mikalhart/TinyGPSPlus", "1.0.2") | ||||||
|   | |||||||
| @@ -28,6 +28,9 @@ void GPS::update() { | |||||||
|  |  | ||||||
|   if (this->satellites_sensor_ != nullptr) |   if (this->satellites_sensor_ != nullptr) | ||||||
|     this->satellites_sensor_->publish_state(this->satellites_); |     this->satellites_sensor_->publish_state(this->satellites_); | ||||||
|  |  | ||||||
|  |   if (this->hdop_sensor_ != nullptr) | ||||||
|  |     this->hdop_sensor_->publish_state(this->hdop_); | ||||||
| } | } | ||||||
|  |  | ||||||
| void GPS::loop() { | void GPS::loop() { | ||||||
| @@ -44,23 +47,23 @@ void GPS::loop() { | |||||||
|  |  | ||||||
|       if (tiny_gps_.speed.isUpdated()) { |       if (tiny_gps_.speed.isUpdated()) { | ||||||
|         this->speed_ = tiny_gps_.speed.kmph(); |         this->speed_ = tiny_gps_.speed.kmph(); | ||||||
|         ESP_LOGD(TAG, "Speed:"); |         ESP_LOGD(TAG, "Speed: %.3f km/h", this->speed_); | ||||||
|         ESP_LOGD(TAG, "  %f km/h", this->speed_); |  | ||||||
|       } |       } | ||||||
|       if (tiny_gps_.course.isUpdated()) { |       if (tiny_gps_.course.isUpdated()) { | ||||||
|         this->course_ = tiny_gps_.course.deg(); |         this->course_ = tiny_gps_.course.deg(); | ||||||
|         ESP_LOGD(TAG, "Course:"); |         ESP_LOGD(TAG, "Course: %.2f °", this->course_); | ||||||
|         ESP_LOGD(TAG, "  %f °", this->course_); |  | ||||||
|       } |       } | ||||||
|       if (tiny_gps_.altitude.isUpdated()) { |       if (tiny_gps_.altitude.isUpdated()) { | ||||||
|         this->altitude_ = tiny_gps_.altitude.meters(); |         this->altitude_ = tiny_gps_.altitude.meters(); | ||||||
|         ESP_LOGD(TAG, "Altitude:"); |         ESP_LOGD(TAG, "Altitude: %.2f m", this->altitude_); | ||||||
|         ESP_LOGD(TAG, "  %f m", this->altitude_); |  | ||||||
|       } |       } | ||||||
|       if (tiny_gps_.satellites.isUpdated()) { |       if (tiny_gps_.satellites.isUpdated()) { | ||||||
|         this->satellites_ = tiny_gps_.satellites.value(); |         this->satellites_ = tiny_gps_.satellites.value(); | ||||||
|         ESP_LOGD(TAG, "Satellites:"); |         ESP_LOGD(TAG, "Satellites: %d", this->satellites_); | ||||||
|         ESP_LOGD(TAG, "  %d", this->satellites_); |       } | ||||||
|  |       if (tiny_gps_.hdop.isUpdated()) { | ||||||
|  |         this->hdop_ = tiny_gps_.hdop.hdop(); | ||||||
|  |         ESP_LOGD(TAG, "HDOP: %.3f", this->hdop_); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       for (auto *listener : this->listeners_) |       for (auto *listener : this->listeners_) | ||||||
|   | |||||||
| @@ -33,6 +33,7 @@ class GPS : public PollingComponent, public uart::UARTDevice { | |||||||
|   void set_course_sensor(sensor::Sensor *course_sensor) { course_sensor_ = course_sensor; } |   void set_course_sensor(sensor::Sensor *course_sensor) { course_sensor_ = course_sensor; } | ||||||
|   void set_altitude_sensor(sensor::Sensor *altitude_sensor) { altitude_sensor_ = altitude_sensor; } |   void set_altitude_sensor(sensor::Sensor *altitude_sensor) { altitude_sensor_ = altitude_sensor; } | ||||||
|   void set_satellites_sensor(sensor::Sensor *satellites_sensor) { satellites_sensor_ = satellites_sensor; } |   void set_satellites_sensor(sensor::Sensor *satellites_sensor) { satellites_sensor_ = satellites_sensor; } | ||||||
|  |   void set_hdop_sensor(sensor::Sensor *hdop_sensor) { hdop_sensor_ = hdop_sensor; } | ||||||
|  |  | ||||||
|   void register_listener(GPSListener *listener) { |   void register_listener(GPSListener *listener) { | ||||||
|     listener->parent_ = this; |     listener->parent_ = this; | ||||||
| @@ -46,12 +47,13 @@ class GPS : public PollingComponent, public uart::UARTDevice { | |||||||
|   TinyGPSPlus &get_tiny_gps() { return this->tiny_gps_; } |   TinyGPSPlus &get_tiny_gps() { return this->tiny_gps_; } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   float latitude_ = -1; |   float latitude_ = NAN; | ||||||
|   float longitude_ = -1; |   float longitude_ = NAN; | ||||||
|   float speed_ = -1; |   float speed_ = NAN; | ||||||
|   float course_ = -1; |   float course_ = NAN; | ||||||
|   float altitude_ = -1; |   float altitude_ = NAN; | ||||||
|   int satellites_ = -1; |   int satellites_ = 0; | ||||||
|  |   double hdop_ = NAN; | ||||||
|  |  | ||||||
|   sensor::Sensor *latitude_sensor_{nullptr}; |   sensor::Sensor *latitude_sensor_{nullptr}; | ||||||
|   sensor::Sensor *longitude_sensor_{nullptr}; |   sensor::Sensor *longitude_sensor_{nullptr}; | ||||||
| @@ -59,6 +61,7 @@ class GPS : public PollingComponent, public uart::UARTDevice { | |||||||
|   sensor::Sensor *course_sensor_{nullptr}; |   sensor::Sensor *course_sensor_{nullptr}; | ||||||
|   sensor::Sensor *altitude_sensor_{nullptr}; |   sensor::Sensor *altitude_sensor_{nullptr}; | ||||||
|   sensor::Sensor *satellites_sensor_{nullptr}; |   sensor::Sensor *satellites_sensor_{nullptr}; | ||||||
|  |   sensor::Sensor *hdop_sensor_{nullptr}; | ||||||
|  |  | ||||||
|   bool has_time_{false}; |   bool has_time_{false}; | ||||||
|   TinyGPSPlus tiny_gps_; |   TinyGPSPlus tiny_gps_; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user