Очень интересно, но ничего непонятно!

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
nail
Сообщения: 292
Зарегистрирован: 07 окт 2018, 18:03

Re: Очень интересно, но ничего непонятно!

Сообщение nail » 03 апр 2021, 22:37

Кажется что то не сработало относительно температуры в доме?

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

if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',47);
и

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

if ($TempHouse > 26) {sg('Boiler1.targetTemp',45);
Вложения
Screenshot_21.jpg
Screenshot_21.jpg (92.71 КБ) 1389 просмотров
Screenshot_20.jpg
Screenshot_20.jpg (69.72 КБ) 1389 просмотров

floop
Сообщения: 76
Зарегистрирован: 13 июл 2020, 19:57

Re: Очень интересно, но ничего непонятно!

Сообщение floop » 03 апр 2021, 23:16

Можно попробовать брать не текущую температуру, а среднюю за минуту или две, например.
Я не работал с мажордомо, но вижу что у них в документации описана такая возможность.

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

getHistoryValue($varname, $start_time, $stop_time) -- Возвращает среднее значений за период
У меня под рукой нет системы, я не могу проверить на ошибки. Но что-то такое должно быть, мне кажется:

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

$historyStartTime = strtotime('-1 minute'); # За какой период брать данные.

define('HOST', '192.168.0.14'); # Адрес контроллера
define('PASS', 'sec');          # Пароль контроллера
define('PORT', 30);             # Порт контроллера

if ( $historyStartTime ) { # если указан интервал, то берутся средние значение за интервал
    $indoor = getHistoryAvg("Sensor_temphum01.value", $historyStartTime); # cреднее за время
    $outdoor = getHistoryAvg("Sensor_temp07.value", $historyStartTime); # cреднее за время 
} else { # иначе, берутся текущие значения
    $outdoor = gg('Sensor_temp07.value');   # Получаем текущие значения
    $indoor = gg('Sensor_temphum01.value'); # Получаем значения
}

if ( gg('Boiler1.status') != 1) return; # если бойлер выключен, не продолжаем

#если в переменных оказались не числа, не продолжаем.
if ( !preg_match ( "/[0-9.]+/" , $outdoor) or !preg_match ( "/[0-9.]d+/" , $indoor) ) return; 

function setTemp( $target ) {
    if ( gg('Boiler1.targetTemp') == $target ) return; # если уже установлено, не продолжаем
    sg('Boiler1.targetTemp', $target);
    file_get_contents('http://' . HOST . '/' . PASS . '/?pt=' . PORT . '&misc=' . $target);
}

if ( $outdoor < -15 ) {         # Если на улице ниже -15
    if ( $indoor > 25 ) {       #   если дома выше 25
        setTemp(55);            #       cтавим 55 
    } elseif ( $indoor < 23 ){  #   иначе, если ниже 23
        setTemp(65);            #       ставим 65
    } else {                    #   иначе 
        setTemp(60);            #       ставим 60
    }
} elseif ( $outdoor < -5 ) {    # иначе, если на улице ниже -5
    if ( $indoor > 25 ) {       #   если дома выше 25
        setTemp(47);            #       ставим 47
    } elseif ( $indoor < 23 ){  #   иначе, если ниже 23
        setTemp(60);            #       ставим 60
    } else {                    #   иначе, 
        setTemp(55);            #       ставим 55
    }
} elseif ( $outdoor < 5 ) {     # иначе, если на улице ниже 5
    if ( $indoor > 25 ) {       #    если дома выше 25
        setTemp(45);            #        cтавим 45
    } elseif ( $indoor < 23 ){  #    иначе, если ниже 23
        setTemp(50);            #        ставим 50
    } else {                    #    иначе, 
        setTemp(47);            #        ставим 47
    }
} elseif ( $outdoor > 4 ) {     # иначе, если на улице выше 4
    if ( $indoor > 25 ) {       #    если дома выше 25
        setTemp(30);            #        ставим 30
    } elseif ( $indoor < 23 ){  #    иначе, если ниже 23
        setTemp(40);            #        ставим 40
    } else {                    #    иначе, 
        setTemp(35);            #        ставим 35
    }
}    
Попробуйте. Вдруг поможет
Интервал можно увеличивать, изменяя $historyStartTime. Либо закоментировать, тогда будут браться текущие значения

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 04 апр 2021, 00:16

nail писал(а):
03 апр 2021, 22:37
Кажется что то не сработало относительно температуры в доме?

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

if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',47);
и

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

if ($TempHouse > 26) {sg('Boiler1.targetTemp',45);
Пока температура в доме не попала в диапазон >= 23 && <= 25 градусов (а на картинке она у вас вне этого диапазона), нельзя сказать, что не сработало.
Другое дело, трудно сказать, почему целевая температура у вас 42 градуса, если, конечно, вы ее не выставляли "вручную".
floop прав относительно того, что колебания температур из-за погрешностей измерения можно снизить, усредняя значения:

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

$TempOutDoor = getHistoryValue('Sensor_temp07.value', strtotime("-20 minute"));
$TempHouse = getHistoryValue('Sensor_temphum01.value, strtotime("-20 minute"));
Только я бы брал более длинный период. Скажем, данные за последние 20 минут.

nail
Сообщения: 292
Зарегистрирован: 07 окт 2018, 18:03

Re: Очень интересно, но ничего непонятно!

Сообщение nail » 19 апр 2021, 18:03

Ruslan писал(а):
04 апр 2021, 00:16
floop прав относительно того, что колебания температур из-за погрешностей измерения можно снизить, усредняя значения:

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

$TempOutDoor = getHistoryValue('Sensor_temp07.value', strtotime("-20 minute"));
$TempHouse = getHistoryValue('Sensor_temphum01.value, strtotime("-20 minute"));
Только я бы брал более длинный период. Скажем, данные за последние 20 минут.
и так вроде тесты показали , работа термостата работает нормально, без дерганий. Тестируем дальше.

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

if (gg('Boiler1.termostatActiveted') == 1) {
$TempOutDoor = getHistoryValue('Sensor_temp07.value', strtotime("-20 minute"));
$TempHouse = getHistoryValue('Sensor_temphum01.value', strtotime("-20 minute"));
$targetTemp = gg('Boiler1.targetTemp');

//при температуре на улице от -25 до -15
if ($TempOutDoor >= -25 && $TempOutDoor < -16) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',65);
    if ($targetTemp == 65) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=65");}
if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',60);
    if ($targetTemp == 60) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=60");}

if ($TempHouse > 26) {sg('Boiler1.targetTemp',55);
    if ($targetTemp == 55) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=55");
}
}


//при температуре на улице -15 до -5
if ($TempOutDoor >= -14 && $TempOutDoor < -6) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',60);
    if ($targetTemp == 60) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=60");
}
if ($TempHouse >= 23 && $TempHouse <= 25) { sg('Boiler1.targetTemp',55);
    if ($targetTemp == 55) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=55");
}
if ($TempHouse > 26) {sg('Boiler1.targetTemp',47);
    if ($targetTemp == 47) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=47");
}
}

//при температуре на улице -5 до +5
if ($TempOutDoor >= -4 && $TempOutDoor < 4) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',50);
    if ($targetTemp == 50) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=50");
}
if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',47);
    if ($targetTemp == 47) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=47");
}
if ($TempHouse > 26) {sg('Boiler1.targetTemp',45);
    if ($targetTemp == 45) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=45");
}
}

//при температуре на улице +5 до +15
if ($TempOutDoor >= 6 && $TempOutDoor < 14) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',45);
    if ($targetTemp == 45) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=45");
}
if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',42);
    if ($targetTemp == 42) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=42");
}
if ($TempHouse > 26) {sg('Boiler1.targetTemp',37);
    if ($targetTemp == 37) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=37");
}
}

}
Руслан, просьба хотелось бы дописать в коде( но не умею) , при +17 на улице(наверно будет правильно , согласно кода до +15?) , Boiler1.status=0 , т.е. автоматическое отключение отопления.
И при понижении до +- 15 примерно Boiler1.status=1

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 19 апр 2021, 18:54

Это хорошо. Значит мы угадали с "зазорами" )).

Мне все же кажется, что надо еще учитывать и температуру в помещении. Даже если на улице больше +17, а в помещении холодно, то отопление выключать преждевременно. Ну вы меня поправите, если я ошибаюсь (т.к. у вас реально функционирующий объект).
Дописал кусок кода в конце.
Смысл в следующем. Если температура на улице больше +17, в помещении -- больше +23, то выключаем отопление. Т.е. в вашем случае выставляем на Меге нереально низкую целевую температуру теплоносителя (например, 5 градусов). А поскольку реальная температура теплоносителя будет однозначно выше выставленной в Меге целевой температуры (5 градусов), контроллер не будет включать ТЭНы.

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

if (gg('Boiler1.termostatActiveted') == 1) {
$TempOutDoor = getHistoryValue('Sensor_temp07.value', strtotime("-20 minute"));
$TempHouse = getHistoryValue('Sensor_temphum01.value', strtotime("-20 minute"));
$targetTemp = gg('Boiler1.targetTemp');

//при температуре на улице от -25 до -15
if ($TempOutDoor >= -25 && $TempOutDoor < -16) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',65);
    if ($targetTemp == 65) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=65");}
if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',60);
    if ($targetTemp == 60) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=60");}

if ($TempHouse > 26) {sg('Boiler1.targetTemp',55);
    if ($targetTemp == 55) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=55");
}
}


