Skip to content

Latest commit

 

History

History
103 lines (79 loc) · 2.75 KB

advanced-api.md

File metadata and controls

103 lines (79 loc) · 2.75 KB

Advanced API

miio.browse()

miio.browse() can be used to discover devices on the local network.

const browser = miio.browse({
  cacheTime: 300 // 5 minutes. Default is 1800 seconds (30 minutes)
});

const devices = {};
browser.on('available', reg => {
  if(! reg.token) {
    console.log(reg.id, 'hides its token');
    return;
  }

  // Directly connect to the device anyways - so use miio.devices() if you just do this
  reg.connect()
    .then(device => {
      devices[reg.id] = device;

      // Do something useful with the device
    })
    .catch(handleErrorProperlyHere);
});

browser.on('unavailable', reg => {
  const device = devices[reg.id];
  if(! device) return;

  device.destroy();
  delete devices[reg.id];
})

You can also use mDNS for discovery, but this library does not contain a mDNS implementation. You can choose a mDNS-implementation suitable for your needs. Devices announce themselves via _miio._udp and should work for most devices, in certain cases you might need to restart your device to make it announce itself.

device.call(method, args) - Raw API-usage and calling the Xiaomi miIO-method directly

It's possible to call any method directly on a device without using the top-level API. This is useful if some aspect of your device is not yet supported by the library.

// Call any method via call
device.call('set_mode', [ 'silent' ])
  .then(console.log)
  .catch(console.error);

Important: call is advanced usage, the library does very little for you when using it directly. If you find yourself needing to use it, please open and issue and describe your use case so better support can be added.

Define custom properties

If you want to define some custom properties to fetch for a device or if your device is not yet supported you can easily do so:

// Define a property that should be monitored
device.defineProperty('mode');

// Define that a certain property should be run through a custom conversion
device.defineProperty('temp_dec', v => v / 10.0);

// Fetch the last value of a monitored property
const value = device.property('temp_dec');

Device management

Get information and update the wireless settings of devices via the management API.

Discover the token of a device:

device.discover()
  .then(info => console.log(info.token));

Get internal information about the device:

device.management.info()
  .then(console.log);

Update the wireless settings:

device.management.updateWireless({
  ssid: 'SSID of network',
  passwd: 'Password of network'
}).then(console.log);

Warning: The device will either connect to the new network or it will get stuck without being able to connect. If that happens the device needs to be reset.