SayVoice | Говори голосом
global $voicemode; $voicemode='on'; setGlobal('minMsgLevel',0); say('Хорошо.'); |
easyRF |
$device_id=$params['did']; $destination_id=$params['dest']; $packet_id=$params['pid']; $command_id=$params['c']; $data=$params['d']; if ($device_id==0) { if ($command_id==10) { //temp setGlobal('ws.tempInside',round($data/100)); } elseif ($command_id==12) { //motion callMethod('intSensor.statusChanged',array('status'=>1)); clearTimeOut($id.'_move'); setTimeOut($id.'_move',"callMethod('intSensor.statusChanged',array('status'=>0));",20); } } |
RCSwitch |
$id=$params['rcswitch']; if ($id=='12345') { //sensor 1 } |
Watching movie |
say(LANG_GENERAL_SETTING_UP_LIGHTS,2); // to-do |
2ip | Интернет Проверка
$mes = 'Про интернет к которому я подключена: '; $url="http://api.2ip.com.ua/provider.json"; //Работаем со строкой JSON $data = json_decode(file_get_contents($url), true); $ip=$data["ip"]; // что искали $name_ripe=$data["name_ripe"]; $name_rus=$data["name_rus"]; $site=$data["site"]; echo $ip; $mes .= 'Ай-Пи адрес ' . $ip . ', Провайдер: ' . $name_rus . '. '; //$mes .= 'Сайт провайдера: ' . $site . '. '; $url2="http://api.2ip.com.ua/geo.json?ip=".$ip; echo $url2; //Работаем со строкой JSON $data = json_decode(file_get_contents($url2), true); $country_rus=$data["country_rus"]; // что искали $region_rus=$data["region_rus"]; $city_rus=$data["city_rus"]; $mes .= 'Мое местонахождение по мнению других: ' . $country_rus . ', '; $mes .= $region_rus; if($region_rus != $city_rus) { $mes .= ', ' . $city_rus; } $mes .= '.'; say($mes); |
backupServer |
/* * Сценарий для ежедневного создания резервных копий БД и каталогов. * * Архивы сохраняются на локальный диск и загружаются в облако (на Яндекс.Диск средствами REST API и OAuth-авторизации). * Предусмотрена ротация архивных копий (хранится не более заданного числа архивов, остальные удаляются). * На каждый ежедневный архив создается собственный каталог с именем вида "год-месяц-день", в который * помещаются файлы с архивами БД и каталогов. * * Для использования облачного хранилища Яндекс.Диск предварительно необходимо авторизоваться на Яндексе * и создать приложение здесь https://oauth.yandex.ru/client/new (указать название приложения, дать все права * в разделе Яндекс.Диск REST API, в Callback URL подставить URL для разработки). В свойствах созданного приложения * будут приведены ID и пароль приложения. * * OAuth-токен можно получить вручную согласно этой инструкции https://tech.yandex.ru/oauth/doc/dg/tasks/get-oauth-token-docpage/ * Либо, оставив поле token в $yandexDiskConfig пустым, указать в этом сценарии свои логин и пароль для доступа к сервисам Яндекса, * тогда токен будет запрашиваться у Яндекса при каждом запуске сценария. Рекомендую запросить токен таким образом однократно, а в * дальнейшем полученный токен указывать непосредственно в $yandexDiskConfig). * * Если имеется несколько учеток к Яндекс.Диск, то достаточно создать только одно приложение и указывать его ID и пароль при * получении токена для другой учетки. * * Copyright (C) 2014-2015 Agaphonov Dmitri aka skysilver [mailto:skysilver.da@gmail.com] */ /* Конфигурация и параметры */ $numberOfCloudBackups = gg('dailyBackup.numberOfCloudBackups'); // количество хранимых бэкапов в облаке (в днях) $numberOfLocalBackups = gg('dailyBackup.numberOfLocalBackups'); // количество хранимых бэкапов локально (в днях) $cloudBackupFolder = gg('dailyBackup.cloudBackupFolder'); // каталог для бэкапов в облаке (например, /backups) $localBackupFolder = gg('dailyBackup.localBackupFolder'); // локальный каталог для бэкапов (например, /home/skysilver/backups) // Путь к вспомогательному shell-скрипту // У пользователя www-data нет права чтения некоторых каталогов. Поэтому, чтобы была возможность такие // каталоги архивировать, для запуска линуксовых команд используется shell-скрипт, который благодаря sudo // может запускаться с правами root под пользователем www-data. // Чтобы дать пользователю www-data возможность запускать этот скрипт от root, // необходимо в /etc/sudoers добавить строку www-data ALL=(root) NOPASSWD: /путь_до_скрипта/backup.sh $shellScript = "/usr/src/backupmd.sh"; // Определим путь к текущему (сегодняшнему) локальному каталогу и каталогу на Яндекс Диск $todayLocalFolder = $localBackupFolder."/".date('Y-m-d'); $todayCloudFolder = $cloudBackupFolder."/".date('Y-m-d'); // Архивируемые БД и реквизиты доступа к ним. $databases = [ ['login' => gg('dailyBackup.mysqlUser'), 'password' => gg('dailyBackup.mysqlPassword'), 'dbname' => 'db_terminal'], ['login' => gg('dailyBackup.mysqlUser'), 'password' => gg('dailyBackup.mysqlPassword'), 'dbname' => 'torrentmonitor'], ['login' => gg('dailyBackup.mysqlUser'), 'password' => gg('dailyBackup.mysqlPassword'), 'dbname' => 'zm'], ]; // Архивируемые каталоги $dirs = [ //['name' => 'etc', 'path' => '/etc'], ['name' => 'mysql', 'path' => '/media/d5c56356-c68d-4a48-8976-203b9de5448e/mysql-data'], //['name' => 'logs', 'path' => '/var/log'], ['name' => 'SmartHome', 'path' => '/media/d5c56356-c68d-4a48-8976-203b9de5448e/smarthome'], ]; // Реквизиты доступа к Яндекс Диск // Если токен уже получен, то параметры app_id, app_secret, login и password можно не заполнять. // Если токена нет, то заполняем все поля, а поле token оставляем пустым (равным ''). $yandexDiskConfig = [ 'app_id' => gg('YaDisk1.app_id'), // идентификатор приложения 'app_secret' => gg('YaDisk1.app_secret'), // секретный ключ (пароль) приложения 'token' => gg('YaDisk1.token'), // OAuth-токен //'login' => gg('YaDisk1.login'), // логин пользователя //'password' => gg('YaDisk1.password'), // пароль пользователя ]; // Писать логи ( 0-нет, 1-только критические, 2-все ) $reclog = 2; // Т.к. архивирование и загрузка файлов в облако может занимать неопределенное время, // то снимем ограничение на время выполнения php-скрипта (по умолчанию в моем конфиге php.ini задано 90 секунд). set_time_limit(0); /* Оповещение */ say('Начинаю архивацию данных на сервере.', 1); // Открываем лог, если нужно. if ($reclog) { $log = getLogger('script.backupServer'); } if ($reclog == 2) $log->trace('Начало резервного копирования данных на сервере.'); /* Архивация БД и каталогов сервера на локальный диск */ if ($reclog == 2) $log->trace('Этап 1. Архивация БД и каталогов сервера на локальный диск.'); // Проверяем, создан или нет общий каталог для бэкапов. Если нет, то создаем. if (!is_dir($localBackupFolder)) { if ($reclog == 2) $log->trace(sprintf('Создаем общий каталог %s на локальном диске.', $localBackupFolder)); if (!mkdir($localBackupFolder, 0777)) { if ($reclog) $log->error('Не удалось создать общий каталог на локальном диске.'); return; } else { if ($reclog == 2) $log->trace('Общий каталог успешно создан.'); } } else { if ($reclog == 2) $log->trace('Общий каталог для бэкапов уже создан на локальном диске.'); } // Проверяем, создан или нет каталог для ежедневного бэкапа. Если нет, то создаем. if (!is_dir($todayLocalFolder)) { if ($reclog == 2) $log->trace(sprintf('Создаем каталог для ежедневного бэкапа %s на локальном диске.', $todayLocalFolder)); if (!mkdir($todayLocalFolder, 0777)) { if ($reclog) $log->error('Не удалось создать каталог для ежедневного бэкапа на локальном диске.'); return; } else { if ($reclog == 2) $log->trace('Каталог для ежедневного бэкапа успешно создан.'); } } else { if ($reclog == 2) $log->trace(sprintf('Каталог для ежедневного бэкапа %s уже создан на локальном диске.', $todayLocalFolder)); } /* Архивирование баз данных */ $date = date('Y-m-d_H-i'); foreach ($databases as $db) { $filename = "$todayLocalFolder/mysql_{$db['dbname']}_$date.sql.gz"; // f - force overwrite of output file and compress links // 1 - compress faster // 9 - compress better // mysqldump --opt - аккумулирует в себя сразу несколько опций // (--add-drop-table, --add-locks, --all, --extended-insert, --quick, --lock-tables) $cmd = "mysqldump --user={$db['login']} --password={$db['password']} --no-create-db --add-drop-table {$db['dbname']} | gzip -f -4 > $filename"; exec($cmd, $out); if (!file_exists($filename) || filesize($filename) < 100) { if ($reclog) $log->error(sprintf('Резервная копия БД %s не создана: %s', $db['dbname'], $out)); } else { if ($reclog == 2) $log->trace(sprintf('Резервная копия БД %s успешно создана на локальном диске.', $db['dbname'])); } } foreach ($dirs as $dir) { $filename = "$todayLocalFolder/files_{$dir['name']}_$date.tar.gz"; //c - создать архив, //v - выводить информацию о процессе, //z - использовать сжатие gzip, //p - сохраняем данные о владельцах и правах доступа, //f - пишем архив в файл //P - don't strip leading `/'s from file names $cmd = "sudo ".$shellScript." -czpPf $filename {$dir['path']}"; //var_dump($cmd); exec($cmd, $out); //var_dump($op); if (!file_exists($filename) || filesize($filename) < 100) { if ($reclog) $log->error(sprintf('Резервная копия каталога %s не создана: %s', $dir['name'], $out)); } else { if ($reclog == 2) $log->trace(sprintf('Резервная копия каталога %s успешно создана на локальном диске.', $dir['name'])); } } say('Архивация данных на сервере закончена.', 1); /* Копирование локального бэкапа в облако */ say('Начинаю копирование локального бэкапа в облако.', 1); if ($reclog == 2) $log->trace('Этап 2. Копирование локального бэкапа в облако.'); // Создаем объект класса Yandex_Disk // Если токен еще не получен (не указан в конфиге), то запросим его. if( $yandexDiskConfig['token'] == '' ) { $ynd = new Yandex_Disk($yandexDiskConfig); $myToken = $ynd->getToken(); //echo "<br> Токен = ".$myToken." <br>"; //sg('YaDisk1.token', $myToken); if ($reclog) $log->error(sprintf('Мой OAuth-токен: %s', $myToken)); if( isset($ynd->error) ) { if ($reclog) $log->error(sprintf('Ошибка запроса OAuth-токена: %s', $ynd->error)); } } else $ynd = new Yandex_Disk($yandexDiskConfig); // Узнаем доступное место на Яндекс Диске (для справки) $req = $ynd->get(); if( isset($req['error']) ) { if ($reclog) $log->error(sprintf('Ошибка запроса метаинформации о диске: %s', $req['message'])); } else { //Получаем свободное и занятое место sg('YaDisk1.totalSpace', round(($req['total_space']) / 1024 / 1024 / 1024, 2)); sg('YaDisk1.usedSpace', round(($req['used_space']) / 1024 / 1024 / 1024, 2)); sg('YaDisk1.freeSpace', round(($req['total_space'] - $req['used_space']) / 1024 / 1024 / 1024, 2)); if ($reclog == 2) $log->trace(sprintf('Всего места на Яндекс.Диске: %s ГБ.', gg('YaDisk1.totalSpace'))); if ($reclog == 2) $log->trace(sprintf('Занято данными: %s ГБ.', gg('YaDisk1.usedSpace'))); if ($reclog == 2) $log->trace(sprintf('Свободно: %s ГБ.', gg('YaDisk1.freeSpace'))); } // Проверяем, создан или нет общий каталог для бэкапов на Яндекс Диске. Если нет, то создаем. $req = $ynd->resources_get($cloudBackupFolder); if( isset($req['error']) || $req['path'] != 'disk:'.$cloudBackupFolder) { if ($reclog == 2) $log->trace(sprintf('Создаем общий каталог %s на Яндекс.Диске.', $todayCloudFolder)); $req = $ynd->resources_put($cloudBackupFolder); if( isset($ynd->error) ) { if ($reclog) $log->error(sprintf('Ошибка создания общего каталога на Яндекс.Диск: %s', $ynd->error)); } else { if ($reclog == 2) $log->trace('Общий каталог успешно создан.'); } } else { if ($reclog == 2) $log->trace('Общий каталог для бэкапов уже создан на Яндекс.Диске.'); } // Если локальный каталог с архивами существует if (is_dir($todayLocalFolder)) { // Узнаем содержимое каталога $files = scandir($todayLocalFolder); // Проверяем, создан или нет каталог для ежедневного бэкапа на Яндекс Диске. Если нет, то создаем. $req = $ynd->resources_get($todayCloudFolder); if( isset($req['error']) || $req['path'] != 'disk:'.$todayCloudFolder) { if ($reclog == 2) $log->trace(sprintf('Создаем каталог для ежедневного бэкапа %s на Яндекс.Диске.', $todayCloudFolder)); $req = $ynd->resources_put($todayCloudFolder); if( isset($ynd->error) ) { if ($reclog) $log->error(sprintf('Ошибка создания каталога для ежедневного бэкапа на Яндекс.Диск: %s', $ynd->error)); } else { if ($reclog == 2) $log->trace('Каталог для ежедневного бэкапа успешно создан.'); } } else { if ($reclog == 2) $log->trace(sprintf('Каталог для ежедневного бэкапа %s уже создан на Яндекс.Диске.', $todayCloudFolder)); } // Загрузим все файлы архивов на Яндекс Диск foreach($files as $file) { if(($file != ".") && ($file != "..")) { if(is_file($todayLocalFolder."/".$file)) { $fileCloudPath = $todayCloudFolder."/".$file; $fileLocalPath = $todayLocalFolder."/".$file; // Если файл с таким же именем уже существует, то будет переписан. if ($reclog == 2) $log->trace(sprintf('Загрузка на Яндекс.Диск: %s [%s Байт]', $file, filesize($fileLocalPath))); $req = $ynd->file_upload($fileCloudPath, $fileLocalPath); } } } } say('Копирование локального бэкапа в облако завершено.', 1); /* Ротация бэкапов на локальном диске и в облаке */ say('Начинаю ротацию резервных копий.', 1); if ($reclog == 2) $log->trace('Этап 3. Ротация бэкапов на локальном диске и в облаке.'); /* Ротация бэкапов на локальном диске */ // Если локальный каталог с архивами существует if (is_dir($localBackupFolder)) { // Узнаем содержимое каталога $req = scandir($localBackupFolder); // Если каталог с архивами не пустой (не учитываем текущую '.' и родительскую '..' директории) if ((count($req) - 2) != 0) { // Составим список всех подкаталогов for ($i = 0, $j = 0; $i < count($req); $i++) { if ((is_dir($localBackupFolder."/".$req[$i])) && ($req[$i] != ".") && ($req[$i] != "..")) { // Берем имя (путь) подкаталога и время создания $locallist[$j]['path'] = $localBackupFolder."/".$req[$i]; $locallist[$j]['created'] = filemtime($localBackupFolder."/".$req[$i]); $j += 1; } } if ($reclog == 2) $log->trace(sprintf('Найдено %s каталогов на локальном диске.', count($locallist))); // Если архивов больше, чем требуется, то удалим часть старых. if (count($locallist) > $numberOfLocalBackups) { if ($reclog == 2) $log->trace('Архивов больше, чем требуется. Удалим часть старых.'); // Отсортируем по дате создания arraySort($locallist, 'created'); // Исключим из удаляемых нужное количество "свежих" архивов array_splice($locallist, -$numberOfLocalBackups); if ($reclog == 2) $log->trace(sprintf('Для удаления %s каталогов.', count($locallist))); // Удалим старые каталоги с архивами из облака foreach($locallist as $l) { removeDirectory($l['path']); if ($reclog == 2) $log->trace(sprintf('Каталог %s удален с локального диска.', $l['path'])); } } else { if ($reclog == 2) $log->trace('Архивов меньше (или равно) требуемого количества. Ничего не удаляем.'); } } } /* Ротация бэкапов на Яндекс Диске */ // Узнаем содержимое каталога $req = $ynd->resources_get($cloudBackupFolder, '_embedded.path,_embedded.total,_embedded.items.name,_embedded.items.type,_embedded.items.path,_embedded.items.created'); if( isset($req['error']) ) { if ($reclog) $log->error(sprintf('Ошибка запроса списка каталогов и файлов на Яндекс.Диск: %s', $req['message'])); } else { // Если каталог с архивами не пустой if (count($req['_embedded']['items']) != 0) { // Составим список всех подкаталогов for ($i = 0; $i < count($req['_embedded']['items']); $i++) { if ($req['_embedded']['items'][$i]['type'] == 'dir') { // Берем имя (путь) подкаталога и время создания $cloudlist[$i]['path'] = $req['_embedded']['items'][$i]['path']; $cloudlist[$i]['created'] = strtotime($req['_embedded']['items'][$i]['created']); } } if ($reclog == 2) $log->trace(sprintf('Найдено %s каталогов на Яндекс.Диске.', count($cloudlist))); // Если архивов больше, чем требуется, то удалим часть старых. if (count($cloudlist) > $numberOfCloudBackups) { if ($reclog == 2) $log->trace('Архивов больше, чем требуется. Удалим часть старых.'); // Отсортируем по дате создания arraySort($cloudlist, 'created'); // Исключим из удаляемых нужное количество "свежих" архивов array_splice($cloudlist, -$numberOfCloudBackups); if ($reclog == 2) $log->trace(sprintf('Для удаления %s каталогов.', count($cloudlist))); // Удалим старые каталоги с архивами из облака foreach($cloudlist as $l) { $req = $ynd->resources_delete($l['path'], false, true); if( isset($req['error']) ) { if ($reclog) $log->error(sprintf('Ошибка удаления каталога %s с Яндекс.Диск: %s', $l['path'], $req['message'])); } else { if ($reclog == 2) $log->trace(sprintf('Каталог %s удален с Яндекс.Диска.', $l['path'])); } } } else { if ($reclog == 2) $log->trace('Архивов меньше (или равно) требуемого количества. Ничего не удаляем.'); } } } say('Ротация резервных копий завершена.', 1); if ($reclog == 2) $log->trace('Завершение резервного копирования данных на сервере.'); |
internet speed |
$internet_speed_json = shell_exec("/usr/local/bin/hvmonitor_sh/internet_speed.sh"); $internet_speed = json_decode($internet_speed_json, true); //$internet_speed_dl = trim(str_replace('Mbits/s', '', $internet_speed['Download'])); //$internet_speed_ul = trim(str_replace('Mbits/s', '', $internet_speed['Upload'])); sg('ThisServer.internet_speed_DL', $internet_speed['Download']); sg('ThisServer.internet_speed_UL', $internet_speed['Upload']); |
test |
setTimeOut('testTimer','say("Hello world!");',30); |
timeNow |
say(timeNow()); |
РасширенноеПредставлениеДаты |
function getDateInfo($date) { $days = array('воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'); $months = array(1 => 'январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'); $months2 = array(1 => 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'); $daymonth = array(1 => 'первое', 'второе', 'третье', 'четвертое', 'пятое', 'шестое', 'седьмое', 'восьмое', 'девятое', 'десятое', 'одиннадцатое', 'двенадцатое', 'тринадцатое', 'четырнадцатое', 'пятнадцатое', 'шестнадцатое', 'семнадцатое', 'восемнадцатое', 'девятнадцатое', 'двадцатое', 'двадцать первое', 'двадцать второе', 'двадцать третье', 'двадцать четвертое', 'двадцать пятое', 'двадцать шестое', 'двадцать седьмое', 'двадцать восьмое', 'двадцать девятое', 'тридцатое', 'тридцать первое'); $dateInfo = array(); $dateInfo['this_year'] = (int) date('Y', $date); $dateInfo['day_num'] = (int) date('w', $date); $dateInfo['month_num'] = (int) date('m', $date); $dateInfo['day_month'] = (int) date('j', $date); $dateInfo['day_of_month'] = $daymonth[$dateInfo['day_month']]; $dateInfo['day_of_week'] = $days[$dateInfo['day_num']]; $dateInfo['month_txt1'] = $months[$dateInfo['month_num']]; $dateInfo['month_txt2'] = $months2[$dateInfo['month_num']]; return $dateInfo; } function weekDay($date) { $this_year = (int) date('Y', $date); //Загружаем производственный календарь $productionCalendar = @file_get_contents('http://xmlcalendar.ru/data/ru/' . $this_year . '/calendar.xml'); if ($productionCalendar) { //Если прочитали без ошибок sg('DateTime.productionCalendar', $productionCalendar); //Запишем на всякий случай)) } else { //Если не прочиталось $productionCalendar = gg('DateTime.productionCalendar'); // Возьмем ранее загруженный календарь } //Проверяем сегодняшний день по производственному календарю (рабочий или нет) $weekDay = -1; $this_date = date('m.d', $date); $calend = new SimpleXMLElement($productionCalendar); foreach ($calend->days->day as $day) { $type = $day->attributes()->t; //тип дня: 1 - выходной день, 2 - короткий день, 3 - рабочий день (суббота/воскресен) $CalDate = $day->attributes()->d; //дата if ($this_date == $CalDate) { if ($type == 1) { //выходной $weekDay = 0; } elseif ($type == 2) { //Короткий день $weekDay = 1; } elseif ($type == 3) { //Перенесенный рабочий $weekDay = 1; } } } //Если в производственном календаре ничего не нашлось if ($weekDay == -1) { if (date('w', $date) == 0 || date('w', $date) == 6) { $weekDay = 0; } else { $weekDay = 1; } } return $weekDay; } $today = getDateInfo(strtotime("now")); $tomorrow = getDateInfo(strtotime("+1 day")); $today['weekDay'] = weekDay(strtotime("now")); $tomorrow['weekDay'] = weekDay(strtotime("+1 day")); //Сохраняем данные sg('DateTime.DateNow',date( "d.m.Y", time())); //Сегодня sg('today.thisYear', $today['this_year']); sg('today.monthNum', $today['month_num']); sg('today.monthTXT', $today['month_txt1']); sg('today.monthTXTalt', $today['month_txt2']); sg('today.dayOfMonthNum', $today['day_month']); sg('today.dayOfMonthTXT', $today['day_of_month']); sg('today.dayOfWeekTXT', $today['day_of_week']); sg('today.dayOfWeekNum', $today['day_num']); sg('today.isWeekDay', $today['weekDay']); //Сегодня (временно, потом удалить, ибо объекты переносятся sg('ThisComputer.DateNow',date( "d.m.Y", time())); sg('ThisComputer.thisYear', $today['this_year']); sg('ThisComputer.MonthNum', $today['month_num']); sg('ThisComputer.MonthTXT', $today['month_txt1']); sg('ThisComputer.MonthTXTalt', $today['month_txt2']); sg('ThisComputer.DayOfMonthNum', $today['day_month']); sg('ThisComputer.DayOfMonthTXT', $today['day_of_month']); sg('ThisComputer.DayOfWeekTXT', $today['day_of_week']); sg('ThisComputer.DayOfWeekNum', $today['day_num']); //Завтра sg('tomorrow.thisYear', $tomorrow['this_year']); sg('tomorrow.monthNum', $tomorrow['month_num']); sg('tomorrow.monthTXT', $tomorrow['month_txt1']); sg('tomorrow.monthTXTalt', $tomorrow['month_txt2']); sg('tomorrow.dayOfMonthNum', $tomorrow['day_month']); sg('tomorrow.dayOfMonthTXT', $tomorrow['day_of_month']); sg('tomorrow.dayOfWeekTXT', $tomorrow['day_of_week']); sg('tomorrow.dayOfWeekNum', $tomorrow['day_num']); sg('tomorrow.isWeekDay', $tomorrow['weekDay']); |
, Poccия
© 2024 - Site Built By SergeJey | Реквизиты: Курицын С. С. ИНН 762001394609 | Контакты | Публичный договор
SmartLiving