Умный дом: Domoticz.

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

Метки:
  1. ИгорьК

    ИгорьК Гуру

    Ок, к концу дня разложу.
     
    aliaksandr нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Уверены?
     
  3. aliaksandr

    aliaksandr Нерд

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

    Вложения:

    • Dom.jpg
      Dom.jpg
      Размер файла:
      285,3 КБ
      Просмотров:
      616
    • mqtt.jpg
      mqtt.jpg
      Размер файла:
      34,5 КБ
      Просмотров:
      623
  4. ИгорьК

    ИгорьК Гуру

    Обычно там 1883
     
  5. ИгорьК

    ИгорьК Гуру

    Объясните мне тихонечко, почему именно этот порт взяли. Это важно для меня.
     
  6. ИгорьК

    ИгорьК Гуру

    Пример переработки данных от устройства, которое шлет информацию о температуре и состоянии выключателей.

    upload_2018-12-13_10-10-55.png

    upload_2018-12-13_10-19-8.png


    Format Garage Heater:

    Код (Javascript):
    var newmsg = {};
    var ss = '' +  msg.topic.substring(11); // Помните 11 знаков? Вот они здесь.

    function setTemp(idx, nm){
        if (nm < -120 || nm > 84) return null;
        var temppayload = '{"idx":' + idx +',"svalue":"' + nm + '"}';
        return temppayload;
    }
    function setCO(idx, nm){
        nm = Math.round(nm);
        var COpayload = '{"idx":' + idx +',"nvalue":' + nm + '}';
        return COpayload;
    }
    function setHumi(idx, nm){
        nm = Math.round(nm);
        var humipayload = '{"idx":' + idx +',"nvalue":' + nm + ',"svalue":"0"}';
        return humipayload;
    }
    function setSwitch(idx, nm){
        var switchpayload = '{"command":"switchlight","idx":' + idx + ',"switchcmd":"'+ nm +'"}';
        return switchpayload;
    }

    switch (ss) {
      case 'heap':
        newmsg.payload = setTemp(150, msg.payload);
        return newmsg;
      //---- Temperature ---------
      case 'tgHOME':
        newmsg.payload = setTemp(155, msg.payload);
        return newmsg;

      case 'tgGAR':
        newmsg.payload = setTemp(154, msg.payload);
        return newmsg;

      case 'homeNow':
        newmsg.payload = setTemp(152, msg.payload);
        return newmsg;

      case 'garNow':
        newmsg.payload = setTemp(153, msg.payload);
        return newmsg;


      case 't039C':
        newmsg.payload = setTemp(145, msg.payload);
        return newmsg;
      case 't001B':
        newmsg.payload = setTemp(132, msg.payload);
        return newmsg;
      case 't044D':
        newmsg.payload = setTemp(157, msg.payload);
        return newmsg;


    // --------------  Switches -------------
        case 'pumpBoil':
        var com = 'Off';
        if (msg.payload == 'ON') {
            com = 'On';
        }
        newmsg.payload = setSwitch(148, com);
        return newmsg;

      case 'pumpHome':
        var com = 'Off';
        if (msg.payload == 'ON') {
            com = 'On';
        }
        newmsg.payload = setSwitch(147, com);
        return newmsg;

      case 'pumpGar':
        var com = 'Off';
        if (msg.payload == 'ON') {
            com = 'On';
        }
        newmsg.payload = setSwitch(149, com);
        return newmsg;

        case 'state':
        var com = 'Off';
        if (msg.payload == 'ON') {
            com = 'On';
        }
        newmsg.payload = setSwitch(146, com);
        return newmsg;

          case 'work':
        var com = 'Off';
        if (msg.payload == 'ON') {
            com = 'On';
        }
        newmsg.payload = setSwitch(151, com);
        return newmsg;

      default:
        return null;
    }
    return null;
    upload_2018-12-13_10-26-5.png
     

    Вложения:

    Последнее редактирование: 13 дек 2018
  7. aliaksandr

    aliaksandr Нерд

    Думал, что там нужен порт Domoticz прописывать а не MQTT. Поменял порт. Уже лучше. Сейчас в журнале сыпется вот такая история.
    2018-12-13 08:08:59.247 MQTT: Topic: domoticz/in, Message: {"dunit":3,"dtype": 82,"dsubtype":1, "svalue":"20.4; 0;0"}
    2018-12-13 08:08:59.248 Error: MQTT: unknown idx received!
    Но Датчики не появились.Теперь как привязать idx виртуальных датчиков к данным которые уже попадают в Domoticz?
    Вроде Вы про эту ошибку писали, но как округлить данные до целых - не знаю. Да и температуру было бы интересно смотреть со значением после запятой.
     
    Последнее редактирование: 13 дек 2018
  8. aliaksandr

    aliaksandr Нерд

    Пошел в соседнюю ветку учить Lua).
     
  9. ИгорьК

    ИгорьК Гуру

    Начнем с данных, что попадают на брокер. Что показывает MqttSpy относительно того, что вы планируете загнать в Домотикз?
     
  10. aliaksandr

    aliaksandr Нерд

    С ESP идут такие данные
    /ESP241/sensors/rssi -74
    /ESP241/gpio/output4 0
    /ESP241/gpio/output5 1
    /ESP241/gpio/output12 0
    /ESP241/gpio/output13 0
    /ESP241/gpio/output14 0
    /ESP241/gpio/output15 0
    /ESP241/sensors/freemem 15960
    /ESP241/sensors/uptime 60570
    /ESP241/sensors/thermo_en1 0
    /ESP241/sensors/thermo_set1 230
    /ESP241/sensors/dsw1 -0.2
    /ESP241/sensors/dsw2 19.1
    /ESP241/sensors/dsw3 28.2
    /ESP241/sensors/dsw4 19.5
    /ESP241/sensors/dsw6 17.6
    /ESP241/sensors/dhtt1 20.5
    /ESP241/sensors/dhth1 48.3
    /ESP241/sensors/rssi -73
    /ESP241/gpio/output4 0
    /ESP241/gpio/output5 1
    /ESP241/gpio/output12 0
    /ESP241/gpio/output13 0
    /ESP241/gpio/output14 0
    /ESP241/gpio/output15 0
    /ESP241/sensors/freemem 15960
    /ESP241/sensors/uptime 60580
    domoticz/in {"dunit":3,"dtype": 82,"dsubtype":1, "svalue":"20.5; 0;0"}
    В идеале хотелось бы все это превратить в кнопки для включения и выключения GPIO и в датчики температуры в Domoticz.
    А для начала просто загнать допустим /ESP241/sensors/dhtt1 20.5 через Noderead в Domoticz. По анологии тогда попробую подсоединить и все оставшиеся.
     
  11. ИгорьК

    ИгорьК Гуру

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

    Делаем две подписки поток gpio и поток sensors.

    Начнем с простого - GPIO:

    Создадим подписку на брокере.

    upload_2018-12-13_15-12-46.png

    Внутри ее:

    upload_2018-12-13_15-13-10.png

    Теперь этот поток будет выхватывать брокера только gpio.
    В подписке потока 13 знаков: '/ESP241/gpio/' Это потом будем применять.

    Присоединим функцию Transform GPIO:

    upload_2018-12-13_15-17-17.png


    upload_2018-12-13_15-25-31.png

    Внутри функции сделаем такой код (здесь с комментариями):

    Код (C++):
    var newmsg = {};
    // Удаляем первые 13 символов, оставляя "чистые топики" в переменной ss
    var ss = '' +  msg.topic.substring(13);
    // Согласуем данные команды со стандартом Домотикз
    // Приходит "1" - будет "On", иначе - "Off"

    var com = 'Off';
    if (msg.payload == '1') {
        com = 'On';
    }

    //Функция формирования команды Домотикзу
    // Принимает idx и клманду
    function setSwitch(idx, nm){
        var switchpayload = '{"command":"switchlight","idx":' + idx + ',"switchcmd":"'+ nm +'"}';
        return switchpayload;
    }

    // Выбор ваших выключателей, в зависимости от приходящих сообщений
    switch (ss) {
        // Если пришел 'output4' то это выключатель с idx = 7, например
        case 'output4':
            newmsg.payload = setSwitch(7, com);
        return newmsg;

        case 'output5':
            newmsg.payload = setSwitch(2, com);
        return newmsg;

        default:
        return null;
    }
    return null;
    И в заключение выводим на Домотикз:

    upload_2018-12-13_15-32-1.png

    upload_2018-12-13_15-32-15.png

    Действуйте дальше по примеру.
     

    Вложения:

    aliaksandr нравится это.
  12. ИгорьК

    ИгорьК Гуру

    Температура для Домотикз формируется такой функцией:
    Код (Javascript):
    function setTemp(idx, nm){
        if (nm < -120 || nm > 84) return null;
        var temppayload = '{"idx":' + idx +',"svalue":"' + nm + '"}';
        return temppayload;
    }
    Влажность - такой, здесь удаляется все после запятой:
    Код (Javascript):
    function setHumi(idx, nm){
        nm = Math.round(nm);
        var humipayload = '{"idx":' + idx +',"nvalue":' + nm + ',"svalue":"0"}';
        return humipayload;
    }
     
    aliaksandr нравится это.
  13. aliaksandr

    aliaksandr Нерд

    Спасибо! Все получилось!)) Завтра с меня пиво!
    Следующий этап - разобратся с domoticz/out а то релюшками из домотикза не щелкает, только отображает состояние gpio/
    С температурой тоже все получилось.
    Потом полез лазить дальше - и чтото сломал. Не смог зайти больше без пароля который не завдавал. Переустанавливаю все начисто...

    p.s. переустановка кроме чистого dietpi не дала. При входе на Domoticz выкидывает в offline. Нашел что глюк в Chrome. при входи в режиме инкогнито - все работает. Очистка кэша не помогла.
     

    Вложения:

    Последнее редактирование: 14 дек 2018
    ИгорьК нравится это.
  14. naz

    naz Нерд

    Доброго всем, можно мне с наивным вопросом?
    Нет входа в веб- интерфейс Домотикса. Стартую вручную, сервис вроде загружен, но по адресу http://192.168.1.39:8080 получаю "нет доступа".. Какие проверки сделать?[​IMG]
     
  15. ИгорьК

    ИгорьК Гуру

  16. naz

    naz Нерд

    Тоже самое- нет доступа:(
     
  17. ИгорьК

    ИгорьК Гуру

    Меняйте порты в установках. У вас что конфликтует за эти порты.
     
  18. naz

    naz Нерд

    У меня на этих портах OH был, но я его снёс подчистую..
     
  19. ИгорьК

    ИгорьК Гуру

    Поменяйте, проверьте.
     
    naz нравится это.
  20. naz

    naz Нерд

    Да, помогло..зашёл!:)