Добро пожаловать,
Гость
|
Софт:обсуждение программного обеспечения для умного дома
ТЕМА: Php скрипты для esp8266
Php скрипты для esp8266 02 Окт 2016 20:35 #14995
|
Доброго, пробую использовать Ваш скрипт. Вопрос: http://192.168.111.180/sensors
это страница вашего ESP? У меня по адресу http://192.168.0.40/sensors, Error 404. Поясните пожалуйста. |
Администратор запретил публиковать записи гостям.
|
Php скрипты для esp8266 02 Окт 2016 20:48 #14997
|
perers пишет:
Доброго, пробую использовать Ваш скрипт. Вопрос: http://192.168.111.180/sensors Да, конечно, это адрес в моей домашней сети, у Вас, вероятно, он другой.это страница вашего ESP? У меня по адресу http://192.168.0.40/sensors, Error 404. Поясните пожалуйста. Если у Вашей ESP, по указанному адресу такая ошибка, то в прошивке надо включить - Датчики GET запросом. Заходя браузером, видите данные типа - hostname:ESP181;dsw1:21.9; ? |
Администратор запретил публиковать записи гостям.
|
Php скрипты для esp8266 02 Окт 2016 20:54 #14998
|
На сегодня скрипты переделал, поскольку ESP стало много и их адреса передаю одному скрипту в параметрах. Вообще забросил этот метод, перешел на Majordomo. www.smartliving.ru - там за нас уже всё придумали - рекомендую.
|
Администратор запретил публиковать записи гостям.
|
Php скрипты для esp8266 02 Окт 2016 23:19 #15000
|
Да действительно, спасибо большое. По поводу Majordomo поставил, попробовал не получилось, кажется навороченным. Нужно ещепробовать.
|
Администратор запретил публиковать записи гостям.
|
Php скрипты для esp8266 03 Окт 2016 08:23 #15003
|
Доброго, поделитесь скриптом который у Вас на сег день, которые переделаны? Спасибо.
|
Администратор запретил публиковать записи гостям.
|
Php скрипты для esp8266 03 Окт 2016 15:03 #15005
|
Вот что имеем:
У меня это крутится на Linux. Обратите внимание на пути размещения файлов - поправьте на свои пути. В MySQL создаем базу с именами полей всех сенсоров и номерами gpio, если хотим их состояние тоже хранить. Опрашиваются только gpio настроеные на выход, если их нет или каких-то сенсоров нет, то соответственно эти данные не пишутся. Но! если в базе нет поля с именем сенсора или именем gpio, а данные от esp по ним считались, то тогда запрос на запись не будет выполнен. Т.е. не запишется в этом случае ничего. Проще сразу в базу внести все возможные имена сенсоров и gpio. Кроме того я в базе сделал поле ID с автонумерацией и поле timestamp куда автоматически записывается серверное время - соответственно знаем когда данные были записаны в базу. В cron вставляем запись, каждые 5 минут дергаем исполняемый скрипт */5 * * * * root /var/www/html/esp/cron_db/sensors_urls >/dev/null Сам скрипт sensors_urls: #!/bin/bash
/usr/bin/php /var/www/html/esp/cron_db/espdata2db.php 192.168.111.185 > /dev/null
/usr/bin/php /var/www/html/esp/cron_db/espdata2db.php 192.168.111.190 > /dev/null
/usr/bin/php /var/www/html/esp/cron_db/espdata2db.php 192.168.111.191 > /dev/null
/usr/bin/php /var/www/html/esp/cron_db/espdata2db.php 192.168.111.194 > /dev/null
/usr/bin/php /var/www/html/esp/cron_db/espdata2db.php 192.168.111.195 > /dev/null В скрипте добавляем IP адреса ESP от которых нужны данные. Количество - скока Вам надо. Теперь PHP скрипт, который вставляет данные в базу espdata2db.php: <?PHP
//Путь где лежит функция обращения к базе
require_once('/var/www/html/esp/mysql_q.php');
$host_url = $argv[1];
$sensors = array();
$gpio = array();
$temp = array();
$temp2 = array();
$data = array();
//URL with need data
//Sensor data
$sensors_url = '/sensors';
//output gpio data
$gpio_url = '/gpioprint';
//Get sensors string from esp
//
//
$ch = curl_init("$host_url$sensors_url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$string = curl_exec($ch);
curl_close($ch);
//Convert from string to associative array for sensors
$array_temp = explode(';', $string);
foreach($array_temp as $str) {
list($key, $value) = explode(':', $str);
$sensors[$key] = $value;
}
//Delete latest zero-line
$temp = array_pop($sensors);
//Get gpio string from esp
//
//
$ch = curl_init("$host_url$gpio_url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$string = curl_exec($ch);
curl_close($ch);
//Convert from string to associative array for sensors
$array_temp = explode(';', $string);
foreach($array_temp as $str) {
list($key, $value) = explode(':', $str);
$sensors[$key] = $value;
}
//Delete latest zero-line
$temp = array_pop($sensors);
//Get gpio string from esp
//
//
$ch = curl_init("$host_url$gpio_url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$string = curl_exec($ch);
curl_close($ch);
//Convert from string to associative array for gpio
$array_temp = explode(';', $string);
foreach($array_temp as $str) {
list($key, $value) = explode(':', $str);
$gpio[$key] = $value;
}
//Delete latest zero-line
$temp = array_pop($gpio);
//Change gpio 'number' to 'gpioX'
foreach($gpio as $k => $v)
{
if($k == '0') $k = 'gpio0';
if($k == '1') $k = 'gpio1';
if($k == '2') $k = 'gpio2';
if($k == '3') $k = 'gpio3';
if($k == '4') $k = 'gpio4';
if($k == '5') $k = 'gpio5';
if($k == '6') $k = 'gpio6';
if($k == '7') $k = 'gpio7';
if($k == '8') $k = 'gpio8';
if($k == '9') $k = 'gpio9';
if($k == '10') $k = 'gpio10';
if($k == '11') $k = 'gpio11';
if($k == '12') $k = 'gpio12';
if($k == '13') $k = 'gpio13';
if($k == '14') $k = 'gpio14';
if($k == '15') $k = 'gpio15';
$temp2[$k] = $v;
}
$gpio = $temp2;
//Merge in solid array
$data = array_merge($sensors, $gpio);
// Print array $data for test
//print_r($data);
// Write to database
//ip address MySQL server
$dbhost = "localhost";
//MySQL user name
$dbuser = «XXXXX";
//MySQL user password
$dbpass = «XXXXXX";
//MySQL database name
$dbname = "esp_home";
$link = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname,$link);
//Write to table esp_test3
mysql_write_row('esp_test3', $data);
?> И наконец функция которая подключается в предыдущем PHP скрипте: <?php
# v. 1.41 (27.10.2015)
# http://webew.ru/articles/3237.webew
function mysql_q($sql, $substitutions = array()) {
global $mysqli;
if ($substitutions)
$sql = mysql_substitute($sql, $substitutions);
$result = ($mysqli)
? $mysqli->query($sql)
: mysql_query($sql);
if ($result)
return $result;
else {
$trace = debug_backtrace();
$mysql_functions = array(
'mysql_getcell',
'mysql_getrow',
'mysql_getcolumn',
'mysql_gettable',
'mysql_write_row'
);
if (isset($trace[1]) AND in_array($trace[1]['function'], $mysql_functions))
$level = 1;
else
$level = 0;
$db_error = ($mysqli)
? mysqli_error($mysqli)
: mysql_error();
$message =
'<p><strong>MySQL error</strong> in file <strong>'.$trace[$level]['file'].'</strong>'.
" at line <strong>" .$trace[$level]['line']."</strong>
(function <strong>" . $trace[$level]['function'] ."</strong>):<br/>"
."\n<span style='color:blue'>$db_error</span>\n\n<pre>$sql</pre></p>";
die($message);
}
}
function mysql_substitute($sql, $substitutions) {
// Чтобы следующая метка не могла затронуть содержание предыдущей,
// например, в случае $subst = array('id' => 5, 'title' => 'а тут :id'),
// проводить их замену приходится не по очереди через простой foreach,
// а за один вызов заменяющий функции,
// для чего нужно составить регулярное выражение, охватывающее
// все метки. Впрочем, это несложно.
// О производительности здесь беспокоиться не будем,
// т.к. запрос - это довольно короткая строка, поэтому он
// будет обработан быстро в любом случае.
$regexp = '/:(';
foreach ($substitutions as $key => $value)
$regexp .= $key
. (
substr($key, -1) != '`' // нужно учесть,
? '\b' // что теоретически метки могут быть
: '' // не только вида :word, но и вида :`...`
)
. '|';
$regexp = substr($regexp, 0, -1); // убираем лишний '|'
$regexp .= ')/';
$sql = preg_replace_callback(
$regexp,
function($matches) use ($substitutions) {
return mysql_escape($substitutions[$matches{1}]);
},
$sql
);
return $sql;
}
function mysql_escape($value) {
global $mysqli;
if (is_array($value))
$escaped = implode(',', array_map(__FUNCTION__, $value) );
elseif (is_string($value))
$escaped = ($mysqli)
? "'" . mysqli_real_escape_string($mysqli, $value) . "'"
: "'" . mysql_real_escape_string($value) . "'" ;
elseif (is_numeric($value))
$escaped = $value;
elseif (is_null($value))
$escaped = 'NULL';
else
$escaped = intval($value);
return $escaped;
}
function mysql_getcell($sql, $substitutions = array()) {
$tmp = mysql_getcolumn($sql, FALSE, $substitutions);
$cell = ($tmp)
? reset($tmp)
: FALSE ;
return $cell;
}
function mysql_getrow($sql, $substitutions = array()) {
$tmp = mysql_gettable($sql, FALSE, $substitutions);
$row = ($tmp)
? reset($tmp)
: array();
return $row;
}
function mysql_getcolumn($sql, $makehash = FALSE, $substitutions = array()) {
$data = array();
$result = mysql_q($sql, $substitutions);
$fn = is_resource($result)
? 'mysql_fetch_row'
: 'mysqli_fetch_row' ;
if (!$makehash)
while ($row = $fn($result))
$data[] = $row[0];
else
while ($row = $fn($result))
$data[$row{0}] = $row[1];
if (!is_resource($result))
$result->close();
return $data;
}
function mysql_gettable($sql, $keycol = FALSE, $substitutions = array()) {
$data = array();
$result = mysql_q($sql, $substitutions);
$fn = is_resource($result)
? 'mysql_fetch_assoc'
: 'mysqli_fetch_assoc' ;
if (!$keycol)
while ($row = $fn($result))
$data[] = $row;
else
while ($row = $fn($result))
$data[$row{$keycol}] = $row;
if (!is_resource($result))
$result->close();
return $data;
}
function mysql_write_row(
$tablename,
$data,
$unique_key = FALSE,
$mode = FALSE) {
global $mysqli;
if (!$unique_key) { // Уникальный идентификатор не указан - INSERT
if (!$mode)
$sql = "INSERT";
elseif ($mode == 'IGNORE')
$sql = "INSERT IGNORE";
elseif ($mode == 'REPLACE')
$sql = "REPLACE";
else {
$trace = reset(debug_backtrace());
$message = "
Uknown mode \"$mode\" given to $trace[function]() in file $trace[file] at line $trace[line].
Terminating function run.
";
trigger_error($message, E_USER_WARNING);
return FALSE;
}
$sql .= " INTO $tablename SET ";
foreach ($data as $key => $value)
$sql .= "`$key` = :$key, ";
$sql = substr($sql, 0, -2); // убираем запятую и пробел
$result = mysql_q($sql, $data);
$out = ($mysqli)
? $mysqli->insert_id
: mysql_insert_id();
}
else { // UPDATE или INSERT ON DUPLICATE KEY UPDATE
if (!is_array($unique_key)) // если указана скалярная величина -
$unique_key = array('id' => $unique_key); // воспринмаем её как 'id'
if (!$mode) { // обычный UPDATE
// В данном случае поля из второго аргумента подставляются в часть SET,
// а поля из третьего - в часть WHERE
$sql = "UPDATE $tablename SET ";
// Чтобы одно и то же поле можно было использовать
// и в части SET, и в части WHERE с разными значениями, например
// UPDATE table
// SET col1 = 'A', col2 = 'B'
// WHERE col1 = 'C'
// подстановку значений в запрос проводим "вручную" -
// без использования меток.
foreach ($data as $key => $value)
$sql .= "`$key` = " . mysql_escape($value) . ", ";
$sql = substr($sql, 0, -2); // убираем запятую и пробел
if ($unique_key) {
$sql .= " WHERE ";
foreach ($unique_key as $key => $value)
$sql .= " `$key` = " . mysql_escape($value) . " AND ";
$sql = substr($sql, 0, -4); // убираем последний AND и пробел
}
$result = mysql_q($sql);
$out = ($mysqli)
? $mysqli->affected_rows
: mysql_affected_rows() ;
}
elseif ($mode == 'DUPLICATE') { // INSERT ... ON DUPLICATE KEY UPDATE
$append = is_string(key($unique_key));
// $append: если массив $unique_key ассоциативный,
// значит, в них данные для уникальных полей -
// включаем их в INSERT и в подставновку в mysql_q()
// Если же массив числовой, значит
// все необходимые данные переданы во втором аргументе,
// а $unique_key содержит только имена полей,
// которые следует исключить из ON DUPLICATE KEY
if ($append) {
$all_data = $data + $unique_key; // Все данные для ON DUPLICATE KEY UPDATE
$data_to_update = $data; // есть в $data
}
else {
$all_data = $data;
$data_to_update = array_diff_key( // В $unique_key переданы имена полей,
$data, // которые необходимо исключить
array_fill_keys($unique_key, TRUE) // из части ON DUPLICATE KEY UPDATE
);
}
$sql = "INSERT INTO $tablename SET ";
foreach ($all_data as $key => $value)
$sql .= "`$key` = :$key, ";
$sql = substr($sql, 0, -2); // убираем запятую и пробел
if ($data_to_update) {
$sql .= " ON DUPLICATE KEY UPDATE " ;
foreach ($data_to_update as $key => $value)
$sql .= " `$key` = :$key, ";
$sql = substr($sql, 0, -2); // убираем запятую и пробел
}
$result = mysql_q($sql, $all_data);
// Т.к. запрос INSERT - возвращает LAST_INSERT_ID()
$out = ($mysqli)
? $mysqli->insert_id
: mysql_insert_id();
}
}
return $out;
}
?> Почему столько скриптов - я хотел чтоб можно было добавлять только IP адреса ESP в одно место и не париться правкой в нескольких местах. Кроме того MySQL не понимает использование в качестве имен полей каких-то переменных, а при считывании данных с ESP мы заранее не прописываем какие там сенсоры будут. Вот для этого и нужна подключаемая функция. Далее из базы стандартными способами вытаскиваем данные и используем где нам надо - строим графики, вставляем данные в html и т.п. Сам ни разу не программист, всё это искал в сети и приспосабливал под свою задачу. |
Администратор запретил публиковать записи гостям.
|
Время создания страницы: 0.150 секунд