backupServer
|
backupServer for Yandex Disk
/*
* Сценарий для ежедневного создания резервных копий БД и каталогов.
*
* Архивы сохраняются на локальный диск и загружаются в облако (на Яндекс.Диск средствами 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 = "/var/www/lib/backup.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' => 'mysql'],
];
// Архивируемые каталоги
$dirs = [
['name' => 'etc', 'path' => '/etc'],
['name' => 'mysql', 'path' => '/var/lib/mysql'],
['name' => 'logs', 'path' => '/var/log'],
['name' => 'www', 'path' => '/var/www'],
];
// Реквизиты доступа к Яндекс Диск
// Если токен уже получен, то параметры 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);
say("Начало резервного копирования данных на сервере.", -1);
/*
Архивация БД и каталогов сервера на локальный диск
*/
say('Этап 1. Архивация БД и каталогов сервера на локальный диск.', -1);
// Проверяем, создан или нет общий каталог для бэкапов. Если нет, то создаем.
if (!is_dir($localBackupFolder)) {
say('Создаем общий каталог %s на локальном диске.', -1);
if (!mkdir($localBackupFolder, 0777)) {
say('Не удалось создать общий каталог на локальном диске.', -1);
return;
} else {
say('Общий каталог успешно создан.', -1);
}
} else {
say('Общий каталог для бэкапов уже создан на локальном диске.', -1);
}
// Проверяем, создан или нет каталог для ежедневного бэкапа. Если нет, то создаем.
if (!is_dir($todayLocalFolder)) {
say(sprintf('Создаем каталог для ежедневного бэкапа %s на локальном диске.', $todayLocalFolder),-1);
if (!mkdir($todayLocalFolder, 0777)) {
say('Не удалось создать каталог для ежедневного бэкапа на локальном диске.',-1);
return;
} else {
say('Каталог для ежедневного бэкапа успешно создан.',-1);
}
} else {
say(sprintf('Каталог для ежедневного бэкапа %s уже создан на локальном диске.', $todayLocalFolder),-1);
}
/* Архивирование баз данных */
$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) {
say(sprintf('Резервная копия БД %s не создана: %s', $db['dbname'], $out),-1);
} else {
say(sprintf('Резервная копия БД %s успешно создана на локальном диске.', $db['dbname']),-1);
}
}
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) {
say(sprintf('Резервная копия каталога %s не создана: %s', $dir['name'], $out),-1);
} else {
say(sprintf('Резервная копия каталога %s успешно создана на локальном диске.', $dir['name']),-1);
}
}
say('Архивация данных на сервере закончена.', -1);
/*
Копирование локального бэкапа в облако
*/
say('Начинаю копирование локального бэкапа в облако.',-1);
say('Этап 2. Копирование локального бэкапа в облако.',-1);
// Создаем объект класса Yandex_Disk
// Если токен еще не получен (не указан в конфиге), то запросим его.
if( $yandexDiskConfig['token'] == '' ) {
$ynd = new Yandex_Disk($yandexDiskConfig);
$myToken = $ynd->getToken();
//echo "<br> Токен = ".$myToken." <br>";
//sg('YaDisk1.token', $myToken);
say(sprintf('Мой OAuth-токен: %s', $myToken),-1);
if( isset($ynd->error) ) {
say(sprintf('Ошибка запроса OAuth-токена: %s', $ynd->error),-1);
}
}
else $ynd = new Yandex_Disk($yandexDiskConfig);
// Узнаем доступное место на Яндекс Диске (для справки)
$req = $ynd->get();
if( isset($req['error']) ) {
say(sprintf('Ошибка запроса метаинформации о диске: %s', $req['message']),-1);
} 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));
say(sprintf('Всего места на Яндекс.Диске: %s ГБ.', gg('YaDisk1.totalSpace')),-1);
say(sprintf('Занято данными: %s ГБ.', gg('YaDisk1.usedSpace')),-1);
say(sprintf('Свободно: %s ГБ.', gg('YaDisk1.freeSpace')),-1);
}
// Проверяем, создан или нет общий каталог для бэкапов на Яндекс Диске. Если нет, то создаем.
$req = $ynd->resources_get($cloudBackupFolder);
if( isset($req['error']) || $req['path'] != 'disk:'.$cloudBackupFolder) {
say(sprintf('Создаем общий каталог %s на Яндекс.Диске.', $todayCloudFolder),-1);
$req = $ynd->resources_put($cloudBackupFolder);
if( isset($ynd->error) ) {
say(sprintf('Ошибка создания общего каталога на Яндекс.Диск: %s', $ynd->error),-1);
} else {
say('Общий каталог успешно создан.',-1);
}
} else {
say('Общий каталог для бэкапов уже создан на Яндекс.Диске.',-1);
}
// Если локальный каталог с архивами существует
if (is_dir($todayLocalFolder)) {
// Узнаем содержимое каталога
$files = scandir($todayLocalFolder);
// Проверяем, создан или нет каталог для ежедневного бэкапа на Яндекс Диске. Если нет, то создаем.
$req = $ynd->resources_get($todayCloudFolder);
if( isset($req['error']) || $req['path'] != 'disk:'.$todayCloudFolder) {
say(sprintf('Создаем каталог для ежедневного бэкапа %s на Яндекс.Диске.', $todayCloudFolder),-1);
$req = $ynd->resources_put($todayCloudFolder);
if( isset($ynd->error) ) {
say(sprintf('Ошибка создания каталога для ежедневного бэкапа на Яндекс.Диск: %s', $ynd->error),-1);
} else {
say('Каталог для ежедневного бэкапа успешно создан.',-1);
}
} else {
say(sprintf('Каталог для ежедневного бэкапа %s уже создан на Яндекс.Диске.', $todayCloudFolder),-1);
}
// Загрузим все файлы архивов на Яндекс Диск
foreach($files as $file) {
if(($file != ".") && ($file != "..")) {
if(is_file($todayLocalFolder."/".$file)) {
$fileCloudPath = $todayCloudFolder."/".$file;
$fileLocalPath = $todayLocalFolder."/".$file;
// Если файл с таким же именем уже существует, то будет переписан.
say(sprintf('Загрузка на Яндекс.Диск: %s [%s Байт]', $file, filesize($fileLocalPath)),-1);
$req = $ynd->file_upload($fileCloudPath, $fileLocalPath);
}
}
}
}
say('Копирование локального бэкапа в облако завершено.',-1);
/*
Ротация бэкапов на локальном диске и в облаке
*/
say('Начинаю ротацию резервных копий.',-1);
say('Этап 3. Ротация бэкапов на локальном диске и в облаке.',-1);
/* Ротация бэкапов на локальном диске */
// Если локальный каталог с архивами существует
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;
}
}
say(sprintf('Найдено %s каталогов на локальном диске.', count($locallist)),-1);
// Если архивов больше, чем требуется, то удалим часть старых.
if (count($locallist) > $numberOfLocalBackups) {
say('Архивов больше, чем требуется. Удалим часть старых.',-1);
// Отсортируем по дате создания
arraySort($locallist, 'created');
// Исключим из удаляемых нужное количество "свежих" архивов
array_splice($locallist, -$numberOfLocalBackups);
say(sprintf('Для удаления %s каталогов.', count($locallist)),-1);
// Удалим старые каталоги с архивами из облака
foreach($locallist as $l) {
removeDirectory($l['path']);
say(sprintf('Каталог %s удален с локального диска.', $l['path']),-1);
}
} else {
say('Архивов меньше (или равно) требуемого количества. Ничего не удаляем.',-1);
}
}
}
/* Ротация бэкапов на Яндекс Диске */
// Узнаем содержимое каталога
$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']) ) {
say(sprintf('Ошибка запроса списка каталогов и файлов на Яндекс.Диск: %s', $req['message']),-1);
} 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']);
}
}
say(sprintf('Найдено %s каталогов на Яндекс.Диске.', count($cloudlist)),-1);
// Если архивов больше, чем требуется, то удалим часть старых.
if (count($cloudlist) > $numberOfCloudBackups) {
say('Архивов больше, чем требуется. Удалим часть старых.',-1);
// Отсортируем по дате создания
arraySort($cloudlist, 'created');
// Исключим из удаляемых нужное количество "свежих" архивов
array_splice($cloudlist, -$numberOfCloudBackups);
say(sprintf('Для удаления %s каталогов.', count($cloudlist)),-1);
// Удалим старые каталоги с архивами из облака
foreach($cloudlist as $l) {
$req = $ynd->resources_delete($l['path'], false, true);
if( isset($req['error']) ) {
say(sprintf('Ошибка удаления каталога %s с Яндекс.Диск: %s', $l['path'], $req['message']),-1);
} else {
say(sprintf('Каталог %s удален с Яндекс.Диска.', $l['path']),-1);
}
}
}
else {
say('Архивов меньше (или равно) требуемого количества. Ничего не удаляем.',-1);
}
}
}
say('Ротация резервных копий завершена.',-1);
say('Завершение резервного копирования данных на сервере.',-1);
|
Backup_majordomo_local
|
Бекапит базу и каталог www в локальный каталог /home/pi/FTP/backup/
say("Начинаю делать бэкапчик бэкап");
shell_exec("/var/www/backupsrv.sh");
say("Бэкапчик сделан успешно ");
|
CalcSunSetRise
|
Вычисляем восход и заход солнца
say("Вычисляю восход и заход солнца", 0);
$lat=gg('ThisComputer.latitude'); // широта
$long=gg('ThisComputer.longitude'); // долгота
$utc=gg('ThisComputer.UTC'); // часовой пояс
class sun
{
var $latitude; #szerokosc geograficzna
var $longitude; #dlugosc geograficzna
var $timezone; #strefa czasowa
function sun ($latitude, $longitude, $timezone)
{
$this->latitude = $latitude;
$this->longitude = $longitude;
$this->timezone = $timezone;
$this->yday = date("z");
$this->mon = date("n");
$this->mday = date("j");
$this->year = date("Y");
#---------------------
$this->DST=$this->is_daylight_time(date("U"));
if ($this->DST)
{
$this->timezone = ($this->timezone + 1);
}
if ($this->timezone == "13")
{
$this->timezone = "-11";
}
#---------------------
$this->A = 1.5708;
$this->B = 3.14159;
$this->C = 4.71239;
$this->D = 6.28319;
$this->E = 0.0174533 * $this->latitude;
$this->F = 0.0174533 * $this->longitude;
$this->G = 0.261799 * $this->timezone;
#---------------------
# For astronomical twilight, use
#$this->R = -.309017;
# For nautical twilight, use
#$this->R = -.207912;
# For civil twilight, use
#$this->R = -.104528;
# For sunrise or sunset, use
$this->R = -.0145439;
#---------------------
}
function is_daylight_time($time)
{
list($dom, $dow, $month, $hour, $min) = explode(":", date("d:w:m:H:i", $time));
if ($month > 4 && $month < 10)
{
$this->retval = 1; # May thru September
}
elseif ($month == 4 && $dom > 7)
{
$this->retval = 1; # After first week in April
}
elseif ($month == 4 && $dom <= 7 && $dow == 0 && $hour >= 2)
{
$this->retval = 1; # After 2am on first Sunday ($dow=0) in April
}
elseif ($month == 4 && $dom <= 7 && $dow != 0 && ($dom-$dow > 0))
{
$this->retval = 1; # After Sunday of first week in April
}
elseif ($month == 10 && $dom < 25)
{
$this->retval = 1; # Before last week of October
}
elseif ($month == 10 && $dom >= 25 && $dow == 0 && $hour < 2)
{
$this->retval = 1; # Before 2am on last Sunday in October
}
elseif ($month == 10 && $dom >= 25 && $dow != 0 && ($dom-24-$dow < 1) )
{
$this->retval = 1; # Before Sunday of last week in October
}
else
{
$this->retval = 0;
}
return $this->retval;
}
function sunrise()
{
$J = $this->A;
$K = $this->yday + (($J - $this->F) / $this->D);
$L = ($K * .017202) - .0574039; # Solar Mean Anomoly
$M = $L + .0334405 * sin($L); # Solar True Longitude
$M += 4.93289 + (3.49066E-04) * sin(2 * $L);
if ($this->D == 0)
{
echo "Trying to normalize with zero offset..."; exit;
}
while ($M < 0)
{
$M = ($M + $this->D);
}
while ($M >= $this->D)
{
$M = ($M - $this->D);
}
if (($M / $this->A) - intval($M / $this->A) == 0)
{
$M += 4.84814E-06;
}
$P = sin($M) / cos($M); # Solar Right Ascension
$P = atan2(.91746 * $P, 1);
# Quadrant Adjustment
if ($M > $this->C)
{
$P += $this->D;
}
else
{
if ($M > $this->A)
{
$P += $this->B;
}
}
$Q = .39782 * sin($M); # Solar Declination
$Q = $Q / sqrt(-$Q * $Q + 1); # This is how the original author wrote it!
$Q = atan2($Q, 1);
$S = $this->R - (sin($Q) * sin($this->E));
$S = $S / (cos($Q) * cos($this->E));
if (abs($S) > 1)
{
echo 'none';
} # Null phenomenon
$S = $S / sqrt(-$S * $S + 1);
$S = $this->A - atan2($S, 1);
$S = $this->D - $S ;
$T = $S + $P - 0.0172028 * $K - 1.73364; # Local apparent time
$U = $T - $this->F; # Universal timer
$V = $U + $this->G; # Wall clock time
# Quadrant Determination
if ($this->D == 0)
{
echo "Trying to normalize with zero offset..."; exit;
}
while ($V < 0)
{
$V = ($V + $this->D);
}
while ($V >= $this->D)
{
$V = ($V - $this->D);
}
$V = $V * 3.81972;
$hour = intval($V);
$min = intval((($V - $hour) * 60) + 0.5);
return date( "G:i ", mktime($hour,$min,0,$this->mon,$this->mday,$this->year) );
//return mktime($hour,$min,0,$this->mon,$this->mday,$this->year) - 1800;
}
function sunset()
{
$J = $this->C;
$K = $this->yday + (($J - $this->F) / $this->D);
$L = ($K * .017202) - .0574039; # Solar Mean Anomoly
$M = $L + .0334405 * sin($L); # Solar True Longitude
$M += 4.93289 + (3.49066E-04) * sin(2 * $L);
if ($this->D == 0)
{
echo "Trying to normalize with zero offset..."; exit;
}
while ($M < 0)
{
$M = ($M + $this->D);
}
while ($M >= $this->D)
{
$M = ($M - $this->D);
}
if (($M / $this->A) - intval($M / $this->A) == 0)
{
$M += 4.84814E-06;
}
$P = sin($M) / cos($M); # Solar Right Ascension
$P = atan2(.91746 * $P, 1);
# Quadrant Adjustment
if ($M > $this->C)
{
$P += $this->D;
}
else
{
if ($M > $this->A)
{
$P += $this->B;
}
}
$Q = .39782 * sin($M); # Solar Declination
$Q = $Q / sqrt(-$Q * $Q + 1); # This is how the original author wrote it!
$Q = atan2($Q, 1);
$S = $this->R - (sin($Q) * sin($this->E));
$S = $S / (cos($Q) * cos($this->E));
if (abs($S) > 1)
{
echo 'none';
} # Null phenomenon
$S = $S / sqrt(-$S * $S + 1);
$S = $this->A - atan2($S, 1);
#$S = $this->D - $S ;
$T = $S + $P - 0.0172028 * $K - 1.73364; # Local apparent time
$U = $T - $this->F; # Universal timer
$V = $U + $this->G; # Wall clock time
# Quadrant Determination
if ($this->D == 0)
{
echo "Trying to normalize with zero offset..."; exit;
}
while ($V < 0)
{
$V = ($V + $this->D);
}
while ($V >= $this->D)
{
$V = ($V - $this->D);
}
$V = $V * 3.81972;
$hour = intval($V);
$min = intval((($V - $hour) * 60) + 0.5);
return date( "G:i ", mktime($hour,$min,0,$this->mon,$this->mday,$this->year) );
//return mktime($hour,$min,0,$this->mon,$this->mday,$this->year) + 1800;
}
}
//$ext_light = show_list($keys_id, "#key_pio#", "", 1, "key_label='ext_light'", 1);
$sun = new sun($lat, $long, $utc);
$my_sunrise = $sun->sunrise();
$my_sunset = $sun->sunset();
sg('ThisComputer.SunSet',$my_sunset); // время заката
sg('ThisComputer.SunRise',$my_sunrise ); //время восхода
$dest=getGlobal('ThisComputer.SunRise');
$SunRise=strtotime($dest);
$SunRiseLightOff=$SunRise+60*60;
sg('ThisComputer.SunRiseLightOffTime',$SunRiseLightOff); //время восхода
|
Greeting
|
Состояние системы
runScript("reportStatus", array());
|
iiiBot
|
Сценарий для чата с Алисой
define('BOT_TOKEN', '195310af-cc83-4f0d-aaae-456e08662421'); //Идентификатор бота с iii.ru
class Bot {
protected $key = null;
protected $session = null;
private $salt = 'some very-very long string without any non-latin characters due to different string representations inside of variable programming languages';
/**
* @param $key - Ключ из урла после создания инфа
*/
public function __construct($key) {
$this->key = $key;
}
/**
* @param null $session - Идентификатор сессии существуюющей, если нет то создается новая
* @return string Идентификатор текущей сессии
*/
public function session($session = null) {
if ($session === null) {
$response = file_get_contents('http://iii.ru/api/2.0/json/Chat.init/' . $this->key . '/');
$this->session = $this->decode($response)->result->cuid;
} else {
$this->session = $session;
}
return $this->session;
}
/**
* ОТправить сообщение боту
* @param string $message Сообщение
* @return string Ответ
*/
public function say($message) {
$request = '["' . $this->session . '","' . $message . '"]';
$myCurl = curl_init();
curl_setopt_array($myCurl, array(
CURLOPT_URL => 'http://iii.ru/api/2.0/json/Chat.request',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $this->encode($request)
));
$response = curl_exec($myCurl);
curl_close($myCurl);
return $this->decode($response)->result->text->tts;
}
/**
* Кодирование сообщения
* @param $message
* @return string
*/
private function encode($message) {
$message = base64_encode($message);
$ml = strlen($message);
$kl = strlen($this->salt);
$encoded = "";
for ($i = 0; $i < $ml; $i++) {
$encoded = $encoded . ($message[$i] ^ $this->salt[$i % $kl]);
}
return base64_encode($encoded);
}
/**
* Декодирование сообщения
* @param $message
* @return mixed|null
*/
private function decode($message) {
$msg = base64_decode($message);
$ml = strlen($msg);
$kl = strlen($this->salt);
$decoded = "";
for ($i = 0; $i < $ml; $i++) {
$decoded.= ($msg[$i] ^ $this->salt[$i % $kl]);
}
return json_decode(base64_decode($decoded));
}
}
if ($params['message']) {
$sessionId = gg('ThisComputer.iiiBotSessionId');
$message = $params['message'];
$bot = new Bot(BOT_TOKEN);
if ($sessionId == '') {
$session = $bot->session();
sg('ThisComputer.iiiBotSessionId', $session);
} else {
$session = $bot->session($sessionId);
}
$response = $bot->say($message);
say($response);
SetTimeOut('CleanIiiSessionId', 'sg("ThisComputer.iiiBotSessionId", "");', 3*60*60);
}
|
In_Home
|
Алиса приветствует и докладывает о состоянии системы
if (timeBetween('10:00', '22:00')) {
say('Добро пожаловать домой!',1);
setTimeOut('status', " runScript('reportStatus');", (int)('3'));
}
//to-do
|
morningGreeting
|
Утреннее приветствие.
{
say('Доброе утро! '.' Сегодня '.gg('ThisComputer.Date').' '.gg('ThisComputer.Day'),4);
runScript('weather_forecast');
runScript('sayTodayAgenda');
//runScript('ya_tfaffic');
setTimeOut('playRadiola', " runScript('playRadiola');", (int)('50'));
setTimeOut('RadioStop', " runScript('RadioStop');", (int)('3600'));
}
//to-do
|
NextRadio
|
Другая радиостанция
$StationURL=getRandomLine(nextradio);
runScript("RadioPlay",array("url"=>$StationURL));
|
playFavoriteMusic
|
// вытягиваем историю из переменной
$alreadyPlayed=gg("AlreadyPlayedMusic");
if (!$alreadyPlayed) {
$alreadyPlayed='0';
}
// выбираем случайную папку
$rec=SQLSelectOne("SELECT * FROM media_favorites WHERE ID NOT IN (".$alreadyPlayed.") ORDER BY RAND()");
if (!$rec['ID']) {
// папок больше не осталось, поэтому выбираем случайную и сбрасываем истоирю
$rec=SQLSelectOne("SELECT * FROM media_favorites ORDER BY RAND()");
$alreadyPlayed='0';
}
if ($rec['ID']) {
// добавляем выбранную папку в историю
$alreadyPlayed.=','.$rec['ID'];
sg("AlreadyPlayedMusic",$alreadyPlayed);
// запускаем на проигрывание
$collection=SQLSelectOne("SELECT * FROM collections WHERE ID=".(int)$rec['COLLECTION_ID']);
$path=$collection['PATH'].$rec['PATH'];
playMedia($path);
//setTimeOut('VLCPlayer_update',"callMethod('VLCPlayer.update');",10);
}
|
playPause
|
Ставим проигрыватель на паузу.
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode(":12345")
)
));
file_get_contents('http://127.0.0.1:8080/requests/status.xml?command=pl_pause',false,$context);
|
playRadiola
|
Включаем радиостанцию "Радиола"
getURL('http://192.168.1.110/popup/app_101ru.html?&ajax=1&op=playstation&id=387', 0);
|
PlaySkazki
|
Радио "Сказки детям"
getURL('http://192.168.1.110/popup/app_101ru.html?ajax=1&op=playstation&id=103', 0);
|
RadioPlay
|
Включаем радио
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode(":12345")
)
));
file_get_contents('http://127.0.0.1:8080/requests/status.xml?command=pl_play',false,$context);
|
RadioStop
|
Выключаем радио
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode(":12345")
)
));
file_get_contents('http://127.0.0.1:8080/requests/status.xml?command=pl_stop',false,$context);
|
RadioVolumeDefault
|
Устанавить громкость по умолчанию
$vol=gg("ThisComputer.volumeLevel");
$volume=exec("amixer -c 1 set Speaker ". $vol. "%");
|
reportStatus
|
Докладывает о состоянии системы
$res='';
if (gg('Security.stateColor')=='green' && gg('System.stateColor')=='green' && gg('Communication.stateColor')=='green') {
$res='Все системы работают в штатном режиме';
} else {
if (gg('Security.stateColor')!='green') {
$res.=" Проблема безопасности: ".getGlobal('Security.stateDetails');
}
if (gg('System.stateColor')!='green') {
$res.=" Системная проблема: ".getGlobal('System.stateDetails');
}
if (gg('Communication.stateColor')!='green') {
$res.=" Проблема связи: ".getGlobal('Communication.stateDetails');
}
}
sayReply($res,1);
|
SayJokes
|
Расскажет анекдот
/*
1 - Анекдот;
2 - Рассказы;
3 - Стишки;
4 - Афоризмы;
5 - Цитаты;
6 - Тосты;
8 - Статусы;
11 - Анекдот (+18);
12 - Рассказы (+18);
13 - Стишки (+18);
14 - Афоризмы (+18);
15 - Цитаты (+18);
16 - Тосты (+18);
18 - Статусы (+18);
*/
function GetJoke($ctype = 1) {
$pretext = array("Слушай", "Слушай шутку", "Слушай анекдот", "Вот шутка смешная", "Еще шутка");
$number = mt_rand(0, count($pretext) - 1);
$res = geturl('http://rzhunemogu.ru/Rand.aspx?CType=' . $ctype, 0);
$res = win2utf($res);
$xml = new SimpleXMLElement($res);
$joke = trim(preg_replace('/\s{2,}/', ' ', $xml->content));
$joke = $pretext[$number] . ': ' . $joke;
if (strlen($joke) > 500) {
sleep(10);
GetJoke();
} else {
//return $joke;
//say($pretext[$number].':', 1);
say($joke, 1);
}
}
//if (gg('ThisComputer.SayJokes') != 0) {
GetJoke();
//}
|
sayTodayAgenda
|
Алиса говорит запланированные на сегодня дела и события, используя данные из календаря (если нет событий то молчит)
if (file_exists('./modules/app_calendar/app_calendar.class.php')) {
include_once('./modules/app_calendar/app_calendar.class.php');
$calendar=new app_calendar();
$calendar->usual($out);
$events=$out['EVENTS_TODAY'];
$say_phrase='';
if (is_array($events)) {
$total=count($events);
$tasks=array();
$cals=array();
for($i=0;$i<$total;$i++) {
if ($events[$i]['IS_TASK']=='1' && $events[$i]['IS_DONE']!='1') {
$tasks[]=$events[$i]['TITLE'];
} elseif ($events[$i]['IS_TASK']!='1') {
$cals[]=$events[$i]['TITLE'];
}
}
$total_tasks=count($tasks);
if ($total_tasks) {
$say_phrase.="У вас на сегодня запланированы задачи. ";
for($i=0;$i<$total_tasks;$i++) {
$say_phrase.=($i+1).". ".$tasks[$i].". ";
}
} else {
// say("Никаких дел не запланировано.",1);
}
$total_cals=count($cals);
if ($total_cals) {
$say_phrase.=("Сегодняшние события. ");
for($i=0;$i<$total_cals;$i++) {
$say_phrase.=$cals[$i].'. ';
}
}
}
$events=$out['EVENTS_PAST'];
if ($events[0]['TITLE']) {
$say_phrase.=" Так же напоминаю о пропущенных задачах. ";
$total_tasks=count($events);
for($i=0;$i<$total_tasks;$i++) {
$say_phrase.=($i+1).". ".$events[$i]['TITLE'].". ";
}
}
}
if ($say_phrase) {
say($say_phrase,1);
}
|
scenario_romantic
|
Романтическая обстановка
/* $turn_on=array(
'noo6', // ргб-светильник в углу
'noo8'); // подсветка мебели
$turn_off=array(
'lcw1', // свет над барной стойкой
'lcw2', // свет по периметру в зале
'lcw3', // подсветка неон в зале
'lcw4', // свет в коридоре
'lcw5', // свет в зале (люстра)
'lcw7', // свет кухня центральный
'lcw8', // свет кухня над столом
'noo2', // регулируемый светильник в зале
'noo7', // светильник в углу
'RCOutlet1' // подсветка кухни
);
*/
callMethod("LedStrip1.setColor",array('color'=>'#ff0000'));
/*
setGlobal('noo8.R',100);
setGlobal('noo8.G',0);
setGlobal('noo8.B',0);
setGlobal('noo8.brightness',100);
foreach($turn_on as $obj) {
if (!getGlobal($obj.'.status')) {
callMethod($obj.'.turnOn');
sleep(1);
} else {
callMethod($obj.'.refresh');
sleep(1);
}
}
foreach($turn_off as $obj) {
if (getGlobal($obj.'.status')) {
callMethod($obj.'.turnOff');
sleep(1);
}
}
*/
/*
if (!isOnline('Ноутбук в зале')) {
runScript('WOL');
setTimeOut('romanticRadio',"runScript('startRomanticRadio');",60*5);
} else {
runScript('startRomanticRadio');
}
*/
//runScript('systemVolume',array('volume'=>15));
getURL('http://192.168.1.110/popup/app_101ru.html?ajax=1&op=playstation&id=46', 0);
//$command='c:\\app\\nircmd\\nircmd.exe monitor off';
//runScript('runCommandHP',array('cmd'=>$command));
|
systemMaintenance
|
Обслуживание системы (ежедневно в 03:00)
// optimize gps
$records=SQLSelect("SELECT ID, DEVICEID, LOCATION_ID FROM gpslog ORDER BY DEVICEID, ADDED DESC");
$total=count($records);
$to_delete=array();
for($i=1;$i<$total-1;$i++) {
if (!$records[$i]['LOCATION_ID']) continue;
if ($records[$i]['LOCATION_ID']==$records[$i+1]['LOCATION_ID'] && $records[$i]['LOCATION_ID']==$records[$i-1]['LOCATION_ID']) {
//$to_delete[]=$records[$i]['ID'];
SQLExec("DELETE FROM gpslog WHERE ID=".$records[$i]['ID']);
}
}
|
Watching movie
|
Алиса говорит "настраиваю освещение"
say(LANG_GENERAL_SETTING_UP_LIGHTS,0);
// to-do
|
weather_forecast
|
Алиса говорит прогноз погоды
$w=round(strip_tags(gg("TempSensor02.valuetemp")));
$tempw=$w;
if($w < "0"){
$tempw=abs($w);
}
if($w > "0"){
$templus=" плюс ";
}
if($tempw >= 11 and $tempw <= 14){
$tempcels=" градусов ";
}
else{
while ($tempw > 9){
$tempw=$tempw-10;
}
if($tempw == 0 or $tempw >= 5 and $tempw <= 9){
$tempcels= градусов ; }
if($tempw == 1){
$tempcels= градус ; }
if($tempw >= 2 and $tempw <= 4){
$tempcels= градуса ; }
}
$metcast=' Температура за окном '.getGlobal('TempSensor02.valuetemp').' '.$tempcels.' цельсия '.'.';
say($metcast,1);
// Сравнение со вчерашним днем
$tNew = round((float)getGlobal('TempSensor02.temp'));
// берем из истории вчерашнее значение температуры на это время
$tOld = round((float)getHistoryValue('TempSensor02.temp', strtotime("-1 day")));
$tDelta = abs($tNew - $tOld);
if ($tDelta==1){
$tGradus = 'градус';
}elseif($tDelta==2 || $tDelta==3 || $tDelta==4){
$tGradus = 'градуса';
}else{
$tGradus = 'градусов';
}
if ($tNew>$tOld){
say("Сегодня теплее, чем вчера на ".$tDelta." ".$tGradus.".",1);
}elseif($tNew<$tOld){
say("Сегодня холоднее, чем вчера на ".$tDelta." ".$tGradus.".",1);
}elseif($tNew==$tOld){
say("Температура сегодня такая же как вчера.",1);
}
$tempw="";
$tempcels="";
$status="";
$h=round(gg("ow_fact.humidity"));
$tempw=$h;
if($tempw >= 11 and $tempw <= 14){
$tempcels=" процентов ";
}
else{
while ($tempw > 9){
$tempw=$tempw-10;
}
if($tempw == 0 or $tempw >= 5 and $tempw <= 9){
$tempcels= процентов ; }
if($tempw == 1){
$tempcels= процент ; }
if($tempw >= 2 and $tempw <= 4){
$tempcels= процента ; }
}
$status.="Относительная влажность ".$h." ".$tempcels. ".";
say($status,1);
$tempw="";
$tempcels="";
$status="";
$pressure=(float)gg("ow_fact.pressure_mmhg");
if ($pressure<738) {
$status.=' Атмосферное давление пониженное';
} elseif ($pressure>768) {
$status.=' Атмосферное давление повышенное.';
} else {
$status.=' Атмосферное давление нормальное.';
}
say($status,1);
$status="";
// ветер
$WindSpeed=(float)gg("ow_fact.wind_speed");
if ($WindSpeed<1) {
$status.=' Ветра нет.';
} elseif ($WindSpeed<3) {
$status.=' Ветер слабый.';
} elseif ($WindSpeed<6) {
$status.=' Ветер сильный.';
} elseif ($WindSpeed<9) {
$status.=' Ветер очень сильный.';
} else {
$status.=' Ветер очень! Очень сильный.';
}
if (gg('ow_fact.wind_direction')> 45 and gg('ow_fact.wind_direction')< 135){
$WindDir='восточное';
} elseif(gg('ow_fact.wind_direction')>= 135 and gg('ow_fact.wind_direction')<= 225){
$WindDir='южное';
} elseif(gg('ow_fact.wind_direction')> 225 and gg('ow_fact.wind_direction')< 315){
$WindDir='западное';
} else{
$WindDir='северное';
}
$status.=' Направление '.$WindDir.'.';
say($status,1);
// Прогноз погоды на сегодня
if (timeBetween("00:00", "12:00")){
say("Днём ".gg("ow_day0.weather_type").".",1);
$w=round(gg("ow_day0.temp_day"));
}else{
say("Вечером ".gg("ow_day0.weather_type").".",1);
$w=round(gg("ow_day0.eve"));
}
$tempw=$w;
if($w < "0"){
$tempw=abs($w);
}
if($w > "0"){
$templus=" плюс ";
}
if($tempw >= 11 and $tempw <= 14){
$tempcels=" градусов ";
}
else{
while ($tempw > 9){
$tempw=$tempw-10;
}
if($tempw == 0 or $tempw >= 5 and $tempw <= 9){
$tempcels= градусов ; }
if($tempw == 1){
$tempcels= градус ; }
if($tempw >= 2 and $tempw <= 4){
$tempcels= градуса ; }
}
$status="";
$status.=' температура будет '.$w." ".$tempcels." цельсия";
say($status,1);
// Погода на завтра
say("Завтра ".gg("ow_day1.weather_type").".",1);
$status="";
$w=round(gg("ow_day1.temperature"));
$tempw=$w;
if($w < "0"){
$tempw=abs($w);
}
if($w > "0"){
$templus=" плюс ";
}
if($tempw >= 11 and $tempw <= 14){
$tempcels=" градусов ";
}
else{
while ($tempw > 9){
$tempw=$tempw-10;
}
if($tempw == 0 or $tempw >= 5 and $tempw <= 9){
$tempcels= градусов ; }
if($tempw == 1){
$tempcels= градус ; }
if($tempw >= 2 and $tempw <= 4){
$tempcels= градуса ; }
}
$status="";
$status.=' температура будет '.$w." ".$tempcels." цельсия";
say($status,1);
|
Whose_Internet
|
Рассказывает о провайдере и параметрах соединения
say ('Про интернет к которому я подключена.', 5);
$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;
say ("IP адрес ".$ip,5);
say ("Провайдер ".$name_rus,5);
say ("Сайт провайдера ".$site,5);
$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"];
say ("Мое местонахождение по мнению других:",5);
say ($country_rus,5);
say ($region_rus,5);
if ($city_rus!=$region_rus)
say ($city_rus,5);
|
ya_tfaffic
|
Пробки от яндекса
// Пробки.
$status="";
$status.="По пути Вашего следования ".gg("yt_info.val").".";
say($status,1);
|
1
|
$luxLevel=(int)gg('LuxSensor01.lux');
if ($luxLevel<5) say("Освещенность меньше пяти люксов", 2);
|
123
|
проверить искуственный рассвет
//LedStrip1
//if (!getGlobal('DarknessMode.active')) return;
{
callMethod("LedStrip1.setColor",array('color'=>'#ff911d'));
}
$sunriseLevel=(int)gg('LedStrip1.Level');
if ($sunriseLevel<100) {
$sunriseLevel+=10;
if ($sunriseLevel==10) {
cm('LedStrip1.turnOn');
for($i=0;$i<10;$i++) {
cm('LedStrip1.sendCommand',array('command'=>'level'));
}
} else {
sg('LedStrip1.Level',$sunriseLevel);
cm('LedStrip1.sendCommand',array('command'=>'level'));
}
setTimeOut('sunriseTimer','runScript("123");',60);
setTimeOut('lightOff', " runScript('turnOff_All');", (int)('6350'));
} else {
$sunriseLevel=0;
}
sg('LedStrip1.Level',$sunriseLevel);
|
ChangetempYesterday
|
Запишем температуру этого часа для сравнения в завтрашнем прогнозе (т.е сегодня холоднее или теплее чем вчера на столько-то градусов)
Не используем, работаем с историей температуры.
$w=round(strip_tags(gg("TempSensor02.valuetemp")));
$tempw=$w;
if($w < "0"){
$tempw=abs($w);
}
if($w > "0"){
$templus=" плюс ";
}
if($tempw >= 11 and $tempw <= 14){
$tempcels=" градусов ";
}
else{
while ($tempw > 9){
$tempw=$tempw-10;
}
if($tempw == 0 or $tempw >= 5 and $tempw <= 9){
$tempcels= градусов ; }
if($tempw == 1){
$tempcels= градус ; }
if($tempw >= 2 and $tempw <= 4){
$tempcels= градуса ; }
}
$metcast=' Температура за окном '.getGlobal('TempSensor02.valuetemp').' '.$tempcels.' цельсия '.'.';
say($metcast,1);
// Сравнение со вчерашним днем
$tNew = round((float)getGlobal('TempSensor02.temp'));
// берем среднее значение за час в предидущие сутки
$tOld = round((float)getHistoryValue('TempSensor02.temp', strtotime("-1 day")));
$tDelta = abs($tNew - $tOld);
if ($tDelta==1){
$tGradus = 'градус';
}elseif($tDelta==2 || $tDelta==3 || $tDelta==4){
$tGradus = 'градуса';
}else{
$tGradus = 'градусов';
}
if ($tNew>$tOld){
say("Сегодня теплее, чем вчера на ".$tDelta." ".$tGradus.".",1);
}elseif($tNew<$tOld){
say("Сегодня холоднее, чем вчера на ".$tDelta." ".$tGradus.".",1);
}elseif($tNew==$tOld){
say("Температура сегодня такая же как вчера.",1);
}
|
facedetection
|
if ($params['faces']>0) {
say("Привет!",2);
}
|
Majordroid_Test
|
$address='192.168.1.150'; // ip-адрес телефона
$service_port='7999';
$in='tts:проверка'; // команда для отправки
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "<br/>\n";
return 0;
}
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
return 0;
}
socket_write($socket, $in, strlen($in));
socket_close($socket);
|
pogodaYandex
|
не работает
// ******************************
// Vovix, 16.11.2015 г. v.1.1
// ******************************
$city_id=gg("Zlatoust.city_id"); //ID города узнаем тут: https://pogoda.yandex.ru/static/cities.xml
$data_file="http://export.yandex.ru/weather-ng/forecasts/$city_id.xml?".rand(); // адрес xml файла - 28630
//say($data_file);
$xml = simplexml_load_file($data_file); // раскладываем xml на массив
// температура вчера в это же время
$temp_yesterday=$xml->yesterday->temperature;
// Если значение температуры положительно, для наглядности добавляем "+"
$temp_yesterday = getTempSign($temp_yesterday);
sg("Zlatoust.TempYesterday",$temp_yesterday);
// температура сейчас
$temp=$xml->fact->temperature;
if (date('G')==13) {sg("Zlatoust.Temp13h",$temp);}
if (date('G')==21) {sg("Zlatoust.Temp21h",$temp);}
$temp = getTempSign($temp); // Если значение температуры положительно, для наглядности добавляем "+"
// достаем из XML-файла время его чтения
$XMLuptime = $xml->fact->uptime;
$XMLuptime = explode("T", $XMLuptime);
$XMLuptimeTo = ($XMLuptime[0].' '.$XMLuptime[1]);
// addClassProperty('Weather','XMLuptime');
sg("Zlatoust.XMLuptime",$XMLuptimeTo);
// сохраняем основные параметры текущей погоды
sg("Zlatoust.Temp",$temp);
sg("ThisComputer.TempOutside",$temp);
sg("Zlatoust.Type",$xml->fact->weather_type);
sg("Zlatoust.Pressure",$xml->fact->pressure);
sg("Zlatoust.Humidity",$xml->fact->humidity);
sg("Zlatoust.WindSpeed",$xml->fact->wind_speed);
sg("Zlatoust.Image",$xml->fact->{'image-v3'});
// определение вероятности дождя 0 или 1
$rain1=gg("Zlatoust.Type");
$rain2=$xml->day[0]->day_part[0]->weather_type;
$rain3=$xml->day[0]->day_part[1]->weather_type;
$rain4=$xml->day[0]->day_part[2]->weather_type;
$rain5=$xml->day[0]->day_part[3]->weather_type;
$rain=($rain1. $rain2. $rain3. $rain4. $rain5);
$pos = strpos($rain, "дожд");
if ($pos === false) {
sg("Zlatoust.Rain",0);
} else {
sg("Zlatoust.Rain",1);
// say("Возможен дождь",2);
}
// Направление ветра
$dir = $xml->fact->wind_direction;
// Функция возвращает массив, поэтому записываем в переменные значения, полученные в функции
list ($dir, $dirtext) = getWindDirection($dir);
sg("Zlatoust.WindDir",$dir);
sg("Zlatoust.WindDirText",$dirtext);
// Солнце: восход/закат
sg("Zlatoust.SunRise",$xml->day[0]->sunrise);
sg("Zlatoust.SunSet",$xml->day[0]->sunset);
// Луна
sg("Zlatoust.Moon_phase",$xml->day[0]->moon_phase);
sg("Zlatoust.MoonRise",$xml->day[0]->moonrise);
sg("Zlatoust.MoonSet",$xml->day[0]->moonset);
// длинный текстовый прогноз погоды
// $metcast="";
$metcast="На улице ".gg("Zlatoust.Type").".";
// ветер
$WindSpeed=(float)gg("Zlatoust.WindSpeed");
if ($WindSpeed<1) { $metcast.=' Ветра, скорее всего, нет.';
} elseif ($WindSpeed<3) { $metcast.=' Возможен слабый ветер.';
} elseif ($WindSpeed<6) { $metcast.=' Возможен сильный ветер.';
} elseif ($WindSpeed<9) { $metcast.=' Возможен довольно сильный ветер.';
} else { $metcast.=' Возможен очень сильный ветер.';
}
$w=round(strip_tags(gg("Zlatoust.Temp")));
$tempw=$w;
if($w < "0"){ $tempw=abs($w); }
if($w > "0"){ $templus=" плюс "; }
if($tempw >= 11 and $tempw <= 14){ $tempcels=" градусов";}
else{
while ($tempw > 9){
$tempw=$tempw-10;
}
if($tempw == 0 or $tempw >= 5 and $tempw <= 9){ $tempcels=" градусов"; }
if($tempw == 1){ $tempcels=" градус"; }
if($tempw >= 2 and $tempw <= 4){ $tempcels=" градуса"; }
}
$metcast.=' Температура '.gg("Zlatoust.Temp").' '.$tempcels.'.';
$tm=(float)gg("Zlatoust.Temp");
if ($tm<-40) { $metcast.=' Мы морозов не боимся!';
} elseif ($tm<-30) { $metcast.=' Очень холодно, оденьтесь теплее.';
} elseif ($tm<-20) { $metcast.=' Самое время есть мороженое.';
} elseif ($tm<-10) { $metcast.=' Холодновато.';
} elseif ($tm<-3) { $metcast.=' Не особо холодно.';
} elseif ($tm<3) { $metcast.=' Значит, возможно, гололёд.';
} elseif ($tm<10) { $metcast.=' Тепловато.';
} elseif ($tm<25) { $metcast.=' Тепло.';
} elseif ($tm<30) { $metcast.=' Жарко.';
} elseif ($tm>30) { $metcast.=' Ташкент.';
}
// $metcast.=' Восход солнца сегодня в '.gg("Zlatoust.SunRise").',';
// $metcast.=' закат в '.gg("Zlatoust.SunSet").'.';
sg("Zlatoust.metcast",$metcast);
// прогноз на 3 дня
$w3days="Сегодня ночью будет ";
$temp=$xml->day[0]->day_part[3]->temperature_from;
if ($temp>0) {$temp='+'.$temp;}
$w3days.=$temp;
$w3days.="°, ";
$w3days.=$xml->day[0]->day_part[3]->weather_type;
$w3days.=".\r\nЗавтра днём будет ";
$temp=$xml->day[1]->day_part[1]->temperature_from;
if ($temp>0) {$temp='+'.$temp;}
$w3days.=$temp;
$w3days.="°, ";
$w3days.=$xml->day[1]->day_part[1]->weather_type;
$w3days.=". Послезавтра ночью ";
$temp=$xml->day[1]->day_part[3]->temperature_from;
if ($temp>0) {$temp='+'.$temp;}
$w3days.=$temp;
$w3days.="°, ";
$w3days.=$xml->day[1]->day_part[3]->weather_type;
$w3days.=".";
sg("Zlatoust.forecast",$w3days);
// Определяем время года
$season = $xml->fact->season;
switch ($season){
case 'winter':
$season="зима";
break;
case 'summer':
$season="лето";
break;
case 'autumn':
$season="осень";
break;
case 'spring':
$season="весна";
break;
}
sg("Zlatoust.season",$season); //время года
// Запишем прогноз погоды на 10 дней
$nDay=0;
foreach($xml->day as $day) {
// записываем дату с днем недели на каждый день
sg("Zlatoust.mcD".$nDay."_Day",getDayDate($day['date']));
// нам нужны только 4 части дня по 6+1 параметров в каждом
for($i = 0;$i < 4;$i++) {
$prop_Temp = 'mcD'.$nDay.'_Temp_'.$i;
//addClassProperty('Weather',$prop_Temp);
$prop_Image = 'mcD'.$nDay.'_Image_'.$i;
//addClassProperty('Weather',$prop_Image);
$prop_WindDir = 'mcD'.$nDay.'_WindDir_'.$i;
//addClassProperty('Weather',$prop_WindDir);
$prop_WindDirText = 'mcD'.$nDay.'_WindDirText_'.$i;
//addClassProperty('Weather',$prop_WindDirText);
$prop_WindSpeed = 'mcD'.$nDay.'_WindSpeed_'.$i;
//addClassProperty('Weather',$prop_WindSpeed);
$prop_Humidity = 'mcD'.$nDay.'_Humidity_'.$i;
//addClassProperty('Weather',$prop_Humidity);
$prop_Pressure = 'mcD'.$nDay.'_Pressure_'.$i;
//addClassProperty('Weather',$prop_Pressure);
// 1 температура
sg("Zlatoust.".$prop_Temp, getTempSign($day->day_part[$i]->{'temperature-data'}->avg));
// 2 Картинка
sg("Zlatoust.".$prop_Image,$day->day_part[$i]->{'image-v3'});
// 3 Направление ветра
$dir = $day->day_part[$i]->wind_direction;
// Функция возвращает массив, поэтому записываем в переменные значения, полученные в функции
list ($dir, $dirtext) = getWindDirection($dir);
sg("Zlatoust.".$prop_WindDir, $dir);
sg("Zlatoust.".$prop_WindDirText, $dirtext);
// 4 Скорость ветра
sg("Zlatoust.".$prop_WindSpeed,$day->day_part[$i]->wind_speed);
// 5 Влажность
sg("Zlatoust.".$prop_Humidity,$day->day_part[$i]->humidity);
// 6 Атмосферное давление
sg("Zlatoust.".$prop_Pressure,$day->day_part[$i]->pressure);
}
$nDay++;
}
// Обновляем показатели жизни объекта
sg("Zlatoust.updatedTimestamp", time());
sg("Zlatoust.updatedTime", date( "H:i - d.m.Y", time()));
// Проговариваем, при необходимости
$sayMetUSD = gg ("Sets.sayMetUSD");
if ($sayMetUSD) {
say("Читаю прогноз погоды с Yandex",($sayMetUSD-2));
}
// ********************************************************
// КОНЕЦ ОСНОВНОГО БЛОКА
// Функция - добавления "+" к положительной температуре
function getTempSign($temp)
{
$temp = (int)$temp;
return $temp > 0 ? '+'.$temp : $temp;
}
// Функция - получить направления ветра в МАССИВ
function getWindDirection($wind)
{
$wind = (string)$wind;
$wind_direction = array('s'=>'↑ ю',
'n'=>'↓ с',
'w'=>'→ з',
'e'=>'← в',
'sw'=>'↗ юз',
'se'=>'↖ юв',
'nw'=>'↘ сз',
'ne'=>'↙ св');
$wind_dirtxt = array('s'=>'южный',
'n'=>'северный',
'w'=>'западный',
'e'=>'восточный',
'sw'=>'юго-западный',
'se'=>'юго-восточный',
'nw'=>'северо-западный',
'ne'=>'северо-восточный');
return array ($wind_direction[$wind], $wind_dirtxt[$wind]);
}
// Функция - получить локализованный день недели
function getDayDate($date)
{
$date = strtotime($date);
// $months = array('','января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря');
$days = array('ВС','ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ');
// return $days[date('w', $date)].', '.(int)date('d',$date).' '.$months[date('n', $date)].' '.date('y',$date).' г.';
return $days[date('w', $date)];
}
|
RadioVolumeDown
|
Радио тише (не работает)
$ip=$_SERVER['REMOTE_ADDR'];//узнаем IP терминала пославшего запрос
if ($ip == "192.168.1.150") {//если IP от Redmi3,
$ip=gg('Pi_3.IPint'); //заменим его на основной IP Амарока
} //
$volstep=gg('Radio.VolumeStep');
$runradio="http://";
//$url=gg('Radio.StationURL');
$runradio.=$ip;
$runradio.=":8080/requests/status.xml?command=volume&val=-";
$runradio.=$volstep;
getURL($runradio,0);
say("Убавляю", 1);
|
RadioVolumeUp
|
Радио громче (не работает)
$volstep=gg('Radio.VolumeStep');
$ip=$_SERVER['REMOTE_ADDR'];//узнаем IP терминала пославшего запрос
if ($ip == "192.168.1.150") {//если IP от Redmi3,
$ip=gg('Pi_3.IPint'); //заменим его на основной IP Амарока
} //
$runradio="http://";
$runradio.=$ip;
$runradio.=":8080/requests/status.xml?command=volume&val=+";
$runradio.=$volstep;
getURL($runradio,0);
say("Прибавляю", 1);
|
rssProcess
|
не использую
/*
$params['URL'] --link
$params['TITLE'] -- title
$params['BODY'] -- body
$params['CHANNEL_ID'] -- channel ID
$params['CHANNEL_TITLE'] -- channed title
*/
//say($params['TITLE']); // reading news
|
sunRise_test
|
Рассвет не работает
//LedStrip1
if (!getGlobal('DarknessMode.active')) return;
{
callMethod("LedStrip1.setColor",array('color'=>'ff911d'));
}
$sunriseLevel=(int)gg('LedStrip1.sunriselevel');
if ($sunriseLevel<100) {
$sunriseLevel+=10;
if ($sunriseLevel==10) {
cm('LedStrip1.turnOn');
for($i=0;$i<10;$i++) {
cm('LedStrip1.sendCommand',array('command'=>'leveldown'));
}
} else {
sg('LedStrip1.sunriselevel',$sunriseLevel);
cm('LedStrip1.sendCommand',array('command'=>'levelup'));
}
setTimeout('sunriseTimer','runScript("sunRise");',60);
// setTimeOut('lightOff', " runScript('turnOff_All');", (int)('6350'));
} else {
$sunriseLevel=0;
}
sg('LedStrip1.sunriselevel',$sunriseLevel);
|
sunSet_test
|
Закат не работает
//LedStrip1
if (!gg('LedStrip1.status')) return;
$sunriseLevel=(int)gg('LedStrip1.sunriselevel');
if ($sunriseLevel<100) {
$sunriseLevel+=10;
sg('LedStrip1.Level',$sunriseLevel);
cm('LedStrip1.sendCommand',array('command'=>'leveldown'));
setTimeout('sunsetTimer','runScript("sunSet");',30);
} else {
//cm('LedStrip1.turnOff');
$sunriseLevel=0;
}
sg('LedStrip1.sunriselevel',$sunriseLevel);
|
systemVolume
|
Установка общей громкости (не работает)
$v=$params['volume'];
getURL('http://192.168.2.110/popup/app_player.html?ajax=1&command=volume&volume='.$v,0);
|
test
|
выводит Hello world!
setTimeOut('testTimer','say("Hello world!");',30);
|
timeNow
|
выводит текущее время
|