fix: handle string, uint, and uint64 types in toFloat64 (#352)

## 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 <you@example.com>
This commit is contained in:
Kpa-clawbot
2026-04-01 06:58:27 -07:00
committed by GitHub
co-authored by you
parent d1cb84b596
commit b2279b230b
2 changed files with 15 additions and 1 deletions
+8
View File
@@ -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
}
+7 -1
View File
@@ -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},