Add LoRa telemetry, fault counters, and time sync status

This commit is contained in:
2026-01-30 13:00:16 +01:00
parent 7e3b537e49
commit 8ba7675a1c
13 changed files with 437 additions and 21 deletions

View File

@@ -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] = {

View File

@@ -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 {

View File

@@ -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();

View File

@@ -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);

View File

@@ -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();

View File

@@ -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

View File

@@ -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();