Изменение яркости Philips Hue с помощью UISlider Objective C

Я создаю приложение, которое управляет тремя светодиодными лампами Philips Hue RGB. Я хочу иметь возможность изменять яркость с помощью UISlider. В настоящее время у меня есть UISlider, который вызывает метод при каждом изменении, однако этот метод намного превышает ограничение в 10 команд в секунду моста Philips hue. Вот метод, который я вызываю при изменении ползунка пользовательского интерфейса.

- (void) changeBulbBrightness: (NSNumber *)currentBrightness
{
    NSTimeInterval timeInterval = [self.timeLastCommandSent timeIntervalSinceNow];
    NSLog(@"Time Since Last command: %f", timeInterval);
    if (timeInterval < -0.3)
    {
        NSLog(@"COMMAND SENT!!!!");
        PHBridgeResourcesCache *cache = [PHBridgeResourcesReader readBridgeResourcesCache];
        PHBridgeSendAPI *bridgeSendAPI = [[PHBridgeSendAPI alloc] init];
        for (PHLight *light in cache.lights.allValues)
        {
            PHLightState *lightState = light.lightState;
            //PHLightState *lightState = [[PHLightState alloc] init];
            if (lightState.on)
            {
                [lightState setBrightness:currentBrightness];
                // Send lightstate to light


     [bridgeSendAPI updateLightStateForId:light.identifier withLightState:lightState completionHandler:^(NSArray *errors) {
                /*if (errors != nil) {
                    NSString *message = [NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"Errors", @""), errors != nil ? errors : NSLocalizedString(@"none", @"")];
                    if (self.loggingOn)
                    {
                        NSLog(@"Brightness Change Response: %@",message);
                    }
                }
                 */
            }];
        }
        self.timeLastCommandSent = [[NSDate alloc]init];
    }
}
self.appDelegate.currentSetup.brightnessSetting = currentBrightness;
NSLog(@"Brightness Now = %@", currentBrightness);

Я пытался сделать таймер, чтобы ограничить количество команд до 10 в секунду, но мост по-прежнему действует так же, как и при перегрузке команд (останавливает прием всех команд). Любая помощь или направление будет принята с благодарностью. Заранее спасибо!


person Daniel I    schedule 08.05.2015    source источник
comment
Логика выглядит правильной, и ваша проверка должна отправлять только до 4 команд в секунду. Вы убедились, что на самом деле не отправляете более 4 команд в секунду? Добавьте оператор журнала непосредственно перед вызовом updateLightState, чтобы проверить частоту.   -  person rmaddy    schedule 08.05.2015
comment
У меня есть NSLog на уровне UISlider, который отображает текущий отправляемый NSNumber. Он отправляет журналы не менее 30 раз в секунду (даже если значение не изменилось).   -  person Daniel I    schedule 08.05.2015
comment
Это ожидаемо. Но вам нужно зарегистрировать, когда вы действительно вызываете updateLightStateForId, чтобы вы могли проверить свою логику.   -  person rmaddy    schedule 08.05.2015


Ответы (1)


Одной из причин может быть несколько источников света. Вы отправляете команду обновления для каждого источника света. Таким образом, если у вас есть 3 лампочки, подключенные, как в стартовом комплекте Hue, вы все равно можете отправить 10 или немного больше, если есть какое-то неудачное кэширование, связанное с упаковкой обновлений из 2 секунд в 1 секунду отправки. Поэтому я предлагаю вам дополнительно уменьшить количество отправляемых вами обновлений (попробуйте 0,5 или даже 1,0) в качестве интервала и посмотреть, станет ли лучше.

Также обратите внимание, что в SDK довольно расплывчато указано ограничение скорости. В нем говорится:

Если вы остаетесь примерно около 10 команд в секунду

Поскольку Philips Hue SDK, как правило, не так хорошо поддерживается (посмотрите на открытые проблемы GitHub), отнеситесь к этому с долей скептицизма и проведите свои собственные эксперименты. Как только у меня будет время проверить это лично, я опубликую обновление здесь.

Обновление 1: я обнаружил это замечание одним из участников репозитория Hue SDK github (возможно, сотрудником Philips), который советует отправлять только 2 команды в секунду:

Как упоминалось ранее, будьте осторожны при выполнении большого количества запросов в цикле, так как вызовы PHBridgeSendAPI не блокируются, а запросы сохраняются до тех пор, пока они не получат ответ или тайм-аут. Два вызова в секунду кажутся безопасной скоростью, если вы хотите иметь более высокую скорость, рекомендуется объединять запросы в цепочку с собственным механизмом очередей (чтобы гарантировать, что память будет освобождена до того, как будут вызваны новые запросы).

person Raphael    schedule 16.05.2015
comment
Извините, что не мог прокомментировать раньше, я был очень занят. Две команды в секунду работают и безопасны, но недостаточно быстры, чтобы соответствовать скорости скольжения UISlider. Однако это выполнимо. Они могут сделать это в бесплатном приложении Philips Hue. Когда вы проводите пальцем, яркость всех трех лампочек меняется мгновенно и обновляется очень быстро. Что они могут делать такого, чего я не делаю? - person Daniel I; 18.05.2015