Navigation

    Forum

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • intraHouse Site
    1. Home
    2. intrapro
    I
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    intrapro

    @intrapro

    administrators

    14
    Reputation
    736
    Posts
    28
    Profile views
    1
    Followers
    1
    Following
    Joined Last Online

    intrapro Follow
    administrators

    Best posts made by intrapro

    • RE: Сценарии - новая версия API

      Участник @homa написал

      И следом вопрос корректно ли объявлять одно и тоже свойство для одного и того же устройства в разных сценариях, или есть какие-то другие варианты обращения к ранее объявленным свойствам

      идея в том, чтобы изменять из разных сценариев одно свойство... выходит не выходит)

      Почему не выходит? Без проблем можно обращаться к одному свойству устройства из нескольких сценариев. При этом достаточно объявить свойство в одном сценарии, в других можно и не объявлять. При объявлении это свойство создается на уровне устройства. Проблема отсутствия свойства может быть только при первом запуске и после перезагрузки.

      posted in Сценарии
      I
      intrapro
    • RE: Подключение DHT22 на RASPBERRY PI 4 GPIO

      @alexeyalvl, если порядок меняться не будет, то можно сделать так:

      Для считывания температуры (первый элемент):

      let value;
      if (!error && stdout) {
           value = parseFloat( stdout.split(' ').shift().split('=').pop() );
      }
      

      Для считывания влажности (второй элемент):

      let value;
      if (!error && stdout) {
           value = parseFloat( stdout.split(' ').pop().split('=').pop() );
      }
      

      Что тут делается:

      • stdout.split(' ') - строка разбивается на элементы, разделенные пробелом:
        [ 'Temp=24.3*', 'Humidity=48.6%' ]
      • shift() - берется первый элемент
        'Temp=24.3*'
      • split('=') - этот элемент разбивается на элементы, разделенные знаком =
        [ 'Temp', '24.3*' ]
      • pop() - берется последний элемент, то есть число
        '24.3*'
      • Результат обрабатывается функцией parseFloat, результат - 24.3

      Второе значение обрабатывается аналогично, только на втором шаге берется не первый элемент - shift(), а последний - pop()

      posted in Примеры сниппетов
      I
      intrapro
    • RE: Плагин MegaD

      Участник @Alex_Jet написал в Плагин MegaD:

      @intrapro, подключил ленту WS2818 к контроллеру, в канале плагина вписал команду управления /%pwd%/?pt=%adr%&ws=%value%&chip=151. Все работает, однако братья китайцы где-то напутали и поменяли местами R и G... как итог лента не RGB, а GRB... стандартными средствами плагина можно выйти из положения?

      Попробуйте в канале на вкладке Обработка прописать:
      Формула расчета выходного значения для актуаторов: [ value[1],value[0],value[2] ]

      Ну и входное тоже нужно так же:
      Формула расчета входного значения: [ value[1],value[0],value[2] ]

      Еще момент по уровню яркости. Если установить какой-нибудь цвет, то слайдер L по умолчанию переходит в значение 50. Если его двигать в сторону 0, то яркость выбранного цвета уменьшается, однако если двигать к 100, то яркость увеличивается, но и цвет плывет причем на 100 получается просто белый цвет. Это явно не верный алгоритм.

      Это вопрос спорный. Сейчас нужно ориентироваться, что трушный цвет при L=50

      А еще поработать бы с самим устройством. По идее индикатор 1 - это RGB параметры, а индикатор 2 - это уровень яркости. Однако сейчас индикатор 2 отображает, например, "0,255,0", хотя при настройке устройства на мнемосхеме отображается уровень в виде "100". При нажатии на устройство - ничего не меняется - (картинки одинаковые), уровень остается тот же.

      Да, с индикаторами не очень 😞 Сейчас наверху выводится текущее значение массива, внизу должно быть дефолтное значение (для команды on) Cостояния on/off должны переключаться. Попробуйте нажать кнопку Выключить в боковом меню. Должны уйти нули, а устройство перейти в состояние выключено. Ну а картинку для активного состояния сами раскрасьте 🙂

      posted in Плагины
      I
      intrapro
    • RE: Свет по датчику движения с дополнительными условиями.

      Участник @Erik написал

      И еще вопрос.

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

      При условии if ((SAF.value === 0) && (sw.value === 0) && (lamp.value == 1)) проверить, что таймер запущен, и обнулить его (тот же самый таймер).

      Для этого нужно добавить внутрь сценария "слушателя событий"

      script({
          start() {
            if ((SAF.value === 0) && (sw.value === 0) && (lamp.value === 0)) {
               lamp.on();
               // взводим таймер, чтобы отключить 
               this.startTimer("T1", 180, "turnOff");       
              
              // Добавляем слушателей - следим за датчиком движения и светильником
              this.addListener(motion, "onMotion");
              this.addListener(lamp, "onLamp");
            }
          },
          
          onMotion() {
            // Если движение возобновилось - сбрасываем таймер
            if (motion.isOn() )  {
              this.stopTimer("T1");
            }  
             // Если движение прекратилось - взводим таймер (после повторных движений)
            if (motion.isOff() && this.timer.T1 == "off")  {
              this.startTimer("T1",  180, "turnOff");
            }  
          },
          
           onLamp() {
            // Светильник выключили другим способом - выходим
             if (lamp.isOff()) this.exit();
           },
           
          // Функция, которая сработает, когда таймер досчитает - отключаем и выходим
          turnOff() {
            lamp.off();
            this.exit(); // Здесь exit нужен, так как есть активные слушатели и сценарий сам не завершится
          }
      });
      

      Более подробно про механизм работы сценариев - https://ih-systems.com/ru/about-scenes/
      Если коротко:

      • Если внутри сценария просто последовательность действий, он отработает и сразу завершится (станет не активным). При следующем запуске он опять начнется со start(). Большая часть сценариев работает именно так и 99,9% времени находятся в неактивном состоянии.

      • Если сценарий взводит таймеры и/или устанавливает слушателя событий устройства, то он остается активным, следит за своими таймерами и устройствами «изнутри» и выполняет действия как реакцию на отслеживаемые события. Стартовое событие не работает, так как сценарий уже активен.. В рабочих сценариях в левом столбце у сценариев, активных в данный момент, стоит зеленая галочка.
        Чтобы завершить такой сценарий, нужно выполнить команду this.exit().
        При завершении сценария все его таймеры и слушатели удаляются. При следующем запуске опять выполнится start()

      posted in Сценарии
      I
      intrapro
    • RE: Вопросы по работе системы

      Пользователь @regabriel написал в Вопросы по работе системы:

      Здравствуйте. Не пойму ошибка или нет.
      Создаю устройство - виртуальный датчик температуры, чтобы в нем выводить среднюю температуру с нескольких других датчиков.
      Соответственно делаю мульти скриптик(так как таких средних будет несколько)
      в котором прописываю:

      const temp_room = Device("SensorA","Средняя температура комнаты"); 
      
      ....
      script({
          start() {
               temp_room.setValue(15);
      

      Так вот не работает x.setValue(15);
      Для "ActorA" работает.
      Это ошибка или так и должно быть?

      Добрый день. Да, все верно, датчику значение таким образом присвоить нельзя.
      Идея в том, что x.setValue задействует канал на запись, по которому значение записывается на железо. Датчик сам значение записать не может, его value только для чтения.
      Для реализации виртуального датчика есть команда this.assign( имя устр-ва, имя свойства, значение)

      this.assign(temp_room,"value",42);
      

      В настройках-> дополнительно ставлю метод определения состояния "вычисляется сценарием".

      Не совсем. У датчика есть value - значение и state - состояние, которое грубо говоря определяет картинку.
      Этот пункт относится к state, Вы же сценарием хотите присвоить value.
      Если нужно, чтобы средняя пересчитывалась динамически при изменении любого датчика, получится примерно так:

      const temp1 = Device("SensorA","Датчик 1"); 
      const temp2 = Device("SensorA","Датчик 2"); 
      const temp3 = Device("SensorA","Датчик 3"); 
      const temp4 = Device("SensorA","Датчик 4"); 
      const temp_room = Device("SensorA","Средняя температура комнаты"); 
      
      startOnChange([ temp1, temp2, temp3, temp4 ]); 
      
      script({
          start() {
              const average = (temp1.value+temp2.value+temp3.value+temp4.value)/4;
              this.assign(temp_room,"value", average);
        }
      })
      

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

      И второй вопрос: при создании устройства выбор - актуатор бинарный(т.е. 2 состояния)
      При этом в мультисценарии ActorD — дискретный актуатор.

      Дискретный актуатор - имеется в виду актуатор с конечным числом состояний.
      По умолчанию создается бинарный. Но можно расширить число состояний

      Можно ли сделать более 2 состояний у актуатора и датчика и как? Где посмотреть примеры или описания?

      Да, можно. Раздел Состояния устройств на странице https://ih-systems.com/ru/devices/

      По состояниям:

      • у дискретных датчиков и актуаторов обычно делают value=state,
        метод определения состояния "Стандартный"

      • у аналоговых можно использовать "Метод интервалов", то есть состояние расчитывается исходя из value, по нарастанию значения (более подробно см в док-и)

      метод определения состояния "вычисляется сценарием" после перехода на v4 не используется

      Также обратите внимание на 2 момента:

      1. Состояния должны нумероваться строго подряд, начиная с 0
      2. Если устройство уже стоит на мнемосхеме, после изменения числа состояний его нужно удалить и заново поставить. На мнемосхеме можно менять визуальное представление каждого состояния, причем каждое редактируется отдельно
      posted in intraHouse V4 Cherry
      I
      intrapro
    • RE: Плагин HTTP-Client

      @alesle пожалуйста 🙂
      Вот вариант еще короче

      data.onew_temp.find(item => item.name=="S6").t
      

      Современный javascript мощный и гибкий язык, особенно если использовать синтаксис ES6 (или ES2015, что одно и то же) , в данном случае стрелочные функции.
      Магия этих выражений раскрывается в 2 шага

      1. Массивы в JS имеют встроенные методы для поиска по заданному критерию, в частности filter, find

        • find - ищет первый элемент массива, возвращает найденный объект
        • filter - сюрприз 🙂 - фильтрует входной массив и возвращает все найденные элементы (learn.javascript.ru/array-methods)
      2. Методу нужно передать критерий отбора - функцию для обработки элемента массива.

        Если писать, используя синтаксис классических функций, то получится так:

         arr.filter( function (item) {
           return item.name == 'S6';  
        });
        

        Функция вызывается по очереди для каждого элемента массива (item), если возвращает true, то элемент берется в новый массив

        С введением в ES6 стрелочных функций все стало компактнее:

         function (item) {return item.name == 'S6';} 
        

        можно заменить на

         (item)  => item.name == 'S6' 
        

        Что произошло

      • убрали function
      • грубо говоря return заменили на =>
      • если входной аргумент ровно один - то и скобки можно не ставить

      Подробнее https://learn.javascript.ru/arrow-functions
      Получаем:

       arr.filter( item => item.name == 'S6' );
      

      Ну и надо иметь в виду, что возвращает метод массива.
      Если результат - массив, то берем свойство его первого элемента

      data.onew_temp.filter(item => item.name=="S6")[0].t
      

      Если результат - объект, то просто берем свойство t

      data.onew_temp.find(item => item.name=="S6").t
      
      posted in Плагины
      I
      intrapro
    • RE: Сниппеты на каждую функцию устройства.

      Участник @homa написал в Сниппеты на каждую функцию устройства.:

      А для сниппетов работаю интервалы? Что-то не получается...

      Проверили, должно работать.
      Если у вас аналоговый датчик, нужно, чтобы на вкладке Дополнительно в списке Метод определения состояния было выбрано Аналоговое значение - интервалы.
      Если сниппет возвращает значения подряд (0,1,...x), то можно сделать еще проще: взять дискретный датчик, у него добавить состояния 0,1,...x, метод переключать не надо, т к для дискретных датчиков состояние=значение

      В любом случае, если устройство уже стояло на мнемосхеме, а потом были добавлены состояния, то нужно устройство удалить и заново разместить, иначе будет ошибка Bad device

      posted in Сниппеты
      I
      intrapro
    • RE: Сценарии - новая версия API

      @Alex_Jet, Добрый день! @Erik прав - нужен актуатор, который можно переключать как угодно - интерактивно, сценарием, по расписанию...

      Сценарий гирлянды запускается при включении этого актуатора.

      Состояния в php скрипте меняются случайным образом, поэтому логика еще проще:

      1. Добавить слушателя для актуатора-триггера
      2. Генерировать строку цветов случайным образом
      3. Передать команду на MegaD
      4. Взвести таймер 1 сек

      По таймеру - повторить пункты 1-3
      При выключении триггера - завершить сценарий

      posted in Сценарии
      I
      intrapro
    • RE: Плагин MegaD

      Пользователь @regabriel написал в Плагин MegaD:

      Здравствуйте. Разбираюсь с системой и возникает множество вопросов))

      1. Как настраивается в плагине в канале"Функция обработки значения"?
        в каком виде можно писать?
        Например датчик температуры, если он показывает меньше -40, либо ровно 0, либо больше 100 значит он неисправен, как это записать?

      Добрый день.
      Настройку интервала допустимых значений можно настроить прямо на устройстве (min-max) . Там же можно определить, что делать, если произошел выход из диапазона:

      • "Не принимать значение вне диапазона" - значение не будет присвоено
      • "Установить ошибку при выходе из диапазона"

      Можно эти флаги устанавливать независимо. Также можно контролировать поступление данных - "Установить ошибку если нет данных в течение (сек)"

      device_setting.png

      Функция обработки в канале используется, если нужна сложная предварительная обработка. Например, от контроллера получаем 5 значений, сортируем, откидываем минимальное и максимальное и вычисляем среднее. И именно вычисленное значение отдаем ядру системы.
      Пример такой функции для плагина MegaD приведен в описании плагина (в конце страницы):
      https://ih-systems.com/ru/product/plugin-megad/

      1. Где вообще можно посмотреть хорошее описание API по intraHouse? Например по работе с БД?

      Пользовательские SQL запросы к БД на уровне ядра в версии 4 не поддерживаются. Можно писать и читать из сценария с помощью функций this.dbread(), this.dbwrite().
      Если нужно напрямую работать с БД, есть возможность написать отдельный плагин. Документации на эту тему нет 😞 , но есть примеры реализации.

      1. Как проверять работу сложного скрипта? Как посмотреть результаты работы consol.log('') или использовать какие либо аналоги ?

      Для отладки скрипта есть "Отладчик" в нижнем окне сценария. Там выводится трассировка при выполнении команд, таймеров, проверки условий.
      Вместо console.log в скрипте используйте. this.log(''), сообщение будет выведено в этом же окне

      posted in Плагины
      I
      intrapro
    • RE: Сниппеты

      @Alex_Jet Если работает, то по старому анекдоту про программиста и солнце, лучше и не трогать 🙂

      А серьезно (так понимаю, ожидается вещественное число), обработку результата можно сделать так:

      res.on('end', () => {
            const value = parseFloat(rawData);   
            callback(isNaN(value) ? "Не числовое значение "+rawData : "", value); 
      });
      

      Если придет не число, то в журнале устройства будет сообщение об ошибке

      posted in Сниппеты
      I
      intrapro

    Latest posts made by intrapro

    • RE: Плагины

      @SergeyK, добрый день!
      Нет, списка допущенных плагинов нет 🙂
      Не обязательно грузить плагин через zip. Достаточно поместить папку с плагином в /var/lib/intrahouse-c/plugins и обновить страницу с плагинами в PM IH - новый плагин должен появиться в списке плагинов (даже без перезагрузки сервера)
      При этом должны быть выполнены условия:
      название папки используется как идентификатор плагина, например myplugin

      Внутри папки плагина д б файл с именем myplugin.ih с таким содержанием:

          "id":"myplugin",  // должно совпадать с  идентификатором плагина
          "description":"Мой новый плагин ......",
          "cross":false,  // Здесь д б false, если у Вас плагин не на js
          "version":"0.0.1"
      }
      

      Плюс должен быть файл-манифест myplugin.json:

      {
          "name":"myplugin",
          "module": "myplugin.py",  // имя запускаемого файла
      ...
      

      EACCESS - ошибка доступа, не хватает прав.
      Более подробная диагностика должна быть в файле /opt/intrahouse-c/log/ih.log
      Попробуйте сделать файл со скриптом исполняемым для всех групп пользователей

      chmod ugo+x myplugin.py 
      
      // Или даже
      chmod 777 myplugin.py 
      
      posted in Плагины
      I
      intrapro
    • RE: Вопросы по работе системы

      @artem521, попробуйте на время архивации остановить плагины, которые часто меняют значение.
      Windows не дает сохранить файл, когда в него кто-то пишет 😞

      posted in intraHouse V4 Cherry
      I
      intrapro
    • RE: Вопросы по работе системы

      @artem521, добрый день!
      Действительно, не работает архивирование под Windows с использованием ключа -x
      Для фиксации этой ошибки выпущено обновление 4.7.11

      posted in intraHouse V4 Cherry
      I
      intrapro
    • RE: Неработае удаленное подключение p2p.

      Доступна версия 4.7.10, в который исправлена ошибка с параметром сценария.
      Ошибка возникала, если параметр передается при запуске сценария с кнопки интерфейса

      posted in Плагины
      I
      intrapro
    • RE: Неработае удаленное подключение p2p.

      @Alex_Jet, действительно, есть такое - параметры с кнопки в сценарий идут не чистые, а внутри объекта
      В ближайшее время выпустим обновление, спасибо за баг-репорт

      posted in Плагины
      I
      intrapro
    • RE: Плагины

      @SergeyK, добрый день!

      С плагинами, написанными не на JavaScript, iH работает через stdin, stdout

      Поэтому, чтобы принять команду от сервера, плагин может использовать sys.stdin.readline, а чтобы передать сообщение - sys.stdout.write

      Если просто использовать sys.stdin.readline(), то плагин будет только слушать ввод, выполнять команду и продолжать слушать. Другие действия (опрос входов, например) делать не получится. Можно начать с этого.

      На Python написан плагин Raspberry-GPIO, можно использовать его в качестве примера:
      https://github.com/intrahouseio/intraHouse.plugin-Raspberry-GPIO

      В плагине RPI выполняется обработка входов и выходов, поэтому используется модуль select: https://pymotw.com/2/select/

      import sys
      import select
      import RPi.GPIO as GPIO 
      
      # Функции модуля ....
      
      # Start main loop
      while True:
      
      	# select - обращение к ядру ОС для получения данных stdin
      	i,o,e = select.select([sys.stdin],[],[],0.001)
      
      	# Здесь выполняется опрос входов, эта часть опущена. ...
      		
      	# Чтение команд от сервера	
      	for s in i:
      		if s == sys.stdin:
      			input = sys.stdin.readline()
      		
      			# getCommands - это функция плагина, которая распарсит строку в массив. В строке может быть несколько команд
      			# для RPI передается в виде RPI?22=0001&23=0000&27=0001&/n
      			commands = getCommands(input[4:-1])
      			
      			## Выдаются команды на GPIO
      			for key in commands.keys():
      				pin = int(key)
      				val = int(commands[key])
      	
      				
      				GPIO.setup (pin, GPIO.OUT) 
      				GPIO.output(pin, val)	
      
      				# Передается на сервер, что выход переключен
      				sys.stdout.write('RPI?%I=%i\n' % (pin,val))
      			
      			# flush форсирует передачу в stdout
      			sys.stdout.flush()
      

      Как видно, сообщения - это просто строки. Формат сообщения можно сделать любой, как удобно для конкретного плагина

      Но ядро iH передает и принимает данные в JSON
      Поэтому, нужно либо использовать библиотеку для работы с JSON прямо в плагине
      Либо, как сделано в RPI-GPIO, включить в состав плагина модуль adapter.js, где выполнять преобразования JSON<->строка на js

      Модуль adapter.js должен находиться в корневом каталоге плагина и иметь метод formTele для формирования строки при отправке команды и readTele для чтения сообщения от плагина

      module.exports = {
      
        // { type: 'act', data:[{id:20, command:'on'},..] } => RPI?20=1&...
        formTele: function (mes, houser) {
          let arr = [];
      
          if (mes && mes.data) {
            mes.data.forEach(item => {
              let value;
              if (item.command == 'on') value = 1;
              if (item.command == 'off') value = 0;
      
              arr.push(item.id + "=" + value); // 
            });
            if (arr.length > 0) return "RPI?" + arr.join("&");
          }
        },
      
      
        // RPI?5=1 =>  {type:data, data:[{id:5, value:1}]}
        readTele: function (tele, houser) {
          if (!tele || tele.length < 5) return;
      
          let arr = tele.substr(4).split("=");
          if (arr && arr.length == 2) {
            return { type: "data", data: [{ id: arr[0], value: arr[1] }] };
          }
        }
      }
      
      posted in Плагины
      I
      intrapro
    • RE: Выключатель света не переключает значение

      @laronov, добрый день!
      В dval устройства должно приходить 1/0
      Для канала на вкладке Обработка -> Формула расчета входного значения пропишите:

      value == 'true' ? 1 : 0
      
      posted in intraHouse V4 Cherry
      I
      intrapro
    • RE: Вопросы по работе системы

      @int144, в Cherry зависимости проекта лучше ставить не в /opt/intrahouse-c, а в /var/lib/intrahouse-c.
      Можно сделать это вручную, как Вы и делали, но в другой папке.
      Можно использовать процедуру установки зависимости сниппета - создать новое устройство, на вкладке Дополнительно поставить галочку и прописать имя пакета. После сохранения изменений пакет должен установиться, его можно использовать в сценарии (установка может занять некоторое время) . Само устройство можно удалить, пакет останется.
      snipdep.png

      По поводу лицензии - она сейчас не активна, можно активировать заново.

      Кстати, в V5 внешние пакеты для проекта ставятся полностью интерактивно и переносятся вместе с проектом.

      posted in intraHouse V4 Cherry
      I
      intrapro
    • RE: Beta версия IH SmartHome V5

      @Anatol, добрый день. Скорее всего, возникает проблема со сценариями или сниппетами. Эти механизмы перерабатываются и пока не работают полноценно. Попробуйте переименовать папки scenes и snippets внутри проекта, например:
      /var/lib/ih-v5/projects/moi_dom/scenes => xscenes
      /var/lib/ih-v5/projects/moi_dom/snippets => xsnippets

      После перезагрузки сервера создадутся пустые папки scenes и snippets

      posted in intraHouse V5
      I
      intrapro
    • RE: Beta версия IH SmartHome V5

      Выпущен релиз 5.2.3-beta. Спасибо всем участникам beta-тестирования!!!

      Мы внимательно анализируем все поступающие багрепорты - на форуме, в Telegram, через встроенный в систему механизм багрепорта. Бывает, отвечаем не сразу, а после исправления.

      Изменения релиза 5.2.3-beta:

      • Исправлена загрузка изображений из zip через Import - багрепорт от @gis

      • Исправлена ошибка при округлении значений с десятичной точкой - багрепорт от @Anatol, @zahar69

      • Исправлена ошибка: После перезагрузки сервера данные неопределены (где показания стоят нули, состояние актуаторов off, появляются только после поступления данных) - багрепорт в Telegram

      • Исправлена ошибка при копировании загруженного контейнера с изображениями внутри - багрепорт из интерфейса

        Подробнее по этой проблеме: Создавалась папка в дереве изображений с изображениями контейнера (вида user@vc42). Нужно удалить эту папку и загрузить контейнер заново. В новой версии папка с изображениями контейнера создается с именем img_user@vc42. Ее можно свободно переименовывать, переносить изображения в другие папки. Цель создания - показать, какие новые изображения пришли вместе с контейнером (шаблоном, диалогом,...)

      • Изменена работа с журналом устройства

      • Доработаны компоненты диалога

      • Предпринимаем попытки тотальной русификации, начали с дашборда 🙂

      posted in intraHouse V5
      I
      intrapro