//при температуре на улице -15 до -5
if ($TempOutDoor >= -14 && $TempOutDoor < -6) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',60);
    if ($targetTemp == 60) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=60");
}
if ($TempHouse >= 23 && $TempHouse <= 25) { sg('Boiler1.targetTemp',55);
    if ($targetTemp == 55) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=55");
}
if ($TempHouse > 26) {sg('Boiler1.targetTemp',47);
    if ($targetTemp == 47) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=47");
}
}

//при температуре на улице -5 до +5
if ($TempOutDoor >= -4 && $TempOutDoor < 4) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',50);
    if ($targetTemp == 50) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=50");
}
if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',47);
    if ($targetTemp == 47) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=47");
}
if ($TempHouse > 26) {sg('Boiler1.targetTemp',45);
    if ($targetTemp == 45) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=45");
}
}

//при температуре на улице +5 до +15
if ($TempOutDoor >= 6 && $TempOutDoor < 14) {
if ($TempHouse < 22) {sg('Boiler1.targetTemp',45);
    if ($targetTemp == 45) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=45");
}
if ($TempHouse >= 23 && $TempHouse <= 25) {sg('Boiler1.targetTemp',42);
    if ($targetTemp == 42) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=42");
}
if ($TempHouse > 26) {sg('Boiler1.targetTemp',37);
    if ($targetTemp == 37) return;
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=37");
}
}

//при температуре на улице > +17 и в доме > +23 выключаем отопление
if ($TempOutDoor > 17) {
if ($TempHouse > 23) {
    if (gg('Boiler1.status' != 0)) sg('Boiler1.status',0);
    if ($targetTemp == 5) return;
    sg('Boiler1.targetTemp',5);
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=5");}
}

}
Хотя, возможно, (я просто уже не помню всю логику) вместо "sg('Boiler1.status',0);" можно выполнить метод выключения: "cm('Boiler1.turnOff);". Так даже было бы лучше.
Попробуйте сделать эту корректировку и заменить на метод (cm('Boiler1.turnOff);).

nail
Сообщения: 292
Зарегистрирован: 07 окт 2018, 18:03

Re: Очень интересно, но ничего непонятно!

Сообщение nail » 19 апр 2021, 21:49

Ruslan писал(а):
19 апр 2021, 18:54
Это хорошо. Значит мы угадали с "зазорами" )).
Хотя, возможно, (я просто уже не помню всю логику) вместо "sg('Boiler1.status',0);" можно выполнить метод выключения: "cm('Boiler1.turnOff);". Так даже было бы лучше.
Попробуйте сделать эту корректировку и заменить на метод (cm('Boiler1.turnOff);).
Спасибо . тестирую.

nail
Сообщения: 292
Зарегистрирован: 07 окт 2018, 18:03

Re: Очень интересно, но ничего непонятно!

Сообщение nail » 19 апр 2021, 21:55

Спасибо Руслану , за помощь неучам как Я )).
Тут возникло желание эл. энергия Квт. по счетчику перевести в рубли, т.е. у меня показывает в Ваттах (405.100) получается 405 Квт . Если "Sensor_voltage02.value" пересчитывал наверно в методе "Sensor_voltage02.valueUpdated" ( по цене эл.энергии 8р. за киловатт) и вывести на сцену?
Вложения
Screenshot_3.jpg
Screenshot_3.jpg (25.15 КБ) 1026 просмотров

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 19 апр 2021, 22:14

Ну если просто перевести киловатты в рубли по тарифу, то никаких сложностей нет. Добавляем новое свойство для расходов на электроэнергию (например, "Sensor_voltage02.ElectricityCosts").

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

$ElectricityCosts = 8 * gg('Sensor_voltage02.value') / 1000;
sg('Sensor_voltage02.ElectricityCosts', $ElectricityCosts);
И выполнять это с нужной периодичностью. Если киловатты ("Sensor_voltage02.value") у вас обновляются при помощи какого-нибудь метода, то можно добавить эти две строчки туда. Или куда-нибудь еще запихнуть и инициировать исполнение из OnNewMinute.
А само значение на сцене можно получить хоть с помощью информера, хоть текстом (%Sensor_voltage02.ElectricityCosts%).

sergt78
Сообщения: 154
Зарегистрирован: 29 сен 2019, 16:55

Re: Очень интересно, но ничего непонятно!

Сообщение sergt78 » 24 апр 2021, 00:27

Добрый вечер, всем.
Подскажите пожалуйста как силами только меги сделать проверку доступности инета и перегрузить роутер если его нет.

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 24 апр 2021, 09:23

Доброе время суток!
Не знаю, будет работать или нет, но можно попробовать воспользоваться функцией вотчдог. Т.е.:
1. Пропустить питание роутера через выход.
2. Прописать на входе сценарий "выключить, пауза, включить".
3. Указать в вотчдог номер входа со сценарием.
4. Указать вместо адреса сервера адрес роутера.

