Уменьшаем задержку в отправке команд в модуле Xiaomi Home
Весь свет у меня через реле Aqara Zigbee и я уже смерился с задержкой включения света в ~1 секунду после нажатия на выключатель. Ну тут в чатике чет стали обсуждать это и я полез в код. Делюсь.
Инструкция для более-менее уверенных пользователей, сильно разжёвывать не буду.
1) Изменим тип поля в таблице xiqueue
2) Изменим тип таблицы
3) Уберем "долгие" функции в цикле
4) Заставим работать цикл каждые 300мс
Заходим в pma, находит таблицу xiqueue, заходим в структуру и меняем в поле DATA меняем тип на varchar(255). Далее идем в операции этой же таблицы и меняем тип таблицы на MEMORY.
Далее открываем /scripts/cycle_xiaomihome.php и там:
на 99 строке меняем на while (true) {
в 108 строке с условии if ($queue[0]['ID']) {
меняем все на:
foreach($queue as $k => $v) {
$data = $v['DATA'];
if ($cycle_debug) echo date('H:i:s') . ' Queue command: ' . json_encode($v) . PHP_EOL;
if ($gate_ip != '') {
$ip = $gate_ip;
} else {
$ip = $v['IP'];
}
if ($cycle_debug) echo date('H:i:s') . " Sending: $data to $ip" . PHP_EOL;
$xiaomihome_module->sendMessage($data, $ip, $sock);
SQLExec("DELETE FROM xiqueue WHERE ID=" . $v['ID']);
$tcv_count++;
}
Тем самым мы убили долгую функцию count() и тормозной цикл for()
Далее идем в самый низ и последние 4 строчки файла привести в такой вид:
usleep(300000);
}
echo date('H:i:s') . ' Unexpected close of cycle' . PHP_EOL;
DebMes('Unexpected close of cycle: ' . basename(__FILE__));
Рестартим цикл и все готово.
Спешиал фенкс - Logrus.
Нижний Новгород, Россия
На форуме: SmoKE_xDDD