using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.ComponentModel; namespace hassio_onedrive_backup.Hass { internal class HassOnedriveFileSyncEntityState : INotifyPropertyChanged { private const string OneDrive_FileSync_Entity_ID = "sensor.onedrivefilesync"; private IHassioClient? _hassioClient; private static HassOnedriveFileSyncEntityState? _instance; private FileState state; private List entityStateConverters = new List { new StringEnumConverter() }; public event PropertyChangedEventHandler? PropertyChanged; public HassOnedriveFileSyncEntityState(IHassioClient hassioClient) { _hassioClient = hassioClient; State = FileState.Unknown; } [JsonConverter(typeof(StringEnumConverter))] public FileState State { get => state; set { state = value; if (state != FileState.Syncing) { UploadPercentage = null; UploadSpeed = null; } } } public int? UploadPercentage { get; set; } public int? UploadSpeed { get; set; } public async Task UpdateBackupEntityInHass() { var payload = new { state = State, attributes = new Dictionary { { FileStateAttribute.UploadPercentage, UploadPercentage == null ? null : $"{UploadPercentage}%" }, { FileStateAttribute.UploadSpeed, UploadSpeed == null ? null : $"{UploadSpeed} KB/s" }, } }; string payloadStr = JsonConvert.SerializeObject(payload, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = entityStateConverters }); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null)); await _hassioClient.UpdateHassEntityStateAsync(OneDrive_FileSync_Entity_ID, payloadStr); } public class FileStateAttribute { public const string UploadPercentage = "Current file upload percentage"; public const string UploadSpeed = "Current file upload speed (KB/s)"; } public enum FileState { Syncing, Synced, Unknown, } } }