(11)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接6

导航链接

(1)香橙派+apache2与php+天猫精灵=自建平台语音支持--前言

(2)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派操作系统安装

(3)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派环境配置

(4)香橙派+apache2与php+天猫精灵=自建平台语音支持--apache2与php

(5)香橙派+apache2与php+天猫精灵=自建平台语音支持--MariaDB的安装

(6)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接1

(7)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接2

(8)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接3

(9)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接4

(10)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接5

(11)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接6

(12)香橙派+apache2与php+天猫精灵=自建平台语音支持--天猫精灵对接7

设备查询

还是先上个时序图,看图基本功能也就都知道了。

下图为设备响应指令的详细协议以及协议的解析和响应
 

  1. case 'AliGenie.Iot.Device.Query': {
  2. error_log('----case in Query----');
  3. $result = device_status($obj, $messageId);
  4. break;
  5. }

协议的解析和设备控制协议的解析采用的思想差不多,只不过查询和控制这两个过程是正好相反的。过程控制是主动存储数据,然后又硬件设备读取,查询是硬件设备返回数据存储到服务器上在查询的时候读取。就这样,具体的代码看aligenies_handle.php中的内容吧,这里会调用存储读取的具体PHP。

  1. function device_status($obj, $messageId)
  2. {
  3. error_log('----device_status in----');
  4. global $sqlFileName;
  5. $deviceId = $obj->payload->deviceId;
  6. $action = '';
  7. $deviceType = check_type_from_id($deviceId);
  8. switch ($obj->header->name) {
  9. case 'QueryPowerState':
  10. $action = 'powerstate';
  11. break;
  12. case 'QueryColor':
  13. $action = 'color';
  14. break;
  15. case "QueryTemperature":
  16. $action = "temperature";
  17. break;
  18. case "QueryWindspeed":
  19. $action = "windspeed";
  20. break;
  21. case "QueryBrightness":
  22. $action = "brightness";
  23. break;
  24. case "QueryFog":
  25. $action = "fog";
  26. break;
  27. case "QueryHumidity":
  28. $action = "humidity";
  29. break;
  30. case "QueryPm25":
  31. $action = "pm25";
  32. break;
  33. case "QueryChannel":
  34. $action = "channel";
  35. break;
  36. case "QueryNumber":
  37. $action = "number";
  38. break;
  39. case "QueryDirection":
  40. $action = "direction";
  41. break;
  42. case "QueryAngle":
  43. $action = "angle";
  44. break;
  45. case "QueryAnion":
  46. $action = "anion";
  47. break;
  48. case "QueryEffluent":
  49. $action = "effluent";
  50. break;
  51. case "QueryMode":
  52. $action = "mode";
  53. break;
  54. case "QueryLeftTime":
  55. $action = "lefttime";
  56. break;
  57. case "QueryRemoteStatus":
  58. $action = "remotestatus";
  59. break;
  60. case "QueryOnlineState":
  61. $action = "onlinestate";
  62. break;
  63. case "QueryColorTemperature":
  64. $action = "colorTemperature";
  65. break;
  66. case "Query":
  67. $action = "all";
  68. break;
  69. default:
  70. $action = "";
  71. }
  72. if ($action == "" || $deviceType == "") {
  73. $ret = new AliGenie\QueryResponse(true);
  74. $ret->header->putResponseMessageId($messageId);
  75. $ret->payload->putResponseDeviceId($deviceId);
  76. $ret->payload->putResponseError("DEVICE_NOT_SUPPORT_FUNCTION");
  77. $retJson = json_encode($ret);
  78. return $retJson;
  79. }
  80. $properties = array();
  81. $findDevice = false;
  82. $queryValue = '';
  83. if (($txtRes = fopen($sqlFileName, "r")) === false) {
  84. error_log('----get_control fopen failed----');
  85. $ret = new AliGenie\QueryResponse(true);
  86. $ret->header->putResponseMessageId($messageId);
  87. $ret->payload->putResponseDeviceId($deviceId);
  88. $ret->payload->putResponseError("SERVICE_ERROR", "CANNOT_OPEN");
  89. $retJson = json_encode($ret);
  90. return $retJson;
  91. }
  92. $str = fread($txtRes, filesize($sqlFileName));
  93. $sqlObj = json_decode($str);
  94. $devArray = $sqlObj->dev_array;
  95. $ret = new AliGenie\QueryResponse();
  96. $ret->header->putResponseName($obj->header->name);
  97. $ret->header->putResponseMessageId($messageId);
  98. $ret->payload->putResponseDeviceId($deviceId);
  99. foreach ($devArray as $data) {
  100. error_log('entity_id-->'.$data->entity_id);
  101. error_log('device_type-->'.$data->device_type);
  102. if ($data->entity_id == $deviceId) {
  103. $findDevice = true;
  104. switch ($data->device_type) {
  105. case 'ceiling_lamp': {
  106. $brightnessWhite = '';
  107. $brightnessYellow = '';
  108. foreach ($data->properties as $element) {
  109. error_log('name-->'.$element->name);
  110. error_log('value-->'.$element->value);
  111. if ($element->name =='brightness_w') {
  112. $brightnessWhite = $element->value;
  113. } elseif ($element->name =='brightness_y') {
  114. $brightnessYellow = $element->value;
  115. } else {
  116. $properties[$element->name] = $element->value;
  117. }
  118. }
  119. $properties['brightness'] = ($brightnessWhite>$brightnessYellow)?$brightnessWhite:$brightnessYellow;
  120. if ($brightnessWhite != 0 && $brightnessYellow == 0) {
  121. $properties['color'] = 'White';
  122. } elseif ($brightnessWhite == 0 && $brightnessYellow != 0) {
  123. $properties['color'] = 'Yellow';
  124. } elseif ($brightnessWhite == $brightnessYellow && $brightnessYellow != 0) {
  125. $properties['mode'] = '自然模式';
  126. }
  127. break;
  128. }
  129. }
  130. }
  131. }
  132. fclose($txtRes);
  133. if ($action != 'all') {
  134. $queryValue = $properties[$obj->header->name];
  135. array_splice($properties, 0);
  136. $properties[$obj->header->name] = $queryValue;
  137. }
  138. foreach ($properties as $name => $value) {
  139. $pro = new AliGenie\QueryPropertie($name, $value);
  140. $ret->properties[] = $pro;
  141. }
  142. if ($findDevice == false) {
  143. $ret = new AliGenie\QueryResponse(true);
  144. $ret->header->putResponseMessageId($messageId);
  145. $ret->payload->putResponseDeviceId($deviceId);
  146. $ret->payload->putResponseError("DEVICE_IS_NOT_EXIST");
  147. $retJson = json_encode($ret);
  148. return $retJson;
  149. } else if ($queryValue == '' && $action != 'all') {
  150. $ret = new AliGenie\QueryResponse(true);
  151. $ret->header->putResponseMessageId($messageId);
  152. $ret->payload->putResponseDeviceId($deviceId);
  153. $ret->payload->putResponseError("INVALIDATE_PARAMS");
  154. $retJson = json_encode($ret);
  155. return $retJson;
  156. }
  157. $retJson = json_encode($ret);
  158. error_log('----device_status out----');
  159. return $retJson;
  160. }

