mirror of
https://github.com/esphome/esphome.git
synced 2025-07-28 22:26:36 +00:00
[gps] Add hdop sensor (#8680)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
bc0956019b
commit
0ccc5bf714
@ -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_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user