From b2279b230be7dc3c2975bdafcf74be3e04b5f960 Mon Sep 17 00:00:00 2001 From: Kpa-clawbot Date: Wed, 1 Apr 2026 06:58:27 -0700 Subject: [PATCH] fix: handle string, uint, and uint64 types in toFloat64 (#352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixes #350 — `toFloat64()` silently drops SNR/RSSI values when bridges send strings instead of numbers. ## Problem Some MQTT bridges serialize numeric fields (SNR, RSSI, battery_mv, etc.) as JSON strings like `"-7.5"` instead of numbers. The existing `toFloat64()` switch only handled `float64`, `float32`, `int`, `int64`, and `json.Number`, so string values fell through to the default case returning `(0, false)` — silently dropping the data. ## Changes - **`cmd/ingestor/main.go`**: Added `string`, `uint`, and `uint64` cases to `toFloat64()` - `string`: uses `strconv.ParseFloat(strings.TrimSpace(n), 64)` to handle whitespace-padded numeric strings - `uint` / `uint64`: straightforward numeric conversion - Added `strconv` import - **`cmd/ingestor/main_test.go`**: Updated `TestToFloat64` with new cases: - Valid string (`"3.14"`), string with spaces (`" -7.5 "`), string integer (`"42"`) - Invalid string (`"hello"`), empty string - `uint(10)`, `uint64(999)` ## Testing All ingestor tests pass (`go test ./...`). Co-authored-by: you --- cmd/ingestor/main.go | 8 ++++++++ cmd/ingestor/main_test.go | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cmd/ingestor/main.go b/cmd/ingestor/main.go index 64204a6c..8e4c3164 100644 --- a/cmd/ingestor/main.go +++ b/cmd/ingestor/main.go @@ -14,6 +14,7 @@ import ( "os" "os/signal" "path/filepath" + "strconv" "strings" "syscall" "time" @@ -483,6 +484,13 @@ func toFloat64(v interface{}) (float64, bool) { case json.Number: f, err := n.Float64() return f, err == nil + case string: + f, err := strconv.ParseFloat(strings.TrimSpace(n), 64) + return f, err == nil + case uint: + return float64(n), true + case uint64: + return float64(n), true default: return 0, false } diff --git a/cmd/ingestor/main_test.go b/cmd/ingestor/main_test.go index 08b07efc..6454db59 100644 --- a/cmd/ingestor/main_test.go +++ b/cmd/ingestor/main_test.go @@ -22,7 +22,13 @@ func TestToFloat64(t *testing.T) { {"int64", int64(100), 100.0, true}, {"json.Number valid", json.Number("9.5"), 9.5, true}, {"json.Number invalid", json.Number("not_a_number"), 0, false}, - {"string unsupported", "hello", 0, false}, + {"string valid", "3.14", 3.14, true}, + {"string with spaces", " -7.5 ", -7.5, true}, + {"string integer", "42", 42.0, true}, + {"string invalid", "hello", 0, false}, + {"string empty", "", 0, false}, + {"uint", uint(10), 10.0, true}, + {"uint64", uint64(999), 999.0, true}, {"bool unsupported", true, 0, false}, {"nil unsupported", nil, 0, false}, {"slice unsupported", []int{1}, 0, false},