{"id":294194,"date":"2026-08-29T08:58:19","date_gmt":"2026-08-29T08:58:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/xtx-netatmo\/"},"modified":"2026-09-06T09:24:06","modified_gmt":"2026-09-06T09:24:06","slug":"xtx-integration-for-netatmo","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/xtx-integration-for-netatmo\/","author":15516942,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.11","stable_tag":"1.9.11","tested":"7.1","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"XTX Integration for Netatmo","header_author":"Frank Neumann","header_description":"Connects to the Netatmo API, stores all sensor data locally and displays live dashboards, charts, history and forecasts via shortcodes.","assets_banners_color":"284c4e","last_updated":"2026-09-06 09:24:06","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/netatmo.frank-neumann.de\/","header_author_uri":"https:\/\/frank-neumann.de","rating":0,"author_block_rating":0,"active_installs":0,"downloads":212,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.9.10":{"tag":"1.9.10","author":"xylaender","date":"2026-09-03 15:04:33","revision":3679940},"1.9.11":{"tag":"1.9.11","author":"xylaender","date":"2026-09-06 09:24:06","revision":3683228},"1.9.6.2":{"tag":"1.9.6.2","author":"xylaender","date":"2026-08-29 08:57:55","revision":3671275},"1.9.7":{"tag":"1.9.7","author":"xylaender","date":"2026-08-29 10:50:58","revision":3671421},"1.9.8":{"tag":"1.9.8","author":"xylaender","date":"2026-08-31 17:10:14","revision":3674682},"1.9.9":{"tag":"1.9.9","author":"xylaender","date":"2026-08-31 17:22:24","revision":3674713}},"upgrade_notice":{"1.9.11":"<p>New: [naws_records] shows fifteen records from your daily summary with their dates, [naws_on_this_day] this day in earlier years, [naws_sunpath] the sun on its arc. The sidebar widget gets a dark and a transparent scheme. Fix: the purge button in the settings works again. Nothing to reconfigure.<\/p>","1.9.10":"<p>New: [naws_heatmap] shows a year of daily mean temperatures as a calendar grid. Privacy fix: your modules&#039; MAC addresses no longer appear in public pages or dashboard requests. The bundled German and Norwegian files WordPress refused in 1.9.9 are read again. Nothing to reconfigure.<\/p>","1.9.7":"<p>First release published through the WordPress.org directory. Breaking change for REST API users: the key is accepted in the X-NAWS-Key header only, and ?api_key=... now answers 401. Everything else is new features and fixes.<\/p>","1.9.6.2":"<p>Header correction only: compatibility is now declared against WordPress 7.1. Identical in code to 1.9.6.1.<\/p>","1.9.6.1":"<p>Security release. The OAuth return route now requires the manage_options capability before it exchanges an authorization code for tokens. Reported by the WordPress plugin review team. Updating is recommended for every installation.<\/p>","1.6.3":"<p>WordPress.org compliance release. All file-scope ob_start() patterns replaced with wp_add_inline_script(). PHP values passed to JS via wp_json_encode() instead of direct echoing.<\/p>","1.6.2":"<p>WordPress.org compliance release. Input sanitization, ob_start() fixes, inline script\/style removal, SQL whitelist validation.<\/p>","1.5.7":"<p>WordPress.org compliance release. Removed GitHub Auto-Updater. Plugin Check fixes for move_uploaded_file, rand, SVG escaping.<\/p>","1.5.6":"<p>Security update: Client ID and Client Secret are now fully AES-256-GCM encrypted at rest.<\/p>","1.4.3":"<p>Plugin renamed to &quot;XTX Netatmo&quot;. New icon sets and per-sensor colors.<\/p>","1.4.0":"<p>Major visual update: 130+ configurable colors with live preview on new Appearance page.<\/p>","1.3.0":"<p>New Export \/ Import feature for full data backup and migration.<\/p>","1.2.0":"<p>Complete mobile-first responsive redesign. All views optimized for smartphones.<\/p>","1.1.0":"<p>Error logging, caching, adaptive polling, night mode and health dashboard.<\/p>","1.0.2":"<p>Removed shortcodes: naws_chart, naws_gauge, naws_dashboard, naws_card. Use [naws_live] and [naws_history] instead.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3671348,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3671348,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3671348,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500-de.png":{"filename":"banner-1544x500-de.png","revision":3671363,"resolution":"1544x500","location":"assets","locale":"de","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3671348,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-de.png":{"filename":"banner-772x250-de.png","revision":3671363,"resolution":"772x250","location":"assets","locale":"de","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3671348,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.9.10","1.9.11","1.9.6.2","1.9.7","1.9.8","1.9.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3671348,"resolution":"1","location":"assets","locale":"","width":2600,"height":3700},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3671348,"resolution":"2","location":"assets","locale":"","width":2600,"height":4900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3671348,"resolution":"3","location":"assets","locale":"","width":3000,"height":2048},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3671348,"resolution":"4","location":"assets","locale":"","width":3000,"height":2650},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3671348,"resolution":"5","location":"assets","locale":"","width":1116,"height":932},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3671348,"resolution":"6","location":"assets","locale":"","width":3000,"height":2640},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3671348,"resolution":"7","location":"assets","locale":"","width":3000,"height":1256}},"screenshots":{"1":"Live dashboard with sensor cards and 24h trend charts","2":"Year-over-year comparison charts for temperature and rainfall","3":"Admin settings page with Netatmo connection status","4":"REST API documentation in the admin panel","5":"Weather forecast widget","6":"Appearance page with live color preview","7":"Export \/ Import page for backups"}},"plugin_section":[],"plugin_tags":[2510,40864,7877,4899,269299],"plugin_category":[59],"plugin_contributors":[278161],"plugin_business_model":[],"class_list":["post-294194","plugin","type-plugin","status-publish","hentry","plugin_tags-chart","plugin_tags-netatmo","plugin_tags-temperature","plugin_tags-weather","plugin_tags-weather-station","plugin_category-utilities-and-tools","plugin_contributors-xylaender","plugin_committers-xylaender"],"banners":{"banner":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/banner-772x250.png?rev=3671348","banner_2x":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/banner-1544x500.png?rev=3671348","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/icon.svg?rev=3671348","icon":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/icon.svg?rev=3671348","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/screenshot-1.png?rev=3671348","caption":"Live dashboard with sensor cards and 24h trend charts"},{"src":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/screenshot-2.png?rev=3671348","caption":"Year-over-year comparison charts for temperature and rainfall"},{"src":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/screenshot-3.png?rev=3671348","caption":"Admin settings page with Netatmo connection status"},{"src":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/screenshot-4.png?rev=3671348","caption":"REST API documentation in the admin panel"},{"src":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/screenshot-5.png?rev=3671348","caption":"Weather forecast widget"},{"src":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/screenshot-6.png?rev=3671348","caption":"Appearance page with live color preview"},{"src":"https:\/\/ps.w.org\/xtx-integration-for-netatmo\/assets\/screenshot-7.png?rev=3671348","caption":"Export \/ Import page for backups"}],"raw_content":"<!--section=description-->\n<p><strong>XTX Integration for Netatmo<\/strong> connects your Netatmo hardware to WordPress. It reads all sensor data via the official Netatmo API, stores readings in your local database and displays them with beautiful live dashboards, animated charts and weather forecasts.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>Full Netatmo Integration<\/strong> \u2013 OAuth2 authentication, automatic sync, all module types supported (Base, Outdoor, Wind, Rain, Indoor)<\/li>\n<li><strong>Live Dashboard<\/strong> \u2013 Real-time sensor cards with animated counters, 24h trend charts, pressure trend indicator, wind compass, CO2 air quality levels<\/li>\n<li><strong>Astronomy<\/strong> \u2013 Sunrise\/sunset, moon phase with illumination, next full moon<\/li>\n<li><strong>Derived Weather Data<\/strong> \u2013 Feels-like temperature, heat index, dew point, wind chill<\/li>\n<li><strong>Historical Charts<\/strong> \u2013 Year-over-year comparison for temperature, pressure and rainfall with interactive legend<\/li>\n<li><strong>Weather Forecast<\/strong> \u2013 5-day forecast based on station coordinates via Open-Meteo or Yr.no<\/li>\n<li><strong>REST API<\/strong> \u2013 Read-only JSON API with key authentication and rate limiting for external tools (Google Charts, Grafana, etc.)<\/li>\n<li><strong>Encrypted Storage<\/strong> \u2013 All credentials (OAuth tokens, client secret, API keys) are AES-256-GCM encrypted at rest<\/li>\n<li><strong>Configurable Units<\/strong> \u2013 C\/F, mm\/inch, mbar\/inHg\/mmHg, km\/h\/m\/s\/mph\/kn<\/li>\n<li><strong>Multilingual<\/strong> \u2013 Full German, English and Norwegian interface<\/li>\n<li><strong>14 Shortcodes<\/strong> \u2013 Dashboard, current readings, infobar, single value, computed value, history charts, heatmap, records, this day in earlier years, sun path, forecast, table, widget, weather icon<\/li>\n<li><strong>Export \/ Import<\/strong> \u2013 Full backup and restore of weather data, modules and settings<\/li>\n<li><strong>Mobile-First Responsive<\/strong> \u2013 All views optimized for smartphones, tablets and desktops<\/li>\n<li><strong>130+ Configurable Colors<\/strong> \u2013 Full appearance customization with live preview<\/li>\n<li><strong>4 Icon Sets<\/strong> \u2013 Emoji, Outline, Filled, Minimal with per-sensor color control<\/li>\n<\/ul>\n\n<h4>Supported Modules<\/h4>\n\n<ul>\n<li><strong>NAMain<\/strong> \u2013 Base Station (Temperature, Humidity, CO2, Noise, Pressure)<\/li>\n<li><strong>NAModule1<\/strong> \u2013 Outdoor (Temperature, Humidity)<\/li>\n<li><strong>NAModule2<\/strong> \u2013 Wind (Speed, Direction, Gusts)<\/li>\n<li><strong>NAModule3<\/strong> \u2013 Rain Gauge (Hourly, Daily, Rolling 24h)<\/li>\n<li><strong>NAModule4<\/strong> \u2013 Additional Indoor (Temperature, Humidity, CO2)<\/li>\n<\/ul>\n\n<h4>Shortcodes<\/h4>\n\n<ul>\n<li><code>[naws_live]<\/code> \u2013 Live sensor tiles with 24h trend charts and forecast<\/li>\n<li><code>[naws_current]<\/code> \u2013 Current readings of one or all modules as tiles or a list (<code>module_id<\/code>, <code>parameters<\/code>, <code>layout<\/code>, <code>title<\/code>)<\/li>\n<li><code>[naws_infobar]<\/code> \u2013 Astronomy bar with sunrise, moon phase, felt temperature<\/li>\n<li><code>[naws_value]<\/code> \u2013 Single inline sensor value<\/li>\n<li><code>[naws_calc]<\/code> \u2013 Single computed value (dew point, felt temperature, sunrise, moon phase, \u2026); full list on the Shortcodes page in the backend<\/li>\n<li><code>[naws_history]<\/code> \u2013 Year-over-year comparison charts (supports <code>year<\/code> parameter)<\/li>\n<li><code>[naws_heatmap]<\/code> \u2013 One year of outdoor daily average temperature as a calendar grid, one tile per day, with a year selector (<code>year<\/code>, <code>title<\/code>, <code>legend<\/code>)<\/li>\n<li><code>[naws_records]<\/code> \u2013 Fifteen records from the daily summary with their dates, as tiles or a table (<code>year<\/code>, <code>records<\/code>, <code>layout<\/code>, <code>title<\/code>)<\/li>\n<li><code>[naws_on_this_day]<\/code> \u2013 This calendar day in every earlier year, with the day's records marked (<code>date<\/code>, <code>title<\/code>)<\/li>\n<li><code>[naws_sunpath]<\/code> \u2013 The sun on its arc over the station, with sunrise, solar noon, sunset and the day length (<code>title<\/code>)<\/li>\n<li><code>[naws_forecast]<\/code> \u2013 Multi-day weather forecast<\/li>\n<li><code>[naws_table]<\/code> \u2013 Readings as a table over a period, grouped by hour, day, week, month or year (<code>module_id<\/code>, <code>parameters<\/code>, <code>period<\/code>, <code>limit<\/code>, <code>group_by<\/code>, <code>title<\/code>)<\/li>\n<li><code>[naws_weather_widget]<\/code> \u2013 Compact forecast widget for a sidebar (<code>days<\/code> 3 or 5, <code>width<\/code> 250\u2013500, <code>scheme<\/code> light, dark or transparent)<\/li>\n<li><code>[naws_weather_icon]<\/code> \u2013 Just the animated icon for the current weather state (<code>size<\/code>); renders nothing when the state is unknown<\/li>\n<\/ul>\n\n<h3>Privacy &amp; External Services<\/h3>\n\n<p>This plugin connects to the following external services:<\/p>\n\n<h4>Netatmo API (api.netatmo.com)<\/h4>\n\n<ul>\n<li><strong>Purpose:<\/strong> Authenticate via OAuth2, fetch sensor readings and station data<\/li>\n<li><strong>Data sent:<\/strong> The Client ID and Client Secret of the Netatmo application you created, in exchange for an access token; afterwards the access or refresh token with every request, plus the station and module IDs whose measurements are being requested<\/li>\n<li><strong>When:<\/strong> During initial authentication, on every automatic sync cycle, on every token refresh, and while a historical import is running<\/li>\n<li><strong>Terms of service:<\/strong> <a href=\"https:\/\/dev.netatmo.com\/legal\">https:\/\/dev.netatmo.com\/legal<\/a><\/li>\n<li><strong>Privacy policy:<\/strong> <a href=\"https:\/\/legals.netatmo.com\/?goto=privacy\">https:\/\/legals.netatmo.com\/?goto=privacy<\/a><\/li>\n<\/ul>\n\n<h4>Open-Meteo API (api.open-meteo.com)<\/h4>\n\n<ul>\n<li><strong>Purpose:<\/strong> Fetch weather forecast data based on station coordinates (default provider)<\/li>\n<li><strong>Data sent:<\/strong> Latitude and longitude of your weather station<\/li>\n<li><strong>When:<\/strong> When the forecast shortcode is displayed (cached for 3 hours)<\/li>\n<li><strong>Terms and privacy:<\/strong> <a href=\"https:\/\/open-meteo.com\/en\/terms\">https:\/\/open-meteo.com\/en\/terms<\/a><\/li>\n<li><strong>Note:<\/strong> Open-Meteo is a free, open-source weather API. No API key or registration required.<\/li>\n<\/ul>\n\n<h4>Open-Meteo Geocoding API (geocoding-api.open-meteo.com)<\/h4>\n\n<ul>\n<li><strong>Purpose:<\/strong> Turn a place into coordinates, and coordinates into a place name for the forecast heading<\/li>\n<li><strong>Data sent:<\/strong> In \"manual\" location mode, the city name or postal code entered in the plugin settings. In \"automatic\" mode, the latitude and longitude of your weather station, rounded to two decimal places, in order to look up the name of the nearest place.<\/li>\n<li><strong>When:<\/strong> In manual mode whenever no cached result exists (cached for 7 days). In automatic mode exactly once \u2014 the resolved name is stored in the plugin settings and never looked up again.<\/li>\n<li><strong>Terms and privacy:<\/strong> <a href=\"https:\/\/open-meteo.com\/en\/terms\">https:\/\/open-meteo.com\/en\/terms<\/a><\/li>\n<li><strong>Documentation:<\/strong> <a href=\"https:\/\/open-meteo.com\/en\/docs\/geocoding-api\">https:\/\/open-meteo.com\/en\/docs\/geocoding-api<\/a><\/li>\n<\/ul>\n\n<h4>Yr.no \/ MET Norway API (api.met.no)<\/h4>\n\n<ul>\n<li><strong>Purpose:<\/strong> Fetch weather forecast data (optional provider, selectable in settings)<\/li>\n<li><strong>Data sent:<\/strong> Latitude and longitude of your weather station<\/li>\n<li><strong>When:<\/strong> When the forecast shortcode is displayed and Yr.no is selected as provider (cached for 3 hours)<\/li>\n<li><strong>Privacy policy:<\/strong> <a href=\"https:\/\/www.met.no\/en\/About-us\/privacy\">https:\/\/www.met.no\/en\/About-us\/privacy<\/a><\/li>\n<li><strong>Terms:<\/strong> <a href=\"https:\/\/developer.yr.no\/doc\/TermsOfService\/\">https:\/\/developer.yr.no\/doc\/TermsOfService\/<\/a><\/li>\n<li><strong>Note:<\/strong> Free API, no API key needed. MET Norway's terms require every client to identify itself, so requests to this service carry a User-Agent naming the plugin, its version and your site address \u2014 that address is how MET Norway would reach you before restricting a misbehaving client. This is sent to api.met.no only, and only while Yr.no is the selected provider.<\/li>\n<\/ul>\n\n<p>No personal user data (names, emails, IP addresses) is collected or transmitted by this plugin. All sensor data is stored exclusively in your local WordPress database.<\/p>\n\n<h3>Third-Party Libraries<\/h3>\n\n<p>Two JavaScript libraries are bundled with this plugin, both under the MIT license, which is GPL-compatible. They ship in their minified distribution builds; the unminified source and the build tooling for each are available at the links below.<\/p>\n\n<h4>Chart.js 4.5.1<\/h4>\n\n<ul>\n<li><strong>File:<\/strong> <code>assets\/vendor\/chart.umd.min.js<\/code><\/li>\n<li><strong>License:<\/strong> MIT<\/li>\n<li><strong>Homepage:<\/strong> <a href=\"https:\/\/www.chartjs.org\">https:\/\/www.chartjs.org<\/a><\/li>\n<li><strong>Source and build tools:<\/strong> <a href=\"https:\/\/github.com\/chartjs\/Chart.js\">https:\/\/github.com\/chartjs\/Chart.js<\/a> \u2014 the exact release bundled here is <a href=\"https:\/\/github.com\/chartjs\/Chart.js\/releases\/tag\/v4.5.1\">v4.5.1<\/a><\/li>\n<li><strong>Used for:<\/strong> All charts \u2014 24h trend lines on the live dashboard and the year-over-year history charts<\/li>\n<\/ul>\n\n<h4>chartjs-adapter-date-fns 3.0.0<\/h4>\n\n<ul>\n<li><strong>File:<\/strong> <code>assets\/vendor\/chartjs-adapter-date-fns.bundle.min.js<\/code><\/li>\n<li><strong>License:<\/strong> MIT<\/li>\n<li><strong>Source and build tools:<\/strong> <a href=\"https:\/\/github.com\/chartjs\/chartjs-adapter-date-fns\">https:\/\/github.com\/chartjs\/chartjs-adapter-date-fns<\/a> \u2014 the exact release bundled here is <a href=\"https:\/\/github.com\/chartjs\/chartjs-adapter-date-fns\/releases\/tag\/v3.0.0\">v3.0.0<\/a><\/li>\n<li><strong>Used for:<\/strong> Time axis formatting in the charts. This is the bundled build, which includes date-fns (also MIT).<\/li>\n<\/ul>\n\n<p>No other third-party code is included. No library is loaded from a CDN; everything is served from your own installation. Libraries that ship with WordPress itself are used from WordPress and are not bundled.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>xtx-integration-for-netatmo<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin in WordPress Admin &gt; Plugins<\/li>\n<li>Go to <strong>XTX Netatmo &gt; Settings<\/strong><\/li>\n<li>Create a Netatmo developer app at <a href=\"https:\/\/dev.netatmo.com\">dev.netatmo.com<\/a><\/li>\n<li>Enter your Client ID and Client Secret<\/li>\n<li>Set the Redirect URI in your Netatmo app to: <code>https:\/\/yoursite.com\/wp-admin\/admin.php?page=naws-settings<\/code><\/li>\n<li>Click \"Connect to Netatmo\" and authorize<\/li>\n<li>Data syncs automatically \u2013 add shortcodes to any page<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20get%20netatmo%20api%20credentials%3F\"><h3>How do I get Netatmo API credentials?<\/h3><\/dt>\n<dd><p>Visit <a href=\"https:\/\/dev.netatmo.com\">dev.netatmo.com<\/a>, log in with your Netatmo account, create a new application and copy the Client ID and Client Secret.<\/p><\/dd>\n<dt id=\"how%20often%20does%20data%20update%3F\"><h3>How often does data update?<\/h3><\/dt>\n<dd><p>Netatmo sensors transmit every 5 minutes. The plugin sync interval is configurable (5\u20131440 minutes). Night mode reduces polling between 23:00\u201306:00.<\/p><\/dd>\n<dt id=\"can%20i%20import%20historical%20data%3F\"><h3>Can I import historical data?<\/h3><\/dt>\n<dd><p>Yes. The plugin includes a chunk-based historical importer that fetches data from the Netatmo getmeasure API without hitting rate limits.<\/p><\/dd>\n<dt id=\"is%20the%20rest%20api%20secure%3F\"><h3>Is the REST API secure?<\/h3><\/dt>\n<dd><p>Yes. Every endpoint is read-only, rate-limited, and requires an API key generated in the admin panel. The key is accepted in the X-NAWS-Key header only \u2014 never as a query parameter, so it cannot end up in access logs, the Referer header, browser history or a proxy along the way.<\/p><\/dd>\n<dt id=\"are%20my%20netatmo%20credentials%20safe%3F\"><h3>Are my Netatmo credentials safe?<\/h3><\/dt>\n<dd><p>All sensitive data (OAuth tokens, client ID, client secret, API keys) is encrypted with AES-256-GCM before being stored in the database.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20appearance%3F\"><h3>Can I customize the appearance?<\/h3><\/dt>\n<dd><p>Yes. The Appearance page offers 130+ configurable colors with live preview, 4 icon sets, per-sensor colors, chart theming and year comparison palettes.<\/p><\/dd>\n<dt id=\"can%20i%20back%20up%20my%20weather%20data%3F\"><h3>Can I back up my weather data?<\/h3><\/dt>\n<dd><p>Yes. The Export\/Import feature lets you download weather data, module configs and all settings as JSON. Ideal for migrating to a new WordPress installation.<\/p><\/dd>\n<dt id=\"which%20forecast%20providers%20are%20supported%3F\"><h3>Which forecast providers are supported?<\/h3><\/dt>\n<dd><p>Open-Meteo (global, default) and Yr.no \/ MET Norway (optimized for Northern Europe). Both are free and require no API key.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.9.11<\/h4>\n\n<ul>\n<li>Added: <code>[naws_records]<\/code> \u2014 fifteen records from the daily summary, each with its date: hottest day, coldest night, warmest night, coldest day, largest daily range, warmest and coldest month, wettest day and month, longest dry and wet spell, strongest gust, longest frost period, longest heat wave and longest run of summer days. As tiles or a table, since the first day with readings or for one year (<code>year=\"2025\"<\/code>), a subset with <code>records=\"\u2026\"<\/code>. A tie goes to the earlier date, a month needs twenty days to compete, and a gap in the data breaks a run rather than bridging it.<\/li>\n<li>Added: <code>[naws_on_this_day]<\/code> \u2014 this calendar day in every earlier year: low, high, mean and rain, newest year first, with the day's record marked in each column. The running year is left out.<\/li>\n<li>Added: <code>[naws_sunpath]<\/code> \u2014 the sun on its arc over the station as an inline SVG: sunrise, solar noon and sunset, the part of the day already travelled, and the sun where it stands; at night below the horizon. Under it the day length, the change since yesterday and the year's longest and shortest day at the station's latitude. No script \u2014 a page cache shows the sun where it stood when the cache was filled.<\/li>\n<li>Added: a colour scheme for the sidebar widget. <code>[naws_weather_widget]<\/code> was a white card whatever the sidebar looked like. It now has <code>light<\/code>, <code>dark<\/code> and <code>transparent<\/code> \u2014 the last draws no card at all and takes the sidebar's own colours. Chosen under Appearance \u2192 Sidebar widget, where the preview shows it on a dark ground, or per placement with <code>scheme=\"dark\"<\/code>.<\/li>\n<li>Fix: the purge button under Settings \u2192 Manual Data Purge did nothing, and every admin page of the plugin threw \"$ is not a function\". Since 1.6.4 two handlers in <code>admin.js<\/code> stood behind the line that closes the jQuery block. The purge button works again, and its messages are translated instead of German literals in the script.<\/li>\n<li>Fix: the bundled catalogue builder now writes plural forms, so \"1 day \/ 2 days\" reads right in German and Norwegian. Both bundled catalogues are complete at 735 strings.<\/li>\n<\/ul>\n\n<h4>1.9.10<\/h4>\n\n<ul>\n<li>Added: <code>[naws_heatmap]<\/code> \u2014 a year of outdoor daily mean temperatures as a calendar grid: twelve rows of months, thirty-one columns of days, one coloured tile per day, and a row of buttons to page through the years. What a curve makes you read, a grid lets you see: the cold fortnight in February and the hot week in July are shapes on the page rather than wiggles on a line. It reads the daily averages the annual chart already uses, so there is nothing to import. The ten colour stops are settings under Appearance \u2192 Heatmap Scale, values between two stops are interpolated, and they are anchored in Celsius even when the display is set to Fahrenheit, because the colour comes from the stored value and the tooltip from the unit you chose. Where a day has no stored average but does have a minimum and a maximum, the tile shows the mean of the two and its tooltip says so. The grid is a table rather than a drawing: the month column stays put while the days scroll sideways on a phone, colours are rendered on the server so the map is complete without JavaScript, and a screen reader reads \"March, 14th, 8.2 \u00b0C\" instead of \"image\". Attributes: <code>year<\/code>, <code>title<\/code>, <code>legend<\/code>.<\/li>\n<li>Changed: the MAC addresses of your modules are no longer written into public pages. A module id in this plugin is the hardware address of a Netatmo module, and until now it travelled into every page carrying <code>[naws_live]<\/code> or <code>[naws_history]<\/code> \u2014 in the data block, on every chart configuration, in the <code>data-module4<\/code>, <code>data-indoor<\/code> and <code>data-outdoor<\/code> attributes \u2014 and it came back out with every request the dashboard made, whose reply carried the base station's address on every one of its thirty-odd readings as well. What travels now is a public reference: <code>outdoor<\/code>, <code>indoor<\/code>, <code>wind<\/code>, <code>rain<\/code> and <code>in-&lt;name&gt;<\/code>, resolved back on the server. Pages cached from before the update and the documented <code>NAWS_Chart<\/code> JavaScript interface both keep working.<\/li>\n<li>Fix: the two language files 1.9.9 shipped were never read. German and Norwegian travelled along as <code>.mo<\/code> files so that an installation with a German interface would not find an English one the day the update arrived \u2014 but WordPress refused both, because the address of the hash table in the file header was wrong. A refused catalogue produces no warning, no log line and no visible difference except that everything stays English. Norwegian, which has no language pack yet, therefore read English throughout 1.9.9.<\/li>\n<li>Fix: fourteen German and thirteen Norwegian strings had lost their translation in 1.9.9. The table columns from 1.9.8 \u2014 time, module, parameter, average \u2014 and the card-order screen came through the migration empty, so a German reader without a language pack saw English column headings in a German interface. The texts were taken from the 1.9.8 language files rather than written afresh, so nothing changed wording that a reader had already got used to.<\/li>\n<li>Fix: three sentences in the chart script were German whatever language WordPress was set to \u2014 the chart that failed to render, the period with no readings, the request that came back with an error code. They sat in the JavaScript as literals, which the move to gettext in 1.9.9 never reached.<\/li>\n<li>Fix: <code>[naws_table]<\/code> printed a MAC address in its module column when the reading's module was no longer in the modules table. Readings outlive the module they came from, so this was reachable rather than theoretical. The cell stays empty now, the way the chart legend does.<\/li>\n<li>Fix: a chart request that left out <code>group_by<\/code> wrote a PHP notice into the log. The plugin's own scripts always send it; anything else calling the endpoint did not have to.<\/li>\n<\/ul>\n\n<h4>1.9.9<\/h4>\n\n<ul>\n<li>Changed: <strong>breaking<\/strong> \u2014 the plugin no longer has its own language setting; the WordPress locale decides. The old setting was a single site-wide value for the front end and the back end at once, and it read the site language rather than your own, so it could never give you a back end in one language and your visitors another. Site Language plus the per-user Language in your profile do exactly that, and for your theme and every other plugin at the same time. If you had the plugin set to a language other than your site's, set the site language instead \u2014 or your own user language, if you meant only your own screen.<\/li>\n<li>Changed: the interface translates through WordPress now instead of through the plugin's own language files. Until now translate.wordpress.org saw six strings of this plugin; it sees all 649. That means anyone can contribute a language without touching the code, and every language gets a proper WordPress language pack.<\/li>\n<li>Changed: weekday, month and weather-condition names are translatable. They used to be two hardcoded lists, German and English, so a Norwegian reader got English with no way to change it.<\/li>\n<li>New: German and Norwegian ship with this release as a bridge. Language packs do not exist the moment an update goes out, and an installation that had a German interface yesterday should not find an English one today. A pack always takes precedence once it is built.<\/li>\n<\/ul>\n\n<h4>1.9.8<\/h4>\n\n<ul>\n<li>Fix: <code>[naws_table]<\/code> produced nothing at all. The shortcode was registered, documented in the reference and listed in this readme, and its stylesheet was written \u2014 but the template it includes, <code>templates\/table.php<\/code>, had never been committed. Every use of the shortcode output an empty string and left two PHP warnings in the log. The template is there now, and a test fails if it goes missing again.<\/li>\n<li>Fix: <code>[naws_table]<\/code> listed the bookkeeping values Netatmo stores alongside the readings. <code>max_wind_angle<\/code> and <code>max_wind_str<\/code> have neither a name nor a unit in the plugin, so they appeared as a raw key next to a bare number. The table now asks only for parameters it can present; naming one explicitly in <code>parameters<\/code> still returns it. The daily minimum and maximum temperature and the hourly rain total were in the same position for the opposite reason \u2014 they are meaningful and were simply unnamed, so they have their labels now instead of being hidden.<\/li>\n<li>Fix: <code>[naws_table]<\/code> found nothing for the periods its own reference recommends. <code>period=\"24h\"<\/code> asked for a range that starts tomorrow \u2014 PHP does not read <code>24h<\/code> as a duration, and <code>strtotime('-24h')<\/code> returns a point in the future rather than yesterday. <code>365d<\/code> failed to parse altogether. The start of the range therefore sat behind its end and the query returned nothing, which looked exactly like a station with no readings. The shorthand is spelled out before it reaches the parser now, and a period that cannot be read falls back to the documented 24 hours instead of to 1970.<\/li>\n<li>Fix: the reference gave the grouping of <code>[naws_table]<\/code> as hour, day, week or month. <code>year<\/code> works as well, and any other value lists single readings instead of averages. The readme named four of the shortcode's six attributes.<\/li>\n<li>Fix: a database change would never have reached anyone who updates through WordPress. The routine that creates and migrates the tables hung on the activation hook alone, and WordPress does not fire that when it updates a plugin \u2014 it reactivates it silently. Nobody was hurt by it yet, because until 1.9.7 the plugin was installed by hand and activated in the process; since the directory listing, the update button is the normal way, and that is exactly the path that skipped it. The plugin now compares the stored schema version on every load and migrates when they differ.<\/li>\n<li>Changed: <code>Plugin URI<\/code> in the plugin header points at the plugin's own page, netatmo.frank-neumann.de, instead of at a weather page that carries a section about it. That is what the \"Visit plugin site\" link in your plugins list opens.<\/li>\n<\/ul>\n\n<h4>1.9.7<\/h4>\n\n<ul>\n<li>New: the order of the live cards and of the yearly comparison charts is a setting. Both lists on the Live-Dashboard screen are sortable by drag and drop, and the front end follows. A saved order decides position, never membership: an id left over from a renamed module is passed over, and a chart the order has never heard of takes its place at the end instead of disappearing.<\/li>\n<li>New: <code>[naws_calc]<\/code> \u2014 one shortcode for twenty-seven computed values in four kinds. Fourteen instant values (dew point, apparent temperature, wet-bulb temperature, heat index, thermal sensation, CO2 rating, wind compass, sunrise, sunset, day length, moon phase and illumination, next supermoon, next lunar eclipse), seven day classes with <code>mode=\"count|streak|max_streak\"<\/code> (ice days, frost days, summer days, hot days, tropical nights, heating and cooling days), five sums (heating and cooling degree days, growing degree days, the grassland temperature sum and the date the growing season started) and the Standardized Precipitation Index.<\/li>\n<li>New: the admin shows the state of the encryption \u2014 a missing openssl extension, a missing aes-256-gcm, an <code>AUTH_KEY<\/code> still set to the sample value from wp-config-sample.php, and changed WordPress salts. A fingerprint of the key sits beside the ciphertext so a salt change is recognizable as one instead of looking like a broken plugin.<\/li>\n<li>New: the header bar and the font are settings now. The font list offers only fonts your page already serves \u2014 the plugin loads no font file of its own.<\/li>\n<li>New: three settings for the degree-day limits: heating limit, room temperature and cooling limit.<\/li>\n<li>Changed: <strong>breaking<\/strong> \u2014 the REST API accepts its key in the <code>X-NAWS-Key<\/code> header only. A secret in the address line is written down by access logs, the Referer header, the browser history and every cache in between. Calls of the form <code>?api_key=...<\/code> now answer 401. If you use the API, switch before you update.<\/li>\n<li>Changed: the cron settings and the cron log now say what WP-Cron does not do. WP-Cron is triggered by page views, not by a clock, so on a quiet night no sync happens at all.<\/li>\n<li>Fix: a five-second hiccup at Netatmo cost a whole ten-minute polling cycle. Requests are retried now, and an error without an error code is no longer handed back as an empty result.<\/li>\n<li>Fix: a server without the openssl extension died on the first read of a token, and an unauthenticated REST request could turn a 401 into a fatal 500.<\/li>\n<li>Fix: the apparent temperature ignored wind chill, and the heat index was computed outside the range it is defined for.<\/li>\n<li>Fix: the next supermoon, the next lunar eclipse and the next full moon were dated in German whatever the site language was.<\/li>\n<li>Fix: an uppercase MAC address in <code>[naws_value module=\"...\"]<\/code> matched nothing, and an emptied degree-day limit field silently stored 0 degrees.<\/li>\n<li>Fix: this readme advertised five shortcodes and documented six. Ten are registered; all ten are listed now.<\/li>\n<li>Security: the REST API key page created and revoked keys on POST with a nonce check but no capability check of its own. The page is reachable only with <code>manage_options<\/code>, so nothing stood open \u2014 it is the pattern the review team warned about, and the check now runs before the nonce is spent.<\/li>\n<\/ul>\n\n<p>Older versions: the complete changelog since 1.0.0 is kept in <a href=\"https:\/\/github.com\/Xyla1512\/Netatmo\/blob\/main\/CHANGELOG.md\">CHANGELOG.md<\/a> on GitHub.<\/p>","raw_excerpt":"Connects to the Netatmo API, stores all sensor data locally and displays live dashboards, animated charts, history and weather forecasts.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/294194","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=294194"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/xylaender"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=294194"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=294194"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=294194"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=294194"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=294194"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=294194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}