Сообщения между экземплярами
Состояния — это значения: они существуют в дереве объектов, любой может их прочитать, и они сохраняются. Для многих вещей это вполне уместно. Однако для задачи это не так.
"Отправить это сообщение через Telegram" — это не значение, которое где-то хранится. Это одноразовая инструкция, часто содержащая несколько деталей, а иногда и ответ. Для этого и существует поле для сообщений.
Требование
Экземпляр может получать сообщения только в том случае, если его адаптер об этом сообщит.io-package.json :
"common": {
"messagebox": true
}
Это позволяет ioBroker создавать объект для каждого экземпляра.system.adapter.<name>.<nummer>.messagebox Если запись отсутствует, каждая последующая запись исчезает.sendTo Не оставив и следа. Это самая распространенная причина, по которой сообщения, казалось бы, не доходят.
Отправлять
this.sendTo('telegram.0', 'send', { text: 'Waschmaschine fertig' });
Три элемента информации всегда одни и те же: кому , какая команда , какая полезная нагрузка . Полезная нагрузка произвольна, обычно это объект.
Если требуется получить ответ, добавляется четвертый параметр:
this.sendTo('sql.0', 'getHistory', {
id: 'javascript.0.Temperatur',
options: { start: Date.now() - 3600000, aggregate: 'average' }
}, result => {
this.log.info(`${result.result.length} Werte erhalten`);
});
Обратный вызов будет асинхронным. Тем, кто не хочет ждать бесконечно, следует указать крайний срок:
this.sendTo('sql.0', 'getHistory', payload, callback, { timeout: 5000 });
Без указания крайнего срока запрос, скорее всего, останется на рассмотрении неопределенное время, если другая сторона не ответит.
Из скрипта в JavaScript-адаптере тот же вызов просто повторяется...sendTo(...) , безthis Это тот же самый механизм.
Полученный
Сообщение отображается в адаптере.onMessage Прибывший объект имеет четыре поля:
| Поле | Содержание |
|---|---|
command | Команда, то есть второй аргументsendTo . |
message | Полезная нагрузка. |
from | Кто бы ни отправил, напримерsystem.adapter.javascript.0 . |
callback | Устанавливается только в том случае, если отправитель ожидает ответа. |
onMessage(obj) {
if (!obj) {
return;
}
switch (obj.command) {
case 'send':
this.sendMessage(obj.message);
if (obj.callback) {
this.sendTo(obj.from, obj.command, { sent: true }, obj.callback);
}
break;
default:
this.log.warn(`Unbekannter Befehl: ${obj.command}`);
if (obj.callback) {
this.sendTo(obj.from, obj.command, { error: 'unknown command' }, obj.callback);
}
break;
}
}
В этом контексте важны две вещи.
Всегда отвечайте, когдаobj.callback Крайний срок установлен. Даже в случае ошибки. В противном случае отправитель застрянет в установленном сроке, а если он его не установил, то это навсегда.
obj.fromиobj.callback Верните его без изменений. Ответ найдется сам собой, исходя из этих двух фрагментов информации. Любой, кто попытается собрать их самостоятельно, отправит сообщение в пустоту.
Что с этим можно сделать?
Заказы на другие адаптеры. Классический случай: адаптеры уведомлений, такие какtelegram ,pushover илиemail Они принимают заказы только таким способом.
Извлечение значений из базы данных.getHistory кhistory ,sql илиinfluxdb Предварительным условием являетсяcommon.getHistory: true на приемном адаптере. См. запись данных .
Обратитесь к собственному интерфейсу настройки. Страница конфигурации в административной панели может...sendTo Отправьте данные в свой собственный экземпляр, например, чтобы получить список обнаруженных устройств или проверить входные данные. Это наиболее удобный способ, когда для проверки требуются знания, которыми обладает только код адаптера.
Для корректной работы этот процесс должен выполняться . Остановленный экземпляр не имеет панели сообщений, которой кто-либо управляет. Интерфейс конфигурации должен это обнаружить и отобразить понятное сообщение, а не просто указать на истечение срока действия.
Вместо экземпляра — хосту.
sendToHost Это подключение осуществляется не к экземпляру системы, а к JS-контроллеру хоста. Это позволяет получать информацию о системе и выполнять административные команды, такие как вывод списка экземпляров или чтение файлов журналов. Именно этот метод использует администратор.
верно
Для отправки сообщений требуется отдельное разрешение. Оно указано в разделе управления пользователями.sendTo Это отдельное разрешение, не связанное с правами на чтение и запись объектов. Пользователь без этого разрешения не может отправлять никакие команды, даже если у него есть права на чтение всего остального. См. раздел «Пользователи и разрешения» .