using Microsoft.AspNetCore.Mvc; using MyCore.DTO.Common; using MyCore.DTO.MyControlPanel; using MyCore.Models.MyControlPanel; using MyCore.Models.MyControlPanel.Database; using MyCore.Services.MyControlPanel; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Security.Authentication; using System.Threading.Tasks; namespace MyCore.Services.Devices { public class DeviceService { public static DeviceDetailDTO CreateOrUpdate(DeviceDatabaseService _DeviceDatabaseService, ProviderDatabaseService _ProviderDatabaseService, LocationDatabaseService _LocationDatabaseService, DeviceDetailDTO deviceDetailDTO, bool create) { Device device; if (create) device = new Device(); else { device = _DeviceDatabaseService.GetById(deviceDetailDTO.Id); } if (_DeviceDatabaseService.IsAlreadyHere(deviceDetailDTO.IpAddress, deviceDetailDTO.Port) && create) { return null; } device.Name = deviceDetailDTO.Name; if (_ProviderDatabaseService.IsExist(deviceDetailDTO.ProviderId)) device.ProviderId = deviceDetailDTO.ProviderId; else throw new KeyNotFoundException("Provider does not exist"); if (device.LocationId == null || _LocationDatabaseService.IsExist(deviceDetailDTO.LocationId)) device.LocationId = deviceDetailDTO.LocationId; else throw new KeyNotFoundException("Location does not exist"); device.Port = deviceDetailDTO.Port; device.Model = deviceDetailDTO.Model; device.FirmwareVersion = deviceDetailDTO.FirmwareVersion; device.Status = deviceDetailDTO.Status; if (create) device.ConnectionStatus = ConnectionStatus.Unknown; else device.ConnectionStatus = deviceDetailDTO.ConnectionStatus; device.Status = device.Status; device.LocationId = device.LocationId; device.CreatedDate = DateTime.Now; device.UpdatedDate = DateTime.Now; device.MeansOfCommunications = deviceDetailDTO.MeansOfCommunications; device.IpAddress = deviceDetailDTO.IpAddress; device.ServiceIdentification = deviceDetailDTO.ServiceIdentification; device.Battery = deviceDetailDTO.Battery; device.BatteryStatus = deviceDetailDTO.BatteryStatus; device.GroupIds = device.GroupIds; // Todo structure Properties device.Properties = device.Properties; // Todo structure SupportedOperations device.SupportedOperations = device.SupportedOperations; if (create) return _DeviceDatabaseService.Create(device).ToDTO(); else return _DeviceDatabaseService.Update(device.Id, device).ToDTO(); } public async static Task> CreateFromProvider(DeviceDatabaseService _DeviceDatabaseService, ProviderDatabaseService _ProviderDatabaseService, LocationDatabaseService _LocationDatabaseService, Provider provider) { if (!ProviderService.IsProviderSupported(provider.Name)) throw new KeyNotFoundException("Provider is not yet supported"); List createdDevice = new List(); try { switch (provider.Name) { case "Arlo": List arloDevices = new ArloService(provider.Username, provider.Password).GetAllDevices(); createdDevice = CreateArloDevices(_DeviceDatabaseService, _ProviderDatabaseService, _LocationDatabaseService, arloDevices, provider); break; case "Meross": List merossDevices = new MerossService(provider.Username, provider.Password).GetMerossDevices(); createdDevice = CreateMerossDevices(_DeviceDatabaseService, _ProviderDatabaseService, _LocationDatabaseService, merossDevices, provider); break; case "Yeelight": List yeelightDevices = await new YeelightService().GetDevices(); createdDevice = CreateYeelightDevices(_DeviceDatabaseService, _ProviderDatabaseService, _LocationDatabaseService, yeelightDevices, provider); break; } } catch (AuthenticationException ex) { throw new AuthenticationException("Bad username or password for service " + provider.Name + " ex: " + ex); } catch (HttpRequestException ex) { throw new HttpRequestException("Error retrieving devices for " + provider.Name + " ex: " + ex); } catch (Exception ex) { } return createdDevice; } public static List CreateArloDevices(DeviceDatabaseService _DeviceDatabaseService, ProviderDatabaseService _ProviderDatabaseService, LocationDatabaseService _LocationDatabaseService, List arloDevices, Provider provider) { List createdArloDevices = new List(); foreach (var arlo in arloDevices) { DeviceDetailDTO deviceDetailDTO = new DeviceDetailDTO(); deviceDetailDTO.Name = arlo.deviceName; deviceDetailDTO.IpAddress = arlo.deviceId; // TO CHECK deviceDetailDTO.ServiceIdentification = arlo.deviceId; deviceDetailDTO.ProviderId = provider.Id; deviceDetailDTO.ConnectionStatus = arlo.connectivity.connected ? ConnectionStatus.Connected : ConnectionStatus.Unknown; deviceDetailDTO.Status = arlo.connectivity.connected ? true : false; // TODO STATE deviceDetailDTO.Model = arlo.deviceType; //deviceDetailDTO.Port = arlo.; // TO CHECK deviceDetailDTO.FirmwareVersion = arlo.interfaceVersion; // TODO /*Dictionary properties = new Dictionary(); foreach (var property in arlo.properties) { properties.Add(property.Key, property.Value); }*/ // TODO // deviceDetailDTO.Properties = properties; // TODO ! List supportedOperationsDTO = new List(); supportedOperationsDTO.Add(arlo.lastImageUploaded.GetType().Name + " : " + arlo.lastImageUploaded); supportedOperationsDTO.Add(arlo.presignedLastImageUrl.GetType().Name + " : " + arlo.presignedLastImageUrl); supportedOperationsDTO.Add(arlo.presignedFullFrameSnapshotUrl.GetType().Name + " : " + arlo.presignedFullFrameSnapshotUrl); supportedOperationsDTO.Add(arlo.presignedSnapshotUrl.GetType().Name + " : " + arlo.presignedSnapshotUrl); deviceDetailDTO.SupportedOperations = supportedOperationsDTO; deviceDetailDTO.MeansOfCommunications = new List(); deviceDetailDTO.MeansOfCommunications.Add(MeansOfCommunication.Wifi); // TO CHECK deviceDetailDTO.CreatedDate = DateTime.Now; deviceDetailDTO.UpdatedDate = DateTime.Now; createdArloDevices.Add(CreateOrUpdate(_DeviceDatabaseService, _ProviderDatabaseService, _LocationDatabaseService, deviceDetailDTO, true)); } return createdArloDevices; } public static List CreateMerossDevices(DeviceDatabaseService _DeviceDatabaseService, ProviderDatabaseService _ProviderDatabaseService, LocationDatabaseService _LocationDatabaseService, List merossDevices, Provider provider) { List createdMerossDevices = new List(); foreach (var meross in merossDevices) { DeviceDetailDTO deviceDetailDTO = new DeviceDetailDTO(); deviceDetailDTO.Name = meross.devName; deviceDetailDTO.IpAddress = meross.uuid; // TO CHECK deviceDetailDTO.ServiceIdentification = meross.uuid; deviceDetailDTO.ProviderId = provider.Id; deviceDetailDTO.ConnectionStatus = meross.onlineStatus == 1 ? ConnectionStatus.Connected : ConnectionStatus.Disconnected; // deviceDetailDTO.Status = meross. ? true : false; // TODO STATE deviceDetailDTO.Model = meross.deviceType; //deviceDetailDTO.Port = arlo.; // TO CHECK deviceDetailDTO.FirmwareVersion = meross.firmwareVersion; // TODO /*Dictionary properties = new Dictionary(); foreach (var property in arlo.properties) { properties.Add(property.Key, property.Value); }*/ // TODO // deviceDetailDTO.Properties = properties; // TODO ! Dictionary properties = new Dictionary(); foreach (var property in meross.channels) { properties.Add(property.devName, property.type); } // deviceDetailDTO.SupportedOperations = supportedOperationsDTO; TODO deviceDetailDTO.MeansOfCommunications = new List(); deviceDetailDTO.MeansOfCommunications.Add(MeansOfCommunication.Wifi); // TO CHECK deviceDetailDTO.CreatedDate = DateTime.Now; deviceDetailDTO.UpdatedDate = DateTime.Now; createdMerossDevices.Add(CreateOrUpdate(_DeviceDatabaseService, _ProviderDatabaseService, _LocationDatabaseService, deviceDetailDTO, true)); } return createdMerossDevices; } public static List CreateYeelightDevices(DeviceDatabaseService _DeviceDatabaseService, ProviderDatabaseService _ProviderDatabaseService, LocationDatabaseService _LocationDatabaseService, List yeelightDevices, Provider provider) { List createdYeelightDevices = new List(); foreach (var light in yeelightDevices) { DeviceDetailDTO deviceDetailDTO = new DeviceDetailDTO(); deviceDetailDTO.Name = light.Name; deviceDetailDTO.IpAddress = light.Hostname; deviceDetailDTO.ProviderId = provider.Id; deviceDetailDTO.ConnectionStatus = ConnectionStatus.Connected; deviceDetailDTO.Status = false; deviceDetailDTO.Model = light.Model.ToString(); deviceDetailDTO.Port = light.Port; deviceDetailDTO.FirmwareVersion = light.FirmwareVersion; Dictionary properties = new Dictionary(); foreach (var property in light.Properties) { properties.Add(property.Key, property.Value); } deviceDetailDTO.Properties = properties; List supportedOperationsDTO = new List(); foreach (var supportedOperation in light.SupportedOperations) { supportedOperationsDTO.Add(supportedOperation.ToString()); } deviceDetailDTO.SupportedOperations = supportedOperationsDTO; deviceDetailDTO.MeansOfCommunications = new List(); deviceDetailDTO.MeansOfCommunications.Add(MeansOfCommunication.Wifi); deviceDetailDTO.CreatedDate = DateTime.Now; deviceDetailDTO.UpdatedDate = DateTime.Now; createdYeelightDevices.Add(CreateOrUpdate(_DeviceDatabaseService, _ProviderDatabaseService, _LocationDatabaseService, deviceDetailDTO, true)); } return createdYeelightDevices; } } }