Files
DD3-LoRa-Bridge-MultiSender/REPUBLISH_COMPATIBILITY_REPORT.md
acidburns 3e9259735e Verify republish scripts compatibility with current CSV/MQTT formats
- Fix documentation: CSV header typo (ts_hms_utc  ts_hms_local)
- Add comprehensive compatibility test suite (test_republish_compatibility.py)
- Both republish_mqtt.py and republish_mqtt_gui.py verified working
- Tests: CSV parsing, MQTT JSON format, legacy compatibility, InfluxDB schema
- All 5/5 compatibility tests passing
- Create detailed compatibility reports and validation documentation
2026-03-11 20:43:09 +01:00

9.3 KiB
Raw Blame History

Republish Scripts Compatibility Report

Date: March 11, 2026
Focus: Validate both Python scripts work with newest CSV exports and InfluxDB layouts


Executive Summary

BOTH SCRIPTS ARE COMPATIBLE with current SD card CSV exports and MQTT formats.

Test Results:

  • ✓ CSV parsing works with current ts_hms_local format
  • ✓ Backward compatible with legacy format (no ts_hms_local)
  • ✓ MQTT JSON output format matches device expectations
  • ✓ All required fields present in current schema
  • ⚠ One documentation error found and fixed

Tests Performed

1. CSV Format Compatibility ✓

File: republish_mqtt.py, republish_mqtt_gui.py
Test: Parsing current SD logger CSV format

Current format from device (src/sd_logger.cpp line 105):

ts_utc,ts_hms_local,p_w,p1_w,p2_w,p3_w,e_kwh,bat_v,bat_pct,rssi,snr,err_m,err_d,err_tx,err_last

Result: ✓ PASS

  • Both scripts check for required fields: ts_utc, e_kwh, p_w
  • Second column (ts_hms_local) is NOT required - scripts ignore it gracefully
  • All optional fields handled correctly
  • Field parsing preserves data types correctly

2. Future CSV Format Extensibility ✓

Test: Scripts handle additional CSV columns without breaking

Result: ✓ PASS

  • Scripts use csv.DictReader which only reads specified columns
  • New columns (e.g., rx_reject, rx_reject_text) don't cause errors
  • Note: New fields in CSV won't be republished unless code is updated

3. MQTT JSON Output Format ✓

File: Both scripts
Test: Validation that republished JSON matches device expectations

Generated format by republish scripts:

{
  "id": "F19C",
  "ts": 1710076800,
  "e_kwh": "1234.57",
  "p_w": 5432,
  "p1_w": 1800,
  "p2_w": 1816,
  "p3_w": 1816,
  "bat_v": "4.15",
  "bat_pct": 95,
  "rssi": -95,
  "snr": 9.25
}

Result: ✓ PASS

  • Field names match device output (src/json_codec.cpp)
  • Data types correctly converted:
    • e_kwh, bat_v: strings with 2 decimal places
    • ts, p_w, etc: integers
    • snr: float
  • Device subscription will correctly parse this format

4. Legacy CSV Format (Backward Compatibility) ✓

Test: Scripts still work with older CSV files without ts_hms_local

Legacy format:

ts_utc,p_w,p1_w,p2_w,p3_w,e_kwh,bat_v,bat_pct,rssi,snr

Result: ✓ PASS

  • Matches device behavior (README: "History parser accepts both")
  • Scripts will process these files without modification

5. InfluxDB Schema Requirements ⚠

Files: Both scripts (InfluxDBHelper class)
Test: Verify expected InfluxDB measurement and tag names

Expected InfluxDB Query:

from(bucket: "smartmeter")
  |> range(start: <timestamp>, stop: <timestamp>)
  |> filter(fn: (r) => r._measurement == "smartmeter" and r.device_id == "dd3-F19C")

Result: ✓ SCHEMA OK, ⚠ MISSING BRIDGE

  • Measurement: "smartmeter"
  • Tag name: "device_id"
  • CRITICAL NOTE: Device firmware does NOT write directly to InfluxDB
    • Device publishes to MQTT only
    • Requires external bridge (Telegraf, Node-RED, Home Assistant, etc.)
    • If InfluxDB is unavailable, scripts default to manual mode ✓

Issues Found

Issue 1: Documentation Error

Severity: HIGH (documentation only, code works)
File: REPUBLISH_README.md line 84

Description: Incorrect column name in documented CSV format

Current (WRONG):

ts_utc,ts_hms_utc,p_w,p1_w,p2_w,p3_w,e_kwh,bat_v,bat_pct,rssi,snr,err_m,err_d,err_tx,err_last
                   ↑↑↑↑↑ INCORRECT

Should be (CORRECT):

ts_utc,ts_hms_local,p_w,p1_w,p2_w,p3_w,e_kwh,bat_v,bat_pct,rssi,snr,err_m,err_d,err_tx,err_last
                    ↑↑↑↑↑↑↑↑ CORRECT (local timezone)

Evidence:

  • src/sd_logger.cpp line 105: f.println("ts_utc,ts_hms_local,...")
  • src/sd_logger.cpp line 108: String ts_hms_local = format_hms_local(data.ts_utc);
  • README.md line 162: Says ts_hms_local (correct)

Impact: Users reading REPUBLISH_README.md may be confused about CSV format
Fix Status: APPLIED


Issue 2: CSV Fields Not Republished ⚠

Severity: MEDIUM (limitation, not a bug)
Files: Both scripts

