npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@tuya/connector

v1.0.4

Published

A library for communicating with Tuya SaaS admin service, based on Axios.

Downloads

56

Readme

=======

Tuya Connector FE SDK

English | 中文版

Contents

Overview

Tuya Connector FE SDK encapsulates APIs in JavaScript that allow the Tuya SaaS Admin to manage data. Currently, it provides APIs related to account login and logout, password change, asset management, and device management.

For more information about the image of the demo project,visit https://hub.docker.com/r/iotportal/iot-suite.

Compatible browsers

| Google Chrome | Firefox | Safari | Opera | Microsoft Edge | Internet Explorer | --- | --- | --- | --- | --- | --- | | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 11 ✔ |

Installation

npm install @tuya/connector

or

yarn add @tuya/connector

Examples

import {version, apiService} from '@tuya/connector'

// Current SDK version number.
console.log(version);

const {multiLogin} = apiService;

multiLogin({
  userName: 'test',
  pwd: '123123a',
}).then((res) => {
  if (res) {
    // Login is successful.
    console.log('logged in');
  } else {
    console.error('fail to login');
  }
}).catch((err) => {
  // Failed to log in.
  console.error('login fail', err);
})

If a specific domain or port is required, you can initialize the relevant configuration before use.

import {configMethod} from '@tuya/connector'

const {initGlobalConfig, getGlobalConfig, setGlobalConfig} = configMethod;

// Called when the project is initialized. Global initialization is required only once.
// For specific configurations, see Request Config.
initGlobalConfig({
  baseURL: '',
  method: 'GET',
  onError: () => {}, // Global error callback.
})

// Returns the currently changed configuration. The default configuration of Request Config will not be carried.
getGlobalConfig()

// The specific configuration is the same as initGlobalConfig, and the underlying layer of initGlobalConfig is implemented using setGlobalConfig.
setGlobalConfig({})

Features

Methods

login

Log in with an email address.

type UserToken = {
  nick_name: string, // Username.
  token: string,
  role_type: string[], // Role type.
  userId: string;
}
/**
 * @param username: string
 * @param pwd: string
 */

login('test', 'test').then((<UserToken>res) => {
  // Returns UserToken on success.
  console.log(res)
})

multiLogin

Log in with an email address or mobile phone number.

interface loginParams {
  userName?: string,
  pwd: string,
  countryCode?: string,
  phoneNum?: string,
}

// Log in with an email address.
multiLogin({
  userName: '[email protected]',
  pwd: 'test',
}).then((<UserToken>res) => {
  // Returns UserToken on success.
  console.log(res)
});

// Log in with a mobile phone number.
multiLogin({
  countryCode: '86',
  phoneNum: '13000000000',
  pwd: 'test',
}).then((<UserToken>res) => {
  // Returns UserToken on success.
  console.log(res)
})

logout

Log out of the current account.

logout().then(() => {
  // The login status in the server has been cleaned up, and you must maintain the local status.
  console.log('logout success');
});

resetPassword

Change the password.

/**
 * @param username
 * @param oldPwd
 * @param newPwd
 */
resetPassword('test', '123', '321').then((res) => {
  // Boolean type. It indicates whether the operation is successful.
  console.log(res);
})

resetPassword('test', '123', '321', {
  baseURL: 'http://localhost:8000',
  method: 'POST'
}).then((res) => {
  // Boolean type. It indicates whether the operation is successful.
  console.log(res);
})

forgetPassword

Reset the password.

interface forgetPwdParams {
  code: string;
  newPassword: string;
}

interface emailForgetPwdParams extends forgetPwdParams {
  mail: string;
}

interface phoneForgetPwdParams extends forgetPwdParams {
  countryCode: string;
  phone: string;
}

const params1 = {
  countryCode: '86',
  phone: '13100001111',
  code: '123456',
  newPassword: 'abcdefg123',
} : phoneForgetPwdParams;

forgetPassword(params1).then((res) => {
  console.log(<boolean>res);
});

const params1 = {
  mail: '[email protected]',
  code: '123456',
  newPassword: 'abcdefg123',
} : emailForgetPwdParams;
forgetPassword(params1).then((res) => {
  console.log(<boolean>res);
});

getVerifyCode

Get a verification code.

interface verifyCodeParamsPhone {
  language: string,
  countryCode: string,
  phone: string,
}

interface verifyCodeParamsEmail {
  mail: string,
  language: string,
}

const params1 = {
  countryCode: '86',
  phone: '13100001111',
  language: 'zh-CN',
}: verifyCodeParamsPhone;

getVerifyCode(params1).then((res) => {
  console.log(<boolean>res);
});

const params2 = {
  mail: '[email protected]',
  language: 'en-US',
}: verifyCodeParamsEmail;

