Помогите с кодом (с логикой) пожалуйста

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

Модератор: immortal

John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Сб май 08, 2021 12:41 pm

Безмерно Вам благодарен!!!!

На дальнейшие улучшения логики отопления у меня фантазии уже не хватает. Замерять среднюю температуру по дому совсем не логично, покомнатная регулировка не будет работать пока не поставлю электроклапаны на гребенки.
Когда-нибудь можно будет вывести управление отоплением на отдельную сцену и управлять контурами каждого радиатора по разным условиям, но такому я пока не готов из-за недостатка устройств.

В любом случае, я Вам крайне признателен, если буду чем-то полезен - всегда обращайтесь!
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Сб май 08, 2021 11:02 pm

Не стоит благодарности. У вас количественное регулирование отопления, которое с точки зрения логики (вкл./выкл.) довольно несложно осуществляется. Еще бы вам как-то температуру подачи котла изменять (не вручную), вот тогда бы была бы полная свобода в управлении.

Касательно целесообразности покомнатного регулирования вопрос дискуссионный. Есть мнение, что держать сильно разную температуру в жилых помещениях (больше 3-х градусов) нехорошо. Законы физики в виде конвекции никто не отменял. Начнут гулять сквозняки. Хотя самому на практике проверять справедливость этого мнения пока возможность не представилась.

Ничто не мешает уже сейчас поместить готовые HTML-блоки на сцены. Они будут спокойно работать не хуже, чем в меню.
На сценах, например, на плане этажа бывает дефицит места. Да и вряд целесообразно держать элементы управления системой отопления в постоянном доступе всеми желающими. Чьи-то шаловливые ручки даже без умысла обязательно заденут ту или иную кнопку, когда это совсем не требуется. Поэтому можно отображать HTML-блок с управлением элементами отопления не постоянно, а по мере необходимости.

Делается это несложно. Добавляем в класс системы отопление новое свойство, которое будет отвечать за видимость HTML-блоков по каждому объекту. Назовем его, к примеру "Visibility_1". (Такой же HTML-блок по этому же объекту может быть помещен и на другие сцены, и чтобы при отображении/скрытии его на одной сцене не происходило неожиданного отображения/скрытия его на другой сцене, для второй и последующих сцен надо будет заводить свои свойства, отвечающие за видимость: "Visibility_2", "Visibility_3" и т.д.)

Заводим на сцене небольшую индикатор-кнопку, при нажатии на которую будет отображаться/скрываться наш HTML-блок.
Opera Снимок_2021-05-08_220226_127.0.0.1.png
Opera Снимок_2021-05-08_220226_127.0.0.1.png (26.72 КБ) 2386 просмотров
Opera Снимок_2021-05-08_220109_127.0.0.1.png
Opera Снимок_2021-05-08_220109_127.0.0.1.png (43.21 КБ) 2386 просмотров
Эту кнопку тоже можно завести HTML-блоком.

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

<style type="text/css">
.gorizontalno {
display: inline-block
}

.button:active {
  transform: scale(0.9, 0.9);
}

</style>

<div class="gorizontalno">
<div class="button">
<div style='display:%RadiatorBranch_01.Status|"block;none"%'><img src="\cms\scenes\styles\switch\i_warm_on.png" width="16" height="16"></font></div>
<div style='display:%RadiatorBranch_01.Status|"none;block"%'><img src="\cms\scenes\styles\switch\i_warm_on.png" width="16" height="16" style="background-color: yellow;"></div>
</div>
</div>
Добавляем какое-нибудь состояние (например, default).
В пункте "Выполнить при клике" указываем Код, присваивающий свойству "Visibility_1" значение "0" или "1".

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

