Tuya Home SDK Flutter Plugin

Pub Version License

Table of Contents

  1. Initialization
  2. Authentication
  3. User Management
  4. Home Management
  5. Device Management
  6. Device Control

Initialization

Prerequisites

  • Flutter SDK (version 3.3.0 or higher)
  • Tuya Developer Account
  • Android Studio/Xcode (for platform-specific setup)

Installation

Add the dependency to your pubspec.yaml:

dependencies:
  tuya_home_sdk_flutter:

Run flutter pub get to install the package.

Platform Configuration

Android

  1. Download the SDK:

    • Go to the Get SDK tab on the Tuya Developer Platform.
    • Select one or more required SDKs or BizBundles.
    • Download the App SDK for Android.
    • Extract the downloaded package and put security-algorithm.aar in the libs directory of your project.
  2. Add the following permissions to AndroidManifest.xml (Optional, as needed):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
  1. Update build.gradle:
android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a"
        }
    }
    packagingOptions {
      pickFirst 'lib/*/libc++_shared.so' // An Android Archive (AAR) file contains an Android library. If the .so file exists in multiple AAR files, select the first AAR file.
   }
}

dependencies {
    implementation fileTree(include: ['*.aar'], dir: 'libs')
}
  1. Add ProGuard Rules:

Add the following rules to your proguard-rules.pro file:

## Flutter wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-keep class com.google.firebase.** { *; }
-dontwarn io.flutter.embedding.**
-ignorewarnings

#fastJson
-keep class com.alibaba.fastjson.**{*;}
-dontwarn com.alibaba.fastjson.**

#mqtt
-keep class com.thingclips.smart.mqttclient.mqttv3.** { *; }
-dontwarn com.thingclips.smart.mqttclient.mqttv3.**

#OkHttp3
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**

-keep class okio.** { *; }
-dontwarn okio.**

-keep class com.thingclips.**{*;}
-dontwarn com.thingclips.**

# Matter SDK
-keep class chip.** { *; }
-dontwarn chip.**

iOS

  1. Build and Download the SDK:

    • Log in to the Tuya Developer Platform.
    • Select the required SDKs or UI BizBundles of v5.x.x.
    • Build the SDK and download the package.
    • Extract ios_core_sdk.tar.gz to get the following files:
      • Build: Stores the security SDK exclusive to your app. Keep this file secure.
      • ThingSmartCryption.podspec: Used to reference and integrate with App SDK v5.0.
    • Store both files in a directory alongside your Podfile for easy reference.
  2. Add the following keys to Info.plist (Optional, as needed):

<key>NSBluetoothAlwaysUsageDescription</key>
<string>We need access to Bluetooth for device setup</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>We need access to Bluetooth for device setup</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>We need access to location for device discovery</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>We need access to location for device discovery</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We need access to location for device discovery</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to the microphone for voice control</string>
<key>NSCameraUsageDescription</key>
<string>We need access to the camera for device setup</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We need access to the photo library for device setup</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>We need access to the photo library for device setup</string>

Add the following to your Podfile:

source 'https://github.com/CocoaPods/SSpecs.git'
source 'https://github.com/TuyaInc/TuyaPublicSpecs.git'
source 'https://github.com/tuya/tuya-pod-specs.git'

platform :ios, '12.0'

ENV['COCOAPODS_DISABLE_STATS'] = 'true'

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  pod "ThingSmartCryption", :path =>'./ios_core_sdk'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end
end

Run pod install to install the dependencies.

SDK Initialization

import 'package:tuya_home_sdk_flutter/tuya_home_sdk_flutter.dart';

void main() async {
  await TuyaHomeSdkFlutter.instance.initSdk(
    'your_app_key',
    'your_app_secret',
    'your_key',
    isDebug: true
  );
  print('SDK initialized successfully');
}

Authentication

Login with OAuth

Authenticates using third-party OAuth providers.