getVerifyCode(params2).then((res) => {
  console.log(<boolean>res);
});

getChildrenAssetsByAssetId

Get the list of first-level sub-assets.

type Asset = {
  asset_id: string;
  asset_name: string;
  full_asset_name: string;
};

/**
 * @param assetId: string
 */
getChildrenAssetsByAssetId('1').then((res) => {
  console.log(<Asset[]>res);
})

searchAssetByName

Search for an asset.

/**
 * @param assetName: string
 */
searchAssetByName('test').then((res) => {
  console.log(<Asset[]>res);
})

addAsset

Add an asset.

/**
 * @param assetName: string,
 * @param parentAssetId: string = "",
 */
addAsset('newAsset', '1').then((res) => {
  // The ID of the new asset.
  console.log(<string>res)
})

editAsset

Edit the asset name.

type errorType = {
  apiMethodName: string;
  msg: string;
  code: number;
  httpCode: string;
}

/**
 * @param assetId: string,
 * @param assetName: string,
 */
editAsset('assetId', 'assetName').then((res) => {
  // Edited the asset name successfully.
  console.log(<boolean>res)
}).catch((err) => {
  // Failure reason.
  console.error(<errorType>err)
})

removeAsset

Remove an asset.

type errorType = {
  apiMethodName: string;
  msg: string;
  code: number;
  httpCode: string;
}

/**
 * @param assetId: string,
 */
removeAsset('assetId').then((res) => {
  // Deleted the asset successfully.
  console.log(<boolean>res)
}).catch((err) => {
  // Failure reason.
  console.error(<errorType>err)
})

getEntireTree

Get the entire asset tree.

type BaseAsset = {
  asset_id: string;
  asset_name: string;
  full_asset_name: string;
};

type Asset = BaseAsset & {
  child_asset_count: number;
  child_device_count: number;
};

type AssetDeep = Asset & {
  subAssets: AssetDeep[];
};

getEntireTree().then((res) => {
  // Got the asset tree successfully.
  console.log(<AssetDeep>res);
})

getSubTree

Get the asset subtree.

/**
 * @param assetId: string,
 */
getSubTree('1').then((res) => {
  // Get the asset subtree of which the asset ID is `1`.
  console.log(<AssetDeep>res);
});

getDevicesInfoByAssetId

type DeviceStatus = {
  code: string; // Status name
  value: Object; // Status value
  options?: string; // DP value configuration
  editable?: boolean; // Indicates whether it is editable
  name?: string; // DP name
  type?: string; // DP type
};

type DeviceInfo = {
  id: string; // Device number
  name: string; // Device name
  uid: string; // User ID
  local_key: string; // Key
  category: string; // Product category
  product_id: string; // Product ID
  product_name: string; // Product name
  sub: boolean; // Indicates whether a sub-device is used
  uuid: string; // The universally unique identifier of a device
  online: boolean; // The online status of a device
  active_time: number; // The timestamp when a device is activated, in seconds
  icon: string; // The icon of a device
  ip: string; // The IP address of a device
  create_time: number; // The timestamp when a device is created, in seconds
  update_time: number; // The timestamp when a device is updated, in seconds
  time_zone: string; // Time zone, for example, `+08:00`
  status: DeviceStatus[];
}

/**
 * @param assetId: string,
 * @param pageNum: number,
 * @param pageSize: number,
 */
getDevicesInfoByAssetId('1', 1, 20).then((res) => {
  console.log(<DeviceInfo[]>res);
})

getDeviceInfoByDeviceId

type DeviceInfo = {
  id: string; // Device number
  name: string; // Device name
  uid: string; // User ID
  local_key: string; // Key
  category: string; // Product category
  product_id: string; // Product ID
  product_name: string; // Product name
  sub: boolean; // Indicates whether a sub-device is used
  uuid: string; // The universally unique identifier of a device
  online: boolean; // The online status of a device
  active_time: number; // The timestamp when a device is activated, in seconds
  icon: string; // The icon of a device
  ip: string; // The IP address of a device
  create_time: number; // The timestamp when a device is created, in seconds
  update_time: number; // The timestamp when a device is updated, in seconds
  time_zone: string; // Time zone, for example, `+08:00`
  status: DeviceStatus[];
}

/**
 * @param deviceId: string,
 */
getDeviceInfoByDeviceId('1').then((res) => {
  console.log(<DeviceInfo>res)
})

removeDeviceById

Remove a device.

/**
 * @param deviceId: string,
 */
removeDeviceById('12').then((res) => {
  console.log(<boolean>res);
})

modifyDeviceInfo

Modify the information about a device.

/**
 * @param deviceId: string,
 * @param devicename: string,
 */
modifyDeviceInfo('12', 'devicename').then((res) => {
  console.log(<boolean>res);
})

modifyDeviceDP

