mirror of
https://github.com/RWejlgaard/octopus_exporter.git
synced 2026-07-04 13:56:17 +00:00
46 lines
1.3 KiB
Go
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
|
|
}
|