diff --git a/Weather/Service/Controllers/ReadingsController.cs b/Weather/Service/Controllers/ReadingsController.cs index 26b7659..64d2c2c 100644 --- a/Weather/Service/Controllers/ReadingsController.cs +++ b/Weather/Service/Controllers/ReadingsController.cs @@ -1,7 +1,8 @@ -using System; -using ChrisKaczor.HomeMonitor.Weather.Models; +using ChrisKaczor.HomeMonitor.Weather.Models; using ChrisKaczor.HomeMonitor.Weather.Service.Data; +using ChrisKaczor.HomeMonitor.Weather.Service.Models; using Microsoft.AspNetCore.Mvc; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -30,5 +31,11 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Controllers { return (await _database.GetReadingHistory(start, end)).ToList(); } + + [HttpGet("value-history")] + public async Task>> GetValueHistory(WeatherValueType weatherValueType, DateTimeOffset start, DateTimeOffset end, int bucketMinutes = 2) + { + return (await _database.GetReadingValueHistory(weatherValueType, start, end, bucketMinutes)).ToList(); + } } } \ No newline at end of file diff --git a/Weather/Service/Data/Database.cs b/Weather/Service/Data/Database.cs index f393dc5..4475914 100644 --- a/Weather/Service/Data/Database.cs +++ b/Weather/Service/Data/Database.cs @@ -1,4 +1,5 @@ using ChrisKaczor.HomeMonitor.Weather.Models; +using ChrisKaczor.HomeMonitor.Weather.Service.Models; using Dapper; using Microsoft.Extensions.Configuration; using System; @@ -96,5 +97,16 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Data return await connection.QueryAsync(query, new { Start = start, End = end }); } + + public async Task> GetReadingValueHistory(WeatherValueType weatherValueType, DateTimeOffset start, DateTimeOffset end, int bucketMinutes) + { + await using var connection = CreateConnection(); + + var query = ResourceReader.GetString("ChrisKaczor.HomeMonitor.Weather.Service.Data.Resources.GetReadingValueHistory.sql"); + + query = query.Replace("@Value", weatherValueType.ToString()); + + return await connection.QueryAsync(query, new { Start = start, End = end, BucketMinutes = bucketMinutes }); + } } } \ No newline at end of file diff --git a/Weather/Service/Data/Resources/GetReadingValueHistory.sql b/Weather/Service/Data/Resources/GetReadingValueHistory.sql new file mode 100644 index 0000000..e9d7c8d --- /dev/null +++ b/Weather/Service/Data/Resources/GetReadingValueHistory.sql @@ -0,0 +1,12 @@ +SELECT bucket, + AVG(Value) AS AverageValue +FROM ( + SELECT CAST(FORMAT(Timestamp, 'yyyy-MM-ddTHH:') + + RIGHT('00' + CAST(DATEPART(MINUTE, Timestamp) / @BucketMinutes * @BucketMinutes AS VARCHAR), 2) + + ':00+00:00' AS DATETIMEOFFSET) AS Bucket, + @Value AS Value + FROM Reading + WHERE Timestamp BETWEEN @Start AND @End + ) AS Data +GROUP BY Bucket +ORDER BY Bucket \ No newline at end of file diff --git a/Weather/Service/Models/WeatherValue.cs b/Weather/Service/Models/WeatherValue.cs new file mode 100644 index 0000000..6a41ad6 --- /dev/null +++ b/Weather/Service/Models/WeatherValue.cs @@ -0,0 +1,13 @@ +using JetBrains.Annotations; +using System; + +namespace ChrisKaczor.HomeMonitor.Weather.Service.Models +{ + [PublicAPI] + public class WeatherValue + { + public DateTimeOffset Bucket { get; set; } + + public decimal AverageValue { get; set; } + } +} diff --git a/Weather/Service/Models/WeatherValueType.cs b/Weather/Service/Models/WeatherValueType.cs new file mode 100644 index 0000000..abcad7a --- /dev/null +++ b/Weather/Service/Models/WeatherValueType.cs @@ -0,0 +1,19 @@ +using JetBrains.Annotations; + +namespace ChrisKaczor.HomeMonitor.Weather.Service.Models +{ + [PublicAPI] + public enum WeatherValueType + { + WindSpeed, + Humidity, + HumidityTemperature, + Rain, + Pressure, + PressureTemperature, + BatteryLevel, + LightLevel, + Altitude, + SatelliteCount + } +} diff --git a/Weather/Service/Service.csproj b/Weather/Service/Service.csproj index 200219d..1b1b412 100644 --- a/Weather/Service/Service.csproj +++ b/Weather/Service/Service.csproj @@ -11,12 +11,14 @@ + +