kontur
Сообщения: 166
Зарегистрирован: 09 окт 2016, 12:31

Re: Очень интересно, но ничего непонятно!

Сообщение kontur » 24 апр 2021, 10:26

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

nail
Сообщения: 292
Зарегистрирован: 07 окт 2018, 18:03

Re: Очень интересно, но ничего непонятно!

Сообщение nail » 24 апр 2021, 12:02

Ruslan писал(а):
19 апр 2021, 18:54
Хотя, возможно, (я просто уже не помню всю логику) вместо "sg('Boiler1.status',0);" можно выполнить метод выключения: "cm('Boiler1.turnOff);". Так даже было бы лучше.
Попробуйте сделать эту корректировку и заменить на метод (cm('Boiler1.turnOff);).
Добрый день правильно ли я понял вставить строку cm('Boiler1.turnOff'); ?

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

//при температуре на улице > +17 и в доме > +23 выключаем отопление
if ($TempOutDoor > 17) {
if ($TempHouse > 23) {
   if cm('Boiler1.turnOff');
    if ($targetTemp == 5) return;
    sg('Boiler1.targetTemp',5);
    file_get_contents("http://192.168.0.4/sec/?pt=30&misc=5");}
}

}

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 24 апр 2021, 19:18

День добрый!
Не..., не так.
Надо эту строчку

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

if (gg('Boiler1.status' != 0)) sg('Boiler1.status',0);
заменить на эту:

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

if (gg('Boiler1.status' != 0)) cm('Boiler1.turnOff');

EVG
Сообщения: 57
Зарегистрирован: 02 дек 2020, 16:47

Re: Очень интересно, но ничего непонятно!

Сообщение EVG » 28 апр 2021, 21:20

Подскажите, пожалуйста, такое подключение корректно?

У нас есть связка мега + 2 модуля к входам которых подключены различные "сухие контакты" (кнопки, герконы, датчики движения и протечек).
Корректно ли землю забирать от одного из входов первого модуля и через шину отдавать на все сухие контакты?
Можно ли забирать землю не с исполнительного модуля, а с земли самой меги?

Примерно так
Подключение.JPG
Подключение.JPG (98.65 КБ) 1617 просмотров

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 28 апр 2021, 21:27

Я хоть и не "зелезнячник", но считаю, что такое подключение корректно, т.к. земля общая. Ведь у вас в итоге все питается от одного БП.
Так что с моей точки зрения при таком подключении все должно спокойно работать.

martiniman
Сообщения: 528
Зарегистрирован: 09 авг 2016, 15:09
Откуда: Сочи

Re: Очень интересно, но ничего непонятно!

Сообщение martiniman » 29 апр 2021, 12:33

Какой тип датчика (там их несколько) можно подключить напрямую в порт меги и использовать для определения выдвижения ригеля у замка?
https://aliexpress.ru/item/32864875404. ... 5362135427
https://blog.instalator.ru/archives/2070#comment-22001
Изображение

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 29 апр 2021, 13:16

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

Для целей контроля состояния ригеля замка предложенный датчик выглядит привлекательно, однако могут быть особенности. Например, вдруг датчик не реагирует на металл, который не магнитится? Ригели ведь тоже разные могут быть. Ну и со схемой подключения пока "непонятки".

martiniman
Сообщения: 528
Зарегистрирован: 09 авг 2016, 15:09
Откуда: Сочи

Re: Очень интересно, но ничего непонятно!

Сообщение martiniman » 29 апр 2021, 13:33

Ruslan писал(а):
29 апр 2021, 13:16
Ригели ведь тоже разные могут быть. Ну и со схемой подключения пока "непонятки".
Там выше ссылка на блог, все работает.
У меня вопрос какой из типов для меги подходит.

Ruslan
Сообщения: 2184
Зарегистрирован: 06 янв 2014, 20:44

Re: Очень интересно, но ничего непонятно!

Сообщение Ruslan » 29 апр 2021, 16:14

Я в случае вопросов про схему подключения обычно спрашиваю в теме "MegaD-328/2561 FAQ".
Так что ищите ответ на вопрос там.

Roman_Sochi
Сообщения: 68
Зарегистрирован: 14 сен 2020, 17:21

Re: Очень интересно, но ничего непонятно!

Сообщение Roman_Sochi » 05 май 2021, 18:25

Доброго дня, уважаемые форумчане!
Подскажите пожалуйста, возможно ли реализовать схему совместной работы двух и более контроллеров Mega-D, например, на уровне сервера с Majordomo? Т.е. сигнал с датчика приходит на Mega-D №1, она его транслирует на сервер а он, в свою очередь, дает команду Mega-D №2 на выполнение определенного действия?

Ответить