Не удается получить сообщения от tuyapi к узлу red
У меня есть мини-переключатель Tuya, который, похоже, не работает с различными предлагаемыми узлами tuyapi, поэтому я решил написать свой собственный. В node.js я могу использовать tuyapi для управления устройством и отчета о состоянии устройства. Однако, когда я пытаюсь перенести это на красный узел, это работает только наполовину. Я могу запустить событие (в основном включить или выключить переключатель), но я не могу отправить какие-либо сообщения о состоянии в msg.payload. Я могу отправлять сообщения в console.log и получать их окольными путями, но было бы намного проще и проще, если бы я мог получать сообщения через msg.payload, а затем реагировать на них соответствующим образом.
К сожалению, мои знания javascript ограничены, поэтому поиск решения этой проблемы также был бы отличным опытом обучения. Ниже приведен мой пример кода:
// Node Red version of require
global.get('TuyAPI');
// New instance of tuyapi
const device = new TuyAPI({
id: 'XXXXXXXXXXXXXXXXXXXXXXXX',
key: 'XXXXXXXXXXXXXXXX'
});
// Variable to indicate the switch is on/off
let stateHasChanged = false;
// Connect listener event
device.find().then(() => {
// Connect to device
device.connect();
});
// Disconnect listener event
device.on('disconnected', () => {
return msg;
});
// Data handling listener event
device.on('data', (/** @type {{ dps: { [x: string]: any; }; }} */ data) => {
msg.payload = "${ data.dps['1'] }"
if (!stateHasChanged) {
device.set({ set: !(data.dps['1']) });
stateHasChanged = true;
}
});
// Run for 5 seconds then disconnect
setTimeout(() => { device.disconnect(); }, 5000);
Результат: переключатель включает/выключает, msg.payload пуст.
Заранее спасибо за любую помощь предложений.
1 ответ
Благодаря комментариям от я нашел решение. Частично это было связано с моей неопытностью в javascript, то есть я забыл, что глобальная переменная не означает, что вы можете просто экспортировать данные из функции через переменную. Таким образом, доступ к данным и их экспорт должны выполняться в рамках одной и той же процедуры. Что я не знал и что user504554 любезно указал мне на использование node.send , который в основном делает именно то, что я хочу, для экспорта данных из процедуры.
Ниже приведена рабочая копия исходного кода с удаленной избыточной процедурой (on.disconnect). Надеюсь, что код и объяснение помогут другим с похожей проблемой.
global.get('TuyAPI');
const device = new TuyAPI({
id: 'XXXXXXXXXXXXXXXXXXXXXX',
key: 'XXXXXXXXXXXXXXXX'
});
let stateHasChanged = false;
// Find device on network
device.find().then(() => {
// Connect to device
device.connect();
});
device.on('data', (/** @type {{ dps: { [x: string]: any; }; }} */ data) => {
if (!stateHasChanged) {
device.set({ set: !(data.dps['1']) });
stateHasChanged = true;
msg.payload = data.dps['1']; // position changed; previously it returned the state BEFORE the switch event
node.send(msg); // used node.send instead of returning the message object and not having this within the on.disconnect listening event
}
});
// Disconnect after 5 seconds
setTimeout(() => { device.disconnect(); }, 5000);