[Модуль] Sonoff (dev_sonoff)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

jonni.e
Сообщения: 5
Зарегистрирован: Сб ноя 02, 2019 1:57 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение jonni.e » Пн ноя 04, 2019 9:42 pm

nick7zmail писал(а):
Вс ноя 03, 2019 12:58 pm
Систему обновите. Такое ощущение - что старая версия системы у вас.
Спасибо👍. Помогло.
jonni.e
Сообщения: 5
Зарегистрирован: Сб ноя 02, 2019 1:57 am
Благодарил (а): 2 раза
Поблагодарили: 0

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение jonni.e » Пн ноя 04, 2019 10:01 pm

fandaymon писал(а):
Пн ноя 04, 2019 2:34 am
jonni.e писал(а):
Пн ноя 04, 2019 1:53 am
nick7zmail писал(а):
Вс ноя 03, 2019 12:58 pm
Систему обновите. Такое ощущение - что старая версия системы у вас.
Семерка стоит. Ощущение что винда корявая
Старая версия Мажордомо, в которой не было функции gr
И вправду. Спасибо. Помогло.
Аватара пользователя
pdfsen
Сообщения: 65
Зарегистрирован: Вс янв 13, 2019 8:32 am
Благодарил (а): 16 раз
Поблагодарили: 0

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение pdfsen » Вт ноя 05, 2019 6:18 pm

yii писал(а):
Ср сен 25, 2019 4:29 pm
Вариантов напридумывать можно... например писать в свое свойство раз скажем в 5 минут среднее за период, тот же optimizer при выборе avg оптимизации делает именно так... я свой единственный TH прошил сейчас на tasmota, там показания по 0.1 градусу, естественно колбасит еще больше чем у вас, мне как бы пофиг на вид графика, но optimizer запускается каждую ночь, и график на уже оптимизированных данных "красивый", что не скажешь о текущих...
Может подскажете, как писать в Свойство раз в 5 минут среднее за период ?
спасибо
Аватара пользователя
yii
Сообщения: 245
Зарегистрирован: Пн апр 17, 2017 1:39 pm
Благодарил (а): 30 раз
Поблагодарили: 30 раз

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение yii » Ср ноя 06, 2019 4:32 am

pdfsen писал(а):
Вт ноя 05, 2019 6:18 pm
Может подскажете, как писать в Свойство раз в 5 минут среднее за период ?
спасибо
Ну например навскидку (если подумать, то думаю можно более оптимальнее сделать), завести свойство в котором будет храниться расчетное значение и именно его отображать везде где нужно. Завести два свойства, обоим на старте поставить 0. На чейнж валуе повестить скрипт который будет в первое свойство писать то что в нем есть + то что получили (в нем получится сумма всех значений), а во второе + 1 (счетчик значений, сколько измерений прошло)...

Далее если хотим писать среднее за период, скажем разв пять минут, то пишим скрипт запускающийся раз в пять минут который делит точто в накопителе значений на счетчик значений, полученное пишет в свойство с расчетным значением, счетчик и накопитель обнуляет.

Либо в тот же скрипт на чейнж валуе дописываем если счетчик >= 5 то делаем все тоже что по времени (считаем, пишем, обнуляем) в этом случае получаем среднее не по времени, а за 5 измерений

Но если бы я делал себе так, то я бы сделал чуть красивее... завел бы свойство типа rawvalue, и именно его бы привязал к саноффу, сделал бы для него метод onChange и все делал бы в нем, а конечный результат писал в стандартное value, так красивее и не надо править те места где используется валуе
Аватара пользователя
pdfsen
Сообщения: 65
Зарегистрирован: Вс янв 13, 2019 8:32 am
Благодарил (а): 16 раз
Поблагодарили: 0

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение pdfsen » Ср ноя 06, 2019 10:33 am

yii писал(а):
Ср ноя 06, 2019 4:32 am
pdfsen писал(а):
Вт ноя 05, 2019 6:18 pm
Может подскажете, как писать в Свойство раз в 5 минут среднее за период ?
спасибо
Ну например навскидку (если подумать, то думаю можно более оптимальнее сделать), завести свойство в котором будет храниться расчетное значение и именно его отображать везде где нужно. Завести два свойства, обоим на старте поставить 0. На чейнж валуе повестить скрипт который будет в первое свойство писать то что в нем есть + то что получили (в нем получится сумма всех значений), а во второе + 1 (счетчик значений, сколько измерений прошло)...

Далее если хотим писать среднее за период, скажем разв пять минут, то пишим скрипт запускающийся раз в пять минут который делит точто в накопителе значений на счетчик значений, полученное пишет в свойство с расчетным значением, счетчик и накопитель обнуляет.

Либо в тот же скрипт на чейнж валуе дописываем если счетчик >= 5 то делаем все тоже что по времени (считаем, пишем, обнуляем) в этом случае получаем среднее не по времени, а за 5 измерений

