D1 Mini Wemos на esp8266 12E У меня такие https://www.forumhouse.ru/threads/378870/. На выходе 5в есть, USB и все ноги разведены. Около 300 рублей стоит
Спасибо конечно, но собирать самому схемы как-то не хочется. Постараюсь найти законченное устройство, что бы можно было просто заменить традиционный выключатель на более умный, которым в т. ч. можно по wifi управлять. Дополнительно могу модули коммутации вывести под фальш-потолок. Там места много.
Посмотрите https://www.elkoep.ru/produkcija/ Сами работаем с другими чехами (параллельное направление безопасности), эти ребята вроде адекватные. Продукцию чехи очень качественную делают. Тут могу утверждать по своему направлению (охранка Jablotron).
Вчера хотел подшутить по поводу этого вопроса - В отечественном понимании DIY-лизма модули ESP8266 - вполне себе законченное решение. На уровне Ардуино. Чего там - купи модуль, добавь релюшку, блок питания, скачай, настрой и залей прошивку. Куда уж проще? На всякую пожаро/электробезопасность - наплевать. Главное - дешево. @Smith2007 подозреваю, что кроме интернет-розеток вы ничего готового для Wi-Fi не найдете. Встречаются еще коробочки на ESP, но это далеко не выключатели - их только под потолок.
Допилил звуковое сопровождение. Теперь вся озвучка делается единственным php скриптом. Код: <?php ################################################### # Ubuntu 16.04/ PHP7 # # Скрипт получает на входе текстовую строку, # синтезирует из нее речевой аудиофайл, # копирует полученный файл на сервер asterisk # подключается к asterisk ami и воспроизводит файл/ # # Для работы скрипта требуется установить php-ssh2 # # sudo apt-get update # sudo apt-get install php-ssh2 # Сервер на котором запускается php и сервер # asterisk - на разных ip ################################################### # --- Входные переменные --- $speaker = $_REQUEST['speaker']; // Голоса: Женские - jane, oksana, alyss omazh, Мужские - zahar, ermil $emotion = $_REQUEST['emotion']; // Эмоциональная окраска голоса. Возможные значения: // good — радостный, доброжелательный // evil — раздраженный // neutral — нейтральный (используется по умолчанию) $speech = $_REQUEST['speech']; // имя файла синтезированного текста (file.mp3) $text = $_REQUEST['text']; // Синтезируемый текст # --- настройка Asterisk --- $strhost = "192.168.1.11"; // Адрес сервера FreePBX $strport = "5038"; // Порт AMI $timeout = "100"; $ami_user = "openhab\r\n"; // Пользователь AMI интерфейса FreePBX $ami_password = "password\r\n";// Пароль AMI $ssh_user = "user"; $ssh_password = "password"; $errno=0 ; $errstr=0 ; # ------ Настройки Yandex.Speech --------------- $KeyCode="2a4c42ce-b445-43d8-b5a5-88f6cee9c11a"; // API Key Yandex.Speech if (empty($speaker)) { $speaker = "omazh"; }; // значения по умолчанию if (empty($emotion)) { $emotion = "evil"; }; // значения по умолчанию if (empty($speech)) { $speech = "speech.mp3"; }; // значения по умолчанию if (empty($text)) { $text = "Внимание! Обнаружено нарушение периметра безопасности!"; }; // значения по умолчанию $SpeechFile="/tmp/$speech"; // Путь/Имя файла в который будет записана синтезируемая речь echo "$SpeechFile \r\n"; $qs = http_build_query(array("format" => "mp3","lang" => "ru-RU","speaker" => $speaker,"key" =>$KeyCode,"emotion" => $emotion, "text" => $text)); $ctx = stream_context_create(array("http"=>array("method"=>"GET","header"=>"Referer: \r\n"))); $soundfile = file_get_contents("https://tts.voicetech.yandex.net/generate?".$qs, false, $ctx); $i=file_put_contents($SpeechFile, $soundfile); echo("i=$i \r\n"); // Если синтезировали речь - копируем полученный файл на FreePBX if ( $i > 0 ) { // Подключаемся к серверу по ssh if ($connection = ssh2_connect($strhost, 22)) { echo "Connection Successful!\r\n"; } else { die("Connection Failed...\r\n"); }; // авторизуемся на сервере if (ssh2_auth_password($connection, $ssh_user, $ssh_password)) { echo "Authentication Successful!\r\n"; } else { die("Authentication Failed...\r\n"); } // Копируем файл на FreePBX ssh2_scp_send($connection, $SpeechFile, "/tmp/$speech", 0644); // /tmp/$speech - каталог должен совпадать с каталогом из контекста // /etc.asterisk/extention_custom.conf -> pa-custom -> Playback(/tmp/${var1}) if (!$connection) die('Send failed'); }; #-------------- вызываем asterisk AMI и воспроизводим синтезированный аудиофайл--------------------- $var1 = basename($speech, '.mp3') + "\r\n\r\n"; // для asterisk требуется имя без расширения $sconn = fsockopen ($strhost, $strport, $$errno, $$errstr, $timeout) or die("Connection to $strhost:$strport failed"); if (!$sconn) { echo "$errstr ($errno)<br>\n"; } else { fputs ($sconn, "Action: login\r\n"); fputs ($sconn, "Username: $ami_user"); fputs ($sconn, "Secret: $ami_password"); fputs ($sconn, "Events: off\r\n\r\n"); usleep(500); fputs ($sconn, "Action: Originate\r\n"); fputs ($sconn, "Channel: Local/590@from-internal\r\n"); fputs ($sconn, "Callerid: OpenHAB\r\n"); fputs ($sconn, "Timeout: 15000\r\n"); fputs ($sconn, "Context: pa-custom\r\n"); fputs ($sconn, "Exten: 577\r\n"); fputs ($sconn, "Priority: 1\r\n\r\n"); fputs ($sconn, "Async: yes\r\n\r\n" ); fputs ($sconn, "Variable: var1=$var1" ); fputs ($sconn, "Action: Logoff\r\n\r\n"); usleep (500); fclose ($sconn); } ?> Вызов из rules Код: rule "Protect" when Item PCode_0 changed from CLOSED to OPEN or Item PCode_1 changed from CLOSED to OPEN or Item PCode_2 changed from CLOSED to OPEN or Item PCode_3 changed from CLOSED to OPEN or Item PCode_4 changed from CLOSED to OPEN or Item PCode_5 changed from CLOSED to OPEN or Item PCode_6 changed from CLOSED to OPEN or Item PCode_7 changed from CLOSED to OPEN or Item PCode_8 changed from CLOSED to OPEN or Item PCode_9 changed from CLOSED to OPEN or Item PCode_10 changed from CLOSED to OPEN or Item PCode_11 changed from CLOSED to OPEN or Item PCode_12 changed from CLOSED to OPEN or Item PCode_13 changed from CLOSED to OPEN or Item Test_Protect changed from OFF to ON then Test_Protect.sendCommand (OFF) Test_Protect.postUpdate (OFF) var String SpeechTxt = "Внимание! Обнаружено нарушение периметра безопасности!" / var String SpeechTxt = "Добрый день, Максимка! Добрый день Дениска!" SpeechTxt = SpeechTxt. encode('UTF-8') var String Subject = "SH2: Protect!" var String Message = " var int year = now. getYear var int month = now. getMonthOfYear var int day = now. getDayOfMonth var int hour = now. getHourOfDay var int minute = now. getMinuteOfHour logInfo("Protect", "year=" + year + " month=" + month + " day=" + day + " hour=" + hour + " minute=" + minute) val String mask = "img_" + year + "-" + month + "-" + day + "_" + hour + "." + minute logInfo("Protect", "mask=" + mask) val List<String> attachmentUrlList = newArrayList( "file:/etc/openhab/cmd/snapshot/"+mask+"_cam1.jpg", "file:/etc/openhab/cmd/snapshot/"+mask+"_cam2.jpg", "file:/etc/openhab/cmd/snapshot/"+mask+"_cam3.jpg", "file:/etc/openhab/cmd/snapshot/"+mask+"_cam4.jpg") logInfo("Protect", "List=" + attachmentUrlList) if (PCode_0.state = OPEN) {Message = Message + "Обнаружено движение в гараже! " } if (PCode_1.state = OPEN) {Message = Message + "Обнаружено движение в Мастерской! " } if (PCode_2.state = OPEN) {Message = Message + "Обнаружено движение в котельной! " } if (PCode_3.state = OPEN) {Message = Message + "Обнаружено движение в ванной 0 этажа! " } if (PCode_4.state = OPEN) {Message = Message + "Обнаружено движение в фойе 2 этажа! " } if (PCode_5.state = OPEN) {Message = Message + "Обнаружено движение в прихожей! " } if (PCode_6.state = OPEN) {Message = Message + "Обнаружено движение в ванной 1 этажа! " } if (PCode_7.state = OPEN) {Message = Message + "Разбито стекло в гараже! " } if (PCode_8.state = OPEN) {Message = Message + "Разбито стекло в мастерской! " } if (PCode_9.state = OPEN) {Message = Message + "Разбито стекло в котельной! " } if (PCode_10.state = OPEN) {Message = Message + "Разбито стекло в ванной 0 этажа! " } if (PCode_11.state = OPEN) {Message = Message + "Разбито стекло в ванной 1 этажа! " } if (PCode_12.state = OPEN) {Message = Message + "Секционные ворота открыты! " } if (PCode_13.state = OPEN) {Message = Message + "Калитка секционных ворот открыта! " } if (Test_Protect.state = ON) {Message = Message + "Тестирование системы безопасности " } var String url="http: /192.168.1.5/intercom.php?text=" + SpeechTxt logInfo("Protect", "url=" + url) sendHttpGetRequest (url) var String snapshot = "/etc/openhab/cmd/snapshot_dvr.sh@@" + mask executeCommandLine (snapshot) Thread: sleep (5000) / logInfo("Protect", "mask= " mask) sendMail (EMail, Subject, Message, attachmentUrlList) end
Нет. Я уже построил всю систему на базе ПЛК + openhab для визуализации. При этом система получилась не зависимой от платформы. Это может быть комп с браузером, а так же имеются "заточенные" приложения для смартфонов на базе андроид и ios. Плюсом к Openhab нужно отнести то, что это проект с открытым кодом (open source) над которым трудятся тысячи программистов.
Прочитал тему. Спасибо что делитесь реализацией своих идей. Как я понял каждый микрокомпьютер (FreePBX и система видеонаблюдения) связаны через коммутатор с сервером. Возник вопрос, почему не реализовали FreePBX (IP телефонная станция) и систему видеонаблюдения на одном микрокомпе (Intel Atom). Если бы была такая реализация, то какие проблемы бы возникли: - в пропускной способности канала связи между коммутатором и микрокомпьютером; - в производительности микрокомпьютера?
Конечно. Все компьютеры связаны в одну сеть гигабитным коммутатором. FreePBX удобно разворачивать сразу готовый пакет вместе с операционной системой CentOS (линух). Видеонаблюдение требовательно с ресурсам процессора. Идет кодирование сигнала с 4-х видеокмер и раздача по сетке. Кроме того обновлять отдельные узлы безопаснее. Меньше вероятности, что накосячиш чего и потом все встанет разом. Сервер видеонаблюдения и freepbx работают и я даже забываю об их существовании. uptime 121 день и это совпадает с длительным отключением электроэнергии, когда UPS не справился. Аналогично с freepbx Зачем что-то еще придумывать если все работает?
Ни с чем не возникли бы проблемы. Ни с каналом ни с CPU. Просто лень что-то менять, когда все исправно работает.
@Smith2007, камеры тоже в гигабитный коммутатор воткнуты? Я правильно понимаю что они в этом случае питание получают по отдельному кабелю, а не через рое? Или теперь гигабитную скорость между остальными гигабитными клиентами можно получить даже если в сеть воткнут 100 мегабитный клиент?
У меня аналоговые камеры стоят. Видеорегистратор захватывает видеосигнал и кодирует. Современные коммутаторы допускает это. 100 мбитные клиенты у меня имеются несколько штук. Один SIP телефон старенький и точки доступа. Но сеть разделена на vlan и они ни как не мешают друг другу. По крайней мере рабочий комп утилизирует свой гигабитный порт на 98% когда качаю чего либо и при этом телефония не тормозит, видеонаблюдение не тормозит.
@DiaZoN, 100 мегабитные и гигибитные порты в коммутаторе друг на друга не влияют. В современных коммутаторах все порты работают на максимально доступной скоростью, и CPU коммутатора это практически не загружает. Я пробовал на SMB коммутаторах с четырьмя 10G портами их максимально нагрузить трафиком. Тоже никаких проблем, коммутатор успешно справляется. Отдельный коммутатор SMB класса.