2025-06-10 23:17:59 +02:00

194 lines
7.4 KiB
C#

using System.Globalization;
using M2MqttUnity;
using TMPro;
using UnityEngine;
using uPLibrary.Networking.M2Mqtt.Messages;
namespace Shared
{
public class PlantStatsScript : M2MqttUnityClient
{
public const string MqttBroker = "broker.emqx.io";
private const string MoistTopic = "esp32/moisture";
private const string TemperatureTopic = "esp32/temperature";
private const string SunlightTopic = "esp32/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 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();
}
}
}