public void Test_Alarm_PowerFail() { var dataService = new MockDataService(); var spg = new SparkPlugGenerator(new MockLogger(), dataService, publishTopic); var inputMqtt = new MockMQTTWrapper(); var outputMqtt = new MockMQTTWrapper(); var deviceEUI = "123"; inputMqtt.MessageReceived += spg.ProcessMessage; spg.MessageProcessed += outputMqtt.Publish; outputMqtt.MessagePublished += OnMessagePublished; var alarmMessage = new Ppuplink.AlarmMessage() { Deviceeui = deviceEUI, Timesent = 1612234855, Alarmtype = "powerfailalarm", Phaseid = 1, Value = 0 }; // trigger DBIRTH and alarm var topic = $"application/powerpilot/uplink/alarm/{deviceEUI}"; inputMqtt.InjectMessage(new MQTTMessageArgs(topic, alarmMessage.ToByteArray())); Thread.Sleep(10); var messages = outputMqtt.GetMessagesReceived(); // expect alarm var alarm = messages.Find(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DDATA}/PowerPilotCS/{deviceEUI}"); Assert.NotNull(alarm); var payload = Payload.Parser.ParseFrom(alarm.Payload); Assert.Single(payload.Metrics); Assert.Equal($"{Alarm.TYPE}/1/{Alarm.POWER_FAIL}", payload.Metrics[0].Name); // expect DDEATH var ddeath = messages.Find(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DDEATH}/PowerPilotCS/{deviceEUI}"); Assert.NotNull(ddeath); }
public void Test_Alarm_NormalVoltage() { var dataService = new MockDataService(); var spg = new SparkPlugGenerator(new MockLogger(), dataService, publishTopic); var inputMqtt = new MockMQTTWrapper(); var outputMqtt = new MockMQTTWrapper(); var deviceEUI = "123"; inputMqtt.MessageReceived += spg.ProcessMessage; spg.MessageProcessed += outputMqtt.Publish; outputMqtt.MessagePublished += OnMessagePublished; var alarmMessage = new Ppuplink.AlarmMessage() { Deviceeui = deviceEUI, Timesent = 1612234855, Alarmtype = "normalvoltage", Phaseid = 1, Value = 237.3 }; // trigger DBIRTH and alarm var topic = $"application/powerpilot/uplink/alarm/{deviceEUI}"; inputMqtt.InjectMessage(new MQTTMessageArgs(topic, alarmMessage.ToByteArray())); Thread.Sleep(10); var messages = outputMqtt.GetMessagesReceived(); // expect alarm var alarm = messages.Find(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DDATA}/PowerPilotCS/{deviceEUI}"); Assert.NotNull(alarm); var payload = Payload.Parser.ParseFrom(alarm.Payload); Assert.Single(payload.Metrics); Assert.Equal($"{Alarm.TYPE}/1/{Alarm.VOLTAGE_NORMAL}", payload.Metrics[0].Name); // should have extra DBIRTH for coming back to life Assert.Equal(3, outputMqtt.GetNumPublishedMessages()); }
public void Test_NBIRTH() { var spg = new SparkPlugGenerator(new MockLogger(), new MockDataService(), publishTopic); var inputMqtt = new MockMQTTWrapper(); var outputMqtt = new MockMQTTWrapper(); inputMqtt.MQTTConnected += spg.OnMQTTClientConnected; spg.MessageProcessed += outputMqtt.Publish; // mock connection event inputMqtt.Connect(); // expect NBIRTH message to be published Assert.Equal(1, outputMqtt.GetNumPublishedMessages()); var receivedMessages = outputMqtt.GetMessagesReceived(); Assert.Equal("spBv1.0/DTX/NBIRTH/PowerPilotCS", receivedMessages[0].Topic); //var payload = Payload.Parser.ParseFrom(lastMessage.Payload); //Assert.Equal((ulong)1, payload.Seq); }
public void Test_PQ() { var dataService = new MockDataService(); var spg = new SparkPlugGenerator(new MockLogger(), dataService, publishTopic); var inputMqtt = new MockMQTTWrapper(); var outputMqtt = new MockMQTTWrapper(); var deviceEUI = "123"; inputMqtt.MessageReceived += spg.ProcessMessage; spg.MessageProcessed += outputMqtt.Publish; outputMqtt.MessagePublished += OnMessagePublished; var pqMsg = new Ppuplink.PQMessage() { Deviceeui = deviceEUI, Timesent = 1612234855, Currentmax = 10, Voltagemax = 250.0, Phaseid = 1 }; dataService.PQ = pqMsg; // trigger DBIRTH and PQ var topic = $"application/powerpilot/uplink/pq/{deviceEUI}"; inputMqtt.InjectMessage(new MQTTMessageArgs(topic, pqMsg.ToByteArray())); Thread.Sleep(10); var messages = outputMqtt.GetMessagesReceived(); // expect pq var pq = messages.Find(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DDATA}/PowerPilotCS/{deviceEUI}"); Assert.NotNull(pq); var payload = Payload.Parser.ParseFrom(pq.Payload); Assert.Equal(17, payload.Metrics.Count); }
public async static Task Main(string[] args) { Environment.SetEnvironmentVariable("mqttPowerpilotHostname", "mosquitto"); Environment.SetEnvironmentVariable("mqttPowerpilotPort", "8883"); Environment.SetEnvironmentVariable("mqttPowerpilotUser", "superAdmin"); Environment.SetEnvironmentVariable("mqttPowerpilotPassword", "powerpilot"); Environment.SetEnvironmentVariable("powerpilotSecure", "true"); Environment.SetEnvironmentVariable("powerpilotTopic", "application/powerpilot/uplink/#"); Environment.SetEnvironmentVariable("mqttSparkplugHostname", "mosquitto"); Environment.SetEnvironmentVariable("mqttSparkplugPort", "8883"); Environment.SetEnvironmentVariable("mqttSparkplugUser", "superAdmin"); Environment.SetEnvironmentVariable("mqttSparkplugPassword", "powerpilot"); Environment.SetEnvironmentVariable("sparkplugSecure", "true"); Environment.SetEnvironmentVariable("sparkplugTopic", "spBv1.0/DTX/{0}/PowerPilotCS/{1}"); Environment.SetEnvironmentVariable("binaryServiceAddress", "http://binaryprotocol-service:5000"); Environment.SetEnvironmentVariable("loggerServiceAddress", "http://logger-service:9031"); Environment.SetEnvironmentVariable("dataServiceUrl", "https://data.devpower.powerpilot.nz"); Environment.SetEnvironmentVariable("dataServiceToken", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoid2ViX3VzZXIiLCJ1c2VyIjoidGltYyJ9.eKUu_Iw3bk-5oxj7HAmOE4QZjd0rNsyXUWQpDB7QYUA"); foreach (System.Collections.DictionaryEntry env in Environment.GetEnvironmentVariables()) { string name = (string)env.Key; string value = (string)env.Value; if (name.StartsWith("mqtt") || name.StartsWith("subscribe") || name.StartsWith("sparkplug")) { Console.WriteLine("{0}={1}", name, value); } } var mqttPowerpilotHostname = Environment.GetEnvironmentVariable("mqttPowerpilotHostname"); var mqttPowerpilotPort = Int32.Parse(Environment.GetEnvironmentVariable("mqttPowerpilotPort")); var mqttPowerpilotUser = Environment.GetEnvironmentVariable("mqttPowerpilotUser"); var mqttPowerpilotPassword = Environment.GetEnvironmentVariable("mqttPowerpilotPassword"); var powerpilotSecure = Environment.GetEnvironmentVariable("powerpilotSecure"); var powerpilotTopic = Environment.GetEnvironmentVariable("powerpilotTopic"); var mqttSparkplugHostname = Environment.GetEnvironmentVariable("mqttSparkplugHostname"); var mqttSparkplugPort = Int32.Parse(Environment.GetEnvironmentVariable("mqttSparkplugPort")); var mqttSparkplugUser = Environment.GetEnvironmentVariable("mqttSparkplugUser"); var mqttSparkplugPassword = Environment.GetEnvironmentVariable("mqttSparkplugPassword"); var sparkplugSecure = Environment.GetEnvironmentVariable("sparkplugSecure"); var sparkplugTopic = Environment.GetEnvironmentVariable("sparkplugTopic"); var dataServiceUrl = Environment.GetEnvironmentVariable("dataServiceUrl"); var dataServiceToken = Environment.GetEnvironmentVariable("dataServiceToken"); // logger var loggerAddress = Environment.GetEnvironmentVariable("loggerServiceAddress"); var loggerClient = new LoggerClient(loggerAddress, "MqttToSparkPlug"); // mqtt client for receiving powerpilot format messages var mqttPowerpilotWrapper = await MQTTClientWrapperFactory.GetNewMQTTClientWrapper(mqttPowerpilotUser, mqttPowerpilotPassword, mqttPowerpilotHostname, mqttPowerpilotPort, true, loggerClient); await mqttPowerpilotWrapper.Subscribe(powerpilotTopic); // mqtt client for sending sparkplug format messages var mqttSparkplugWrapper = await MQTTClientWrapperFactory.GetNewMQTTClientWrapper(mqttSparkplugUser, mqttSparkplugPassword, mqttSparkplugHostname, mqttSparkplugPort, true, loggerClient); // subscribe to commands - spBv1.0/DTX/DCMD/PowerPilotCS/+ await mqttSparkplugWrapper.Subscribe(string.Format(sparkplugTopic, SparkPlugMessageTypes.DCMD, "+")); // data service client HttpClient httpClient = new HttpClient(); var dataServiceClient = new DataServiceClient(httpClient, dataServiceUrl, dataServiceToken); // sparkplug generator var sparkPlugGenerator = new SparkPlugGenerator(loggerClient, dataServiceClient, sparkplugTopic); // pipe messages mqttSparkplugWrapper.MQTTConnected += sparkPlugGenerator.OnMQTTClientConnected; mqttPowerpilotWrapper.MessageReceived += sparkPlugGenerator.ProcessMessage; sparkPlugGenerator.MessageProcessed += mqttSparkplugWrapper.Publish; // commands mqttSparkplugWrapper.MessageReceived += sparkPlugGenerator.ProcessMessage; CreateHostBuilder(args).Build().Run(); }
// Test that a DBIRTH can be sent if there ARE existing messages in the db public void Test_DBIRTH_ExistingValues() { var dataService = new MockDataService(); var spg = new SparkPlugGenerator(new MockLogger(), dataService, publishTopic); var inputMqtt = new MockMQTTWrapper(); var outputMqtt = new MockMQTTWrapper(); var deviceEUI = "123"; inputMqtt.MessageReceived += spg.ProcessMessage; spg.MessageProcessed += outputMqtt.Publish; outputMqtt.MessagePublished += OnMessagePublished; var energyMsg = new Ppuplink.EnergyMessage() { Deviceeui = deviceEUI, Phaseid = 1, Timesent = 1612234855, Energyexportreactive = 1, Energyexportreal = 1, Energyimportreactive = 1, Energyimportreal = 1 }; dataService.Energy = energyMsg; var pqMsg = new Ppuplink.PQMessage() { Deviceeui = deviceEUI, Timesent = 1612234855, Currentmax = 10, Voltagemax = 250.0, Phaseid = 1 }; dataService.PQ = pqMsg; var uplinkMsg = new Ppuplink.UplinkMessage() { Deviceeui = deviceEUI, Timesent = 1612234855, Fctn = 1, Messageid = 1, Rssi = 10, Snr = -10, Frequency = 8000, Messagetype = 32 }; dataService.Uplink = uplinkMsg; var voltageStats = new Ppuplink.VoltageStatsMessage() { Deviceeui = deviceEUI, Timesent = 1612234855, Starttime = "2021/01/01", Stoptime = "2021/01/02", H0213 = 1, H213215 = 1 }; dataService.Uplink = uplinkMsg; // trigger DBIRTH and energy var topic = $"application/powerpilot/uplink/energy/{deviceEUI}"; inputMqtt.InjectMessage(new MQTTMessageArgs(topic, energyMsg.ToByteArray())); Thread.Sleep(10); var messages = outputMqtt.GetMessagesReceived(); // expect DBIRTH var dbirth = messages.Find(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DBIRTH}/PowerPilotCS/{deviceEUI}"); Assert.NotNull(dbirth); var payload = Payload.Parser.ParseFrom(dbirth.Payload); Assert.Equal(53, payload.Metrics.Count); // expect energy var energy = messages.Find(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DDATA}/PowerPilotCS/{deviceEUI}"); Assert.NotNull(energy); payload = Payload.Parser.ParseFrom(energy.Payload); Assert.Equal(4, payload.Metrics.Count); Assert.Equal(2, outputMqtt.GetNumPublishedMessages()); }
public void Test_REBIRTH() { var dataService = new MockDataService(); var spg = new SparkPlugGenerator(new MockLogger(), dataService, publishTopic); var inputMqtt = new MockMQTTWrapper(); var outputMqtt = new MockMQTTWrapper(); var deviceEUI = "123"; inputMqtt.MessageReceived += spg.ProcessMessage; spg.MessageProcessed += outputMqtt.Publish; outputMqtt.MessagePublished += OnMessagePublished; // trigger initial DBIRTH var energyMsg = new Ppuplink.EnergyMessage() { Deviceeui = deviceEUI, Phaseid = 1, Timesent = 1612234855, Energyexportreactive = 1, Energyexportreal = 1, Energyimportreactive = 1, Energyimportreal = 1 }; // trigger DBIRTH and energy var topic = $"application/powerpilot/uplink/energy/{deviceEUI}"; inputMqtt.InjectMessage(new MQTTMessageArgs(topic, energyMsg.ToByteArray())); Thread.Sleep(10); var messages = outputMqtt.GetMessagesReceived(); // expect energy var energy = messages.Find(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DDATA}/PowerPilotCS/{deviceEUI}"); Assert.NotNull(energy); var payload = Payload.Parser.ParseFrom(energy.Payload); Assert.Equal(4, payload.Metrics.Count); // send REBIRTH cmd var metric = new Payload.Types.Metric() { Name = $"{DeviceCommands.TYPE}/{DeviceCommands.REBIRTH}", Timestamp = 1612234855 }; Payload cmdPayload = new Payload() { Seq = 1, Timestamp = (ulong)DateTimeOffset.Now.ToUnixTimeSeconds(), }; cmdPayload.Metrics.Add(metric); topic = $"spBv1.0/DTX/{SparkPlugMessageTypes.DCMD}/PowerPilotCS/{deviceEUI}"; inputMqtt.InjectMessage(new MQTTMessageArgs(topic, cmdPayload.ToByteArray())); Thread.Sleep(10); messages = outputMqtt.GetMessagesReceived(); // expect second DBIRTH var dbirths = messages.Where(m => m.Topic == $"spBv1.0/DTX/{SparkPlugMessageTypes.DBIRTH}/PowerPilotCS/{deviceEUI}"); Assert.Equal(2, dbirths.Count()); }