Подключение исполнительных устройств, датчиков, контроллеров.
Модератор: immortal
-
Amarok
- Сообщения: 1427
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
-
Благодарил (а):
460 раз
-
Поблагодарили:
126 раз
-
Контактная информация:
Сообщение
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 раз
-
Контактная информация:
Сообщение
Amarok » Сб окт 05, 2013 11:41 am
Строчка №47 и есть setGlobal('AmarokLair.Temperature',$Temp);
Моя Алиска живёт на Proxmox в Debian 12
-
Amarok
- Сообщения: 1427
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
-
Благодарил (а):
460 раз
-
Поблагодарили:
126 раз
-
Контактная информация:
Сообщение
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 раз
Сообщение
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 раз
-
Контактная информация:
Сообщение
Amarok » Вс окт 06, 2013 10:46 am
Так я его в виде сценария и оформил. После этого в переменную AmarokLair.Temperature, судя по X-Ray, вписывается точка
Моя Алиска живёт на Proxmox в Debian 12
-
Amarok
- Сообщения: 1427
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
-
Благодарил (а):
460 раз
-
Поблагодарили:
126 раз
-
Контактная информация:
Сообщение
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 раз
Сообщение
dmw » Пн окт 07, 2013 11:34 am
А если пробелы убрать?
$Temp = $TempInteger.".".$TempRatio;
И эти переменные точно не пустые?
-
Amarok
- Сообщения: 1427
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
-
Благодарил (а):
460 раз
-
Поблагодарили:
126 раз
-
Контактная информация:
Сообщение
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 содержит
точку.

Моя Алиска живёт на Proxmox в Debian 12
-
dmw
- Сообщения: 469
- Зарегистрирован: Вт мар 12, 2013 1:22 am
-
Благодарил (а):
41 раз
-
Поблагодарили:
81 раз
Сообщение
dmw » Пн окт 07, 2013 12:55 pm
Походу в конце файла стоит возврат каретки или пустая строка, при этом
while (!feof($file)) не увидит что был достигнут конец файла и следовательно
$currentLine = fgets($file); - попытается прочесть эту строчку и вернет пустые данные.
Попробуйте добавить проверку на корректность переменной $currentLine после чтения строки из файла.
-
sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
-
Благодарил (а):
76 раз
-
Поблагодарили:
1559 раз
-
Контактная информация:
Сообщение
sergejey » Пн окт 07, 2013 4:36 pm
если по-быстрому, то надо строчку
$Temp = $TempInteger . "." . $TempRatio;
заменить на
if ($TempDate) {
$Temp = $TempInteger . "." . $TempRatio;
}
это исключит сохранение пустых значений
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги