public string UpdateConfig(IHttpContext context)
        {
            var errorMsg = "";
            var json     = "";
            JsonThirdPartySettings settings;

            context.Response.StatusCode = 200;

            try
            {
                var data = new StreamReader(context.Request.InputStream).ReadToEnd();

                // Start at char 5 to skip the "json:" prefix
                json = WebUtility.UrlDecode(data.Substring(5));

                // de-serialize it to the settings structure
                settings = json.FromJson <JsonThirdPartySettings>();
            }
            catch (Exception ex)
            {
                var msg = "Error de-serializing 3rdParty Settings JSON: " + ex.Message;
                cumulus.LogMessage(msg);
                cumulus.LogDebugMessage("3rdParty Data: " + json);
                context.Response.StatusCode = 500;
                return(msg);
            }


            // process the settings
            try
            {
                cumulus.LogMessage("Updating third party settings");

                // wunderground
                try
                {
                    cumulus.Wund.Enabled = settings.wunderground.enabled;
                    if (cumulus.Wund.Enabled)
                    {
                        cumulus.Wund.SendIndoor         = settings.wunderground.includeindoor;
                        cumulus.Wund.SendSolar          = settings.wunderground.includesolar;
                        cumulus.Wund.SendUV             = settings.wunderground.includeuv;
                        cumulus.Wund.SendAirQuality     = settings.wunderground.includeaq;
                        cumulus.Wund.Interval           = settings.wunderground.interval;
                        cumulus.Wund.PW                 = settings.wunderground.password ?? string.Empty;
                        cumulus.Wund.RapidFireEnabled   = settings.wunderground.rapidfire;
                        cumulus.Wund.SendAverage        = settings.wunderground.sendavgwind;
                        cumulus.Wund.ID                 = settings.wunderground.stationid ?? string.Empty;
                        cumulus.Wund.CatchUp            = settings.wunderground.catchup;
                        cumulus.Wund.SynchronisedUpdate = (!cumulus.Wund.RapidFireEnabled) && (60 % cumulus.Wund.Interval == 0);

                        cumulus.WundTimer.Interval = cumulus.Wund.RapidFireEnabled ? 5000 : cumulus.Wund.Interval * 60 * 1000;
                        cumulus.WundTimer.Enabled  = cumulus.Wund.Enabled && !cumulus.Wund.SynchronisedUpdate && !string.IsNullOrWhiteSpace(cumulus.Wund.ID) && !string.IsNullOrWhiteSpace(cumulus.Wund.PW);
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing wunderground settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // Windy
                try
                {
                    cumulus.Windy.Enabled = settings.windy.enabled;
                    if (cumulus.Windy.Enabled)
                    {
                        //cumulus.WindySendSolar = settings.windy.includesolar;
                        cumulus.Windy.SendUV     = settings.windy.includeuv;
                        cumulus.Windy.Interval   = settings.windy.interval;
                        cumulus.Windy.ApiKey     = settings.windy.apikey;
                        cumulus.Windy.StationIdx = settings.windy.stationidx;
                        cumulus.Windy.CatchUp    = settings.windy.catchup;
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing Windy settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // Awekas
                try
                {
                    cumulus.AWEKAS.Enabled = settings.awekas.enabled;
                    if (cumulus.AWEKAS.Enabled)
                    {
                        cumulus.AWEKAS.Interval           = settings.awekas.interval;
                        cumulus.AWEKAS.Lang               = settings.awekas.lang;
                        cumulus.AWEKAS.PW                 = settings.awekas.password ?? string.Empty;
                        cumulus.AWEKAS.ID                 = settings.awekas.user ?? string.Empty;
                        cumulus.AWEKAS.SendSolar          = settings.awekas.includesolar;
                        cumulus.AWEKAS.SendUV             = settings.awekas.includeuv;
                        cumulus.AWEKAS.SendSoilTemp       = settings.awekas.includesoiltemp;
                        cumulus.AWEKAS.SendSoilMoisture   = settings.awekas.includesoilmoisture;
                        cumulus.AWEKAS.SendLeafWetness    = settings.awekas.includeleafwetness;
                        cumulus.AWEKAS.SendIndoor         = settings.awekas.includeindoor;
                        cumulus.AWEKAS.SendAirQuality     = settings.awekas.includeaq;
                        cumulus.AWEKAS.SynchronisedUpdate = (cumulus.AWEKAS.Interval % 60 == 0);

                        cumulus.AwekasTimer.Interval = cumulus.AWEKAS.Interval * 1000;
                        cumulus.AwekasTimer.Enabled  = cumulus.AWEKAS.Enabled && !cumulus.AWEKAS.SynchronisedUpdate && !string.IsNullOrWhiteSpace(cumulus.AWEKAS.ID) && !string.IsNullOrWhiteSpace(cumulus.AWEKAS.PW);
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing AWEKAS settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // WeatherCloud
                try
                {
                    cumulus.WCloud.Enabled = settings.weathercloud.enabled;
                    if (cumulus.WCloud.Enabled)
                    {
                        cumulus.WCloud.ID                 = settings.weathercloud.wid ?? string.Empty;
                        cumulus.WCloud.PW                 = settings.weathercloud.key ?? string.Empty;
                        cumulus.WCloud.Interval           = settings.weathercloud.interval;
                        cumulus.WCloud.SendSolar          = settings.weathercloud.includesolar;
                        cumulus.WCloud.SendUV             = settings.weathercloud.includeuv;
                        cumulus.WCloud.SendAirQuality     = settings.weathercloud.includeaqi;
                        cumulus.WCloud.SendSoilMoisture   = settings.weathercloud.includesoilmoist;
                        cumulus.WCloud.SoilMoistureSensor = settings.weathercloud.moistsensor;
                        cumulus.WCloud.SendLeafWetness    = settings.weathercloud.includeleafwet;
                        cumulus.WCloud.LeafWetnessSensor  = settings.weathercloud.leafwetsensor;
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing WeatherCloud settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // PWS weather
                try
                {
                    cumulus.PWS.Enabled = settings.pwsweather.enabled;
                    if (cumulus.PWS.Enabled)
                    {
                        cumulus.PWS.Interval  = settings.pwsweather.interval;
                        cumulus.PWS.SendSolar = settings.pwsweather.includesolar;
                        cumulus.PWS.SendUV    = settings.pwsweather.includeuv;
                        cumulus.PWS.PW        = settings.pwsweather.password ?? string.Empty;
                        cumulus.PWS.ID        = settings.pwsweather.stationid ?? string.Empty;
                        cumulus.PWS.CatchUp   = settings.pwsweather.catchup;
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing PWS weather settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // WOW
                try
                {
                    cumulus.WOW.Enabled = settings.wow.enabled;
                    if (cumulus.WOW.Enabled)
                    {
                        cumulus.WOW.SendSolar      = settings.wow.includesolar;
                        cumulus.WOW.SendUV         = settings.wow.includeuv;
                        cumulus.WOW.SendSoilTemp   = settings.wow.includesoiltemp;
                        cumulus.WOW.SoilTempSensor = settings.wow.soiltempsensor;
                        cumulus.WOW.Interval       = settings.wow.interval;
                        cumulus.WOW.PW             = settings.wow.password ?? string.Empty;
                        cumulus.WOW.ID             = settings.wow.stationid ?? string.Empty;
                        cumulus.WOW.CatchUp        = settings.wow.catchup;
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing WOW settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // CWOP
                try
                {
                    cumulus.APRS.Enabled = settings.cwop.enabled;
                    if (cumulus.APRS.Enabled)
                    {
                        cumulus.APRS.ID        = settings.cwop.id ?? string.Empty;;
                        cumulus.APRS.Interval  = settings.cwop.interval;
                        cumulus.APRS.SendSolar = settings.cwop.includesolar;
                        cumulus.APRS.PW        = settings.cwop.password ?? string.Empty;;
                        cumulus.APRS.Port      = settings.cwop.port;
                        cumulus.APRS.Server    = settings.cwop.server ?? string.Empty;;
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing CWOP settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // OpenWeatherMap
                try
                {
                    cumulus.OpenWeatherMap.Enabled = settings.openweathermap.enabled;
                    if (cumulus.OpenWeatherMap.Enabled)
                    {
                        cumulus.OpenWeatherMap.CatchUp  = settings.openweathermap.catchup;
                        cumulus.OpenWeatherMap.PW       = settings.openweathermap.apikey;
                        cumulus.OpenWeatherMap.ID       = settings.openweathermap.stationid;
                        cumulus.OpenWeatherMap.Interval = settings.openweathermap.interval;
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing OpenWeatherMap settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // Wind Guru
                try
                {
                    cumulus.WindGuru.Enabled = settings.windguru.enabled;
                    if (cumulus.WindGuru.Enabled)
                    {
                        cumulus.WindGuru.ID       = settings.windguru.uid;
                        cumulus.WindGuru.PW       = settings.windguru.password;
                        cumulus.WindGuru.SendRain = settings.windguru.includerain;
                        cumulus.WindGuru.Interval = settings.windguru.interval;
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing WindGuru settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // Custom HTTP
                try
                {
                    // custom seconds
                    cumulus.CustomHttpSecondsEnabled       = settings.customhttp.customseconds.enabled;
                    cumulus.CustomHttpSecondsTimer.Enabled = cumulus.CustomHttpSecondsEnabled;
                    if (cumulus.CustomHttpSecondsEnabled)
                    {
                        cumulus.CustomHttpSecondsStrings[0] = settings.customhttp.customseconds.url[0] ?? string.Empty;
                        for (var i = 1; i < 10; i++)
                        {
                            if (i < settings.customhttp.customseconds.url.Length)
                            {
                                cumulus.CustomHttpSecondsStrings[i] = settings.customhttp.customseconds.url[i] ?? null;
                            }
                            else
                            {
                                cumulus.CustomHttpSecondsStrings[i] = null;
                            }
                        }

                        cumulus.CustomHttpSecondsInterval       = settings.customhttp.customseconds.interval;
                        cumulus.CustomHttpSecondsTimer.Interval = cumulus.CustomHttpSecondsInterval * 1000;
                    }
                    // custom minutes
                    cumulus.CustomHttpMinutesEnabled = settings.customhttp.customminutes.enabled;
                    if (cumulus.CustomHttpMinutesEnabled)
                    {
                        cumulus.CustomHttpMinutesStrings[0] = settings.customhttp.customminutes.url[0] ?? string.Empty;
                        for (var i = 1; i < 10; i++)
                        {
                            if (i < settings.customhttp.customseconds.url.Length)
                            {
                                cumulus.CustomHttpMinutesStrings[i] = settings.customhttp.customminutes.url[i] ?? null;
                            }
                            else
                            {
                                cumulus.CustomHttpMinutesStrings[i] = null;
                            }
                        }

                        cumulus.CustomHttpMinutesIntervalIndex = settings.customhttp.customminutes.intervalindex;
                        if (cumulus.CustomHttpMinutesIntervalIndex >= 0 && cumulus.CustomHttpMinutesIntervalIndex < cumulus.FactorsOf60.Length)
                        {
                            cumulus.CustomHttpMinutesInterval = cumulus.FactorsOf60[cumulus.CustomHttpMinutesIntervalIndex];
                        }
                        else
                        {
                            cumulus.CustomHttpMinutesInterval = 10;
                        }
                    }
                    // custom roll-over
                    cumulus.CustomHttpRolloverEnabled = settings.customhttp.customrollover.enabled;
                    if (cumulus.CustomHttpRolloverEnabled)
                    {
                        cumulus.CustomHttpRolloverStrings[0] = settings.customhttp.customrollover.url[0] ?? string.Empty;
                        for (var i = 1; i < 10; i++)
                        {
                            if (i < settings.customhttp.customrollover.url.Length)
                            {
                                cumulus.CustomHttpMinutesStrings[i] = settings.customhttp.customrollover.url[i] ?? null;
                            }
                            else
                            {
                                cumulus.CustomHttpMinutesStrings[i] = null;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    var msg = "Error processing Custom settings: " + ex.Message;
                    cumulus.LogMessage(msg);
                    errorMsg += msg + "\n\n";
                    context.Response.StatusCode = 500;
                }

                // Save the settings
                cumulus.WriteIniFile();

                // Do OpenWeatherMap set-up
                cumulus.EnableOpenWeatherMap();
            }
            catch (Exception ex)
            {
                var msg = "Error processing Third Party settings: " + ex.Message;
                cumulus.LogMessage(msg);
                cumulus.LogDebugMessage("Third Party data: " + json);
                errorMsg += msg;
                context.Response.StatusCode = 500;
            }

            return(context.Response.StatusCode == 200 ? "success" : errorMsg);
        }