到这里所有的文件部署完毕,我们现在天猫精灵上新建一个智能家居,用于真机测试。

下面是

aligenies_gate.php和aligenies_handle.php完整文件的代码。

aligenies_gate.php

  1. <?php
  2. error_log('----aligenies_gate.php in----');
  3. require_once __DIR__.'/aligenies_handle.php';
  4. $chars = md5(uniqid(mt_rand(), true));
  5. $uuid = substr($chars,0,8) . '-';
  6. $uuid .= substr($chars,8,4) . '-';
  7. $uuid .= substr($chars,12,4) . '-';
  8. $uuid .= substr($chars,16,4) . '-';
  9. $uuid .= substr($chars,20,12);
  10. $postStr = file_get_contents("php://input");
  11. $obj = json_decode($postStr);
  12. $messageId = $uuid;
  13. error_log('get-request->'.$postStr);
  14. switch ($obj->header->namespace) {
  15. case 'AliGenie.Iot.Device.Discovery': {
  16. error_log('----case in Discovery----');
  17. $result = device_discovery($messageId);
  18. break;
  19. }
  20. case 'AliGenie.Iot.Device.Control': {
  21. error_log('----case in Control----');
  22. $result = device_control($obj, $messageId);
  23. break;
  24. }
  25. case 'AliGenie.Iot.Device.Query': {
  26. error_log('----case in Query----');
  27. $result = device_status($obj, $messageId);
  28. break;
  29. }
  30. default: {
  31. $result='Nothing return,there is an error~!!';
  32. }
  33. }
  34. echo($result);
  35. error_log('----reseponse----');
  36. error_log($result);
  37. error_log('----aligenies_gate.php out----');
  38. ?>

