USB PC thermometer

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: USB PC thermometer

Сообщение Amarok » Сб окт 05, 2013 11:39 am

Скрипт:

Код: Выделить всё

<?php

// набор данных который нужно прочесть:
//2,26,00,2013-10-01 06:47:20

$dataPath  = "v:\TEMPerUSB"; // Директория с данными 
$separator = ",";                          // Разделитель данных в файле

// бежим по директории
if ($handle = opendir($dataPath))          
{
   // Читаем файлы
   while (false !== ($entry = readdir($handle))) 
   {
      // путь к файлу
      $filePath = $dataPath . "/" . $entry;
      // если файл есть и является обычным файлом а не директорией то читаем содержимое
      if (file_exists($filePath) && is_file($filePath)) 
      {
         echo "Файл: " . $filePath . "<br />"; // для отладки выводим название файла в браузер.
         // открываем файл на чтение
         $file = @fopen($filePath, "r"); 
         // читаем файл до канца построчно
         while (!feof($file))
         {
            // читаем строку 
            $currentLine = fgets($file);
            echo $currentLine . "<br />";
            // разбиваем строку на переменные с данными
            list($DataNumber, $TempInteger, $TempRatio, $TempDate) = explode($separator, $currentLine);
            // склеиваем целую и дробную часть температуры 
            $Temp = $TempInteger . "." . $TempRatio;
            // удаляем лишние пробелы в начале и в конце
            $Date = trim($TempDate);
            //Выводим данные в браузер    
            echo "№: " . $DataNumber . " Температура: " . $Temp . " Дата снятия показаний: " . $Date . "<br />";
            echo "<br />";
         } 
         //закрываем файл
         fclose($file);
       }
       
       echo "<br />";
    }
    // закрываем директорию
    closedir($handle);
        setGlobal('AmarokLair.Temperature',$Temp);

}
else
{
    echo "Немогу открыть директорию";
}

?>
работает но, выдает ошибку

Код: Выделить всё

Fatal error: Call to undefined function setGlobal() in D:\_majordomo\htdocs\lt.php on line 47
Странно(((((
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: USB PC thermometer

Сообщение Amarok » Сб окт 05, 2013 11:41 am

Строчка №47 и есть setGlobal('AmarokLair.Temperature',$Temp);
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: USB PC thermometer

Сообщение Amarok » Вс окт 06, 2013 9:28 am

BlackWarrior писал(а):Строчка №47 и есть setGlobal('AmarokLair.Temperature',$Temp);
В переменную AmarokLair.Temperature, судя по X-Ray, вписывается точка(
Моя Алиска живёт на Proxmox в Debian 12
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: USB PC thermometer

Сообщение dmw » Вс окт 06, 2013 9:38 am

Вам же Сергей сказал что оформить код нужно в виде отдельного сценария. SetGlobal() это встроенная функция MD.
Вы выполняете его отдельным php, чтобы из него передать переменную в MD нужно выпольнять http get:
http://smartliving.ru/Main/ProgramminIntegration
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: USB PC thermometer

Сообщение Amarok » Вс окт 06, 2013 10:46 am

Так я его в виде сценария и оформил. После этого в переменную AmarokLair.Temperature, судя по X-Ray, вписывается точка
Моя Алиска живёт на Proxmox в Debian 12
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: USB PC thermometer

Сообщение Amarok » Пн окт 07, 2013 10:50 am

Создал сценарий:

Код: Выделить всё

// набор данных который нужно прочесть:
//2,26,00,2013-10-01 06:47:20

$dataPath  = "v:\TEMPerUSB"; // Директория с данными 
$separator = ",";                          // Разделитель данных в файле
$file      = "";                           // имя файла

// бежим по директории
if ($handle = opendir($dataPath))          
{
   // Читаем файлы
   while (false !== ($entry = readdir($handle))) 
   {
      // путь к файлу
      $filePath = $dataPath . "/" . $entry;
      // если файл есть и является обычным файлом а не директорией то читаем содержимое
      if (file_exists($filePath) && is_file($filePath)) 
      {
         $file = $filePath; // файл.
       }
    }

    // закрываем директорию
    closedir($handle);

    // открываем файл на чтение
    $file = @fopen($file, "r"); 
    // читаем файл до конца построчно
    while (!feof($file))
    {
       // читаем строку 
       $currentLine = fgets($file);
       // разбиваем строку на переменные с данными
       list($DataNumber, $TempInteger, $TempRatio, $TempDate) = explode($separator, $currentLine);
       // склеиваем целую и дробную часть температуры 
       $Temp = $TempInteger . "." . $TempRatio;
       // удаляем лишние пробелы в начале и в конце
       $Date = trim($TempDate);
    } 
    //закрываем файл
    fclose($file);
    setGlobal('AmarokLair.Temperature',$Temp);
}
else
{
    echo "Немогу открыть директорию";
}
Выполняю его и в переменной AmarokLair.Temperature оказывается просто точка:
Изображение
Странная фигня(((
Моя Алиска живёт на Proxmox в Debian 12
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: USB PC thermometer

Сообщение dmw » Пн окт 07, 2013 11:34 am

А если пробелы убрать?
$Temp = $TempInteger.".".$TempRatio;
И эти переменные точно не пустые?
Аватара пользователя
Amarok
Сообщения: 1427
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: USB PC thermometer

Сообщение Amarok » Пн окт 07, 2013 12:11 pm

dmw писал(а):А если пробелы убрать?
$Temp = $TempInteger.".".$TempRatio;
И эти переменные точно не пустые?
Хм... Пустые...
Взял первый пример кода из темы, завернул в скрипт. Вызываю его (Запуск по ссылке: http://127.0.0.1:80/objects/?script=USBThermometer)
Смотрю лог и вижу температуру:

Код: Выделить всё

Файл: v:\TEMPerUSB/2013-10-7 15h2m54s.txt
2,23,13,2013-10-07 15:02:54 
№: 2 Температура: 23.13 Дата снятия показаний: 2013-10-07 15:02:54
Ура?! Неее. Переменная AmarokLair.Temperature содержит точку. :o
Моя Алиска живёт на Proxmox в Debian 12
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

Re: USB PC thermometer

Сообщение dmw » Пн окт 07, 2013 12:55 pm

Походу в конце файла стоит возврат каретки или пустая строка, при этом
while (!feof($file)) не увидит что был достигнут конец файла и следовательно
$currentLine = fgets($file); - попытается прочесть эту строчку и вернет пустые данные.
Попробуйте добавить проверку на корректность переменной $currentLine после чтения строки из файла.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: USB PC thermometer

Сообщение sergejey » Пн окт 07, 2013 4:36 pm

если по-быстрому, то надо строчку
$Temp = $TempInteger . "." . $TempRatio;
заменить на
if ($TempDate) {
$Temp = $TempInteger . "." . $TempRatio;
}
это исключит сохранение пустых значений

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ответить