Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Vital

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    V
    • Profile
    • Following 0
    • Followers 0
    • Topics 4
    • Posts 10
    • Best 0
    • Groups 0

    Vital

    @Vital

    0
    Reputation
    18
    Profile views
    10
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Vital Follow

    Latest posts made by Vital

    • Драйвер Vera

      Потихоньку пилю плагин для связи с Верой.

      И вот, первая версия.

      https://github.com/pyatovsky/ioBroker.vera

      Версия совсем-совсем тестовая.

      Сейчас она умеет следующее:

      • Получает и создает сцены из Веры. Сцены реализованы как "кнопка", нажатие на которую запускает сцену на Вере.

      • Получает и создает комнаты из Веры, но пока не приписывает к ним устройства (просто создает их в enum.rooms).

      • Создает обычные выключатели.

      • Создает обычные датчики температуры.

      • Создает виртуальные выключатели (плагин Virtual ON/OFF Switches - App id: 1408)

      • Создает виртуальный датчик температуры (плагин Virtual Outdoor Temperature Plugin (by MiOS) - App id: 8671)

      Обратная связь осуществляется периодическим опросом Веры по адресу http:// … :3480/data_request?id=status и извлечением оттуда состояний нужных устройств.

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

      Было бы очень хорошо, чтобы кто-нибудь потестил тоже...

      ! 3553_iob-vera-2.png
      3553_iob-vera-1.png

      posted in ioBroker драйвера
      V
      Vital
    • Драйвер Laurent

      0.0.1 Первая тестовая версия

      https://github.com/pyatovsky/ioBroker.laurent

      3553_laurent01.png

      posted in ioBroker драйвера
      V
      Vital
    • RE: Скрипт для Лоран

      Подправил скрипт, так работает лучше.

      Может кому пригодится.

      Скрипт разделен на две части, одна кладется в Global. В основном это для того, чтобы можно было опрашивать несколько Лоранов, копируя скрипт (у меня 3 штуки, например).

      ! ````
      var IP = "192.168.0.104";
      var Period = 5000;
      var laurentID = "000";
      ! //Функция в "global" для создания
      createMain ();
      ! var request = require('request');
      ! //Определяем переменные снаружи функции (чтобы были видны снаружи функции)
      var relayString = "0000";
      var inlineString = "000000";
      var outlineString = "000000000000";
      ! //Функция обработки ответа
      function statusProcessing(error, response, body)
      {
      if (!error && response.statusCode == 200)
      {
      setState('laurent'+laurentID+'.connectIndicator', true, true);

          //Температура = Конвертируем строку в число (запрошенную по тегу temp в ответе Лорана).округляем (до 1 знака после запятой)
          var temperature = parseFloat(XMLElement ("temp", body)).toFixed(1);
          setState('laurent'+laurentID+'.temperature', parseFloat(temperature), true);
      
          //Время Лорана
          setState('laurent'+laurentID+'.systemtime', parseInt(XMLElement ("systime", body)), true);
      

      ! //Строка состояния реле
      relayString = XMLElement ("rele", body);
      setState('laurent'+laurentID+'.relayString', relayString);

          //Строка состояния входов
          inlineString = XMLElement ("in", body);
          setState('laurent'+laurentID+'.inlineString', inlineString);
      
          //Строка состояния выходов
          outlineString = XMLElement ("out", body);
          setState('laurent'+laurentID+'.outlineString', outlineString);
      }
      else
      {
          setState('laurent'+laurentID+'.connectIndicator', false, true);
      }
      

      }

      ! //Главная периодическая функция
      function mainPoll ()
      {
      request ('http://'+IP+'/state.xml', statusProcessing);
      }
      ! //Подписываемся на состояние вспомогательно объекта (строки состояния) реле
      on('javascript.0.laurent'+laurentID+'.relayString', updateRelaysStates);
      ! //Подписываемся на состояние вспомогательно объекта (строки состояния) входных линий
      on('javascript.0.laurent'+laurentID+'.inlineString', updateInlinesStates);
      ! //Подписываемся на состояние вспомогательно объекта (строки состояния) выходных линий
      on('javascript.0.laurent'+laurentID+'.outlineString', updateOutlinesStates);
      ! //Подписываемся на состояние реле/выключателя (для управления из визуализации)
      on('javascript.0.laurent'+laurentID+'.relay1', relaySwitch);
      on('javascript.0.laurent'+laurentID+'.relay2', relaySwitch);
      on('javascript.0.laurent'+laurentID+'.relay3', relaySwitch);
      on('javascript.0.laurent'+laurentID+'.relay4', relaySwitch);
      ! //Подписываемся на состояние выходной линии/выключателя (для управления из визуализации)
      on('javascript.0.laurent'+laurentID+'.outline1', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline2', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline3', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline4', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline5', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline6', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline7', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline8', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline9', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline10', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline11', outlineSwitch);
      on('javascript.0.laurent'+laurentID+'.outline12', outlineSwitch);
      ! //Callback-функции находятся в "global"
      ! //Задаем выполнение функции через определенный интервал
      var timerID = setInterval(mainPoll, Period);

      
      И вот это в Global:
      
      >! ````
      function updateInlinesStates ()
      {
          var inlineTable = inlineString.split("");
          setState('laurent'+laurentID+'.inline1', Boolean(parseFloat(inlineTable[0])), true);
          setState('laurent'+laurentID+'.inline2', Boolean(parseFloat(inlineTable[1])), true);
          setState('laurent'+laurentID+'.inline3', Boolean(parseFloat(inlineTable[2])), true);
          setState('laurent'+laurentID+'.inline4', Boolean(parseFloat(inlineTable[3])), true);
          setState('laurent'+laurentID+'.inline5', Boolean(parseFloat(inlineTable[4])), true);
          setState('laurent'+laurentID+'.inline6', Boolean(parseFloat(inlineTable[5])), true);
      }
      >! function updateOutlinesStates ()
      {
          var outlineTable = outlineString.split("");
          setState('laurent'+laurentID+'.outline1', Boolean(parseFloat(outlineTable[0])), true);
          setState('laurent'+laurentID+'.outline2', Boolean(parseFloat(outlineTable[1])), true);
          setState('laurent'+laurentID+'.outline3', Boolean(parseFloat(outlineTable[2])), true);
          setState('laurent'+laurentID+'.outline4', Boolean(parseFloat(outlineTable[3])), true);
          setState('laurent'+laurentID+'.outline5', Boolean(parseFloat(outlineTable[4])), true);
          setState('laurent'+laurentID+'.outline6', Boolean(parseFloat(outlineTable[5])), true);
          setState('laurent'+laurentID+'.outline7', Boolean(parseFloat(outlineTable[6])), true);
          setState('laurent'+laurentID+'.outline8', Boolean(parseFloat(outlineTable[7])), true);
          setState('laurent'+laurentID+'.outline9', Boolean(parseFloat(outlineTable[8])), true);
          setState('laurent'+laurentID+'.outline10', Boolean(parseFloat(outlineTable[9])), true);
          setState('laurent'+laurentID+'.outline11', Boolean(parseFloat(outlineTable[10])), true);
          setState('laurent'+laurentID+'.outline12', Boolean(parseFloat(outlineTable[11])), true);
      >! }
      >! //Функция для переключения реле - отослать команду
      function relaySwitch (obj)
      {
          var reg = "relay([1-9])";
          if (obj.state.ack === false && obj.state.val === true)
          {
              request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(reg)[1]+',1');
          }
          else if (obj.state.ack === false && obj.state.val === false)
          {
              request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(reg)[1]+',0');
          }
      }
      >! //Функция для переключения выходной линии - отослать команду
      function outlineSwitch (obj)
      {
          var reg = "outline([1-9]*)";
          if (obj.state.ack === false && obj.state.val === true)
          {
              request ('http://'+IP+'/cmd.cgi?cmd=OUT,'+obj.id.match(reg)[1]+',1');
          }
          else if (obj.state.ack === false && obj.state.val === false)
          {
              request ('http://'+IP+'/cmd.cgi?cmd=OUT,'+obj.id.match(reg)[1]+',0');
          }
      }
      
      posted in ioBroker скрипты
      V
      Vital
    • Скрипт для Лоран

      Добрый день!

      Прошу совета по скрипту.

      Я написал скрипт для Лорана (http://www.kernelchip.ru/Laurent-2.php)

      ! ````
      var IP = "192.168.0.104";
      var Period = 5000;
      ! //Создаем переменные
      createState('laurent.temperature','',{type:'number',role:'value.temperature',read:true,unit:'°C'});
      createState('laurent.systemtime','',{type:'number',role:'value',read:true});
      createState('laurent.inline1','',{type:'boolean',role:'state',read:true});
      createState('laurent.inline2','',{type:'boolean',role:'state',read:true});
      createState('laurent.inline3','',{type:'boolean',role:'state',read:true});
      createState('laurent.inline4','',{type:'boolean',role:'state',read:true});
      createState('laurent.inline5','',{type:'boolean',role:'state',read:true});
      createState('laurent.inline6','',{type:'boolean',role:'state',read:true});
      createState('laurent.relay1','',{type:'boolean',role:'switch',read:true,write:true});
      createState('laurent.relay2','',{type:'boolean',role:'switch',read:true,write:true});
      createState('laurent.relay3','',{type:'boolean',role:'switch',read:true,write:true});
      createState('laurent.relay4','',{type:'boolean',role:'switch',read:true,write:true});
      ! var request = require('request');
      ! //Функция для извлечения значений из XML
      function XMLElement(tag, xmlcontent)
      {
      var reg = "<"+tag+">(.*)";
      return xmlcontent.match(reg)[1];
      }
      ! //Функция для переключения реле - отослать команду
      function relaySwitch (obj)
      {
      if (obj.state.ack === false && obj.state.val === true)
      {
      request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(/[1-9]/)+',1');
      }

      else if (obj.state.ack === false && obj.state.val === false)
      {
          request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(/[1-9]/)+',0');
      }
      

      }

      ! //Функция обработки ответа
      function statusProcessing(error, response, body)
      {
      //Температура = Конвертируем строку в число (запрошенную по тегу temp в ответе Лорана).округляем (до 1 знака после запятой)
      var temperature = parseFloat(XMLElement ("temp", body)).toFixed(1);
      setState('laurent.temperature', parseFloat(temperature), true);

      ! //Время Лорана
      setState('laurent.systemtime', parseInt(XMLElement ("systime", body)), true);
      ! //Строка состояния реле
      var relayString = XMLElement ("rele", body);
      var relayTable = relayString.split("");
      //Запишем состояния в каждое реле
      setState('laurent.relay1', Boolean(parseFloat(relayTable[0])), true);
      setState('laurent.relay2', Boolean(parseFloat(relayTable[1])), true);
      setState('laurent.relay3', Boolean(parseFloat(relayTable[2])), true);
      setState('laurent.relay4', Boolean(parseFloat(relayTable[3])), true);

      //Строка состояния входов
      var inlineString = XMLElement ("in", body);
      var inlineTable = inlineString.split("");
      //Запишем состояния в каждый вход
      setState('laurent.inline1', Boolean(parseFloat(inlineTable[0])));
      setState('laurent.inline2', Boolean(parseFloat(inlineTable[1])));
      setState('laurent.inline3', Boolean(parseFloat(inlineTable[2])));
      setState('laurent.inline4', Boolean(parseFloat(inlineTable[3])));
      setState('laurent.inline5', Boolean(parseFloat(inlineTable[4])));
      setState('laurent.inline6', Boolean(parseFloat(inlineTable[5])));
      

      }

      ! //Главная периодическая функция
      function mainPoll ()
      {
      request ('http://'+IP+'/state.xml', statusProcessing);
      }
      ! //Подписываемся на состояние реле/выключателя
      on('javascript.0.laurent.relay1', relaySwitch);
      on('javascript.0.laurent.relay2', relaySwitch);
      on('javascript.0.laurent.relay3', relaySwitch);
      on('javascript.0.laurent.relay4', relaySwitch);
      ! //Задаем выполенение функции через определенный интервал
      var timerID = setInterval(mainPoll, Period);

      В целом он работает нормально, за одним исключением.
      
      Я думаю там понятно, но на всякий случай объясню поподробнее.
      
      Актуальна работа реле. В Лоране их 4.
      
      В интерфейсе создаются выключатели (объекты), там их 4.
      
      Например первый выключатель, для реле 1 вот этот:
      
      createState('laurent.relay1','',{type:'boolean',role:'switch',read:true,write:true});
      
      Там есть функция, которая периодически вызывается, эта функция опрашивает Лоран, получает xml c состояниями, в том числе и реле:
      
      function mainPoll ()
      
      {
      
      request ('http://'+IP+'/state.xml', statusProcessing);
      
      }
      
      Потом есть функция, которая парсит этот файл, узнает состояние реле, и записывает его в наш объект.
      
      setState('laurent.relay1', Boolean(parseFloat(relayTable[0])), true);
      
      Далее, мы хотим управлять реле.
      
      Подписываемся на его состояние (объекта):
      
      on('javascript.0.laurent.relay1', relaySwitch);
      
      Функция проверяет, что состояние объекта было изменено, и если оно было изменено в интерфейсе (проверяет ack), то посылает http-команду Лорану.
      
      function relaySwitch (obj)
      
      {
      
      if (obj.state.ack === false && obj.state.val === true)
      
      {
      
      request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(/[1-9]/)+',1');
      
      }
      
      else if (obj.state.ack === false && obj.state.val === false)
      
      {
      
      request ('http://'+IP+'/cmd.cgi?cmd=REL,'+obj.id.match(/[1-9]/)+',0');
      
      }
      
      }
      
      И это работает.
      
      Но иногда возникает конфликт.
      
      Например, реле выключено.
      
      Включаешь в интерфейсе этот выключатель, соответствующий реле. Он нормально становится включенным, команда посылается, реле щелкает. Но видимо как раз в этот момент происходит опрос, в результате которого реле еще выключено. И состояние его в интерфейсе становится выключенным. Ну, и после следующего периода опроса становится нормальным (включенным).
      
      Надеюсь, понятно объяснил.
      
      Что можно сделать в этом случае?
      posted in ioBroker скрипты
      V
      Vital
    • RE: Не обновляется автоматически состояние в визуализации

      @Bluefox:

      Как выглядят имена переименованных и непереименованных объектов? `
      Переименованный порт, как указано на втором скриншоте в первом сообщении - P23 (8) - Door Sens

      Имена "по умолчанию" - P24, P25, P26 и т.д. (ID соответственно megadd.0.p24_P24 и т.д.)

      posted in ioBroker ошибки
      V
      Vital
    • Не обновляется автоматически состояние в визуализации

      Ковырялся с драйвером MegaD и наткнулся на следующий косяк.

      Видимо, это не косяк драйвера MegaD, а более глобальный косяк системы или визуализации. Его смысл в следующем.

      Для тестирования я сделал тестовую визуализацию, типа входная линия у меня - это датчик двери. Также я вынес значение счетчика срабатываний в виджет, а также просто значения переменных.

      И я обнаружил, что переменные у меня работают нормально, но в визуализации изменения не отображаются до обновления страницы.

      Пример приведен на рисунках. В реальности переменные "True" и "17", а визуализации эти значения "False" и "15". И так пока не обновить страницу в браузере - после этого становится правильно. Браузеры - Firefox и Chromium. Конечно, я пробовал много раз, ждал, и т.д. Становится правильно только после обновления страницы.

      Но дело в том, что что аналогичные действия для других входных портов работают нормально.

      Я предполагаю, что дело может быть в том, что этот порт я переименовывал, а порты с которыми все нормально - нет.
      3553_megad-iob-05.jpg
      3553_megad-iob-04-2.jpg

      posted in ioBroker ошибки
      V
      Vital
    • RE: Драйвер MegaD-2561

      @Haus:

      Vital, какой тайный смысл использовать MegaD с IoBroker без отправки изменений состояния порта? Логика драйвера + скрипты для полноценной связи с MegaD и нормального отображения в vis. `

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

      Ну и самое главное - я все же не могу понять - это баг или фича - такая работа? Я имею ввиду, что опрос вроде как происходит, переменная моргает, но возвращается к предыдущему значению… Баг или фича?

      posted in ioBroker драйвера
      V
      Vital
    • RE: Драйвер MegaD-2561

      @Haus:

      Если речь идёт о кнопке то поставь голки после Mode в MegaD и в драйвере Misc, ну и для отработки выхода нужен скрипт `

      Спасибо!

      При установленной галоче в настройке драйвера Misc - работает порт.

      Однако я все равно не понимаю некоторых моментов.

      Уважаемый Нaus, вы разработчик этого плагина, можете пояснить логику работы его?

      Наблюдения мои следующие (версия 0.2.0):

      Если в настройках Меги прописан сервер (и стоят выше указанные галочки), то при срабатывании порта я сразу вижу результат в IOB. ОК, так и должно быть.

      Далее, если я удаляю сервер из настроек, то при срабатывании порта (и если стоят выше указанные галочки), то я вижу результат срабатывания порта максимум через время, указанное в настройках драйвера как "Интервал опроса (сек)". И это тоже выглядит логично. Я так понимаю, с этим интервалом драйвер посылает в Мегу команду http://192.168.0.14/sec/?cmd=all, получает ответ такого типа

      OFF/0;OFF/0;OFF/0;OFF/0;OFF/0;OFF/0;OFF/0;OFF;OFF;OFF;OFF;OFF;OFF;OFF;OFF;OFF/0;temp:24.18;OFF;OFF;OFF;OFF;OFF/0;OFF/0;OFF/0;OFF/3;OFF/0;OFF/0;OFF;temp:23.75;OFF;OFF/0;OFF;OFF;OFF;OFF;OFF;ON;ON

      и разбивает его на составляющие, и каждому порту в драйвере назначает требуемое состояние. Верно?

      Но тогда почему при убранных галочках (которые отвечают за отправку Мегой состояния на сервер), ничего не происходит? Ведь драйвер насильно опрашивает состояния с указанным интервалом? И ведь реально что-то происходит, переменная на доли секунды меняет значение, а потом возвращается обратно…

      posted in ioBroker драйвера
      V
      Vital
    • RE: Драйвер MegaD-2561

      > Покажи настройки порта MegaD и драйвера

      На личное сообщение не могу ответить - типа вроде еще слишком новенький…
      3553_megad-iob-02.jpg
      3553_megad-iob-03.jpg

      posted in ioBroker драйвера
      V
      Vital
    • RE: Драйвер MegaD-2561

      Добрый день!

      Подскажите куда копать, плз.

      Решил поизучать IOB. Поставил, подключаюсь к Меге.

      У меня MegaD-2561, MegaD-7170-R и MegaD-14-IN. Все в целом нашлось, реле работают.

      Но косяк со входными линиями.

      Я пока не стал настраивать отсылку MegaD'ом команды на срабатываение линии даже.

      Просто опрос. Ведь это должно работать, верно я понимаю? Раз в 30 секунд (или сколько там поставить в настройках) обновляются данные, и максимум с запозданием в 30 секунд состояние порта станет актуальным в IOB, так?

      Постараюсь пояснить что происходит.

      Итак, если вход в состоянии OFF, он виден в IOB нормально, как на картинке.

      Если я замыкаю контакты входной линии, то либо ничего не происходит, но обычно, как будто при обновлении, значение становится зеленым, где-то на доли секунды слово false меняется на true, и потом обратно, и так каждый раз при обновлении состояния.

      Соответственно, если я, например назначу этот вход как датчик окна в визуализации, окно либо все равно выглядит закрытым, либо начинает "хлопать" - то закрыто, то открыто, особенно если поставить время обновления почаще.

      Обновление же состояния реле, если я им "щелкну" из другого места, происходит корректно…

      Может что-то не так?
      3553_megad-iob-01.jpg

      posted in ioBroker драйвера
      V
      Vital
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo