XTX Integration for Netatmo

Beschreibung

XTX Integration for Netatmo verbindet deine Netatmo-Hardware mit WordPress. Es liest alle Sensordaten über die offizielle Netatmo-API, speichert die Messwerte in deiner lokalen Datenbank und zeigt sie in ansehnlichen Live-Dashboards, animierten Diagrammen und Wettervorhersagen.

Wichtigste Funktionen

  • Vollständige Netatmo-Integration – OAuth2-Anmeldung, automatischer Abgleich, alle Modultypen unterstützt (Basis, Außen, Wind, Regen, Innen)
  • Live-Dashboard – Sensorkacheln in Echtzeit mit animierten Zählern, 24-Stunden-Verläufen, Luftdrucktendenz, Windkompass und CO2-Luftqualitätsstufen
  • Astronomie – Sonnenauf- und -untergang, Mondphase mit Beleuchtungsgrad, nächster Vollmond
  • Abgeleitete Wetterdaten – Gefühlte Temperatur, Hitzeindex, Taupunkt, Windchill
  • Verlaufsdiagramme – Jahresvergleich für Temperatur, Luftdruck und Niederschlag mit interaktiver Legende
  • Wettervorhersage – 5-Tage-Vorhersage anhand der Stationskoordinaten über Open-Meteo oder Yr.no
  • REST-API – Nur lesende JSON-API mit Schlüssel-Authentifizierung und Ratenbegrenzung für externe Werkzeuge (Google Charts, Grafana usw.)
  • Verschlüsselte Speicherung – Alle Zugangsdaten (OAuth-Token, Client-Secret, API-Schlüssel) liegen AES-256-GCM-verschlüsselt in der Datenbank
  • Einstellbare Einheiten – C/F, mm/Zoll, mbar/inHg/mmHg, km/h/m/s/mph/kn
  • Mehrsprachig – Vollständige Oberfläche auf Deutsch, Englisch und Norwegisch
  • 10 Shortcodes – Dashboard, aktuelle Messwerte, Infoleiste, Einzelwert, berechneter Wert, Verlaufsdiagramme, Vorhersage, Tabelle, Widget, Wettersymbol
  • Export / Import – Vollständige Sicherung und Wiederherstellung von Wetterdaten, Modulen und Einstellungen
  • Mobile First und responsiv – Alle Ansichten für Smartphone, Tablet und Desktop optimiert
  • Über 130 einstellbare Farben – Vollständige Anpassung der Darstellung mit Live-Vorschau
  • 4 Symbolsätze – Emoji, Outline, Filled und Minimal, mit Farbsteuerung je Sensor

Unterstützte Module

  • NAMain – Basisstation (Temperatur, Luftfeuchte, CO2, Lärm, Luftdruck)
  • NAModule1 – Außenmodul (Temperatur, Luftfeuchte)
  • NAModule2 – Wind (Geschwindigkeit, Richtung, Böen)
  • NAModule3 – Regenmesser (stündlich, täglich, rollende 24 Stunden)
  • NAModule4 – Zusätzliches Innenmodul (Temperatur, Luftfeuchte, CO2)

Shortcodes

  • [naws_live] – Live-Sensorkacheln mit 24-Stunden-Verläufen und Vorhersage
  • [naws_current] – Aktuelle Messwerte eines oder aller Module als Kacheln oder Liste (module_id, parameters, layout, title)
  • [naws_infobar] – Astronomieleiste mit Sonnenaufgang, Mondphase und gefühlter Temperatur
  • [naws_value] – Einzelner Sensorwert im Fließtext
  • [naws_calc] – Einzelner berechneter Wert (Taupunkt, gefühlte Temperatur, Sonnenaufgang, Mondphase, …); vollständige Liste auf der Shortcode-Seite im Backend
  • [naws_history] – Jahresvergleichsdiagramme (unterstützt den Parameter year)
  • [naws_forecast] – Mehrtägige Wettervorhersage
  • [naws_table] – Messwerte als Tabelle über einen Zeitraum, gruppiert nach Stunde, Tag, Woche, Monat oder Jahr (module_id, parameters, period, limit, group_by, title)
  • [naws_weather_widget] – Kompaktes Vorhersage-Widget für eine Seitenleiste (days 3 oder 5, width 250–500)
  • [naws_weather_icon] – Nur das animierte Symbol für den aktuellen Wetterzustand (size); gibt nichts aus, wenn der Zustand unbekannt ist

Datenschutz & externe Dienste

Dieses Plugin verbindet sich mit den folgenden externen Diensten:

Netatmo API (api.netatmo.com)

  • Zweck: Authentifizierung über OAuth2, Abruf von Sensormesswerten und Stationsdaten
  • Übermittelte Daten: Client-ID und Client-Secret der von dir erstellten Netatmo-Anwendung, im Austausch gegen ein Access-Token; danach mit jeder Anfrage das Access- oder Refresh-Token sowie die Stations- und Modul-IDs, deren Messwerte angefragt werden
  • Wann: Bei der ersten Anmeldung, bei jedem automatischen Abgleich, bei jeder Token-Erneuerung und während ein historischer Import läuft
  • Nutzungsbedingungen: https://dev.netatmo.com/legal
  • Datenschutzerklärung: https://legals.netatmo.com/?goto=privacy

Open-Meteo API (api.open-meteo.com)

  • Zweck: Wettervorhersagedaten anhand der Stationskoordinaten abrufen (Standardanbieter)
  • Übermittelte Daten: Breiten- und Längengrad deiner Wetterstation
  • Wann: Wenn der Vorhersage-Shortcode angezeigt wird (3 Stunden zwischengespeichert)
  • Bedingungen und Datenschutz: https://open-meteo.com/en/terms
  • Hinweis: Open-Meteo ist eine kostenlose, quelloffene Wetter-API. Weder API-Schlüssel noch Registrierung sind nötig.

