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

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Пн май 25, 2015 4:04 pm

ну... я как бы даже пример кода привел.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Controer
Сообщения: 44
Зарегистрирован: Чт апр 09, 2015 8:09 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

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

Сообщение Controer » Вт май 26, 2015 2:15 am

И еще вопрос, получаю температуру с переменной $ESP8266009c7f19.dsw1, как взять с этой переменной минимальное и максимальное значение температуры за 1 час. Как будет писаться переменная с мин и макс температурой?
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Вт май 26, 2015 9:12 am

Если в переменной каждый раз текущая температура, то никак.
Я бы сделал так:
1. Завел бы таблицу в базе данных и сохранял туда каждый раз температуру и время снятия показаний.
2. Написал бы запрос к этой таблице, чтобы мне возвращалось минимальное, максимальное и даже среднее значение
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Controer
Сообщения: 44
Зарегистрирован: Чт апр 09, 2015 8:09 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

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

Сообщение Controer » Вт май 26, 2015 1:44 pm

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

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

Сообщение Controer » Вт май 26, 2015 1:54 pm

LutsenkoDenis писал(а):Думаю лучше попробовать вот так:
СпойлерПоказать

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

/**
 * Вычисляем скорость ветра по импульсам
 * @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?
Они же приходят судя по картинке
Вложения
Метод wind_Check.png
Ведь здесь текущие и предыдущие показания есть?
Метод wind_Check.png (13.76 КБ) 6556 просмотров
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Вт май 26, 2015 1:58 pm

Controer писал(а):А зачем проверять что в $counter есть числовые элементы NEW_VALUE и OLD_VALUE?
Они же приходят судя по картинке
Ну во первых я не знаю откуда они приходят и в каком виде.
Во вторых я уверен на 100% что они числовые. Поэтому добавлена проверка.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Вт май 26, 2015 2:36 pm

попробуй вот так:
СпойлерПоказать

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

<?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 - это к чему относится у тебя?
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Вт май 26, 2015 2:49 pm

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

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

Таблицу создать как оказалось не надо, в настройках класса можно указать количество дней, за которые будет храниться история. Можно брать данные от туда.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Controer
Сообщения: 44
Зарегистрирован: Чт апр 09, 2015 8:09 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

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

Сообщение Controer » Вт май 26, 2015 10:12 pm

LutsenkoDenis писал(а):попробуй вот так:
СпойлерПоказать

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

<?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, чтобы получилась разница. А дальше я сам формулу рассчитаю.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

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

Сообщение LutsenkoDenis » Ср май 27, 2015 9:47 am

что-то я уже совсем ничего не понимаю :((
Можешь сделать экспорт класса с методами и прислать, чтобы я на своей машине смог протестить?
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Ответить