Как вы помните, у меня уже долгое время стоит домашний сервер на плате Banana BPI-R1, которая мне когда-то полюбилась тем, что сочетает в себе всё мыслимое железо — от SATA для винта и бортового роутера на 5 портов Ethernet — до микрофона и ИК-датчика, там всё есть.
Единственная проблема была с WiFi, который периодически вис. На него я жаловался в дневнике, ставил какие-то какие-то рекомендованные в форумах специальные драйвера и пересобранные версии hostapd, сам писал следилки и перезагружающие костыли на Cи и PHP. Всё это работало плохо, и единственный выход подсказал Denis Dyakov в
комментариях: вообще отказаться от внутреннего WiFi-модуля Realtek и поставить внешний Ralink, по цене это 1200 руб. Да, он USB, но и тот тоже сидел на USB-шине. Для Ralink имеются драйвера прямо в ядре, и работает он уже вторую неделю без сбоев.
Вообще вызывает удивление, как производители и разработчики догадались поставить WiFi-чип от Realtek, который не имеет нормальных драйверов даже на сайте производителя или просто неисправен конструкционно. Но это уже вторая доработка напильником, которую рекомендуется сделать обладателю Bananapi BPI-R1. Во-первых, надо подпаять питание 5 вольт нормальными толстыми проводами: крошечные иголки разъема micro-usb не могут бесперебойно обеспечивать током 2А всю плату со всем оборудованием и винчестером. Кроме того, мы с заехавшим в гости Пашей выпаяли к чертям старый чип (он еще на клею там сидит, его только ножом оторвать можно) — чтоб не жрал ток и не мутил USB-шину. Не стали разбираться, где там отрезается ножка питания, сковырнули, отпаяли и выкинули, вот так:
Во всем остальном, впрочем, Bananapi BPI-R1 продолжает радовать: она бесперебойная, умная, и неплохо держит любую нагрузку — у меня на ней роутер, веб-проекты http://home.lleo.me, базы, электроника, архивный диск на 3ТБ, вся разводка сетей квартиры, и все прочее. А что Wi-Fi роутер внешний и под потолком — это не беда:
Рекомендую. А вот квартирную электронику на порты GPIO я все-таки решил не вешать. Почему? Во-первых, внешний чип AVR (Ардуино) на USB-подключении показал себя за эти годы очень надежной штукой. Во-вторых, вы же понимаете — вся эта электроника, контакты, упадет какой-нибудь проводок 12 вольт мимо разъема на плату, и сгорит не Ардуина ценой в 1$, а весь сервер. Кроме того, обнаружился любопытный момент для систем доступа: принятие решения Ардуиной происходит заметно быстрее, чем сервером. В принципе, все эти RS232-USB соединения должны летать, демоны срабатывать, интерпретаторы запускаться, но на практике это доли секунды, которые ощущаются как задержка. Поэтому сейчас я всю систему переделал, и теперь у меня в Ардуине — список ключей для принятия решения, а на сервере и вебе — развесистая админка, которая модерирует ключи, прописывает имена, открывает-закрывает доступ и синхронизирует таблицы с Ардуиной:
Ну и напоследок поделюсь одним простым, но очень полезным скриптиком для умного дома и квартирной электроники. Смысл в том, что когда у тебя дома есть сервер со звуковыми колонками, имеет смысл передавать разные сообщения голосом. Какие? Да любые. Какой смысл в умном доме, если он молчит? Кто-то в дверь зашел — поздороваться надо. Процессор перегрелся, электричество пропало — сообщить надо хозяину. Проблема тут чисто дизайнерская — сидеть и готовить звуковые файлы на каждый случай. Я обычно просил наговаривать важные сообщения Стаську:
warning disk internet restart port_down port_up warning power warning proc wlan down wlan up wifi ok |
Но лучше всего их готовить через речевой синтезатор. Поскольку подлый Гугль давно отключил свою бесплатную речевую технологию, используем Яндекс, он даже лучше. Идем в кабинет разработчика https://developer.tech.yandex.ru и получаем ключ API для своего домашнего некоммерческого использования. Дальше ваяем такой скрипт speach:
#!/usr/bin/php
<?php $API='4e4261ff-e031-2116-654d-eff7746712bd'; // ключ Яндекса
if(!isset($argv[1])) die('NO FILE'); $txt=$argv[1];
$file='/tmp/'.md5($txt).'.mp3';
if(!is_file($file)) {
$ch=curl_init('https://tts.voicetech.yandex.net/generate?format=mp3&lang=ru-RU&emotion=good&speaker=ermil&key='.$API.'&text='.urlencode($txt));
curl_setopt($ch,CURLOPT_HEADER,1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); cu rl_exec($ch); $r=curl_multi_getcontent($c h);
curl_close($ch); if(!sizeof($r)) die('Error'); file_put_contents($file,$r);
} exec('play '.$file);
?>
И запускаем с небольшой строкой в кавычках:
> ./speach "Потребляемый ток: 0.9 ампер. Напряжение: 4.1 вольт. Загрузка процессора: 11 процентов"
Папку лучше прописать для файлов более постоянную, чтобы при повторе сообщения скрипт второй раз в Яндекс не бегал, а брал из файла. Пример работы — очень внятный голос ermil:
это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2016/12/29_bananapi.html