Files
scrypted/plugins/mqtt/fs/examples/loopback-light.ts
2022-08-22 13:28:48 -07:00

42 lines
1.7 KiB
TypeScript

import { ScriptDevice } from "@scrypted/common/src/eval/monaco/script-device"; // SCRYPTED_FILTER_EXAMPLE_LINE
import { OnOff, Brightness, ScryptedDeviceBase } from "@scrypted/sdk"; // SCRYPTED_FILTER_EXAMPLE_LINE
import { MqttClient, MqttEvent } from "../../src/api/mqtt-client"; // SCRYPTED_FILTER_EXAMPLE_LINE
declare const device: ScriptDevice & ScryptedDeviceBase; // SCRYPTED_FILTER_EXAMPLE_LINE
declare const mqtt: MqttClient; // SCRYPTED_FILTER_EXAMPLE_LINE
/**
* This is an example of a loopback light device.
* Turning the light on or off will publish a set command on the MQTT broker.
* This command will update the status on the MQTT broker.
* The status update will then be reported back to Scrpyted and will update the device state.
* View the Console and the Logs to watch it in action.
*/
mqtt.subscribe({
// watch for set commands on the server, and publish status updates
'/brightness/set': value => updateStatus(value),
'/light/set': value => updateStatus(value),
// status updates from the server update the status on Scrypted
'/status': value => {
device.on = value.json.on;
device.brightness = value.json.brightness;
},
});
function updateStatus(value: MqttEvent) {
mqtt.publish('/status', Object.assign({}, {
on: device.on,
brightness: device.brightness,
}, value.json));
}
/**
* Commands from Scrypted (via the web dashboard, HomeKit, Google Home, etc)
* get handled here and sent to the MQTT broker.
*/
export default {
turnOff: () => mqtt.publish('/light/set', { on: false }),
turnOn: () => mqtt.publish('/light/set', { on: true }),
setBrightness: brightness => mqtt.publish('/brightness/set', { brightness }),
} as OnOff & Brightness;