private async Task SetupHue() { await SetupHueClient(); var groups = await HueClient.GetGroupsAsync(); FillGroupDictionary(groups); OnOffStateForGroups = groups.ToDictionary(group => group, group => group.State.AnyOn == true); Rooms = new LinkedList <RoomClass>(GroupDictionary.Keys); CurrentRoom = Rooms.Find(RoomClass.LivingRoom); if (CurrentRoom == null) { CurrentRoom = Rooms.First; } IsInitialized = true; }
public static async Task RunLightControl(Configuration configuration, HueClient hueClient) { var timeBetweenChecks = new TimeSpan(Math.Max(configuration.TransitionTime.Ticks, configuration.PollingFrequency.Ticks)); await AsyncUtils.ContinuallyExecuteReportingExceptionsOnlyOnce(async() => { var dmxUniverse = configuration.DMXConfiguration.Universe; RunningState runningState = RunningState.HueShift; using (var controller = new ArtNetController()) { controller.Address = IPAddress.Parse(configuration.DMXConfiguration.ListeningIPAddress); var groups = await hueClient.GetGroupsAsync(); var dmxControlGroupName = "DmxControlGroup"; foreach (var item in groups) { if (item.Name == dmxControlGroupName) { await hueClient.DeleteGroupAsync(item.Id); Console.WriteLine("Deleting existing control group: " + item.Id); } } // var groupId = await hueClient.CreateGroupAsync( // configuration.DMXConfiguration.LightIdsInDmxGroup.Select(x => x.ToString()).ToList(), // dmxControlGroupName, // null, // Q42.HueApi.Models.Groups.GroupType.LightGroup); var stateQueue = new ConcurrentQueue <LightState>(); var startingChannel = configuration.DMXConfiguration.StartingChannel; controller.DmxPacketReceived += (sender, packet) => { if (packet.SubUniverse != dmxUniverse) { return; } LightState state = new LightState( packet.Data[startingChannel] > 0, packet.Data[startingChannel + 1], packet.Data[startingChannel + 2]); if (state.IsOn) { //Sanity check to prevent runawayqueu const int maxQueueSize = 10000; if (stateQueue.Count < maxQueueSize) { stateQueue.Enqueue(state); } } else { //Console.Write("D"); } }; controller.Start(); var lastApiSentTime = DateTimeOffset.MinValue; var lastTimeDmxPacketDetected = DateTimeOffset.MinValue; // LightState lastSentLightState = new LightState(); Console.WriteLine("_------------------STARTING "); var controlState = new Dictionary <string, LightControlStatus>(); var sunriseSunsetState = new AppState(); while (true) { switch (runningState) { case RunningState.HueShift: var currentTime = DateTimeOffset.Now; int colorTemperature = GetTargetColorTemperature(currentTime, configuration); await PerformDayNightCycling(hueClient, colorTemperature, currentTime, sunriseSunsetState, configuration); var timeStartedWaiting = DateTimeOffset.Now; do { if (!stateQueue.IsEmpty) { lastTimeDmxPacketDetected = DateTimeOffset.Now; runningState = RunningState.DMX; Console.WriteLine("DMX Mode detected"); break; } else { Thread.Sleep(configuration.DMXConfiguration.MillisToSleepBetweenQueueChecks); //await Task.Delay(.0).ConfigureAwait(false); } } while ((DateTimeOffset.Now - timeStartedWaiting) < timeBetweenChecks); break; default: break; // case RunningState.DMX: // var transitionDuration = configuration.DMXConfiguration.TransitionTime; // var minWaitDurationBetweenApiCalls = configuration.DMXConfiguration.MinWaitDurationBetweenApiCalls; // var timeSinceLastSend = DateTimeOffset.Now - lastApiSentTime; // var timeSinceLastReceivedDMXPacket = DateTimeOffset.Now - lastTimeDmxPacketDetected; // LightState mostCurrentLightState = new LightState(); // bool haveReceivedNextDMXPacket = false; // while (timeSinceLastSend < minWaitDurationBetweenApiCalls) // { // Thread.Sleep(configuration.DMXConfiguration.MillisToSleepBetweenQueueChecks); // LightState latestLightState; // while (stateQueue.TryDequeue(out latestLightState)) // { // mostCurrentLightState = latestLightState; // haveReceivedNextDMXPacket = true; // lastTimeDmxPacketDetected = DateTime.Now; // } // timeSinceLastSend = DateTimeOffset.Now - lastApiSentTime; // } // if (!haveReceivedNextDMXPacket) // { // LightState latestLightState; // while (!stateQueue.TryDequeue(out latestLightState)) // { // Thread.Sleep(configuration.DMXConfiguration.MillisToSleepBetweenQueueChecks); // if ((DateTimeOffset.Now - lastTimeDmxPacketDetected) > configuration.DMXConfiguration.TimeAfterLastDmxPacketToReturnToShifting) // { // runningState = RunningState.HueShift; // break; // } // } // mostCurrentLightState = latestLightState; // haveReceivedNextDMXPacket = true; // lastTimeDmxPacketDetected = DateTime.Now; // } // if (runningState == RunningState.DMX) // { // if (!mostCurrentLightState.Equals(lastSentLightState)) // { // Console.WriteLine(); // var command = new LightCommand(); // if (mostCurrentLightState.Brightness != lastSentLightState.Brightness) // command.Brightness = mostCurrentLightState.Brightness; // //if (latest.ColorTemperature != last.ColorTemperature) // // command.ColorTemperature = (int)map(latest.ColorTemperature, 0, 255, (float)ColorTemperature.Blue, (float)ColorTemperature.Red); // command.TransitionTime = transitionDuration; // Console.Write($"Setting: {mostCurrentLightState.IsOn} {mostCurrentLightState.Brightness} {mostCurrentLightState.ColorTemperature}"); // var hueResults = await hueClient.SendGroupCommandAsync(command, groupId); // foreach (var error in hueResults.Errors) // { // Console.WriteLine($"Error: {error}"); // } // lastApiSentTime = DateTimeOffset.Now; // lastSentLightState = mostCurrentLightState; // } // } // break; } } } }); }