Deployments associate firmware images to devices. NervesHub won't send firmware to a device until you create a deployment. First find the UUID of the firmware. You can list the firmware on NervesHub by calling:
mix nerves_hub.firmware list​Firmwares:------------product: exampleversion: 0.3.0platform: rpi3architecture: armuuid: 1cbecdbb-aa7d-5aee-4ba2-864d518417df
In this example we will create a new deployment for our test group using firmware 1cbecdbb-aa7d-5aee-4ba2-864d518417df
.
mix nerves_hub.deployment create​NervesHub organization: nerveshubDeployment name: qa_deploymentfirmware uuid: 1cbecdbb-aa7d-5aee-4ba2-864d518417dfversion condition:tags: qaLocal user password:Deployment test created
Here we create a new deployment called qa_deployment
. In the conditions of this deployment we left the version condition
unspecified and the tags
set to only qa
. This means that in order for a device to qualify for an update, it needs to have at least the tags [qa]
and the device can be coming from any version.
At this point we can try to update the connected device.
Start by bumping the application version number from 0.1.0
to 0.1.1
. Then, create new firmware:
mix firmware
We can publish, sign, and deploy firmware in a single command now.
mix nerves_hub.firmware publish --key devkey --deploy qa_deployment
It's not always appropriate to apply a firmware update immediately. Custom logic can be added to the device by implementing the NervesHubLink.Client
behaviour and telling the NervesHubLink OTP application about it.
Here's an example implementation:
defmodule MyApp.NervesHubClient do@behaviour NervesHubLink.Client​# May return:# * `:apply` - apply the action immediately# * `:ignore` - don't apply the action, don't ask again.# * `{:reschedule, timeout_in_milliseconds}` - call this function again later.​@impl NervesHubLink.Clientdef update_available(data) doif SomeInternalAPI.is_now_a_good_time_to_update?(data) do:applyelse{:reschedule, 60_000}endendend
To have NervesHubLink invoke it, update your config.exs
as follows:
config :nerves_hub_link, client: MyApp.NervesHubClient