Open-Meteo Geocoding API (geocoding-api.open-meteo.com)

  • Zweck: Einen Ort in Koordinaten übersetzen und Koordinaten in einen Ortsnamen für die Überschrift der Vorhersage
  • Übermittelte Daten: Im Standortmodus „manuell“ der Ortsname oder die Postleitzahl, die in den Plugin-Einstellungen eingetragen sind. Im Modus „automatisch“ Breiten- und Längengrad deiner Wetterstation, auf zwei Nachkommastellen gerundet, um den Namen des nächstgelegenen Ortes nachzuschlagen.
  • Wann: Im manuellen Modus immer dann, wenn kein zwischengespeichertes Ergebnis vorliegt (7 Tage zwischengespeichert). Im automatischen Modus genau einmal — der ermittelte Name wird in den Plugin-Einstellungen gespeichert und nie wieder nachgeschlagen.
  • Bedingungen und Datenschutz: https://open-meteo.com/en/terms
  • Dokumentation: https://open-meteo.com/en/docs/geocoding-api

Yr.no / MET Norway API (api.met.no)

  • Zweck: Wettervorhersagedaten abrufen (optionaler Anbieter, in den Einstellungen wählbar)
  • Übermittelte Daten: Breiten- und Längengrad deiner Wetterstation
  • Wann: Wenn der Vorhersage-Shortcode angezeigt wird und Yr.no als Anbieter ausgewählt ist (3 Stunden zwischengespeichert)
  • Datenschutzerklärung: https://www.met.no/en/About-us/privacy
  • Nutzungsbedingungen: https://developer.yr.no/doc/TermsOfService/
  • Hinweis: Kostenlose API, kein API-Schlüssel nötig. Die Nutzungsbedingungen von MET Norway verlangen, dass sich jeder Client zu erkennen gibt; Anfragen an diesen Dienst tragen deshalb einen User-Agent mit dem Namen des Plugins, seiner Version und deiner Seitenadresse — über diese Adresse würde MET Norway dich erreichen, bevor ein auffälliger Client eingeschränkt wird. Das geht ausschließlich an api.met.no und nur, solange Yr.no als Anbieter ausgewählt ist.

Dieses Plugin erhebt und übermittelt keine personenbezogenen Daten (Namen, E-Mail-Adressen, IP-Adressen). Alle Sensordaten liegen ausschließlich in deiner lokalen WordPress-Datenbank.

Bibliotheken von Drittanbietern

Diesem Plugin liegen zwei JavaScript-Bibliotheken bei, beide unter der MIT-Lizenz, die GPL-kompatibel ist. Sie werden als minifizierte Distributions-Builds ausgeliefert; der unminifizierte Quellcode und die Build-Werkzeuge sind jeweils über die Links unten erreichbar.

Chart.js 4.5.1

chartjs-adapter-date-fns 3.0.0

  • Datei: assets/vendor/chartjs-adapter-date-fns.bundle.min.js
  • Lizenz: MIT
  • Quellcode und Build-Werkzeuge: https://github.com/chartjs/chartjs-adapter-date-fns — mitgeliefert ist genau die Fassung v3.0.0
  • Verwendet für: Formatierung der Zeitachse in den Diagrammen. Dies ist der gebündelte Build, der date-fns enthält (ebenfalls MIT).

Weiterer Fremdcode ist nicht enthalten. Keine Bibliothek wird von einem CDN geladen; alles kommt von deiner eigenen Installation. Bibliotheken, die WordPress selbst mitbringt, werden von WordPress bezogen und nicht mitgeliefert.

Screenshots

Installation

  1. Lade den Ordner xtx-integration-for-netatmo nach /wp-content/plugins/ hoch
  2. Aktiviere das Plugin im WordPress-Adminbereich unter > Plugins
  3. Gehe zu XTX Netatmo > Einstellungen
  4. Erstelle unter dev.netatmo.com eine Netatmo-Entwickleranwendung
  5. Trage Client-ID und Client-Secret ein
  6. Trage in deiner Netatmo-Anwendung als Redirect-URI ein: https://yoursite.com/wp-admin/admin.php?page=naws-settings
  7. Klicke auf „Mit Netatmo verbinden“ und erteile die Berechtigung
  8. Die Daten werden ab jetzt automatisch abgeglichen – füge Shortcodes in eine beliebige Seite ein

FAQ

Wie bekomme ich Netatmo-API-Zugangsdaten?

Öffne dev.netatmo.com, melde dich mit deinem Netatmo-Konto an, erstelle eine neue Anwendung und kopiere Client-ID und Client-Secret.

Wie oft werden die Daten aktualisiert?

Netatmo-Sensoren senden alle 5 Minuten. Das Abrufintervall des Plugins ist einstellbar (5–1440 Minuten). Der Nachtmodus reduziert die Abfragen zwischen 23:00 und 06:00 Uhr.

Kann ich historische Daten importieren?

Ja. Das Plugin bringt einen abschnittsweise arbeitenden Importer für historische Daten mit, der die getmeasure-API von Netatmo abfragt, ohne an die Ratenbegrenzung zu stoßen.

Ist die REST-API sicher?

Ja. Jeder Endpunkt ist nur lesend, ratenbegrenzt und verlangt einen API-Schlüssel, den du im Backend erzeugst. Der Schlüssel wird ausschließlich im Header X-NAWS-Key angenommen — nie als Query-Parameter, damit er nicht in Zugriffsprotokollen, im Referer-Header, im Browserverlauf oder in einem Proxy dazwischen landet.

Sind meine Netatmo-Zugangsdaten sicher?

Alle sensiblen Daten (OAuth-Token, Client-ID, Client-Secret, API-Schlüssel) werden vor dem Speichern in der Datenbank mit AES-256-GCM verschlüsselt.

Kann ich das Aussehen anpassen?

Ja. Die Darstellungsseite bietet über 130 einstellbare Farben mit Live-Vorschau, 4 Symbolsätze, Farben je Sensor, Diagramm-Themes und Paletten für den Jahresvergleich.

Kann ich meine Wetterdaten sichern?

Ja. Über Export/Import lädst du Wetterdaten, Modulkonfiguration und alle Einstellungen als JSON herunter. Ideal für den Umzug auf eine neue WordPress-Installation.

Welche Vorhersage-Anbieter werden unterstützt?

Open-Meteo (weltweit, Standard) und Yr.no / MET Norway (auf Nordeuropa optimiert). Beide sind kostenlos und brauchen keinen API-Schlüssel.

Rezensionen

Zu diesem Plugin liegen noch keine Rezensionen vor.

Mitwirkende und Entwickler

„XTX Integration for Netatmo“ ist Open-Source-Software. Folgende Menschen haben an diesem Plugin mitgewirkt:

Mitwirkende

„XTX Integration for Netatmo“ wurde in 2 Sprachen übersetzt. Danke an die Übersetzer für ihre Mitwirkung.

Übersetze „XTX Integration for Netatmo“ in deine Sprache.

Interessiert an der Entwicklung?

Durchstöbere den Code, sieh dir das SVN-Repository an oder abonniere das Entwicklungsprotokoll per RSS.

Änderungsprotokoll

1.9.9

  • Geändert: breaking — das Plugin hat keine eigene Spracheinstellung mehr, die WordPress-Locale entscheidet. Die alte Einstellung war ein einziger seitenweiter Wert für Frontend und Backend zusammen, und sie las die Sprache der Website statt deiner eigenen — sie konnte dir also nie ein Backend in einer Sprache und den Besuchern eine andere geben. Die Sprache der Website plus die Sprache in deinem Benutzerprofil tun genau das, und zwar für dein Theme und jedes andere Plugin gleich mit. Wenn du das Plugin auf eine andere Sprache als deine Website eingestellt hattest, stell stattdessen die Sprache der Website um — oder deine Benutzersprache, wenn du nur deinen eigenen Bildschirm gemeint hast.
  • Geändert: Die Oberfläche übersetzt jetzt über WordPress statt über die plugin-eigenen Sprachdateien. Bisher sah translate.wordpress.org sechs Strings dieses Plugins; jetzt sind es alle 649. Damit kann jeder eine Sprache beitragen, ohne den Code anzufassen, und jede Sprache bekommt ein richtiges WordPress-Sprachpaket.
  • Geändert: Wochentage, Monatsnamen und Wetterlagen sind übersetzbar. Sie standen bisher als zwei fest verdrahtete Listen im Code, Deutsch und Englisch — wer norwegisch las, bekam Englisch und konnte nichts daran ändern.
  • Neu: Deutsch und Norwegisch liegen dieser Version als Übergang bei. Im Moment einer Veröffentlichung gibt es noch keine Sprachpakete, und eine Installation, die gestern eine deutsche Oberfläche hatte, soll heute keine englische vorfinden. Sobald ein Paket gebaut ist, hat es Vorrang.

1.9.8

  • Fix: [naws_table] gab überhaupt nichts aus. Der Kurzbefehl war angemeldet, in der Referenz beschrieben und in dieser readme aufgeführt, und sein Stylesheet war geschrieben — nur die Datei, die er einbindet, templates/table.php, war nie committet worden. Jede Verwendung gab eine leere Zeichenkette zurück und hinterließ zwei PHP-Warnungen im Protokoll. Das Template ist jetzt da, und ein Test schlägt fehl, falls es wieder verschwindet.
  • Fix: [naws_table] listete die Verwaltungsgrößen auf, die Netatmo neben den Messwerten ablegt. max_wind_angle und max_wind_str haben im Plugin weder Namen noch Einheit und standen als roher Schlüssel neben einer nackten Zahl. Die Tabelle fragt jetzt nur noch ab, was sie darstellen kann; wer einen dieser Werte in parameters ausdrücklich anfordert, bekommt ihn weiterhin. Tagesminimum und -maximum der Temperatur und die Regensumme der letzten Stunde standen aus dem umgekehrten Grund dort — sie sind sinnvoll und waren bloß unbenannt, also tragen sie jetzt ihre Namen, statt versteckt zu werden.
  • Fix: [naws_table] fand nichts für die Zeiträume, die seine eigene Referenz empfiehlt. period="24h" fragte einen Zeitraum ab, der morgen beginnt — PHP liest 24h nicht als Dauer, und strtotime('-24h') liefert einen Punkt in der Zukunft statt gestern. 365d ließ sich überhaupt nicht lesen. Der Anfang des Zeitraums lag damit hinter seinem Ende, die Abfrage traf nichts, und das sah genauso aus wie eine Station ohne Messwerte. Die Kurzform wird jetzt ausgeschrieben, bevor sie den Parser erreicht, und ein Zeitraum, der sich nicht lesen lässt, fällt auf die dokumentierten 24 Stunden zurück statt auf 1970.
  • Fix: Die Referenz gab die Gruppierung von [naws_table] als Stunde, Tag, Woche oder Monat an. year geht auch, und jeder andere Wert listet Einzelmesswerte statt Mittelwerte. Die readme nannte vier der sechs Angaben des Kurzbefehls.

1.9.7

  • Neu: Die Reihenfolge der Live-Karten und der Jahresvergleichsdiagramme ist eine Einstellung. Beide Listen auf der Seite „Live-Dashboard“ lassen sich per Drag and Drop sortieren, und das Frontend folgt. Eine gespeicherte Reihenfolge entscheidet über die Position, nie über die Zugehörigkeit: eine ID, die von einem umbenannten Modul übrig ist, wird übergangen, und ein Diagramm, von dem die Reihenfolge noch nie gehört hat, landet am Ende statt zu verschwinden.
  • Neu: [naws_calc] — ein Shortcode für siebenundzwanzig berechnete Werte in vier Arten. Vierzehn Momentanwerte (Taupunkt, gefühlte Temperatur, Feuchtkugeltemperatur, Hitzeindex, Temperaturempfinden, CO2-Bewertung, Windrose, Sonnenaufgang, Sonnenuntergang, Tageslänge, Mondphase und Beleuchtung, nächster Supermond, nächste Mondfinsternis), sieben Tagesklassen mit mode="count|streak|max_streak" (Eistage, Frosttage, Sommertage, heiße Tage, Tropennächte, Heiz- und Kühltage), fünf Summen (Heiz- und Kühlgradtage, Wachstumsgradtage, die Grünlandtemperatursumme und das Datum, an dem die Vegetationsperiode begonnen hat) und der Standardisierte Niederschlagsindex.
  • Neu: Das Backend zeigt den Zustand der Verschlüsselung — eine fehlende openssl-Erweiterung, ein fehlendes aes-256-gcm, einen AUTH_KEY, der noch auf dem Beispielwert aus wp-config-sample.php steht, und geänderte WordPress-Salts. Ein Fingerabdruck des Schlüssels liegt neben dem Chiffrat, damit eine geänderte Salt als solche erkennbar ist und nicht wie ein kaputtes Plugin aussieht.
  • Neu: Die Kopfleiste und die Schrift sind jetzt Einstellungen. Die Schriftliste bietet nur Schriften an, die deine Seite ohnehin ausliefert — das Plugin lädt keine eigene Schriftdatei.
  • Neu: drei Einstellungen für die Gradtaggrenzen: Heizgrenze, Raumtemperatur und Kühlgrenze.
  • Geändert: breaking — die REST-API nimmt ihren Schlüssel nur noch im Header X-NAWS-Key entgegen. Ein Geheimnis in der Adresszeile schreiben Zugriffsprotokolle, der Referer-Header, der Browserverlauf und jeder Cache dazwischen mit. Aufrufe der Form ?api_key=... antworten jetzt mit 401. Wenn du die API nutzt, stell um, bevor du aktualisierst.
  • Geändert: Die Cron-Einstellungen und das Cron-Log sagen jetzt, was WP-Cron nicht leistet. WP-Cron wird von Seitenaufrufen ausgelöst, nicht von einer Uhr — in einer ruhigen Nacht findet also gar keine Synchronisation statt.
  • Fix: Ein Aussetzer von fünf Sekunden bei Netatmo kostete einen kompletten zehnminütigen Abfragezyklus. Anfragen werden jetzt wiederholt, und ein Fehler ohne Fehlercode wird nicht mehr als leeres Ergebnis zurückgegeben.
  • Fix: Ein Server ohne die openssl-Erweiterung starb beim ersten Lesen eines Tokens, und eine nicht authentifizierte REST-Anfrage konnte aus einem 401 einen fatalen 500 machen.
  • Fix: Die gefühlte Temperatur ließ den Windchill außer Acht, und der Hitzeindex wurde außerhalb des Bereichs berechnet, für den er definiert ist.
  • Fix: Der nächste Supermond, die nächste Mondfinsternis und der nächste Vollmond wurden auf Deutsch datiert, egal welche Sprache die Website hatte.
  • Fix: Eine MAC-Adresse in Großbuchstaben in [naws_value module="..."] traf auf nichts, und ein geleertes Feld für die Gradtaggrenze speicherte stillschweigend 0 Grad.
  • Fix: Diese Readme warb mit fünf Shortcodes und dokumentierte sechs. Registriert sind zehn; alle zehn sind jetzt aufgeführt.
  • Sicherheit: Die Seite für die REST-API-Schlüssel legte Schlüssel per POST an und widerrief sie mit Nonce-Prüfung, aber ohne eigene Capability-Prüfung. Die Seite ist nur mit manage_options erreichbar, es stand also nichts offen — es ist das Muster, vor dem das Review-Team gewarnt hat, und die Prüfung läuft jetzt, bevor die Nonce verbraucht wird.

1.9.6.2

  • Fix: Der Header „Tested up to“ nennt jetzt WordPress 7.1, in readme.txt und im Plugin-Header. Am Code hat sich gegenüber 1.9.6.1 nichts geändert.

1.9.6.1

  • Sicherheit: Die OAuth-Rückkehrroute prüfte den OAuth-State, aber nicht die Berechtigung des Aufrufers. NAWS_Admin::handle_oauth_callback() läuft auf admin_init, nimmt die Weiterleitung von Netatmo entgegen und tauschte den Code gegen ein Access- und ein Refresh-Token — für wen auch immer gerade angemeldet war. Der State beweist, dass die Anfrage zu einem auf dieser Seite begonnenen Ablauf gehört; über den, der der Weiterleitung folgt, sagt er nichts, und Netatmo gibt den Code an genau eine feste URL zurück. current_user_can( 'manage_options' ) läuft jetzt ganz oben in der Methode, bevor der State gelesen wird, sodass eine Anfrage ohne die Berechtigung auch die ausstehende Autorisierung nicht verbrauchen kann. Gemeldet vom WordPress-Plugin-Review-Team.
  • Sicherheit: Einen zweiten Annahmepfad in derselben Prüfung entfernt. Ein State, der nicht übereinstimmte, wurde auch als wp_verify_nonce( $state, 'naws_oauth' ) akzeptiert — eine Nonce, die kein Code im Plugin je erzeugt hat. Die Prüfung ist jetzt eine einzige Bedingung, und ein State, der nicht übereinstimmt, beendet die Anfrage.

1.9.6

  • Geändert: Das Plugin gibt kein Inline-Skript mehr aus. Der Startcode für das Live-Dashboard und die Verlaufsdiagramme kommt jetzt als zwei gewöhnliche JavaScript-Dateien, die auf WordPress-Art eingebunden werden. Damit entfällt auch der Grund für den Behelf aus 1.9.3: eine eingebundene Datei kann nicht stillschweigend verworfen werden wie ein Inline-Fragment. Das JavaScript selbst ist unverändert, und mehrere Shortcodes auf einer Seite teilen sich jetzt eine einzige Kopie davon.

