\section{Requirements}

The following requirements are defined as global project targets and has been refined during the work on the project multiple times.

\begin{itemize}
	
\item The systems should be able to perform updates on the release of new software releases without administrative interaction.
If a new version of the firmware is published, it should be prepared automatically for installation to the target devices.
All these devices should then download and install the new software version and start using it if no errors has occurred during the process.

\item To ensure minimal maintenance effort, the update process should be insusceptible to errors as most as possible.
Even if the installation of an update fails in the middle of reprogramming the controller, the system should continue to work full functional immediately and after a reboot.

\item Downloading the updated firmware should be done over the WiFi interface using the same network connection as used during normal operation.
Fetching the firmware should be done side-by-side other traffic used during operation.

\item Reducing network load and aiming for the maximum possible device uptime is critical.
Therefore, the update process should only be done if a new version is available.
In contrast, the release of a new update should be rolled out to all devices as fast as possible.
During the checking for available updates and while downloading such an update, the device should continue to work as usual.

\item For easy maintenance and monitoring, each device should provide detailed information about the currently installed firmware version and other details in relation to the update process.

\item Devices are categorized by types.
Each device type runs the same software and therefore provides the same functionality.
As the device type is hardly coupled to the hardware.
It is provided as a global constant while compile time and it must never be changed during operation.
Updates must ensure that the correct firmware according to the device type is used while reprogramming.

\end{itemize}
