From 15dd74d6ab69727ff18d8e5713f27a35f4a8d385 Mon Sep 17 00:00:00 2001 From: Ryan D McGuire Date: Thu, 3 Apr 2025 15:31:43 -0400 Subject: [PATCH] implement lightning_time in grpc --- api/v1alpha1/weather/weather.pb.go | 27 +++++++++++++------ .../weather/weather_service.swagger.json | 4 +++ pkg/ambient/ambientgrpc/mapupdate.go | 1 + pkg/provider/awn/provider.go | 2 +- pkg/provider/awn/types.go | 2 +- pkg/util/util.go | 9 +++++++ pkg/weather/metrics.go | 2 +- pkg/weather/types.go | 2 +- proto/weather/weather.proto | 1 + 9 files changed, 38 insertions(+), 12 deletions(-) diff --git a/api/v1alpha1/weather/weather.pb.go b/api/v1alpha1/weather/weather.pb.go index 18e8936..cf6bbd8 100644 --- a/api/v1alpha1/weather/weather.pb.go +++ b/api/v1alpha1/weather/weather.pb.go @@ -298,6 +298,7 @@ type WeatherUpdate struct { UpdateTimestamp *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=update_timestamp,json=updateTimestamp,proto3" json:"update_timestamp,omitempty"` LightningDay *int32 `protobuf:"varint,29,opt,name=lightning_day,json=lightningDay,proto3,oneof" json:"lightning_day,omitempty"` LightningDistance *int32 `protobuf:"varint,30,opt,name=lightning_distance,json=lightningDistance,proto3,oneof" json:"lightning_distance,omitempty"` + LightningLastTime *timestamppb.Timestamp `protobuf:"bytes,31,opt,name=lightning_last_time,json=lightningLastTime,proto3,oneof" json:"lightning_last_time,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -542,6 +543,13 @@ func (x *WeatherUpdate) GetLightningDistance() int32 { return 0 } +func (x *WeatherUpdate) GetLightningLastTime() *timestamppb.Timestamp { + if x != nil { + return x.LightningLastTime + } + return nil +} + // Represents a temperature and humidity sensor type TempHumiditySensor struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -676,7 +684,7 @@ const file_weather_weather_proto_rawDesc = "" + "\fstation_name\x18\x01 \x01(\tH\x00R\vstationName\x88\x01\x01\x12&\n" + "\fstation_type\x18\x02 \x01(\tH\x01R\vstationType\x88\x01\x01B\x0f\n" + "\r_station_nameB\x0f\n" + - "\r_station_type\"\x85\x0e\n" + + "\r_station_type\"\xee\x0e\n" + "\rWeatherUpdate\x12!\n" + "\fstation_name\x18\x01 \x01(\tR\vstationName\x12!\n" + "\fstation_type\x18\x02 \x01(\tR\vstationType\x12\x1d\n" + @@ -711,7 +719,8 @@ const file_weather_weather_proto_rawDesc = "" + "\x15temp_humidity_sensors\x18\x1b \x03(\v2#.ambient.weather.TempHumiditySensorR\x13tempHumiditySensors\x12E\n" + "\x10update_timestamp\x18\x1c \x01(\v2\x1a.google.protobuf.TimestampR\x0fupdateTimestamp\x12(\n" + "\rlightning_day\x18\x1d \x01(\x05H\x16R\flightningDay\x88\x01\x01\x122\n" + - "\x12lightning_distance\x18\x1e \x01(\x05H\x17R\x11lightningDistance\x88\x01\x01B\x11\n" + + "\x12lightning_distance\x18\x1e \x01(\x05H\x17R\x11lightningDistance\x88\x01\x01\x12O\n" + + "\x13lightning_last_time\x18\x1f \x01(\v2\x1a.google.protobuf.TimestampH\x18R\x11lightningLastTime\x88\x01\x01B\x11\n" + "\x0f_temp_outdoor_fB\x10\n" + "\x0e_temp_indoor_fB\x13\n" + "\x11_humidity_outdoorB\x12\n" + @@ -735,7 +744,8 @@ const file_weather_weather_proto_rawDesc = "" + "\f_dew_point_fB\x0f\n" + "\r_wind_chill_fB\x10\n" + "\x0e_lightning_dayB\x15\n" + - "\x13_lightning_distance\"}\n" + + "\x13_lightning_distanceB\x16\n" + + "\x14_lightning_last_time\"}\n" + "\x12TempHumiditySensor\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n" + "\x06temp_f\x18\x02 \x01(\x01H\x00R\x05tempF\x88\x01\x01\x12\x1f\n" + @@ -779,11 +789,12 @@ var file_weather_weather_proto_depIdxs = []int32{ 7, // 4: ambient.weather.WeatherUpdate.batteries:type_name -> ambient.weather.BatteryStatus 6, // 5: ambient.weather.WeatherUpdate.temp_humidity_sensors:type_name -> ambient.weather.TempHumiditySensor 8, // 6: ambient.weather.WeatherUpdate.update_timestamp:type_name -> google.protobuf.Timestamp - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 8, // 7: ambient.weather.WeatherUpdate.lightning_last_time:type_name -> google.protobuf.Timestamp + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_weather_weather_proto_init() } diff --git a/api/v1alpha1/weather/weather_service.swagger.json b/api/v1alpha1/weather/weather_service.swagger.json index 1896220..3225318 100644 --- a/api/v1alpha1/weather/weather_service.swagger.json +++ b/api/v1alpha1/weather/weather_service.swagger.json @@ -316,6 +316,10 @@ "lightningDistance": { "type": "integer", "format": "int32" + }, + "lightningLastTime": { + "type": "string", + "format": "date-time" } } } diff --git a/pkg/ambient/ambientgrpc/mapupdate.go b/pkg/ambient/ambientgrpc/mapupdate.go index 1a876e5..d3bd28f 100644 --- a/pkg/ambient/ambientgrpc/mapupdate.go +++ b/pkg/ambient/ambientgrpc/mapupdate.go @@ -61,6 +61,7 @@ func UpdateToPbUpdate(u *weather.WeatherUpdate) *pb.WeatherUpdate { UpdateTimestamp: timestamppb.New(*u.DateUTC), LightningDay: util.Int32ptr(u.LightningDay), LightningDistance: util.Int32ptr(u.LightningDistance), + LightningLastTime: util.TimestampFromIntPtr(u.LightningLastTime), } } diff --git a/pkg/provider/awn/provider.go b/pkg/provider/awn/provider.go index f1399e1..d3a8a14 100644 --- a/pkg/provider/awn/provider.go +++ b/pkg/provider/awn/provider.go @@ -145,7 +145,7 @@ func MapAwnUpdate(awnUpdate *AmbientWeatherUpdate) *weather.WeatherUpdate { }, LightningDay: awnUpdate.LightningDay, LightningDistance: awnUpdate.LightningDistance, - LightningTime: awnUpdate.LightningTime, + LightningLastTime: awnUpdate.LightningLastTime, } } diff --git a/pkg/provider/awn/types.go b/pkg/provider/awn/types.go index 8199aa2..8381700 100644 --- a/pkg/provider/awn/types.go +++ b/pkg/provider/awn/types.go @@ -36,7 +36,7 @@ type AmbientLightningData struct { BattLightning *int `json:"batt_lightning,omitempty" schema:"batt_lightning"` LightningDay *int `json:"lightning_day,omitempty" schema:"lightning_day" description:"count of lightning detections"` LightningDistance *int `json:"lightning_distance,omitempty" schema:"lightning_distance" description:"distance in kilometers"` - LightningTime *int `json:"lightningTime,omitempty" schema:"lightningTime" description:"last lightning detection time"` + LightningLastTime *int `json:"lightning_time,omitempty" schema:"lightning_time" description:"last lightning detection time"` } type AmbientTempHumiditySensors struct { diff --git a/pkg/util/util.go b/pkg/util/util.go index 780934f..31af402 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -5,8 +5,10 @@ import ( "encoding/hex" "fmt" "slices" + "time" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/config" + "google.golang.org/protobuf/types/known/timestamppb" "k8s.io/utils/ptr" pb "gitea.libretechconsulting.com/rmcguire/ambient-local-exporter/api/v1alpha1/weather" @@ -29,6 +31,13 @@ func Int32ptr(i *int) *int32 { return ptr.To(int32(*i)) } +func TimestampFromIntPtr(i *int) *timestamppb.Timestamp { + if i == nil { + return nil + } + return timestamppb.New(time.Unix(int64(*i), 0)) +} + // Generates a hash that will be consistent // across all running replicas func GetAppHash(conf *config.AppConfig) string { diff --git a/pkg/weather/metrics.go b/pkg/weather/metrics.go index d83fc1d..b605bc5 100644 --- a/pkg/weather/metrics.go +++ b/pkg/weather/metrics.go @@ -82,7 +82,7 @@ func (wm *WeatherMetrics) Update(u *WeatherUpdate) { wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningLastDistance, IntVal: u.LightningDistance, Field: FieldLightningDistance, Attributes: attributes, Station: u.StationConfig}) wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningCountDay, IntVal: u.LightningDay, Field: FieldLightningDay, Attributes: attributes, Station: u.StationConfig}) - wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningLastTime, IntVal: u.LightningTime, Field: FieldLightningLastTime, Attributes: attributes, Station: u.StationConfig}) + wm.recorder.Record(&RecordOpts{Int64Gauge: wm.LightningLastTime, IntVal: u.LightningLastTime, Field: FieldLightningLastTime, Attributes: attributes, Station: u.StationConfig}) wm.RecordBatteries(u, attributes) wm.RecordTempHumiditySensors(u, attributes) diff --git a/pkg/weather/types.go b/pkg/weather/types.go index e36cb22..c46a11b 100644 --- a/pkg/weather/types.go +++ b/pkg/weather/types.go @@ -43,7 +43,7 @@ type WeatherUpdate struct { // Lightning Data LightningDay *int `json:"lightningDay,omitempty"` // Count of detections LightningDistance *int `json:"lightningDistance,omitempty"` // Last detection distance [kilometers] - LightningTime *int `json:"lightningTime,omitempty"` // Last detection time + LightningLastTime *int `json:"lightningLastTime,omitempty"` // Last detection time } type TempHumiditySensor struct { diff --git a/proto/weather/weather.proto b/proto/weather/weather.proto index e6a1b3e..4c01c95 100644 --- a/proto/weather/weather.proto +++ b/proto/weather/weather.proto @@ -59,6 +59,7 @@ message WeatherUpdate { google.protobuf.Timestamp update_timestamp = 28; optional int32 lightning_day = 29; optional int32 lightning_distance = 30; + optional google.protobuf.Timestamp lightning_last_time = 31; } // Represents a temperature and humidity sensor