1.9.5

  • Fix: Der User-Agent an die Vorhersage-API von Yr.no / MET Norway nannte ein Repository, das es nicht gibt, und drei weitere ausgehende Anfragen nannten überhaupt keinen Kontakt. Die Nutzungsbedingungen von MET Norway verlangen, dass sich jeder Client mit einem erreichbaren Kontakt zu erkennen gibt. Alle Anfragen senden jetzt den Namen des Plugins, seine Version und deine Seitenadresse.
  • Fix: Der Link zur Netatmo-Datenschutzerklärung in dieser Readme war tot und wurde ersetzt. Der Netatmo-Eintrag hat außerdem einen Link zu den Nutzungsbedingungen bekommen und nennt jetzt, dass Client-ID und Client-Secret an den Token-Endpunkt gesendet werden.
  • Neu: Ein Abschnitt zu Fremdbibliotheken, der die beiden mitgelieferten JavaScript-Bibliotheken (Chart.js und chartjs-adapter-date-fns), ihre MIT-Lizenzen und die Bezugsquelle ihres unminifizierten Quellcodes dokumentiert.
  • Neu: Der Geokodierungsdienst von Open-Meteo ist jetzt getrennt vom Vorhersagedienst dokumentiert. Es ist ein anderer Host und hatte keinen eigenen Eintrag.
  • Geändert: Die mitgelieferte LICENSE-Datei ist jetzt die GPL v2, passend zu dem „GPLv2 or later“, das im Plugin-Header und in dieser Readme steht. Die Lizenz selbst ist unverändert.
  • Geändert: Am Ende des mitgelieferten Chart.js einen Verweis auf eine Source Map entfernt, die auf eine Datei zeigte, die dem Paket nie beilag.

1.9.4

  • Geändert: Die Datenbankmigration, die die Sensorspalten aus 1.4 anlegt, setzt ihr SQL nicht mehr aus Variablen zusammen. Die Spaltennamen stammten aus einer fest hinterlegten Liste und waren nie Benutzereingabe, aber der Sicherheitsscanner von Plugin Check kann das nicht nachprüfen und markierte die Abfrage. Jedes ALTER TABLE steht jetzt vollständig ausgeschrieben da, damit nichts mehr zu markieren bleibt.
  • Geändert: Diese Migration fragte jede ihrer acht Spalten einzeln ab. Sie liest die Spaltenliste jetzt einmal. Die Migration läuft nur bei Aktivierung und Upgrade, es ändert sich also nichts, was auffallen würde.

1.9.3

  • Fix: Die Verlaufsdiagramme blieben auf manchen Installationen leer. Die Diagrammdaten und das Diagrammskript wurden mit wp_add_inline_script() eingefügt, was auf diesen Installationen stillschweigend verworfen wird, sodass überhaupt nichts gerendert wurde. Beide nutzen jetzt dasselbe verlässliche Muster wie schon das Live-Dashboard: ein schlichtes JSON-Datenelement plus ein Skriptblock im Footer.
  • Geändert: Die Jahresschalter in den Verlaufsdiagrammen sitzen unter ihrem Diagramm statt neben dem Titel. Sie nutzen jetzt die volle Diagrammbreite und brechen über so viele Zeilen um, wie nötig sind, sodass Stationen mit zehn und mehr Jahren an Aufzeichnungen die Schalter nicht mehr nach rechts hinausdrücken. Die vergrößerte Diagrammansicht folgt demselben Layout.
  • Fix: Wer ein Jahr in der vergrößerten Diagrammansicht ausblendete, sah den zugehörigen Knopf im kleinen Diagramm weiterhin aktiv, obwohl das Diagramm darunter das Jahr längst fallen gelassen hatte. Beide Legenden werden jetzt gemeinsam aktualisiert.

1.9.2

  • Fix: Wiederholte API-Fehler ließen das Plugin härter abfragen, statt zurückzustecken. Das Intervall soll sich nach drei Fehlschlägen verdoppeln, aber die Obergrenze dieser Rechnung lag unter den längsten Intervallen, die die Einstellungen anbieten — ein Intervall von 120 Minuten wurde dadurch halbiert, und eines von 60 Minuten änderte sich nie.
  • Fix: Ein Cron-Intervall, das keinem der verfügbaren Zeitpläne entspricht, brachte die Abfrage komplett zum Erliegen. Das Feld nahm jeden Wert von 5 bis 1440 Minuten an, während es nur sieben davon als Zeitplan gibt, und ein nicht gelisteter Wert wie 45 ließ die Seite ohne Abruf-Cron zurück. Das Intervall ist jetzt ein Auswahlfeld, und gespeicherte Werte werden auf den nächstgelegenen Zeitplan gerundet.
  • Fix: Der Nachtmodus reduzierte die Abfrage nicht mehr, sobald die API Schwierigkeiten hatte, weil er von der letzten erfolgreichen Synchronisation aus maß statt vom letzten Versuch.
  • Fix: Das Dashboard warnte im normalen Nachtbetrieb vor einer veralteten Synchronisation. Die Warnschwelle berücksichtigt jetzt das verdoppelte Nachtintervall.
  • Geändert: Nachtmodus, Tageszusammenfassungen und der Verlaufsimporter nutzen jetzt die in WordPress eingestellte Zeitzone statt Europe/Berlin. Auf Seiten in anderen Zeitzonen lag das Nachtfenster auf den falschen Stunden, und Tagesgrenzen konnten an der falschen Mitternacht geschnitten werden.
  • Geändert: Das Fehler-Backoff wird bei der Intervalleinstellung beschrieben statt beim Häkchen für den Nachtmodus. Es gilt unabhängig vom Nachtmodus.

1.9.1

  • Geändert: Die Einstellungsseite ist neu geordnet. Die Verbindungskarte nimmt jetzt die volle Breite ein, und die Einstellungen darunter stehen in zwei ausgewogenen Spalten, sodass die Vorhersageeinstellungen weit oben statt ganz unten sichtbar sind. Die Seite ist rund 600 Pixel kürzer und hat neben der Verbindungskarte keine große leere Fläche mehr.
  • Geändert: ein Speicherknopf für alle Einstellungen statt dreier. Die API-Zugangsdaten behalten ihr eigenes Formular und ihren eigenen Knopf.
  • Fix: Jedes Speichern schrieb jede Einstellung neu. Jedes Formular trug versteckte Kopien der Felder mit sich, die ihm nicht gehörten — ein Überbleibsel aus der Zeit vor dem Merge-Verhalten aus 1.7.0. Beim Speichern der Einheiten wurden also auch Vorhersageeinstellungen und Zugangsdaten aus veralteten Werten neu geschrieben, sodass Änderungen aus einem zweiten Browser-Tab verloren gehen konnten. Ein Speichern berührt jetzt nur noch die Felder, die in diesem Formular zu sehen sind.
  • Fix: Das entschlüsselte Client-Secret wurde dreimal statt einmal in die Seite geschrieben und beim Speichern unbeteiligter Einstellungen mitgeschickt.