Control a device.

For more information about standard instruction sets, see the official website.

type DeviceStatus = {
  code: string; //   Status name
  value: Object; // Status value
  options?: string; // DP value configuration
  editable?: boolean; // Indicates whether it is editable
  name?: string; // DP name
  type?: string; // DP type
};
/**
 * @param deviceId: string,
 * @param deviceStatuses: DeviceStatus[],
 */
modifyDeviceDP('12', [{code: '', value: 2}]).then((res) => {
  console.log(<boolean>res);
})

getDeviceDP

Get the instructions.

For more information about standard instruction sets, see the official website.

/**
 * @param deviceId: string,
 */
getDeviceDP('12').then((res) => {
  console.log(res)
})

getDeviceInfoWithDP

Get the device information and DP.

This method is the aggregation result of getDeviceDP and getDeviceInfoByDeviceId. Specify the DP in the status field of deviceInfo.

/**
 * @param deviceId: string,
 */
getDeviceInfoWithDP('deviceId1').then((res) => {
  console.log(<DeviceInfo>res);
})

// Sample
{
  id: 'deviceId1',
  name: 'deviceId1',
  uid: 'uid1',
  local_key: 'local_key',
  category: 'category',
  product_id: 'product_id',
  product_name: 'product_name',
  sub: true,
  uuid: 'uuid',
  online: true,
  active_time: 1615175477,
  icon: 'icon',
  ip: '127.0.0.1',
  create_time: 1615175477,
  update_time: 1615175477,
  time_zone: '+08:00',
  status: [
    {
      code: "va_temperature",
      value: 243,
      editable: false,
      type: "Integer",
      options: "{\"unit\":\"℃\",\"min\":-399,\"max\":800,\"scale\":1,\"step\":1}",
      name: '',
    },
    {
      code: "va_humidity",
      value: 55,
      editable: false,
      type: "Integer",
      options: "{\"unit\":\"%\",\"min\":0,\"max\":100,\"scale\":0,\"step\":1}",
      name: '',
    },
    {
      code: "battery_percentage",
      value: 40,
      name: '',
      editable: false,
      type: "Integer",
      options: "{\"unit\":\"%\",\"min\":0,\"max\":100,\"scale\":0,\"step\":1}",
    },
    {
      code: "charge_state",
      value: false,
      editable: false,
      type: "Boolean",
      options: "{}",
      name: '',
    },
    {
      code: "temp_unit_convert",
      value: "c",
      editable: true,
      name: "Temperature unit conversion",
      type: "Enum",
      options: "{\"range\":[\"c\",\"f\"]}",
    },
    {
      code: "maxtemp_set",
      value: 535,
      editable: true,
      name: "Maximum temperature",
      type: "Integer",
      options: "{\"unit\":\"℃\",\"min\":-399,\"max\":800,\"scale\":1,\"step\":1}",
    },
    {
      code: "minitemp_set",
      value: 0,
      editable: true,
      name: "Minimum temperature",
      type: "Integer",
      options: "{\"unit\":\"℃\",\"min\":-399,\"max\":800,\"scale\":1,\"step\":1}",
    },
    {
      code: "maxhum_set",
      value: 95,
      editable: true,
      name: "Maximum humidity",
      type: "Integer",
      options: "{\"unit\":\"%\",\"min\":0,\"max\":100,\"scale\":0,\"step\":1}"
    },
    {
      code: "minihum_set",
      value: 10,
      name: "Minimum humidity",
      editable: true,
      type: "Integer",
      options: "{\"unit\":\"%\",\"min\":0,\"max\":100,\"scale\":0,\"step\":1}"
    },
    {
      code: "temp_alarm",
      value: "upperalarm",
      type: "Enum",
      editable: false,
      options: "{\"range\":[\"loweralarm\",\"upperalarm\",\"cancel\"]}",
      name: '',
    },
    {
      code: "hum_alarm",
      value: "cancel",
      type: "Enum",
      editable: false,
      options: "{\"range\":[\"loweralarm\",\"upperalarm\",\"cancel\"]}",
      name: '',
    }
  ]
}

getProjectInfo

Get the QR code to bind a device.

type ProjectInfo = {
  project_name: string;
  project_code: string;
};

getProjectInfo().then((res) => {
  // Got the QR code successfully.
  console.log(<ProjectInfo>res);
})

getAccountList

Get the list of accounts.

interface user {
  userId: string;
  nickName: string;
  userName: string; // The login account
  createTime: string;
  roles: role[];
}

interface getAccountListParams {
  searchKey: string;
  roleCode: string;
  pageNo: number;
  pageSize: number;
  }

interface userListResp {
  total: number;
  pageNo: number;
  pageSize: number;
  data: user[];
  }
