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