1.9.0

  • Neu: Die Breite des Sidebar-Widgets lässt sich zwischen 250 und 500 Pixeln einstellen, unter „Darstellung“ oder je Platzierung mit [naws_weather_widget width="400"]. Symbol, Zahlen und Abstände skalieren mit — bei 500 Pixeln ist das Wettersymbol 96 statt 64 Pixel groß. Die Breite wirkt als Maximum, das Widget schrumpft also weiterhin in eine schmalere Spalte.
  • Fix: Das Wettersymbol im Kopf des Sidebar-Widgets war eingefroren. Es wurde über denselben Aufruf gerendert wie die kleinen Vorhersagesymbole, die absichtlich still stehen, und erbte deren Starre. Es animiert jetzt, während die Vorhersagesymbole wie vorgesehen still bleiben.

1.8.3

  • Fix: Die norwegische Oberfläche war nur halb übersetzt. Norwegisch kam mit 326 Schlüsseln, und das Plugin ist seitdem auf 612 gewachsen — alles später Hinzugekommene, also die Vorhersage, die REST-API-Dokumentation, die Shortcode-Referenz und die Einstellungen des Live-Dashboards, blieb englisch. Alle 272 fehlenden Strings sind jetzt auf Bokmål übersetzt.

1.8.2

  • Fix: Die Shortcode-Referenz im Backend zeigte die falschen Beschreibungen. Ein übrig gebliebener Block doppelter Einträge in den Sprachdateien überschrieb die ausführlichen, und der Eintrag zu [naws_history] beschrieb in Wahrheit [naws_table].
  • Sicherheit: Die Eingabebereinigung im Formular der Darstellungseinstellungen wird jetzt direkt auf die abgeschickten Daten angewendet statt über eine Zwischenvariable, damit automatische Prüfwerkzeuge sie sehen. Die Daten wurden auch vorher bereinigt; geändert hat sich nur die Form des Codes.
  • Geändert: Redirect-URLs werden mit RFC-3986-Kodierung gebaut.

1.8.1

  • Fix: Das Wettersymbol zeigte „bedeckt“ unter wolkenlosem Himmel. Der Wettercode des Vorhersageanbieters wirft alle Wolkenschichten zusammen, ein dünner Cirrusschleier zählte also genauso wie eine tiefe, geschlossene Decke. Die Bewölkung wird jetzt aus dem Bedeckungsgrad je Schicht gelesen, hohe Wolken schwächer gewichtet — ein Cirrushimmel gilt als heiter, nicht als bedeckt.
  • Fix: Die korrigierten Bewölkungswerte werden auch als letzter bekannter Messwert behalten, damit ein Ausfall der Vorhersage-API nicht das alte Verhalten zurückholt.

1.8.0

  • Neu: Sidebar-Widget [naws_weather_widget] — Wettersymbol, Außentemperatur, Regen und Wind sowie eine Drei- oder Fünf-Tages-Vorhersage, gebaut für schmale Spalten
  • Neu: Die Länge der Vorhersage ist im Backend wählbar, mit einer Live-Vorschau in der tatsächlichen Breite
  • Geändert: Die in 1.7.0 eingeführten farbigen Wettersymbole werden jetzt überall verwendet, auch im Vorhersage-Shortcode und im Vorhersagestreifen des Dashboards
  • Fix: Das Speichern auf der Seite „Darstellung“ leitet nicht mehr zu den Einstellungen um — Formulare kehren jetzt auf die Seite zurück, von der sie abgeschickt wurden

1.7.0

  • Neu: Animiertes Wettersymbol mit zwölf Zuständen — Shortcode [naws_weather_icon size="96"] und, im Backend umschaltbar, über dem Live-Dashboard
  • Neu: Das Symbol verbindet die Messwerte der Station mit der Vorhersage — deine eigenen Messungen gewinnen, die Vorhersage füllt nur, was die Station nicht messen kann (Bewölkung, Gewitter und, wenn du keinen Regenmesser hast, den Niederschlag)
  • Neu: Ob es regnet oder schneit, entscheidet die Feuchtkugeltemperatur statt der Lufttemperatur — so wird Schnee auch bei 3–4 °C in trockener Luft noch erkannt
  • Neu: sechs Schwellenwerte in den Einstellungen (Starkregen, Schnee, Nebel-Luftfeuchte und -Spread, Sturmwind, Platzierung im Dashboard)
  • Neu: Die aktuellen Bedingungen werden getrennt von der Tagesvorhersage geholt, mit 30 Minuten Cache, damit das Symbol das Wetter jetzt zeigt statt einer Zusammenfassung des ganzen Tages
  • Fix: Das Speichern eines Einstellungsformulars setzt die anderen nicht mehr zurück — beim Speichern der Netatmo-Zugangsdaten wurden Sprache, Einheiten, Synchronisationsintervall und sämtliche Vorhersageeinstellungen stillschweigend auf die Standardwerte zurückgesetzt
  • Fix: Die REST-API-Routen führten ihren Authentifizierungs-Callback nicht aus — bei aktivierter REST-API waren die Endpunkte, einschließlich der Stationskoordinaten, ohne API-Schlüssel erreichbar

1.6.5

  • Kompatibilität: gegen WordPress 7.0 getestet
  • Kompatibilität: Mindestanforderung an PHP auf 8.0 angehoben (Requires PHP: 8.0)
  • Fix: Das Verlaufsdiagramm erzeugt keinen PHP-8.1-Deprecation-Hinweis mehr (substr(): Passing null), solange die Tabelle mit den Tageszusammenfassungen noch leer ist — der Jahresbereich fällt jetzt auf das laufende Jahr zurück statt auf das Jahr 0

1.6.4

  • Fix: $file['size'] im Import-Handler wird jetzt zur ausdrücklichen Bereinigung in intval() gefasst (WordPress.org-Konformität)
  • Fix: Die SHOW COLUMNS-Abfrage in class-naws-astro.php nutzt jetzt $wpdb->prepare(), einheitlich mit dem übrigen Code
  • Fix: Die Hilfsfunktion naws_svg_kses_args() steht jetzt schon beim Laden des Plugins bereit; das behebt den fatalen Fehler im Backend-Dashboard, wenn die Funktion aufgerufen wurde, bevor class-naws-helpers.php geladen war

