Пример #1
0
        private void onReceived(object sender, BasicDeliverEventArgs ea)
        {
            var config               = _appConfig.Value.MQTT;
            IBasicProperties props   = ea.BasicProperties;
            string           msgType = "";

            if (props.Headers != null)
            {
                foreach (var key in props.Headers.Keys)
                {
                    byte[] b = (byte[])props.Headers[key];
                    msgType = Encoding.Default.GetString(b);
                }
            }
            var body    = ea.Body;
            var message = Encoding.UTF8.GetString(body);

            if (msgType == "OpProp")
            {
                if (mqttWorker.MqttClient.IsConnected)
                {
                    //_logger.LogInformation(message);
                    OperatingProps opProps = JsonConvert.DeserializeObject <OperatingProps>(message);
                    mqttWorker.Update(opProps, counter);
                    counter += 1;
                    counter %= 100000;
                }
                else
                {
                    _logger.LogWarning("No Connection to Mqtt");
                }
            }
        }
Пример #2
0
        private byte[] SensorValueByte(OperatingProps opProps, string sensorName)
        {
            if (sensorName == sensorValues[11].Name)
            {
                if (opProps.inverter.ModeId == DeviceModes.Battery)
                {
                    if ((opProps.inverter.DeviceStatus1 & DeviceStatus1Flags.BatteryChargingSCC) == DeviceStatus1Flags.BatteryChargingSCC)
                    {
                        if ((opProps.battery.BatteryChargingCurrent == 0) && (opProps.battery.BatteryDischargeCurrent == 0))
                        {
                            return(Encoding.UTF8.GetBytes("Solar Only"));
                        }
                        else
                        {
                            return(Encoding.UTF8.GetBytes("Solar And Charging"));
                        }
                    }
                    else if ((opProps.inverter.DeviceStatus1 & DeviceStatus1Flags.BatteryChargingAC) == DeviceStatus1Flags.BatteryChargingAC)
                    {
                        return(Encoding.UTF8.GetBytes("Utility Charging"));
                    }
                    else
                    {
                        return(Encoding.UTF8.GetBytes("Battery"));
                    }
                }
                else
                {
                    return(Encoding.UTF8.GetBytes(opProps.inverter.Mode.ToString(CultureInfo.InvariantCulture)));
                }
            }

            return(Encoding.UTF8.GetBytes(SensorValue(opProps, sensorName).ToString(CultureInfo.InvariantCulture)));
        }
Пример #3
0
        public void Update(OperatingProps opProps, int counter)
        {
            if (MqttClient.IsConnected)
            {
                int iPeriodUpdateId = 0;
                foreach (SensorConfig sensor in sensorValues)
                {
                    string  sensorName  = $"{config.topic}/sensor/{config.devicename}_{sensor.Name}";
                    decimal sensorValue = SensorValue(opProps, sensor.Name);

                    if (sensor.HasRunningAverage)
                    {
                        periodUpdates[iPeriodUpdateId].addValue(sensorValue);
                        iPeriodUpdateId += 1;
                    }
                    if (counter % sensor.UpdatePeriod == 0)
                    {
                        // publish a message on "/home/temperature" topic with QoS 2
                        byte[] value = SensorValueByte(opProps, sensor.Name);
                        MqttClient.Publish(sensorName, value);
                    }
                }
            }
            else
            {
                _logger.Log(LogLevel.Information, "Updated paused until connected...{0}", config.server);
            }
        }
Пример #4
0
        private void EcoMonCMSPost(string msgType, string message)
        {
            if (msgType == "OpProp")
            {
                OperatingProps opProps = JsonConvert.DeserializeObject <OperatingProps>(message);
                string         json    = JsonConvert.SerializeObject(opProps.inverter, Formatting.Indented);

                string url = $"http://axpi4/input/post?node=emonpi&fulljson={{\"power1\":\"{opProps.inverter.ACOutputActivePower}\"}}&apikey=c84bdc0fc6f3d3cf7b8f88cb0073d622";
                Console.WriteLine(" [x] Sending {0}", url);

                var response = client.GetAsync(url);
            }
        }
Пример #5
0
        private decimal SensorValue(OperatingProps opProps, string sensorName)
        {
            if (sensorName == sensorValues[0].Name)
            {
                return(opProps.solar.PVInputVoltage1);
            }
            if (sensorName == sensorValues[1].Name)
            {
                return(opProps.solar.PVInputCurrentForBattery);
            }
            if (sensorName == sensorValues[2].Name)
            {
                return(opProps.solar.PVChargingPower);
            }
            if (sensorName == sensorValues[3].Name)
            {
                return(opProps.solar.BatteryVoltageFromSCC);
            }
            if (sensorName == sensorValues[4].Name)
            {
                return(opProps.inverter.ACOutputActivePower);
            }
            if (sensorName == sensorValues[5].Name)
            {
                return(opProps.battery.BusVoltage);
            }
            if (sensorName == sensorValues[6].Name)
            {
                return(opProps.enviroment.HeatSinkTemperature);
            }
            if (sensorName == sensorValues[7].Name)
            {
                return(opProps.battery.BatteryCapacity);
            }
            if (sensorName == sensorValues[8].Name)
            {
                return(opProps.battery.BatteryChargingCurrent);
            }
            if (sensorName == sensorValues[9].Name)
            {
                return(opProps.battery.BatteryDischargeCurrent);
            }
            if (sensorName == sensorValues[10].Name)
            {
                return(opProps.battery.BatteryVoltage);
            }
            if (sensorName == sensorValues[12].Name)
            {
                // time to charge. ( 100 - Battery % * Ah) / current
                if (opProps.battery.BatteryChargingCurrent > 0)
                {
                    decimal remCap  = 1 - ((decimal)opProps.battery.BatteryCapacity / 100);
                    decimal ahRem   = (remCap * inverterConfig.BatteryAmpHours);
                    decimal hRem    = (ahRem / (decimal)opProps.battery.BatteryChargingCurrent);
                    decimal minutes = hRem * 60;

                    //_logger.Log(LogLevel.Information, "Charge..{0}:{1}:{2}:{3}", remCap, ahRem, hRem, minutes);
                    return(minutes);
                }
                else
                {
                    return(0);
                }
            }
            if (sensorName == sensorValues[13].Name)
            {
                // time to discharge. ( ( Battery % - (DoD * 100) * Ah) / current
                if (opProps.battery.BatteryDischargeCurrent > 0)
                {
                    decimal capRem  = opProps.battery.BatteryCapacity - (100 * inverterConfig.DoD);
                    decimal cap     = (capRem / 100);
                    decimal ahRem   = (cap * inverterConfig.BatteryAmpHours);
                    decimal hRem    = (ahRem / (decimal)opProps.battery.BatteryDischargeCurrent);
                    decimal minutes = hRem * 60;

                    //_logger.Log(LogLevel.Information, "DisCharge..{0}:{1}:{2}:{3}", minutes, opProps.battery.BatteryCapacity, inverterConfig.BatteryAmpHours, opProps.battery.BatteryDischargeCurrent);
                    return(minutes);
                }
                else
                {
                    return(0);
                }
            }
            if (sensorName == sensorValues[14].Name)
            {
                return(opProps.inverter.GridVoltage);
            }

            return(0);
        }