refactor: restructure Program.cs and enhance Telemetry response format

This commit is contained in:
2026-06-01 18:16:30 +03:30
parent 97a946ebea
commit 4df537816f
2 changed files with 155 additions and 112 deletions

View File

@@ -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>