Add LoRa telemetry, fault counters, and time sync status
This commit is contained in:
@@ -60,6 +60,8 @@ constexpr uint32_t SENDER_OLED_READ_MS = 10000;
|
||||
constexpr uint32_t METER_SAMPLE_INTERVAL_MS = 1000;
|
||||
constexpr uint32_t METER_SEND_INTERVAL_MS = 30000;
|
||||
constexpr uint8_t METER_BATCH_MAX_SAMPLES = 30;
|
||||
constexpr uint32_t WATCHDOG_TIMEOUT_SEC = 120;
|
||||
constexpr bool ENABLE_HA_DISCOVERY = true;
|
||||
|
||||
constexpr uint8_t NUM_SENDERS = 1;
|
||||
inline constexpr uint16_t EXPECTED_SENDER_IDS[NUM_SENDERS] = {
|
||||
|
||||
@@ -2,6 +2,19 @@
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
enum class FaultType : uint8_t {
|
||||
None = 0,
|
||||
MeterRead = 1,
|
||||
Decode = 2,
|
||||
LoraTx = 3
|
||||
};
|
||||
|
||||
struct FaultCounters {
|
||||
uint32_t meter_read_fail;
|
||||
uint32_t decode_fail;
|
||||
uint32_t lora_tx_fail;
|
||||
};
|
||||
|
||||
struct MeterData {
|
||||
uint32_t ts_utc;
|
||||
uint16_t short_id;
|
||||
@@ -13,6 +26,13 @@ struct MeterData {
|
||||
float battery_voltage_v;
|
||||
uint8_t battery_percent;
|
||||
bool valid;
|
||||
int16_t link_rssi_dbm;
|
||||
float link_snr_db;
|
||||
bool link_valid;
|
||||
uint32_t err_meter_read;
|
||||
uint32_t err_decode;
|
||||
uint32_t err_lora_tx;
|
||||
FaultType last_error;
|
||||
};
|
||||
|
||||
struct SenderStatus {
|
||||
|
||||
@@ -11,6 +11,7 @@ void display_set_sender_statuses(const SenderStatus *statuses, uint8_t count);
|
||||
void display_set_last_meter(const MeterData &data);
|
||||
void display_set_last_read(bool ok, uint32_t ts_utc);
|
||||
void display_set_last_tx(bool ok, uint32_t ts_utc);
|
||||
void display_set_last_error(FaultType type, uint32_t ts_utc, uint32_t ts_ms);
|
||||
void display_set_receiver_status(bool ap_mode, const char *ssid, bool mqtt_ok);
|
||||
void display_power_down();
|
||||
void display_tick();
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
|
||||
bool meterDataToJson(const MeterData &data, String &out_json);
|
||||
bool jsonToMeterData(const String &json, MeterData &data);
|
||||
bool meterBatchToJson(const MeterData *samples, size_t count, String &out_json);
|
||||
bool meterBatchToJson(const MeterData *samples, size_t count, String &out_json, const FaultCounters *faults = nullptr, FaultType last_error = FaultType::None);
|
||||
bool jsonToMeterBatch(const String &json, MeterData *out_samples, size_t max_count, size_t &out_count);
|
||||
|
||||
@@ -12,6 +12,8 @@ struct LoraPacket {
|
||||
PayloadType payload_type;
|
||||
uint8_t payload[LORA_MAX_PAYLOAD];
|
||||
size_t payload_len;
|
||||
int16_t rssi_dbm;
|
||||
float snr_db;
|
||||
};
|
||||
|
||||
void lora_init();
|
||||
|
||||
@@ -8,6 +8,8 @@ void mqtt_init(const WifiMqttConfig &config, const char *device_id);
|
||||
void mqtt_loop();
|
||||
bool mqtt_is_connected();
|
||||
bool mqtt_publish_state(const MeterData &data);
|
||||
bool mqtt_publish_faults(const char *device_id, const FaultCounters &counters, FaultType last_error, uint32_t last_error_age_sec);
|
||||
bool mqtt_publish_discovery(const char *device_id);
|
||||
#ifdef ENABLE_TEST_MODE
|
||||
bool mqtt_publish_test(const char *device_id, const String &payload);
|
||||
#endif
|
||||
|
||||
@@ -7,9 +7,11 @@ void time_receiver_init(const char *ntp_server_1, const char *ntp_server_2);
|
||||
uint32_t time_get_utc();
|
||||
bool time_is_synced();
|
||||
void time_set_utc(uint32_t epoch);
|
||||
void time_send_timesync(uint16_t device_id_short);
|
||||
bool time_send_timesync(uint16_t device_id_short);
|
||||
bool time_handle_timesync_payload(const uint8_t *payload, size_t len);
|
||||
void time_get_local_hhmm(char *out, size_t out_len);
|
||||
void time_rtc_init();
|
||||
bool time_try_load_from_rtc();
|
||||
bool time_rtc_present();
|
||||
uint32_t time_get_last_sync_utc();
|
||||
uint32_t time_get_last_sync_age_sec();
|
||||
|
||||
Reference in New Issue
Block a user