Страница 3 из 5

Re: Помогите с программированием формулы!

Добавлено: Пн май 25, 2015 4:04 pm
LutsenkoDenis
ну... я как бы даже пример кода привел.

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 2:15 am
Controer
И еще вопрос, получаю температуру с переменной $ESP8266009c7f19.dsw1, как взять с этой переменной минимальное и максимальное значение температуры за 1 час. Как будет писаться переменная с мин и макс температурой?

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 9:12 am
LutsenkoDenis
Если в переменной каждый раз текущая температура, то никак.
Я бы сделал так:
1. Завел бы таблицу в базе данных и сохранял туда каждый раз температуру и время снятия показаний.
2. Написал бы запрос к этой таблице, чтобы мне возвращалось минимальное, максимальное и даже среднее значение

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 1:44 pm
Controer
LutsenkoDenis писал(а):Если в переменной каждый раз текущая температура, то никак.
Я бы сделал так:
1. Завел бы таблицу в базе данных и сохранял туда каждый раз температуру и время снятия показаний.
2. Написал бы запрос к этой таблице, чтобы мне возвращалось минимальное, максимальное и даже среднее значение
В переменной каждый раз текущая температура, а как таблицу создать в базе данных, ведь я только начинающий.

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 1:54 pm
Controer
LutsenkoDenis писал(а):Думаю лучше попробовать вот так:
SPOILERSPOILER_SHOW

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

/**
 * Вычисляем скорость ветра по импульсам
 * @param double|int $newImpulseValue Новое значение импульса
 * @param double|int $oldImpulseValue Предыдущее значение импульса
 * @return double|int
 */
function GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue)
{
   $secPerImpulse = 10; // приходят каждые 10 секунд
   $impulseToWindSpeedCoeff = 0.33; //коэффициент перерасчета импульсов в скорость ветра
   
   $windSpeed = ($newImpulseValue - $oldImpulseValue) * $impulseToWindSpeedCoeff / $secPerImpulse;
   
   return $windSpeed;
}

/*
 * В параметрах метода получаю это:
 * {s:8:"PROPERTY"; s:7:"counter"; s:9:"NEW_VALUE"; s:7:"214.0"; s:9:"OLD_VALUE"; s:7:"200.0"; s:21:"ORIGINAL_OBJECT_TITLE"; s:15:"ESP8266009c7f19"; } 
 */

// получаем значение свойства counter
$counter = $this->getProperty("counter");

if (is_array($counter))
{
   //проверяем что в $counter есть елементы NEW_VALUE и OLD_VALUE и они числовые, если нет - пишем сообщение об ошибке
   if ((isset($counter["NEW_VALUE"]) && is_numeric($counter["NEW_VALUE"])) && (isset($counter["OLD_VALUE"]) && is_numeric($counter["NEW_VALUE"])))
   {
      $newImpulseValue = $counter["NEW_VALUE"]; //"214.0"; 
      $oldImpulseValue = $counter["OLD_VALUE"]; //200.0;

      $windSpeed = GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue); // Результат: 0.462
      echo $windSpeed;
      
      // записываем значение скорости ветра в свойство wind_speed
      $this->setProperty("wind_speed", $windSpeed);
   }
   else
   {
      echo "Не корректно указаны вводные параметры";
   }
}
else
{
   echo "Некорректные показания счётчика импульсов.";
   print_r($counter);
}
 

Добавил в метод этот код в MD, все равно не считает

А зачем проверять что в $counter есть числовые элементы NEW_VALUE и OLD_VALUE?
Они же приходят судя по картинке

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 1:58 pm
LutsenkoDenis
Controer писал(а):А зачем проверять что в $counter есть числовые элементы NEW_VALUE и OLD_VALUE?
Они же приходят судя по картинке
Ну во первых я не знаю откуда они приходят и в каком виде.
Во вторых я уверен на 100% что они числовые. Поэтому добавлена проверка.

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 2:36 pm
LutsenkoDenis
попробуй вот так:
SPOILERSPOILER_SHOW

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

<?php

/**
 * Вычисляем скорость ветра по импульсам
 * @param double|int $newImpulseValue Новое значение импульса
 * @param double|int $oldImpulseValue Предыдущее значение импульса
 * @return double|int
 */
function GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue)
{
   $secPerImpulse = 10; // приходят каждые 10 секунд
   $impulseToWindSpeedCoeff = 0.33; //коэффициент перерасчета импульсов в скорость ветра
   
   $windSpeed = (($newImpulseValue - $oldImpulseValue) * $impulseToWindSpeedCoeff) / $secPerImpulse;
   
   return $windSpeed;
}

