public static void Stop() { Logging.WriteLog("ServiceCore.Stop()"); MQTT.StopMQTT(); Logging.WriteLog("ServiceCore.Stop() Stopped"); }
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); }
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."); } }
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"); }