1.6.3

  • WordPress.org-Konformität: alle ob_start()/ob_get_clean()-Muster auf Dateiebene aus den Backend-Ansichten und Frontend-Templates entfernt
  • WordPress.org-Konformität: PHP-Werte werden über wp_add_inline_script( $handle, $data, 'before' ) mit wp_json_encode() in Inline-Skripte gegeben, statt PHP innerhalb von JS-Blöcken auszugeben
  • WordPress.org-Konformität: alle JS-Strings, die bisher aus PHP ausgegeben wurden, kommen jetzt über nawsAdmin.strings (lokalisiert mit wp_localize_script) – damit entfällt jede PHP-Interpolation in JavaScript
  • WordPress.org-Konformität: Symbol-SVGs werden vor dem JSON-Encoding mit wp_kses() bereinigt; NAWS_Icons::get_js_object() (rohes JS-Literal) durch wp_json_encode( NAWS_Icons::get_set() ) ersetzt
  • Strings ls_saving, ls_saved und ls_error zur Lokalisierung nawsAdmin hinzugefügt (Seite „Live-Einstellungen“)

1.6.2

  • WordPress.org-Konformität: Datei-Uploads mit sanitize_file_name() und move_uploaded_file() bereinigt
  • WordPress.org-Konformität: alle ob_start()-Blöcke werden im selben Gültigkeitsbereich mit ob_get_clean() geschlossen
  • WordPress.org-Konformität: alle verbliebenen Inline-<script>– und <style>-Blöcke auf wp_add_inline_script() bzw. wp_add_inline_style() umgestellt
  • WordPress.org-Konformität: dynamische SQL-Spaltennamen werden vor der Ausführung gegen eine explizite Whitelist geprüft
  • Fix: phpcs-Annotation für die Eingabebereinigung von naws_appearance explizit gemacht (bereinigt über NAWS_Colors::sanitize())

1.6.0

  • WordPress.org-Konformität: alle Inline-<script>-Blöcke auf wp_add_inline_script() umgestellt
  • WordPress.org-Konformität: alle Inline-<style>-Blöcke in ein eingebundenes Stylesheet verschoben
  • WordPress.org-Konformität: Plugin in „XTX Integration for Netatmo“ umbenannt (Markenrecht)
  • WordPress.org-Konformität: direktes <script src> für Chart.js aus den Frontend-Templates entfernt
  • Chart.js von 4.4.0 auf 4.5.1 aktualisiert
  • REST-API-Dokumentation: Beispiel mit Google-Charts-CDN durch ein Beispiel mit dem mitgelieferten Chart.js ersetzt
  • Fix: Fehlgeschlagene Capability-Prüfungen bei AJAX geben jetzt ein sauberes JSON mit 403 zurück statt eines schlichten wp_die()
  • Fix: URL der Datenschutzerklärung in readme.txt korrigiert

1.5.7

  • GitHub-Auto-Updater entfernt (WordPress.org-Konformität – gehostete Plugins dürfen keinen eigenen Updater mitbringen)
  • Fix: move_uploaded_file() durch copy() ersetzt (WordPress Coding Standards)
  • Fix: rand() durch wp_rand() ersetzt
  • Fix: Escaping der SVG-Ausgabe mit phpcs:ignore dokumentiert
  • Fix: 361 Warnungen „NonPrefixedVariableFound“ mit begrenztem phpcs-disable behoben

1.5.6

  • Sicherheit: Client-ID und Client-Secret werden jetzt im Ruhezustand mit AES-256-GCM verschlüsselt (alle 5 Geheimnisse vollständig verschlüsselt)
  • Migration angepasst: Klartext-Zugangsdaten werden jetzt verschlüsselt, statt Klartext zu erzwingen
  • Alte Klartext-Erzwingung aus der Initialisierung entfernt

1.5.5

  • Fix: Escaping in den Backend-Ansichten korrigiert (esc_attr() in modules.php und cron-log.php)
  • Fix: Stable-Tag in readme.txt mit der Version im Plugin-Header abgeglichen
  • Fix: Uneinheitlicher Optionsname naws_token_expires zu naws_token_expiry vereinheitlicht

1.5.4

  • Fix: Die Jahresschalter im Verlaufsdiagramm brechen auf Mobilgeräten jetzt um, statt überzulaufen
  • Fix: Das Overlay des 24-Stunden-Diagramms sitzt jetzt korrekt innerhalb des .naws-wx-Wrappers

1.5.3

  • Fix: Der Schalter für automatische Updates ist jetzt in der WordPress-Pluginliste sichtbar (in $transient->no_update registriert)

1.5.2

  • Fix: Plugin-URI korrigiert auf https://www.frank-neumann.de/netatmo-wetter-plugin/

1.5.1

  • Fix: SVG-Symbole im Dashboard werden nicht mehr als roher Quelltext ausgegeben

1.5.0

  • Neu: GitHub-Auto-Updater über die Klasse NAWS_Updater (in 1.5.7 zugunsten der WordPress.org-Konformität wieder entfernt)

1.4.3

  • Plugin umbenannt: von „Netatmo Weather Station“ zu „XTX Netatmo“
  • Neu: 4 Symbolsätze im Frontend (Emoji, Outline, Filled, Minimal), wählbar unter „Darstellung“
  • Neu: Symbolfarben je Sensor mit Live-Vorschau (7 konfigurierbare Farben)
  • Neu: Dynamisches Rendern der Symbole über die Klasse NAWS_Icons

1.4.2

  • Fix: Die Auswahl des Vorhersageanbieters funktioniert jetzt korrekt (anbieterabhängige Cache-Schlüssel)
  • Fix: Das Label der Vorhersagequelle zeigt jetzt dynamisch den richtigen Anbieternamen
  • Neu: Parameter year im Verlaufs-Shortcode ([naws_history year="2025"])
  • Verbessert: Backend-Seite „Darstellung“ verschlankt, ungenutzte Abschnitte entfernt

