From 37f26cd730904702e7fc2df6f937a8829c60696d Mon Sep 17 00:00:00 2001 From: ScottyDoesKnow Date: Sat, 13 Dec 2025 16:14:22 -0500 Subject: [PATCH 1/2] Add Apparent (feels like) Temperature option, needs matching config site change --- package.json | 1 + src/c/messaging.c | 8 ++++++++ src/c/settings.c | 1 + src/c/settings.h | 1 + src/pkjs/index.js | 2 +- src/pkjs/weather_openmeteo.js | 14 +++++++------- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 9de7a45..668e6f3 100755 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "WeatherForecastHighTemp", "WeatherForecastLowTemp", "WeatherUVIndex", + "WeatherApparentTemperature", "SettingAltClockName", "SettingAltClockOffset", "SettingDisableAutobattery", diff --git a/src/c/messaging.c b/src/c/messaging.c index 6350f6a..069bca9 100755 --- a/src/c/messaging.c +++ b/src/c/messaging.c @@ -40,6 +40,14 @@ void inbox_received_callback(DictionaryIterator *iterator, void *context) { weatherDataUpdated = true; } + if(dynamicSettings.enableApparentTemperature) { + Tuple *weatherAppTemp_tuple = dict_find(iterator, MESSAGE_KEY_WeatherApparentTemperature); + if(weatherAppTemp_tuple != NULL) { + Weather_weatherInfo.currentTemp = (int)weatherAppTemp_tuple->value->int32; + weatherDataUpdated = true; + } + } + Tuple *weatherConditions_tuple = dict_find(iterator, MESSAGE_KEY_WeatherCondition); if(weatherConditions_tuple != NULL) { Weather_setCurrentCondition(weatherConditions_tuple->value->int32); diff --git a/src/c/settings.c b/src/c/settings.c index 9a9453c..0f32413 100755 --- a/src/c/settings.c +++ b/src/c/settings.c @@ -75,6 +75,7 @@ void Settings_saveToStorage() { void Settings_updateDynamicSettings() { dynamicSettings.disableWeather = false; + dynamicSettings.enableApparentTemperature = false; dynamicSettings.updateScreenEverySecond = false; dynamicSettings.enableAutoBatteryWidget = true; dynamicSettings.enableBeats = false; diff --git a/src/c/settings.h b/src/c/settings.h index 5354ded..b2857cd 100755 --- a/src/c/settings.h +++ b/src/c/settings.h @@ -63,6 +63,7 @@ typedef struct { // Dynamic settings (calculated at runtime based on currently-selected widgets) typedef struct { bool disableWeather; + bool enableApparentTemperature; bool updateScreenEverySecond; bool enableAutoBatteryWidget; bool enableBeats; diff --git a/src/pkjs/index.js b/src/pkjs/index.js index 680da9a..253aa7a 100755 --- a/src/pkjs/index.js +++ b/src/pkjs/index.js @@ -1,7 +1,7 @@ var weather = require('./weather'); -var CONFIG_VERSION = 9; +var CONFIG_VERSION = 10; // var BASE_CONFIG_URL = 'http://localhost:4000/'; var BASE_CONFIG_URL = 'http://freakified.github.io/TimeStylePebble/'; diff --git a/src/pkjs/weather_openmeteo.js b/src/pkjs/weather_openmeteo.js index 6552b50..c25287b 100644 --- a/src/pkjs/weather_openmeteo.js +++ b/src/pkjs/weather_openmeteo.js @@ -12,6 +12,7 @@ function getWeatherFromCoords(pos) { '¤t_weather=true' + '&daily=temperature_2m_max,temperature_2m_min,uv_index_max,weathercode' + '&hourly=uv_index' + + '&minutely_15=apparent_temperature' + '&timezone=auto'; console.log(url); @@ -38,11 +39,8 @@ function getAndSendWeather(url) { var forecastLow = Math.round(json.daily.temperature_2m_min[0]); var forecastCode = json.daily.weathercode[0]; - function getCurrentUVFromHourly(json) { + function getValueFromArrays(times, values) { var now = new Date(); - var times = json.hourly.time; - var uvValues = json.hourly.uv_index; - var closestIndex = 0; var smallestDiff = Infinity; @@ -54,10 +52,11 @@ function getAndSendWeather(url) { closestIndex = i; } } - return Math.round(uvValues[closestIndex]); + return Math.round(values[closestIndex]); } - var uvIndex = getCurrentUVFromHourly(json); + var uvIndex = getValueFromArrays(json.hourly.time, json.hourly.uv_index); + var apparentTemperature = getValueFromArrays(json.minutely_15.time, json.minutely_15.apparent_temperature); console.log('Forecast high/low: ' + forecastHigh + '/' + forecastLow); console.log('Forecast condition code: ' + forecastCode); @@ -72,7 +71,8 @@ function getAndSendWeather(url) { 'WeatherForecastHighTemp': forecastHigh, 'WeatherForecastLowTemp': forecastLow, 'WeatherForecastCondition': forecastIcon, - 'WeatherUVIndex': uvIndex + 'WeatherUVIndex': uvIndex, + 'WeatherApparentTemperature': apparentTemperature }; console.log(JSON.stringify(dictionary)); From 9baa20d4cec2d66cb3accf265c26546a6f3c9f62 Mon Sep 17 00:00:00 2001 From: ScottyDoesKnow Date: Sun, 14 Dec 2025 14:32:36 -0500 Subject: [PATCH 2/2] Fixing config/settings for apparent temperature --- package.json | 1 + src/c/messaging.c | 8 ++++++-- src/c/settings.c | 1 - src/c/settings.h | 4 +++- src/pkjs/index.js | 10 +++++++++- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 668e6f3..b47bd85 100755 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "SettingShowLeadingZero", "SettingSidebarOnLeft", "SettingSidebarTextColor", + "SettingUseApparentTemperature", "SettingUseLargeFonts", "SettingUseMetric", "WeatherUseNightIcon", diff --git a/src/c/messaging.c b/src/c/messaging.c index 069bca9..1440694 100755 --- a/src/c/messaging.c +++ b/src/c/messaging.c @@ -40,7 +40,7 @@ void inbox_received_callback(DictionaryIterator *iterator, void *context) { weatherDataUpdated = true; } - if(dynamicSettings.enableApparentTemperature) { + if(settings.useApparentTemperature) { Tuple *weatherAppTemp_tuple = dict_find(iterator, MESSAGE_KEY_WeatherApparentTemperature); if(weatherAppTemp_tuple != NULL) { Weather_weatherInfo.currentTemp = (int)weatherAppTemp_tuple->value->int32; @@ -97,6 +97,7 @@ void inbox_received_callback(DictionaryIterator *iterator, void *context) { Tuple *clockFont_tuple = dict_find(iterator, MESSAGE_KEY_SettingClockFontId); Tuple *hourlyVibe_tuple = dict_find(iterator, MESSAGE_KEY_SettingHourlyVibe); Tuple *useLargeFonts_tuple = dict_find(iterator, MESSAGE_KEY_SettingUseLargeFonts); + Tuple *useApparentTemperature_tuple = dict_find(iterator, MESSAGE_KEY_SettingUseApparentTemperature); Tuple *widget0Id_tuple = dict_find(iterator, MESSAGE_KEY_SettingWidget0ID); Tuple *widget1Id_tuple = dict_find(iterator, MESSAGE_KEY_SettingWidget1ID); @@ -113,7 +114,6 @@ void inbox_received_callback(DictionaryIterator *iterator, void *context) { Tuple *activateDisconnectIcon_tuple = dict_find(iterator, MESSAGE_KEY_SettingDisconnectIcon); - if(timeColor_tuple != NULL) { settings.timeColor = GColorFromHEX(timeColor_tuple->value->int32); } @@ -163,6 +163,10 @@ void inbox_received_callback(DictionaryIterator *iterator, void *context) { settings.useLargeFonts = (bool)useLargeFonts_tuple->value->int8; } + if(useApparentTemperature_tuple != NULL) { + settings.useApparentTemperature = (bool)useApparentTemperature_tuple->value->int8; + } + if(hourlyVibe_tuple != NULL) { settings.hourlyVibe = hourlyVibe_tuple->value->int8; } diff --git a/src/c/settings.c b/src/c/settings.c index 0f32413..9a9453c 100755 --- a/src/c/settings.c +++ b/src/c/settings.c @@ -75,7 +75,6 @@ void Settings_saveToStorage() { void Settings_updateDynamicSettings() { dynamicSettings.disableWeather = false; - dynamicSettings.enableApparentTemperature = false; dynamicSettings.updateScreenEverySecond = false; dynamicSettings.enableAutoBatteryWidget = true; dynamicSettings.enableBeats = false; diff --git a/src/c/settings.h b/src/c/settings.h index b2857cd..3893982 100755 --- a/src/c/settings.h +++ b/src/c/settings.h @@ -58,12 +58,14 @@ typedef struct { bool healthUseDistance; bool healthUseRestfulSleep; char decimalSeparator; + + // apparent temperature option + bool useApparentTemperature; } Settings; // Dynamic settings (calculated at runtime based on currently-selected widgets) typedef struct { bool disableWeather; - bool enableApparentTemperature; bool updateScreenEverySecond; bool enableAutoBatteryWidget; bool enableBeats; diff --git a/src/pkjs/index.js b/src/pkjs/index.js index 253aa7a..48e2edb 100755 --- a/src/pkjs/index.js +++ b/src/pkjs/index.js @@ -1,7 +1,7 @@ var weather = require('./weather'); -var CONFIG_VERSION = 10; +var CONFIG_VERSION = 9; // var BASE_CONFIG_URL = 'http://localhost:4000/'; var BASE_CONFIG_URL = 'http://freakified.github.io/TimeStylePebble/'; @@ -185,6 +185,14 @@ Pebble.addEventListener('webviewclosed', function(e) { window.localStorage.setItem('weather_loc_lng', configData.weather_loc_lng); } + if(configData.apparent_temperature_setting) { + if(configData.apparent_temperature_setting == 'off') { + dict.SettingUseApparentTemperature = 0; + } else if(configData.apparent_temperature_setting == 'on') { + dict.SettingUseApparentTemperature = 1; + } + } + if(configData.weather_datasource) { window.localStorage.setItem('weather_datasource', configData.weather_datasource); window.localStorage.setItem('weather_api_key', configData.weather_api_key);