【问题标题】:Changing Philips Hue Brightness with a UISlider Objective C使用 UISlider Objective C 更改飞利浦 Hue 亮度
【发布时间】:2015-05-08 13:33:57
【问题描述】:

我正在构建一个控制三个飞利浦色相 RGB LED 灯泡的应用程序。我希望能够使用 UISlider 更改亮度。目前我有一个 UISlider 在每次更改时调用一个方法,但是,此方法远远超过了 philips hue 桥每秒 10 个命令的限制。这是我在 UI 滑块中调用的方法。

- (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 个,但是当网桥被命令淹没时(停止接受所有命令),网桥仍然会以相同的方式运行。任何帮助或方向将不胜感激。提前致谢!

【问题讨论】:

  • 逻辑看起来正确,您的检查每秒最多只能发送 4 个命令。您是否验证过您实际上每秒发送的命令不超过 4 个?在调用 updateLightState 之前添加一条日志语句以验证频率。
  • 我在 UISlider 级别有一个 NSLog,它显示正在发送的当前 NSNumber。它每秒至少发送 30 次日志(即使值没有改变)。
  • 这是意料之中的。但是您需要在实际调用updateLightStateForId 时进行记录,以便验证您的逻辑。

标签: objective-c uislider philips-hue


【解决方案1】:

一个原因可能是您的多个灯。您正在为每个灯发送更新命令。因此,如果您在 Hue 入门套件中连接了 3 个灯泡,如果存在一些不幸的缓存涉及将更新从 2​​ 秒打包到 1 秒发送,您可能仍会发送 10 个或更多。因此,我建议您进一步减少发送的更新数量(尝试 0.5 甚至 1.0)作为间隔,看看它是否会变得更好。

另请注意,SDK 对速率限制非常模糊。它说:

如果你保持大约大约每秒 10 个命令

由于飞利浦 Hue SDK 通常没有得到很好的支持(请查看开放的 GitHub 问题),因此请谨慎对待并进行自己的实验。一旦我有时间自己检查它,我会在这里发布更新。

更新 1:我刚刚发现 this remark 由 Hue SDK github 存储库的一位贡献者(可能是飞利浦员工)建议每秒仅发送 2 个命令:

如前所述,在循环中执行大量请求时要小心,因为对 PHBridgeSendAPI 的调用不会阻塞,并且请求会一直保留,直到它们得到响应或超时。每秒两次调用似乎是一个安全的速率,如果您想获得更高的速率,建议使用您自己的队列机制链接请求(以确保在调用新请求之前释放内存)。

【讨论】:

  • 对不起,我不能早点评论,我一直很忙。每秒两个命令有效且安全,但速度不足以匹配 UISlider 的滑动速率。然而这是可行的。他们可以在免费的 philips hue 应用程序中做到这一点。当您滑动手指时,所有三个灯泡的亮度都会立即变化,并且更新速度非常快。他们会做什么而我不是?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多