Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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();
        }
Exemplo n.º 6
0
        // 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());
        }
Exemplo n.º 7
0
        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());
        }