## 2.3.2 家居設備同步更新上傳操作(可選功能)
* 如果開發者要接入家居控制功能,需要做設備同步更新上傳操作。在新加入家居設備或者家居設備屬性狀態值有改變以及需要對設備進行分組編號的情況時,需要將家居設備的狀態屬性及分組信息同步更新上傳,設備屬性狀態信息更新上傳要求一次上傳所有的設備,上傳過的設備才能進行指令控制,否則默認顯示找不到設備。設備分組信息更新要求一次上傳所有分組情況,更新上傳設備屬性狀態需要在ChatRobotBuilder初始化完成之后。可通過ChatRobotBuilder.RobotInitListener()的初始化監聽回調方法initComplete(inti)獲取初始化是否完成;
* 如果返回i=0表示ChatRobotBuilder初始化完成,如果i=-1表示初始化失敗。建議在初始化完成之后可根據需要更新或上傳設備信息及設備分組信息,參照demo中的initComplete(int i)方法:
* 通過調用TerminalAccessor接口的upload(JSONArray array)、upload(List\<Equipment\>list)上傳設備信息;
* 其中以JSONArray作為參數的上傳方法需要構造JSONArray,每種設備具有的屬性參見sdk文檔的附錄一表格,將需要更新或上傳的設備屬性在構造JSONArray過程中傳入即可,需要注意的是上傳設備的equip_id和name需要保證是唯一的。
JSON上傳示例:
~~~
private String uploadEquipmentJson() {
JSONArray equipmentArray = new JSONArray();
JSONObject deng1 = new JSONObject();
JSONObject deng2 = new JSONObject();
try {
//equip_id與name需要保證唯一性,且不能為空,否則將報設備找不到
deng1.put("id",301);
deng1.put("equip_type",1000);
deng1.put("equip_id","d1");
deng1.put("name","燈1");
deng1.put("alias","廚房燈");
deng1.put("equip_location","廚房");
deng1.put("brightness",new Progress("80").toJsonString());
equipmentArray.put(deng1);
deng2.put("id",301);
deng2.put("equip_type",1000);
deng2.put("equip_id","d2");
deng2.put("name","燈2");
deng2.put("alias","廁所燈");
deng2.put("equip_location","廁所");
deng2.put("brightness",new Progress("70").toJsonString());
equipmentArray.put(deng2);
} catch (JSONException e) {
e.printStackTrace();
}
return AndroidChatRobotBuilder.get().robot().terminalAccessor().upload(equipmentArray);
}
~~~
* 以List\<Equipment\>作為參數的上傳方法需要將設備的實體類對象添加到list中上傳,設備實體類以Equipment作為父類,已定義的設備實體類詳見API文檔。如果需要上傳的設備沒有定義過相應的實體類,則只能通過構造JSONArray的方式上傳。
list上傳示例:
~~~
private String uploadEquipmentList() {
final List<Equipment> list = new ArrayList<Equipment>();
//equip_id與name需要保證唯一性,且不能為空,否則將報設備找不到
Deng e = new Deng();
e.setEquip_id("d3");
e.setBrightness(new Progress("80"));
e.setName("燈3");
e.setEquip_location("客廳");
e.setAlias("客廳燈");
e.setStatus("OPEN");
list.add(e);
e = new Deng();
e.setBrightness(new Progress("80"));
e.setEquip_id("d4");
e.setName("燈4");
e.setEquip_location("走廊");
e.setAlias("走廊燈");
e.setStatus("CLOSE");
list.add(e);
KongTiao k = new KongTiao();
k.setEquip_location("客廳");
k.setEquip_id("k1");
k.setName("空調");
k.setLevel(3);
k.setStatus("OPEN");
list.add(k);
return AndroidChatRobotBuilder.get().robot().terminalAccessor().upload(list);
}
~~~
注:upload(JSONArray array)、upload(List\<Equipment\>
list)屬于訪問網絡操作,請另起線程執行。
* 通過調用uploadGroup(JSONArray array)、uploadGroup(List\<EquipmentGroup\>list)方法上傳設備分組信息;其中以JSONArray作為參數的設備分組上傳方法需要構造設備分組的JSONArray,包括組名name、分組group、時間戳timestamp等。JSON上傳示例:
~~~
private String uploadEquipmentGroupJson() {
JSONArray equipmentGroup = new JSONArray();
JSONArray jsonArray1 = new JSONArray();
JSONArray jsonArray2 = new JSONArray();
JSONObject object1 = new JSONObject();
JSONObject object2 = new JSONObject();
try {
object1.put("name","白天");
jsonArray1.put("x1");
jsonArray1.put("x2");
jsonArray1.put("x3");
object1.put("group",jsonArray1);
object1.put("timestamp",new java.util.Date().getTime());
object2.put("name","晚上");
jsonArray2.put("y1");
jsonArray2.put("y2");
jsonArray2.put("y3");
object2.put("group",jsonArray2);
object2.put("timestamp",new java.util.Date().getTime());
equipmentGroup.put(object2);
} catch (JSONException e) {
e.printStackTrace();
}
return AndroidChatRobotBuilder.get().robot().terminalAccessor().uploadGroup(equipmentGroup);
}
~~~
* 以List\<EquipmentGroup\>作為參數的設備分組上傳方法需要將EquipmentGroup分組對象添加至list中上傳。EquipmentGroup對象包括組名name、分組group、時間戳timestamp等屬性。
list上傳示例:
~~~
private String uploadEquipmentGroup() {
List<EquipmentGroup> list = new ArrayList<EquipmentGroup>();
EquipmentGroup g = new EquipmentGroup();
g.setName("晚上");
List<String> gids = new ArrayList<String>();
gids.add("l1");
gids.add("k1");
g.setGroup(gids);
list.add(g);
g = new EquipmentGroup();
g.setName("中午");
gids = new ArrayList<String>();
gids.add("l2");
gids.add("k2");
g.setGroup(gids);
list.add(g);
return AndroidChatRobotBuilder.get().robot().terminalAccessor().uploadGroup(list);
}
~~~
注:uploadGroup(JSONArray array)、uploadGroup(List\<EquipmentGroup\> list)屬于訪問網絡操作,請另起線程執行。另外設備功能屬于可選功能,用戶可根據需要決定是否對接。
* 通過調用getGroup()獲取設備分組信息;通過getLastEquipments()獲取最近一次設備集合信息。詳見API文檔。