feat: wait for enrolled sensors to announce, factory reset them on deletion
This commit is contained in:
@@ -28,6 +28,16 @@ defmodule Localiser.Web.Channels.SensorsChannel do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_info({:sensor_expected, sensor}, socket) do
|
||||
push(socket, "sensor_expected", render_sensor(sensor))
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_info({:sensor_enrollment_timeout, sensor_id}, socket) do
|
||||
push(socket, "sensor_enrollment_timeout", %{sensor_id: sensor_id})
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
def handle_info(_msg, socket), do: {:noreply, socket}
|
||||
|
||||
defp render_sensor(sensor) do
|
||||
|
||||
@@ -68,6 +68,15 @@ defmodule Localiser.Web.Controllers.SensorController do
|
||||
unauthorized: {"Unauthorized", "application/json", Schemas.Error}
|
||||
]
|
||||
|
||||
operation :enroll,
|
||||
summary: "Notify server a sensor is about to be enrolled",
|
||||
request_body: {"Enroll params", "application/json", Schemas.SensorEnrollParams, required: true},
|
||||
responses: [
|
||||
ok: {"Sensor (unconfirmed)", "application/json", Schemas.Sensor},
|
||||
bad_request: {"Missing sensor_id", "application/json", Schemas.Error},
|
||||
unauthorized: {"Unauthorized", "application/json", Schemas.Error}
|
||||
]
|
||||
|
||||
operation :calibration_start,
|
||||
summary: "Begin RSSI calibration",
|
||||
parameters: [id: [in: :path, type: :integer, required: true]],
|
||||
@@ -86,6 +95,24 @@ defmodule Localiser.Web.Controllers.SensorController do
|
||||
unauthorized: {"Unauthorized", "application/json", Schemas.Error}
|
||||
]
|
||||
|
||||
def enroll(conn, %{"sensor_id" => sensor_id}) do
|
||||
case Sensors.expect_sensor(sensor_id) do
|
||||
{:ok, sensor} ->
|
||||
json(conn, render_sensor(sensor))
|
||||
|
||||
{:error, changeset} ->
|
||||
conn
|
||||
|> put_status(:unprocessable_entity)
|
||||
|> json(%{errors: format_errors(changeset)})
|
||||
end
|
||||
end
|
||||
|
||||
def enroll(conn, _params) do
|
||||
conn
|
||||
|> put_status(:bad_request)
|
||||
|> json(%{error: "sensor_id is required"})
|
||||
end
|
||||
|
||||
def index(conn, _params) do
|
||||
json(conn, Enum.map(Sensors.list_sensors(), &render_sensor/1))
|
||||
end
|
||||
@@ -176,6 +203,7 @@ defmodule Localiser.Web.Controllers.SensorController do
|
||||
%{
|
||||
id: sensor.id,
|
||||
sensor_id: sensor.sensor_id,
|
||||
confirmed: sensor.confirmed,
|
||||
room_id: sensor.room_id,
|
||||
floor_x: sensor.floor_x,
|
||||
floor_y: sensor.floor_y,
|
||||
|
||||
@@ -74,6 +74,7 @@ defmodule Localiser.Web.Router do
|
||||
resources "/tags", TagController, except: [:new, :edit]
|
||||
|
||||
# Sensors
|
||||
post "/sensors", SensorController, :enroll
|
||||
get "/sensors", SensorController, :index
|
||||
get "/sensors/unplaced", SensorController, :unplaced
|
||||
get "/sensors/:id", SensorController, :show
|
||||
|
||||
@@ -52,12 +52,13 @@ defmodule Localiser.Web.Schemas do
|
||||
properties: %{
|
||||
id: %Schema{type: :integer},
|
||||
sensor_id: %Schema{type: :string},
|
||||
confirmed: %Schema{type: :boolean},
|
||||
room_id: %Schema{type: :integer, nullable: true},
|
||||
floor_x: %Schema{type: :number, format: :float, nullable: true},
|
||||
floor_y: %Schema{type: :number, format: :float, nullable: true},
|
||||
rssi_ref: %Schema{type: :number, format: :float, nullable: true}
|
||||
},
|
||||
required: [:id, :sensor_id]
|
||||
required: [:id, :sensor_id, :confirmed]
|
||||
})
|
||||
end
|
||||
|
||||
@@ -236,6 +237,15 @@ defmodule Localiser.Web.Schemas do
|
||||
})
|
||||
end
|
||||
|
||||
defmodule SensorEnrollParams do
|
||||
require OpenApiSpex
|
||||
OpenApiSpex.schema(%{
|
||||
title: "SensorEnrollParams", type: :object,
|
||||
properties: %{sensor_id: %Schema{type: :string}},
|
||||
required: [:sensor_id]
|
||||
})
|
||||
end
|
||||
|
||||
defmodule SensorUpdateParams do
|
||||
require OpenApiSpex
|
||||
OpenApiSpex.schema(%{
|
||||
|
||||
Reference in New Issue
Block a user