Но если бы я делал себе так, то я бы сделал чуть красивее... завел бы свойство типа rawvalue, и именно его бы привязал к саноффу, сделал бы для него метод onChange и все делал бы в нем, а конечный результат писал в стандартное value, так красивее и не надо править те места где используется валуе
Идеалогия понятна.
Чтобы писать "скрипты" в "Методах" наверно надо знать язык программирования.
К сожалению не каждый владелец Можердомо знает язык.
Может у вас есть готовый текст скрипта или шаблон ?
А также, хотелось бы понимать сам процесс:
- Создать Класс
- Создать в Классе Свойство
- Создать в Классе Метод
- Создать в Классе Объекты
- В Объектах будет наследоваться Свойство, прописанное в Классе
- Создать в Объекте Метод.
- Устройства->Sonoff прописать связку моего девайса с Объектом и его Свойством.

Как тоьлко меняется значение Температуры , она автомтаически записывается в Свойство Объекта.

Хотелось бы понять сам процесс - в какой из Методов писать скрипт: в Метод Класса или Метод Объекта ?
Как понять, Метод Класса и Метод Объекта выполняются перед или после записи в Свойство Объекта ?
Аватара пользователя
nick7zmail
Сообщения: 7255
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 1886 раз

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение nick7zmail » Ср ноя 06, 2019 12:21 pm

Готового нет. Есть примеры в блогах или в базе знаний, как фильтровать температуру openweather или broadlink. Принцип тот же.
Метод вызывается после записи в свойство. Если в кратце идея такая - пишем в свойство без истории, оно запускает метод, метод решает надо ли записывать в основное свойство с историей. И пишет или не пишет в зависимости от значения.

Метод класса или объекта - без разницы. Но классовый можно написать 1 раз (у всех объектов будет он выполняться) а у объектов - у каждого придётся писать. Тут уж вам решать.

PS: Нашел пример, но там только про метод. Когда я объясняю - всем понятнее с дополнительным свойством. Как сделать - решать вам.
https://kb.mjdm.ru/filtraciya-i-okrugle ... majordomo/ вот пример если что.
За это сообщение автора nick7zmail поблагодарил:
pdfsen (Ср ноя 06, 2019 12:23 pm)
Рейтинг: 1.23%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
yii
Сообщения: 245
Зарегистрирован: Пн апр 17, 2017 1:39 pm
Благодарил (а): 30 раз
Поблагодарили: 30 раз

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение yii » Ср ноя 06, 2019 12:41 pm

Готового нет, ибо мне не надо такое, но попробую подробнее, сразу красиво:

У вас есть объект класса 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
}
Ну и задачка для факультатива: еще надо сделать проверку на count = 0, ибо если он 0, то по какой то причине данные не передавались и считать нечего, да и нельзя, ибо будет деление на 0 и скрипт завершится с ошибкой.

upd: ввиду того, что это пример уже советуют в других ветках :) факультативное задание с проверкой на 0 я выполнил за вас :)
Последний раз редактировалось yii Чт ноя 07, 2019 8:36 am, всего редактировалось 6 раз.
За это сообщение автора yii поблагодарили (всего 2):
pdfsen (Ср ноя 06, 2019 12:58 pm) • dimka137878 (Ср ноя 06, 2019 9:41 pm)
Рейтинг: 2.47%
Аватара пользователя
pdfsen
Сообщения: 65
Зарегистрирован: Вс янв 13, 2019 8:32 am
Благодарил (а): 16 раз
Поблагодарили: 0

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение pdfsen » Ср ноя 06, 2019 12:59 pm

Спасибо! :)
Буду пробовать.
Но геморой еще тот.
Проще вернуть старую версию без сокетов с периодическим опросом Sonoff.
Аватара пользователя
nick7zmail
Сообщения: 7255
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 1886 раз

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение nick7zmail » Ср ноя 06, 2019 1:20 pm

Верните, если надо. Просто закомментируйте код в цикле который между ограничителями "WEBSOCKETS POLLING" время http polling выставляется в том же файле в начале.
За это сообщение автора nick7zmail поблагодарил:
dimka137878 (Ср ноя 06, 2019 9:42 pm)
Рейтинг: 1.23%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
pdfsen
Сообщения: 65
Зарегистрирован: Вс янв 13, 2019 8:32 am
Благодарил (а): 16 раз
Поблагодарили: 0

Re: [Модуль] Sonoff (dev_sonoff)

Сообщение pdfsen » Ср ноя 06, 2019 5:24 pm

Всё сделал.
Если запускать метод вручную, то всё работает.
Но автоматом он не запускается, так как Sonoff не нравится Свойство RawValue, которое создано в Классе со ссылкой на Метод onChangeRawValue.
Sonoff почему-то создает новое Свойство с точно таким же именем.

Изображение
Ответить