mirror of
https://github.com/nekorevend/esphome-emporia-vue-utility.git
synced 2026-01-08 20:40:39 -07:00
Formatted.
This commit is contained in:
@@ -1,154 +1,160 @@
|
||||
#include "esphome/core/log.h"
|
||||
#include "emporia_vue_utility.h"
|
||||
|
||||
#include "esphome/core/log.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace emporia_vue_utility {
|
||||
|
||||
void EmporiaVueUtility::setup() {
|
||||
#if USE_LED_PINS
|
||||
pinMode(LED_PIN_LINK, OUTPUT);
|
||||
pinMode(LED_PIN_WIFI, OUTPUT);
|
||||
pinMode(LED_PIN_LINK, OUTPUT);
|
||||
pinMode(LED_PIN_WIFI, OUTPUT);
|
||||
#endif
|
||||
led_link(false);
|
||||
led_wifi(false);
|
||||
clear_serial_input();
|
||||
led_link(false);
|
||||
led_wifi(false);
|
||||
clear_serial_input();
|
||||
}
|
||||
|
||||
void EmporiaVueUtility::update() {
|
||||
// This seems to be called incessantly instead of at the set update interval...
|
||||
// ESP_LOGD(TAG, "Got update call with an instructed interval of %d sec", this->update_interval_);
|
||||
// This seems to be called incessantly instead of at the set update
|
||||
// interval... ESP_LOGD(TAG, "Got update call with an instructed interval of
|
||||
// %d sec", this->update_interval_);
|
||||
}
|
||||
|
||||
void EmporiaVueUtility::loop() {
|
||||
static time_t next_meter_request;
|
||||
static time_t next_meter_join;
|
||||
static time_t next_version_request = 0;
|
||||
static uint8_t startup_step;
|
||||
char msg_type = 0;
|
||||
size_t msg_len = 0;
|
||||
byte inb;
|
||||
static time_t next_meter_request;
|
||||
static time_t next_meter_join;
|
||||
static time_t next_version_request = 0;
|
||||
static uint8_t startup_step;
|
||||
char msg_type = 0;
|
||||
size_t msg_len = 0;
|
||||
byte inb;
|
||||
|
||||
msg_len = read_msg();
|
||||
now = ::time(&now);
|
||||
msg_len = read_msg();
|
||||
now = ::time(&now);
|
||||
|
||||
/* sanity checks! */
|
||||
if (next_meter_request >
|
||||
now + (INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL)) {
|
||||
ESP_LOGD(TAG,
|
||||
"Time jumped back (%lld > %lld + %lld); resetting",
|
||||
(long long) next_meter_request,
|
||||
(long long) now,
|
||||
(long long) (INITIAL_STARTUP_DELAY +
|
||||
METER_REJOIN_INTERVAL));
|
||||
next_meter_request = next_meter_join = 0;
|
||||
}
|
||||
/* sanity checks! */
|
||||
if (next_meter_request >
|
||||
now + (INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL)) {
|
||||
ESP_LOGD(TAG, "Time jumped back (%lld > %lld + %lld); resetting",
|
||||
(long long)next_meter_request, (long long)now,
|
||||
(long long)(INITIAL_STARTUP_DELAY + METER_REJOIN_INTERVAL));
|
||||
next_meter_request = next_meter_join = 0;
|
||||
}
|
||||
|
||||
if (msg_len != 0) {
|
||||
msg_type = input_buffer.data[2];
|
||||
if (msg_len != 0) {
|
||||
msg_type = input_buffer.data[2];
|
||||
|
||||
switch (msg_type) {
|
||||
case 'r': // Meter reading
|
||||
led_link(true);
|
||||
if (now < last_meter_reading + int(update_interval_ / 4)) {
|
||||
// Sometimes a duplicate message is sent in quick succession.
|
||||
// Ignoring the duplicate.
|
||||
ESP_LOGD(TAG, "Got extra message %ds after the previous message.", now - last_meter_reading);
|
||||
break;
|
||||
}
|
||||
last_reading_has_error = 0;
|
||||
handle_resp_meter_reading();
|
||||
if (last_reading_has_error) {
|
||||
ask_for_bug_report();
|
||||
} else {
|
||||
last_meter_reading = now;
|
||||
next_meter_join = now + METER_REJOIN_INTERVAL;
|
||||
}
|
||||
break;
|
||||
case 'j': // Meter join
|
||||
handle_resp_meter_join();
|
||||
led_wifi(true);
|
||||
if (startup_step == 3) {
|
||||
send_meter_request();
|
||||
startup_step++;
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
if (!handle_resp_firmware_ver()) {
|
||||
led_wifi(true);
|
||||
if (startup_step == 0) {
|
||||
startup_step++;
|
||||
send_mac_req();
|
||||
next_meter_request = now + update_interval_;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'm': // Mac address
|
||||
if (!handle_resp_mac_address()) {
|
||||
led_wifi(true);
|
||||
if (startup_step == 1) {
|
||||
startup_step++;
|
||||
send_install_code_req();
|
||||
next_meter_request = now + update_interval_;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'i':
|
||||
if (!handle_resp_install_code()) {
|
||||
led_wifi(true);
|
||||
if (startup_step == 2) {
|
||||
startup_step++;
|
||||
send_meter_request();
|
||||
next_meter_request = now + update_interval_;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'e':
|
||||
// Unknown response type, but we can ignore.
|
||||
ESP_LOGI(TAG, "Got 'e'-type message with value: %d", input_buffer.data[4]);
|
||||
break;
|
||||
default:
|
||||
ESP_LOGE(TAG, "Unhandled response type '%c'", msg_type);
|
||||
ESP_LOG_BUFFER_HEXDUMP(TAG, input_buffer.data, msg_len, ESP_LOG_ERROR);
|
||||
break;
|
||||
switch (msg_type) {
|
||||
case 'r': // Meter reading
|
||||
led_link(true);
|
||||
if (now < last_meter_reading + int(update_interval_ / 4)) {
|
||||
// Sometimes a duplicate message is sent in quick succession.
|
||||
// Ignoring the duplicate.
|
||||
ESP_LOGD(TAG, "Got extra message %ds after the previous message.",
|
||||
now - last_meter_reading);
|
||||
break;
|
||||
}
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
if (mgm_firmware_ver < 1 && now >= next_version_request) {
|
||||
// Something's wrong, do the startup sequence again.
|
||||
startup_step = 0;
|
||||
send_version_req();
|
||||
next_version_request = now + 1; // Wait a second.
|
||||
}
|
||||
|
||||
if (now >= next_meter_request) {
|
||||
// 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;
|
||||
last_reading_has_error = 0;
|
||||
handle_resp_meter_reading();
|
||||
if (last_reading_has_error) {
|
||||
ask_for_bug_report();
|
||||
} else {
|
||||
last_meter_reading = now;
|
||||
next_meter_join = now + METER_REJOIN_INTERVAL;
|
||||
}
|
||||
|
||||
// Schedule the next MGM message
|
||||
next_meter_request = now + update_interval_;
|
||||
|
||||
if (now > next_meter_join) {
|
||||
startup_step = 9; // Cancel startup messages
|
||||
send_meter_join();
|
||||
next_meter_join = now + METER_REJOIN_INTERVAL;
|
||||
return;
|
||||
break;
|
||||
case 'j': // Meter join
|
||||
handle_resp_meter_join();
|
||||
led_wifi(true);
|
||||
if (startup_step == 3) {
|
||||
send_meter_request();
|
||||
startup_step++;
|
||||
}
|
||||
|
||||
if (startup_step == 0) send_version_req();
|
||||
else if (startup_step == 1) send_mac_req();
|
||||
else if (startup_step == 2) send_install_code_req();
|
||||
else if (startup_step == 3) send_meter_join();
|
||||
else send_meter_request();
|
||||
break;
|
||||
case 'f':
|
||||
if (!handle_resp_firmware_ver()) {
|
||||
led_wifi(true);
|
||||
if (startup_step == 0) {
|
||||
startup_step++;
|
||||
send_mac_req();
|
||||
next_meter_request = now + update_interval_;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'm': // Mac address
|
||||
if (!handle_resp_mac_address()) {
|
||||
led_wifi(true);
|
||||
if (startup_step == 1) {
|
||||
startup_step++;
|
||||
send_install_code_req();
|
||||
next_meter_request = now + update_interval_;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'i':
|
||||
if (!handle_resp_install_code()) {
|
||||
led_wifi(true);
|
||||
if (startup_step == 2) {
|
||||
startup_step++;
|
||||
send_meter_request();
|
||||
next_meter_request = now + update_interval_;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'e':
|
||||
// Unknown response type, but we can ignore.
|
||||
ESP_LOGI(TAG, "Got 'e'-type message with value: %d",
|
||||
input_buffer.data[4]);
|
||||
break;
|
||||
default:
|
||||
ESP_LOGE(TAG, "Unhandled response type '%c'", msg_type);
|
||||
ESP_LOG_BUFFER_HEXDUMP(TAG, input_buffer.data, msg_len, ESP_LOG_ERROR);
|
||||
break;
|
||||
}
|
||||
pos = 0;
|
||||
}
|
||||
|
||||
if (mgm_firmware_ver < 1 && now >= next_version_request) {
|
||||
// Something's wrong, do the startup sequence again.
|
||||
startup_step = 0;
|
||||
send_version_req();
|
||||
next_version_request = now + 1; // Wait a second.
|
||||
}
|
||||
|
||||
if (now >= next_meter_request) {
|
||||
// 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) {
|
||||
startup_step = 9; // Cancel startup messages
|
||||
send_meter_join();
|
||||
next_meter_join = now + METER_REJOIN_INTERVAL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (startup_step == 0)
|
||||
send_version_req();
|
||||
else if (startup_step == 1)
|
||||
send_mac_req();
|
||||
else if (startup_step == 2)
|
||||
send_install_code_req();
|
||||
else if (startup_step == 3)
|
||||
send_meter_join();
|
||||
else
|
||||
send_meter_request();
|
||||
}
|
||||
}
|
||||
|
||||
void EmporiaVueUtility::dump_config() {
|
||||
ESP_LOGCONFIG(TAG, "Emporia Vue Utility config dump WIP");
|
||||
ESP_LOGCONFIG(TAG, "Emporia Vue Utility config dump WIP");
|
||||
}
|
||||
} // namespace emporia_vue_utility
|
||||
} // namespace esphome
|
||||
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@ from esphome.const import (
|
||||
DEVICE_CLASS_POWER,
|
||||
DEVICE_CLASS_ENERGY,
|
||||
STATE_CLASS_MEASUREMENT,
|
||||
STATE_CLASS_TOTAL_INCREASING
|
||||
STATE_CLASS_TOTAL_INCREASING,
|
||||
)
|
||||
|
||||
DEPENDENCIES = ["uart"]
|
||||
@@ -29,8 +29,10 @@ ENERGY_SENSOR_TYPES = {
|
||||
|
||||
ALL_SENSOR_TYPES = {**POWER_SENSOR_TYPES, **ENERGY_SENSOR_TYPES}
|
||||
|
||||
emporia_vue_utility_ns = cg.esphome_ns.namespace('emporia_vue_utility')
|
||||
EmporiaVueUtility = emporia_vue_utility_ns.class_('EmporiaVueUtility', cg.PollingComponent, uart.UARTDevice)
|
||||
emporia_vue_utility_ns = cg.esphome_ns.namespace("emporia_vue_utility")
|
||||
EmporiaVueUtility = emporia_vue_utility_ns.class_(
|
||||
"EmporiaVueUtility", cg.PollingComponent, uart.UARTDevice
|
||||
)
|
||||
|
||||
CONFIG_SCHEMA = cv.All(
|
||||
cv.Schema(
|
||||
@@ -53,13 +55,14 @@ CONFIG_SCHEMA = cv.All(
|
||||
accuracy_decimals=0,
|
||||
)
|
||||
for name in ENERGY_SENSOR_TYPES
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
.extend(cv.polling_component_schema('30s'))
|
||||
.extend(cv.polling_component_schema("30s"))
|
||||
.extend(uart.UART_DEVICE_SCHEMA)
|
||||
)
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
var = cg.new_Pvariable(config[CONF_ID])
|
||||
await cg.register_component(var, config)
|
||||
@@ -68,4 +71,4 @@ async def to_code(config):
|
||||
for key, funcName in ALL_SENSOR_TYPES.items():
|
||||
if key in config:
|
||||
sens = await sensor.new_sensor(config[key])
|
||||
cg.add(getattr(var, funcName)(sens))
|
||||
cg.add(getattr(var, funcName)(sens))
|
||||
|
||||
Reference in New Issue
Block a user