getAccountList({
  searchKey: '',
  roleCode: '',
  pageNo: 1,
  pageSize: 20,
}).then((res) => {
  return <userListResp>res;
})

getPermissionListByAccount

Get the list of permissions granted to the account.

getPermissionListByAccount('uid').then((res) => {
  return <permission[]>res;
})

addAccount

Add an account.

interface addAccountParams {
  password: string;
  nickName?: string;
  roleCodes: string[];
  userName: string,
  countryCode?: string,
  }
addAccount({
  password: '123123A',
  roleCodes: ['manager-1000'],
  userName: '[email protected]',
}).then((res) => {
  return <boolean>res;
})

batchRemoveAccount

Delete multiple accounts in a call.

batchRemoveAccount(['userId1', 'userId2']).then((res) => {
  return <boolean>res;
})

removeAccount

Delete an account.

removeAccount('userID').then((res) => {
  return <boolean>res;
})

editAccountPwd

Change the account password.

editAccountPwd('userName', '123456A').then((res) => {
  return <boolean>res;
})

batchModifyUserRole

Modify multiple account roles.

batchModifyUserRole(['userId1', 'userId2'], 'manager-1000').then((res) => {
  return <boolean>res;
})

modifyUserRole

Modify an account role.

modifyUserRole('userId', 'manager-1000').then((res) => {
  return <boolean>res;
});

getEntireAssetTree

Get the entire asset tree (without the information about device quantity).

type PermissionAsset = Omit<Asset, 'child_device_count'>; 
type PermissionAssetTree = PermissionAsset & {
  subAssets: PermissionAssetTree[];
};
getEntireAssetTree().then((res) => {
  return <PermissionAsset[]>res;
});

getUserAssetPermissionTree

Get the list of user assets.

getUserAssetPermissionTree('userId').then((res) => {
  return <PermissionAsset[]>res;
});

grantUserAssetPermission

Modify the list of user assets.

grantUserAssetPermission('userId', ['1', '2']).then((res) => {
  return <boolean>res;
});

getRoleList

Get the list of roles.

interface role {
  roleCode: string;
  roleName: string;
  }
interface paginationType {
  total: number;
  pageNo: number;
  pageSize: number;
};
interface roleListResp extends paginationType {
  data: role[],
  }
getRoleList(1, 20).then((res) => {
  return <roleListResp>res;
})

getEntireRoles

Get all roles.

getEntireRoles().then((res) => {
  return <role[]>res;
})

addRole

Add a role.

enum RoleType {
  manager = 'manager',
  normal = 'normal',
  }

interface addRoleParams {
  roleName: string;
  roleType: RoleType;
  roleRemark?: string; // Role description
  }
addRole({
  roleName: 'roleName',
  roleType: 'normal',
}).then((res) => {
  return <boolean>res;
})

removeRole

Delete a role.

removeRole('roleCode').then((res) => {
  return <boolean>res;
})

editRoleName

Modify a role name.

interface editRoleNameParams {
  roleCode: string,
  roleName: string,
  roleRemark?: string,
  }
editRoleName({
  roleCode: 'normal-xxx',
  roleName: '321',
}).then((res) => {
  return <boolean>res;
})

grantPermissionByRole

Modify the list of permissions granted to a role.

interface grantPermissionByRoleParams {
  roleCode: string;
  permissionCodes: string[];
  }
grantPermissionByRole({
  roleCode: 'normal-xxxxx',
  permissionCodes: ['1000', '2000'],
}).then((res) => {
  return <boolean>res;
})

getRolePermissionDetail

Get the list of permissions granted to a role.

enum PermissionType {
  menu = 'menu',
  api = 'api',
  button = 'button',
  data = 'data',
};

interface permission {
  permissionCode: string;
  permissionName: string;
  permissionType: PermissionType;
  parentCode: string;
  order: string;
  remark: string;
  authorizable: boolean;
  }

getRolePermissionDetail('manager-1000').then((res) => {
  return <permission[]>res;
})

getRolePermissionTemplate

Get the template of role permissions.

getRolePermissionTemplate('manager').then((res) => {
  return <permission[]>res;
})

Error handling

If an HTTP error occurs, apiService will get the error. You can use promise catch to get the error message.

apiService.getDeviceInfoByDeviceId('1').catch(({msg, code}) => {
  console.error(msg);
})

Alternatively, you can register the global error handling methods in initConfig.

type ApiError = {
  httpCode: number, // HTTP code
  code: number,
  msg: string,
  apiMethodName: string, // The API method name
  }

initConfig({
  onError: (<ApiError>errorObj) => {}
})

Configure requests

For more information about request configuration, see Axios request config.

Test cases

As a preparation, start the mock server.

Listen on port 7001 by default.

npm run testServer

Start the unit test.

npm run jest

License

For more information about the license, see MIT License.