Пример #1
0
        private Payload AddPQMetrics(Ppuplink.PQMessage pqMessage, Payload payload, PowerPilotCommon.Models.PostgreSQL.Connection connection)
        {
            var   phaseID = GetPhase(pqMessage.Phaseid, connection).ToString();
            ulong timestamp;

            if (pqMessage == null)
            {
                timestamp = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now);
            }
            else
            {
                timestamp = pqMessage.Timesent;
            }

            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.VOLTAGE_MAX, pqMessage?.Voltagemax, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.VOLTAGE_MIN, pqMessage?.Voltagemin, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.VOLTAGE_AVG, pqMessage?.Voltagesma, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.CURRENT_AVG, pqMessage?.Currentsma, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.ACTIVE_POWER_MAX, pqMessage?.Poweractivemax, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.ACTIVE_POWER_MIN, pqMessage?.Poweractivemin, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.ACTIVE_POWER_AVG, pqMessage?.Poweractivesma, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.REACTIVE_POWER_MAX, pqMessage?.Powerreactivemax, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.REACTIVE_POWER_MIN, pqMessage?.Powerreactivemin, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.REACTIVE_POWER_AVG, pqMessage?.Powerreactivesma, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.THDV_MAX, pqMessage?.Thdvmax, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.THDV_MIN, pqMessage?.Thdvmin, timestamp));
            payload.Metrics.Add(GetMetricDouble(PQ.TYPE, phaseID, PQ.THDV_AVG, pqMessage?.Thdvsma, timestamp));

            uint?sag          = (uint?)pqMessage?.Momentarysag + (uint?)pqMessage?.Temporarysag;
            uint?swell        = (uint?)pqMessage?.Momentaryswell + (uint?)pqMessage?.Temporaryswell;
            uint?underVoltage = (uint?)pqMessage?.Sustainedundervoltage + (uint?)pqMessage?.Prolongedundervoltage;
            uint?overVoltage  = (uint?)pqMessage?.Sustainedovervoltage + (uint?)pqMessage?.Prolongedovervoltage;

            payload.Metrics.Add(GetMetricInt(PQ.TYPE, phaseID, PQ.SAG, sag, timestamp));
            payload.Metrics.Add(GetMetricInt(PQ.TYPE, phaseID, PQ.SWELL, swell, timestamp));
            payload.Metrics.Add(GetMetricInt(PQ.TYPE, phaseID, PQ.UNDER_VOLTAGE, underVoltage, timestamp));
            payload.Metrics.Add(GetMetricInt(PQ.TYPE, phaseID, PQ.OVER_VOLTAGE, overVoltage, timestamp));

            return(payload);
        }
Пример #2
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);
        }
Пример #3
0
        private async Task <Payload> GetPhaseMessages(PowerPilotCommon.Models.PostgreSQL.Connection connection, Payload payload, uint line)
        {
            int phase = GetPhase(line, connection);
            var pq    = await _dataService.GetPQ(connection.DeviceEUI, phase);

            if (pq == null)
            {
                pq = new Ppuplink.PQMessage()
                {
                    Phaseid  = line,
                    Timesent = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now),
                };
            }
            payload = AddPQMetrics(pq, payload, connection);

            var voltagestats = await _dataService.GetVoltageStats(connection.DeviceEUI, phase);

            if (voltagestats == null)
            {
                voltagestats = new Ppuplink.VoltageStatsMessage()
                {
                    Phaseid  = line,
                    Timesent = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now),
                };
            }
            payload = AddVoltageStatsMetrics(voltagestats, payload, connection);

            // alarms
            var highvoltage = new Ppuplink.AlarmMessage()
            {
                Timesent  = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now),
                Phaseid   = line,
                Alarmtype = "highvoltagealarm"
            };

            payload = AddAlarmMetrics(highvoltage, payload, connection);

            var lowvoltage = new Ppuplink.AlarmMessage()
            {
                Timesent  = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now),
                Phaseid   = line,
                Alarmtype = "lowvoltagealarm"
            };

            payload = AddAlarmMetrics(lowvoltage, payload, connection);

            var powerfail = new Ppuplink.AlarmMessage()
            {
                Timesent  = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now),
                Phaseid   = line,
                Alarmtype = "powerfailalarm"
            };

            payload = AddAlarmMetrics(powerfail, payload, connection);

            var normalvoltage = new Ppuplink.AlarmMessage()
            {
                Timesent  = (ulong)DataServiceClient.ConvertToTimestamp(DateTime.Now),
                Phaseid   = line,
                Alarmtype = "normalvoltage"
            };

            payload = AddAlarmMetrics(normalvoltage, payload, connection);

            return(payload);
        }
Пример #4
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());
        }