Esempio n. 1
0
        public static void Stop()
        {
            Logging.WriteLog("ServiceCore.Stop()");

            MQTT.StopMQTT();

            Logging.WriteLog("ServiceCore.Stop() Stopped");
        }
Esempio n. 2
0
        public static void MQTTRegister()
        {
            Logging.WriteLog("ServiceCore.MQTTRegister()");

            MQTT.SendMessage("homeassistant/sensor/blueriiot/sensor_pool_temperature/config",
                             "{{\"name\":\"Pool Temperature\",\"unique_id\":\"{1}-0\",\"device\":{{\"identifiers\":[\"{1}\"],\"name\":\"{2}\",\"model\":\"Container\",\"manufacturer\":\"Blueriiot\"}},\"state_topic\":\"sarah/sensor_pool/temperature\",\"device_class\":\"temperature\",\"unit_of_measurement\":\"°C\",\"availability_topic\":\"{0}/status\"}}", _strServiceName.ToLower(), _strServiceName, _strServiceDescription);

            MQTT.SendMessage("homeassistant/sensor/blueriiot/sensor_pool_ph/config",
                             "{{\"name\":\"Pool pH\",\"unique_id\":\"{1}-1\",\"device\":{{\"identifiers\":[\"{1}\"],\"name\":\"{2}\",\"model\":\"Container\",\"manufacturer\":\"Blueriiot\"}},\"state_topic\":\"sarah/sensor_pool/ph\",\"availability_topic\":\"{0}/status\"}}", _strServiceName.ToLower(), _strServiceName, _strServiceDescription);

            MQTT.SendMessage("homeassistant/sensor/blueriiot/sensor_pool_orp/config",
                             "{{\"name\":\"Pool Orp\",\"unique_id\":\"{1}-2\",\"device\":{{\"identifiers\":[\"{1}\"],\"name\":\"{2}\",\"model\":\"Container\",\"manufacturer\":\"Blueriiot\"}},\"state_topic\":\"sarah/sensor_pool/orp\",\"unit_of_measurement\":\"mV\",\"availability_topic\":\"{0}/status\"}}", _strServiceName.ToLower(), _strServiceName, _strServiceDescription);

            MQTT.SendMessage("homeassistant/sensor/blueriiot/sensor_pool_salinity/config",
                             "{{\"name\":\"Pool Salinity\",\"unique_id\":\"{1}-3\",\"device\":{{\"identifiers\":[\"{1}\"],\"name\":\"{2}\",\"model\":\"Container\",\"manufacturer\":\"Blueriiot\"}},\"state_topic\":\"sarah/sensor_pool/salinity\",\"unit_of_measurement\":\"ppm\",\"availability_topic\":\"{0}/status\"}}", _strServiceName.ToLower(), _strServiceName, _strServiceDescription);
        }
