dodana podpora za temperaturni senzor addon, pm1
dodan nlog pinganje devicov
This commit is contained in:
@@ -1,22 +1,30 @@
|
||||
using System.Globalization;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
|
||||
namespace ShellyExporter
|
||||
{
|
||||
public class Metrics
|
||||
{
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public enum Type
|
||||
{
|
||||
PlugS = 1,
|
||||
Em3 = 2
|
||||
Em3 = 2,
|
||||
TemperatureAddon = 3,
|
||||
Pm1 = 4
|
||||
}
|
||||
|
||||
public enum Version
|
||||
{
|
||||
Gen1 = 1,
|
||||
Gen2 = 2
|
||||
Gen2 = 2,
|
||||
Gen3 = 3
|
||||
}
|
||||
|
||||
public class Data
|
||||
{
|
||||
public string? Power { get; set; }
|
||||
@@ -54,41 +62,97 @@ namespace ShellyExporter
|
||||
|
||||
}
|
||||
|
||||
public static async Task<StringBuilder> Get(string path, string name, Version shellyVersion, Type type)
|
||||
public static async Task<StringBuilder> Get(string ip, string name, Version shellyVersion, Type type, string id)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
Data data;
|
||||
switch (type)
|
||||
var online = true;
|
||||
var error = false;
|
||||
try
|
||||
{
|
||||
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;
|
||||
case Type.Em3:
|
||||
switch (shellyVersion)
|
||||
{
|
||||
case Version.Gen1:
|
||||
data = await Get3EmGen1(path);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
using var pinger = new Ping();
|
||||
var reply = pinger.Send(ip, TimeSpan.FromSeconds(2), null, null);
|
||||
if (reply.Status != IPStatus.Success)
|
||||
{
|
||||
Logger.Error($"PingDevice:Status {reply.Status}");
|
||||
online = false;
|
||||
}
|
||||
}
|
||||
catch (PingException e)
|
||||
{
|
||||
Logger.Error(e, "PingDevice");
|
||||
online = false;
|
||||
error = true;
|
||||
}
|
||||
|
||||
|
||||
var path = $"http://{ip}";
|
||||
|
||||
Data data = null;
|
||||
if (online)
|
||||
{
|
||||
try
|
||||
{
|
||||
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;
|
||||
case Type.Em3:
|
||||
switch (shellyVersion)
|
||||
{
|
||||
case Version.Gen1:
|
||||
data = await Get3EmGen1(path);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
break;
|
||||
case Type.TemperatureAddon:
|
||||
switch (shellyVersion)
|
||||
{
|
||||
case Version.Gen2:
|
||||
data = await GetTemperatureAddonGen2(path, id);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
break;
|
||||
case Type.Pm1:
|
||||
switch (shellyVersion)
|
||||
{
|
||||
case Version.Gen3:
|
||||
data = await GetPm1Gen3(path);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(type), type, null);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.Error(e, "GetDataFromDevice");
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
|
||||
sb.AppendLine($"device_online{{item=\"{name}\"}} {(online ? 1 : 0)}");
|
||||
sb.AppendLine($"device_error_retrieving_data{{item=\"{name}\"}} {(error ? 1 : 0)}");
|
||||
if (!online || error)
|
||||
return sb;
|
||||
|
||||
//Prestavljeno na sestevek vseh faz
|
||||
if (data.Power != null)
|
||||
sb.AppendLine($"meters_power_wats{{item=\"{name}\"}} {data.Power}");
|
||||
if (data.Overpower != null)
|
||||
@@ -151,6 +215,18 @@ namespace ShellyExporter
|
||||
if (data.Emeters3TotalReturned != null)
|
||||
sb.AppendLine($"emeters_3_total_returned{{item=\"{name}\"}} " + data.Emeters3TotalReturned);
|
||||
|
||||
//Ce gre za 3PM
|
||||
if (data.Power != null
|
||||
&& data is { Emeters1Power: not null, Emeters2Power: not null, Emeters3Power: not null })
|
||||
{
|
||||
var emetersPowerTotal = 0d;
|
||||
double.TryParse(data.Emeters1Power, CultureInfo.InvariantCulture, out var emeters1Power);
|
||||
double.TryParse(data.Emeters2Power, CultureInfo.InvariantCulture, out var emeters2Power);
|
||||
double.TryParse(data.Emeters3Power, CultureInfo.InvariantCulture, out var emeters3Power);
|
||||
|
||||
sb.AppendLine($"meters_power_wats{{item=\"{name}\"}} {(emeters1Power + emeters2Power + emeters3Power)}");
|
||||
}
|
||||
|
||||
return sb;
|
||||
}
|
||||
|
||||
@@ -269,5 +345,54 @@ namespace ShellyExporter
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
private static async Task<Data> GetTemperatureAddonGen2(string path, string id)
|
||||
{
|
||||
var data = new Data();
|
||||
var client = new HttpClient();
|
||||
var response = await client.GetStringAsync(path + $"/rpc/Temperature.GetStatus?id={id}");
|
||||
|
||||
var responseObject = JsonConvert.DeserializeObject<Classes.TemperatureGetStatusResponse>(response);
|
||||
|
||||
if (responseObject == null)
|
||||
return data;
|
||||
|
||||
if (responseObject.TemperatureC != null)
|
||||
data.Temperature = responseObject.TemperatureC;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
private static async Task<Data> GetPm1Gen3(string path)
|
||||
{
|
||||
var data = new Data();
|
||||
var client = new HttpClient();
|
||||
var response = await client.GetStringAsync(path + "/rpc/PM1.GetStatus?id=0");
|
||||
|
||||
var responseObject = JsonConvert.DeserializeObject<Classes.Pm1GetStatusResponse>(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.MinuteTimeStamp!= null)
|
||||
data.Timestamp = responseObject.Aenergy.MinuteTimeStamp;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user