if (gg('RadiatorBranch_01.Visibility_1') != 1) {
sg('RadiatorBranch_01.Visibility_1', 1);
} else {
sg('RadiatorBranch_01.Visibility_1', 0);
}
Теперь, собственно, наш отображаемый/скрываемый HTML-блок. Заводим у него два состояния: "visible" и "hidden". Указываем для состояний простые условия отображения. Для "visible" это будет "Visibility_1" = 1. А для "hidden" я всегда писал "<>1". Однако сейчас почему-то так не заработало. Заработало если указать "= пустое значение".
Opera Снимок_2021-05-08_220325_127.0.0.1.png
Opera Снимок_2021-05-08_220325_127.0.0.1.png (15.82 КБ) 2386 просмотров


Еще можно придумать сбор разной статистики. Например, если вы у объектов насосов включили историю у свойства "Status", то отслеживать интенсивность использования насосов можно не только на графиках или заглядывая непосредственно в историю свойства. Думается, что несложно будет организовать почти любую аналитику. Например, подсчитывать, сколько раз включался насос за последние сутки или как долго работал насос за это время.
Много всего можно придумать. Главное понять, что было бы интересно и полезно знать/наблюдать.
За это сообщение автора Chainik поблагодарил:
John (Сб май 08, 2021 11:39 pm)
Рейтинг: 1.16%
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Сб май 08, 2021 11:39 pm

Отличная идея!

Теперь займусь прорисовкой поэтажных планов, чтобы было куда вставлять html блоки.
Аналитика это тоже очень полезная штука, очень интересно смотреть сколько насос проработал в день.
И еще один очень полезный информер это сколько вся эта система потребляет электричества., сегодня поставлю на линию бойлерной однофазный счетчик и попробую прикрутить к MDM
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Вс май 09, 2021 1:01 pm

Ночью температура упала ниже 8 градусов и система отработала прекрасно! )))
На скорую руку прикрутил электросчетчик на линию бойлерной.
123.jpg
123.jpg (146.03 КБ) 2348 просмотров
Осталось разбить показания на дневные и ночные и подсчитать их в день и месяц.
Через ПУ это делать совсем не удобно, может есть готовые решения?
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Вс май 09, 2021 10:11 pm

Отлично, что все работает! Практика -- критерий истины.
Как раз надо внимательно понаблюдать, вдруг где-то еще обнаружатся логические косяки и недоработки. Надо понять, что удобно, что неудобно, чего не хватает.

