mirror of
https://github.com/nekorevend/esphome-emporia-vue-utility.git
synced 2026-01-10 05:10:40 -07:00
Use the update() function to send meter requests.
This commit is contained in:
@@ -16,28 +16,32 @@ void EmporiaVueUtility::setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EmporiaVueUtility::update() {
|
void EmporiaVueUtility::update() {
|
||||||
// TODO: Use this to return value updates.
|
if (ready_to_read_meter_) {
|
||||||
|
send_meter_request();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmporiaVueUtility::loop() {
|
void EmporiaVueUtility::loop() {
|
||||||
static time_t next_meter_request;
|
static const time_t delayed_start_time =
|
||||||
static time_t next_meter_join;
|
::time(nullptr) + INITIAL_STARTUP_DELAY;
|
||||||
|
static time_t next_expected_meter_request = 0;
|
||||||
|
static time_t next_meter_join = delayed_start_time + METER_REJOIN_INTERVAL;
|
||||||
static time_t next_version_request = 0;
|
static time_t next_version_request = 0;
|
||||||
static uint8_t startup_step;
|
static uint8_t startup_step = 0;
|
||||||
char msg_type = 0;
|
char msg_type = 0;
|
||||||
size_t msg_len = 0;
|
size_t msg_len = 0;
|
||||||
byte inb;
|
|
||||||
|
|
||||||
msg_len = read_msg();
|
msg_len = read_msg();
|
||||||
now = ::time(&now);
|
now = ::time(nullptr);
|
||||||
|
|
||||||
/* sanity checks! */
|
/* sanity checks! */
|
||||||
if (next_meter_request >
|
if (next_expected_meter_request >
|
||||||
now + (INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL)) {
|
now + (INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL)) {
|
||||||
ESP_LOGD(TAG, "Time jumped back (%lld > %lld + %lld); resetting",
|
ESP_LOGD(TAG, "Time jumped back (%lld > %lld + %lld); resetting",
|
||||||
(long long)next_meter_request, (long long)now,
|
(long long)next_expected_meter_request, (long long)now,
|
||||||
(long long)(INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL));
|
(long long)(INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL));
|
||||||
next_meter_request = next_meter_join = 0;
|
next_meter_join = 0;
|
||||||
|
next_expected_meter_request = now + update_interval_;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg_len != 0) {
|
if (msg_len != 0) {
|
||||||
@@ -76,7 +80,6 @@ void EmporiaVueUtility::loop() {
|
|||||||
if (startup_step == 0) {
|
if (startup_step == 0) {
|
||||||
startup_step++;
|
startup_step++;
|
||||||
send_mac_req();
|
send_mac_req();
|
||||||
next_meter_request = now + update_interval_;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -86,7 +89,6 @@ void EmporiaVueUtility::loop() {
|
|||||||
if (startup_step == 1) {
|
if (startup_step == 1) {
|
||||||
startup_step++;
|
startup_step++;
|
||||||
send_install_code_req();
|
send_install_code_req();
|
||||||
next_meter_request = now + update_interval_;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -95,8 +97,6 @@ void EmporiaVueUtility::loop() {
|
|||||||
led_wifi(true);
|
led_wifi(true);
|
||||||
if (startup_step == 2) {
|
if (startup_step == 2) {
|
||||||
startup_step++;
|
startup_step++;
|
||||||
send_meter_request();
|
|
||||||
next_meter_request = now + update_interval_;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -116,21 +116,13 @@ void EmporiaVueUtility::loop() {
|
|||||||
if (mgm_firmware_ver < 1 && now >= next_version_request) {
|
if (mgm_firmware_ver < 1 && now >= next_version_request) {
|
||||||
// Something's wrong, do the startup sequence again.
|
// Something's wrong, do the startup sequence again.
|
||||||
startup_step = 0;
|
startup_step = 0;
|
||||||
|
ready_to_read_meter_ = false;
|
||||||
send_version_req();
|
send_version_req();
|
||||||
next_version_request = now + 1; // Wait a second.
|
// Throttle this just in case.
|
||||||
|
next_version_request = now + MGM_FIRMWARE_REQUEST_INTERVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (now >= next_meter_request) {
|
if (now >= delayed_start_time) {
|
||||||
// Handle initial startup delay
|
|
||||||
if (next_meter_request == 0) {
|
|
||||||
next_meter_request = now + INITIAL_STARTUP_DELAY;
|
|
||||||
next_meter_join = next_meter_request + METER_REJOIN_INTERVAL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schedule the next MGM message
|
|
||||||
next_meter_request = now + update_interval_;
|
|
||||||
|
|
||||||
if (now > next_meter_join) {
|
if (now > next_meter_join) {
|
||||||
startup_step = 9; // Cancel startup messages
|
startup_step = 9; // Cancel startup messages
|
||||||
send_meter_join();
|
send_meter_join();
|
||||||
@@ -147,7 +139,8 @@ void EmporiaVueUtility::loop() {
|
|||||||
else if (startup_step == 3)
|
else if (startup_step == 3)
|
||||||
send_meter_join();
|
send_meter_join();
|
||||||
else
|
else
|
||||||
send_meter_request();
|
ready_to_read_meter_ = true;
|
||||||
|
next_expected_meter_request = now + update_interval_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,9 @@
|
|||||||
// been returning readings
|
// been returning readings
|
||||||
#define METER_REJOIN_INTERVAL 30
|
#define METER_REJOIN_INTERVAL 30
|
||||||
|
|
||||||
|
// How often to attempt to re-request the MGM firmware version.
|
||||||
|
#define MGM_FIRMWARE_REQUEST_INTERVAL 3
|
||||||
|
|
||||||
// On first startup, how long before trying to start to talk to meter
|
// On first startup, how long before trying to start to talk to meter
|
||||||
#define INITIAL_STARTUP_DELAY 10
|
#define INITIAL_STARTUP_DELAY 10
|
||||||
|
|
||||||
@@ -732,6 +735,7 @@ class EmporiaVueUtility : public PollingComponent, public uart::UARTDevice {
|
|||||||
sensor::Sensor *energy_sensor_{nullptr};
|
sensor::Sensor *energy_sensor_{nullptr};
|
||||||
sensor::Sensor *energy_export_sensor_{nullptr};
|
sensor::Sensor *energy_export_sensor_{nullptr};
|
||||||
sensor::Sensor *energy_import_sensor_{nullptr};
|
sensor::Sensor *energy_import_sensor_{nullptr};
|
||||||
|
bool ready_to_read_meter_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace emporia_vue_utility
|
} // namespace emporia_vue_utility
|
||||||
|
|||||||
Reference in New Issue
Block a user