Умный дом — разгружаем контроллер

Ардуина или ESP-ха всеми доступными способами у меня коллекционирует данные с сенсоров, и при запросе к ней как к веб-серверу отвечает JSON-ом.

digitalWrite(blueled, 0);
String message="{\"humidity\": \"";
message += humidity;
message += "\", \"temperature\": \"";
message += temperature;
message += "\", \"co2\": \"";
message += MQ7Value;
message += "\"}";
server.sendHeader("Access-Control-Allow-Origin","*");
server.send(200, "text/html", message);
digitalWrite(blueled, 1);

В заголовок крайне желательно добавить Access-Control-Allow-Origin иначе Ajax-ом в браузере данные не получите. Но вообще получать данные со страницы браузера прямо из ESP-хи дело не очень полезное. Я в процессе отладки наоткрывал вкладок в браузере, плюс запустил на планшете страницу дома, и поскольку каждая из них раз в 10 секунд пыталась красиво обновить данные на странице, то бедная ESP-ха получила десяток клиентов, что её конечно не убило, но подтупливать она стала реально.

Чтобы не заебать насмерть разгрузить несчастный контроллер, и ESP-ху никто не дергал чаще чем она обновляет данные, запрос со страницы переписал на кэширующий скриптец.

$.getScript(‘/json2js.php?device=1&address=192.168.88.50&name=cabinet’);

Внутри json2js.php отбросив генерацию JS-кода который рисует данные, получение таковых выглядит следующим образом:

$memcached = new Memcached;
$memcached->addServer(‘localhost’, 11211) or die («Could not connect»);
$address=$_GET[‘address’];
if (($RES=$memcached->get(‘DomTMP.’.$address)) === false)
{
$RES=json_decode(file_get_contents(‘http://’.$address));
$memcached->set(‘DomTMP.’.$address, $RES, 10);
}

При такой схеме, сколько бы ни было клиентов, сколько бы не открыли вы вкладок, даже если уснете на клавише F5, к самой ESP-хе обращения будут не чаще чем раз в 10 секунд, при этом кэширующий скрипт при наличии данных к Memcached возвращает результат за 5-10мс, тогда как данные напрямую от ESP браузер получает минимум 50мс, а если нарвался на процесс опроса датчика, то может и 1000мс тупить.