Плагины
-
@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 каждую секунду)
-
Пользователь @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