edenic-exporter/EdenicExporter/Program.cs
2024-08-18 00:57:42 +01:00

138 lines
4.3 KiB
C#

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Prometheus;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Linq;
namespace PrometheusExporterEdenic
{
public class Device
{
public string id { get; set; }
public string name { get; set; }
public string label { get; set; }
// Add other properties as needed
}
public class ApiClient
{
private readonly HttpClient _client;
private readonly string _authToken;
private readonly string _orgid;
private readonly string _apimainurl = "https://api.edenic.io/api/v1/device";
public ApiClient(string authToken, string orgID)
{
_client = new HttpClient();
_authToken = authToken;
_orgid = orgID;
_client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(_authToken);
}
public async Task<dynamic> MakeApiRequest<T>(string path)
{
try
{
HttpResponseMessage response = await _client.GetAsync($"{_apimainurl}/{_orgid}{path}");
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<dynamic>(content); }
else
{
throw new HttpRequestException($"Error: {response.StatusCode}");
}
}
catch (HttpRequestException e)
{
Console.WriteLine($"Request exception: {e.Message}");
throw;
}
catch (JsonException e)
{
Console.WriteLine($"JSON parsing exception: {e.Message}");
throw;
}
}
public async Task<string> GetDeviceIdByName(string name)
{
dynamic result = await MakeApiRequest<object>("");
var jsonString = JsonSerializer.Serialize(result);
var devices = JsonSerializer.Deserialize<List<Device>>(jsonString);
var targetDevice = devices.FirstOrDefault((Func<Device, bool>)(d => d.label == name));
return targetDevice?.id;
}
}
public class Program
{
public static void Main(string[] args)
{
string EDENIC_API_TOKEN = Environment.GetEnvironmentVariable("EDENIC_API_TOKEN");
string EDENIC_ORG_ID = Environment.GetEnvironmentVariable("EDENIC_ORG_ID");
ApiClient client = new ApiClient(EDENIC_API_TOKEN, EDENIC_ORG_ID);
Console.WriteLine(client.GetDeviceIdByName("The First One"));
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMetricServer();
app.UseHttpMetrics();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Open /metrics");
});
});
var ph = Metrics.CreateGauge("edenic_ph", "Edenic ph");
var temperature = Metrics.CreateGauge("edenic_temperature", "Edenic temperature");
var ec = Metrics.CreateGauge("edenic_ec", "Edenic EC");
Task.Run(async () =>
{
while (true)
{
ph.Set(1);
temperature.Set(1);
ec.Set(1);
await Task.Delay(15000);
}
});
}
}
}