[NF] Nun mit erster Ausgabe
This commit is contained in:
parent
d460255d83
commit
07ab463ac1
@ -4,24 +4,43 @@ using LitJson;
|
|||||||
|
|
||||||
namespace Mqtt_SWB_Dashboard {
|
namespace Mqtt_SWB_Dashboard {
|
||||||
class DevicePower {
|
class DevicePower {
|
||||||
public DevicePower(DateTime t, Double p, Double c) {
|
public enum DevType {
|
||||||
this.TimeStamp = t;
|
State,
|
||||||
this.Power = p;
|
Consumption,
|
||||||
this.Comul = c;
|
Production
|
||||||
}
|
}
|
||||||
|
|
||||||
public DevicePower(JsonData t, JsonData p, JsonData c) {
|
public DevicePower(JsonData data, DevType type) {
|
||||||
this.Update(t, p, c);
|
this.TimeStamp = new DateTime();
|
||||||
|
this.Power = 0;
|
||||||
|
this.Comul = 0;
|
||||||
|
this.Status = false;
|
||||||
|
this.Production = 0;
|
||||||
|
this.Type = type;
|
||||||
|
this.Update(data, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateTime TimeStamp { get; set; }
|
public DateTime TimeStamp { get; private set; }
|
||||||
public Double Power { get; set; }
|
public Boolean Status { get; private set; }
|
||||||
public Double Comul { get; set; }
|
public Double Production { get; private set; }
|
||||||
|
public DevType Type { get; private set; }
|
||||||
|
public Double Power { get; private set; }
|
||||||
|
public Double Comul { get; private set; }
|
||||||
|
|
||||||
internal void Update(JsonData t, JsonData p, JsonData c) {
|
internal void Update(JsonData data, DevType type) {
|
||||||
this.TimeStamp = DateTime.Parse(t.ToString());
|
this.TimeStamp = DateTime.Parse(data["timestamp"].ToString());
|
||||||
this.Power = Double.Parse(p.ToString(), new CultureInfo("en-US"));
|
if (type == DevType.State) {
|
||||||
this.Comul = Double.Parse(c.ToString(), new CultureInfo("en-US"));
|
this.Status = data["status"].ToString() == "active" ? true : false;
|
||||||
|
}
|
||||||
|
if(type == DevType.Consumption) {
|
||||||
|
this.Power = Double.Parse(data["power"].ToString(), new CultureInfo("en-US"));
|
||||||
|
this.Comul = Double.Parse(data["energyCumul"].ToString(), new CultureInfo("en-US"));
|
||||||
|
}
|
||||||
|
if(type == DevType.Production) {
|
||||||
|
this.Power = Double.Parse(data["power"].ToString(), new CultureInfo("en-US"));
|
||||||
|
this.Comul = Double.Parse(data["energyCumulative"].ToString(), new CultureInfo("en-US"));
|
||||||
|
this.Production = Double.Parse(data["productionCumulative"].ToString(), new CultureInfo("en-US"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -7,6 +7,9 @@
|
|||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="MainWindow" Height="350" Width="525">
|
Title="MainWindow" Height="350" Width="525">
|
||||||
<Grid>
|
<Grid>
|
||||||
|
<TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="Haushalte" VerticalAlignment="Top" Width="60"/>
|
||||||
|
<TextBlock HorizontalAlignment="Left" Margin="75,10,0,0" TextWrapping="Wrap" Text="Geräte" VerticalAlignment="Top" Width="40"/>
|
||||||
|
<TextBlock x:Name="countHouses" HorizontalAlignment="Left" Margin="10,31,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="60" TextAlignment="Center"/>
|
||||||
|
<TextBlock x:Name="countDevices" HorizontalAlignment="Left" Margin="75,31,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="40" TextAlignment="Center"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
@ -1,17 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
|
||||||
using System.Windows.Data;
|
|
||||||
using System.Windows.Documents;
|
|
||||||
using System.Windows.Input;
|
|
||||||
using System.Windows.Media;
|
|
||||||
using System.Windows.Media.Imaging;
|
|
||||||
using System.Windows.Navigation;
|
|
||||||
using System.Windows.Shapes;
|
|
||||||
|
|
||||||
namespace Mqtt_SWB_Dashboard {
|
namespace Mqtt_SWB_Dashboard {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -21,6 +9,14 @@ namespace Mqtt_SWB_Dashboard {
|
|||||||
public MainWindow() {
|
public MainWindow() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Stats s = new Stats(new Mosquitto());
|
Stats s = new Stats(new Mosquitto());
|
||||||
|
s.UpdatedConsumption += this.S_UpdatedConsumption;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void S_UpdatedConsumption(Stats sender, EventArgs e) {
|
||||||
|
this.Dispatcher.BeginInvoke((Action)(() => {
|
||||||
|
this.countHouses.Text = sender.GetNumberHouseholds().ToString();
|
||||||
|
this.countDevices.Text = sender.GetNumberDevices().ToString();
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,8 @@ namespace Mqtt_SWB_Dashboard {
|
|||||||
internal class Stats {
|
internal class Stats {
|
||||||
private Dictionary<String, Dictionary<Int32, DevicePower>> household;
|
private Dictionary<String, Dictionary<Int32, DevicePower>> household;
|
||||||
|
|
||||||
public delegate void UpdateMessage(Object sender, EventArgs e);
|
public delegate void UpdateMessage(Stats sender, EventArgs e);
|
||||||
public event UpdateMessage UpdatedData;
|
public event UpdateMessage UpdatedConsumption;
|
||||||
|
|
||||||
public Stats(Mosquitto mosquitto) {
|
public Stats(Mosquitto mosquitto) {
|
||||||
this.household = new Dictionary<String, Dictionary<Int32, DevicePower>>();
|
this.household = new Dictionary<String, Dictionary<Int32, DevicePower>>();
|
||||||
@ -25,32 +25,53 @@ namespace Mqtt_SWB_Dashboard {
|
|||||||
this.GatewayPing(e);
|
this.GatewayPing(e);
|
||||||
} else if (Regex.Match(e.Topic, "/flex4grid/v1/households/.*/connection").Success) {
|
} else if (Regex.Match(e.Topic, "/flex4grid/v1/households/.*/connection").Success) {
|
||||||
this.HouseholdPing(e);
|
this.HouseholdPing(e);
|
||||||
} else if (Regex.Match(e.Topic, "/flex4grid/v1/households/.*/consumption").Success) {
|
} else if (Regex.Match(e.Topic, "/flex4grid/v1/households/.*/consumption").Success ||
|
||||||
|
Regex.Match(e.Topic, "/flex4grid/v1/households/.*/device/consumption").Success ||
|
||||||
|
Regex.Match(e.Topic, "/flex4grid/v1/households/.*/device/state").Success) {
|
||||||
this.HouseholdConsumption(e);
|
this.HouseholdConsumption(e);
|
||||||
} else if (Regex.Match(e.Topic, "/flex4grid/v1/households/.*/device/state").Success ||
|
|
||||||
Regex.Match(e.Topic, "/flex4grid/v1/households/.*/device/consumption").Success) {
|
|
||||||
this.DeviceStatus(e);
|
|
||||||
} else {
|
} else {
|
||||||
throw new NotImplementedException(e.Topic);
|
throw new NotImplementedException(e.Topic);
|
||||||
}//
|
}//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal Int32 GetNumberDevices() {
|
||||||
|
Int32 ret = 0;
|
||||||
|
foreach (KeyValuePair<String, Dictionary<Int32, DevicePower>> item in this.household) {
|
||||||
|
ret += item.Value.Count;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal Int32 GetNumberHouseholds() {
|
||||||
|
return this.household.Count;
|
||||||
|
}
|
||||||
|
|
||||||
private void HouseholdConsumption(MqttEventArgs e) {
|
private void HouseholdConsumption(MqttEventArgs e) {
|
||||||
String id = Regex.Match(e.Topic, "/flex4grid/v1/households/(.*)/consumption").Groups[1].Value;
|
Match m = Regex.Match(e.Topic, "/flex4grid/v1/households/([^/]*)/(consumption|device/(consumption|state))");
|
||||||
|
String id = m.Groups[1].Value;
|
||||||
|
DevicePower.DevType dtype = DevicePower.DevType.Consumption;
|
||||||
|
if (m.Groups[2].Value == "consumption") {
|
||||||
|
dtype = DevicePower.DevType.Production;
|
||||||
|
} else if(m.Groups[3].Value == "consumption") {
|
||||||
|
dtype = DevicePower.DevType.Consumption;
|
||||||
|
} else if(m.Groups[3].Value == "state") {
|
||||||
|
dtype = DevicePower.DevType.State;
|
||||||
|
}
|
||||||
JsonData stuff = JsonMapper.ToObject(e.Message);
|
JsonData stuff = JsonMapper.ToObject(e.Message);
|
||||||
Int32 did = Int32.Parse(stuff["id"].ToString());
|
Int32 did = Int32.Parse(stuff["id"].ToString());
|
||||||
if (this.household.Keys.Contains(id)) {
|
if (this.household.Keys.Contains(id)) {
|
||||||
if (this.household[id].Keys.Contains(did)) {
|
if (this.household[id].Keys.Contains(did)) {
|
||||||
this.household[id][did].Update(stuff["timestamp"], stuff["power"], stuff["energyCumul"]);
|
this.household[id][did].Update(stuff, dtype);
|
||||||
} else {
|
} else {
|
||||||
this.household[id].Add(did, new DevicePower(stuff["timestamp"], stuff["power"], stuff["energyCumul"]));
|
this.household[id].Add(did, new DevicePower(stuff, dtype));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Dictionary<int, DevicePower> d = new Dictionary<int, DevicePower>();
|
Dictionary<Int32, DevicePower> d = new Dictionary<Int32, DevicePower> {
|
||||||
d.Add(did, new DevicePower(stuff["timestamp"], stuff["power"], stuff["energyCumul"]));
|
{ did, new DevicePower(stuff, dtype) }
|
||||||
|
};
|
||||||
this.household.Add(id, d);
|
this.household.Add(id, d);
|
||||||
}
|
}
|
||||||
this.UpdatedData?.Invoke(this, null);
|
this.UpdatedConsumption?.Invoke(this, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeviceStatus(MqttEventArgs e) {
|
private void DeviceStatus(MqttEventArgs e) {
|
||||||
|
Loading…
Reference in New Issue
Block a user