Что касается анализа и статистики, то практически все уже сделано за нас. Вот добрые люди в лице ув.xor пишут для нас, чайников функции и подробно все разъясняют (https://connect.smartliving.ru/profile/ ... omili.html).
Я подумаю, как это удобнее будет использовать, но то что это будет работать, нет никаких сомнений.

Касательно статистики потребления надо для начала понять, каким образом и в каком виде у вас сохраняются, данные и что это за данные. Я правильно понимаю, что показания электросчетчика сохраняются у вас в свойство нарастающим итогом (410,14, 417,25, 421,02 и т.д.)?
Затем надо понять временнЫе границы действия дневного и ночного тарифов и стомость 1 кВт/ч днем и ночью.

Мне надо пару дней на размышления... Пусть пока копится статистика.
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Пн май 10, 2021 1:23 am

Да, именно так.
Счетчик подключен по Modbus и с некоторой периодичностью с него снимаются показания и сохраняются в свойство
Я уже пробовал что-то изобразить, найдя похожий пример где-то на просторах форума, но все это работает не совсем правильно, да и высчитать дневные и месячные значения так и не получилось. Создавать два разных объекта SCounter, один на дневные значения, один на ночные, считаю не очень правильно.

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

if(!isset($params['NEW_VALUE'])||( $params['NEW_VALUE']<=0)) return; //не установлено (нулл) или меньше и равно 0 -- выходим
$this->setProperty('value', round($params['NEW_VALUE']/100, 2));

if (timeBetween('07:00', '23:00')) {
$this->setProperty('dayvalue', round($params['NEW_VALUE']/100, 2));
} else {
$this->setProperty('nightvalue', round($params['NEW_VALUE']/100, 2));
}

$min_dayday=getHistoryMin($this->object_title . '.dayvalue', strtotime(date("Y-m-d")." 00:00:00"), strtotime(date("Y-m-d")." 23:59:59"));
$max_dayday=getHistoryMax($this->object_title . '.dayvalue', strtotime(date("Y-m-d")." 00:00:00"), strtotime(date("Y-m-d")." 23:59:59"));
$count_dayday=$max_dayday-$min_dayday;

$min_daynight=getHistoryMin($this->object_title . '.nightvalue', strtotime(date("Y-m-d")." 00:00:00"), strtotime(date("Y-m-d")." 23:59:59"));
$max_daynight=getHistoryMax($this->object_title . '.nightvalue', strtotime(date("Y-m-d")." 00:00:00"), strtotime(date("Y-m-d")." 23:59:59"));
$count_daynight=$max_daynight-$min_daynight;

$this->setProperty('dayvalueDay', $count_dayday);
$this->setProperty('nightvalueDay', $count_daynight);
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Chainik » Пн май 10, 2021 1:53 am

А с какой периодичностью пишутся показания?
Нам ведь надо сделать, насколько я понимаю, несложную по сути вещь. Получить из истории показания на 23:00 и на 07:00. Сделать разность. Таким образом мы узнаем расход по дневному тарифу. Разность между показаниями на 07:00 и 23:00 даст нам расход по ночному тарифу. Разность между показаниями на конец и начало дня даст дневной расход.

Что касается работы насосов, то мы из истории свойства насосов "Status" знаем, как они работали. Знать бы "прожорливость" каждого насоса (например, сколько он "кушает" в час) и тогда расчетным путем несложно будет посчитать его потребление за сутки. Также несложно посчитать количество включений насоса за сутки.
Вот такие соображения.

Пробежался глазами по вашему коду. На первый взгляд, он вполне рабочий. В чем же ошибочность значений, которые считаются данным кодом?
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Пн май 10, 2021 2:21 pm

Периодичность показаний можно выставить по своему усмотрению, сейчас данные запрашиваются каждые 20 сек.
Код в целом рабочий, есть небольшие косяки по логике, я его разобью на несколько методов (подсчет дневных кВ, ночных кВ и т.д.), которые будут срабатывать при изменении конкретных свойств объекта, эта задача не очень сложна, но...
Сейчас столкнулся с проблемой создания счетчика, аналогичного SCounters, обновляющегося в реальном времени, только чтобы количество свойств в которых считаются дневные и месячные показания было в разы больше.
кВ в день
кВ в месяц
Дневные кВ в день
Ночные кВ в день
Дневные кВ в месяц
Ночные кВ в месяц
Стоимость кВ в день
Стоимость кВ в месяц
Стоимость дневных кВ в день
Стоимость ночных кВ в день.
Стоимость дневных кВ в месяц
Стоимость ночных кВ в месяц

Но эта задача выше моих способностей.

В итоге получилась бы очень информативная система по расходу электроэнергии, если помимо бойлерной поставить аналогичные счетчики на все основные группы потребителей. Стоимость маленького однофазного счетчика на Али +- 1500 руб., подключить его к MDM несложно.

Считать расход электроэнергии по мощности потребителей не очень правильно, эта мощность может различаться в разные периоды времени, вот у насоса есть три режима работы, при переключении на первый режим, его потребление снижается в разы.
Logrus
Сообщения: 2077
Зарегистрирован: Пт апр 07, 2017 12:20 pm
Благодарил (а): 313 раз
Поблагодарили: 456 раз

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение Logrus » Пн май 10, 2021 7:53 pm

John писал(а):
Вс май 09, 2021 1:01 pm

Осталось разбить показания на дневные и ночные и подсчитать их в день и месяц.
Через ПУ это делать совсем не удобно, может есть готовые решения?
врете вы все, там даже есть пример на трех тарифный, сделать из него двух очень просто
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
John
Сообщения: 38
Зарегистрирован: Пн ноя 10, 2014 1:52 pm
Благодарил (а): 12 раз
Поблагодарили: 0

Re: Помогите с кодом (с логикой) пожалуйста

Сообщение John » Пн май 10, 2021 9:01 pm

Спасибо на добром слове!
Был бы крайне признателен за ссылку.
Ответить