Esempio n. 3
0
        public static async void Run(object?oState)
        {
            SwimmingPoolGetResponse bluePools;
            SwimmingPoolLastMeasurementsGetResponse blueMeasurements;
            SwimmingPoolBlueDevicesGetResponse      blueDevices;
            string   strPoolId, strDeviceId;
            DateTime dtLastUpdate;
            long     lRequestId = RequestManager.GetRequestId();
            double   dblTemperatureCelsius = 0, dblPh = 0, dblOrp = 0, dblSalinity = 0;
            int      iValidMeasurements = 0;
            TimeSpan tsLatency;

            Logging.WriteLog("BlueRiiot.Run() [0x{0}]", lRequestId.ToString("X8"));

            try
            {
                bluePools = await _blueClient.GetSwimmingPools();

                if (bluePools.Data.Count == 0)
                {
                    Logging.WriteLog("BlueRiiot.Run() [0x{0}] No pools available.", lRequestId.ToString("X8"));
                    return;
                }
                else if (bluePools.Data.Count > 1)
                {
                    Logging.WriteLog("BlueRiiot.Run() [0x{0}] Multiple pools available.", lRequestId.ToString("X8"));

                    for (int iIndex = 0; iIndex < bluePools.Data.Count; iIndex++)
                    {
                        Logging.WriteLog("BlueRiiot.Run() [0x{0}] Pool \"{1}\" ({2}) found.", lRequestId.ToString("X8"), bluePools.Data[iIndex].Name, bluePools.Data[iIndex].SwimmingPoolId);
                    }

                    return;
                }

                Logging.WriteLog("BlueRiiot.Run() [0x{0}] Pool \"{1}\" ({2}) found.", lRequestId.ToString("X8"), bluePools.Data[0].Name, bluePools.Data[0].SwimmingPoolId);

                strPoolId = bluePools.Data[0].SwimmingPool.SwimmingPoolId;
            }
            catch (Exception eException)
            {
                Logging.WriteLogError("BlueRiiot.Run()", lRequestId, eException, "Unable to enumerate swimming pools.");
                return;
            }

            try
            {
                blueDevices = await _blueClient.GetSwimmingPoolBlueDevices(strPoolId);

                if (blueDevices.Data.Count == 0)
                {
                    Logging.WriteLog("BlueRiiot.Run() [0x{0}] No blue devices available.", lRequestId.ToString("X8"));
                    return;
                }
                else if (blueDevices.Data.Count > 1)
                {
                    Logging.WriteLog("BlueRiiot.Run() [0x{0}] Multiple blue devices available.", lRequestId.ToString("X8"));

                    for (int iIndex = 0; iIndex < blueDevices.Data.Count; iIndex++)
                    {
                        Logging.WriteLog("BlueRiiot.Run() [0x{0}] Device \"{1}\" found.", lRequestId.ToString("X8"), blueDevices.Data[iIndex].BlueDeviceSerial);
                    }

                    return;
                }

                strDeviceId = blueDevices.Data[0].BlueDeviceSerial;
            }
            catch (Exception eException)
            {
                Logging.WriteLogError("BlueRiiot.Run()", lRequestId, eException, "Unable to enumerate blue devices.");
                return;
            }

            try
            {
                blueMeasurements = await _blueClient.GetBlueLastMeasurements(strPoolId, strDeviceId);

                dtLastUpdate = blueMeasurements.LastBlueMeasureTimestamp.Value.ToLocalTime();

                foreach (SwpLastMeasurements measurement in blueMeasurements.Data)
                {
                    switch (measurement.Name)
                    {
                    case "temperature":
                        if (!double.TryParse(measurement.Value.ToString(), out dblTemperatureCelsius))
                        {
                            Logging.WriteLog("BlueRiiot.Run() [0x{0}] Invalid temperature: {1}", lRequestId.ToString("X8"), measurement.Value.ToString());
                        }
                        else
                        {
                            iValidMeasurements++;
                        }

                        break;

                    case "orp":
                        if (!double.TryParse(measurement.Value.ToString(), out dblOrp))
                        {
                            Logging.WriteLog("BlueRiiot.Run() [0x{0}] Invalid orp: {1}", lRequestId.ToString("X8"), measurement.Value.ToString());
                        }
                        else
                        {
                            iValidMeasurements++;
                        }

                        break;

                    case "ph":
                        if (!double.TryParse(measurement.Value.ToString(), out dblPh))
                        {
                            Logging.WriteLog("BlueRiiot.Run() [0x{0}] Invalid ph: {1}", lRequestId.ToString("X8"), measurement.Value.ToString());
                        }
                        else
                        {
                            iValidMeasurements++;
                        }

                        break;

                    case "salinity":
                        if (!double.TryParse(measurement.Value.ToString(), out dblSalinity))
                        {
                            Logging.WriteLog("BlueRiiot.Run() [0x{0}] Invalid salinity: {1}", lRequestId.ToString("X8"), measurement.Value.ToString());
                        }
                        else
                        {
                            iValidMeasurements++;
                            dblSalinity *= 1000;
                        }

                        break;
                    }
                }

                if (iValidMeasurements == 4)
                {
                    tsLatency = DateTime.Now - dtLastUpdate;

                    Logging.WriteLog("BlueRiiot.Run() [0x{0}] Current Latency: {1} minute(s)", lRequestId.ToString("X8"), tsLatency.TotalMinutes.ToString("N1"));

                    MQTT.SendMessage("sarah/sensor_pool/temperature", dblTemperatureCelsius.ToString());

                    MQTT.SendMessage("sarah/sensor_pool/ph", dblPh.ToString());

                    MQTT.SendMessage("sarah/sensor_pool/orp", dblOrp.ToString());

                    MQTT.SendMessage("sarah/sensor_pool/salinity", dblSalinity.ToString());
                }
            }
            catch (Exception eException)
            {
                Logging.WriteLogError("BlueRiiot.Run()", lRequestId, eException, "Unable to retrieve last measurements.");
            }
        }
Esempio n. 4
0
        public static void Start()
        {
            IHost webHost;
            IConfigurationRoot configuration;
            string             strMQTTUser, strMQTTPassword, strMQTTBroker;
            string             strUser, strPassword;
            bool bMQTTTLS;

            Logging.WriteLog("ServiceCore.Start() Built: {0}", Properties.Resources.BuildDate);

            // Load Configuration
            try
            {
                configuration = new ConfigurationBuilder().AddJsonFile(_strConfigFile, false, true).Build();
            }
            catch (Exception eException)
            {
                Logging.WriteLogError("Service.Start()", eException, "Unable to build configuration instance.");
                return;
            }

            if (!Configuration.GetConfiguration(configuration, "BlueriiotUser", out strUser))
            {
                return;
            }

            if (!Configuration.GetPrivateConfiguration(configuration, "BlueriiotPassword", out strPassword))
            {
                return;
            }

            Configuration.GetOptionalConfiguration(configuration, "MQTTUser", out strMQTTUser);
            Configuration.GetPrivateOptionalConfiguration(configuration, "MQTTPassword", out strMQTTPassword);
            if (!Configuration.GetConfiguration(configuration, "MQTTBroker", out strMQTTBroker))
            {
                return;
            }
            Configuration.GetOptionalConfiguration(configuration, "MQTTTLS", out bMQTTTLS);

            MQTT.StartMQTT(strMQTTBroker, bMQTTTLS, _strServiceName, strMQTTUser, strMQTTPassword);
            BlueRiiot.Start(strUser, strPassword);

            MQTTRegister();

            try
            {
                webHost = Host.CreateDefaultBuilder().ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup <ASPNETCoreStartup>();
                }).Build();
            }
            catch (Exception eException)
            {
                Logging.WriteLogError("ServiceCore.Start()", eException, "Unable to build Kestrel instance.");
                return;
            }

            webHost.Run();

            Logging.WriteLog("ServiceCore.Start() Started");
        }