예제 #1
0
        public async Task <IActionResult> TurnOff(int id)
        {
            var powerSwitch = jsonDatabaseService.PowerSwitches.FirstOrDefault(ps => ps.ID == id);

            if (powerSwitch == null)
            {
                logger.LogError($"PowerSwitchAPI.TurnOff: No power switch found with ID '{id}'.");
                return(Ok(new ChangeStatusModel {
                    IsOn = false, Result = false
                }));
            }

            ChangeStatusModel model = new ChangeStatusModel();

            try
            {
                var         arguments   = new ActionExecutionArguments(powerSwitch, new Device[] { powerSwitch }, serviceProvider);
                StateAction stateAction = new StateAction {
                    Devices = new int[] { powerSwitch.ID }, State = Entities.Enums.DeviceState.Off
                };
                await stateAction.Execute(arguments);

                logger.LogInformation($"PowerSwitchAPI.TurnOff: Successfully turned power switch OFF with ID '{id}'.");

                model.IsOn   = false;
                model.Result = true;
            }
            catch
            {
                logger.LogError($"PowerSwitchAPI.TurnOff: Failed to turn power switch OFF with ID '{id}'.");
            }

            return(Ok(model));
        }
        public async Task Execute(int actionId, IEntity source)
        {
            var action = memoryEntitiesService.Actions.FirstOrDefault(a => a.ID == actionId);

            if (action == null)
            {
                logger.LogError($"Action.Execute :: {actionId} :: Status:NotFound");
                return;
            }

            if (action.Disabled)
            {
                logger.LogInformation($"Action.Execute :: {actionId} :: Status:Disabled");
                return;
            }

            bool meetConditions = await evaluateConditionService.MeetConditions(action, action.Conditions);

            if (!meetConditions)
            {
                logger.LogInformation($"Action.Execute :: {actionId} :: Status:ConditionsNotMet");
                return;
            }

            var devices = new List <Device>(action.Devices?.Length ?? 0);

            if (action.Devices != null)
            {
                foreach (int deviceId in action.Devices)
                {
                    var device = memoryEntitiesService.Devices.FirstOrDefault(d => d.ID == deviceId);
                    devices.Add(device);
                }
            }

            logger.LogInformation($"Action.Execute :: {actionId} :: Source:{source.ToSourceString()}, Devices:{string.Join(',', devices.Select(x => x.ID))}");

            try
            {
                var arguments = new ActionExecutionArguments(source, devices, serviceProvider);
                await action.Execute(arguments);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"Action.Execute :: {actionId} :: Error:{ex.Message}");
            }
        }