科技在不斷進步,愈來愈多的智能家居產品和服務進入到人們的平常生活中。智能燈是一款常見的智能設備,安裝智能燈後,用戶可使用手機 App 輕鬆調整室內顏色和亮度,設置不一樣的照明場景來輕鬆創造出溫暖、放鬆、有趣或者鼓舞人心的室內空間。ios
Android版請參考:《如何基於SDK快速開發一款IoT App控制智能燈泡(Android版)》git
五路燈有白光和彩光是 2 種模式切換,不可同時啓用。github
RGB(Red、Green、Blue)色彩模式是一種面向硬件的色彩模型,顯示系統都採用RGB顏色模型來進行圖像顯示。RGB色彩模型屬於加法混色原理,每種原色的數值越高,色彩就越亮,RGB都是0時是黑色,都是255時是白色。安全
RGB色彩模型表示直接,可是RGB數值和色彩的三屬性沒有直接的聯繫,不能揭示色彩之間的關係。app
HSV 色彩模式是一種面向用戶感官的色彩模型,側重與色彩表示。這是根據人的視覺系統對亮度的敏感度要強於色彩值這個生理特性而提出的顏色模型。它比 RGB 更接近人們對彩色的感知經驗。很是直觀地表達顏色的色調、鮮豔程度和明暗程度,方便進行顏色的對比。ide
HSV(Hue、Saturation、Value)分別對應色相、飽和度、明度。ui
基於 SDK 開發一個智能燈 App 的時候,須要作下面準備:編碼
具體參考spa
功能點是對產品功能的抽象表示,是具體智能設備功能的抽象,用於描述產品功能及其參數。.net
數據傳輸類型:
產品 pid : "ylr9R01cMWnMRqEB" 的功能點以下圖所示:
demo 地址:https://github.com/tuya/tuya-home-ios-sdk 功能分支:main
SDK 文檔地址:https://tuyainc.github.io/tuyasmart_home_ios_sdk_doc/zh-hans/
在終端的命令行中輸入:
git clone https:_//github.com/tuya/tuya-home-ios-sdk.git_
下載 demo 到本地。
一、打開項目設置,Target => General,修改 Bundle Identifier
爲塗鴉開發者平臺對應的 iOS 包名
二、導入安全圖片到工程根目錄,重命名爲 t_s.bmp
,並加入「項目設置 => Target => Build Phases => Copy Bundle Resources」中。
三、在項目的PrefixHeader.pch
文件添加如下內容:
#import <TuyaSmartHomeKit/TuyaSmartKit.h>
四、打開AppDelegate.m
文件,在[AppDelegate application:didFinishLaunchingWithOptions:]
方法中初始化SDK:
[[TuyaSmartSDK sharedInstance] startWithAppKey:<#your_app_key#> secretKey:<#your_secret_key#>];
五、打開 Debug 模式
在開發的過程當中能夠開啓 Debug 模式,打印一些日誌用於分析問題。
Objc:
#ifdef DEBUG [[TuyaSmartSDK sharedInstance] setDebugMode:YES]; #else #endif
你們在開發的過程當中能夠參考的 demo 的代碼。
在 demo 中咱們已經完成了基於 dp 點控制實現智能燈泡的開關,亮度,冷暖,顏色控制。
智能燈控制頁面的若是下圖所示:
NSString * const kLightSwtichDpId = @"1";/* 控制燈開關的 dp 點 */ NSString * const kLightColorTypeDpId = @"2";/* 控制燈類型的 dp 點 */ NSString * const kLightColorBrightDpId = @"3";/* 控制彩燈亮度的 dp 點 */ NSString * const kLightColorTempDpId = @"4";/* 控制彩燈 temp 的 dp 點 */ NSString * const kLightColorDpId = @"5";/* 控制燈色彩的 dp 點 */
- (void)switchAction:(UISwitch *)sender { // 開關操做 WEAKSELF_AT [TPDemoProgressUtils showMessag:TYSDKDemoLocalizedString(@"loading", @"") toView:self.view]; [self.device publishDps:@{kLightSwtichDpId:@(sender.isOn)} success:^{ [TPDemoProgressUtils hideHUDForView:weakSelf_AT.view animated:NO]; } failure:^(NSError *error) { [TPDemoProgressUtils hideHUDForView:weakSelf_AT.view animated:NO]; [TPDemoProgressUtils showError:error.localizedDescription]; }]; }
分兩種狀況:在白光模式和彩光模式兩種狀況
// Bright NSDictionary *dps = self.device.deviceModel.dps; if ([[dps objectForKey:kLightColorTypeDpId] isEqualToString:@"colour"]) { int ir,ig,ib; _hsvValue.v = value; HSVToRGB(_hsvValue.h, _hsvValue.s, _hsvValue.v, &ir, &ig, &ib); UIColor *resColor = RGBCOLOR(ir, ig, ib); NSString *dpsString = [NSString stringWithFormat:@"%@%@", [[[resColor hexStringFromColor] lowercaseString] substringFromIndex:1], [self getHexStringFromHSV:_hsvValue]]; publishDps = @{ kLightSwtichDpId:@(YES), kLightColorDpId:dpsString, kLightColorTypeDpId:@"colour" }; } else { CGFloat tempV = (value * 100 - 1)/(100.0-1.0) * (self.maxValue - self.minValue) + self.minValue; int val = [self round:tempV]; publishDps = @{ kLightSwtichDpId:@(YES), kLightColorBrightDpId:@(val), kLightColorTypeDpId:@"white", }; } [self.device publishDps:publishDps success:^{ } failure:^(NSError *error) { }];
// Temperature int dpsInt = (int)(value * (self.tempMaxValue - self.tempMinValue) + self.tempMinValue); publishDps = @{ kLightColorTypeDpId:@"white", kLightColorTempDpId:@(dpsInt) }; [self.device publishDps:publishDps success:^{ } failure:^(NSError *error) { }];
#pragma mark - RSColorPickerViewDelegate - (void)colorPickerDidChangeSelection:(RSColorPickerView *)colorPicker { NSDictionary *dps = self.device.deviceModel.dps; BOOL isSwitch = [[dps objectForKey:kLightSwtichDpId] tysdk_toBool]; if (!isSwitch) { return; } HSVType hsv = [self.class getHSVFromUIColor:colorPicker.selectionColor]; _hsvValue.h = hsv.h; _hsvValue.s = hsv.s; _currentH = hsv.h; if (_hsvValue.v == 0) { _hsvValue.v = 1; } int r, g, b; HSVToRGB(_hsvValue.h, _hsvValue.s, _hsvValue.v, &r, &g, &b); NSString *dpsString = [NSString stringWithFormat:@"%02x%02x%02x%@", (unsigned int)r, (unsigned int)g, (unsigned int)b, [self getHexStringFromHSV:_hsvValue]]; NSDictionary *publishDps = @{ kLightColorDpId:dpsString, kLightColorTypeDpId:@"colour", }; [self.device publishDps:publishDps success:^{ } failure:^(NSError *error) { }]; }
// Saturation _hsvValue.s = value; if (_hsvValue.v == 0) { _hsvValue.v = 1; } int r, g, b; HSVToRGB(_hsvValue.h, _hsvValue.s, _hsvValue.v, &r, &g, &b); NSString *dpsString = [NSString stringWithFormat:@"%02x%02x%02x%@", (unsigned int)r, (unsigned int)g, (unsigned int)b, [self getHexStringFromHSV:_hsvValue]]; publishDps = @{ kLightColorDpId:dpsString, kLightColorTypeDpId:@"colour", }; [self.device publishDps:publishDps success:^{ } failure:^(NSError *error) { }];
#pragma mark - TuyaSmartDeviceDelegate /// dp數據更新 - (void)device:(TuyaSmartDevice *)device dpsUpdate:(NSDictionary *)dps { [self reloadData]; } - (void)reloadData { _hsvValue = [self getHSVFromDpId:kLightColorDpId]; NSDictionary *dps = self.device.deviceModel.dps; BOOL isSwitch = [[dps objectForKey:kLightSwtichDpId] boolValue]; [self.switchButton setOn:isSwitch]; double brightnessValue = [self getBrightness:dps]; [self.brightSliderView setSliderValue:brightnessValue]; double tempValue = [self getTempValue:[[dps objectForKey:kLightColorTempDpId] doubleValue]]; [self.tempSliderView setSliderValue:tempValue]; HSVType hsv = [self getHSVFromDpId:kLightColorDpId]; UIColor *color = [self getColorFromDpId:kLightColorDpId]; NSLog(@" h : %f, s : %f, v : %f, color : %@", hsv.h, hsv.s, hsv.v, color); if (fabs(roundf(hsv.h) - roundf(_currentH)) > 1) { _currentH = hsv.h; self.colorPicker.selectionColor = color; self.colorPicker.brightness = 1; self.colorPicker.opaque = YES; } [self.saturationSliderView setSliderValue:hsv.s]; }