Умный дом: Domoticz.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 17 сен 2017.

Метки:
  1. Greed

    Greed Нуб

    Ставлю вопрос ребром. Кто может помочь в настройке умного дома, будем считать что я ноль, но быстро обучаем. Связь по телефону. Моя почта kuzmin_s.v@mail.ru
     
  2. ИгорьК

    ИгорьК Гуру

    С учетом сказанного ранее, особого смысла в разговорах нет. Я могу говорить только о том, что сделал сам и оно точно работает. Поэтому:

    1. Там, где у меня управляется освещение, оно работает на продукции белорусских товарищей nooLite.

    2. Каждый силовой блок (то, что непосредственно управляет лампочкой) привязан к одному или нескольким их же пультам, чтобы всегда можно было управлять вручную, и одновременно к модулю MTRF-64, который в связке с ESP32 гоняет туда-сюда информацию на MQTT брокер.

    3. Устройство MTRF-64+ESP32 раскрыто на моем сайте.

    4. Информация с брокера забирается NodeRed и трансформируется в данные, пригодные для Domoticz. NodeRed , также, организует обратное движение данных от Domoticz к устройствам nooLite.

    5. Пример организации работы, подключения, настроек, также у меня на сайте.

    6. Есть самостоятельные пульты, что просто привязаны только к MTRF-64, и ими управляются другие устройства, не освещения, поскольку NodeRed может интерпретировать входные данные так как нужно пользователю.

    Пожалуй, это все что можно сказать в целом. Каждый пункт выше, безусловно, будет вызывать еще тучу вопросов. Однако телефон здесь не поможет. Если вы начнете этим заниматься лично - пишите нечто конкретное здесь, кто-нибудь поможет. Иначе - в закажу проект и там возможны любые другие решения.
     
    Последнее редактирование: 23 окт 2020
  3. ИгорьК

    ИгорьК Гуру

    Такой вопрос - здесь. (Мой опыт наблюдения за разделом "закажу проект" показывает, что в требуемой вами постановке вопроса вам никто не поможет. Однако, буду рад ошибиться.)
     
  4. Greed

    Greed Нуб

    Еще раз пытаюсь достучаться. Имею вот такую штуку "выключатель" [​IMG] Прошил ее последней прошивкой ESPEasy, установил рапсбери 4 домотиказ.
    В итоге имею, что с домотиказа могу управлять освещением, но если допустим включить лампочку с домотиказа затем убрать питание и снова подать домотиказ не видит что лампочка не горит, так же после прошивки перестали работать сенсорные "клавиши". Зачем придумывать какие то там белоруские силовые блоки плюс брилки, когда китайцы все придумали в одном симпатичном выключателе. Его только надо грамотно прикрутить. О чем и прошу. Не люблю столько много по клаве ботать поэтому и прошу помощи по телефону.
     

    Вложения:

    • HTB.jpg
      HTB.jpg
      Размер файла:
      570,2 КБ
      Просмотров:
      280
  5. SergeiL

    SergeiL Оракул Модератор

    Ну и что вы хотите от форума?
    Вы взяли готовый выключатель, прошили его прошивкой ESPEasy, работает не так как хотелось...
    Исходников - нет, наверное вопросы нужно задавать автору прошивки.
    Ну или взять, разобраться и написать свой код для выключателя. Тогда все будет так как вам хочется;)

    Ну решений много, у всех есть свои плюсы и минусы, каждый выбирает то, что ему подходит и нравится.
    Минусы вашего решения вы описали в своем посте.
    Ну и под данный выключатель нужно переделывать проводку, он требует фазу и нейтраль для работы, а обычно на выключатель только фаза заводится.:(
     
  6. Greed

    Greed Нуб

    ПОНЯЛ
    Видимо не туда попал.
    Буду искать на других форумах.
    Извините за беспокойство.
     
  7. SergeiL

    SergeiL Оракул Модератор

    Вы думаете найдете решение проблемы с работой ESPEasy на других форумах? Сомневаюсь.
    Не понятен ваш вопрос. Что вы хотите найти?
    Тут многие собирали свое управление освещением, просто у готовых прошивок естественно есть ограничения, которые не исправить самому.
    Если писать самому - невозможного - нет в принципе. ;)
    Если поискать по форуму - найдете, что многие решали вопрос управления освещением, все по своему.
    У каждого решения есть и плюсы и минусы.
    Мне вот например нравятся обычные физические выключатели, которые можно щелкнуть, не смотря на них, заходя в комнату.
    Для себя, минусов в своей реализации, я не вижу.
     
  8. SergeiL

    SergeiL Оракул Модератор

    Игорь уже написал про свое решение данного вопроса, а у меня c 2017-го работает свое решение. Здесь писал про реализацию.
    (Выше там как раз Игорь описывал свое)
    Не зная - у меня и не заметишь, что это не обычные механические выключатели.
    Хотя все управляется и через OpenHAB.
    Иногда только приходя домой видишь, что многие выключатели включены, а свет не горит.
    Значит не выключили их уходя из дома, и OpenHAB выключил за ненадобностью.
    Щелкнул вниз, потом вверх - свет и загорелся.
     
  9. Greed

    Greed Нуб

    Всем доброго времени суток.
    Подскажите пожалуйста как настроить малинку, чтобы устройства обращались к ней по вайфай не через роутер а на прямую, а сама малинка была подключена к роутеру через шнурок. И чтоб подсети роутера и устройств были разные. Извините если мой вопрос дурацкий, ноя в линуксе полный ноль.
     
  10. Domoticz c Node-Red на OpenWrt. Проброс mqtt из SLS и обратно.

    Domoticz есть в стандартных пакетах OpenWrt, поскольку я буду в Domoticz заводить устройства через mqtt то на роутер надо поставить mosquitto, Node-Red в стандартной сборке я не нашел, есть 2 варианта установки:

    1. Установка Node-Red по этой инструкции: https://github.com/dceejay/openwrt-node-red

    2. Сборка OpenWrt с пакетами Node.js версии 10, 12 или 14 и Node-red. а так же нам может понадобиться node-npm, собираем OpenWrt из исходников добавив пакеты node.js отсюда: https://github.com/nxhack/openwrt-node-packages

    После установки Domoticz будет на порту 8080 по адресу роутера, Node-red по адресу роутера на порту 1880.

    В Domoticz добавляем mqtt

    [​IMG]

    и устройство Dummy

    [​IMG]

    далее создаем виртуальные датчики, фактически на каждый топик в mqtt свой датчик, это может быть выключатель, температура, напряжение и т.п.

    [​IMG]

    Чтобы смотреть куда Ваши устройства публикуют свои статусы рекомендую установить mqtt клиента, я использую кросс платформенный MQTT Explorer

    Проблема в том, что Domoticz случает только топик domoticz/in и публикует в топик domoticz/out

    Есть несколько вариантов решения данной проблемы, одна из которых это использование плагина для Domoticz, я лишь нашел Python плагины, но проблема в том, что видимо Domoticz для OpenWrt собран без поддержки Python и Python плагины не работают.

    Есть вариант использовать оборудование с поддержкой Domoticz или возможностью настройки публикации, но это сильно сокращает список оборудования которое возможно использовать, да и например в прошивке Tasmota можно указать топики, но тогда кроме данных mqtt сервера надо настраивать топики на каждом конечном устройстве и обработчик всё равно надо писать, по этому на мой взгляд лучшее решение это Node-Red.

    Настройка Node-Red

    Вообще всю автоматизацию возможно использовать только с Node-Red, визуализация так же возможна с помощью Node-Red Dashboard, но мы будем использовать Node-Red только для конвертации сообщений в и из Domoticz.

    Для этого надо создать 2 потока, фактически это потоки конвертирования из mqtt и mqtt. Поток mqtt to domoticz это конвертер из топиков # в топик domoticz/in, поток domoticz to mqtt это конвертер из потока domoticz/out в топики устройств.

    Вот так выглядит часть кода конвертера из mqtt в domoticz/in (взято отсюда)

    [​IMG]

    красным подчеркнуто последний уровень топика, синим idx устройства в Domoticz, при этом вызываемая функция зависит от типа датчика в Domoticz.

    Для того чтобы каждый раз не ползать в Node-Red при добавлении нового устройства и не сопоставлять idx устройств с топиками и типом и не находить место куда надо добавить нужный код мы пойдем другим путем.

    Кроме того данный метод не приемлем если использовать обратный поток из domoticz/out когда значение выключателя для переключения находиться в другом топике нежели значение для статуса, например у меня в шлюзе SLS реле xiaomi имеет статус в топике sls/rele1/state_l1 а чтобы его переключить надо опубликовать в топик sls/rele1/set/state_l1

    При публикации в топике sls/rele1/set/state_l1 из потока domoticz to mqtt поток mqtt to domoticz запускается поскольку изменилось значение sls/rele1/state_l1 которое в потоке mqtt to domoticz изменяет статус выключателя в Dоmoticz, а поскольку статус изменился, то Domoticz публикует в топик sls/rele1/set/state_l1 и так по кругу обеспечивая такую ddos атаку собственного mqtt сервера. после 3 минут работы потоков и последующего отключения потоков в Node-Red в mqtt сыпались сообщения ещё 1 минуту. По этому нам надо как то решить эту проблему.

    Метод такой: при получении сообщения из топика мы будем искать в свойствах устройств такой топик, при совпадении полученного топика и топика в устройстве и если значение топика отличается от значения в устройстве (чтобы не дергать лишний раз одинаковыми значениями) мы будем формировать json запрос в топик domoticz/in

    Для получения параметров устройств мы воспользуемся Domoticz API/JSON URL's

    поток будет выглядеть следующим образом:

    [​IMG]

    функция 1 получает от mqtt данные о топике и его значении, эти данные надо сохранить для того чтобы их использовать совместно с полученными данными от Domoticz о списке устройств и их параметрах, что при такой конструкции в одной функции невозможно. Тут нам на помощь приходят переменные, а именно переменные в пределах потока (flow.set), то есть при установке в функции 1 её можно получить в функции 2. Но этого не достаточно, поскольку существует проблема синхронизации запуска потока. Дело в том, что если устройства будет публиковать в несколько топиков данные с интервалом несколько милисекунд, а именно так происходит например когда нажимаешь клавишу выключателя xiaomi, публикуются данные в 6 топиков, то есть поток запускается 6 раз (6 экземпляров потока). Когда в первом экземпляре потока мы присвоим переменной какое то значение, начнется выполняться http запрос в этом экземпляре потока, в это время запуститься второй экземпляр потока который присвоит этой же переменной свое значение и когда первый экземпляре потока дойдет до функции 2 и там считается значение этой переменной, то значение будет уже из второго экземпляре потока. По наблюдениям когда второй экземпляре потока в функции 2 будет считывать переменную заданную в функции 1, то он получит значение которое присвоено в 18-м экземпляре потока, то есть на момент выполнения функции 2 в 17-и экземплярах потока в переменной будет значение из 17-го экземпляра потока и мы получим в функции 2 только значение 17 экземпляре потока во всех 17 потоках.

    Чтобы этого избежать надо нумеровать переменные в зависимости от номера потока. Мы знаем, что каждый топик запускает поток, в потоке один раз выполняется функция 1, потом один раз выполняется http запрос, потом один раз выполняется функция 2. То есть в 10-м потоке функция 1 будет выполнена 10-й раз, функция 2 будет выполнена тоже 10-й раз, в 18-м потоке обе функции будет выполнены 18 раз. Теперь в каждой функции нам надо сделать счетчик запуска функции, чтобы этот счетчик могла менять только функция, для этого мы будем использовать переменную в контексте (context.set).

    В Node-Red имеются следующие периоды жизни переменных:

    var myParam = "моя переменная"; - будет жить только внутри функции при выполнении, закончилась выполняться функция, переменная исчезла, при новом запуске функции значения этой переменной не будет пока его заново не присвоить.

    context.set('myParam',"моя переменная"); - будет жить в пределах функции в которой присвоена, при новом запуске функции значение этой переменной сохраниться.

    flow.set('myParam', "моя переменная"); - будет жить в пределах всего потока, при завершении потока сохраняется и может быть получена при повторном запуске потока. Не видна в других потоках

    и есть глобальный контекст, то есть переменная будет жить во всех потоках, мы такие переменные использовать не будем. Подробнее о переменных, контекстах и функциях тут и тут
     
  11. ... продолжение
    Поток mqtt to domoticz будет выглядеть так

    [​IMG]

    данные в узлах:
    [​IMG]



    [​IMG]


    Код (Javascript):
    // делаем счетчик запусков функции
    var max_count = 50; // ограничим счетчик 50
    var count = context.get('count')||0; // если счетчика нет в переменной контекста то присваиваем значение 0
    count += 1;
    if (count == max_count) {count = 0;} // ограничиваем количество переменных
    context.set('count',count); // присваиваем счетчик в переменную в контексте
    var mytopic = "mytopic" + context.get('count'); // формируем имя переменной потока для передачи в функцию 2
    var mypayload = "mypayload" + context.get('count'); // формируем имя переменной потока для передачи в функцию 2
    flow.set(mytopic, msg.topic); // присваиваем переменной топик
    flow.set(mypayload, msg.payload); // присваеваем переменной значение топика
    // параметры http запроса для узла "http запрос"
    var urlmsg = {}
    urlmsg.payload = "data to post";
    urlmsg.headers = {"Content-Type": "application/json"};
    urlmsg.url = "http://192.168.1.1:8080/json.htm?type=devices&filter=all"; // получить список всех устройств
    return urlmsg;

    [​IMG]

    [​IMG]


    Код (Javascript):
    // делаем счетчик запусков функции
    var max_count = 50; // ограничим счетчик 50
    var count = context.get('count')||0; // если счетчика нет в переменной контекста то присваиваем значение 0
    count += 1;
    if (count == max_count) {count = 0;} // ограничиваем количество переменных
    context.set('count',count); // присваиваем счетчик в переменную в контексте
    var mytopic2 = "mytopic" + context.get('count'); // формируем имя переменной потока для передачи в функцию 2
    var mypayload2 = "mypayload" + context.get('count'); // формируем имя переменной потока для передачи в функцию 2

    var my = {}
    var newmsg2 = {}
    arr = msg.payload.result // получаем массив из устройств
    arrlen = arr.length; // вычисляем длинну массива устройств
    var myTopic = flow.get(mytopic2); // получаем топик из переменной
    var myPayload = flow.get(mypayload2); // получаем значение топика из переменной

    // разбираем http запрос
    for(var j = 0; j < msg.payload.result.length; j++){
    my.idx = msg.payload.result[j].idx; // idx
    my.HardwareName = msg.payload.result[j].HardwareName; // оборудование
    my.description2 = msg.payload.result[j].Description; // комментарий
    my.Type = msg.payload.result[j].Type; // подтип
    my.SubType = msg.payload.result[j].SubType; // подтип
    // присваиваем текущее значение в зависимости от типа
    if (my.SubType == "Switch") {my.Status = msg.payload.result[j].Status;}
    if (my.Type == "Temp") {my.Status = msg.payload.result[j].Temp;}
    if (my.SubType == "Voltage") {my.Status = msg.payload.result[j].Voltage;}
    // получаем из комментария топик для подписки и публикации
    if(msg.payload.result[j].Description.indexOf('topic: ') + 1) {
    my.topic2 = msg.payload.result[j].Description.match(/topic: ([\s\S]+?);/i)[1];
    }
    if(msg.payload.result[j].Description.indexOf('topic_set: ') + 1) {
    my.topic_set = msg.payload.result[j].Description.match(/topic_set: ([\s\S]+?);/i)[1];
    }
    // сравниваем топик для обновления значения
    if (myTopic == my.topic2) {
    // сравниваем значение, если значения не совпадают то не обновляем
    if (myPayload == 'ON') { myPayload = 'On';}
    if (myPayload == 'on') { myPayload = 'On';}
    if (my.Status == 'ON') { my.Status = 'On';}
    if (my.Status == 'on') { my.Status = 'On';}
    if (myPayload == 'OFF') { myPayload = 'Off';}
    if (myPayload == 'off') { myPayload = 'Off';}
    if (my.Status == 'OFF') { my.Status = 'Off';}
    if (my.Status == 'off') { my.Status = 'Off';}

    if (myPayload == my.Status){
    return null;
    } else {
    if (my.SubType == "Switch") {newmsg2.payload = setSwitch(my.idx, myPayload);}
    if (my.Type == "Temp") {newmsg2.payload = setTemp(my.idx, myPayload);}
    if (my.SubType == "Voltage") {newmsg2.payload = setTemp(my.idx, myPayload);}
    return newmsg2;
    }
    }
    my = {} // очищаем переменную
    }
    return null;

    // --------------------------- функции ----------------------------
    function setSwitch(idx, nm){ // выключатель
    var switchpayload = '{"command":"switchlight","idx":' + idx + ',"switchcmd":"'+ nm +'","parse":false}';
    return switchpayload; }
    function setTemp(idx, nm){ // температура
    nm = +nm;
    var temppayload = '{"idx":' + idx +',"svalue":"' + nm.toFixed(2) + '","parse":false}';
    return temppayload; }
    function setText(idx, nm){ // текстовое значение
    var textpayload = '{"idx":' + idx +',"svalue":"' + nm + '","parse":false}';
    return textpayload;
    }
    function setHumi(idx, nm){ // влажность
    nm = Math.round(nm);
    var humipayload = '{"idx":' + idx +',"nvalue":' + nm + ',"svalue":"0","parse":false}';
    return humipayload; }
    function setWind(idx, nm){
    nm = Math.round(nm * 10);
    var sv = '0;N;' + nm +';' + nm + '';
    var windpayload = '{"idx":' + idx +',"nvalue":0,"svalue":"' + sv +';0;0","parse":false}';
    return windpayload; }

    [​IMG]


    Полностью json потока для экспорта в Node Red

    теперь создадим обратно из Domoticz в Node-red, поток будет выглядеть так

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]


    Код (Javascript):
    newmsg={};
    if(msg.payload.dtype == "Light/Switch"){
    myDescr = msg.payload.description; //топик по писанию устройства
    // получаем из комментария топик для подписки и публикации
    if(myDescr.indexOf('topic_set: ') + 1) {
    newmsg.topic = myDescr.match(/topic_set: ([\s\S]+?);/i)[1];
    } else {return null;}
    if(msg.payload.nvalue == 1){
    newmsg.payload = 'ON';
    } else if (msg.payload.nvalue === 0){
    newmsg.payload = 'OFF';
    } else {
    newmsg.payload = msg.payload.svalue1;
    }
    return newmsg;
    } else {
    return null;
    }

    [​IMG]

    Полностью json потока для экспорта в Node Red

    Теперь нам осталось в устройствах Domoticz в описаниях добавить пути к топикам, для статусов только путь к топику со статусом в формате: topic: путь/к/топику;, для тех кто публикует (выключатели) путь set в формате: topic_set: путь/к/топику;

    для датчиков:

    [​IMG]

    для выключателей:

    [​IMG]


    на этом все, при добавлении новых устройств достаточно в свойствах устройства указывать пути к топикам.
     
    Последнее редактирование: 1 апр 2021
  12. Shimano

    Shimano Нерд

    День добрый.Подскажите, кто сталкивался с подобным.Подключено два датчика ДС, вначале всё нормально, но через какое то время появляются "двойники" и меняются идентификаторами.датчики каждый добавлял отдельно, резюк на 4.7 килоома висит только на одном.
     

    Вложения:

  13. Aliser

    Aliser Нуб

    Добрый день, коллеги.
    Вопрос видимо ерундовый , но ответ нужен.
    Домотикс крутится на Малине. К домотиксу подвязано устройство на esp8266 - передает данные температуры и влажности, а также esp управляет релюхой. Все было прекрасно - релюху можно было включить с вебсервера самой ESP, также включить - через Домотикс, а также можно было воспользоваться любым mqtt-клиентом - отправить сообщение (topic, payload) на домотикс и вкл/выкл реле. После очередного обновления Домотикс (версия 2021.1) "отпала" возможность управлять реле через mqtt-клиента. Если быть точнее - после отправки mqtt сообщения , Домотикс принимает и изменяет состояние "виртуального-реле" , но не отправляет сообщение на само устройство ESP и тем самым не включает физически реле.
    Что изменилось после обновления? Как исправить?
    Прошу помощи. Заранее спасибо.