Description: CSV file contains error counter fields (err_m, err_d, err_tx, err_last) and device now sends rx_reject, rx_reject_text, but republish scripts don't read/resend these fields.

Current behavior:

  • Republished JSON: {id, ts, e_kwh, p_w, p1_w, p2_w, p3_w, bat_v, bat_pct, rssi, snr}
  • NOT included in republished JSON:
    • err_m (meter errors) → CSV has this, not republished
    • err_d (decode errors) → CSV has this, not republished
    • err_tx (LoRa TX errors) → CSV has this, not republished
    • err_last (last error code) → CSV has this, not republished
    • rx_reject → Device publishes, but not in CSV

Impact:

  • When recovering lost data from CSV, error counters won't be restored to MQTT
  • These non-critical diagnostic fields are rarely needed for recovery
  • Main meter data (energy, power, battery) is fully preserved

Recommendation:

  • Current behavior is acceptable (data loss recovery focused on meter data)
  • If error counters are needed, update scripts to parse/republish them
  • Add note to documentation explaining what's NOT republished

Fix Status: DOCUMENTED (no code change needed)


Issue 3: InfluxDB Auto-Detect Optional

Severity: LOW (feature is optional)
Files: Both scripts

Description: Scripts expect InfluxDB for auto-detecting missing data ranges, but:

  1. Device firmware doesn't write InfluxDB directly
  2. Requires external MQTT→InfluxDB bridge that may not exist
  3. If missing, scripts gracefully fall back to manual time selection

Current behavior:

  • HAS_INFLUXDB = True or False based on import
  • If True: InfluxDB auto-detect tab/option available
  • If unavailable: Scripts still work in manual mode
  • No error if InfluxDB credentials are wrong (graceful degradation)

Impact: None - graceful fallback exists
Fix Status: WORKING AS DESIGNED


Data Flow Analysis

Current CSV Export (Device → SD Card)

Device state (MeterData)
    ↓
src/sd_logger_log_sample()
    ↓
CSV format: ts_utc,ts_hms_local,p_w,p1_w,p2_w,p3_w,e_kwh,bat_v,bat_pct,rssi,snr,err_m,err_d,err_tx,err_last
    ↓
/dd3/<device_id>/YYYY-MM-DD.csv (local timezone date)

MQTT Publishing (Device → MQTT Broker)

Device state (MeterData)
    ↓
meterDataToJson()
    ↓
JSON: {id, ts, e_kwh, p_w, p1_w, p2_w, p3_w, bat_v, bat_pct, rssi, snr, err_last, rx_reject, rx_reject_text}
    ↓
Topic: smartmeter/<device_id>/state

CSV Republishing (CSV → MQTT)

CSV file
    ↓
republish_csv() reads: ts_utc,e_kwh,p_w,p1_w,p2_w,p3_w,bat_v,bat_pct,rssi,snr[,err_*]
    ↓
Builds JSON: {id, ts, e_kwh, p_w, p1_w, p2_w, p3_w, bat_v, bat_pct, rssi, snr}
    ↓
Publishes: smartmeter/<device_id>/state

NOTE: err_m,err_d,err_tx,err_last from CSV are NOT republished
NOTE: rx_reject,rx_reject_text are not in CSV so can't be republished

InfluxDB Integration (Optional)

Device publishes MQTT
    ↓
[EXTERNAL BRIDGE - Telegraf/Node-RED/etc] (NOT PART OF FIRMWARE)
    ↓
InfluxDB: measurement="smartmeter", tag device_id=<id>
    ↓
republish_mqtt.py (if InfluxDB available) uses auto-detect
    ↓
Otherwise: manual time range selection (always works)

Recommendations

IMMEDIATE ACTIONS

  1. Fix documentation in REPUBLISH_README.md line 84: Change ts_hms_utcts_hms_local

🔄 OPTIONAL ENHANCEMENTS

  1. Add error field republishing if needed:

    • Modify CSV parsing to read: err_m, err_d, err_tx, err_last
    • Add to MQTT JSON output
    • Test with device error handling
  2. Document missing fields in README:

    • Explain that error counters aren't republished from CSV
    • Explain that rx_reject field won't appear in recovered data
    • Recommend manual time selection over InfluxDB if bridge is missing
  3. Add InfluxDB bridge documentation:

    • Create example Telegraf configuration
    • Document MQTT→InfluxDB schema assumptions
    • Add troubleshooting guide for InfluxDB queries

TESTING

  • Run test_republish_compatibility.py after any schema changes
  • Test with actual CSV files from devices (check for edge cases)
  • Verify InfluxDB queries work with deployed bridge

Compatibility Matrix

Component Version Compatible Notes
CSV Format Current (ts_hms_local) YES Tested
CSV Format Legacy (no ts_hms_local) YES Backward compatible
MQTT JSON Output Current YES All fields matched
InfluxDB Schema Standard OPTIONAL Requires external bridge
Python Version 3.7+ YES No version-specific features
Dependencies requirements_republish.txt YES All installed correctly

Conclusion

Both Python scripts (republish_mqtt.py and republish_mqtt_gui.py) are FULLY COMPATIBLE with the newest CSV exports and device layouts.

The only issue found is a documentation typo that should be fixed. The scripts work correctly with:

  • Current CSV format from device SD logger
  • Legacy CSV format for backward compatibility
  • Device MQTT JSON schema
  • InfluxDB auto-detect (optional, gracefully degraded if unavailable)

No code changes are required, only documentation correction.