Спасибо. Помогло.nick7zmail писал(а): ↑Вс ноя 03, 2019 12:58 pmСистему обновите. Такое ощущение - что старая версия системы у вас.
[Модуль] Sonoff (dev_sonoff)
Модератор: immortal
-
- Сообщения: 5
- Зарегистрирован: Сб ноя 02, 2019 1:57 am
- Благодарил (а): 2 раза
- Поблагодарили: 0
Re: [Модуль] Sonoff (dev_sonoff)
-
- Сообщения: 5
- Зарегистрирован: Сб ноя 02, 2019 1:57 am
- Благодарил (а): 2 раза
- Поблагодарили: 0
- pdfsen
- Сообщения: 78
- Зарегистрирован: Вс янв 13, 2019 8:32 am
- Благодарил (а): 17 раз
- Поблагодарили: 0
Re: [Модуль] Sonoff (dev_sonoff)
Может подскажете, как писать в Свойство раз в 5 минут среднее за период ?yii писал(а): ↑Ср сен 25, 2019 4:29 pmВариантов напридумывать можно... например писать в свое свойство раз скажем в 5 минут среднее за период, тот же optimizer при выборе avg оптимизации делает именно так... я свой единственный TH прошил сейчас на tasmota, там показания по 0.1 градусу, естественно колбасит еще больше чем у вас, мне как бы пофиг на вид графика, но optimizer запускается каждую ночь, и график на уже оптимизированных данных "красивый", что не скажешь о текущих...
спасибо
- yii
- Сообщения: 246
- Зарегистрирован: Пн апр 17, 2017 1:39 pm
- Благодарил (а): 30 раз
- Поблагодарили: 33 раза
Re: [Модуль] Sonoff (dev_sonoff)
Ну например навскидку (если подумать, то думаю можно более оптимальнее сделать), завести свойство в котором будет храниться расчетное значение и именно его отображать везде где нужно. Завести два свойства, обоим на старте поставить 0. На чейнж валуе повестить скрипт который будет в первое свойство писать то что в нем есть + то что получили (в нем получится сумма всех значений), а во второе + 1 (счетчик значений, сколько измерений прошло)...
Далее если хотим писать среднее за период, скажем разв пять минут, то пишим скрипт запускающийся раз в пять минут который делит точто в накопителе значений на счетчик значений, полученное пишет в свойство с расчетным значением, счетчик и накопитель обнуляет.
Либо в тот же скрипт на чейнж валуе дописываем если счетчик >= 5 то делаем все тоже что по времени (считаем, пишем, обнуляем) в этом случае получаем среднее не по времени, а за 5 измерений
Но если бы я делал себе так, то я бы сделал чуть красивее... завел бы свойство типа rawvalue, и именно его бы привязал к саноффу, сделал бы для него метод onChange и все делал бы в нем, а конечный результат писал в стандартное value, так красивее и не надо править те места где используется валуе
- pdfsen
- Сообщения: 78
- Зарегистрирован: Вс янв 13, 2019 8:32 am
- Благодарил (а): 17 раз
- Поблагодарили: 0
Re: [Модуль] Sonoff (dev_sonoff)
Идеалогия понятна.yii писал(а): ↑Ср ноя 06, 2019 4:32 amНу например навскидку (если подумать, то думаю можно более оптимальнее сделать), завести свойство в котором будет храниться расчетное значение и именно его отображать везде где нужно. Завести два свойства, обоим на старте поставить 0. На чейнж валуе повестить скрипт который будет в первое свойство писать то что в нем есть + то что получили (в нем получится сумма всех значений), а во второе + 1 (счетчик значений, сколько измерений прошло)...
Далее если хотим писать среднее за период, скажем разв пять минут, то пишим скрипт запускающийся раз в пять минут который делит точто в накопителе значений на счетчик значений, полученное пишет в свойство с расчетным значением, счетчик и накопитель обнуляет.
Либо в тот же скрипт на чейнж валуе дописываем если счетчик >= 5 то делаем все тоже что по времени (считаем, пишем, обнуляем) в этом случае получаем среднее не по времени, а за 5 измерений
Но если бы я делал себе так, то я бы сделал чуть красивее... завел бы свойство типа rawvalue, и именно его бы привязал к саноффу, сделал бы для него метод onChange и все делал бы в нем, а конечный результат писал в стандартное value, так красивее и не надо править те места где используется валуе
Чтобы писать "скрипты" в "Методах" наверно надо знать язык программирования.
К сожалению не каждый владелец Можердомо знает язык.
Может у вас есть готовый текст скрипта или шаблон ?
А также, хотелось бы понимать сам процесс:
- Создать Класс
- Создать в Классе Свойство
- Создать в Классе Метод
- Создать в Классе Объекты
- В Объектах будет наследоваться Свойство, прописанное в Классе
- Создать в Объекте Метод.
- Устройства->Sonoff прописать связку моего девайса с Объектом и его Свойством.
Как тоьлко меняется значение Температуры , она автомтаически записывается в Свойство Объекта.
Хотелось бы понять сам процесс - в какой из Методов писать скрипт: в Метод Класса или Метод Объекта ?
Как понять, Метод Класса и Метод Объекта выполняются перед или после записи в Свойство Объекта ?
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: [Модуль] Sonoff (dev_sonoff)
Готового нет. Есть примеры в блогах или в базе знаний, как фильтровать температуру openweather или broadlink. Принцип тот же.
Метод вызывается после записи в свойство. Если в кратце идея такая - пишем в свойство без истории, оно запускает метод, метод решает надо ли записывать в основное свойство с историей. И пишет или не пишет в зависимости от значения.
Метод класса или объекта - без разницы. Но классовый можно написать 1 раз (у всех объектов будет он выполняться) а у объектов - у каждого придётся писать. Тут уж вам решать.
PS: Нашел пример, но там только про метод. Когда я объясняю - всем понятнее с дополнительным свойством. Как сделать - решать вам.
https://kb.mjdm.ru/filtraciya-i-okrugle ... majordomo/ вот пример если что.
Метод вызывается после записи в свойство. Если в кратце идея такая - пишем в свойство без истории, оно запускает метод, метод решает надо ли записывать в основное свойство с историей. И пишет или не пишет в зависимости от значения.
Метод класса или объекта - без разницы. Но классовый можно написать 1 раз (у всех объектов будет он выполняться) а у объектов - у каждого придётся писать. Тут уж вам решать.
PS: Нашел пример, но там только про метод. Когда я объясняю - всем понятнее с дополнительным свойством. Как сделать - решать вам.
https://kb.mjdm.ru/filtraciya-i-okrugle ... majordomo/ вот пример если что.
- За это сообщение автора nick7zmail поблагодарил:
- pdfsen (Ср ноя 06, 2019 12:23 pm)
- Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
- yii
- Сообщения: 246
- Зарегистрирован: Пн апр 17, 2017 1:39 pm
- Благодарил (а): 30 раз
- Поблагодарили: 33 раза
Re: [Модуль] Sonoff (dev_sonoff)
Готового нет, ибо мне не надо такое, но попробую подробнее, сразу красиво:
У вас есть объект класса STempSensors с именем MyTempSensor, у которого свойство value привязано к sonoff, вы его отображаете на сценах, строите графики итд.
Создаете у этого объекта 2 свойства SumTemp и CountVal
Создаете у класса STempSensors новый метод onChangeRawValue и новое свойство RawValue, при создании свойства RawValue в поле "Запускать метод при изменении" указываете ранее созданный метод onChangeRawValue.
В модуле sonoff привязываете к температуре RawValue вместо value.
Все 3 свойства без истории - не фиг копить мусор.
На этом вся подготовка закончена, остались скрипты:
В объекте MyTempSensor идете в методы и правите метод onChangeRawValue
Скрипт специально буду писать без всяких $this и с использованием переменных, без использования конструкцияй вида += - так не оптимально, но понятнее, разберетесь - оптимизируете
Это будет накапливать значения для расчета среднего
Теперь в сценариях:
Создаете сценарий CalcAvgTemp и в нем пишите:
Все, теперь вызываем этот сценарий каждую минуту, для этого в стандартный сценарий everyMinute добавляете в конце строчку:
Вроде ничего не пропустил...
Ну и дополнение, если кому то надо считать средне не за период времени, а надо среднее за 5 измерений, в этом случае сценарии не нужны, все делается в методе onChangeRawValue, его код будет таким
Ну и задачка для факультатива: еще надо сделать проверку на count = 0, ибо если он 0, то по какой то причине данные не передавались и считать нечего, да и нельзя, ибо будет деление на 0 и скрипт завершится с ошибкой.
upd: ввиду того, что это пример уже советуют в других ветках факультативное задание с проверкой на 0 я выполнил за вас
У вас есть объект класса STempSensors с именем MyTempSensor, у которого свойство value привязано к sonoff, вы его отображаете на сценах, строите графики итд.
Создаете у этого объекта 2 свойства SumTemp и CountVal
Создаете у класса STempSensors новый метод onChangeRawValue и новое свойство RawValue, при создании свойства RawValue в поле "Запускать метод при изменении" указываете ранее созданный метод onChangeRawValue.
В модуле sonoff привязываете к температуре RawValue вместо value.
Все 3 свойства без истории - не фиг копить мусор.
На этом вся подготовка закончена, остались скрипты:
В объекте MyTempSensor идете в методы и правите метод onChangeRawValue
Скрипт специально буду писать без всяких $this и с использованием переменных, без использования конструкцияй вида += - так не оптимально, но понятнее, разберетесь - оптимизируете
Код: Выделить всё
$SumTemp = gg('MyTempSensor.SumTemp') + gg('MyTempSensor.RawValue'); // читаем в переменную текущую сумму и добавляем к ней текущее значение
$CountVal = gg('MyTempSensor.CountVal') + 1; // читаем в переменную текущий счетчик и увеличиваем его на 1
sg('MyTempSensor.SumTemp',$SumTemp); // сохраняем новое значение суммы
sg('MyTempSensor.CountVal',$CountVal); // сохраняем новое значение счетчика
Теперь в сценариях:
Создаете сценарий CalcAvgTemp и в нем пишите:
Код: Выделить всё
if (date("i", time()) % 5) return; // если значение минут не кратно 5, то скрипт прервется
$CountVal = gg('MyTempSensor.CountVal'); // читаем текущее значение счетчика
if ($CountVal == 0) return; // прерываем скрипт если счетчик значений 0, так как считать нечего
$SumTemp = gg('MyTempSensor.SumTemp'); // читаем текущее значение суммы
sg('MyTempSensor.SumTemp',0); // обнуляем сумму
sg('MyTempSensor.CountVal',0); // обнуляем счетчик
$Temp = $SumTemp / $CountVal; // считаем среднее
$Temp = round($Temp,1); // округляем до одного знака после запятой
sg('MyTempSensor.value',$Temp); // пишим среднее значение в value
Все, теперь вызываем этот сценарий каждую минуту, для этого в стандартный сценарий everyMinute добавляете в конце строчку:
Код: Выделить всё
runScript('CalcAvgTemp'); // запускаем скрипт
Ну и дополнение, если кому то надо считать средне не за период времени, а надо среднее за 5 измерений, в этом случае сценарии не нужны, все делается в методе onChangeRawValue, его код будет таким
Код: Выделить всё
$SumTemp = gg('MyTempSensor.SumTemp') + gg('MyTempSensor.RawValue'); // читаем в переменную текущую сумму и добавляем к ней текущее значение
$CountVal = gg('MyTempSensor.CountVal') + 1; // читаем в переменную текущий счетчик и увеличиваем его на 1
sg('MyTempSensor.SumTemp',$SumTemp); // сохраняем новое значение суммы
sg('MyTempSensor.CountVal',$CountVal); // сохраняем новое значение счетчика
if ($CountVal >=5) { // проверяем что мы сделали 5 и более измерении и если так то выполняем расчеты
$CountVal = gg('MyTempSensor.CountVal'); // читаем текущее значение счетчика
$SumTemp = gg('MyTempSensor.SumTemp'); // читаем текущее значение суммы
sg('MyTempSensor.SumTemp',0); // обнуляем сумму
sg('MyTempSensor.CountVal',0); // обнуляем счетчик
$Temp = $SumTemp / $CountVal; // считаем среднее
$Temp = round($Temp,1); // округляем до одного знака после запятой
sg('MyTempSensor.value',$Temp); // пишим среднее значение в value
}
upd: ввиду того, что это пример уже советуют в других ветках факультативное задание с проверкой на 0 я выполнил за вас
Последний раз редактировалось yii Чт ноя 07, 2019 8:36 am, всего редактировалось 6 раз.
- За это сообщение автора yii поблагодарили (всего 2):
- pdfsen (Ср ноя 06, 2019 12:58 pm) • dimka137878 (Ср ноя 06, 2019 9:41 pm)
- Рейтинг: 2.33%
- pdfsen
- Сообщения: 78
- Зарегистрирован: Вс янв 13, 2019 8:32 am
- Благодарил (а): 17 раз
- Поблагодарили: 0
Re: [Модуль] Sonoff (dev_sonoff)
Спасибо!
Буду пробовать.
Но геморой еще тот.
Проще вернуть старую версию без сокетов с периодическим опросом Sonoff.
Буду пробовать.
Но геморой еще тот.
Проще вернуть старую версию без сокетов с периодическим опросом Sonoff.
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: [Модуль] Sonoff (dev_sonoff)
Верните, если надо. Просто закомментируйте код в цикле который между ограничителями "WEBSOCKETS POLLING" время http polling выставляется в том же файле в начале.
- За это сообщение автора nick7zmail поблагодарил:
- dimka137878 (Ср ноя 06, 2019 9:42 pm)
- Рейтинг: 1.16%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
- pdfsen
- Сообщения: 78
- Зарегистрирован: Вс янв 13, 2019 8:32 am
- Благодарил (а): 17 раз
- Поблагодарили: 0
Re: [Модуль] Sonoff (dev_sonoff)
Всё сделал.
Если запускать метод вручную, то всё работает.
Но автоматом он не запускается, так как Sonoff не нравится Свойство RawValue, которое создано в Классе со ссылкой на Метод onChangeRawValue.
Sonoff почему-то создает новое Свойство с точно таким же именем.
Если запускать метод вручную, то всё работает.
Но автоматом он не запускается, так как Sonoff не нравится Свойство RawValue, которое создано в Классе со ссылкой на Метод onChangeRawValue.
Sonoff почему-то создает новое Свойство с точно таким же именем.