Плагины



  • Пользователь @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] }] };
        }
      }
    }
    


  • Спасибо большое за развернутый ответ! Буду продолжать разработку и держать вас в курсе текущих дел.



  • Это сообщение удалено!


  • Это сообщение удалено!


  • Добрый день!
    Написал плагин. Загрузил в IH Lite. При попытке запуска выдает "Не удалось выполнить команду! spawn EACCES". Попробовал в ZIP заархивировать работающий плагин с другим названием архива, - аналогичная ситуация. Логика подсказывает что где-то в ядре IH имеется библиотека "допущенных" плагинов. Подскажите, пожалуйста



  • @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 
    

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