Key parameters:

  • type: Provider type ('ap' for Apple, 'gg' for Google, 'fb' for Facebook)
  • countryCode: Country code
  • accessToken: OAuth token

Example:

final bool success = await TuyaHomeSdkFlutter.instance.loginByAuth2(
  type: 'gg',
  countryCode: '+1',
  accessToken: 'oauthToken123'
);

if (success) {
  print('Login successful');
} else {
  print('Login failed');
}

User Management

Get User Info

Retrieves current user information.

Example:

final user = await TuyaHomeSdkFlutter.instance.getUserInfo();
if (user != null) {
  print('User email: ${user.email}');
}

Update User Profile

Updates user profile information.

Methods:

// Update nickname
await updateUserNickName(nickname: 'New Name');

// Update avatar
await updateUserIcon(icon: 'base64ImageData');

Logout

Terminates the current session.

Example:

final bool success = await TuyaHomeSdkFlutter.instance.logout();
if (success) {
  print('Logged out successfully');
}

User Registration

Use this method to register a new user with a verified code.

Key parameters:

  • username: The user's phone number or email
  • countryCode: The country code for phone numbers
  • code: The verification code
  • password: The user's password

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.registerByUserName(
  username: 'user@example.com',
  countryCode: '+1',
  code: '123456',
  password: 'securePassword123'
);

if (success) {
  print('User registered successfully');
} else {
  print('User registration failed');
}

Login with Username

Use this method to authenticate a user with their username and password.

Key parameters:

  • username: The user's phone number or email
  • countryCode: The country code for phone numbers
  • password: The user's password

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.loginWithUserName(
  username: 'user@example.com',
  countryCode: '+1',
  password: 'securePassword123'
);

if (success) {
  print('Login successful');
} else {
  print('Login failed');
}

Third-party Login

Use this method to authenticate a user using a third-party provider (e.g., Google or Apple).

Key parameters:

  • type: The type of third-party provider ('ap' for Apple, 'gg' for Google)
  • countryCode: The country code for phone numbers
  • accessToken: The access token from the third-party provider

Here's a complete example:

final bool success = await TuYaHomeSdkFlutter.instance.loginByAuth2(
  type: 'gg',
  countryCode: '+1',
  accessToken: 'googleAccessToken'
);

if (success) {
  print('Login successful');
} else {
  print('Login failed');
}

Send Verification Code

Use this method to send a verification code to a user's phone or email.

Key parameters:

  • username: The user's phone number or email
  • countryCode: The country code for phone numbers
  • type: The type of verification code (1: register, 2: login, 3: reset password)

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.sendVerifyCodeWithUserName(
  username: 'user@example.com',
  countryCode: '+1',
  type: 1
);

if (success) {
  print('Verification code sent successfully');
} else {
  print('Failed to send verification code');
}

Check Verification Code

Use this method to verify a code sent to a user's phone or email.

Key parameters:

  • username: The user's phone number or email
  • countryCode: The country code for phone numbers
  • code: The verification code to check
  • type: The type of verification code (1: register, 2: login, 3: reset password)

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.checkCodeWithUserName(
  username: 'user@example.com',
  countryCode: '+1',
  code: '123456',
  type: 1
);

if (success) {
  print('Verification code is valid');
} else {
  print('Invalid verification code');
}

Reset Password

Use this method to reset a user's password using a verified code.

Key parameters:

  • username: The user's phone number or email
  • countryCode: The country code for phone numbers
  • code: The verification code
  • password: The new password

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.resetPasswordByEmail(
  username: 'user@example.com',
  countryCode: '+1',
  code: '123456',
  password: 'newPassword123'
);

if (success) {
  print('Password reset successful');
} else {
  print('Password reset failed');
}

Home Management

Create Home

Creates a new home location.

Key parameters:

  • name: Home name
  • geoName: Geographic location
  • rooms: List of rooms

Example:

