component.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. //api配置
  2. apiTool.config("127.0.0.1",8085,3000);
  3. this.onReceive=function(method,path,header,params,body){
  4. //method:post、get、delete...
  5. //path:请求路径
  6. //header:http请求头数据,结构:{xx:xx,yy:yy}
  7. //params:请求参数,结构:{xx:[...],yy:[...]}
  8. //body:请求体,当提交的数据为json格式时使用,结构:{xx:xx,yy:yy}
  9. apiTool.log("onReceive body:"+body);
  10. var duHeader=body.header;
  11. var namespace=duHeader.namespace;
  12. var requestName=duHeader.name;
  13. var messageId=duHeader.messageId;
  14. var duPayload=body.payload;
  15. var token=duPayload.accessToken;
  16. var openUid=duPayload.openUid;
  17. //设备发现
  18. if(namespace=="DuerOS.ConnectedHome.Discovery" && requestName=="DiscoverAppliancesRequest"){
  19. var deviceIds=[];
  20. var discoveredDevices=[];
  21. var content={
  22. header:{
  23. namespace:"DuerOS.ConnectedHome.Discovery",
  24. name:"DiscoverAppliancesResponse",
  25. messageId:messageId,
  26. payloadVersion:1
  27. },
  28. payload:{
  29. discoveredAppliances:discoveredDevices,
  30. discoveredGroups:[{
  31. groupName:"客厅",
  32. applianceIds:deviceIds,
  33. groupNotes:"客厅分组控制",
  34. additionalGroupDetails:{}
  35. }]
  36. }
  37. };
  38. var rst=apiTool.getSpaceDevices(token);
  39. apiTool.log(JSON.stringify(rst));
  40. if(rst && rst.status==200 && rst.data){
  41. var devices=rst.data;
  42. for(var i in devices){
  43. var device=devices[i];
  44. var did=device.deviceId;
  45. var pk=device.productKey;
  46. var dn=device.deviceName;
  47. //更新设备openUid
  48. rst=apiTool.setOpenUid(token,did,"dueros",openUid);
  49. if(!rst || rst.status!=200){
  50. continue;
  51. }
  52. //插座
  53. if(pk=="cGCrkK7Ex4FESAwe"){
  54. var powerstate=device.property.powerstate;
  55. discoveredDevices.push({
  56. actions:["turnOn","turnOff"],
  57. applianceTypes:["SOCKET"],
  58. additionalApplianceDetails:{},
  59. applianceId:device.deviceId,
  60. friendlyDescription:"智能插座",
  61. friendlyName:device.name,
  62. isReachable:device.online,
  63. manufacturerName:"海曼",
  64. modelName:"S1",
  65. version:"v1.0",
  66. attributes:[
  67. {
  68. name:"客厅的插座",
  69. scale:"",
  70. timestampOfSample:0,
  71. uncertaintyInMilliseconds:10
  72. },
  73. {
  74. name:"connectivity",
  75. value:"REACHABLE",
  76. scale:"",
  77. timestampOfSample:0,
  78. uncertaintyInMilliseconds:10
  79. },
  80. {
  81. name:"turnOnState",
  82. value:powerstate==1?"ON":"OFF",
  83. scale:"",
  84. timestampOfSample:0,
  85. uncertaintyInMilliseconds:10,
  86. legalValue:"(ON, OFF)"
  87. }
  88. ]
  89. });
  90. }else if(pk=="Rf4QSjbm65X45753"){
  91. //开关
  92. var powerstate=device.property.powerstate;
  93. discoveredDevices.push({
  94. actions:["turnOn","turnOff"],
  95. applianceTypes:["SWITCH"],
  96. additionalApplianceDetails:{},
  97. applianceId:device.deviceId,
  98. friendlyDescription:"智能开关",
  99. friendlyName:device.name,
  100. isReachable:device.online,
  101. manufacturerName:"海曼",
  102. modelName:"S1",
  103. version:"v1.0",
  104. attributes:[
  105. {
  106. name:"客厅的开关",
  107. scale:"",
  108. timestampOfSample:0,
  109. uncertaintyInMilliseconds:10
  110. },
  111. {
  112. name:"connectivity",
  113. value:"REACHABLE",
  114. scale:"",
  115. timestampOfSample:0,
  116. uncertaintyInMilliseconds:10
  117. },
  118. {
  119. name:"turnOnState",
  120. value:powerstate==1?"ON":"OFF",
  121. scale:"",
  122. timestampOfSample:0,
  123. uncertaintyInMilliseconds:10,
  124. legalValue:"(ON, OFF)"
  125. }
  126. ]
  127. });
  128. }
  129. }
  130. }
  131. return {
  132. url:"",//不指定直接作为响应返回
  133. header:{
  134. contentType:"application/json"
  135. },
  136. content:JSON.stringify(content)
  137. }
  138. }else if(namespace=="DuerOS.ConnectedHome.Control"){
  139. //设备控制
  140. var appliance=duPayload.appliance;
  141. var deviceId=appliance.applianceId;
  142. var confirmName="UnsupportedOperationError";
  143. var rst={status:500};
  144. //开关
  145. if(requestName=="TurnOnRequest"){
  146. //开
  147. confirmName="TurnOnConfirmation";
  148. rst=apiTool.setProperties(token,deviceId,{powerstate:1});
  149. }else if(requestName=="TurnOffRequest"){
  150. //关
  151. confirmName="TurnOffConfirmation";
  152. rst=apiTool.setProperties(token,deviceId,{powerstate:0});
  153. }
  154. if(rst.status!=200){
  155. confirmName="UnsupportedOperationError";
  156. apiTool.log("device control failed:"+JSON.stringify(rst));
  157. }
  158. var content={
  159. header: {
  160. namespace: "DuerOS.ConnectedHome.Control",
  161. name: confirmName,
  162. messageId: messageId,
  163. payloadVersion: "1"
  164. },
  165. payload: {
  166. "attributes": []
  167. }
  168. };
  169. return {
  170. url:"",
  171. header:{
  172. contentType:"application/json"
  173. },
  174. content:JSON.stringify(content)
  175. }
  176. }else if(namespace=="DuerOS.ConnectedHome.Query"){
  177. //属性查询
  178. if(requestName=="ReportStateRequest"){
  179. var appliance=duPayload.appliance;
  180. var deviceId=appliance.applianceId;
  181. var property=appliance.attributeName;
  182. var propertyVal="";
  183. var success=false;
  184. if(property=="turnOnState"){
  185. //开关状态查询
  186. var rst= apiTool.getSpaceDeviceDetail(token,deviceId);
  187. if(rst && rst.status==200 && rst.data.property){
  188. propertyVal=rst.data.property.powerstate==1?"ON":"OFF";
  189. success=true;
  190. }
  191. }
  192. var content=success?{
  193. "header": {
  194. "namespace": "DuerOS.ConnectedHome.Query",
  195. "name": "ReportStateResponse",
  196. "messageId": new Date().getTime()+"",
  197. "payloadVersion": "1"
  198. },
  199. "payload": {
  200. "attributes": [
  201. {
  202. "name": property,
  203. "value": propertyVal,
  204. "scale": "",
  205. "timestampOfSample": new Date().getTime()/1000,
  206. "uncertaintyInMilliseconds": 0
  207. }
  208. ]
  209. }
  210. }:{};
  211. return {
  212. url:"",
  213. header:{
  214. contentType:"application/json"
  215. },
  216. content:JSON.stringify(content)
  217. }
  218. }
  219. }
  220. return {
  221. url:"",//不指定直接作为响应返回
  222. header:{
  223. contentType:"application/json"
  224. },
  225. content:""
  226. }
  227. }