From 397b2c9f30b2c156b490be21dddf3fe266f421ae Mon Sep 17 00:00:00 2001 From: "willem.serruys" Date: Sun, 16 Aug 2026 19:28:16 +0200 Subject: [PATCH] WIP --- microservices/power_control/Program.cs | 171 ++++++++++++++++--------- 1 file changed, 109 insertions(+), 62 deletions(-) diff --git a/microservices/power_control/Program.cs b/microservices/power_control/Program.cs index 53b2c75..2519750 100644 --- a/microservices/power_control/Program.cs +++ b/microservices/power_control/Program.cs @@ -1,3 +1,5 @@ +using System.Net.Http.Headers; +using System.Text; using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(args); @@ -5,75 +7,120 @@ var builder = WebApplication.CreateBuilder(args); // Add JSON serialization services builder.Services.ConfigureHttpJsonOptions(options => { - options.SerializerOptions.PropertyNameCaseInsensitive = true; + options.SerializerOptions.PropertyNameCaseInsensitive = true; }); var app = builder.Build(); app.MapPost( - "/high_power_alert", - async (AlertBody body) => - { - Console.WriteLine("high power alert was received."); - using var client = new HttpClient(); - var heatPumpState = await client.GetFromJsonAsync("http://192.168.1.121/control"); - var message = ""; - Console.WriteLine(heatPumpState.heatpump.power); - switch (body.Status) - { - case "firing": - Console.WriteLine("Peak too high. Shutting down heat pump."); - message = "@everyone peak is too high. Disabling heat pump. 🥶"; - if (heatPumpState.heatpump.power == "on") - { - await client.GetAsync( - "http://192.168.1.121/control?cmd=heatpump&set_power_mode=off" - ); - } - else - { - message = "@everyone high power alert, but heat pump could not be disabled because state was not 'ON'"; - } - await client.PostAsJsonAsync( - "https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3", - new DiscordMessage(message, "willemBot") - ); - break; - case "resolved": - Console.WriteLine("Peak acceptable. Re enabling heat pump. 🌶️"); - message = "Re enabled heat pump."; - if (heatPumpState.heatpump.power == "off") - { - await client.GetAsync( - "http://192.168.1.121/control?cmd=heatpump&set_power_mode=on" - ); - } - else { - message = "@everyone Heat pump could not be re enabled because state was not 'ON'"; - } - await client.PostAsJsonAsync( - "https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3", - new DiscordMessage(message, "willemBot") - ); - break; - default: - Console.WriteLine("Unknown body type"); - break; - } - return new OkResult(); - } - ) - .WithName("HighPowerAlert"); + "/high_power_alert", + async (AlertBody body) => + { + Console.WriteLine("high power alert was received."); + using var client = new HttpClient(); + var heatPumpState = await client.GetFromJsonAsync( + "http://192.168.1.121/control" + ); + var message = ""; + Console.WriteLine(heatPumpState.heatpump.power); + switch (body.Status) + { + case "firing": + Console.WriteLine("Peak too high. Shutting down heat pump."); + message = "@everyone peak is too high. Disabling heat pump. 🥶"; + if (heatPumpState.heatpump.power == "on") + { + await client.GetAsync( + "http://192.168.1.121/control?cmd=heatpump&set_power_mode=off" + ); + } + else + { + message = + "@everyone high power alert, but heat pump could not be disabled because state was not 'ON'"; + } + await client.PostAsJsonAsync( + "https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3", + new DiscordMessage(message, "willemBot") + ); + break; + case "resolved": + Console.WriteLine("Peak acceptable. Re enabling heat pump. 🌶️"); + message = "Re enabled heat pump."; + if (heatPumpState.heatpump.power == "off") + { + await client.GetAsync( + "http://192.168.1.121/control?cmd=heatpump&set_power_mode=on" + ); + } + else + { + message = + "@everyone Heat pump could not be re enabled because state was not 'ON'"; + } + await client.PostAsJsonAsync( + "https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3", + new DiscordMessage(message, "willemBot") + ); + break; + default: + Console.WriteLine("Unknown body type"); + break; + } + return new OkResult(); + } + ) + .WithName("HighPowerAlert"); app.MapPost( - "/low_power_alert", - () => - { - Console.WriteLine("low power alert was received."); - return new OkResult(); - } - ) - .WithName("Low Power Alert"); + "/low_power_alert", + () => + { + Console.WriteLine("low power alert was received."); + return new OkResult(); + } + ) + .WithName("Low Power Alert"); + +// Example: querying an InfluxDB v2 instance via its Flux query API. +app.MapGet( + "/example/influx_query", + async () => + { + var token = "0kycl3gLT7kWBzfrNcvkmXVDUUjdWUwKnTmBZJfS_dHrE2EiJYv_HthDLc92Xsdaui3FxRsm7zndyyS33Mh9YA=="; + var org = "homeassistant"; + + using var client = new HttpClient(); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( + "Token", + token + ); + client.DefaultRequestHeaders.Accept.Add( + new MediaTypeWithQualityHeaderValue("application/csv") + ); + + var flux = """ + from(bucket: "homeassistant") + |> range(start: -1h) + |> filter(fn: (r) => r._measurement == "W") + |> filter(fn: (r) => r.domain == "sensor") + |> filter(fn: (r) => r.entity_id == "p1_meter_power") + |> filter(fn: (r) => r._field == "value") + |> aggregateWindow(every: 5m, fn: mean, createEmpty: false) + |> yield(name: "mean") + """; + var content = new StringContent(flux, Encoding.UTF8, "application/vnd.flux"); + + var response = await client.PostAsync( + $"http://influxdb.pladijs/api/v2/query?org={org}", + content + ); + var result = await response.Content.ReadAsStringAsync(); + + return Results.Content(result, "text/csv"); + } + ) + .WithName("ExampleInfluxQuery"); app.Run();