mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 05:24:53 +01:00
parent
0281914507
commit
83fa51a580
8 changed files with 158 additions and 0 deletions
23
esphome/components/gps/__init__.py
Normal file
23
esphome/components/gps/__init__.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import esphome.codegen as cg
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
from esphome.components import uart
|
||||||
|
from esphome.const import CONF_ID
|
||||||
|
|
||||||
|
DEPENDENCIES = ['uart']
|
||||||
|
|
||||||
|
gps_ns = cg.esphome_ns.namespace('gps')
|
||||||
|
GPS = gps_ns.class_('GPS', cg.Component, uart.UARTDevice)
|
||||||
|
GPSListener = gps_ns.class_('GPSListener')
|
||||||
|
|
||||||
|
CONF_GPS_ID = 'gps_id'
|
||||||
|
MULTI_CONF = True
|
||||||
|
CONFIG_SCHEMA = cv.Schema({
|
||||||
|
cv.GenerateID(): cv.declare_id(GPS),
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA).extend(uart.UART_DEVICE_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
|
yield cg.register_component(var, config)
|
||||||
|
yield uart.register_uart_device(var, config)
|
||||||
|
cg.add_library('TinyGPSPlus', '1.0.2')
|
12
esphome/components/gps/gps.cpp
Normal file
12
esphome/components/gps/gps.cpp
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#include "gps.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace gps {
|
||||||
|
|
||||||
|
static const char *TAG = "gps";
|
||||||
|
|
||||||
|
TinyGPSPlus &GPSListener::get_tiny_gps() { return this->parent_->get_tiny_gps(); }
|
||||||
|
|
||||||
|
} // namespace gps
|
||||||
|
} // namespace esphome
|
47
esphome/components/gps/gps.h
Normal file
47
esphome/components/gps/gps.h
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "esphome/core/component.h"
|
||||||
|
#include "esphome/components/uart/uart.h"
|
||||||
|
#include <TinyGPS++.h>
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace gps {
|
||||||
|
|
||||||
|
class GPS;
|
||||||
|
|
||||||
|
class GPSListener {
|
||||||
|
public:
|
||||||
|
virtual void on_update(TinyGPSPlus &tiny_gps) = 0;
|
||||||
|
TinyGPSPlus &get_tiny_gps();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
friend GPS;
|
||||||
|
|
||||||
|
GPS *parent_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GPS : public Component, public uart::UARTDevice {
|
||||||
|
public:
|
||||||
|
void register_listener(GPSListener *listener) {
|
||||||
|
listener->parent_ = this;
|
||||||
|
this->listeners_.push_back(listener);
|
||||||
|
}
|
||||||
|
float get_setup_priority() const override { return setup_priority::HARDWARE; }
|
||||||
|
void loop() override {
|
||||||
|
while (this->available() && !this->has_time_) {
|
||||||
|
if (this->tiny_gps_.encode(this->read())) {
|
||||||
|
for (auto *listener : this->listeners_)
|
||||||
|
listener->on_update(this->tiny_gps_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TinyGPSPlus &get_tiny_gps() { return this->tiny_gps_; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool has_time_{false};
|
||||||
|
TinyGPSPlus tiny_gps_;
|
||||||
|
std::vector<GPSListener *> listeners_{};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace gps
|
||||||
|
} // namespace esphome
|
23
esphome/components/gps/time/__init__.py
Normal file
23
esphome/components/gps/time/__init__.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
from esphome.components import time as time_
|
||||||
|
import esphome.config_validation as cv
|
||||||
|
import esphome.codegen as cg
|
||||||
|
from esphome.const import CONF_ID
|
||||||
|
from .. import gps_ns, GPSListener, CONF_GPS_ID, GPS
|
||||||
|
|
||||||
|
DEPENDENCIES = ['gps']
|
||||||
|
|
||||||
|
GPSTime = gps_ns.class_('GPSTime', time_.RealTimeClock, GPSListener)
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = time_.TIME_SCHEMA.extend({
|
||||||
|
cv.GenerateID(): cv.declare_id(GPSTime),
|
||||||
|
cv.GenerateID(CONF_GPS_ID): cv.use_id(GPS),
|
||||||
|
}).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
|
||||||
|
def to_code(config):
|
||||||
|
var = cg.new_Pvariable(config[CONF_ID])
|
||||||
|
yield time_.register_time(var, config)
|
||||||
|
yield cg.register_component(var, config)
|
||||||
|
|
||||||
|
paren = yield cg.get_variable(config[CONF_GPS_ID])
|
||||||
|
cg.add(paren.register_listener(var))
|
10
esphome/components/gps/time/gps_time.cpp
Normal file
10
esphome/components/gps/time/gps_time.cpp
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#include "gps_time.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace gps {
|
||||||
|
|
||||||
|
static const char *TAG = "gps.time";
|
||||||
|
|
||||||
|
} // namespace gps
|
||||||
|
} // namespace esphome
|
39
esphome/components/gps/time/gps_time.h
Normal file
39
esphome/components/gps/time/gps_time.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "esphome/core/component.h"
|
||||||
|
#include "esphome/components/time/real_time_clock.h"
|
||||||
|
#include "esphome/components/gps/gps.h"
|
||||||
|
|
||||||
|
namespace esphome {
|
||||||
|
namespace gps {
|
||||||
|
|
||||||
|
class GPSTime : public time::RealTimeClock, public GPSListener {
|
||||||
|
public:
|
||||||
|
void on_update(TinyGPSPlus &tiny_gps) override {
|
||||||
|
if (!this->has_time_)
|
||||||
|
this->from_tiny_gps_(tiny_gps);
|
||||||
|
}
|
||||||
|
void setup() override {
|
||||||
|
this->set_interval(5 * 60 * 1000, [this]() { this->from_tiny_gps_(this->get_tiny_gps()); });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void from_tiny_gps_(TinyGPSPlus &tiny_gps) {
|
||||||
|
if (!tiny_gps.time.isValid() || !tiny_gps.date.isValid())
|
||||||
|
return;
|
||||||
|
time::ESPTime val{};
|
||||||
|
val.year = tiny_gps.date.year();
|
||||||
|
val.month = tiny_gps.date.month();
|
||||||
|
val.day_of_month = tiny_gps.date.day();
|
||||||
|
val.hour = tiny_gps.time.hour();
|
||||||
|
val.minute = tiny_gps.time.minute();
|
||||||
|
val.second = tiny_gps.time.second();
|
||||||
|
val.recalc_timestamp_utc(false);
|
||||||
|
this->synchronize_epoch_(val.timestamp);
|
||||||
|
this->has_time_ = true;
|
||||||
|
}
|
||||||
|
bool has_time_{false};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace gps
|
||||||
|
} // namespace esphome
|
|
@ -17,6 +17,7 @@ lib_deps =
|
||||||
FastLED@3.2.0
|
FastLED@3.2.0
|
||||||
NeoPixelBus@2.4.1
|
NeoPixelBus@2.4.1
|
||||||
ESPAsyncTCP@1.2.0
|
ESPAsyncTCP@1.2.0
|
||||||
|
TinyGPSPlus@1.0.2
|
||||||
build_flags =
|
build_flags =
|
||||||
-Wno-reorder
|
-Wno-reorder
|
||||||
-DUSE_WEB_SERVER
|
-DUSE_WEB_SERVER
|
||||||
|
|
|
@ -1146,6 +1146,8 @@ pn532:
|
||||||
|
|
||||||
rdm6300:
|
rdm6300:
|
||||||
|
|
||||||
|
gps:
|
||||||
|
|
||||||
time:
|
time:
|
||||||
- platform: sntp
|
- platform: sntp
|
||||||
id: sntp_time
|
id: sntp_time
|
||||||
|
@ -1157,6 +1159,7 @@ time:
|
||||||
cron: '/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI'
|
cron: '/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI'
|
||||||
then:
|
then:
|
||||||
- lambda: 'ESP_LOGD("main", "time");'
|
- lambda: 'ESP_LOGD("main", "time");'
|
||||||
|
- platform: gps
|
||||||
|
|
||||||
cover:
|
cover:
|
||||||
- platform: template
|
- platform: template
|
||||||
|
|
Loading…
Reference in a new issue