public MainPageViewModel(IFermentationControllerAPI fermApi, IScreen hostScreen)
        {
            var retry = Polly.Policy.Handle <WebException>().WaitAndRetryAsync(1, x => TimeSpan.FromSeconds(Math.Pow(2, x)));

            HostScreen = hostScreen;

            SetTimeToNow = ReactiveCommand.CreateAsyncTask(async _ => {
                var secFromEpoch = DateTimeMixins.SecondsFromEpoch();
                await retry.ExecuteAsync(() => fermApi.SetTime(secFromEpoch));
            });

            Echo = ReactiveCommand.CreateAsyncTask(async _ => {
                var response = await retry.ExecuteAsync(() => fermApi.Echo(this.EchoText));
                return(response);
            });

            Echo.ToProperty(this, vm => vm.EchoResponse, out _EchoResponse);

            GetStatus = ReactiveCommand.CreateAsyncTask(async _ => {
                string output = string.Empty;
                var response  = await retry.ExecuteAsync(fermApi.GetStatus);
                var theData   = Convert.FromBase64String(response);
                using (var ms = new MemoryStream(theData))
                {
                    var systemTime               = ms.ReadUInt32();
                    var systemMode               = ms.ReadByte();
                    var regMode                  = ms.ReadByte();
                    var probe0Assignment         = ms.ReadByte();
                    var probe0Temp               = ms.ReadUInt16();
                    var probe1Assignment         = ms.ReadByte();
                    var probe1Temp               = ms.ReadUInt16();
                    var heatRelayStatus          = ms.ReadByte();
                    var coolRelayStatus          = ms.ReadByte();
                    var runningProfile           = ms.ReadString(64);
                    var profileStepIdx           = ms.ReadUInt16();
                    var profileStepTemp          = ms.ReadUInt16();
                    var profileStepTimeRemaining = ms.ReadUInt32();
                    var manualSetpointTemp       = ms.ReadUInt16();
                    var profileStartTime         = ms.ReadUInt32();

                    output += string.Format("System Time:{0}\n", DateTimeMixins.TimeFromEpoch(systemTime));
                    output += string.Format("System Mode:{0}\n", systemMode);
                    output += string.Format("Regulation Mode:{0}\n", regMode);

                    output += string.Format("Probe0 Assign:{0}\n", probe0Assignment);
                    output += string.Format("Probe0 Temp C:{0}\n", probe0Temp / 10.0);

                    output += string.Format("Probe1 Assign:{0}\n", probe1Assignment);
                    output += string.Format("Probe1 Temp C:{0}\n", probe1Temp / 10.0);

                    output += string.Format("Heat Relay Status:{0}\n", heatRelayStatus);
                    output += string.Format("Cool Relay Status:{0}\n", coolRelayStatus);

                    output += string.Format("Running Profile:{0}\n", runningProfile);

                    output += string.Format("Profile Step Index:{0}\n", profileStepIdx);
                    output += string.Format("Profile Step Temperature C:{0}\n", profileStepTemp / 10.0);
                    output += string.Format("Profile Step Time Remaining:{0}\n", profileStepTimeRemaining);
                    output += string.Format("Manual Setpoint Temp C:{0}\n", manualSetpointTemp / 10.0);
                    output += string.Format("Profile Start Time:{0}\n", DateTimeMixins.TimeFromEpoch(profileStartTime));
                }

                return(output);
            });

            GetStatus.ThrownExceptions
            .Select(x => new UserError("Status cannot be retrieved", "Check your connected to the TEMPERATURE wifi"))
            .SelectMany(UserError.Throw);

            GetStatus.ToProperty(this, vm => vm.StatusResponse, out _StatusResponse);

            NavigateToCreateProfilePage = ReactiveCommand.Create();
            NavigateToCreateProfilePage
            .Subscribe(_ => HostScreen.Router.Navigate.Execute(new CreateProfileViewModel(hostScreen, fermApi)));

            NavigateToPreferencesPage = ReactiveCommand.Create();
            NavigateToPreferencesPage
            .Subscribe(_ => HostScreen.Router.Navigate.Execute(new PreferencesPageViewModel(hostScreen, new UserSettings())));
        }