podpora za gen2 plug
This commit is contained in:
@@ -1,37 +1,155 @@
|
|||||||
using System.Text;
|
using System.Globalization;
|
||||||
|
using System.Text;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace ShellyExporter
|
namespace ShellyExporter
|
||||||
{
|
{
|
||||||
public class Metrics
|
public class Metrics
|
||||||
{
|
{
|
||||||
public static async Task<StringBuilder> 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<StringBuilder> Get(string path, string name, Version shellyVersion, Type type)
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
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<Data> GetPlugSGen1(string path)
|
||||||
|
{
|
||||||
|
var data = new Data();
|
||||||
var client = new HttpClient();
|
var client = new HttpClient();
|
||||||
var response = await client.GetStringAsync(path);
|
var response = await client.GetStringAsync(path + "/status");
|
||||||
|
|
||||||
dynamic responseObject = JsonConvert.DeserializeObject(response);
|
dynamic responseObject = JsonConvert.DeserializeObject(response);
|
||||||
|
|
||||||
if (responseObject == null)
|
if (responseObject == null)
|
||||||
return sb;
|
return data;
|
||||||
|
|
||||||
if (responseObject.meters != null)
|
if (responseObject.meters != null)
|
||||||
{
|
{
|
||||||
sb.AppendLine($"meters_power_wats{{item=\"{name}\"}} {responseObject.meters[0].power}");
|
data.Power = responseObject.meters[0].power;
|
||||||
sb.AppendLine($"meters_overpower_wats{{item=\"{name}\"}} " + responseObject.meters[0].overpower);
|
data.Overpower = responseObject.meters[0].overpower;
|
||||||
sb.AppendLine($"meters_is_valid{{item=\"{name}\"}} " + (responseObject.meters[0].is_valid == "True" ? 1 : 0));
|
data.IsValid = responseObject.meters[0].is_valid;
|
||||||
sb.AppendLine($"meters_timestamp{{item=\"{name}\"}} " + responseObject.meters[0].timestamp);
|
data.Timestamp = responseObject.meters[0].timestamp;
|
||||||
sb.AppendLine($"meters_power_total{{item=\"{name}\"}} " + responseObject.meters[0].total);
|
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<Data> 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,10 @@ app.Map("/metrics", () =>
|
|||||||
|
|
||||||
foreach (var host in builder.Configuration.GetSection("Hosts").GetChildren())
|
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();
|
return sb.ToString();
|
||||||
|
|||||||
@@ -10,7 +10,15 @@
|
|||||||
"Url": "http://192.168.111.77:5050"
|
"Url": "http://192.168.111.77:5050"
|
||||||
},
|
},
|
||||||
"Hosts": {
|
"Hosts": {
|
||||||
"david": "192.168.1.60",
|
"server": {
|
||||||
"nekaj": "192.168.1.60"
|
"ip": "192.168.1.60",
|
||||||
|
"type": 1,
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"bojler": {
|
||||||
|
"ip": "192.168.1.61",
|
||||||
|
"type": 1,
|
||||||
|
"version" : 2
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user