1.4.1

  • Fix: Verlaufsfüllung im 24-Stunden-Diagramm wiederhergestellt (Hex-nach-RGBA-Umwandlung mit Canvas-Verlauf)
  • Verbessert: Seite „Darstellung“ neu gestaltet, mit Live-Vorschau für alle Farbgruppen

1.4.0

  • Neu: Seite „Darstellung“ mit über 130 konfigurierbaren Farben und dem WordPress-Farbwähler
  • Neu: Klasse NAWS_Colors mit zentraler Farbverwaltung und Caching
  • Neu: Themefarben, Akzentfarben, Verläufe der Sensorkacheln, Diagramm-Theming, Jahrespalette
  • Neu: Zurücksetzen auf die Standardwerte
  • Neu: über 60 Übersetzungsstrings für die Farbeinstellungen
  • Verbessert: Alle Frontend-Farben nutzen CSS-Custom-Properties

1.3.0

  • Neu: Export/Import mit vollständiger Sicherung und Wiederherstellung
  • Neu: Export der Wetterdaten als JSON, vollständiger Backup-Export (Daten, Module und Einstellungen)
  • Neu: Dateiimport mit stückweiser AJAX-Verarbeitung und Fortschrittsanzeige in Echtzeit
  • Sicherheit: API-Tokens sind nie Teil eines Exports
  • Neu: Klasse NAWS_Export mit Streaming-Export für große Datenmengen

1.2.1

  • Fix: Alle json_encode() durch wp_json_encode() ersetzt (Plugin-Check-Konformität)
  • Fix: SQL-Injection-Härtung mit $wpdb->prepare() für DELETE-Abfragen
  • Fix: TRUNCATE zugunsten der WordPress-Kompatibilität durch DELETE FROM ersetzt
  • Fix: Veraltetes date_i18n() durch wp_date() ersetzt
  • Fix: Debug-Endpunkt bereinigt (gekürzte Antworten, entfernte Tokens)

1.2.0

  • Neu: Mobile-First-Redesign mit einheitlichen Breakpoints (480/600/768/1024 px)
  • Neu: Touch-Ziele, die die WCAG-Mindestgröße von 44×44 px erfüllen
  • Neu: Responsive Windrose mit clamp()-Größen
  • Neu: Dynamische Schriftgröße in Diagrammen abhängig vom Viewport
  • Verbessert: rund 400 Zeilen Inline-Styles in eine zentrale frontend.css ausgelagert
  • Verbessert: ID-Selektoren durch wiederverwendbare Klassenselektoren ersetzt

1.1.0

  • Neu: Zentrale Fehlerprotokollierung (NAWS_Logger) mit Schweregraden und Schwärzung sensibler Daten
  • Neu: Transient-Caching für Datenbankabfragen (Module, Messwerte, Tageszusammenfassungen)
  • Neu: Adaptive Abfrage mit Fehler-Backoff (verdoppelt das Intervall nach drei Fehlschlägen)
  • Neu: Nachtmodus mit reduzierter Abfrage zwischen 23:00 und 06:00 Uhr
  • Neu: Statusanzeige im Backend-Dashboard (grün/gelb/rot)
  • Neu: Fehleranzeige im Frontend und AJAX-Wiederholung mit exponentiellem Backoff
  • Neu: Action-Hook naws_data_synced zur Erweiterbarkeit
  • Fix: N+1-Abfrage bei den Verlaufsdaten durch eine einzelne Abfrage ersetzt
  • Fix: Stille Datenbankfehler werden jetzt protokolliert
  • Fix: Leere Seite durch Chart.js mit try/catch verhindert

1.0.2

  • Entfernte Shortcodes: [naws_chart], [naws_gauge], [naws_dashboard], [naws_card] – nutze stattdessen [naws_live] und [naws_history]
  • Entfernt: Vendor-Bibliothek gauge.min.js und ungenutzte Templates
  • Fix: Fataler Fehler bei der Aktivierung (spawn_cron() zu früh aufgerufen)

1.0.1

  • Neu: Auswahl des Vorhersageanbieters (Open-Meteo und Yr.no / MET Norway)
  • Neu: Norwegisch (Bokmål) mit 326 übersetzten Schlüsseln
  • Neu: Dateibasiertes Sprachsystem (eine PHP-Datei pro Sprache, automatisch erkannt)
  • Neu: Konfigurierbarer Stationsname in den Einstellungen
  • Fix: OAuth-Ablauf durch die Verschlüsselung zerstört (automatische Migration)
  • Fix: OAuth-State-Prüfung mit hash_equals() und 10 Minuten Gültigkeit
  • Fix: Cron stoppt nach einem Plugin-Update (Aktivierungs-Hook und Watchdog korrigiert)
  • Fix: SVG-Wettersymbole, die von wp_kses_post() entfernt wurden
  • Verbessert: Plugin-Check-Konformität (von 126 Fehlern auf 0)
  • Verbessert: Vendor-JS-Dateien im ZIP gebündelt

1.0.0

  • Erste öffentliche Veröffentlichung
  • Vollständige Netatmo-OAuth2-Integration mit allen Modultypen
  • Live-Dashboard mit animierten Sensorkarten und 24-Stunden-Diagrammen
  • Astronomie: Sonnenauf- und -untergang, Mondphase, nächster Vollmond
  • Abgeleitete Wetterwerte: gefühlte Temperatur, Hitzeindex, Taupunkt
  • Jahresvergleichsdiagramme (Temperatur, Luftdruck, monatlicher Niederschlag)
  • 5-Tages-Wettervorhersage über Open-Meteo
  • REST-API mit API-Schlüssel-Authentifizierung und Ratenbegrenzung
  • AES-256-GCM-Verschlüsselung für alle gespeicherten Zugangsdaten
  • Vollständige deutsche und englische Lokalisierung
  • Konfigurierbare Einheiten (Temperatur, Regen, Wind, Luftdruck)
  • Cron-Watchdog mit Selbstheilung für hängengebliebene Sync-Jobs
  • Importer für historische Daten mit Stapelverarbeitung