AllOne
|
include_once(DIR_MODULES.'orvibo/orvibo.class.php');
$orv=new orvibo();
$orv->getConfig();
/*
$rnumber = 68719476736+20000;
while (1) {
// fffffffffff +
// 1000000000 *
1122334455
$status.=$orv->sendRF(2, dechex($rnumber));
echo dechex($rnumber).' '.$status.'<br/>';
if($rnumber > 17592186044415) {break;}
if($rnumber > 68719476736+90000) {break;}
$rnumber++;
}
*/
$rnumber = rand(68719476736, 17592186044415);
$status=$orv->sendRF(2, dechex($rnumber),0);
echo dechex($rnumber).'<br/>';
/*
include_once(DIR_MODULES.'orvibo/orvibo.class.php');
$zw=new orvibo();
$zw->getConfig();
// работать
//$code = '00000000 98000000 00000000 00008800 55223111 1d023302 1b021b02 33021902 34021a02 2a022402 1b023302 1b026c06 34021902 33026c06 1d023302 1b026d06 34021902 33026d06 1c023302 1b026c06 35021902 32021b02 0c024202 1b026d06 33021a02 34021902 2f021e02 fb01a206 1c021b02 32026906 30026d06 1c023202 1b026a06 35026a06 e301bd06 1b021c02 31026a06 32020000';
//$code = '00000000 98000000 00000000 00008800 60222e11 1b023502 19021c02 31021a02 36021702 30021d02 1d022f02 1d026906 33021a02 35026b06 1f023102 1e026b06 33021b02 36026b06 1f023102 1e026906 34021a02 36021802 25022802 1d026d06 32021c02 33021a02 34021a02 17028806 1c021c02 31026d06 35026d06 1e023202 1d026b06 36026c06 0e029206 1e021b02 34026a06 37020000';
//домой
//$code = '00000000 98000000 00000000 00008800 50223411 17023802 16022002 2d021e02 2f021e02 2a022302 16023702 15027106 36021802 30027106 17023802 16027206 2f021f02 2f027106 17023802 19026d06 2f021e02 2f027106 17023802 16022102 2d021f02 2f027006 fd015202 16023802 16022002 2d021e02 30027106 e401bf06 18027306 33021e02 2d027306 17027206 2f026f06 30020000';
//$zw->sendIR(2, $code);
$status=$zw->sendRF(2, 'fffffffffff');
echo "ok $status";
//686400127167accf23298b8c202020202020
*/
|
countAction
|
if (gg("Relay163.status")) {
if (gg("mqttMotion134.status")) {
$i = gg('count_act');
$i++;
if ($i>=3) {
sg('count_act', 0);
callMethod("Relay165.turnOn");
} else {
sg('count_act', $i);
}
} else {
sg('count_act', 0);
}
}
|
dfjgnhasklfnafansf
|
$sql = "SELECT CUR_VALUE FROM commands WHERE ID = 393";
$rec = SQLSelectOne($sql);
if ($rec[CUR_VALUE]) {
echo '+';
}
|
dsdfasfasfsffasfs
|
debmes('getkeydata' . json_encode(getkeydata(310), JSON_UNESCAPED_UNICODE));
|
fun_exsist_const
|
$z=534;
$t='124';
$k=1;
for ($i=0; $i<1000; $i++) {
$q = exsist_conct($k,$z);
//$q = orig_preg($k,$t);
}
function orig_preg($k,$t) {
if (preg_match("/$k/isu",$t)) {
return true;
} else {
return false;
}
}
function exsist_conct($k,$z) {
for ($j=1024,$i=10; $j>=2; $j=$j/2, $i--) {
//echo $j.' '.$i;
if ($z>=$j) {
$z=$z-$j;
//echo '+';
if($i==$k) { return true; }
}
//echo ' | ';
}
return false;
}
|
iiiBot
|
define('BOT_TOKEN', '8a5526de-f601-4f35-ba33-70ce385fffcb'); //Идентификатор бота с 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);
}
|
iiiBot_test
|
$message='Почему ты грубишь?';
runScript('iiiBot', array('message'=>$message));
|
myheattest
|
// {"action":"getDevices","login":"neftino10","key":"f11f43a2-5fb114e10329c3-62237212"}
//CURLOPT_POSTFIELDS => array("action" => "getDevices", "login" => "neftino10", "key" => "f11f43a2-5fb114e10329c3-62237212")
//CURLOPT_POSTFIELDS => http_build_query(array("action" => "getDevices", "login" => "neftino10", "key" => "f11f43a2-5fb114e10329c3-62237212"))
// {"action":"getDeviceInfo","deviceId":3753,"login":"neftino10","key":"f11f43a2-5fb114e10329c3-62237212"}
/*
curl_setopt_array($ch = curl_init(), array(
CURLOPT_URL => "https://my2.myheat.net/api/request/",
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POSTFIELDS => json_encode(array(
"action" => "setEnvGoal",
"deviceId" => "3744",
"objId" => "24",
"login" => "Bagir",
"key" => "f11f434d-5fb2b987eff217-91217626",
"changeMode" => "0",
"goal" => "65",
))
));
$res=curl_exec($ch);
if (curl_errno($ch) > 0) {
die('Ошибка curl: ' . curl_error($ch));
}
curl_close($ch);
//echo urldecode($res).'<br><br>';
$array = json_decode($res, true);
//print_r($array);
//echo '<br><br>';
if ($array["err"]===0) {echo "ошибок нет <br>";}
*/
// ----------------------------------
curl_setopt_array($ch = curl_init(), array(
CURLOPT_URL => "https://my2.myheat.net/api/request/",
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POSTFIELDS => json_encode(array(
"action" => "getDeviceInfo",
"deviceId" => "3744",
"login" => "Bagir",
"key" => "f11f434d-5fb2b987eff217-91217626",
))
));
$res=curl_exec($ch);
if (curl_errno($ch) > 0) {
die('Ошибка curl: ' . curl_error($ch));
}
curl_close($ch);
echo urldecode($res).'<br><br>';
$array = json_decode($res, true);
echo "<pre>";
print_r($array);
echo "<\pre>";
echo '<br><br>';
if ($array["err"]===0) {echo "ошибок нет <br>";}
if ($array["data"]["dataActual"]===true) {echo "Данные актуальны <br>";} else {echo "Данные НЕ актуальны <br>";}
echo 'Улица '.$array["data"]["weatherTemp"].'<br>';
foreach($array["data"]["heaters"] as $arr) {
echo '<br>';
print_r($arr);
}
echo '<br>';
foreach($array["data"]["envs"] as $arr) {
echo '<br>';
print_r($arr);
}
/*
/////////////////////////////////////////////////////
$params = array(
'action' => 'getDevices',
'login' => 'neftino10',
'key' => 'f11f43a2-5fb114e10329c3-62237212'
);
$result = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => json_encode($params)
)
)));
var_dump($http_response_header);
echo "Ответ:".$result;
*/
|
OpenMonitorTest
|
//Получение данных от OpenHardwareMonitor "CPU Core #2",
$ch = curl_init('http://10.10.3.2:8085/data.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ohm = curl_exec($ch);
$json = json_decode($ohm);
print_r('<pre><p style="background-color: beige; color: maroon; padding: 10px; margin: 5px; border: 1px maroon solid;">');
print_r($json);
print_r('</p></pre>');
|
Pgt
|
/*
<img src="/img/icons/status/shield_32_%Guard.stateColor%.png" align="absmiddle" title="%Guard.stateDetails%" onclick="alert('%Guard.stateDetails%');">
<img src="/img/icons/status/lock_32_%Security.stateColor%.png" align="absmiddle" title="%Security.stateDetails%" onclick="alert('%Security.stateDetails%');">
<img src="/img/icons/status/network_32_%Communication.stateColor%.png" align="absmiddle" title="%Communication.stateDetails%" onclick="alert('%Communication.stateDetails%');">
<img src="/img/icons/status/system_32_%System.stateColor%.png" align="absmiddle" title="%System.stateDetails%" onclick="alert('%System.stateDetails%');">
<img src="/img/icons/status/code_32_%Code.stateColor%.png" align="absmiddle" title="%Code.stateDetails%" onclick="alert('%Code.stateDetails%');">
*/
$s = gg('Security.stateColor');
if ($s!='green') {
echo '<img src="/img/icons/status/lock_32_'.$s.'.png" align="absmiddle">';
echo '<span>'.gg('Security.stateDetails').'</span><br />';
}
$s = gg('Communication.stateColor');
if ($s!='green') {
echo '<img src="/img/icons/status/network_32_'.$s.'.png" align="absmiddle">';
echo '<span>'.gg('Communication.stateDetails').'</span><br />';
}
$s = gg('System.stateColor');
if ($s!='green') {
echo '<img src="/img/icons/status/system_32_'.$s.'.png" align="absmiddle">';
echo '<span>'.gg('System.stateDetails').'</span><br />';
}
$s = gg('Code.stateColor');
if ($s!='green') {
echo '<img src="/img/icons/status/code_32_'.$s.'.png" align="absmiddle">';
echo '<span>'.gg('Code.stateDetails').'</span><br />';
}
|
q1
|
// getURL($cmdUrl, 0);
//-volumelevel:80 -outputchannel:3
//echo urlencode("Проверка, тест");
// Опрос температуры всех Мегадевайсов
$objects = getObjectsByClass('MegaD');
foreach ($objects as $obj) {
if (getGlobal($obj['TITLE'].'.ipAddress')) {
callMethod($obj['TITLE'].'.getData', array('port'=>'tget'));
}
}
/*
$cmdUrl="http://10.10.3.2:8090/";
$ctx = stream_context_create(array('http'=>array('timeout'=>2) ) );
$dt="1";
// $dt = file_get_contents($cmdUrl."-outputchannel:3 ".urlencode("Проверка"), 0, $ctx);
$dt = getURL($cmdUrl."-outputchannel:3 ".urlencode("Проверка"), 0);
// if ($dt!="ok") {registerError('sdm', 'No confirmation from the program');}
echo "!".$dt."!";
*/
|
Reminder_by_xor
|
//для шаблона Напомни
//if(!$params['txt']) return;
//$cmd = $params['txt'];
//$cmd = 'в 11:30 дня в следующий вторник проверить кое-что';
//$cmd = 'проверить кое-что через четверть часа';
//$cmd = 'вечером в выходные проверить кое-что';
//$cmd = 'проверить кое-что в полдень послезавтра';
//$cmd = 'через два с половиной часа сделать кое-что';
//$cmd = 'сделать кое-что через два с половиной часа';
//$cmd = 'сегодня сделать кое-что';
$cmd = 'сделать кое-что через один час две минуты 15 секунд';
debmes('setMemo - '.$cmd);
$cmd = mb_strtolower($cmd, 'utf-8');
$newtime = 0;
$newdate = 0;
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd); //уберём лишние пробелы
$chislo = array('один'=> '1','одну'=> '1','одни'=> '1','полтора' => '1.5','полторы' =>'1.5','два'=> '2','две'=> '2','двое'=> '2','три'=> '3','трое'=> '3','четыре'=> '4','четверо'=> '4','пять'=> '5','шесть'=> '6','семь'=> '7','восемь'=> '8','девять'=> '9');
$tim1 = array('минуту'=>'m','минуты'=>'m','минут'=>'m','часов'=>'H','часа'=>'H','час'=>'H','день'=>'D','дня'=>'D','дней'=>'D','сутки'=>'D','суток'=>'D');
$MonthNames = array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря");
//через?
if(preg_match('/через /isu', $cmd1)){
if(preg_match('/через полчаса/isu', $cmd1, $m)){
$cmd1 = str_replace('через полчаса','через 30 минут',$cmd1); //через полчаса -> через 30 минут
}
if(preg_match('/через четверть часа/isu', $cmd1, $m)){
$cmd1 = str_replace('через четверть часа','через 15 минут',$cmd1); //через полчаса -> через 30 минут
}
if(preg_match('/через (час|минуту|день|сутки)/isu', $cmd1, $m)){
$cmd1 = str_replace('через','через 1',$cmd1); //через час -> через 1 час
}
$half = 0;
if(preg_match('/(часов|часа|час) с половиной /isu', $cmd1, $m)){
$half = 0.5;
$cmd1 = str_replace('с половиной','',$cmd1);
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
}
if(preg_match('/с половиной (часов|часа|час)/isu',$cmd1,$m)){
$half = 0.5;
$cmd1 = str_replace('с половиной','',$cmd1);
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
}
if(preg_match('/через (.+) (часов|часа|час|минуты|минуту|минут|день|дня|дней|сутки|суток)/isu', $cmd1, $m)){
//print_r($m);
$cmd1 = str_replace($m[0],'',$cmd1);
foreach($chislo as $key => $value) {$m[1] = str_replace($key,$value,$m[1]);} //'один'=> '1'
foreach($tim1 as $key => $value) {$m[2] = str_replace($key,$value,$m[2]);} //'минуту'=>'m','минуты'=>'m'...
//вычислим новое время
$delta = (float)$m[1];
if($delta<=0){
echo('wrong interval '.$delta);
say('Непонятно! Попробуйте задать время по другому',2);
return;
}
switch ($m[2]){
case 'm':
$newtime = time() + $delta*60;//minutes
break;
case 'H':
$newtime = time() + $delta*60*60 + $half*60*60;//hours
break;
case 'D':
$newtime = time() + $delta*60*60*24;//days ToDo - add to calendar?
break;
default:
say('Непонятно! Попробуйте переформулировать задание',2);
return;
}
/// AddScheduledJob($cmd1,"playSound('r2d2',1); say('Вы просили напомнить ".$cmd1."',5);",$newtime, 60);
$nmes=date( "n" , $newtime)-1;
$nmonth=$MonthNames[$nmes];
debmes("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth);
say("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth,2);
return;
}
}
////////////////////////////////////////////////////////////////////
$newtime = time();
if(preg_match('/(сегодня|завтра|послезавтра)/isu', $cmd1, $m)){
switch($m[0]){
case 'завтра':
$newtime = strtotime("+1 day");
break;
case 'послезавтра':
$newtime = strtotime("+2 days");
break;
case 'сегодня':
$newtime = strtotime("+2 minute");
}
$cmd1 = str_replace($m[0],'',$cmd1);
}
if(preg_match('/в (следующий|следующую|следующее|следующие) /isu', $cmd1, $m)){
$cmd1 = str_replace($m[1],'',$cmd1);
}
if(preg_match('/в (этот|эту|это|эти) /isu', $cmd1, $m)){
$cmd1 = str_replace($m[1],'',$cmd1);
}
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
if(preg_match('/(в|во) (понедельник|вторник|среду|четверг|пятницу|субботу|воскресенье|выходные) /isu', $cmd1, $m)){
switch($m[2]){
case 'понедельник':
$newtime = strtotime("next Monday");
break;
case 'вторник':
$newtime = strtotime("next Tuesday");
break;
case 'среду':
$newtime = strtotime("next Wednesday");
break;
case 'четверг':
$newtime = strtotime("next Thursday");
break;
case 'пятницу':
$newtime = strtotime("next Friday");
break;
case 'субботу':
$newtime = strtotime("next Saturday");
break;
case 'воскресенье':
$newtime = strtotime("next Sunday");
break;
case 'выходные':
$newtime = strtotime("next Saturday");
break;
}
$cmd1 = str_replace($m[0],'',$cmd1);
}
//проверим время
if(preg_match('/в (полдень|полночь)/isu', $cmd1)){
$cmd1 = str_replace('в полдень','в 12:00',$cmd1);
$cmd1 = str_replace('в полночь','в 23:59',$cmd1);
}
$cmd1 = preg_replace('/\s\s+/', ' ', $cmd1); //уберём лишние пробелы
if(preg_match('/(утром|вечером|днём|днем|ночью)/isu', $cmd1, $m)){ //напомни утром
$cmd2 = $m[0]; //для удаления
if(!preg_match('/в (\d+):(\d+)/isu', $cmd1)){ //
switch($cmd2){
case 'утром':
$newtimes = 'в 8:00';
break;
case 'вечером':
$newtimes = 'в 20:00';
break;
case 'днём':
$newtimes = 'в 13:00';
break;
case 'днем':
$newtimes = 'в 13:00';
break;
case 'ночью':
$newtimes = 'в 23:00';
break;
}
}
$cmd1 = str_replace($cmd2,$newtimes,$cmd1);
}
if(preg_match('/в (\d+):(\d+)/isu', $cmd1, $m)){
$hour = $m[1];
$minute = $m[2];
$cmd2 = $m[0]; //для удаления
if(preg_match('/в (\d+):(\d+) (ночи|дня|утра|вечера)/isu', $cmd1, $m)){
switch ($m[3]){
case 'дня':
if((int)$hour<12){$hour = $hour +12;} // в 3 часа дня = в 15:00
break;
case 'вечера':
if((int)$hour<12){$hour = $hour +12;} // в 6 часов вечера = в 18:00
break;
}
$cmd1 = str_replace($m[0],'',$cmd1);
}
$cmd1 = str_replace($cmd2,'',$cmd1);
$newtime = mktime( (int)$hour,(int)$minute,0,date("n",$newtime),date("j",$newtime), date("Y",$newtime));
if($newtime<time()){$newtime = strtotime(date('Y-m-d H:i',$newtime)."+ 1 days");}
}
/// AddScheduledJob($cmd1,"playSound('r2d2',1);sleep(2); say('Вы просили напомнить - ".$cmd1."',5);",$newtime, 60);
$nmes = date( "n" , $newtime)-1;
$nmonth = $MonthNames[$nmes];
debmes("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth);
say("Задание напомнить ".$cmd1." установлено на ".date('G:i',$newtime)." ".date('d',$newtime)." ".$nmonth,2);
//return;
|
sdjfghsdkgsdkjgsdkjgsdf
|
$j = json_decode('{"SSDP":"WebSockets-Server","ip":"10.10.0.3","flashChip":"16400b","dhttime":10000,"temperature":"23.38","humidity":"29.19","time":"15:33:52","date":"Tue Nov 7 2023"}', JSON_UNESCAPED_UNICODE);
echo serialize($j);
|
sdjlflflsdfklfasklmfaksdfmaklsf
|
$allMaxPower=0; // счетчик максимальной мощности. свойство maxPower указывается только у объектов отопителей
$allCurPower=0;
// запуск методов airCalculate
$objects=getObjectsByClass('Thermostat');
//echo serialize($objects);
foreach($objects as $obj) {
$obj=getObject($obj['TITLE']);
//echo '<br><br>' . $obj->object_title;
//$obj->callMethod('airCalculate');
$powerLevels = $obj->getProperty('powerLevels');
preg_match_all('/(\d+\.?\d*)/', $powerLevels, $matches, PREG_PATTERN_ORDER);
// складывать все мощности
$allMaxPower += array_sum($matches[0]);
//echo '<br>powerLevels=' . $powerLevels;
//echo '<br>' . serialize($matches);
//echo '<br>array_sum=' . array_sum($matches[0]);
// складывать активные мощности
$status = (int)$obj->getProperty('status');
//echo '<br>status=' . $status;
// Heating не обязательное свойство. Но если оно есть, то не должно быть строго равно нулю
if ($status && $obj->getProperty('Heating')!==0) {
//сложить все работающие ступени кроме последней
for ($i = 1; $i < $status; $i++) {
$allCurPower += $matches[0][$i-1];
//echo "<br> $i сбор ступеней до предпоследней " . $matches[0][$i-1];
}
$curPower=(float)$matches[0][$i-1];
//echo "<br> $i последняя ступень без уч модул " . $curPower;
if (strlen($obj->getProperty('modulation'))) { $curPower = $curPower * (int)$obj->getProperty('modulation') / 100; }
//echo "<br> $i последняя ступень с уч модул " . $curPower;
$allCurPower += $curPower;
}
//echo '<br>allCurPower=' . $allCurPower;
}
// sg('heatingPower', round($allCurPower/$allMaxPower*100));
// echo '<br>allMaxPower=' . $allMaxPower . ' allCurPower=' . $allCurPower . ' heatingPower=' . round($allCurPower/$allMaxPower*100) . '%';
|
sec
|
// этот код для теста
$msg = ''; // Собирает сообщение
// $gm = gg('GuardMode.status');
$objects=getObjectsByClass("Rooms");
$arrall = array('Fire'=>'Пожарная тревога', 'Smoke'=>'Обнаружен дым', 'Heat'=>'Резкое повышение температуры',
'Toxic'=>'Обнаружен угарный газ', 'Gas'=>'Взрывоопасное содержание газа','Flood'=>'Обнаружена протечка жидкости',
'Freeze'=>'Критически низкая температура','Security'=>'Нарушение охранны');
// Получить строку маркеров
$det = registeredEventDetails('alarmEvent');
// Если строка не пустая
if ($det) {
// Разбить строку на массив
$arrdet = explode(' ', $det);
// Перебрать элементы массива в поисках их подтверждения в комнатах
foreach($arrdet as $key => $val) {
// Security не трогать, остальные маркеры проверить
if ($val=='Security') {
$msg .= ' '.$arrall[$val];
} else {
$f=0;
// Перебрать массив комнат в поисках маркера
foreach($objects as $obj) {
$obj=getObject($obj['TITLE']);
$am = $obj->getProperty('alarms');
$ir = $obj->getProperty('inRoomText');
// Добавить к сообщению вид и место тревоги
if (strpos($am, $val) !== false) { $msg .= ' '.$arrall[$val].' '.$ir.'.'; $f = 1; }
//echo $ir.'_'.$am.'_';
}
// Удаляем элемент массива, если не нашли подтверждение в комнатах
if (!$f) { unset($arrdet[$key]); }
}
} //$arrdet
// Если не все метки удалены из массива
if (count($arrdet)) {
$det = implode(' ', $arrdet);
// Установить событие Алярма с деталями тревоги.
registerEvent('alarmEvent', $det, 1);
say($msg, 1);
} else {
// остановить трек если существует событие
playsound('-streamhandle:'.gg('alarmStreamHandle').' -music:stop');
// Удалить событие
clearEvent('alarmEvent');
}
} // Если строка не пустая
|
secindata
|
/**
* Преобразование секунд в секунды/минуты/часы/дни/года
*
* @param int $seconds - секунды для преобразования
*
* @return array $times:
* $times[0] - секунды
* $times[1] - минуты
* $times[2] - часы
* $times[3] - дни
* $times[4] - года
* $times[5] - 0 г 0 д 00:00:00
*/
echo seconds2times(1000000)[5];
function seconds2times($seconds)
{
$times = array();
$s='';
// считать нули в значениях
$count_zero = false;
// количество секунд в году не учитывает високосный год
// поэтому функция считает что в году 365 дней
// секунд в минуте|часе|сутках|году
$periods = array(60, 3600, 86400, 31536000);
for ($i = 3; $i >= 0; $i--)
{
$period = floor($seconds/$periods[$i]);
if (($period > 0) || ($period == 0 && $count_zero))
{
$s.=$period;
if ($i==2) {$s.='д ';} elseif ($i==3) {$s.='г ';} else {$s.=':';}
$times[$i+1] = $period;
$seconds -= $period * $periods[$i];
$count_zero = true;
}
}
$times[0] = $seconds;
$s.=$seconds;
$times[5] = $s;
return $times;
}
|
stemp
|
/*
задаем массив с именами комнат
перебираем массив. если дата актуальная, то сумируем температуру и считаем количество
делим сумму на количество
*/
say('Провожу расчёт средней температуры на втором этаже.', 0);
$names = ['Livingroom','Bedroom','HallArea','OfficeRoom'];
foreach($names as $name) {
// Получить объект по имени
$obj=getObject($name);
// Получить id свойства
$prop_id=$obj->getPropertyByName('Temperature', $obj->class_id, $obj->id);
// Получаем VALUE_ID для следующей таблицы
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".$prop_id."' AND OBJECT_ID='".$obj->id."'");
// Получаем последнюю запись из таблицы
$arr_s=SQLSelectOne("SELECT * FROM phistory WHERE VALUE_ID='".$pvalue['ID']."' ORDER BY ADDED DESC");
// Ответ
if (strtotime("now") - strtotime($arr_s['ADDED']) < 3*60*60) {
$summt=$summt+$arr_s['VALUE'];
$kolt=$kolt+1;
say('температура '.$name.'='.$arr_s['VALUE'], 0);
} else {
say('температура '.$name.' не актуальна', 0);
}
}
say('Среднеяя температура ' . $summt/$kolt );
/*
имеем среднюю температуру по второму этажу.
разрешение на открытие заслонки
*/
|
test3924792829483
|
function declOfNum($num, $titles) {
$cases = array(2, 0, 1, 1, 1, 2);
return $titles[($num % 100 > 4 && $num % 100 < 20) ? 2 : $cases[min($num % 10, 5)]];
}
$a=5;
$s=declOfNum($a, array('Удален', 'Удалены', 'Удалены'));
$s.= ' '.$a.' ';
$s.=declOfNum($a, array('объект', 'объекта', 'объектов'));
echo $s;
|
testautorize
|
$curl = curl_init();
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');
//curl_setopt($curl, CURLOPT_URL, 'http://10.10.3.2:9786/cameras/0/video');
curl_setopt($curl, CURLOPT_URL, 'http://10.10.3.2:9786/cameras');
// $post = "login=admin&password=";
// curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_USERPWD, "admin:");
$html = curl_exec($curl);
echo $html;
/*
preg_match('/<input type="hidden" id="login_csrf" value="(.*)"/Uis',$html, $login_csrf);
$login_csrf = $login_csrf[1];
//echo $login_csrf;
$post = "email=ctac4ever@gmail.com&password=test123&remember=1&login_csrf=".$login_csrf."&submit=Вход&formid=login";
curl_setopt($curl, CURLOPT_URL, 'https://monitor.masterfolio.ru/auth/login');
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$html = curl_exec($curl);
echo $html;
*/
|
testIR
|
sg('IRtransOfficeRoom.code',gg('TVerisson.powerOn'));
cm('IRtransOfficeRoom.send');
|
testYandexoAut
|
Define('YADEVICES_COOKIE_PATH', ROOT . "cms/yadevices/cookie.txt");
$post = array(
'client_secret' => 'ad0a908f0aa341a182a37ecd75bc319e',
'client_id' => 'c0ebe342af7d48fbbbfcf2d2eedb8f9e',
);
$postvars = '';
foreach($post as $key=>$value) {
$postvars .= $key . "=" . urlencode($value) . "&";
}
$cookie_data = LoadFile(YADEVICES_COOKIE_PATH);
$new_cookies = array();
$lines = explode("\n",$cookie_data);
foreach($lines as $line) {
if (preg_match('/^(.*?)\.yandex\.ru/',$line)) {
$values = explode("\t",$line);
$cookie_title = $values[5];
$cookid_value = $values[6];
if ($cookie_title == 'yaexpflags') continue;
$new_cookies[]=$cookie_title.'='.$cookid_value;
}
}
$cookies_line = implode("; ",$new_cookies);
$headers = array(
'Ya-Client-Host: passport.yandex.ru',
'Ya-Client-Cookie: ' . $cookies_line
);
$YaCurl = curl_init();
curl_setopt($YaCurl, CURLOPT_URL, 'https://mobileproxy.passport.yandex.net/1/bundle/oauth/token_by_sessionid');
curl_setopt($YaCurl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($YaCurl, CURLOPT_POST, true);
curl_setopt($YaCurl, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($YaCurl, CURLOPT_COOKIEFILE, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_COOKIEJAR, YADEVICES_COOKIE_PATH);
curl_setopt($YaCurl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($YaCurl, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($YaCurl);
curl_close($YaCurl);
$data = json_decode($result, true);
if ($data['access_token']) {
echo "access token GET:\n" . $result;
} else {
echo "Failed to get device access token:\n" . $result;
}
|
testYndex
|
echo "zzz";
$city = "Yekaterinburg"; // город, где узнаем погоду
$country = "RU"; // страна
$mode = "json"; // формат получения ответа сервера
$units = "metric"; // в какой системе выдавать результаты
$lang = "ru"; // нужный язык вывода результатов
$countDay = ($num > 0) ? $num : 1; // количество дней для вывода информации по погоде
$appID = "1b8f0af0-d9a3-4055-a6fe-e06d5b334182"; // сюда вставьте свой ключ
$url = "http://api.openweathermap.org/data/2.5/forecast?q=$city,$country&cnt=$countDay&lang=$lang&units=$units&appid=$appID"; // собственно ссылка запроса к серверу
$data = @file_get_contents($url); // получение массива данных
echo serialize($data);
// Далее обработаем массив $data и выведем в html-текст в переменную $text_return
// Выведем данные в виде
$text_return = '';
if ($data) {
$clima = json_decode($data, true);
foreach($clima['list'] as $p) {
$text_return .= date("d.m.Y", $p['dt']).": ".$p['weather'][0]['description']."\n";
$text_return .= "Температура: ".round($p['main']['temp_min'])."°C ... ".round($p['main']['temp_max'])."°C\n";
$text_return .= "Влажность: ".$p['main']['humidity']."%\n";
$text_return .= "Ветер: ".$p['wind']['speed']."км/ч\n\n";
}
}
else {
$text_return = 'Тишина...';
}
|
test_regexp
|
Регулярки
$text = 'zxc 123QWE123 Какой то текст';
$matches = preg_split("/\s([0-9A-Z]{9})\s/", $text, 2 ,PREG_SPLIT_DELIM_CAPTURE);
print_r($matches);
echo '<br>';
if (!isset($matches[2])) {
echo 'Неверный формат сообщения в телеграмм';
// return 'error: wrong format message';
} elseif (empty($matches[2])) {
echo 'Нет текста в сообщении телеграмм';
// return 'error: no text in message';
}
|
WStest
|
if (postToWebsocket('test', 'test')) {
echo "everyminute - websockets connected<br>";
} else {
echo "everyminute - websockets disconnected!<br>";
}
require_once(ROOT.'lib\websockets\client\lib\class.websocket_client.php');
$client = new WebsocketClient;
echo serialize($client).'<br>';
|
zzzzzzzzzzz
|
хлам
$ot='gggg';
setTimeOut($ot.'_delayexec',"
sg('GarageDoor.controlSwitch', 0);
sg('GarageDoor.bottonColor', NULL);
say('+');
", 2);
|
МорфийОтАнтона
|
//$message = 'Включи свет выключи телевизор';
//$message = 'Включи свет и телевизор выключи';
$message = 'Включить свет на кухне и открыть вотора в гараже';
$message = 'Сестра начала печь пироги';
$use_phpmorphy=1;
if ($use_phpmorphy) {
//@include_once(ROOT . 'languages/ru.php');
//@include_once(ROOT . 'languages/default.php');
$phpmorphy_loaded = 0;
if (file_exists(ROOT . "lib/phpmorphy/common.php")) {
require_once(ROOT . "lib/phpmorphy/common.php");
$opts = array(
'storage' => PHPMORPHY_STORAGE_MEM,
'predict_by_suffix' => true,
'predict_by_db' => true,
'graminfo_as_text' => true,
);
$dir = ROOT . 'lib/phpmorphy/dicts';
$lang = 'ru_RU';
try {
$morphy = new phpMorphy($dir, $lang, $opts);
$this->morphy =& $morphy;
$phpmorphy_loaded = 1;
} catch (phpMorphy_Exception $e) {
die('Error occured while creating phpMorphy instance: ' . PHP_EOL . $e);
echo 'Error occured while creating phpMorphy instance: ';
}
}
}
if ($use_phpmorphy && $phpmorphy_loaded) {
// Разбиваем строку на массив по глаголам
$words = explode(' ', $message);
$j=0;
foreach($words as $word) { // цикл команды разбитой на слова для поиска "глагола"
$word = mb_strtoupper($word, 'UTF-8'); // какое то слово в команде
if ($word) {
$part_speech = $morphy->getPartOfSpeech($word); // получаем по значению слова его тип как части речи
echo($word.': ');
print_r($part_speech);
echo '<br>';
if ($part_speech[0] == 'Г') {
$j++;
} elseif ($part_speech[0] == 'ИНФИНИТИВ') {
$base = $morphy->getAllForms(mb_strtoupper($word, 'UTF-8')); // получаем по значению слова его базовое значение
$word = $base[14];
$j++;
}
$commands[$j] .= ' '.$word;
}
}
// Обработать и выполнить
foreach($commands as $command) {
// убрать лишнее
$command = trim($command);
$command = preg_replace('/(\sи|\sи\sещ[её])$/iu', '', $command);
//$command = str_ireplace([' и', ' и ещё'], '' , $command);
// первая буква заглавная, остальные строчные. ucfirst()
$first = mb_substr($command, 0, 1, 'UTF-8');//первая буква
$last = mb_substr($command, 1, null, 'UTF-8');//все кроме первой буквы
$first = mb_strtoupper($first, 'UTF-8');
$last = mb_strtolower($last, 'UTF-8');
$command = $first.$last;
// выполнить
echo $command.'<br>';
}
// выполнить как есть, без морфи
} else {
echo $command.'<br>';
}
dprint($commands, false);
|
Музыка
|
// Для доступа к функциям модуля
include_once(DIR_MODULES.'sdm/sdm.class.php');
$dm=new sdm();
// ВНИМАНИЕ медиа Файлы должны находится на той же машине, где установлен SDM.
// Если есть необходимость использовать сетевое хранилище, просто подключите его как сетевой диск.
$dir='E:/Музыка/Ария';
// параметр -music:play указывает, что эта задача воспроизведения фоновой музыки,
$message='-music:play '.$dir.'/'.randFileName($dir);
$level=0;
$destination='OfficeRoom';
// При успехе в ответ получим streamHandle
$sh = $dm->setTask($message, $level, $destination);
echo $sh;
/*
* Возвращает случайное имя файла из переданноой директории
*/
function randFileName($dir) {
$dir = iconv("UTF-8", "cp1251", $dir);
$name = scandir($dir);
// print_r($name);
$f = $name[rand(2, count($name)-1)];
$f = iconv("cp1251", "UTF-8", $f);
return $f;
}
|
allSystemFunction
|
$functions = get_defined_functions();
$functions_list = array();
foreach ($functions['user'] as $func) {
$f = new ReflectionFunction($func);
$args = array();
foreach ($f->getParameters() as $param) {
$tmparg = '';
if ($param->isPassedByReference()) $tmparg = '&';
if ($param->isOptional()) {
$tmparg = '[' . $tmparg . '$' . $param->getName() . ' = ' . $param->getDefaultValue() . ']';
} else {
$tmparg.= '&' . $param->getName();
}
$args[] = $tmparg;
unset ($tmparg);
}
$functions_list[] = 'function ' . $func . ' ( ' . implode(', ', $args) . ' )' . PHP_EOL;
}
echo '<pre>';
print_r($functions_list);
echo '</pre>';
|
fix_linked_modules
|
// Имя модуля => Имя таблицы
$tables=array('commands'=>'commands', 'onewire'=>'owproperties', 'snmpdevices'=>'snmpproperties', 'zwave'=>'zwave_properties', 'mqtt'=>'mqtt', 'modbus'=>'modbusdevices');
// выбрать все элементы с линками на модули из таблицы pvalues
$data=SQLSelect("SELECT * FROM pvalues WHERE LINKED_MODULES!=''");
$total=count($data);
// Перебрать все элементы в цикле
for($i=0;$i<$total;$i++) {
// массив из имени объекта и свойства по колонке PROPERTY_NAME
$property = explode(".", $data[$i]['PROPERTY_NAME']);
echo $data[$i]['PROPERTY_NAME'].'<br>';
/*
// массив из имени объекта и свойства из таблиц по колонкам PROPERTY_ID и OBJECT_ID
$property[0] = SQLSelectOne("SELECT TITLE FROM objects WHERE ID=".$data[$i]['OBJECT_ID'])['TITLE'];
$property[1] = SQLSelectOne("SELECT TITLE FROM properties WHERE ID=".$data[$i]['PROPERTY_ID'])['TITLE'];
echo $property[0].'.'.$property[1] .'<br>';
*/
// массив из имен модулей
$tmp=explode(',', $data[$i]['LINKED_MODULES']);
// перебрать все имена модулей
foreach($tmp as $n) {
// достаточно получить хоть одну запись
$value=SQLSelect("SELECT * FROM ".$tables[$n]." WHERE LINKED_OBJECT='".$property[0]."' AND LINKED_PROPERTY='".$property[1]."'");
// если записи нет
if (!count($value)) {
echo '<li>Not linked in '.$n.'</li>';
// Удалить имя модуля (только его)
}
}
}
|
fix_linked_properties
|
$tables=array('commands'=>'commands', 'owproperties'=>'onewire', 'snmpproperties'=>'snmpdevices', 'zwave_properties'=>'zwave', 'mqtt'=>'mqtt', 'modbusdevices'=>'modbus');
// это будет уникальный массив объект.свойство => его id на которые есть ссылки в таблицах модулей
$value_ids=array();
foreach($tables as $k=>$v) {
// выбрать все элементы с линками в текущей таблице модуля
$data=SQLSelect("SELECT * FROM $k WHERE LINKED_OBJECT!='' AND LINKED_PROPERTY!=''");
$total=count($data);
// Перебрать все элементы в цикле
for($i=0;$i<$total;$i++) {
// имя модуля
$module=$v;
// имя свойства
$property=$data[$i]['LINKED_OBJECT'].'.'.$data[$i]['LINKED_PROPERTY'];
// если в массиве нет, то добавить
// если такого свойства нет в pvalues, то функция getValueIdByName верент 0
if (!$value_ids[$property]) {
$value_ids[$property]=getValueIdByName($data[$i]['LINKED_OBJECT'], $data[$i]['LINKED_PROPERTY']);
}
echo "$v: $property<br>";
// если у свойства есть id
if ($value_ids[$property]) {
$value=SQLSelectOne("SELECT * FROM pvalues WHERE ID=".(int)$value_ids[$property]);
// если в таблице pvalues у свойства нет имени модуля
if (!$value['LINKED_MODULES']) {
// объявить пустой массив
$tmp=array();
} else {
// заполнить массив именами модулей
$tmp=explode(',', $value['LINKED_MODULES']);
}
// если в массиве нет имени текущего модуля
if (!in_array($v, $tmp)) {
echo "<li>Adding linked</li>";
$tmp[]=$v;
$value['LINKED_MODULES']=implode(',', $tmp);
SQLUpdate('pvalues', $value);
}
} else {
echo "<li>Need to Removing linked</li>";
//
/*
$data[$i]['LINKED_OBJECT']='';
$data[$i]['LINKED_PROPERTY']='';
SQLUpdate($k, $data[$i]);
*/
}
}
}
|
fix_pvalues_PROPERTY_NAME
|
/* Показать все строки со сломанным PROPERTY_NAME
SELECT *
FROM pvalues
JOIN objects ON pvalues.OBJECT_ID = objects.id
JOIN properties ON pvalues.PROPERTY_ID = properties.id
WHERE pvalues.PROPERTY_NAME != CONCAT_WS( '.', objects.TITLE, properties.TITLE )
*/
/* Заменить колонку PROPERTY_NAME именами из таблиц объектов и свойств
UPDATE `pvalues` SET `PROPERTY_NAME` = CONCAT( (
SELECT title
FROM `objects`
WHERE pvalues.OBJECT_ID = objects.id
), '.', (
SELECT title
FROM `properties`
WHERE pvalues.PROPERTY_ID = properties.id
) )
*/
|
forObjectByArray
|
перебор конкретных объектов
// Пример перебора конкретных объектов
$sensors=array();
$sensors['sensorHumidityRemote3']="датчик влажности в спальне";
$sensors['sensorKotel']="датчик температуры на котле";
$sensors['sensorZal']="датчик температуры в зале";
$sensors['sensorTempRemote1']="датчик температуры в гараже";
$sensors['sensorTempRemote2']="датчик температуры в спальне";
$sensors['ws']="модуль погодной станции";
foreach($sensors as $k=>$v) {
if (!gg($k.'.alive')) {
$yellow_state=1;
$details[]="Не обновляется ".$v;
}
}
|
forObjectsByClass
|
$objects=getObjectsByClass("Relays");
echo '<table border="1" bordercolor="grey">';
echo '<caption>Таблица объектов класса</caption>';
echo '<tr>';
echo '<td><b>id</b></td>'; // id объекта
echo '<td><b>class_id</b></td>'; // id класса
echo '<td><b>object_title</b></td>'; // название объекта
echo '<td><b>description</b></td>'; // описание объекта
echo '<td><b>location_id</b></td>'; // id расположения объекта (в текстовом виде название не передаётся)
echo '<td><b>status</b></td>'; // свойство status
echo '<td><b>modeSwitch</b></td>'; // свойство modeSwitch
echo '</tr>';
echo '</b>';
// вариант коллекции
foreach($objects as $obj) {
$obj=getObject($obj['TITLE']);
// Условие попадания в таблицу
if ($obj->location_id==2 && stripos($obj->object_title, 'Light') !== false || 1) {
echo '<tr>';
echo '<td>'.$obj->id.'</td>';
echo '<td>'.$obj->class_id.'</td>';
echo '<td>'.$obj->object_title.'</td>';
echo '<td>'.$obj->description.'</td>';
echo '<td>'.$obj->location_id.'</td>';
echo '<td>'.$obj->getProperty('status').'</td>';
echo '<td>'.$obj->getProperty('modeSwitch').'</td>';
echo '</tr>';
// Условие для действия
$f=false;
if ($obj->getProperty('status') && 0) {
$f=true;
say('Выключаю свет '.$obj->description);
$obj->callMethod('turnOff');
}
}
}
echo '</table>';
echo '<br>'.serialize($obj);
// if (!$f) say('Всё уже выключено');
/*
// вариант цикла с i
$total=count($objects);
for ($i=0;$i<$total;$i++) {
echo $objects[$i]['ID'].' ';
echo $objects[$i]['TITLE'].' ';
echo getGlobal($objects[$i]['TITLE'].'.status').' ';
echo '<br>';
}
*/
|
MicrotikTest
|
$ip = gg('Mikrotik_IP');
$login = gg('Mikrotik_login');
$password = gg('Mikrotik_password');
// ВНИМАНИЕ на имя класса в вашем файле routeros_api.class.php (в самом начале)
//$API = new routerosAPI();
$API = new routeros_api();
if ($API->connect($ip, $login, $password)) {
// таблица роутера ip route print detail
$ARRAY = $API->comm('/ip/route/print');
print_r('<pre><p style="background-color: beige; color: maroon; padding: 10px; margin: 5px; border: 1px maroon solid;">');
print_r($ARRAY);
print_r('</p></pre>');
// перебор массива роутера в поисках основного провайдера
// ВНИМАНИЕ замените id *1D и *1E на свои
// при желании id записей можно заменить на уникальные комментарии
/*
if ($arr['active']=='true') {
switch ($arr['.id']) {
case '*1D':
case '*27':
$isp1=max($isp1,3);
break;
case '*1E':
case '*28':
$isp2=max($isp2,3);
break;
}
*/
$API->disconnect();
echo 'getWiFiclients ok';
// setTimeOut('getWiFiclientsTimer',"runScript('getWiFiclients');",10);
} else { echo 'error'; }
|
mi_test_vacuum
|
// https://home.miot-spec.com/s
// https://home.miot-spec.com/spec/mijia.vacuum.v2
// urn:miot-spec-v2:device:vacuum:0000A006:mijia-v2:2
// "model":"mijia.vacuum.v2",
//$params = '{"did":"334617364","siid":6,"aiid":1,"in":[]}'; // Identify
$did = 1; // уникальный внутренний идентификатор пылесоса в модуле
//$params = '{"siid":2,"aiid":1,"in":[]}'; // запуск
//$params = '{"siid":2,"aiid":2,"in":[]}'; // остановка
//$params = '{"siid":13,"aiid":1,"in":[]}'; // возврвщение на базу
$params = '{"siid":6,"aiid":1,"in":[]}'; // Identify
include_once(DIR_MODULES . 'xiaomimiio/xiaomimiio.class.php');
$miio = new xiaomimiio();
$miio->addToQueue(1, 'fan-level', '[3]'); // где 5 - уникальный внутренний идентификатор устройства в модуле
$miio->addToQueue($did, 'action', $params);
//$miio->addToQueue($did, 'get_properties', '[{"did":"state_code","siid":2,"piid":1},{"did":"error_code","siid":2,"piid":2},{"did":"battery","siid":3,"piid":1}]');
//$miio->addToQueue($did, 'get_properties', '[{"did":"mode","siid":2,"piid":4}]');
//$miio->addToQueue($did, 'get_properties', '[{"did":"state_code","siid":2,"piid":1},{"did":"error_code","siid":2,"piid":2},{"did":"battery","siid":3,"piid":1},{"did":"mode","siid":2,"piid":4},{"did":"work_mode","siid":18,"piid":1},{"did":"water_grade","siid":2,"piid":5},{"did":"clean_times","siid":18,"piid":14},{"did":"clean_area","siid":18,"piid":15},{"did":"clean_time","siid":18,"piid":13},{"did":"filter_life_level","siid":27,"piid":1},{"did":"filter_left_time","siid":27,"piid":2},{"did":"brush1_life_level","siid":26,"piid":2},{"did":"brush1_left_time","siid":26,"piid":1},{"did":"brush2_life_level","siid":28,"piid":2},{"did":"brush2_left_time","siid":28,"piid":1}]');
|
myheattest3
|
// Пример получения данных с контроллера MyHeat
curl_setopt_array($ch = curl_init(), array(
CURLOPT_URL => "https://my2.myheat.net/api/request/",
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POSTFIELDS => json_encode(array(
"action" => "getDeviceInfo",
"deviceId" => "3744",
"login" => "Bagir",
"key" => "f11f434d-5fb2b987eff217-91217626",
))
));
$res=curl_exec($ch);
if (curl_errno($ch) > 0) {
echo "Ошибка запроса curl при попытке связи с контроллером";
die('Ошибка curl: ' . curl_error($ch));
}
curl_close($ch);
$array = json_decode($res, true);
if ($array["err"]===0) {
if ($array["data"]["dataActual"]===true) {
echo "Данные актуальны <br>";
foreach($array["data"]["heaters"] as $arr) {
print_r($arr);
echo '<br>';
//if ($arr['id']==23) {echo $arr['flowTemp'];}
}
foreach($array["data"]["envs"] as $arr) {
print_r($arr);
echo '<br>';
}
} else {
echo "Данные НЕ актуальны <br>";
}
} else {
echo "Контрллер на запрос состояния не отвечает <br>";
}
echo 'Улица '.$array["data"]["weatherTemp"].'<br>';
|
phistory
|
получение истории свойства
// *** Пример обращение к таблице истории свойств (длинный пошаговый) ***
// Получить объект по имени
$obj=getObject('KitchenArea');
echo 'ID объекта '.$obj->id.'<br/>';
// Получить id свойства
$prop_id=$obj->getPropertyByName('Temperature', $obj->class_id, $obj->id);
echo 'ID свойства '.$prop_id.'<br/>';
// Получаем VALUE_ID для следующей таблицы
$pvalue=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID=$prop_id AND OBJECT_ID=".$obj->id);
$pvalueid = $pvalue['ID'];
echo 'ID записи '.$pvalueid.'<br/>';
echo 'VALUE_ID '.print_r($pvalue).'<br/>';
// Спецальная функция для получения ID записи сразу
$pvalueid = getHistoryValueId('KitchenArea.Temperature');
echo 'ID записи от функции getHistoryValueId '.$pvalueid.'<br/>';
/*
// Получаем таблицу
$arr_s = SQLSelectOne("SELECT * FROM phistory WHERE VALUE_ID=$pvalueid");
print_r($arr_s);
*/
|
ProsentSutki
|
Расчет процента активности режима за сутки
/* Данные истории находятся в таблице phistory. Чтобы их от туда взять, нужно знать VALUE_ID нашего Объект.Свойства
Получить его можно разными путями в зависимости от ситуации. Приведу общий способ, который будет работать в любом месте.
Например из сценария, где нет такого указателя как $this. Еще этот код немного расскажет про связь между таблицами в базе данных.
*/
$start_time=date("Y-m-d").' 00:00:00';
//$start_time='2015-02-09 00:00:00';
$tmr_start = strtotime($start_time);
$tmr_now = time();
$tmr_mem = 0; //накопитель времени в секундах
// Мы знаем имя объекта и имя свойства.
// Имена объектов находятся в таблице objects и они должны быть уникальными
// Для начала нам нужно получить id нашего объекта и id класса которому принадлежит объект
$obj_title = 'DarknessMode'; //имя объекта
$arr_s = SQLSelectOne("SELECT * FROM objects WHERE TITLE='".$obj_title."'");
$obj_id = $arr_s['ID'];
$class_id = $arr_s['CLASS_ID'];
/* Имена свойств находятся в таблице properties
с указанием id класса если свойство заданно на уровне класса,
или id объекта если свойство принадлежит объекту лично.
*/
// Получим id свойства по его имени И (id класса ИЛИ id объекта)
$prop_title = 'status'; //имя свойства
$arr_s = SQLSelectOne("SELECT * FROM properties WHERE TITLE='".$prop_title."' AND (CLASS_ID='".$class_id."' OR OBJECT_ID='".$obj_id."')");
$prop_id = $arr_s['ID'];
// значения свойств находятся в таблице pvalues
// Нам нужен id. (уточнить необходимость сортировки по UPDATED)
$arr_s = SQLSelectOne("SELECT * FROM pvalues WHERE OBJECT_ID='".$obj_id."' AND PROPERTY_ID='".$prop_id."'");
$pvalue = $arr_s['ID'];
/* Можно использовать альтернативный вариант, который будет работать намного быстрее.
Получить id из таблицы pvalues сразу по имени Объект.Свойство
Способ довольно простой и короткий, но пока что рекомендую его не использовать.
$prop_name = 'ts_kitchen.status'; //Объект.Свойство
$arr_s = SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_NAME='".$prop_name."'");
$pvalue = $arr_s['ID'];
*/
/* Зная $pvalue можно слазать за данными истории в таблицу phistory
Для нашей задачи нужно получить все записи по времени >= началу суток + 1 запись
*/
// Получить количество записей за нужный период времени
$arr_s = SQLSelectOne("SELECT COUNT(ID) as COUNT_ID FROM phistory WHERE VALUE_ID=".$pvalue." AND ADDED>='".date('Y-m-d H:i:s', $tmr_start)."'");
// Взять это количество записей +1
$arr_s = SQLSelect("SELECT * FROM phistory WHERE VALUE_ID=".$pvalue." ORDER BY ADDED DESC LIMIT 0 , ".(1+$arr_s['COUNT_ID']));
echo 'obj='.$obj_id.' class='.$class_id.' prop='.$prop_id.' pvalue='.$pvalue.'<br />';
$tmr2 = $tmr_now;
echo date('Y-m-d H:i:s', $tmr_now). ' '.$tmr_now.' Now <br />';
// Переберем весь массив
foreach($arr_s as $s) {
echo $s['ADDED'].' ';
echo strtotime($s['ADDED']) .' ';
echo $s['VALUE'].' ';
$tmr1 = $tmr2;
$tmr2 = strtotime($s['ADDED']);
// Ограничить началом суток
if ($tmr2<$tmr_start) { $tmr2=$tmr_start; }
echo ($tmr1-$tmr2).'<br />';
// Двигаясь вниз по массиву времени складывать отрезки если режим включен
if ($s['VALUE']) { $tmr_mem = $tmr_mem + $tmr1 - $tmr2; }
}
echo $start_time .' '.$tmr_start.' S <br />';
echo 'вкл '.$tmr_mem.'<br />';
echo 'Всего '.($tmr_now - $tmr_start).'<br />';
echo '%'. round( $tmr_mem * 100 / ($tmr_now - $tmr_start) ).'<br />';
echo 'end';
|
RGB
|
for ($i = 0; $i <= 765; $i++) {
$x = $i;
$hcolor = '#';
$y = $x-255;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
$y = 255-$x;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
$y = 765-$x;
if ($y < 0) {$y = 0;} elseif ($y > 255) {$y = 255;}
$y = dechex($y);
if (strlen($y) == 1) {$y = '0'.$y;}
$hcolor = $hcolor.$y;
echo '<p style="color:'.$hcolor.'">'.$i.' '.$hcolor.'</p>';
}
|
SQL_структура
|
$sql = "
select `v`.`ID` AS `value_id`,`v`.`PROPERTY_ID` AS `PROPERTY_ID`,`v`.`PROPERTY_NAME` AS `PROPERTY_NAME`,`v`.`UPDATED` AS `UPDATED`,`v`.`VALUE` AS `VALUE`,`p`.`TITLE` AS `property`,`o`.`TITLE` AS `object`,`c`.`TITLE` AS `class`,`cp`.`TITLE` AS `class_parent`,`cpp`.`TITLE` AS `class_pparent`
from `pvalues` `v`
join `properties` `p` on `v`.`PROPERTY_ID` = `p`.`ID`
join `objects` `o` on `v`.`OBJECT_ID` = `o`.`ID`
left join `classes` `c` on `o`.`CLASS_ID` = `c`.`ID`
left join `classes` `cp` on `c`.`PARENT_ID` = `cp`.`ID`
left join `classes` `cpp` on `cp`.`PARENT_ID` = `cpp`.`ID`
";
|
test_json_trint
|
$ch = curl_init('http://10.10.3.2:8085/data.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ohm = curl_exec($ch);
$json = json_decode($ohm);
// 'Имя свойства'=>id
$arrprop=array('CPUCore1Temp'=>27,'CPUCore2Temp'=>28,'CPUCore3Temp'=>29,'CPUCore4Temp'=>30,
'CPUCore1Load'=>33,'CPUCore2Load'=>34,'CPUCore3Load'=>35,'CPUCore4Load'=>36,
'GPUCoreTemp'=>50,'GPUCoreLoad'=>52,'CPUTotalLoad'=>32); //CPUTotalLoad должна быть последней
foreach($arrprop as $pn=>$id) {
$v=searchJson($json,$id);
echo "<br> $pn = $v";
//sg($pn, $v);
if (strpos($pn, 'Temp') !== false) {
$h=calccolortemp($v);
$pn=str_replace('Temp','HEX',$pn);
echo " $pn = $h";
//sg($pn, $h);
}
}
// Расчет средней загрузки камня
$pn='CPUavgLoad';
//$tavg=gg($pn);
$tavg=50;
$v=ceil(($tavg*2+$v)/3);
echo "<br> $pn = $v";
//sg($pn, $v);
/*
перебирает вложения структуры json
в поисках значения по переданному id
*/
function searchJson($obj, $id) {
foreach($obj->Children as $child) {
if(isset($child->id)) {
if ($id == $child->id) {
$v=round(substr($child->Value,0,strpos($child->Value,' ')),0);
//echo "$id $v <br>";
return $v;
}
}
$a=NULL;
$a=searchJson($child,$id);
if (!is_null($a)) { return $a; }
}
//echo "id $id value not found <br>";
return NULL;
}
/*
Расчитывает цветовую температуру
*/
function calccolortemp($t) {
$min = 45; // зеленый
$mid = 52; // желтый
$max = 65; // красный
//if ($t<$min) {$t=$min;} elseif ($t>$max) {$t=$max;}
$t=max($t,$min);
$t=min($t,$max);
if ($t<$mid){
$t = round( ($t-$min)/($mid-$min)*255 );
$t = dechex($t);
if (strlen($t) == 1) { $t='0'.$t; }
$hcolor = '#'.$t.'ff00';
// $hcolor = $t.',255,0';
} else {
$t = 255 - round( ($t-$mid)/($max-$mid)*255 );
$t = dechex($t);
if (strlen($t) == 1) { $t='0'.$t; }
$hcolor = '#ff'.$t.'00';
//$hcolor = '255,'.$t.',0';
}
return $hcolor;
}
|
TV_RTLC_on
|
// if (isset($params['stage']) ) { $stage=$params['stage']; } else { $stage=1; }
// $ot=$this->object_title;
// приставка
$code = '00000000 a0000000 00000000 00009000 0a237f11 3b022a02 3d022602 3e021802 3e022502 3e022502 3e022502 3f021702 3e022302 40028d06 3d022602 3e028d06 3d028f06 40028106 3b029006 3c029006 3c029206 3d022602 3d029006 40021802 3d022502 3e029706 35022802 3f021802 3e022402 3e028f06 3d022602 3d028e06 45027c06 3c022602 3e028e06 3d029c06 2f029106 3d02efa0 2723af08 3a020000';
include_once(DIR_MODULES.'orvibo/orvibo.class.php');
$zw=new orvibo();
$zw->getConfig();
$zw->sendIR(2, $code);
// телик
$code = '00000000 a4000000 00000000 00009400 69116311 3b022502 40027806 3b027d06 3b027d06 3b022502 3b022502 3a022502 3a022502 3a022502 3a027d06 3b027d06 3b027d06 3b022502 3a022502 3a022502 3a022502 3a022502 3a022502 3a027d06 3b027d06 3b022502 3a022502 3a022902 37022502 3a027d06 3b027d06 3b022502 3a022602 3a027d06 3b027d06 3b027d06 3b027e06 3a02efb4 87116011 3a029106 32020000';
$zw->sendIR(2, $code);
// setTimeOut($ot.'_gotoBase_stage', "cm('$ot.gotoBase', Array('stage'=>$stage+1));", 10);
|
urlFromTerminal
|
Кинуть страницу на терминал
$rec=array();
$rec['EVENT_TYPE']='openurl'; // команда может быть ещё newwindow
$rec['WINDOW']='alice';
$rec['TERMINAL_TO']='*'; //здесь можно конкретный терминал указать
$rec['ADDED']=date('Y-m-d H:i:s');
$rec['EXPIRE']=date('Y-m-d H:i:s', time()+10);
$rec['DETAILS']='my_site.ru';
$rec['ID']=SQLInsert('events', $rec);
|
zSwitchSceneDetected
|
Контроллер получил пакет изменения сцены (устарел)
/* У Z выключателей есть свои свойства активной сцены и временной штамп обновляются, но при изменении МД объект этого не увидит.
В тоже время активная сцена обновляется и на контроллере, но она одна для всех.
То есть, непонятно на каком именно устройстве была нажата кнопка. Но зато мы видим это событие.
Далее остается проверить все наши МД объекты выключателей и сравнить их временной штамп с Z устройствами.
У кого будет позже, значит на том и нажали кнопку. Конечно выглядит криво, но работает стабильно. И пока только так.
*/
// запускается привязкой к свойству контроллера CurrentScene в Z модуле.
$zsrv = 'http://10.10.3.2:8083';
$zapi = '/ZWaveAPI/Run/devices[].instances[0].commandClasses[43].data.currentScene';
$ot = 'zKeychain_19'; // Имя объекта пульта
$dv = '19'; // Z id устройства
$cmdUrl = $zsrv.substr_replace($zapi , $dv, 22, 0).'.updateTime';
$ans = getURL($cmdUrl, 0);
if (is_numeric($ans)) {
if (gg($ot.'.updated') < $ans) {
sg($ot.'.updated', $ans);
$cmdUrl = $zsrv.substr_replace($zapi , $dv, 22, 0).'.value';
$ans = getURL($cmdUrl, 0);
sg($ot.'.Value', $ans);
cm($ot.'.IncomingData',array('buttonAction'=>1));
}
}
$ot = 'zKeychain_20'; // Имя объекта выключателя
$dv = '20'; // Z id устройства
$cmdUrl = $zsrv.substr_replace($zapi , $dv, 22, 0).'.updateTime';
$ans = getURL($cmdUrl, 0);
if (is_numeric($ans)) {
if (gg($ot.'.updated') < $ans) {
sg($ot.'.updated', $ans);
$cmdUrl = $zsrv.substr_replace($zapi , $dv, 22, 0).'.value';
$ans = getURL($cmdUrl, 0);
sg($ot.'.Value', $ans);
cm($ot.'.IncomingData',array('buttonAction'=>1));
}
}
|
Отложенный_старт
|
//$m=date('i',time());
for ($m = 0; $m <= 59; $m++) {
$i = str_pad($i,2,'0',STR_PAD_LEFT);
if (!(9-$m%10)) { echo("<font color='blue'>$m</font> "); } else { echo("$m "); }
if ($m==31) { echo("<br>"); }
}
|
alerts_table
|
// Спецальная функция для получения ID записи сразу
$pvalueid = getHistoryValueId('ThisComputer.alerts_message');
// Получаем таблицу
$arr_s = SQLSelect("SELECT MAX(ADDED) AS max_added, COUNT(VALUE) AS count_value, VALUE FROM phistory WHERE VALUE_ID=$pvalueid GROUP BY VALUE ORDER BY max_added DESC");
//SOURCE
$t=0;
foreach($arr_s as $arr_i) {
// Начало таблицы
if (!$t) {
echo '<table >'; $t=1;
/*
echo '<tr>';
echo '<td>Время</td>';
echo '<td>Счетчик</td>';
echo '<td>Название</td>';
echo '</tr>';
*/
}
// Заполнить таблицу
echo '<tr>';
echo '<td>'.date('h:i', strtotime($arr_i['max_added'])).'</td>'; //d.m.Y h:i:s
echo '<td><b>'.$arr_i['count_value'].'</b></td>';
echo '<td>'.$arr_i['VALUE'].'</td>';
echo '</tr>';
}
if ($t) { echo '</table>'; $t=0;}
|
alice-webhook
|
обработка ответа навыка яндекс диалогов
/*
Получение структуры json от навыка Яндекс диалоги.
Ответ яндекс серверу
*/
// Ошибка отсутствия данных
if (!$params['data']) {
say('Нет данных от сервера');
sg('alerts_message', 'Нет данных от сервера');
return 'error: parameter data is empty';
}
// Преобразовать строку json в структуру
$obj = json_decode($params['data']);
// Ошибка структуры json
if (!$obj || json_last_error()<>JSON_ERROR_NONE) {
say('Ошибка структуры json от сервера');
sg('alerts_message', 'Ошибка json от сервера');
return 'error: incorrect structure json';
}
// Проверка id своего навыка
if ($obj->session->skill_id <> '50b5f0a7-82c2-4f01-a3d1-0cdbc8689621') {
$ans = 'Незарегистрированный навык';
$end_session = true;
// Проверка id своего пользователя
} elseif ($obj->session->user->user_id <> '8AB3624F927AB0D65492F1C435AC4ED4904B41DB5E431C55263F7D78FBB6E96B') {
$ans = 'Незарегистрированный пользователь';
$end_session = true;
debmes($ans . ' ' . $obj->session->user->user_id);
// Все проверки успешно пройдены
} else {
// оригинальный текст
$text = $obj->request->original_utterance;
// текст ответа
if ($text) {
// можно оьработать конкретные задачи и дать ответ
if (strpos($text, 'последнее сообщение') !== false) {
$ans = gg('lastSayMessage');
$text = ''; // прервет выполнение после ответа
} else {
$msgsok = array('Ok','Сделано','Передала','Хорошо','Отправила');
$ans = $msgsok[array_rand($msgsok)]; // случайный элемент массива слов
}
$end_session = $obj->session->new;
} else {
// вызов навыка без текста. Можно не закрывать диалог и спросить текст команды
$ans='Диктуйте сообщение';
$end_session = false;
}
}
// Собрать json структуру ответа яндексу
$ans = json_encode([
'session' => ['session_id' => $obj->session->session_id],
'version' => $obj->version,
'response' => ['text' => $ans, 'end_session' => $end_session, 'should_listen' => $obj->session->new]
]);
// Отправить ответ серверу, и продолжить обработку дальше
ob_end_clean();
ignore_user_abort(true);
ob_start();
echo $ans;
$size = ob_get_length();
header("Content-Length: $size");
header('Content-Type: application/json');
header('Connection: close');
header('Content-Encoding: none');
ob_end_flush();
flush();
ob_end_clean();
session_write_close();
// Завершить выполнение если нет текста
if (!$text) { return; }
// id станций
$user = 1; $source = ''; $roomActivity='';
switch ($obj->session->application->application_id) {
//case '10.10.3.2': $user=3; $source='voskCabinet'; $roomActivity='OfficeRoom'; break;
//case '10.10.3.115': $user=6; break; // Сергей ноут
case 'C6A565A81EDF36720A10649BF432E895796D7B27589E208BF0CED95ACB28B656': $user=5; $source='aliceKitchen'; $roomActivity='KitchenArea'; break;
case 'CD64B8337B6E2F7CA20BCBEF725226941177C8B843801E071D4EFEF89B75ED70': $user=8; $source='aliceRestroom'; $roomActivity='ZalRoom'; break; //зал <-> к.отдыха
case '7248BC72EC3750759964EBF18921291E53FAE14AA826E9D5BACC8C357E8694D8': $user=9; $source='aliceBedroom'; $roomActivity='Bedroom'; break;
case '421F3A5BDE137C2CF33298F183DBE45F4A39D2F106ADBDB47BDC76FAFA5D0654': $user=10; $source='aliceGarage'; $roomActivity='GarageArea'; break;
case '917270B6DCB565F0FCBFFC5C9DCE106C0C687923993646A2D2E44BBD40187CC4': $user=6; break; // Сергей
//case 'FF507D98930C7E2ACC9528D8F7C7B7134AD8D876FF8193E71C7F716B408420C6': $user=11; break; // Марина
//case '630FF1B86C16FB17ABF0195340F2D005039F608B8961A00E2862407956D793B6': $user=11; break; // Марина
//case 'DE8B58F0AF18E319E2BE3AA1B4870CCD4F887E2A93158FC6E32A8B1CF7D79064': $user=6; $source='aliceMitsubishi'; break;
case '176067D084894183FB515BEF359BF3688A4271028E895D5DA7DD248E051EAB40': $user=6; $source='aliceMitsubishi'; break; // navi
default: say('Поступило сообщение от неизвестной станции '.$obj->session->application->application_id, -1);
}
// Вызвать активность в комнате
if ($roomActivity) { cm($roomActivity.'.onActivity', ['source'=>$source]); }
$use_phpmorphy = 1; // Использовать phpmorphy для разделения на команды по глаголу
$use_split = 0; // Разделить по шаблону из списска команд
// ***** Отправить "как есть"
if (!$use_phpmorphy && !$use_split) {
say($text, 0, $user, $source);
return;
}
// ***** Разбить по команде
if ($use_split) {
$matches = preg_split("/\s?и?\s?(вы?ключит?ь?|открой|закрой|открыть|закрыть)\s/isu", $text, 0 ,PREG_SPLIT_DELIM_CAPTURE);
if (count($matches)==1) {
say($text, 0, $user, $source);
return;
} else {
for ($i = 1; $i < count($matches); $i+=2 ) {
say($matches[$i]. ' ' . $matches[$i+1], 0, $user, $source);
}
return;
}
}
// ***** Разбить по глаголу. При этом в составной команде глагол должен быть произнесен первым
if ($use_phpmorphy) {
$phpmorphy_loaded = 0;
if (file_exists(ROOT . "lib/phpmorphy/common.php")) {
require_once(ROOT . "lib/phpmorphy/common.php");
$opts = array(
'storage' => PHPMORPHY_STORAGE_MEM,
'predict_by_suffix' => true,
'predict_by_db' => true,
'graminfo_as_text' => true,
);
$dir = ROOT . 'lib/phpmorphy/dicts';
$lang = 'ru_RU';
try {
$morphy = new phpMorphy($dir, $lang, $opts);
$this->morphy =& $morphy;
$phpmorphy_loaded = 1;
} catch (phpMorphy_Exception $e) {
die('Error occured while creating phpMorphy instance: ' . PHP_EOL . $e);
echo 'Error occured while creating phpMorphy instance: ';
}
}
if ($phpmorphy_loaded) {
// Разбиваем строку на массив по глаголам
//debmes('Входная строка: '.$text, 'phpMorphy');
$words = explode(' ', $text);
$j=0;
foreach($words as $word) { // цикл команды разбитой на слова для поиска "глагола"
$word = mb_strtoupper($word, 'UTF-8'); // какое то слово в команде
if ($word) {
$part_speech = $morphy->getPartOfSpeech($word); // получаем по значению слова его тип как части речи
if ($part_speech[0] == 'Г') {
$j++;
} elseif ($part_speech[0] == 'ИНФИНИТИВ') {
$base = $morphy->getAllForms(mb_strtoupper($word, 'UTF-8')); // получаем по значению слова его базовое значение
$word = $base[14];
$j++;
}
$commands[$j] .= ' '.$word;
}
}
//debmes('commands:' . json_encode($commands, JSON_UNESCAPED_UNICODE), 'phpMorphy');
// Обработать и выполнить
foreach($commands as $command) {
// убрать лишнее
$command = trim($command);
$command = preg_replace('/(\sи|\sи\sещ[её])$/iu', '', $command);
//$command = str_ireplace([' и', ' и ещё'], '' , $command);
// первая буква заглавная, остальные строчные. ucfirst()
$first = mb_substr($command, 0, 1, 'UTF-8');//первая буква
$last = mb_substr($command, 1, null, 'UTF-8');//все кроме первой буквы
$first = mb_strtoupper($first, 'UTF-8');
$last = mb_strtolower($last, 'UTF-8');
$command = $first.$last;
// выполнить
say($command, 0, $user, $source);
debmes('command:' . $command, 'phpMorphy');
}
return;
}
} //$use_phpmorphy
|
checkStatusThermostat
|
проверить состояние термостата
//$tn = 'thrm_bathhouse';
//$tn = 'thrm_homeElectric';
$tn = 'thrm_alpha';
$obj=getObject($tn);
echo $obj->description.'<br />';
echo 'Автоматическое управление '.$obj->getProperty('auto').'<br />';
echo 'Состояние термостата '.$obj->getProperty('status').'<br />';
echo 'Запрет работы '.$obj->callmethod('mayBanOn').'<br />';
echo 'Таймер минимального времени работы '.timeOutExists($tn.'_work').'<br />';
echo 'Таймер минимальной паузы '.timeOutExists($tn.'_nowork').'<br />';
$t_desire = $obj->getProperty('airShiftTemp');
$hyst = $obj->getProperty('hysteresis');
if ( !is_numeric($hyst) ) {$hyst = 0.2;}
echo 'Текущая т = '.$obj->getProperty('airCurrentTemp').' Желаемая т = '.$t_desire.' Гистерезис = '.$hyst.'<br />';
echo 'Ппроверка решения на Отключение '.($obj->getProperty('airCurrentTemp') >= $t_desire + $hyst).'<br />';
echo 'Ппроверка решения на Включение '. ($obj->getProperty('airCurrentTemp') <= $t_desire - $hyst).'<br />';
|
generalAlarms
|
/*
будет вызван объектом комнаты при изменении строки её тревог с передачей строки
на основании важности тревог сказать их с большим приоритетом (если пусто сказать о завершении)
запустить/остановить тревожный трек
вызывается периодически если есть тревоги в свойстве globalAlarms
Кратко сказать о текущих тревогах
*/
/* в сценариях конструкция $s=$params['status']; if (isset($s)) {... не работает
массив params присутствует даже без параметров,
да и extract мне нравится больше.
*/
// распаковать массив параметров в переменные по ключам
extract($params); // ожидается $alarms
if (isset($alarms)) {
$f = true; // вызов был с передачей параметра строки
setGlobal('globalAlarms',$alarms);
} else {
$f = false; // вызов из цикла для периодических сообщений при наличии тревог
$alarms = getGlobal('globalAlarms');
}
$imp=0; // важность сообщения
if ($alarms) {
// создать массив из js строки
$a = json_decode($alarms, TRUE);
// ToDo сортировка массива по вадности маркеров
// ToDo общие действия по виду тревог. Включить свет, закрыть газ, Закрыть воду. Подумать как вернуть всё обратно
if ($f) { $t='Внимание! '; $imp=4;} else { $t=''; $imp=3; }
foreach ($a as $key=>$val) {
switch (strtolower($key)) {
case 'fire': $t.='Пожарная тревога'; break;
case 'smoke': $t.='Обнаружен дым'; break;
case 'heat': $t.='Резкое повышение температуры'; break;
case 'toxic': $t.='Обнаружен угарный газ'; break;
case 'gas': $t.='Взрывоопасное содержание газа'; break;
case 'flood': $t.='Обнаружена протечка'; break;
case 'freeze': $t.='Критически низкая температура'; break;
case 'security': $t.='Нарушение охранной зоны'; break;
default: $t.='Неизвестный тип тревоги '.$key; break;
}
foreach ((array)$val as $id) {
//$obj = getObjectById($id); // такой функции нет
$sqlQuery = "SELECT objects.*
FROM objects
WHERE ID = '" . DBSafe($id) . "'";
$rec = SQLSelectOne($sqlQuery);
if ($rec['ID']) {
$obj = new objects();
//$obj->id = $rec['ID'];
$obj->loadObject($rec['ID']);
$t .= ' '.$obj->getProperty('inRoomText');
// ToDo подумать над запятыми
}
}
} // переьбор меркеров тревог
} else {
if ($f) { $t = 'Тревога завершена'; $imp=1; } else { $t = 'Никаких тревог нет'; $imp=0; }
} // если есть тревога
if ($t) { say($t, $imp); }
// первый тревожный трек. После его завершения тледующий трек будет выбран по виду тревоги в сценарии sdmReceiver
if ($alarms && $f) {
playsound('-music:play -marker:alarm '.ROOT.'cms\sounds\korabelnyj_revun.mp3');
}
// остановить тревожный трек при отсутствии тревог
if (!$alarms) {
$det=gg('alarmStreamHandle');
if ($det) {
playsound('-streamhandle:'.$det.' -music:stop');
sg('alarmStreamHandle','');
}
}
|
getWeather_old
|
Получить погоду от Яндекса
$data_file='https://export.yandex.ru/bar/reginfo.xml?region=16.xml?'.rand(); // адрес xml файла. 16 - id города
$urlimg='https://yastatic.net/weather/i/icons/blueye/48/'; // адрес картинок на сайте Яндекс
$path='./img/weather_yandex_v3/'; // локальный путь к базе картинок
$xml = simplexml_load_file($data_file); // раскладываем xml на массив
if($xml === false ) { // Проверить можно также !is_object( $xml ) или !$xml
say('Ошибка получения данных погоды', -1);
return;
}
$ot='weather_now';
$obj=getObject($ot);
//u $obj->setProperty('updated',time());
//u $obj->setProperty('updatedTime',date('H:i',time()));
$obj->setProperty('alive',1);
$alive_timeout=(int)$obj->getProperty('aliveTimeOut');
if (!$alive_timeout) { $alive_timeout=12*60*60; }
setTimeOut($ot.'_alive',"sg('".$ot.".alive',0);",$alive_timeout);
$obj->setProperty('weatherType',$xml->weather->day->day_part->weather_type);
$obj->setProperty('pressure',$xml->weather->day->day_part->pressure);
$obj->setProperty('windDirection',$xml->weather->day->day_part->wind_direction);
//$obj->setProperty('uptime',$xml->fact->uptime);
$s=$xml->weather->day->day_part->wind_speed;
if ($s>=10) {$s=round($s);}
if ($s==0) {$s=0;}
$obj->setProperty('windSpeed',$s);
$s=$xml->weather->day->day_part->{'image-v3'}; // https://yastatic.net/weather/i/icons/blueye/48/bkn_n.png
$f=substr($s, 1 + mb_strrpos($s, '/')); // взять только имя файла
$obj->setProperty('image', $f);
// скачать файл картинки с яндекса, если ее у нас нет
if (!file_exists($path.$f)) {
file_put_contents($path.$f, file_get_contents($s));
}
$s=$xml->weather->day->day_part->temperature;
$obj->setProperty('temperature',$s);
// ToDo Записывать температуру из прогноза погоды только если данные у объекта DrivewayArea не актуальны
sg('DrivewayArea.Temperature', $s);
$s=$xml->weather->day->day_part->dampness;
$obj->setProperty('humidity', $s);
sg('DrivewayArea.Humidity', $s);
|
HardwareMonitor
|
Получить данные о состоянии сервера
$ch = curl_init('http://10.10.3.2:8085/data.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ohm = curl_exec($ch);
$json = json_decode($ohm);
// 'Имя свойства'=>id
$arrprop=array('CPUCore1Temp'=>27,'CPUCore2Temp'=>28,'CPUCore3Temp'=>29,'CPUCore4Temp'=>30,
'CPUCore1Load'=>33,'CPUCore2Load'=>34,'CPUCore3Load'=>35,'CPUCore4Load'=>36,
'GPUCoreTemp'=>50,'GPUCoreLoad'=>52,'CPUTotalLoad'=>32); //CPUTotalLoad должна быть последней
$a=[]; // для сбора температуры ядер ЦП
$s='';
foreach($arrprop as $pn=>$id) {
//получить значение свойства массива $arrprop
$v=searchJson($json,$id);
//echo "<br> $pn = $v";
//Сохранить всё кроме всех температур
if (!(strpos($pn, 'Temp') !== false)) {
//sg($pn, $v);
$s.=$pn.':'.$v.';';
}
// сбор температур ядер ЦП
if (preg_match('/CPUCore[1-4]Temp/is',$pn)) {
array_push($a, $v);
}
//расчитать цветовую t только для свойств с температурой
if (strpos($pn, 'Temp') !== false) {
$h=calccolortemp($v);
$pn=str_replace('Temp','HEX',$pn);
//echo " $pn = $h";
//sg($pn, $h);
$s.=$pn.':'.$h.';';
}
}
// Расчет усредненной* загрузки камня
$pn='CPUavgLoad';
$tavg = checkFromCache('VAR:'.$pn);
//$tavg=gg($pn);
if (!is_numeric($tavg)) {$tavg=50;}
$v=ceil(($tavg*2+$v)/3);
//echo "<br> $pn = $v";
//sg($pn, $v);
saveToCache('VAR:'.$pn, $v);
$s.=$pn.':'.$v.';';
// Расчет средней температуры ЦП
$v=ceil(array_sum($a)/count($a));
$h=calccolortemp($v);
//sg('CPUavgHEX', $h);
$s.='CPUavgHEX:'.$h.';';
//saveToCache('VAR:serverLoad', $s);
sg('serverLoad', $s);
// CPUCore1HEX:#00ff00;CPUCore2HEX:#00ff00;CPUCore3HEX:#00ff00;CPUCore4HEX:#00ff00;CPUCore1Load:15;CPUCore2Load:21;CPUCore3Load:12;CPUCore4Load:14;GPUCoreHEX:#ffff00;GPUCoreLoad:0;CPUTotalLoad:16;CPUavgLoad:14;CPUavgHEX:#00ff00;
//echo $s;
//setTimeOut('HardwareMonitorTimer',"runScript('HardwareMonitor');",10);
/*
перебирает вложения структуры json
в поисках значения по переданному id
*/
function searchJson($obj, $id) {
foreach($obj->Children as $child) {
if(isset($child->id)) {
if ($id == $child->id) {
$v=round(substr($child->Value,0,strpos($child->Value,' ')),0);
//echo "$id $v <br>";
return $v;
}
}
$a=NULL;
$a=searchJson($child,$id);
if (!is_null($a)) { return $a; }
}
//echo "id $id value not found <br>";
return NULL;
}
/*
Расчитывает цветовую температуру
*/
function calccolortemp($t) {
$min = 45; // зеленый
$mid = 52; // желтый
$max = 65; // красный
//if ($t<$min) {$t=$min;} elseif ($t>$max) {$t=$max;}
$t=max($t,$min);
$t=min($t,$max);
if ($t<$mid){
$t = round( ($t-$min)/($mid-$min)*255 );
$t = dechex($t);
if (strlen($t) == 1) { $t='0'.$t; }
$hcolor = '#'.$t.'ff00';
// $hcolor = $t.',255,0';
} else {
$t = 255 - round( ($t-$mid)/($max-$mid)*255 );
$t = dechex($t);
if (strlen($t) == 1) { $t='0'.$t; }
$hcolor = '#ff'.$t.'00';
//$hcolor = '255,'.$t.',0';
}
return $hcolor;
}
|
humidityHomeChanges
|
Расчет средней влажности по жилым комнатам, и решение о работе общего увлажнителя
/* Запускается из объектов класса Rooms для расчета средней влажности при её изменении
вычисляет среднюю влажность жилых комнат дома для включения общего увлажнителя
*/
$deblog=1; // отладочные сообщения debmes. 0 нет, 1 крит, 2 всё
$check=array('OfficeRoom','Bedroom','Livingroom','KitchenArea');
$h_avg=0; //средняя влажность
$r_count=0; //количество принятых комнат
foreach($check as $r) {
// моя функция получения времени изменения свойства. Ссылка на форум есть в блоге
$arr_s = mygetGlobalWithUpd("$r.humidity");
if (time()-$arr_s['UPDATED'] < 60*60*5) {
if ($deblog>1) { debmes('Влажность '.gg($r.'.inRoomText').' '.$arr_s['VALUE']); }
$r_count++;
$h_avg=$h_avg+$arr_s['VALUE'];
} else {
$s=gg("$r.inRoomText");
sg('alerts_message', "данные гигрометра $s не актуальны");
if ($deblog) { debmes("данные гигрометра $s не актуальны"); }
}
}
if (!$r_count) {
if ($deblog) { debmes('Данные вообще не получены. Взять среднее по последним измерениям'); }
say('Актуальные данные с датчиков влажности не получены, беру среднее значение по последним измерениям');
sg('alerts_message', "Данные гигрометров комнат дома не актуальны");
foreach($check as $r) {
$r_count++;
$h_avg=$h_avg+gg($r.'.Humidity');
}
}
$h_avg=round($h_avg/$r_count, 1);
if ($deblog>1) { debmes('Средняя влажность в доме '.$h_avg); }
// Данные о влажности в доме храню в объекте ThisComputer
sg('homeHumidity',$h_avg);
// Решение о работе увлажнителя
if ($h_avg <= 40) {
if ($deblog>1) { if ($deblog>1) { debmes('Включить увлажнитель'); } }
if (!gg('RelayZsocket1.status')) {
if ($deblog>1) { if ($deblog) { debmes('Включение реле'); } }
cm('RelayZsocket1.turnOn');
}
} else {
if ($deblog>1) { if ($deblog>1) { debmes('Выключить увлажнитель'); } }
if (gg('RelayZsocket1.status')) {
if ($deblog>1) { if ($deblog) { debmes('Выключение реле'); } }
cm('RelayZsocket1.turnOff');
}
}
|
jsonhs
|
формирует json для графиков highstock.
Линия во времени. Временные интервалы.
/*
mode может быть первым параметром, или подпараметром для линейных графиков
mode можно передать в name, например в случае с suntimeflags
*** для построения графика с данными истории свойства объекта комнаты
mode=linear (по умолчанию)
name=thrm_bathhouse.airCurrentTemp
tonow=1 опционально для вклюения в график текущего времени
*** для построения графика ПЗА
mode=fixedperiod
name=thrm_kitchen.pzaCalculate
*** для выделения областей на графике
mode=plotBands
name=thrm_bathhouse.status
*** точки восхода и заката на графике
mode=suntimeflags
*/
$start = microtime(true);
$name = $params['name'];
// Передать параметр. Нужно для удобства вызова из кода страницы с графиками. напримре в случаи с suntimeflags
$mode = isset($params['mode']) ? $params['mode'] : $mode='linear';
$color = isset($params['color']) ? $params['color'] : 0;
$last_id = isset($params['lastid']) ? (int)$params['lastid'] : 0;
// Проверка наличия параметров
if (!$name && !$mode) { say('Отсутствует параметр name в скрипте jsonhs'); return; }
// переопределение цвета по номеру. На html странице из JavaScript удобно в цикле отправлять номер.
switch ($color) {
case '0': $color = 'rgba(0,255,0,0.3)'; break;
case '1': $color = 'rgba(255,0,0,0.3)'; break;
case '2': $color = 'rgba(255,0,0,0.5)'; break;
case '3': $color = 'rgba(0,0,255,0.3)'; break;
}
// если цвет передан как FFFFE0, то добавить вначале #
if (strlen($color) == 6 ) { $color = '#'.$color; }
// массив для данных
$data = [];
// различные варианты структур
switch ($mode) {
case 'linear': // *** Линейные графики ***
// Получаем данные из таблицы истории
$pvalueid = getHistoryValueId($name);
$sql = "SELECT ID, UNIX_TIMESTAMP(ADDED)*1000 as ADDED, VALUE FROM phistory WHERE VALUE_ID=$pvalueid";
if ($last_id > 0) { $sql .= " AND ID>$last_id"; }
$sql .= " ORDER BY ADDED,ID";
$arr_s = SQLSelect($sql);
// Собрать массив
foreach ($arr_s as $row){
$data[] = [(int)$row['ADDED'], (float)$row['VALUE']];
}
$last_id = $row['ID'];
// Добавить текущее время с последним значением чтобы продлить график
if ( isset($params['tonow']) ) { $data[] = [time()*1000, (float)($row['VALUE'])]; }
case 'plotBands': // *** временные интервалы ***
// Получаем данные из таблицы истории
$pvalueid = getHistoryValueId($name);
$sql = "SELECT ID, UNIX_TIMESTAMP(ADDED)*1000 as ADDED, VALUE FROM phistory WHERE VALUE_ID=$pvalueid";
if ($last_id > 0) { $sql .= " AND ID>$last_id"; }
$sql .= " ORDER BY ADDED,ID";
$arr_s = SQLSelect($sql);
//, 'label'=>"{text: 'Plot band', align: 'right', x: -10}"
foreach($arr_s as $row) {
// Присвоить время начала и время конца
if ($row['VALUE']) {
$from = $row['ADDED'];
} else {
if ($from) {$to = $row['ADDED'];}
}
// Записать группу
if ($from && $to) {
$data[] = ['color'=>$color, 'from'=>$from, 'to'=>$to];
$from=0; $to=0;
}
}
// Добавить текущее время, если последний статус начался но не закончился
if ($from && !$to) {
$to = time()*1000;
$data[] = ['color'=>$color, 'from'=>$from, 'to'=>$to];
}
break;
case 'suntimeflags': // *** флаги восхода и заката солнца
$data[] = ['x'=>gg('sunrise')*1000, 'title'=>'sunRise', 'text'=>'Up'];
$data[] = ['x'=>gg('sunset')*1000, 'title'=>'sunSet', 'text'=>'Down'];
break;
case 'fixedperiod': // *** данные для графика log+20...-30log
// Собрать массив
for ($i = 20; $i >= -30; $i--) {
$t = callMethod($name, array('t_outside'=>$i, 'justcount'=>$params['justcount'], 'log'=>$params['log']));
$data[] = [$i, $t];
}
break;
default: // *** Данные из истории свойств для графиков и временных интервалов
say('Неизвестный параметр mode в скрипте jsonhs');
return;
}
/* Собрать структуру JSON */
header('Content-Type: application/json');
echo(json_encode([
//'work_time'=>round(microtime(true) - $start, 4),
'last_id'=>$last_id,
'data'=>$data
]));
//debmes($name. ' jsonhs work ' .round(microtime(true) - $start, 4));
|
jsonhsold
|
/*
mode может быть первым параметром, или подпараметром для линейных графиков
mode можно передать в name, например в случае с suntimeflags
*** для построения графика ПЗА
mode=fixedperiod
name=thrm_kitchen.pzaCalculate
*** для построения графика с данными истории свойства объекта комнаты
name=thrm_bathhouse.airCurrentTemp
tonow=1 опционально для включения в график текущего времени
*** для выделения областей на графике
name=thrm_bathhouse.status
mode=plotBands
*** точки восхода и заката на графике
name=suntimeflags
*/
$name = $params['name'];
// Передать параметр. Нужно для удобства вызова из кода страницы с графиками. например в случаи с suntimeflags
$mode = isset($params['mode']) ? $params['mode'] : $mode=$name;
$color = isset($params['color']) ? $params['color'] : 0;
$last_id = isset($params['lastid']) ? (int)$params['lastid'] : 0;
// Проверка наличия параметров
if (!$name && !$mode) { say('Ошибка в параметрах скрипта jsonhs'); return; }
// переопределение цвета по номеру. На html странице из JavaScript удобно в цикле отправлять номер.
switch ($color) {
case 0: $color = '#FCFFC5'; break;
case 1: $color = '#F0F0C0'; break;
}
$data = []; // массив для данных
switch ($mode) {
case 'suntimeflags' : // *** флаги восхода и заката солнца
$data[] = ['x'=>gg('sunrise')*1000, 'title'=>'sunRise', 'text'=>'Up'];
$data[] = ['x'=>gg('sunset')*1000, 'title'=>'sunSet', 'text'=>'Down'];
break;
case 'fixedperiod' : // *** данные для графика ПЗА +20...-30
// Собрать массив
for ($i = 20; $i >= -30; $i--) {
$t = callMethod($name, array('t'=>$i));
$data[] = [$i, $t];
}
break;
default: // *** Данные из истории свойств для графиков и временных интервалов
// Получаем данные из таблицы истории
$pvalueid = getHistoryValueId($name);
$sql = "SELECT ID, UNIX_TIMESTAMP(ADDED) as ADDED, VALUE FROM phistory WHERE VALUE_ID=$pvalueid";
if ($last_id > 0) { $sql .= " AND ID>$last_id"; }
$sql .= " ORDER BY ADDED,ID";
$arr_s = SQLSelect($sql);
switch ($mode) {
case 'plotBands': // *** временные интервалы ***
foreach($arr_s as $row) {
// Присвоить время начала и время конца
if ($row['VALUE']) {
$from = $row['ADDED']*1000;
} else {
if ($from) {$to = $row['ADDED']*1000;}
}
// Записать группу
if ($from && $to) {
$data[] = ['color'=>$color, 'from'=>$from, 'to'=>$to];
$from=0;
$to=0;
}
}
// Добавить текущее время, если последний статус начался но не закончился
if ($from && !$to) {
$to = time()*1000;
$data[] = ['color'=>$color, 'from'=>$from, 'to'=>$to];
}
break;
default: // *** режим данных для линейного графика ***
// Собрать массив
foreach ($arr_s as $row){
$added = $row['ADDED'];
$t = (float)($row['VALUE']);
$data[] = [$added*1000, $t];
$last_id = $row['ID'];
}
// Добавить текущее время с последним значением чтобы продлить график
if ( isset($params['tonow']) ) { $data[] = [time()*1000, $t]; }
} // switch mode
} //switch $name
/* Собрать структуру JSON */
header('Content-Type: application/json');
echo(json_encode([
'last_id'=>$last_id,
'data'=>$data
]));
|
sdmReceiver
|
Приём входящих сообщений от SDM
// debmes('sdmReceiver '.json_encode($params) );
/*
дополнительный $params['marker'] может быть передан в любой класс. Например в классе music можно разделить тревожные треки и музыкальный проигрыватель
$params['from'] SDM берет из своего ini файла. По нему можно понять от какого именно экземпляра пришло сообщение
*/
// $params['class'] обязательный. Он определяет дальнейший набор переданных параметров
if (!array_key_exists('class', $params)) {
debMes('sdmReceiver error. Не передан ключ class в массиве params');
return;
}
switch ($params['class']) {
case 'recognize': // получение распознаваемого текста. Есть два варианта. В сценарий или сразу в файл command.php
break;
case 'volume': // сообщения громкости
break;
case 'task': // подтверждения о постановке задач в очередь
//$params['event']
break;
case 'music': // событие с музыкой
switch ($params['event']) {
case 'play_song':
/* начало проигрывания тревожного трека */
if ($params['marker']=='alarm') {
// Сейчас хендл пишется только с домашней версии с именем home. Все остальные продолжат доигрывать тревожное сообщение, и будут получать трек в момент отправки домашней
// Сразу после постановки на игру тревожного трека, по переданной метке alarm, записываем свойство alarmStreamHandle
// Когда трек закончится, можно сравнить его хендл со свойством alarmStreamHandle, и если они равны, запустить следующий тревожный трек
if ($params['from']=='home') {
sg('alarmStreamHandle', $params['streamhandle']);
}
}
break;
case 'song_is_over':
/* Повторить звук тревоги, если последний трек был тревожный */
if ($params['streamhandle'] == gg('alarmStreamHandle') ) {
//$ed=registeredEventDetails('alarmEvent');
$ed = getGlobal('globalAlarms');
if ($ed) {
if (strpos($ed, 'Fire') !== false) { $s='Fire.mp3'; }
elseif (strpos($ed, 'Smoke') !== false) { $s='Fire.mp3'; }
elseif (strpos($ed, 'Heat') !== false) { $s='Fire.mp3'; }
elseif (strpos($ed, 'Flood') !== false) { $s='Water.mp3'; }
elseif (strpos($ed, 'Gas') !== false) { $s='03284.mp3'; }
elseif (strpos($ed, 'Toxic') !== false) { $s='03284.mp3'; }
elseif (strpos($ed, 'Freeze') !== false) { $s='03284.mp3'; }
else { $s='03284.mp3'; }
playsound('-music:play -marker:alarm '.ROOT.'cms/sounds/'.$s);
}
}
break;
case 'song_is_stop':
break;
case 'song_is_terminated':
break;
}
}
/*
// Тревожные сообщения
switch ($params['class']) {
case 'music':
//if ($params['streamhandle'] == 'error') { debmes('sdmReceiver:error => class=music Task setting error'); return; }
switch ($params['event']) {
case 'play_song':
// Сейчас хендл пишется только с домашней версии с именем home. Все остальные продолжат доигрывать тревожное сообщение, и будут получать трек в момент отправки домашней
// Сразу после постановки на игру тревожного трека, по переданной метке alarm, записываем свойство alarmStreamHandle
// Когда трек закончится, можно сравнить его хендл со свойством alarmStreamHandle, и если они равны, запустить следующий тревожный трек
if ($params['marker']=='alarm' && $params['from']=='home') {
sg('alarmStreamHandle', $params['streamhandle']);
}
break;
case 'song_is_over':
// Повторить звук тревоги, если последний трек был тревожный
if ($params['streamhandle'] == gg('alarmStreamHandle') ) {
$ed=registeredEventDetails('alarmEvent');
if ($ed) {
if (strpos($ed, 'Fire') !== false) { $s='Fire.mp3'; }
elseif (strpos($ed, 'Smoke') !== false) { $s='Fire.mp3'; }
elseif (strpos($ed, 'Heat') !== false) { $s='Fire.mp3'; }
elseif (strpos($ed, 'Flood') !== false) { $s='Water.mp3'; }
elseif (strpos($ed, 'Gas') !== false) { $s='03284.mp3'; }
elseif (strpos($ed, 'Toxic') !== false) { $s='03284.mp3'; }
elseif (strpos($ed, 'Freeze') !== false) { $s='03284.mp3'; }
else { $s='03284.mp3'; }
playsound('-music:play -marker:alarm '.ROOT.'cms/sounds/'.$s);
}
}
break;
}
break;
}
echo 'ok';
return 'ok';
*/
|
SearchProblemObjects
|
Составление списка объектов проблемных сенсоров
// флаг вывода списка на экран
if (isset($params['print'])) { $print=$params['print']; } else { $print=0; }
// Массмив неполадок
$detals=array();
// if ($print) { echo '<br />'; }
// Перебор неживых датчиков
$globalClassNamesArray=array('keySensors','MegaD','Z-Wave');
foreach($globalClassNamesArray as $globalClassName) {
// if ($print) { echo '<br />'; }
$objects=getObjectsByClass($globalClassName);
foreach($objects as $obj) {
$obj=getObject($obj['TITLE']);
// только для неживых
if (!$obj->getProperty('alive')) {
// Нашли неживой объект
switch ($globalClassName) {
case 'keySensors':
$detals['keySensors']="Не все датчики обновляются.";
break;
case 'MegaD':
$detals['MegaD']="Мега не отвечает.";
break;
case 'Z-Wave':
$detals['ZWave']="Z датчик не отвечает.";
break;
}
}
// В список попадает все объекты, у которых alive <>1
if ($obj->getProperty('alive')<>1) {
// Составить список
if ($print) {
$title=$obj->object_title;
$s = getClassNameByObject($title);
if ($ClassName!=$s) {
// При первом разе открыть начало раздела неживых объектов, иначе закрыть предыдущую таблицу
if (!$ClassName) {
echo '<details open><summary><big><b style="color:#ff0000">Неживые объекты</b></big></summary> <blockquote>';
} else {
echo '</table></details><br />';
}
$ClassName = $s;
// Открыть новую таблицу. Напечатать имя класса (подкласса)
echo '<details open><summary><big><b>'.$ClassName.'</b></big></summary>';
echo '<table border="1">';
}
// Разный цвет текста
if ($obj->getProperty('alive')>1) { $cn='<font color="gray">'; $ce='</font>'; } else { $cn=''; $ce=''; }
// Напечатать имена и описание объектов
echo '<tr>';
echo '<td>'.$cn.$obj->object_title.$ce.'</td>';
echo '<td>'.$cn.$obj->description.$ce.'</td>';
$rec = mygetGlobalWithUpd($obj->object_title . '.alive');
echo '<td>'.$cn.date("d.m.Y H:i", $rec['UPDATED']).$ce.'</td>';
echo '</tr>';
}
}
}
}
// закрыть последнюю таблицу и раздел неживых
if ($print && $s) { echo '<!-- --> </table></details> </blockquote> </details>'; }
$ClassName='';
$s='';
// Поиск датчиков с севшей батарейкой
$objects=getObjectsByClass('Z-Wave');
foreach($objects as $obj) {
$obj=getObject($obj['TITLE']);
$Battery = $obj->getProperty('Battery');
if (is_numeric($Battery) && $Battery < 20) {
$detals['battery']='У радио датчика села батарейка.';
if ($print) {
// При первом найденном открываем таблицу (раздел)
if (!$s) {
echo '<br /><details open><summary><big><b style="color:#ff0000">Радиодатчики</b></big></summary> <blockquote>';
echo '<table border="1">';
$s=1;
}
// Напечатать имена и описание объектов
echo '<tr>';
echo '<td>'.$obj->object_title.'</td>';
echo '<td>'.$obj->description.'</td>';
$rec = mygetGlobalWithUpd($obj->object_title . '.alive');
echo '<td>'.date("d.m.Y H:i", $rec['UPDATED']).'</td>';
echo '<td>'.$Battery.'%'.'</td>';
echo '</tr>';
}
}
}
// Закрываем таблицу
if ($print && $s) { echo '</table></blockquote></details>'; }
$s='';
// Соединить все неполадки в одну строку
$s=implode(' ',$detals);
// зарегистрировать событие
if ($s) {
registerEvent('problems_objects', $details=$s, $expire_in=10);
} else {
registerEvent('problems_objects', $details='', $expire_in=1); // или просто удалить
if ($print) { echo '<big><b>Все пучком !</b></big>'; }
}
|
snaptotelegramm
|
$snap = "http://10.10.3.2:9786/cameras/2/image";
$fileto = DOC_ROOT."/cms/images/cam2_".date('Y-m-d-H-i').".jpg";
$result = getURL($snap,0,'admin','');
// function getURL($url, $cache = 0, $username = '', $password = '', $background = false, $curl_options = 0)
SaveFile($fileto, $result);
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$telegram_module->sendImageToUser(5269708227, $fileto, 'Звонок в дверь'); //Сергей
$telegram_module->sendImageToUser(982014169, $fileto, 'Звонок в дверь'); //Марина
|
systemsAlert
|
Оповещение о красных статусов систем
/*
Ищет красные статусы объектов systemStates и говорит о наличии неполадок
Запускается из класса Timers
*/
$objects = getObjectsByClass('systemStates');
foreach ($objects as $obj) {
$obj=getObject($obj['TITLE']);
if ($obj->getProperty('stateColor') == 'red') {
switch ($obj->object_title) {
case 'Code':
say('Присутствуют ощибки в коде');
break;
case 'Communication':
say('Неполадки в системе связи');
break;
case 'Security':
say('Красный уровень безопасности');
break;
case 'Speech':
say('отказ системы синтеза речи');
break;
case 'System':
say('Обнаружена неисправность системы');
break;
}
}
}
//echo "ok";
|
tempBHChanges
|
Расчет средней температуры Бани
/* вычисляет среднюю температуру комнат отдыха бани
для передачи её объекту термостата котла
*/
$check=array('Restroom','ZalRoom');
$t_avg=0; //средняя температура
$r_count=0; //количество принятых комнат
foreach($check as $r) {
// моя функция получения времени изменения свойства. Ссылка на форум есть в блоге
$arr_s = mygetGlobalWithUpd("$r.Temperature");
if (time()-$arr_s['UPDATED'] < 60*60*4) {
echo 'температура '.gg("$r.inRoomText").' '.$arr_s['VALUE'].'<br>';
$r_count++;
$t_avg=$t_avg+$arr_s['VALUE'];
} else {
$s=gg("$r.inRoomText");
echo "данные о температуре $s не актуальны <br>";
sg('alerts_message', "данные о температуре $s не актуальны");
}
}
if (!$r_count) {
echo 'Данные не получены. Взять среднее по последним измерениям <br>';
sg('alerts_message', "Данные температур комнат бани не актуальны");
foreach($check as $r) {
$r_count++;
$t_avg=$t_avg+gg("$r.Temperature");
}
}
$t_avg=round($t_avg/$r_count, 1);
echo "Средняя температура бани $t_avg <br>";
// передать данные в объект термостата
sg('thrm_bathhouse.airCurrentTemp', $t_avg);
|
tempHomeChanges
|
Расчет средней температуры Бани
/* Запускается из объектов класса Rooms для расчета средней температуры при её изменении
вычисляет среднюю температуру жилых комнат дома для передачи её объекту термостата котла
*/
$check=array('Bedroom','HallArea','KitchenArea','Livingroom','OfficeRoom');
$t_avg=0; //средняя температура
$r_count=0; //количество принятых комнат
foreach($check as $r) {
// моя функция получения времени изменения свойства. Ссылка на форум есть в блоге
$arr_s = mygetGlobalWithUpd("$r.Temperature");
if (time()-$arr_s['UPDATED'] < 60*60*4) {
echo 'температура '.gg("$r.inRoomText").' '.$arr_s['VALUE'].'<br>';
$r_count++;
$t_avg=$t_avg+$arr_s['VALUE'];
} else {
$s=gg("$r.inRoomText");
echo "данные о температуре $s не актуальны <br>";
sg('alerts_message', "данные о температуре $s не актуальны");
}
}
if (!$r_count) {
echo 'Данные не получены. Взять среднее по последним измерениям <br>';
sg('alerts_message', "Данные температур комнат дома не актуальны");
foreach($check as $r) {
$r_count++;
$t_avg=$t_avg+gg("$r.Temperature");
}
}
$t_avg=round($t_avg/$r_count, 1);
echo "Средняя температура в доме $t_avg <br>";
// передать данные в объект термостата
sg('thrm_alpha.airCurrentTemp', $t_avg);
sg('thrm_homeElectric.airCurrentTemp', $t_avg);
|
vosk-webhook
|
/*
Получение структуры json от Воск сервера.
Ответ яндекс серверу
*/
// Ошибка отсутствия данных яндекса
if (!$params['data']) {
say('Нет данных от сервера Воск');
sg('alerts_message', 'Нет данных от сервера Воск');
return 'error: parameter data is empty';
}
// Преобразовать строку json в структуру
$obj = json_decode($params['data']);
// Ошибка структуры json
if (!$obj || json_last_error()<>JSON_ERROR_NONE) {
say('Ошибка структуры json от сервера Воск');
sg('alerts_message', 'Ошибка json от сервера Воск');
return 'error: incorrect structure json';
}
// Собрать json структуру ответа яндексу
$ans = json_encode([
'status' => 'ок'
]);
// Отправить ответ серверу, и продолжить обработку дальше
ob_end_clean();
ignore_user_abort(true);
ob_start();
echo $ans;
$size = ob_get_length();
header("Content-Length: $size");
header('Content-Type: application/json');
header('Connection: close');
header('Content-Encoding: none');
ob_end_flush();
flush();
ob_end_clean();
session_write_close();
$text = $obj->text;
// Завершить выполнение если нет текста
if (!$text) { return; }
// id станций
$user = 1; $source = ''; $roomActivity='';
switch ($obj->ip) {
case '10.10.3.2': $user=3; $source='voskCabinet'; $roomActivity='OfficeRoom'; break;
case '10.10.3.115': $user=6; break; // Сергей ноут
default: say('Поступило сообщение от неизвестной станции '.$obj->pi, -1);
}
// Вызвать активность в комнате
if ($roomActivity) { cm($roomActivity.'.onActivity', ['source'=>$source]); }
$use_phpmorphy = 1; // Использовать phpmorphy для разделения на команды по глаголу
$use_split = 0; // Разделить по шаблону из списска команд
// ***** Отправить "как есть"
if (!$use_phpmorphy && !$use_split) {
say($text, 0, $user, $source);
return;
}
// ***** Разбить по команде
if ($use_split) {
$matches = preg_split("/\s?и?\s?(вы?ключит?ь?|открой|закрой|открыть|закрыть)\s/isu", $text, 0 ,PREG_SPLIT_DELIM_CAPTURE);
if (count($matches)==1) {
say($text, 0, $user, $source);
return;
} else {
for ($i = 1; $i < count($matches); $i+=2 ) {
say($matches[$i]. ' ' . $matches[$i+1], 0, $user, $source);
}
return;
}
}
// ***** Разбить по глаголу. При этом в составной команде глагол должен быть произнесен первым
if ($use_phpmorphy) {
$phpmorphy_loaded = 0;
if (file_exists(ROOT . "lib/phpmorphy/common.php")) {
require_once(ROOT . "lib/phpmorphy/common.php");
$opts = array(
'storage' => PHPMORPHY_STORAGE_MEM,
'predict_by_suffix' => true,
'predict_by_db' => true,
'graminfo_as_text' => true,
);
$dir = ROOT . 'lib/phpmorphy/dicts';
$lang = 'ru_RU';
try {
$morphy = new phpMorphy($dir, $lang, $opts);
$this->morphy =& $morphy;
$phpmorphy_loaded = 1;
} catch (phpMorphy_Exception $e) {
die('Error occured while creating phpMorphy instance: ' . PHP_EOL . $e);
echo 'Error occured while creating phpMorphy instance: ';
}
}
if ($phpmorphy_loaded) {
// Разбиваем строку на массив по глаголам
//debmes('Входная строка: '.$text, 'phpMorphy');
$words = explode(' ', $text);
$j=0;
foreach($words as $word) { // цикл команды разбитой на слова для поиска "глагола"
$word = mb_strtoupper($word, 'UTF-8'); // какое то слово в команде
if ($word) {
$part_speech = $morphy->getPartOfSpeech($word); // получаем по значению слова его тип как части речи
if ($part_speech[0] == 'Г') {
$j++;
} elseif ($part_speech[0] == 'ИНФИНИТИВ') {
$base = $morphy->getAllForms(mb_strtoupper($word, 'UTF-8')); // получаем по значению слова его базовое значение
$word = $base[14];
$j++;
}
$commands[$j] .= ' '.$word;
}
}
//debmes('commands:' . json_encode($commands, JSON_UNESCAPED_UNICODE), 'phpMorphy');
// Обработать и выполнить
foreach($commands as $command) {
// убрать лишнее
$command = trim($command);
$command = preg_replace('/(\sи|\sи\sещ[её])$/iu', '', $command);
//$command = str_ireplace([' и', ' и ещё'], '' , $command);
// первая буква заглавная, остальные строчные. ucfirst()
$first = mb_substr($command, 0, 1, 'UTF-8');//первая буква
$last = mb_substr($command, 1, null, 'UTF-8');//все кроме первой буквы
$first = mb_strtoupper($first, 'UTF-8');
$last = mb_strtolower($last, 'UTF-8');
$command = $first.$last;
// выполнить
say($command, 0, $user, $source);
debmes('command:' . $command, 'phpMorphy');
}
return;
}
} //$use_phpmorphy
|
Zstatus
|
Проверка коннекта к сети Z
/* записывает статус конекта к сети Z в переменную zwaystatus
для объекта Communication класса systemStates.
Выполнение этого кода из метода объекта Communication работает неправильно
*/
include_once(DIR_MODULES.'zwave/zwave.class.php');
$zw=new zwave();
$zw->getConfig();
$status=$zw->connect();
if ($status) {
//debmes('Контроллер Z сети работает нормально');
sg('zwaystatus',1);
} else {
//debmes('Контроллер Z сети не доступен');
sg('zwaystatus',0);
// закрыть сообщение о крахе службы Z
// safe_exec('D:\Server\www\z-wave-close.exe');
}
|
zWaveBattery
|
Опросить все радиодатчики на состояние батареи
/* Опросить все радиодатчики на состояние батареи
*/
debmes('script zWaveBattery is runing');
include_once(DIR_MODULES.'zwave/zwave.class.php');
$zw=new zwave();
$zw->getConfig();
//$status=$zw->connect();
//$command='ZWaveAPI/Run/for (id in zway.devices) { zway.devices[id].Battery && zway.devices[id].Battery.Get() }';
$command='ZWaveAPI/Run/for%20(id%20in%20zway.devices)%20%7B%20zway.devices[id].Battery%20&&%20zway.devices[id].Battery.Get()%20%7D';
$ans=$zw->apiCall($command);
if($ans) {
say('Функция zwave apiCall вернула ответ отличный от нуля');
debmes($ans);
}
|