refactor: restructure Program.cs and enhance Telemetry response format
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using GreenHome.Application;
|
||||
using System.Text;
|
||||
|
||||
namespace GreenHome.Api.Controllers;
|
||||
|
||||
@@ -29,38 +30,66 @@ public class TelemetryController : ControllerBase
|
||||
[HttpGet("AddData")]
|
||||
public async Task<ActionResult<string>> Create([FromQuery] TelemetryDto telementry, [FromQuery] string? lastUpdateDate, CancellationToken cancellationToken)
|
||||
{
|
||||
|
||||
telementry.TimestampUtc = DateTime.UtcNow;
|
||||
var id = await telemetryService.AddAsync(telementry, cancellationToken);
|
||||
|
||||
string? message;
|
||||
|
||||
var parts = new List<string> { $"ID:{id}" };
|
||||
var deviceId = telementry.DeviceId;
|
||||
if(deviceId > 0)
|
||||
|
||||
if (deviceId > 0)
|
||||
{
|
||||
message = await alertService.CheckAndSendAlertsAsync(deviceId, telementry, cancellationToken);
|
||||
if(!string.IsNullOrEmpty(message))
|
||||
// 1. Check alerts and power status
|
||||
var alertResult = await alertService.CheckAndSendAlertsAsync(deviceId, telementry, cancellationToken);
|
||||
if (alertResult != null)
|
||||
{
|
||||
return Ok(message);
|
||||
if (alertResult.Messages.Count > 0)
|
||||
{
|
||||
parts.Add($"A:{alertResult.Messages.Count}");
|
||||
parts.Add($"R:{alertResult.Recipients}");
|
||||
parts.Add($"M:{string.Join("@", alertResult.Messages)}");
|
||||
}
|
||||
|
||||
if (alertResult.PowerStatus != null)
|
||||
{
|
||||
parts.Add($"P:{alertResult.PowerStatus}");
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Check relay conditions update
|
||||
if (!string.IsNullOrEmpty(lastUpdateDate))
|
||||
{
|
||||
var parsedDate = ParseLastUpdateDate(lastUpdateDate);
|
||||
var relayConditions = await alertConditionService.GetUpdatedRelayConditionsAsync(deviceId, parsedDate, cancellationToken);
|
||||
if (relayConditions.Count > 0)
|
||||
{
|
||||
parts.Add("RU:1");
|
||||
parts.Add($"RL:{relayConditions.Count}");
|
||||
parts.Add($"RC:{EncodeRelayConditions(relayConditions)}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if relay conditions have been updated since lastUpdateDate
|
||||
if (deviceId > 0 && !string.IsNullOrEmpty(lastUpdateDate))
|
||||
return Ok(string.Join("|", parts));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encode relay conditions into a compact string format for STM32 parsing.
|
||||
/// Format: E{enabled}T{timeType}R{relay}S{sensor}O{op}V{value1}[,{value2}]
|
||||
/// Multiple conditions separated by |, multiple rules within a condition separated by &
|
||||
/// </summary>
|
||||
private static string EncodeRelayConditions(IReadOnlyList<RelayConditionDto> conditions)
|
||||
{
|
||||
return string.Join("|", conditions.Select(c =>
|
||||
{
|
||||
var parsedDate = ParseLastUpdateDate(lastUpdateDate);
|
||||
// var relayConditions = await alertConditionService.GetUpdatedRelayConditionsAsync(deviceId, parsedDate, cancellationToken);
|
||||
// if (relayConditions.Count > 0)
|
||||
// {
|
||||
// return Ok(new { conditions = relayConditions });
|
||||
// }
|
||||
|
||||
var hasUpdates = await alertConditionService.HasUpdatedConditionsAsync(deviceId, parsedDate, cancellationToken);
|
||||
if(hasUpdates)
|
||||
return Ok("Relay");
|
||||
}
|
||||
|
||||
return Ok(id + "");
|
||||
var rules = string.Join("&", c.Rules.Select(r =>
|
||||
{
|
||||
var rule = $"S{r.Sensor}O{r.Op}V{r.V1}";
|
||||
if (r.V2.HasValue)
|
||||
rule += $",{r.V2.Value}";
|
||||
return rule;
|
||||
}));
|
||||
return $"E{c.Enabled}T{c.TimeType}R{c.Relay}{rules}";
|
||||
}));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user