final home = await TuyaHomeSdkFlutter.instance.addHomeWithName(
  name: 'My Home',
  geoName: 'New York',
  rooms: ['Living Room', 'Bedroom']
);

Get Home List

Retrieves all homes for current user.

Example:

final homes = await TuyaHomeSdkFlutter.instance.getHomeList();
homes.forEach((home) => print(home.name));

Get Home Token

Requests an access token for a specific home.

Example:

final token = await TuyaHomeSdkFlutter.instance.requestHomeToken(
  homeId: 123
);

Update Home

Use this method to update an existing home's information.

Key parameters:

  • homeId: The ID of the home to update
  • name: New name for the home
  • geoName: New geographic location name
  • rooms: Updated list of rooms
  • latitude: Optional latitude coordinate
  • longitude: Optional longitude coordinate

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.updateHome(
  homeId: 123,
  name: 'Updated Home Name',
  geoName: 'New York',
  rooms: ['Living Room', 'Bedroom', 'Kitchen'],
  latitude: 40.7128,
  longitude: -74.0060
);

if (success) {
  print('Home updated successfully');
} else {
  print('Failed to update home');
}

Remove Home

Use this method to remove a home.

Key parameters:

  • homeId: The ID of the home to remove

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.removeHome(
  homeId: 'home123'
);

if (success) {
  print('Home removed successfully');
}

Get Home Token

Use this method to retrieve an access token for a specific home.

Key parameters:

  • homeId: The ID of the home

Here's a complete example:

final String? token = await TuyaHomeSdkFlutter.instance.getToken(
  homeId: 123
);

if (token != null) {
  print('Home token: $token');
} else {
  print('Failed to get home token');
}

Get Home Rooms

Use this method to retrieve a list of rooms for a specific home.

Key parameters:

  • homeId: The ID of the home to retrieve rooms for

Here's a complete example:

final List<ThingSmartRoomModel> rooms = await TuyaHomeSdkFlutter.instance.getHomeRooms(
  homeId: 123
);

if (rooms.isNotEmpty) {
  for (final room in rooms) {
    print('Room: ${room.name}, ID: ${room.roomId}');
  }
} else {
  print('No rooms found');
}

Device Management

Device Discovery

Use this method to discover nearby Tuya devices.

Key parameters:

  • None

Here's a complete example:

final ThingSmartDeviceModel? device = await TuyaHomeSdkFlutter.instance.discoverDeviceInfo();

if (device != null) {
  print('Device discovered: ${device.name}');
} else {
  print('No devices found');
}

Device Configuration

The Tuya Home SDK provides various methods to configure different types of devices. Here's an overview of the available configuration methods:

Configure BLE WiFi Device

Use this method to configure a BLE WiFi device.

