]> git.giacomolli.uk - onehouse/blob - protocol/hub_status_payload.go
Keep interrupted Modbus work a context stop
[onehouse] / protocol / hub_status_payload.go
1 package protocol
2
3 import (
4 "fmt"
5 "time"
6 )
7
8 // HubStatusPayload holds a hub snapshot, not house state. ID matches the hub
9 // topic. Status is ready or unavailable. ExpiresAt is required in its envelope.
10 // Address is runtime data and must not be written to logs.
11 type HubStatusPayload struct {
12 ID string `json:"id"`
13 Alias string `json:"alias,omitempty"`
14 Address string `json:"address"`
15 Status string `json:"status"`
16 Error string `json:"error,omitempty"`
17 Model string `json:"model,omitempty"`
18 Firmware string `json:"firmware,omitempty"`
19 EventStream bool `json:"event_stream"`
20 UpdatedAt *time.Time `json:"updated_at,omitempty"`
21 Pairing *HubPairing `json:"pairing,omitempty"`
22 ConfiguredDevices int `json:"configured_devices"`
23 PairedDevices *int `json:"paired_devices,omitempty"`
24 Diagnostics *HubDiagnostics `json:"diagnostics,omitempty"`
25 DiagnosticsError string `json:"diagnostics_error,omitempty"`
26 }
27
28 // HubPairing describes one request to permit device joining.
29 type HubPairing struct {
30 Status string `json:"status"`
31 DurationSeconds int `json:"duration_seconds"`
32 RequestedAt time.Time `json:"requested_at"`
33 Deadline time.Time `json:"deadline"`
34 Error string `json:"error,omitempty"`
35 }
36
37 // HubDiagnostics holds a source sample. Repeated publications preserve
38 // ObservedAt and Stale. Optional measurements remain absent when unknown.
39 type HubDiagnostics struct {
40 ObservedAt time.Time `json:"observed_at"`
41 Stale bool `json:"stale"`
42 Hostname string `json:"hostname,omitempty"`
43 IPAddress string `json:"ip_address,omitempty"`
44 MAC string `json:"mac,omitempty"`
45 RadioChip string `json:"radio_chip,omitempty"`
46 RadioFirmware string `json:"radio_firmware,omitempty"`
47 UptimeSeconds *uint64 `json:"uptime_seconds,omitempty"`
48 TemperatureCelsius *float64 `json:"temperature_celsius,omitempty"`
49 RadioTemperatureCelsius *float64 `json:"radio_temperature_celsius,omitempty"`
50 RAMUsedPercent *float64 `json:"ram_used_percent,omitempty"`
51 PSRAMUsedPercent *float64 `json:"psram_used_percent,omitempty"`
52 StorageUsedPercent *float64 `json:"storage_used_percent,omitempty"`
53 EthernetConnected *bool `json:"ethernet_connected,omitempty"`
54 WiFiConnected *bool `json:"wifi_connected,omitempty"`
55 }
56
57 // HubStatusLifetime bounds retained hub status to two polls plus 50 seconds. A
58 // nonpositive poll interval is invalid.
59 func HubStatusLifetime(pollInterval time.Duration) (time.Duration, error) {
60 if pollInterval <= 0 || pollInterval > (time.Duration(1<<63-1)-50*time.Second)/2 {
61 return 0, fmt.Errorf("hub poll interval is outside the supported range")
62 }
63
64 return 2*pollInterval + 50*time.Second, nil
65 }