aligenies_handle.php

  1. <?php
  2. require_once __DIR__.'/DiscoveryResponse.php';
  3. require_once __DIR__.'/ControlResponse.php';
  4. require_once __DIR__.'/QueryResponse.php';
  5. $sqlFileName = "../sqldata.txt";
  6. function device_discovery($messageId)
  7. {
  8. error_log('----device_discovery in----');
  9. global $sqlFileName;
  10. if (($txtRes = fopen($sqlFileName, "r")) === false) {
  11. error_log('----gate_implement fopen failed----');
  12. $ret = new AliGenie\DiscoveryResponse(true);
  13. $ret->header->putResponseMessageId($messageId);
  14. $ret->payload->putResponseError("SERVICE_ERROR", "CANNOT_OPEN");
  15. $retJson = json_encode($ret);
  16. return $retJson;
  17. }
  18. $str = fread($txtRes, filesize($sqlFileName));
  19. error_log("str-->".$str);
  20. $obj = json_decode($str);
  21. $ret = new AliGenie\DiscoveryResponse();
  22. $ret->header->putResponseMessageId($messageId);
  23. foreach ($obj->dev_array as $devElement) {
  24. error_log('entity_id-->'.$devElement->entity_id);
  25. switch ($devElement->device_type) {
  26. case 'ceiling_lamp': {
  27. $dev = new AliGenie\DiscoveryDevice();
  28. $dev->putResponseDeviceInfo($devElement->entity_id, "吸顶灯", device_id_to_devicetype($devElement->entity_id),
  29. "https://www.rtplay.cn/icon/td.png");
  30. $dev->actions = array("TurnOn",
  31. "TurnOff",
  32. "SetBrightness",
  33. "SetColor",
  34. "AdjustUpBrightness",
  35. "AdjustDownBrightness",
  36. "QueryBrightness",
  37. "QueryPowerState",
  38. "QueryColor",
  39. "Query");
  40. $brightnessWhite = '';
  41. $brightnessYellow = '';
  42. foreach ($devElement->properties as $propertie) {
  43. if ($propertie->name =='brightness_w') {
  44. $brightnessWhite = $propertie->value;
  45. } elseif ($propertie->name =='brightness_y') {
  46. $brightnessYellow = $propertie->value;
  47. } else {
  48. $pro = new AliGenie\DiscoveryPropertie($propertie->name, $propertie->value);
  49. $dev->putResponseProperties($pro);
  50. }
  51. }
  52. $brightness = ($brightnessWhite>$brightnessYellow)?$brightnessWhite:$brightnessYellow;
  53. $pro = new AliGenie\DiscoveryPropertie("brightness", $brightness);
  54. $dev->putResponseProperties($pro);
  55. if ($brightnessWhite == 100 && $brightnessYellow == 0) {
  56. $pro = new AliGenie\DiscoveryPropertie("color", "White");
  57. $dev->putResponseProperties($pro);
  58. } elseif ($brightnessWhite == 0 && $brightnessYellow == 100) {
  59. $pro = new AliGenie\DiscoveryPropertie("color", "Yellow");
  60. $dev->putResponseProperties($pro);
  61. } elseif ($brightnessWhite == $brightnessYellow && $brightnessYellow != 0) {
  62. $pro = new AliGenie\DiscoveryPropertie("mode", "自然模式");
  63. $dev->putResponseProperties($pro);
  64. }
  65. $ext = new AliGenie\DiscoveryExtension();
  66. $dev->putResponseExtensions($ext);
  67. $ret->payload->putResponseDevices($dev);
  68. break;
  69. }
  70. case 'gateway_switch': {
  71. $dev = new AliGenie\DiscoveryDevice();
  72. $dev->putResponseDeviceInfo($devElement->entity_id, "插排", device_id_to_devicetype($devElement->entity_id),
  73. "https://www.rtplay.cn/icon/cz.png");
  74. $dev->actions = array("TurnOn",
  75. "TurnOff",
  76. "QueryPowerState",
  77. "Query");
  78. foreach ($devElement->properties as $propertie) {
  79. $pro = new AliGenie\DiscoveryPropertie($propertie->name, $propertie->value);
  80. $dev->putResponseProperties($pro);
  81. }
  82. $ext = new AliGenie\DiscoveryExtension();
  83. $dev->putResponseExtensions($ext);
  84. $ret->payload->putResponseDevices($dev);
  85. break;
  86. }
  87. }
  88. }
  89. $retJson = json_encode($ret);
  90. error_log('retJson-->'.$retJson);
  91. error_log('----device_discovery out----');
  92. return $retJson;
  93. }
  94. function device_status($obj, $messageId)
  95. {
  96. error_log('----device_status in----');
  97. global $sqlFileName;
  98. $deviceId = $obj->payload->deviceId;
  99. $action = '';
  100. $deviceType = check_type_from_id($deviceId);
  101. switch ($obj->header->name) {
  102. case 'QueryPowerState':
  103. $action = 'powerstate';
  104. break;
  105. case 'QueryColor':
  106. $action = 'color';
  107. break;
  108. case "QueryTemperature":
  109. $action = "temperature";
  110. break;
  111. case "QueryWindspeed":
  112. $action = "windspeed";
  113. break;
  114. case "QueryBrightness":
  115. $action = "brightness";
  116. break;
  117. case "QueryFog":
  118. $action = "fog";
  119. break;
  120. case "QueryHumidity":
  121. $action = "humidity";
  122. break;
  123. case "QueryPm25":
  124. $action = "pm25";
  125. break;
  126. case "QueryChannel":
  127. $action = "channel";
  128. break;
  129. case "QueryNumber":
  130. $action = "number";
  131. break;
  132. case "QueryDirection":
  133. $action = "direction";
  134. break;
  135. case "QueryAngle":
  136. $action = "angle";
  137. break;
  138. case "QueryAnion":
  139. $action = "anion";
  140. break;
  141. case "QueryEffluent":
  142. $action = "effluent";
  143. break;
  144. case "QueryMode":
  145. $action = "mode";
  146. break;
  147. case "QueryLeftTime":
  148. $action = "lefttime";
  149. break;
  150. case "QueryRemoteStatus":
  151. $action = "remotestatus";
  152. break;
  153. case "QueryOnlineState":
  154. $action = "onlinestate";
  155. break;
  156. case "QueryColorTemperature":
  157. $action = "colorTemperature";
  158. break;
  159. case "Query":
  160. $action = "all";
  161. break;
  162. default:
  163. $action = "";
  164. }
  165. if ($action == "" || $deviceType == "") {
  166. $ret = new AliGenie\QueryResponse(true);
  167. $ret->header->putResponseMessageId($messageId);
  168. $ret->payload->putResponseDeviceId($deviceId);
  169. $ret->payload->putResponseError("DEVICE_NOT_SUPPORT_FUNCTION");
  170. $retJson = json_encode($ret);
  171. return $retJson;
  172. }
  173. $properties = array();
  174. $findDevice = false;
  175. $queryValue = '';
  176. if (($txtRes = fopen($sqlFileName, "r")) === false) {
  177. error_log('----get_control fopen failed----');
  178. $ret = new AliGenie\QueryResponse(true);
  179. $ret->header->putResponseMessageId($messageId);
  180. $ret->payload->putResponseDeviceId($deviceId);
  181. $ret->payload->putResponseError("SERVICE_ERROR", "CANNOT_OPEN");
  182. $retJson = json_encode($ret);
  183. return $retJson;
  184. }
  185. $str = fread($txtRes, filesize($sqlFileName));
  186. $sqlObj = json_decode($str);
  187. $devArray = $sqlObj->dev_array;
  188. $ret = new AliGenie\QueryResponse();
  189. $ret->header->putResponseName($obj->header->name);
  190. $ret->header->putResponseMessageId($messageId);
  191. $ret->payload->putResponseDeviceId($deviceId);
  192. foreach ($devArray as $data) {
  193. error_log('entity_id-->'.$data->entity_id);
  194. error_log('device_type-->'.$data->device_type);
  195. if ($data->entity_id == $deviceId) {
  196. $findDevice = true;
  197. switch ($data->device_type) {
  198. case 'ceiling_lamp': {
  199. $brightnessWhite = '';
  200. $brightnessYellow = '';
  201. foreach ($data->properties as $element) {
  202. error_log('name-->'.$element->name);
  203. error_log('value-->'.$element->value);
  204. if ($element->name =='brightness_w') {
  205. $brightnessWhite = $element->value;
  206. } elseif ($element->name =='brightness_y') {
  207. $brightnessYellow = $element->value;
  208. } else {
  209. $properties[$element->name] = $element->value;
  210. }
  211. }
  212. $properties['brightness'] = ($brightnessWhite>$brightnessYellow)?$brightnessWhite:$brightnessYellow;
  213. if ($brightnessWhite != 0 && $brightnessYellow == 0) {
  214. $properties['color'] = 'White';
  215. } elseif ($brightnessWhite == 0 && $brightnessYellow != 0) {
  216. $properties['color'] = 'Yellow';
  217. } elseif ($brightnessWhite == $brightnessYellow && $brightnessYellow != 0) {
  218. $properties['mode'] = '自然模式';
  219. }
  220. break;
  221. }
  222. }
  223. }
  224. }
  225. fclose($txtRes);
  226. if ($action != 'all') {
  227. $queryValue = $properties[$obj->header->name];
  228. array_splice($properties, 0);
  229. $properties[$obj->header->name] = $queryValue;
  230. }
  231. foreach ($properties as $name => $value) {
  232. $pro = new AliGenie\QueryPropertie($name, $value);
  233. $ret->properties[] = $pro;
  234. }
  235. if ($findDevice == false) {
  236. $ret = new AliGenie\QueryResponse(true);
  237. $ret->header->putResponseMessageId($messageId);
  238. $ret->payload->putResponseDeviceId($deviceId);
  239. $ret->payload->putResponseError("DEVICE_IS_NOT_EXIST");
  240. $retJson = json_encode($ret);
  241. return $retJson;
  242. } else if ($queryValue == '' && $action != 'all') {
  243. $ret = new AliGenie\QueryResponse(true);
  244. $ret->header->putResponseMessageId($messageId);
  245. $ret->payload->putResponseDeviceId($deviceId);
  246. $ret->payload->putResponseError("INVALIDATE_PARAMS");
  247. $retJson = json_encode($ret);
  248. return $retJson;
  249. }
  250. $retJson = json_encode($ret);
  251. error_log('----device_status out----');
  252. return $retJson;
  253. }
  254. function device_control($obj, $messageId)
  255. {
  256. error_log('----device_control in----');
  257. global $sqlFileName;
  258. $deviceId = $obj->payload->deviceId;
  259. $action = '';
  260. $deviceType = '';//Customize device type
  261. $deviceType = device_id_to_type($deviceId);
  262. error_log("deviceType-->".$deviceType);
  263. $action = get_control_action($obj->header->name);
  264. error_log("action-->".$action);
  265. if ($action == "" || $deviceType == "") {
  266. error_log('----get_control_action failed----');
  267. $ret = new AliGenie\ControlResponse(true);
  268. $ret->header->putResponseMessageId($messageId);
  269. $ret->payload->putResponseError("SERVICE_ERROR",
  270. "action or device not support,name:".$obj->header->name." device:".substr($deviceId,0,stripos($deviceId,".")));
  271. $retJson = json_encode($ret);
  272. return $retJson;
  273. }
  274. $validArray = array (
  275. "deviceId" => $deviceId,
  276. "deviceType" => $deviceType,
  277. "actionName" => $obj->header->name,
  278. "action" => $action,
  279. "attribute" => $obj->payload->attribute,
  280. "value" => $obj->payload->value
  281. );
  282. $checkResult = control_checker($validArray);
  283. if ($checkResult != 'succeed') {
  284. error_log('----control_checker failed----');
  285. $ret = new AliGenie\ControlResponse(true);
  286. $ret->header->putResponseMessageId($messageId);
  287. $ret->payload->putResponseError("DEVICE_NOT_SUPPORT_FUNCTION");
  288. $retJson = json_encode($ret);
  289. return $retJson;
  290. }
  291. //-----------------------------------
  292. if (($txtRes = fopen($sqlFileName, "r+")) === false) {
  293. error_log('----get_control fopen failed----');
  294. $ret = new AliGenie\ControlResponse(true);
  295. $ret->header->putResponseMessageId($messageId);
  296. $ret->payload->putResponseError("SERVICE_ERROR", "CANNOT_OPEN");
  297. $retJson = json_encode($ret);
  298. return $retJson;
  299. }
  300. $str = fread($txtRes, filesize($sqlFileName));
  301. error_log("str-->".$str);
  302. $sqlObj = json_decode($str);
  303. //error_log("sqlObj-->".print_r($sqlObj, true));
  304. $ret = new AliGenie\ControlResponse();
  305. $ret->header->putResponseMessageId($messageId);
  306. $ret->header->putResponseName($obj->header->name);
  307. $ret->payload->putResponseDeviceId($obj->payload->deviceId);
  308. foreach ($sqlObj->dev_array as $devElement) {
  309. error_log('entity_id-->'.$devElement->entity_id);
  310. if ($devElement->entity_id == $validArray['deviceId']) {
  311. $ret->payload->putResponseDeviceId($devElement->entity_id);
  312. switch ($devElement->device_type) {
  313. case 'ceiling_lamp': {
  314. switch ($validArray['action']) {
  315. case 'turn_on': {
  316. foreach ($devElement->properties as $propertie) {
  317. error_log('name-->'.$propertie->name);
  318. if ($propertie->name == "powerstate") {
  319. $propertie->value = "on";
  320. break;
  321. }
  322. }
  323. break;
  324. }
  325. case 'turn_off': {
  326. foreach ($devElement->properties as $propertie) {
  327. error_log('name-->'.$propertie->name);
  328. if ($propertie->name == "powerstate") {
  329. $propertie->value = "off";
  330. break;
  331. }
  332. }
  333. break;
  334. }
  335. case 'bright_set': {
  336. foreach ($devElement->properties as $propertie) {
  337. error_log('name-->'.$propertie->name);
  338. if ($propertie->name == "brightness_w" && $propertie->value != 0) {
  339. $propertie->value = $validArray['value'];
  340. } else if ($propertie->name == "brightness_y" && $propertie->value != 0) {
  341. $propertie->value = $validArray['value'];
  342. }
  343. }
  344. break;
  345. }
  346. case 'bright_up': {
  347. foreach ($devElement->properties as $propertie) {
  348. error_log('name-->'.$propertie->name);
  349. if ($propertie->name == "brightness_w" && $propertie->value != 0) {
  350. $propertie->value += $validArray['value'];
  351. if ($propertie->value > 100) {
  352. $propertie->value = 100;
  353. }
  354. } else if ($propertie->name == "brightness_y" && $propertie->value != 0) {
  355. $propertie->value += $validArray['value'];
  356. if ($propertie->value > 100) {
  357. $propertie->value = 100;
  358. }
  359. }
  360. if ($propertie->name == "powerstate") {
  361. $propertie->value = "on";
  362. break;
  363. }
  364. }
  365. break;
  366. }
  367. case 'bright_down': {
  368. $brightnessWhite = '10';
  369. $brightnessYellow = '10';
  370. foreach ($devElement->properties as $propertie) {
  371. error_log('name-->'.$propertie->name);
  372. if ($propertie->name == "brightness_w" && $propertie->value != 0) {
  373. $propertie->value -= $validArray['value'];
  374. if ($propertie->value < 0) {
  375. $propertie->value = 0;
  376. }
  377. $brightnessWhite = $propertie->value;
  378. } else if ($propertie->name == "brightness_y" && $propertie->value != 0) {
  379. $propertie->value -= $validArray['value'];
  380. if ($propertie->value < 0) {
  381. $propertie->value = 0;
  382. }
  383. $brightnessYellow = $propertie->value;
  384. }
  385. if ($brightnessWhite == 0 && $brightnessYellow == 0) {
  386. foreach ($devElement->properties as $propertie) {
  387. error_log('name-->'.$propertie->name);
  388. if ($propertie->name == "powerstate") {
  389. $propertie->value = "off";
  390. break;
  391. }
  392. }
  393. }
  394. }
  395. break;
  396. }
  397. case 'mode_set': {
  398. $brightnessWhite = '0';
  399. $brightnessYellow = '0';
  400. foreach ($devElement->properties as $propertie) {
  401. error_log('name-->'.$propertie->name);
  402. if ($propertie->name == "brightness_w") {
  403. $brightnessWhite = $propertie->value;
  404. } else if ($propertie->name == "brightness_y") {
  405. $brightnessYellow = $propertie->value;
  406. }
  407. }
  408. $brightness = ($brightnessWhite>$brightnessYellow)?$brightnessWhite:$brightnessYellow;
  409. foreach ($devElement->properties as $propertie) {
  410. error_log('name-->'.$propertie->name);
  411. if ($propertie->name == "brightness_w" || $propertie->name == "brightness_y") {
  412. $propertie->value = $brightness;
  413. }
  414. }
  415. break;
  416. }
  417. case 'color_set': {
  418. if ($validArray['value'] == 'White') {
  419. foreach ($devElement->properties as $propertie) {
  420. error_log('name-->'.$propertie->name);
  421. if ($propertie->name == "brightness_w") {
  422. $propertie->value = 100;
  423. } else if ($propertie->name == "brightness_y") {
  424. $propertie->value = 0;
  425. }
  426. }
  427. } else if ($validArray['value'] == 'Yellow') {
  428. foreach ($devElement->properties as $propertie) {
  429. error_log('name-->'.$propertie->name);
  430. if ($propertie->name == "brightness_w") {
  431. $propertie->value = 0;
  432. } else if ($propertie->name == "brightness_y") {
  433. $propertie->value = 100;
  434. }
  435. }
  436. }
  437. break;
  438. }
  439. }
  440. break;
  441. }
  442. }
  443. }
  444. }
  445. $jsonData = json_encode($sqlObj);
  446. error_log('jsonData-->'.$jsonData);
  447. fclose($txtRes);
  448. if (($txtRes = fopen($sqlFileName, "w+")) === false) {
  449. error_log('----get_control fopen failed----');
  450. $ret = new AliGenie\ControlResponse(true);
  451. $ret->header->putResponseMessageId($messageId);
  452. $ret->payload->putResponseError("SERVICE_ERROR", "CANNOT_OPEN");
  453. $retJson = json_encode($ret);
  454. return $retJson;
  455. }
  456. if (!fwrite($txtRes, $jsonData)) {
  457. fclose($txtRes);
  458. error_log('----get_control fwrite failed----');
  459. $ret = new AliGenie\ControlResponse(true);
  460. $ret->header->putResponseMessageId($messageId);
  461. $ret->payload->putResponseError("SERVICE_ERROR", "CANNOT_WRITE");
  462. $retJson = json_encode($ret);
  463. return $retJson;
  464. }
  465. fclose($txtRes);
  466. $retJson = json_encode($ret);
  467. error_log('----device_control out----');
  468. return $retJson;
  469. }
  470. function check_type_from_id($deviceId)
  471. {
  472. $deviceType = device_id_to_type($deviceId);
  473. if ($deviceType != 'ceiling_lamp' && $deviceType != 'gateway_switch') {
  474. $deviceType = "";
  475. }
  476. return $deviceType;
  477. }
  478. function get_control_action($controlName)
  479. {
  480. $action = "";
  481. switch ($controlName) {
  482. case 'TurnOn':
  483. $action = 'turn_on';
  484. break;
  485. case 'TurnOff':
  486. $action = 'turn_off';
  487. break;
  488. case 'SelectChannel':
  489. $action = 'channel_set';
  490. break;
  491. case 'AdjustUpChannel':
  492. $action = 'channel_up';
  493. break;
  494. case 'AdjustDownChannel':
  495. $action = 'channel_down';
  496. break;
  497. case 'AdjustUpVolume':
  498. $action = 'volume_up';
  499. break;
  500. case 'AdjustDownVolume':
  501. $action = 'volume_down';
  502. break;
  503. case 'SetVolume':
  504. $action = 'volume_set';
  505. break;
  506. case 'SetMute':
  507. $action = 'mute_set';
  508. break;
  509. case 'CancelMute':
  510. $action = 'mute_cancel';
  511. break;
  512. case 'Play':
  513. $action = 'play';
  514. break;
  515. case 'Pause':
  516. $action = 'pause';
  517. break;
  518. case 'Continue':
  519. $action = 'continue';
  520. break;
  521. case 'Next':
  522. $action = 'next';
  523. break;
  524. case 'Previous':
  525. $action = 'previous';
  526. break;
  527. case 'SetBrightness':
  528. $action = 'bright_set';
  529. break;
  530. case 'AdjustUpBrightness':
  531. $action = 'bright_up';
  532. break;
  533. case 'AdjustDownBrightness':
  534. $action = 'bright_down';
  535. break;
  536. case 'SetTemperature':
  537. $action = 'temperature_set';
  538. break;
  539. case 'AdjustUpTemperature':
  540. $action = 'temperature_up';
  541. break;
  542. case 'AdjustDownTemperature':
  543. $action = 'temperature_down';
  544. break;
  545. case 'SetWindSpeed':
  546. $action = 'windspeed_set';
  547. break;
  548. case 'AdjustUpWindSpeed':
  549. $action = 'WindSpeed_up';
  550. break;
  551. case 'AdjustDownWindSpeed':
  552. $action = 'WindSpeed_down';
  553. break;
  554. case 'SetMode':
  555. $action = 'mode_set';
  556. break;
  557. case 'SetColor':
  558. $action = 'color_set';
  559. break;
  560. case 'OpenFunction':
  561. $action = 'function_open';
  562. break;
  563. case 'CloseFunction':
  564. $action = 'function_close';
  565. break;
  566. case 'Cancel':
  567. $action = 'cancel';
  568. break;
  569. case 'CancelMode':
  570. $action = 'mode_cancel';
  571. break;
  572. default:
  573. break;
  574. }
  575. return $action;
  576. }
  577. function device_id_to_type($deviceId)
  578. {
  579. $deviceType = "";
  580. $deviceArray = [];
  581. $deviceArray = explode('.', $deviceId);
  582. $deviceType = $deviceArray[1];
  583. return $deviceType;
  584. }
  585. function device_id_to_devicetype($deviceId)
  586. {
  587. $deviceType = "";
  588. $deviceArray = [];
  589. $deviceArray = explode('.', $deviceId);
  590. $deviceType = $deviceArray[0];
  591. return $deviceType;
  592. }
  593. function control_checker($arrayData)
  594. {
  595. error_log('----control_checker in----');
  596. if (empty($arrayData)) {
  597. return "jsonData null";
  598. }
  599. switch ($arrayData['deviceType']) {
  600. case 'ceiling_lamp': {
  601. if ($arrayData['attribute'] == 'powerstate' ||
  602. $arrayData['attribute'] == 'brightnessStep' ||
  603. $arrayData['attribute'] == 'brightness' ) {//Full Support Request Action
  604. return 'succeed';
  605. }
  606. if ($arrayData['attribute'] == 'mode' && $arrayData['value'] == '自然模式') {
  607. return 'succeed';
  608. }
  609. if ($arrayData['attribute'] == 'color' && ($arrayData['value'] == 'White' || $arrayData['value'] == 'Yellow')) {
  610. return 'succeed';
  611. }
  612. return 'failed';
  613. }
  614. break;
  615. case 'gateway_switch': {
  616. }
  617. break;
  618. default:
  619. break;
  620. }
  621. error_log('----control_checker out----');
  622. }
  623. ?>