Key parameters:

  • ssid: The WiFi network name
  • password: The WiFi password
  • homeId: The home ID where the device will be added
  • deviceUuid: The device's unique identifier
  • `deviceProductId》: The device's product ID
  • timeout: Configuration timeout in milliseconds (default: 3000)

Here's a complete example:

final device = await TuyaHomeSdkFlutter.instance.startConfigBLEWifiDevice(
  ssid: 'MyWiFi',
  password: 'securePassword123',
  homeId: 123,
  deviceUuid: 'abcd1234',
  deviceProductId: 'xyz789',
  timeout: 5000
);

if (device != null) {
  print('Device configured successfully: ${device.name}');
} else {
  print('Failed to configure device');
}

Configure WiFi Device

Use this method to configure a WiFi-only device.

Key parameters:

  • ssid: The WiFi network name
  • password: The WiFi password
  • token: The configuration token
  • timeout: Configuration timeout in milliseconds (default: 3000)

Here's a complete example:

final device = await TuyaHomeSdkFlutter.instance.startConfigWiFiDevice(
  ssid: 'MyWiFi',
  password: 'securePassword123',
  token: 'homeToken123',
  timeout: 5000
);

if (device != null) {
  print('Device configured successfully: ${device.name}');
} else {
  print('Failed to configure device');
}

Configure Wired Device

Use this method to configure a wired device.

Key parameters:

  • token: The configuration token
  • timeout: Optional timeout in milliseconds (default: 3000)

Here's a complete example:

final ThingSmartDeviceModel? device = await TuyaHomeSdkFlutter.instance.startConfigWiredDevice(
  token: 'homeToken123',
  timeout: 5000
);

if (device != null) {
  print('Device configured successfully: ${device.name}');
} else {
  print('Failed to configure device');
}

Configure Sub-Device

Use this method to configure a sub-device.

Key parameters:

  • devId: The device ID of the sub-device
  • timeout: Optional timeout in milliseconds (default: 3000)

Here's a complete example:

final ThingSmartDeviceModel? device = await TuyaHomeSdkFlutter.instance.startConfigSubDevice(
  devId: 'device123',
  timeout: 5000
);

if (device != null) {
  print('Sub-device configured successfully: ${device.name}');
} else {
  print('Failed to configure sub-device');
}

Assign Device to Room

Use this method to assign a device to a specific room in a home.

Key parameters:

  • deviceId: The ID of the device
  • homeId: The ID of the home
  • roomId: The ID of the room (0 to unassign from any room)

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.assignDeviceToRoom(
  deviceId: 'device123',
  homeId: 123,
  roomId: 456
);

if (success) {
  print('Device assigned to room successfully');
} else {
  print('Failed to assign device to room');
}

Get Home Devices

Use this method to retrieve all devices in a specific home.

Key parameters:

  • homeId: The ID of the home

Here's a complete example:

final List<ThingSmartDeviceModel> devices = await TuyaHomeSdkFlutter.instance.getHomeDevices(
  homeId: 123
);

if (devices.isNotEmpty) {
  for (final device in devices) {
    print('Device: ${device.name}, ID: ${device.devId}');
  }
} else {
  print('No devices found in home');
}

Remove Device

Use this method to remove a device from the Tuya ecosystem.

Key parameters:

  • deviceId: The ID of the device to remove

Here's a complete example:

final bool success = await TuyaHomeSdkFlutter.instance.removeDevice(
  deviceId: 'device123'
);

if (success) {
  print('Device removed successfully');
} else {
  print('Failed to remove device');
}

Device Control

Event Listening

Receive Device Updates

Subscribe to real-time device status changes. Returns a stream of DPS updates.

Key parameters:

  • deviceId: The device to monitor

Example:

final subscription = TuyaHomeSdkFlutter.instance
  .onDeviceDpsUpdated(deviceId: 'device123')
  .listen((update) {
    print('Device update received:');
    update.forEach((key, value) {
      print('  $key: $value');
    });
  });

// Remember to cancel when done
subscription.cancel();

Typical DPS updates include:

  • Power state changes
  • Brightness adjustments
  • Temperature updates
  • Other device-specific metrics

Get WiFi SSID

Use this method to get the SSID of the currently connected WiFi network.

Returns:

  • String?: The SSID if available, or null if not connected

Here's a complete example:

final String? ssid = await TuyaHomeSdkFlutter.instance.getWifiSsid();

if (ssid != null) {
  print('Connected to WiFi network: $ssid');
} else {
  print('Not connected to WiFi or SSID unavailable');
}

Publish Device Data Points

Use this method to publish data points (DPS) for a Tuya device.

Key parameters:

  • deviceId: The ID of the device
  • dps: Map of data points (numeric keys recommended)

Here's a complete example:

final device = await TuyaHomeSdkFlutter.instance.publishDps(
  deviceId: 'device123',
  dps: {'1': true, '2': 50}  // DPS 1 = power, DPS 2 = brightness
);

if (device != null) {
  print('DPS published successfully. Device status: ${device.status}');
} else {
  print('Failed to publish DPS');
}

Purchasing a License Key

For purchasing and managing license keys please contact us on our Mail.