/*
 * В параметрах метода получаю это:
 * {s:8:"PROPERTY"; s:7:"counter"; s:9:"NEW_VALUE"; s:7:"214.0"; s:9:"OLD_VALUE"; s:7:"200.0"; s:21:"ORIGINAL_OBJECT_TITLE"; s:15:"ESP8266009c7f19"; } 
 */

// получаем значение свойства counter
$obj = getObject("ESP8266009c7f19");
$newImpulseValue = $obj->getProperty("NEW_VALUE"); //"214.0";
$oldImpulseValue = $obj->getProperty("OLD_VALUE"); //200.0;

//проверяем что в $counter есть елемент NEW_VALUE и OLD_VALUE, если нет - пишем сообщение об ошибке
if (is_numeric($newImpulseValue) && is_numeric($oldImpulseValue))
{
      $windSpeed = GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue); // Результат: 0.462
      echo $windSpeed;
      
      // записываем значение скорости ветра в свойство wind_speed
      $this->setProperty("wind_speed", $windSpeed);
      echo "OK";
}
else
{
   echo "Некорректные показания счётчика импульсов.";
   print_r($obj);
}
?>
В коде есть такая конструкция $this->setProperty("wind_speed", $windSpeed);
$this - это к чему относится у тебя?

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 2:49 pm
LutsenkoDenis
вдогонку к вопросу зачем проверка:
метод getProperty($property) возвращает из таблицы pvalues содержимое поля VALUE, у которого тип TEXT. Т.е это всегда текстовое значение, в не зависимости от того что там внутри.. туда при желании можно содержимое pdf файла записать или еще много чего.

Поэтому проверка нужна всегда.

Таблицу создать как оказалось не надо, в настройках класса можно указать количество дней, за которые будет храниться история. Можно брать данные от туда.

Re: Помогите с программированием формулы!

Добавлено: Вт май 26, 2015 10:12 pm
Controer
LutsenkoDenis писал(а):попробуй вот так:
SPOILERSPOILER_SHOW

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

<?php

/**
 * Вычисляем скорость ветра по импульсам
 * @param double|int $newImpulseValue Новое значение импульса
 * @param double|int $oldImpulseValue Предыдущее значение импульса
 * @return double|int
 */
function GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue)
{
   $secPerImpulse = 10; // приходят каждые 10 секунд
   $impulseToWindSpeedCoeff = 0.33; //коэффициент перерасчета импульсов в скорость ветра
   
   $windSpeed = (($newImpulseValue - $oldImpulseValue) * $impulseToWindSpeedCoeff) / $secPerImpulse;
   
   return $windSpeed;
}

/*
 * В параметрах метода получаю это:
 * {s:8:"PROPERTY"; s:7:"counter"; s:9:"NEW_VALUE"; s:7:"214.0"; s:9:"OLD_VALUE"; s:7:"200.0"; s:21:"ORIGINAL_OBJECT_TITLE"; s:15:"ESP8266009c7f19"; } 
 */

// получаем значение свойства counter
$obj = getObject("ESP8266009c7f19");
$newImpulseValue = $obj->getProperty("NEW_VALUE"); //"214.0";
$oldImpulseValue = $obj->getProperty("OLD_VALUE"); //200.0;

//проверяем что в $counter есть елемент NEW_VALUE и OLD_VALUE, если нет - пишем сообщение об ошибке
if (is_numeric($newImpulseValue) && is_numeric($oldImpulseValue))
{
      $windSpeed = GetWindSpeedByImpulse($newImpulseValue, $oldImpulseValue); // Результат: 0.462
      echo $windSpeed;
      
      // записываем значение скорости ветра в свойство wind_speed
      $this->setProperty("wind_speed", $windSpeed);
      echo "OK";
}
else
{
   echo "Некорректные показания счётчика импульсов.";
   print_r($obj);
}
?>
В коде есть такая конструкция $this->setProperty("wind_speed", $windSpeed);
$this - это к чему относится у тебя?
К сожалению не работает ваш код, а где переменная $counter, с которой приходят импульсы


Может что то не так в программе. У меня такой принцип получения данных о ветре.
WiFi модуль ESP8266 передает импульсы датчика ветра на Mojordomo в виде переменной $counter.
Создал 2 свойства:
1. counter - количество импульсов с датчика ветра, в поле Запускать метод при изменении wind_check
2. wind_speed - значение скорости ветра
Создал метод:wind_check

Что пишем в коде метода? :
Мне нужно от текущего показания переменной $counter вычесть предыдущее показание $counter, чтобы получилась разница. А дальше я сам формулу рассчитаю.

Re: Помогите с программированием формулы!

Добавлено: Ср май 27, 2015 9:47 am
LutsenkoDenis
что-то я уже совсем ничего не понимаю :((
Можешь сделать экспорт класса с методами и прислать, чтобы я на своей машине смог протестить?