ChrisScheffler / miflora

Node.js package for the Xiaomi Plant Sensor Flower Care (Mi Flora)
MIT License
43 stars 12 forks source link

Added the option to clear the existing devices in the discover method so the whole scan process can start again from the begining. #18

Open sidequestlegend opened 2 years ago

sidequestlegend commented 2 years ago

I was attempting to use miflora in a custom node in node-red. When it re-deploys a node it will re-run all the code and I was having trouble tearing down the miflora connection and it would break on each deploy until I restarted node-red. I discovered this was due to the main miflora devices object was not reset between calls to the discover method so the same device was never discovered again and it seemed to break things. This commit hopefully solves that. Here is some code demonstrating the problem:

const miflora = require('miflora');
const opts = { 
    duration: 60000, 
    ignoreUnknown: true, 
    addresses: ['c4:7c:8d:66:23:b5']
};
(async () => {
        console.log('attempt 1')
        let device = (await miflora.discover(opts))[0];
        await device.querySensorValues();
        await device.disconnect();
        console.log('done attempt 1');

        miflora._devices = {}; // Without this line the below would fail to find the device. 

        console.log('attempt 2')
        device = (await miflora.discover(opts))[0];
        await device.querySensorValues();
        await device.disconnect();
        console.log('done attempt 2');

})();

This PR adds an option clearDevices to the options passed to the discover method to that the above would become:

const miflora = require('miflora');
const opts = { 
    duration: 60000, 
    ignoreUnknown: true, 
    clearDevices: true,
    addresses: ['c4:7c:8d:66:23:b5']
};
(async () => {
        console.log('attempt 1')
        let device = (await miflora.discover(opts))[0];
        await device.querySensorValues();
        await device.disconnect();
        console.log('done attempt 1');

        console.log('attempt 2')
        device = (await miflora.discover(opts))[0];
        await device.querySensorValues();
        await device.disconnect();
        console.log('done attempt 2');

})();

Thank you!