This commit is contained in:
willem.serruys
2026-08-16 19:28:16 +02:00
parent 41aac081ca
commit 397b2c9f30

View File

@@ -1,3 +1,5 @@
using System.Net.Http.Headers;
using System.Text;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -5,75 +7,120 @@ var builder = WebApplication.CreateBuilder(args);
// Add JSON serialization services // Add JSON serialization services
builder.Services.ConfigureHttpJsonOptions(options => builder.Services.ConfigureHttpJsonOptions(options =>
{ {
options.SerializerOptions.PropertyNameCaseInsensitive = true; options.SerializerOptions.PropertyNameCaseInsensitive = true;
}); });
var app = builder.Build(); var app = builder.Build();
app.MapPost( app.MapPost(
"/high_power_alert", "/high_power_alert",
async (AlertBody body) => async (AlertBody body) =>
{ {
Console.WriteLine("high power alert was received."); Console.WriteLine("high power alert was received.");
using var client = new HttpClient(); using var client = new HttpClient();
var heatPumpState = await client.GetFromJsonAsync<HeatPumpStatus>("http://192.168.1.121/control"); var heatPumpState = await client.GetFromJsonAsync<HeatPumpStatus>(
var message = ""; "http://192.168.1.121/control"
Console.WriteLine(heatPumpState.heatpump.power); );
switch (body.Status) var message = "";
{ Console.WriteLine(heatPumpState.heatpump.power);
case "firing": switch (body.Status)
Console.WriteLine("Peak too high. Shutting down heat pump."); {
message = "@everyone peak is too high. Disabling heat pump. 🥶"; case "firing":
if (heatPumpState.heatpump.power == "on") Console.WriteLine("Peak too high. Shutting down heat pump.");
{ message = "@everyone peak is too high. Disabling heat pump. 🥶";
await client.GetAsync( if (heatPumpState.heatpump.power == "on")
"http://192.168.1.121/control?cmd=heatpump&set_power_mode=off" {
); 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'"; else
} {
await client.PostAsJsonAsync<DiscordMessage>( message =
"https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3", "@everyone high power alert, but heat pump could not be disabled because state was not 'ON'";
new DiscordMessage(message, "willemBot") }
); await client.PostAsJsonAsync<DiscordMessage>(
break; "https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3",
case "resolved": new DiscordMessage(message, "willemBot")
Console.WriteLine("Peak acceptable. Re enabling heat pump. 🌶️"); );
message = "Re enabled heat pump."; break;
if (heatPumpState.heatpump.power == "off") case "resolved":
{ Console.WriteLine("Peak acceptable. Re enabling heat pump. 🌶️");
await client.GetAsync( message = "Re enabled heat pump.";
"http://192.168.1.121/control?cmd=heatpump&set_power_mode=on" if (heatPumpState.heatpump.power == "off")
); {
} await client.GetAsync(
else { "http://192.168.1.121/control?cmd=heatpump&set_power_mode=on"
message = "@everyone Heat pump could not be re enabled because state was not 'ON'"; );
} }
await client.PostAsJsonAsync<DiscordMessage>( else
"https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3", {
new DiscordMessage(message, "willemBot") message =
); "@everyone Heat pump could not be re enabled because state was not 'ON'";
break; }
default: await client.PostAsJsonAsync<DiscordMessage>(
Console.WriteLine("Unknown body type"); "https://discord.com/api/webhooks/1455072237207158981/C9qvSIGMZVc60VwpZizxqKigyzvA182RDSdt9k8qtWTq-fBgzlJHh53wAYIqYkGNkBM3",
break; new DiscordMessage(message, "willemBot")
} );
return new OkResult(); break;
} default:
) Console.WriteLine("Unknown body type");
.WithName("HighPowerAlert"); break;
}
return new OkResult();
}
)
.WithName("HighPowerAlert");
app.MapPost( app.MapPost(
"/low_power_alert", "/low_power_alert",
() => () =>
{ {
Console.WriteLine("low power alert was received."); Console.WriteLine("low power alert was received.");
return new OkResult(); return new OkResult();
} }
) )
.WithName("Low Power Alert"); .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(); app.Run();