Не удается получить сообщения от 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); 
Другие вопросы по тегам