Ключевое ?лово

vk

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Софт:обсуждение программного обеспечения для умного дома
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5

ТЕМА: Php скрипты для esp8266

Php скрипты для esp8266 02 Окт 2016 20:35 #14995

  • perers
  • perers аватар
  • Не в сети
  • Новый участник
  • Сообщений: 17
  • Репутация: 0
Доброго, пробую использовать Ваш скрипт. Вопрос: http://192.168.111.180/sensors
это страница вашего ESP? У меня по адресу http://192.168.0.40/sensors, Error 404. Поясните пожалуйста.
Администратор запретил публиковать записи гостям.

Php скрипты для esp8266 02 Окт 2016 20:48 #14997

  • kotbrs
  • kotbrs аватар
  • Не в сети
  • Новый участник
  • Сообщений: 10
  • Репутация: 0
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

  • kotbrs
  • kotbrs аватар
  • Не в сети
  • Новый участник
  • Сообщений: 10
  • Репутация: 0
На сегодня скрипты переделал, поскольку ESP стало много и их адреса передаю одному скрипту в параметрах. Вообще забросил этот метод, перешел на Majordomo. www.smartliving.ru - там за нас уже всё придумали - рекомендую.
Администратор запретил публиковать записи гостям.

Php скрипты для esp8266 02 Окт 2016 23:19 #15000

  • perers
  • perers аватар
  • Не в сети
  • Новый участник
  • Сообщений: 17
  • Репутация: 0
Да действительно, спасибо большое. По поводу Majordomo поставил, попробовал не получилось, кажется навороченным. Нужно ещепробовать.
Администратор запретил публиковать записи гостям.

Php скрипты для esp8266 03 Окт 2016 08:23 #15003

  • perers
  • perers аватар
  • Не в сети
  • Новый участник
  • Сообщений: 17
  • Репутация: 0
Доброго, поделитесь скриптом который у Вас на сег день, которые переделаны? Спасибо.
Администратор запретил публиковать записи гостям.

Php скрипты для esp8266 03 Окт 2016 15:03 #15005

  • kotbrs
  • kotbrs аватар
  • Не в сети
  • Новый участник
  • Сообщений: 10
  • Репутация: 0
Вот что имеем:

У меня это крутится на 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-&gt;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 =
            '&lt;p&gt;&lt;strong&gt;MySQL error&lt;/strong&gt; in file &lt;strong&gt;'.$trace[$level]['file'].'&lt;/strong&gt;'.
            " at line &lt;strong&gt;" .$trace[$level]['line']."&lt;/strong&gt;
            (function &lt;strong&gt;" . $trace[$level]['function'] ."&lt;/strong&gt;):&lt;br/&gt;"
            ."\n&lt;span style='color:blue'&gt;$db_error&lt;/span&gt;\n\n&lt;pre&gt;$sql&lt;/pre&gt;&lt;/p&gt;";
        die($message);
    }
}

function mysql_substitute($sql, $substitutions) {
     // Чтобы следующая метка не могла затронуть содержание предыдущей,
     // например, в случае $subst = array('id' =&gt; 5, 'title' =&gt; 'а тут :id'),
     // проводить их замену приходится не по очереди через простой foreach,
     // а за один вызов заменяющий функции,
     // для чего нужно составить регулярное выражение, охватывающее
     // все метки. Впрочем, это несложно.
     // О производительности здесь беспокоиться не будем,
     // т.к. запрос - это довольно короткая строка, поэтому он
     // будет обработан быстро в любом случае.

     $regexp = '/:(';
     foreach ($substitutions as $key =&gt; $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-&gt;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-&gt;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 =&gt; $value)
               $sql .= "`$key` = :$key, ";

          $sql = substr($sql, 0, -2); // убираем запятую и пробел

          $result = mysql_q($sql, $data);

          $out = ($mysqli)
               ? $mysqli-&gt;insert_id
               : mysql_insert_id();
     }

     else { // UPDATE или INSERT ON DUPLICATE KEY UPDATE

          if (!is_array($unique_key))                  // если указана скалярная величина -
               $unique_key = array('id' =&gt; $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 =&gt; $value)
                    $sql .= "`$key` = " . mysql_escape($value) . ", ";

               $sql = substr($sql, 0, -2); // убираем запятую и пробел

               if ($unique_key) {

                    $sql .= " WHERE ";

                    foreach ($unique_key as $key =&gt; $value)
                         $sql .= " `$key` = " . mysql_escape($value) . " AND ";

                    $sql = substr($sql, 0, -4); // убираем последний AND и пробел
               }

               $result = mysql_q($sql);

               $out = ($mysqli)
                      ? $mysqli-&gt;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 =&gt; $value)
                    $sql .= "`$key` = :$key, ";
               $sql = substr($sql, 0, -2); // убираем запятую и пробел


               if ($data_to_update) {
                    $sql .= " ON DUPLICATE KEY UPDATE " ;
                    foreach ($data_to_update as $key =&gt; $value)
                         $sql .= " `$key` = :$key, ";
                    $sql = substr($sql, 0, -2); // убираем запятую и пробел
               }

               $result = mysql_q($sql, $all_data);

               // Т.к. запрос INSERT - возвращает LAST_INSERT_ID()

               $out = ($mysqli)
                      ? $mysqli-&gt;insert_id
                  : mysql_insert_id();
          }
     }

     return $out;
}

?>

Почему столько скриптов - я хотел чтоб можно было добавлять только IP адреса ESP в одно место и не париться правкой в нескольких местах. Кроме того MySQL не понимает использование в качестве имен полей каких-то переменных, а при считывании данных с ESP мы заранее не прописываем какие там сенсоры будут. Вот для этого и нужна подключаемая функция.

Далее из базы стандартными способами вытаскиваем данные и используем где нам надо - строим графики, вставляем данные в html и т.п.

Сам ни разу не программист, всё это искал в сети и приспосабливал под свою задачу.
Администратор запретил публиковать записи гостям.
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
Модераторы: FlyRouter, Dolfik
Время создания страницы: 0.144 секунд

Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.