private bool IsDeviceExisting(InvokeAction invokeAction)
 {
     var deviceId = invokeAction.DeviceId;
     if (ControlConfiguration.ContainsKey(deviceId))
         return true;
     Context.GetLogger().Warning($"Could not find device with id {deviceId}");
     return false;
 }
 public GroupingSearcher(
     InvokeAction[] invokeActions, ControlAction controlAction,
     QueueControlConfiguration controlConfiguration, Action<string> logWarning)
 {
     InvokeActions = invokeActions;
     ControlAction = controlAction;
     ControlConfiguration = controlConfiguration;
     LogWarning = logWarning;
 }
 private void QueueItems(InvokeAction[] invokeActions)
 {
     var itemsToProcess = new List<ActionToBeQueued>();
     foreach (var actionsOfTheSameType in invokeActions.Where(IsDeviceExisting).GroupBy(a => a.Action))
     {
         InvokeAction[] actions = actionsOfTheSameType.ToArray();
         var searcher = new GroupingSearcher(actions, actionsOfTheSameType.Key, ControlConfiguration, LogWarning);
         itemsToProcess.AddRange(searcher.FindActionsToBeQueued());
     }
     LogInvokeActionResult(invokeActions, itemsToProcess);
     foreach (ActionToBeQueued item in itemsToProcess)
     {
         var control = item.Control;
         QueueItem queueItem = new QueueItem(control, item.Action);
         IActorRef invoker = InvokerStore.GetOrCreate(control.PluginId, control.PluginControlId);
         invoker.Tell(queueItem);
     }
 }
 private static void LogInvokeActionResult(InvokeAction[] invokeActions, List<ActionToBeQueued> itemsToProcess)
 {
     var loggedInvokeActions = invokeActions.Select(a => new {a.Action.Name, a.DeviceId});
     var loggedItemsToProcess = itemsToProcess.Select(i => new
     {
         i.Action.Name,
         i.Control.PluginId,
         i.Control.ControlId
     });
     Context.GetSerilogger().SerlogInfo("OnInvokeActions", new Dictionary<string, object>
     {
         {"InvokeActionCount", invokeActions.Length},
         {"ActionsToProcessCount", itemsToProcess.Count},
         {"InvolvedPluginCount", itemsToProcess.Select(i => i.Control.PluginId).Distinct().Count()},
         {"InvokeActions", loggedInvokeActions.ToArray()},
         {"ActionsToProcess", loggedItemsToProcess.ToArray()}
     });
 }
 public static void TellActionQueue(this IActorContext context, InvokeAction[] message) => context.GetTaskQueue().Tell(message);