octopus_exporter/cmd/octopus_exporter/telemetry.go
Rasmus "Pez" Wejlgaard 85c5a96d1e
Some checks failed
Release / release (push) Has been cancelled
feat: json logging (#17)
2026-05-26 18:57:54 +01:00

46 lines
1.3 KiB
Go

package main
import (
"encoding/json"
"errors"
"fmt"
)
var errNoTelemetryData = errors.New("no telemetry data returned")
type telemetryReading struct {
ReadAt string `json:"readAt"`
Consumption jsonFloat `json:"consumption"`
Demand jsonFloat `json:"demand"`
Export jsonFloat `json:"export"`
}
func getLiveConsumption(token, deviceID string) (*telemetryReading, error) {
result, err := doGraphQL(gqlRequest{
OperationName: "getSmartMeterTelemetry",
Variables: map[string]any{"meterDeviceId": deviceID},
Query: "query getSmartMeterTelemetry($meterDeviceId: String!, $start: DateTime, $end: DateTime, $grouping: TelemetryGrouping) {\n smartMeterTelemetry(deviceId: $meterDeviceId, start: $start, end: $end, grouping: $grouping) {\n readAt\n consumption\n demand\n export\n __typename\n }\n}\n",
}, token)
if err != nil {
return nil, err
}
data, ok := result["data"].(map[string]any)
if !ok {
return nil, fmt.Errorf("unexpected API response: missing data field")
}
telemetry := toSlice(data["smartMeterTelemetry"])
if len(telemetry) == 0 {
return nil, errNoTelemetryData
}
raw, err := json.Marshal(telemetry[0])
if err != nil {
return nil, err
}
var reading telemetryReading
if err := json.Unmarshal(raw, &reading); err != nil {
return nil, err
}
return &reading, nil
}