Advanced Images Images can be used in various places throughout Homey, such as album art for speakers, camera devices and in Flows.
When an Image
is created, it needs a way of providing Homey with its data. This can be either:
an URL, available from anywhere on the internet
a binary stream through the getStream
method
a local path to a static image which is shipped with the App.
Note: Images are limited to 5 MB.
Creating an image
Using an URL
URLs should be used when the image is available publicly on the internet.
Copy const Homey = require('homey');
class App extends Homey.App {
async onInit() {
const myImage = await this.homey.images.createImage();
// the URL must start with https://
myImage.setUrl("https://www.example.com/image.png");
}
}
module.exports = App;
Using a Stream
Streams should be used when downloading an image that cannot be supplied using Image#setUrl()
. Using image streams involves writing data directly into a Node.js stream. Using streams requires homey version 2.2.0 or higher.
Copy const Homey = require('homey');
const fetch = require("node-fetch");
class App extends Homey.App {
async onInit() {
const myImage = await this.homey.images.createImage();
myImage.setStream(async (stream) => {
const res = await fetch("http://192.168.1.100/image.png");
if (!res.ok) {
throw new Error("Invalid Response");
}
return res.body.pipe(stream);
});
}
}
module.exports = App;
Using a Path
Paths should be used when the image is locally available.
Copy const Homey = require('homey');
class App extends Homey.App {
async onInit() {
const myImage = await this.homey.images.createImage();
myImage.setPath("/userdata/image.png");
}
}
module.exports = App;
Updating the image
Call Image#update()
when the image has been updated, and the front-end will download the image again.
When your image uses a Stream, the method provided in Image#setStream()
will be called again.
At any time, you can switch between delivery type by calling Image#setPath()
, Image#setStream()
or Image#setURL()
.
Retrieving an image
It is also possible to consume an image in your app, for instance through use of Flow Tokens.
Copy const { PassThrough } = require("stream");
const fetch = require("node-fetch");
const FormData = require("form-data");
//uploads an image to imgur and returns a link
async function uploadImage(image) {
const stream = await image.getStream();
const form = new FormData();
form.append("image", stream, {
contentType: stream.contentType,
filename: stream.filename,
name: "image",
});
form.append(
"description",
`This image can also be (temporarily) viewed at: ${image.cloudUrl} and ${image.localUrl}`
);
const response = await fetch("https://api.imgur.com/3/image", {
method: "POST",
//pipe through a passthrough stream, workarround for a node-fetch bug involving form-data streams without content length set.
body: form.pipe(new PassThrough()),
headers: {
...form.getHeaders(),
Authorization: "Client-ID <YOUR_CLIENT_ID>",
},
});
if (!response.ok) {
throw new Error(response.statusText);
}
const { data } = await response.json();
return data.link;
}