From 905ba3d7a60adc31a137547e582d447bf46b6aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20=C5=A0taleker?= Date: Fri, 12 Jan 2024 22:36:42 +0100 Subject: [PATCH] podpora za gen2 plug --- ShellyExporter/Metrics.cs | 142 +++++++++++++++++++++++++++++--- ShellyExporter/Program.cs | 5 +- ShellyExporter/appsettings.json | 12 ++- 3 files changed, 144 insertions(+), 15 deletions(-) diff --git a/ShellyExporter/Metrics.cs b/ShellyExporter/Metrics.cs index 3365922..eb0fc0b 100644 --- a/ShellyExporter/Metrics.cs +++ b/ShellyExporter/Metrics.cs @@ -1,37 +1,155 @@ -using System.Text; +using System.Globalization; +using System.Text; using Newtonsoft.Json; namespace ShellyExporter { public class Metrics { - public static async Task Get(string path, string name) + public enum Type + { + PlugS = 1, + Em3 = 2 + } + + public enum Version + { + Gen1 = 1, + Gen2 = 2 + } + public class Data + { + public string? Power { get; set; } + public string? Overpower { get; set; } + public bool? IsValid { get; set; } + public string? Timestamp { get; set; } + public string? Total { get; set; } + public string? Temperature { get; set; } + public string? Voltage { get; set; } + public string? Current { get; set; } + } + + public static async Task Get(string path, string name, Version shellyVersion, Type type) { var sb = new StringBuilder(); + Data data; + switch (type) + { + case Type.PlugS: + switch (shellyVersion) + { + case Version.Gen1: + data = await GetPlugSGen1(path); + break; + case Version.Gen2: + data = await GetPlugSGen2(path); + break; + default: + throw new ArgumentOutOfRangeException(nameof(shellyVersion), shellyVersion, null); + } + break; + //TODO + // case Type.Em3: + // switch (shellyVersion) + // { + // case Version.Gen1: + // data = await GetPlugSGen1(path); + // break; + // case Version.Gen2: + // data = await GetPlugSGen1(path); + // break; + // default: + // throw new ArgumentOutOfRangeException(); + // } + // break; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + + + if (data.Power != null) + sb.AppendLine($"meters_power_wats{{item=\"{name}\"}} {data.Power}"); + if (data.Overpower != null) + sb.AppendLine($"meters_overpower_wats{{item=\"{name}\"}} " + data.Overpower); + if (data.IsValid != null) + sb.AppendLine($"meters_is_valid{{item=\"{name}\"}} " + ((bool)data.IsValid ? 1 : 0)); + if (data.Timestamp != null) + sb.AppendLine($"meters_timestamp{{item=\"{name}\"}} " + data.Timestamp); + if (data.Total != null) + sb.AppendLine($"meters_power_total{{item=\"{name}\"}} " + data.Total); + if (data.Voltage != null) + sb.AppendLine($"meters_voltage_V{{item=\"{name}\"}} " + data.Voltage); + if (data.Current != null) + sb.AppendLine($"meters_current_A{{item=\"{name}\"}} " + data.Current); + if (data.Temperature != null) + sb.AppendLine($"temperature{{item=\"{name}\"}} " + data.Temperature); + + return sb; + } + + private static async Task GetPlugSGen1(string path) + { + var data = new Data(); var client = new HttpClient(); - var response = await client.GetStringAsync(path); + var response = await client.GetStringAsync(path + "/status"); dynamic responseObject = JsonConvert.DeserializeObject(response); if (responseObject == null) - return sb; + return data; if (responseObject.meters != null) { - sb.AppendLine($"meters_power_wats{{item=\"{name}\"}} {responseObject.meters[0].power}"); - sb.AppendLine($"meters_overpower_wats{{item=\"{name}\"}} " + responseObject.meters[0].overpower); - sb.AppendLine($"meters_is_valid{{item=\"{name}\"}} " + (responseObject.meters[0].is_valid == "True" ? 1 : 0)); - sb.AppendLine($"meters_timestamp{{item=\"{name}\"}} " + responseObject.meters[0].timestamp); - sb.AppendLine($"meters_power_total{{item=\"{name}\"}} " + responseObject.meters[0].total); + data.Power = responseObject.meters[0].power; + data.Overpower = responseObject.meters[0].overpower; + data.IsValid = responseObject.meters[0].is_valid; + data.Timestamp = responseObject.meters[0].timestamp; + data.Total = responseObject.meters[0].total; } - if (responseObject.temperature != null) + if (responseObject.tmp.tC != null) { - sb.AppendLine($"temperature{{item=\"{name}\"}} " + responseObject.temperature); + data.Temperature = responseObject.tmp.tC; } - return sb; + return data; + } + + private static async Task GetPlugSGen2(string path) + { + var data = new Data(); + var client = new HttpClient(); + var response = await client.GetStringAsync(path + "/rpc/Switch.GetStatus?id=0"); + + dynamic responseObject = JsonConvert.DeserializeObject(response); + + if (responseObject == null) + return data; + + if (responseObject.apower != null) + data.Power = responseObject.apower; + + if (responseObject.current != null) + data.Current = responseObject.current; + + if (responseObject.voltage != null) + data.Voltage = responseObject.voltage; + + if (responseObject.aenergy != null) + { + if (responseObject.aenergy.total != null) + data.Total = (Convert.ToDecimal(responseObject.aenergy.total) * (decimal)60).ToString(CultureInfo.InvariantCulture); + + if (responseObject.aenergy.minute_ts != null) + data.Timestamp = responseObject.aenergy.minute_ts; + } + + if (responseObject.temperature != null + && responseObject.temperature.tC != null) + data.Temperature = responseObject.temperature.tC; + + return data; } } } diff --git a/ShellyExporter/Program.cs b/ShellyExporter/Program.cs index 5094f57..d6c2975 100644 --- a/ShellyExporter/Program.cs +++ b/ShellyExporter/Program.cs @@ -39,7 +39,10 @@ app.Map("/metrics", () => foreach (var host in builder.Configuration.GetSection("Hosts").GetChildren()) { - sb.Append(Metrics.Get($"http://{host.Value}/status", host.Path.Replace("Hosts:", "")).Result); + sb.Append(Metrics.Get($"http://{host["ip"]}", + host.Path.Replace("Hosts:", ""), + (Metrics.Version)Convert.ToInt16(host["version"]), + (Metrics.Type)Convert.ToInt16(host["type"])).Result); } return sb.ToString(); diff --git a/ShellyExporter/appsettings.json b/ShellyExporter/appsettings.json index dc3c34e..36e662e 100644 --- a/ShellyExporter/appsettings.json +++ b/ShellyExporter/appsettings.json @@ -10,7 +10,15 @@ "Url": "http://192.168.111.77:5050" }, "Hosts": { - "david": "192.168.1.60", - "nekaj": "192.168.1.60" + "server": { + "ip": "192.168.1.60", + "type": 1, + "version" : 1 + }, + "bojler": { + "ip": "192.168.1.61", + "type": 1, + "version" : 2 + } } }