194 lines
7.4 KiB
C#
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();
|
|
}
|
|
}
|
|
} |