Packages
grizzly
9.1.0
9.1.4
9.1.2
9.1.1
9.1.0
9.0.0
8.15.3
8.15.2
8.15.1
8.15.0
8.14.0
8.13.0
8.12.0
8.11.3
8.11.2
8.11.1
8.11.0
8.10.0
8.9.0
8.8.1
8.8.0
8.7.1
8.7.0
8.6.12
8.6.11
8.6.10
8.6.9
8.6.8
8.6.7
retired
8.6.6
8.6.5
8.6.4
8.6.3
8.6.2
8.6.1
8.6.0
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.0
8.2.3
8.2.2
8.2.1
8.2.0
8.1.0
8.0.1
8.0.0
7.4.3
7.4.2
7.4.1
7.4.0
7.3.0
7.2.0
7.1.4
7.1.3
7.1.2
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.8.8
6.8.7
6.8.6
6.8.5
6.8.4
6.8.3
6.8.2
6.8.1
6.8.0
6.7.1
6.7.0
6.6.1
6.6.0
6.5.1
6.5.0
6.4.0
6.3.0
6.2.0
6.1.1
6.1.0
6.0.1
6.0.0
5.4.1
5.4.0
5.3.0
5.2.8
5.2.7
5.2.6
5.2.5
5.2.4
5.2.3
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
5.1.0
5.0.2
5.0.1
5.0.0
4.0.1
4.0.0
3.0.0
2.1.0
2.0.0
1.0.1
1.0.0
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc.4
0.9.0-rc.3
0.9.0-rc.2
0.9.0-rc.1
0.9.0-rc.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
Elixir Z-Wave library
Current section
Files
Jump to
Current section
Files
lib/grizzly/storage/populate.ex
defmodule Grizzly.Storage.Populate do
@moduledoc false
# Populates storage at startup by reading relevant info from Z/IP Gateway's
# database.
use GenServer, restart: :temporary
alias Grizzly.Storage
alias Grizzly.ZIPGateway.Database, as: ZIPGatewayDb
alias Grizzly.ZWave.DSK
require Logger
@spec start_link(any()) :: GenServer.on_start()
def start_link(opts) do
database = Keyword.get(opts, :database, Grizzly.options().database_file)
cond do
Keyword.get(opts, :disabled) != false and
Application.get_env(:grizzly, __MODULE__, [])[:disabled] == true ->
:ignore
not is_reference(database) and (not is_binary(database) or not File.exists?(database)) ->
:ignore
Storage.get(["migrated_zipgateway_db"]) == true ->
:ignore
true ->
GenServer.start_link(__MODULE__, [database: database], name: __MODULE__)
end
end
@impl GenServer
def init(opts) do
{:ok, %{database: opts[:database]}, {:continue, :populate}}
end
@impl GenServer
def handle_continue(:populate, state) do
result =
ZIPGatewayDb.with_database(state.database, fn db ->
with {:ok, nodes} <- ZIPGatewayDb.all_nodes(db),
{:ok, endpoints} <- ZIPGatewayDb.all_endpoints(db) do
endpoints_by_node = Enum.group_by(endpoints, & &1.node_id)
nodes_with_endpoints =
Enum.map(nodes, fn node ->
Map.put(node, :endpoints, Map.get(endpoints_by_node, node.id, []))
end)
{:ok, nodes_with_endpoints}
end
end)
nodes =
case result do
{:ok, nodes} -> nodes
{:error, _reason} -> []
end
populate_storage(nodes)
Storage.put(["migrated_zipgateway_db"], true)
{:stop, :normal, state}
end
defp populate_storage([%{id: 1} | rest]), do: populate_storage(rest)
defp populate_storage([node | rest]) do
populate_node(node)
populate_storage(rest)
end
defp populate_storage([]), do: :ok
defp populate_node(node) do
ep_info =
case Enum.find(node.endpoints, &(&1.id == 0)) do
nil ->
%{generic_device_class: nil, specific_device_class: nil, command_classes: []}
ep ->
%{
generic_device_class: ep.generic_device_class,
specific_device_class: ep.specific_device_class,
command_classes: ep.command_classes
}
end
listening? = Keyword.get(node.mode, :mode) in [:wakeup, :wakeup_firmware_upgrade]
node_info =
Map.merge(
%{
listening?: listening?,
basic_device_class: node.basic_device_class
},
ep_info
)
Storage.put_node_info(node.id, node_info)
if listening?, do: Storage.put_node_wakeup_interval(node.id, node.wake_up_interval)
if is_struct(node.dsk, DSK), do: Storage.put_node_dsk(node.id, node.dsk)
# rescue
# err ->
# Logger.error(
# "[Grizzly] Error while populating storage from ZGW db for node #{node.id}: #{inspect(err)}"
# )
end
end