using System; using System.Globalization; using M2MqttUnity; using TMPro; using UnityEngine; using uPLibrary.Networking.M2Mqtt.Messages; namespace PlantStats { public class PlantStatsManager : M2MqttUnityClient { public const string MqttBroker = "broker.emqx.io"; private const string MoistTopic = "steves_test_server_99/moisture"; private const string TemperatureTopic = "steves_test_server_99/temperature"; private const string SunlightTopic = "steves_test_server_99/sunlight"; private const string ExcellentColor = "#00C027"; private const string GoodColor = "#75b400"; private const string OkayColor = "#b4a200"; private const string BadColor = "#b43c00"; private const string WorstColor = "#C00600"; [Header("Plant stat labels")] public TextMeshProUGUI temperatureValueText; public TextMeshProUGUI moistureValueText; public TextMeshProUGUI sunlightValueText; private ApplicationManager _applicationManager; protected override void Awake() { _applicationManager = FindFirstObjectByType(); if (_applicationManager == null) Debug.LogError("[DCDC] ApplicationManager component not found."); } private void OnValidate() { brokerAddress = MqttBroker; autoConnect = true; } protected override void Start() { AddUiMessage("Ready."); base.Start(); } protected override void SubscribeTopics() { client.Subscribe(new[] { MoistTopic, TemperatureTopic, SunlightTopic }, new[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); } protected override void UnsubscribeTopics() { client.Unsubscribe(new[] { MoistTopic, TemperatureTopic, SunlightTopic }); } protected override void DecodeMessage(string topic, byte[] message) { var msg = System.Text.Encoding.UTF8.GetString(message); switch (topic) { case MoistTopic when int.TryParse(msg, out var moistureValue): var moistureValueStr = moistureValue.ToString(); Color moistureValueColor; switch (moistureValue) { case < 20: ColorUtility.TryParseHtmlString(WorstColor, out moistureValueColor); break; case < 40: ColorUtility.TryParseHtmlString(BadColor, out moistureValueColor); break; case < 50: ColorUtility.TryParseHtmlString(OkayColor, out moistureValueColor); break; case < 70: ColorUtility.TryParseHtmlString(ExcellentColor, out moistureValueColor); break; case < 80: ColorUtility.TryParseHtmlString(GoodColor, out moistureValueColor); break; case < 90: ColorUtility.TryParseHtmlString(OkayColor, out moistureValueColor); break; default: ColorUtility.TryParseHtmlString(WorstColor, out moistureValueColor); break; } moistureValueText.text = moistureValueStr; moistureValueText.color = moistureValueColor; break; case MoistTopic: // moistureValueText.text = moistureValueStr; // moistureValueText.color = moistureValueColor; break; case TemperatureTopic when float.TryParse(msg, out var temperatureValue): var temperatureValueStr = temperatureValue.ToString(CultureInfo.CurrentCulture); Color temperatureValueColor; switch (temperatureValue) { case < 20: ColorUtility.TryParseHtmlString(WorstColor, out temperatureValueColor); break; case < 25: ColorUtility.TryParseHtmlString(BadColor, out temperatureValueColor); break; case < 30: ColorUtility.TryParseHtmlString(OkayColor, out temperatureValueColor); break; case < 35: ColorUtility.TryParseHtmlString(GoodColor, out temperatureValueColor); break; default: ColorUtility.TryParseHtmlString(ExcellentColor, out temperatureValueColor); break; } temperatureValueText.text = temperatureValueStr; temperatureValueText.color = temperatureValueColor; break; case TemperatureTopic: break; case SunlightTopic when float.TryParse(msg, out var sunlightValue): var sunlightValueStr = sunlightValue.ToString(CultureInfo.CurrentCulture); Color sunlightValueColor; switch (sunlightValue) { case < 20: ColorUtility.TryParseHtmlString(WorstColor, out sunlightValueColor); break; case < 25: ColorUtility.TryParseHtmlString(BadColor, out sunlightValueColor); break; case < 30: ColorUtility.TryParseHtmlString(OkayColor, out sunlightValueColor); break; case < 35: ColorUtility.TryParseHtmlString(GoodColor, out sunlightValueColor); break; default: ColorUtility.TryParseHtmlString(ExcellentColor, out sunlightValueColor); break; } sunlightValueText.text = sunlightValueStr; sunlightValueText.color = sunlightValueColor; break; case SunlightTopic: break; } } private static void AddUiMessage(string msg, bool isError = false) { if (isError) Debug.LogError("MQTT: " + msg); else Debug.LogWarning("MQTT: " + msg); } protected override void OnConnecting() { base.OnConnecting(); AddUiMessage("Connecting to broker on " + brokerAddress + ":" + brokerPort); } protected override void OnConnected() { base.OnConnected(); AddUiMessage("Connected to broker on " + brokerAddress); } protected override void OnConnectionFailed(string errorMessage) { AddUiMessage("CONNECTION FAILED! " + errorMessage, true); } protected override void OnDisconnected() { AddUiMessage("Disconnected."); } protected override void OnConnectionLost() { AddUiMessage("CONNECTION LOST!", true); } private void OnDestroy() { Disconnect(); } } }