Плагины



  • Пользователь @intrapro написал в Плагины:

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

    Можно ли из сценария делать перезапуск плагина, или обновлять каналы ?

    Сейчас можно отправлять плагину из сценария любые команды, кроме перезапуска.
    Команды плагина прописаны в манифесте плагина в разделе "commands".
    Например:

    // Обновить значения переменных для плагина Wago IP
    this.plugincommand({ unit: 'wip1', command: 'getdata' });
    
    // Получить каналы с контроллера:
    this.plugincommand({ unit: 'wip1', command: 'channels' });
    

    По поводу перезапуска плагина, пока такой возможности нет.
    Рассматривается два варианта:

    1. Команды stop-start-restart из сценария
    2. Введение тайм-аута плагина, за которым следит сервер и перезагружает плагин, если от него не поступает сообщений в течение заданного тайм-аута.

    в сценарий добавил команду this.plugincommand({ unit: 'wip1', command: 'getdata' });
    лог плагина WAGO
    ошибка IH.png
    но ничего не происходит, переменные не обновляются. Из самого плагина кнопка обновить переменные стабильно работает. Что не так ? Вернее где ?



  • Пользователь @fanagor написал в Плагины:

    в сценарий добавил команду this.plugincommand({ unit: 'wip1', command: 'getdata' });
    лог плагина WAGO
    ошибка IH.png
    но ничего не происходит, переменные не обновляются. Из самого плагина кнопка обновить переменные стабильно работает. Что не так ? Вернее где ?

    Да, извините за неточность. В команде нужен еще любой канал контроллера. Так как плагин поддерживает подключение нескольких контроллеров, ему нужен любой канал, из него плагин извлекает идентификатор конкретного контроллера (часть после подчеркивания). Интерактивно вам тоже нужно выбрать строку в каналах, иначе команды нет в меню.

    // Обновить значения переменных для плагина Wago IP
    this.plugincommand({ unit: 'wip1', command: 'getdata', id:'STATUS_21C102'});
    


  • @intrapro, спасибо, теперь все работает.



  • Пользователь @intrapro написал в Плагины:

    Насколько часто происходит это зависание? Сервер и контроллер в одной сети?
    Можно попробовать установить Период синхронизации времени в параметрах плагина каждую минуту - две, тогда сервер будет постоянно слать время, и потерю связи можно будет увидеть.
    Но в целом ситуация странная, у себя мы пока ее воспроизвести не смогли.

    когда зависает вот что пишет отладчик плагина wago

    Завис wago.png

    Да, в одной сети, раз в сутки-двое виснет. Нет четкого времени.
    Лечится командой обновить значения с каналов или получить команды. Уже добавил в расписание сценарий. который раз в час обновляет.
    Но это костыль. Проблема то есть.



  • можно создать плагин для устройств бренда Miele? https://www.miele.com/developer/swagger-ui/index.html
    И конешно lg телевизоры https://youtu.be/f0i2R1cMWBg



  • Пользователь @fanagor написал в Плагины:

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

    Насколько часто происходит это зависание? Сервер и контроллер в одной сети?
    Можно попробовать установить Период синхронизации времени в параметрах плагина каждую минуту - две, тогда сервер будет постоянно слать время, и потерю связи можно будет увидеть.
    Но в целом ситуация странная, у себя мы пока ее воспроизвести не смогли.

    когда зависает вот что пишет отладчик плагина wago

    Завис wago.png

    Да, в одной сети, раз в сутки-двое виснет. Нет четкого времени.
    Лечится командой обновить значения с каналов или получить команды. Уже добавил в расписание сценарий. который раз в час обновляет.
    Но это костыль. Проблема то есть.

    Нет ответа ?



  • Возможно ли в плагин WAGO все-таки добавить команду перезапуска. Возможно из командной строки, либо что необходимо отредактировать в самом плагине. Не получается добиться стабильной работы. Раз в неделю виснет. Перезагрузка самого контроллера WAGO не помогает. Команда обновить данные помогает в 8 случаях из 10. Однозначно лечится: "Остановить плагин" затем "Запустить плагин", затем перезагрузить IH, "Получить каналы", "Обновить значение переменных". Перезагрузить, получить, обновить,- знаю как сделать, а вот остановить и запустить нет.



  • @fanagor
    Когда перезагружаете iH, нет необходимости перед этим перезагружать плагин.
    При запуске сервиса iH все плагины запускаются вновь автоматически.



  • @intrahouse, спасибо за добавление возможности из сценария делать перезапуск плагинов. Решило множество вопросов. То, что нужно !



  • Вопрос, где в проекте хранятся настройки плагинов ? Не сами плагины, а их настройки ip, каналы и т.д.
    При перезагрузке IH возникает ситуация, что плагины вдруг становятся "чистые": ip по умолчанию, каналов нет и т.д . Слетают все настройки. Загружаешь резервную копию проекта - настройки восстанавливаются.
    Спасибо.



  • Все хранится в папке jbase проекта: /var/lib/intrahouse-c/projects/YourProject/jbase

    Настройки плагинов в файле units.json

    Настройки каналов и привязки к устройствам devhard.json

    Для плагинов, которые сами передают свои каналы, создаются файлы во вложенной папке channels отдельно для каждого экземпляра плагина, например: channels/wip1.json, channels/wip2.json

    Привязка канал-устройство так же в devhard.json



  • @intrapro, спс



  • Добрый день.
    Wago 750-881 не выпускается более. На каких семействах контроллеров будет работать библиотека ? Или нужно будет индивидуально адаптировать под каждый.



  • @fanagor замена 750-881 контроллер 750-891.



  • Доброго дня. По непонятной причине файл units.json где находятся настройки плагинов "слетает". Может раз в месяц, может раз в неделю, отчего плагины перестают работать.
    Лечится, как уже писал ранее, заменой данного файла с рабочей копии.
    Вопрос. Встречалось у кого и почему ?
    И подскажите, как правильно выполнить автоматическое восстановление.
    Мысли такие, сценарий IH, отслеживает работу плагинов, если все плохо, то запускает скрипт, который останавливает интру, заменяет файл units.json, запускает интру.



  • Пользователь @fanagor написал в Плагины:

    Мысли такие, сценарий IH, отслеживает работу плагинов, если все плохо, то запускает скрипт, который останавливает интру, заменяет файл units.json, запускает интру.

    "Интра" - это IH? Сценарий IH если остановит "интру", то убьет сам себя. Он же в "интре" исполняется. И уже ничего больше не сделает.

    У меня ни разу файл не "слетал".



  • Пользователь @Erik написал в Плагины:

    Сценарий IH если остановит "интру", то убьет сам себя. Он же в "интре" исполняется. И уже ничего больше не сделает.

    Да, все так, все понятно. Идея была другая, что IH запустит внешний скрипт, который бы и выполнил эти действия.
    Пока задача решилась, не останавливая IH.
    В сценарий прописал
    this.execOS(sudo cp -f /home/max/Документы/Конфиги/рабочий/units.json /var/lib/intrahouse-c/projects//project_65_2/jbase/);
    this.execOS(sudo service intrahouse-c restart);
    копирование и перезагрузка. Не знаю насколько правильно это, но работает.



  • Добрый день!
    Возникла необходимость управления выводами контроллекра Arduino, подключенного через USB к RPI (на которой установлен IntraHouse Lite). Напрямую в Питоне, с помощью библиотеки pyfirmata
    все работает нормально.
    Просба помочь с разработкой плагина, так как не могу разобраться с принципом передачи информации от IH к плагину (Python только начал изучать, манифест написал).
    Вот программа на Python, которая из RPI работает (ключает и выключает светодиод на 13 ноге Arduino каждую секунду)PY1.jpg



  • Пользователь @SergeyK написал в Плагины:
    👍

    Просьба помочь с разработкой плагина

    Обязательно поможем. Просьба немного подождать, на этой неделе решим.



  • @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] }] };
        }
      }
    }
    

Авторизуйтесь, чтобы ответить