using System.Net.Http.Headers; using System.Text; using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(args); // Add JSON serialization services builder.Services.ConfigureHttpJsonOptions(options => { 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"); app.MapPost( "/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(); record AlertBody(string Status); record DiscordMessage(string content, string userName); record HeatPumpStatus(HeatPumpStatusBody heatpump); record HeatPumpStatusBody(string power);