<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://schwarzatal.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Wetter.js</id>
	<title>MediaWiki:Gadget-Wetter.js - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://schwarzatal.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Wetter.js"/>
	<link rel="alternate" type="text/html" href="https://schwarzatal.org/index.php?title=MediaWiki:Gadget-Wetter.js&amp;action=history"/>
	<updated>2026-08-17T22:14:46Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Schwarzatal.org</subtitle>
	<generator>MediaWiki 1.45.4</generator>
	<entry>
		<id>https://schwarzatal.org/index.php?title=MediaWiki:Gadget-Wetter.js&amp;diff=1062&amp;oldid=prev</id>
		<title>Admin: Die Seite wurde neu angelegt: „/**  * MediaWiki:Gadget-Wetter.js  * =====================================================================  * Wetterwidget für Gemeindeseiten: zeigt aktuelle Messwerte der  * eingetragenen GeoSphere-Wetterstation sowie eine 3-Tages-Vorhersage  * (AROME-Modell, 2,5-km-Gitter) für die Koordinaten des Ortes.  *  * Datenquelle: GeoSphere Austria Dataset-API (Open Data, CC BY 4.0),  * kein API-Schlüssel nötig. Doku: https://dataset.api.hub.geosphere.at/v1/…“</title>
		<link rel="alternate" type="text/html" href="https://schwarzatal.org/index.php?title=MediaWiki:Gadget-Wetter.js&amp;diff=1062&amp;oldid=prev"/>
		<updated>2026-07-20T12:15:08Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „/**  * MediaWiki:Gadget-Wetter.js  * =====================================================================  * Wetterwidget für Gemeindeseiten: zeigt aktuelle Messwerte der  * eingetragenen GeoSphere-Wetterstation sowie eine 3-Tages-Vorhersage  * (AROME-Modell, 2,5-km-Gitter) für die Koordinaten des Ortes.  *  * Datenquelle: GeoSphere Austria Dataset-API (Open Data, CC BY 4.0),  * kein API-Schlüssel nötig. Doku: https://dataset.api.hub.geosphere.at/v1/…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * MediaWiki:Gadget-Wetter.js&lt;br /&gt;
 * =====================================================================&lt;br /&gt;
 * Wetterwidget für Gemeindeseiten: zeigt aktuelle Messwerte der&lt;br /&gt;
 * eingetragenen GeoSphere-Wetterstation sowie eine 3-Tages-Vorhersage&lt;br /&gt;
 * (AROME-Modell, 2,5-km-Gitter) für die Koordinaten des Ortes.&lt;br /&gt;
 *&lt;br /&gt;
 * Datenquelle: GeoSphere Austria Dataset-API (Open Data, CC BY 4.0),&lt;br /&gt;
 * kein API-Schlüssel nötig. Doku: https://dataset.api.hub.geosphere.at/v1/docs/&lt;br /&gt;
 *&lt;br /&gt;
 * EINRICHTUNG (einmalig):&lt;br /&gt;
 * 1) Diesen Code nach [[MediaWiki:Gadget-Wetter.js]] kopieren.&lt;br /&gt;
 * 2) In [[MediaWiki:Gadgets-definition]] ergänzen:&lt;br /&gt;
 *      * Wetter[ResourceLoader|default|hidden]|Wetter.js&lt;br /&gt;
 * 3) [[MediaWiki:Gadget-Wetter]] anlegen, Inhalt z. B.:&lt;br /&gt;
 *      Wetterwidget mit GeoSphere-Daten.&lt;br /&gt;
 * 4) [[Vorlage:Wetterwidget]] mit dem Inhalt der mitgelieferten Datei&lt;br /&gt;
 *    Vorlage-Wetterwidget.wikitext anlegen.&lt;br /&gt;
 *&lt;br /&gt;
 * VERWENDUNG:&lt;br /&gt;
 * Auf der Gemeindeseite den {{Wetterwidget|...}}-Baustein einfügen –&lt;br /&gt;
 * am einfachsten erzeugt über die Generator-Seite (Formular). Das Gadget&lt;br /&gt;
 * findet alle Bausteine der Seite und befüllt sie beim Seitenaufruf.&lt;br /&gt;
 *&lt;br /&gt;
 * TECHNISCHE HINWEISE:&lt;br /&gt;
 * - Pro Widget und Seitenaufruf entstehen zwei API-Anfragen (Messwerte,&lt;br /&gt;
 *   Vorhersage); das GeoSphere-Limit von 240 Anfragen pro Stunde gilt je&lt;br /&gt;
 *   Besucher und wird damit bei weitem nicht erreicht.&lt;br /&gt;
 * - Die Parameternamen der Vorhersage werden mit Ausweichvarianten&lt;br /&gt;
 *   angefragt, da der Vorhersage-Endpunkt laut GeoSphere noch als&lt;br /&gt;
 *   &amp;quot;prerelease&amp;quot; gilt. Das AROME-Modell rechnet alle 3 Stunden neu und&lt;br /&gt;
 *   liefert 60 Stunden Vorhersage; laut GeoSphere wird der Datensatz&lt;br /&gt;
 *   Anfang 2027 durch einen Nachfolger (neuer Endpunkt) abgelöst.&lt;br /&gt;
 * =====================================================================&lt;br /&gt;
 */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var BASIS = &amp;#039;https://dataset.api.hub.geosphere.at/v1&amp;#039;;&lt;br /&gt;
	var ZEITZONE = &amp;#039;Europe/Vienna&amp;#039;;&lt;br /&gt;
	var MAX_TAGE = 3;&lt;br /&gt;
&lt;br /&gt;
	/* Parametersätze in absteigender Wunschreihenfolge. Antwortet der&lt;br /&gt;
	 * Server mit Status 400 (unbekannter Parameter), wird der nächste,&lt;br /&gt;
	 * kleinere Satz versucht. */&lt;br /&gt;
	var MESS_SAETZE = [&lt;br /&gt;
		[ &amp;#039;TL&amp;#039;, &amp;#039;RF&amp;#039;, &amp;#039;DD&amp;#039;, &amp;#039;FFAM&amp;#039;, &amp;#039;FFX&amp;#039;, &amp;#039;RR&amp;#039;, &amp;#039;P0&amp;#039;, &amp;#039;SH&amp;#039; ],&lt;br /&gt;
		[ &amp;#039;TL&amp;#039;, &amp;#039;RF&amp;#039;, &amp;#039;DD&amp;#039;, &amp;#039;FFAM&amp;#039;, &amp;#039;RR&amp;#039; ],&lt;br /&gt;
		[ &amp;#039;TL&amp;#039; ]&lt;br /&gt;
	];&lt;br /&gt;
	var PROGNOSE_SAETZE = [&lt;br /&gt;
		[ &amp;#039;t2m&amp;#039;, &amp;#039;rr_acc&amp;#039; ],&lt;br /&gt;
		[ &amp;#039;t2m&amp;#039;, &amp;#039;rr&amp;#039; ],&lt;br /&gt;
		[ &amp;#039;t2m&amp;#039; ]&lt;br /&gt;
	];&lt;br /&gt;
&lt;br /&gt;
	$( function () {&lt;br /&gt;
		$( &amp;#039;.wetterwidget&amp;#039; ).each( function () {&lt;br /&gt;
			starteWidget( $( this ) );&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	/* ------------------------------------------------------------------&lt;br /&gt;
	 * Ablaufsteuerung je Widget&lt;br /&gt;
	 * ------------------------------------------------------------------ */&lt;br /&gt;
	function starteWidget( $box ) {&lt;br /&gt;
		var cfg = {&lt;br /&gt;
			ort: $.trim( $box.attr( &amp;#039;data-ort&amp;#039; ) || &amp;#039;&amp;#039; ),&lt;br /&gt;
			latText: $.trim( $box.attr( &amp;#039;data-lat&amp;#039; ) || &amp;#039;&amp;#039; ),&lt;br /&gt;
			lonText: $.trim( $box.attr( &amp;#039;data-lon&amp;#039; ) || &amp;#039;&amp;#039; ),&lt;br /&gt;
			station: $.trim( $box.attr( &amp;#039;data-station&amp;#039; ) || &amp;#039;&amp;#039; ),&lt;br /&gt;
			stationsname: $.trim( $box.attr( &amp;#039;data-stationsname&amp;#039; ) || &amp;#039;&amp;#039; ),&lt;br /&gt;
			stationshoehe: $.trim( $box.attr( &amp;#039;data-stationshoehe&amp;#039; ) || &amp;#039;&amp;#039; )&lt;br /&gt;
		};&lt;br /&gt;
		var latOk = isFinite( parseFloat( cfg.latText ) );&lt;br /&gt;
		var lonOk = isFinite( parseFloat( cfg.lonText ) );&lt;br /&gt;
		cfg.mitMesswerten = cfg.station !== &amp;#039;&amp;#039;;&lt;br /&gt;
		cfg.mitVorhersage = latOk &amp;amp;&amp;amp; lonOk;&lt;br /&gt;
&lt;br /&gt;
		gestalteBox( $box );&lt;br /&gt;
		$box.empty().append(&lt;br /&gt;
			titelZeile( cfg ),&lt;br /&gt;
			$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( kleinGrau() ).text( &amp;#039;Wetterdaten werden geladen …&amp;#039; )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		if ( !cfg.mitMesswerten &amp;amp;&amp;amp; !cfg.mitVorhersage ) {&lt;br /&gt;
			zeichneWidget( $box, cfg, {&lt;br /&gt;
				messFehler: &amp;#039;Im Baustein fehlen Stations-ID und Koordinaten – &amp;#039; +&lt;br /&gt;
					&amp;#039;bitte über die Generator-Seite neu erstellen.&amp;#039;,&lt;br /&gt;
				prognoseFehler: &amp;#039;&amp;#039;&lt;br /&gt;
			} );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var stand = { mess: null, messFehler: &amp;#039;&amp;#039;, prognose: null, prognoseFehler: &amp;#039;&amp;#039; };&lt;br /&gt;
		var offen = ( cfg.mitMesswerten ? 1 : 0 ) + ( cfg.mitVorhersage ? 1 : 0 );&lt;br /&gt;
&lt;br /&gt;
		function fertigMelden() {&lt;br /&gt;
			offen -= 1;&lt;br /&gt;
			if ( offen &amp;lt;= 0 ) {&lt;br /&gt;
				zeichneWidget( $box, cfg, stand );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( cfg.mitMesswerten ) {&lt;br /&gt;
			ladeMitVarianten( MESS_SAETZE, function ( satz ) {&lt;br /&gt;
				return BASIS + &amp;#039;/station/current/tawes-v1-10min&amp;#039; +&lt;br /&gt;
					&amp;#039;?parameters=&amp;#039; + satz.join( &amp;#039;,&amp;#039; ) +&lt;br /&gt;
					&amp;#039;&amp;amp;station_ids=&amp;#039; + encodeURIComponent( cfg.station );&lt;br /&gt;
			}, function ( fehler, antwort, satz ) {&lt;br /&gt;
				if ( fehler ) {&lt;br /&gt;
					stand.messFehler = fehler;&lt;br /&gt;
				} else {&lt;br /&gt;
					stand.mess = leseMesswerte( antwort, satz );&lt;br /&gt;
					if ( !stand.mess ) {&lt;br /&gt;
						stand.messFehler = &amp;#039;Die Station liefert derzeit keine Werte.&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				fertigMelden();&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( cfg.mitVorhersage ) {&lt;br /&gt;
			ladeMitVarianten( PROGNOSE_SAETZE, function ( satz ) {&lt;br /&gt;
				return BASIS + &amp;#039;/timeseries/forecast/nwp-v1-1h-2500m&amp;#039; +&lt;br /&gt;
					&amp;#039;?parameters=&amp;#039; + satz.join( &amp;#039;,&amp;#039; ) +&lt;br /&gt;
					&amp;#039;&amp;amp;lat_lon=&amp;#039; + encodeURIComponent( cfg.latText + &amp;#039;,&amp;#039; + cfg.lonText );&lt;br /&gt;
			}, function ( fehler, antwort, satz ) {&lt;br /&gt;
				if ( fehler ) {&lt;br /&gt;
					stand.prognoseFehler = fehler;&lt;br /&gt;
				} else {&lt;br /&gt;
					stand.prognose = leseVorhersage( antwort, satz );&lt;br /&gt;
					if ( !stand.prognose ) {&lt;br /&gt;
						stand.prognoseFehler = &amp;#039;Die Vorhersagedaten waren unvollständig.&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				fertigMelden();&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Fragt der Reihe nach die Parametersätze an; bei Status 400 wird der&lt;br /&gt;
	 * nächste Satz versucht (falls sich Parameternamen der API ändern). */&lt;br /&gt;
	function ladeMitVarianten( saetze, baueUrl, fertig ) {&lt;br /&gt;
		var i = 0;&lt;br /&gt;
		function versuch() {&lt;br /&gt;
			$.getJSON( baueUrl( saetze[ i ] ) )&lt;br /&gt;
				.done( function ( antwort ) {&lt;br /&gt;
					fertig( null, antwort, saetze[ i ] );&lt;br /&gt;
				} )&lt;br /&gt;
				.fail( function ( x ) {&lt;br /&gt;
					if ( x &amp;amp;&amp;amp; x.status === 400 &amp;amp;&amp;amp; i + 1 &amp;lt; saetze.length ) {&lt;br /&gt;
						i += 1;&lt;br /&gt;
						versuch();&lt;br /&gt;
						return;&lt;br /&gt;
					}&lt;br /&gt;
					fertig( netzFehlerText( x ), null, null );&lt;br /&gt;
				} );&lt;br /&gt;
		}&lt;br /&gt;
		versuch();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function netzFehlerText( x ) {&lt;br /&gt;
		if ( !x || x.status === 0 ) {&lt;br /&gt;
			return &amp;#039;Der Browser hat die Anfrage blockiert (etwa wegen CORS) &amp;#039; +&lt;br /&gt;
				&amp;#039;oder es besteht keine Internetverbindung.&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;Der GeoSphere-Server antwortete mit Status &amp;#039; + x.status + &amp;#039;.&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* ------------------------------------------------------------------&lt;br /&gt;
	 * API-Antworten auswerten&lt;br /&gt;
	 * ------------------------------------------------------------------ */&lt;br /&gt;
&lt;br /&gt;
	/* Liefert das Parameterobjekt (mit data/unit) aus einer GeoJSON-&lt;br /&gt;
	 * Antwort, tolerant gegenüber Gross-/Kleinschreibung und Struktur. */&lt;br /&gt;
	function holeParameter( antwort, name ) {&lt;br /&gt;
		var feature = antwort &amp;amp;&amp;amp; antwort.features &amp;amp;&amp;amp; antwort.features[ 0 ];&lt;br /&gt;
		var params = feature &amp;amp;&amp;amp; feature.properties &amp;amp;&amp;amp; feature.properties.parameters;&lt;br /&gt;
		var schluessel, i;&lt;br /&gt;
		if ( !params ) {&lt;br /&gt;
			return null;&lt;br /&gt;
		}&lt;br /&gt;
		if ( $.isArray( params ) ) {&lt;br /&gt;
			for ( i = 0; i &amp;lt; params.length; i++ ) {&lt;br /&gt;
				if ( params[ i ] &amp;amp;&amp;amp; String( params[ i ].name ).toLowerCase() ===&lt;br /&gt;
						name.toLowerCase() ) {&lt;br /&gt;
					return params[ i ];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return null;&lt;br /&gt;
		}&lt;br /&gt;
		if ( params[ name ] ) {&lt;br /&gt;
			return params[ name ];&lt;br /&gt;
		}&lt;br /&gt;
		for ( schluessel in params ) {&lt;br /&gt;
			if ( schluessel.toLowerCase() === name.toLowerCase() ) {&lt;br /&gt;
				return params[ schluessel ];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function holeZeiten( antwort ) {&lt;br /&gt;
		var roh = ( antwort &amp;amp;&amp;amp; antwort.timestamps ) || [];&lt;br /&gt;
		var zeiten = [];&lt;br /&gt;
		var i, d;&lt;br /&gt;
		for ( i = 0; i &amp;lt; roh.length; i++ ) {&lt;br /&gt;
			d = new Date( roh[ i ] );&lt;br /&gt;
			zeiten.push( isFinite( d.getTime() ) ? d : null );&lt;br /&gt;
		}&lt;br /&gt;
		return zeiten;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function zahlOderNull( wert ) {&lt;br /&gt;
		var z = parseFloat( wert );&lt;br /&gt;
		return isFinite( z ) ? z : null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Aktuelle Messwerte: jeweils der letzte Eintrag der Zeitreihe. */&lt;br /&gt;
	function leseMesswerte( antwort, satz ) {&lt;br /&gt;
		var zeiten = holeZeiten( antwort );&lt;br /&gt;
		var idx = zeiten.length - 1;&lt;br /&gt;
		var werte = {};&lt;br /&gt;
		var gefunden = false;&lt;br /&gt;
		var i, p, wert;&lt;br /&gt;
		if ( idx &amp;lt; 0 ) {&lt;br /&gt;
			return null;&lt;br /&gt;
		}&lt;br /&gt;
		for ( i = 0; i &amp;lt; satz.length; i++ ) {&lt;br /&gt;
			p = holeParameter( antwort, satz[ i ] );&lt;br /&gt;
			wert = ( p &amp;amp;&amp;amp; p.data ) ? zahlOderNull( p.data[ idx ] ) : null;&lt;br /&gt;
			werte[ satz[ i ] ] = wert;&lt;br /&gt;
			if ( wert !== null ) {&lt;br /&gt;
				gefunden = true;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return gefunden ? { werte: werte, zeit: zeiten[ idx ] } : null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Vorhersage: stündliche Werte zu Tagen (Wiener Zeit) bündeln. */&lt;br /&gt;
	function leseVorhersage( antwort, satz ) {&lt;br /&gt;
		var zeiten = holeZeiten( antwort );&lt;br /&gt;
		var temperatur = holeParameter( antwort, &amp;#039;t2m&amp;#039; );&lt;br /&gt;
		var tDaten = temperatur &amp;amp;&amp;amp; temperatur.data;&lt;br /&gt;
		var regenName = $.inArray( &amp;#039;rr_acc&amp;#039;, satz ) !== -1 ? &amp;#039;rr_acc&amp;#039; :&lt;br /&gt;
			( $.inArray( &amp;#039;rr&amp;#039;, satz ) !== -1 ? &amp;#039;rr&amp;#039; : null );&lt;br /&gt;
		var kumuliert = regenName === &amp;#039;rr_acc&amp;#039;;&lt;br /&gt;
		var regen = regenName ? holeParameter( antwort, regenName ) : null;&lt;br /&gt;
		var rDaten = regen &amp;amp;&amp;amp; regen.data;&lt;br /&gt;
		var inKelvin = false;&lt;br /&gt;
		var proTag = {};&lt;br /&gt;
		var reihenfolge = [];&lt;br /&gt;
		var ab = Date.now() - 45 * 60000; /* laufende Stunde noch mitnehmen */&lt;br /&gt;
		var i, t, r, vorher, schluessel, eintrag, tage, tag;&lt;br /&gt;
&lt;br /&gt;
		if ( !tDaten || !tDaten.length || !zeiten.length ) {&lt;br /&gt;
			return null;&lt;br /&gt;
		}&lt;br /&gt;
		inKelvin = istKelvin( temperatur, tDaten );&lt;br /&gt;
&lt;br /&gt;
		for ( i = 0; i &amp;lt; zeiten.length &amp;amp;&amp;amp; i &amp;lt; tDaten.length; i++ ) {&lt;br /&gt;
			if ( !zeiten[ i ] ) {&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
			/* Niederschlag der Stunde: bei kumulierten Werten Differenz&lt;br /&gt;
			 * zum vorigen Zeitschritt, sonst der Wert selbst. */&lt;br /&gt;
			r = null;&lt;br /&gt;
			if ( rDaten ) {&lt;br /&gt;
				if ( kumuliert ) {&lt;br /&gt;
					vorher = i &amp;gt; 0 ? zahlOderNull( rDaten[ i - 1 ] ) : 0;&lt;br /&gt;
					r = zahlOderNull( rDaten[ i ] );&lt;br /&gt;
					r = ( r === null || vorher === null ) ? null :&lt;br /&gt;
						Math.max( 0, r - vorher );&lt;br /&gt;
				} else {&lt;br /&gt;
					r = zahlOderNull( rDaten[ i ] );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if ( zeiten[ i ].getTime() &amp;lt; ab ) {&lt;br /&gt;
				continue; /* Vergangenheit erst nach der Differenzbildung verwerfen */&lt;br /&gt;
			}&lt;br /&gt;
			t = zahlOderNull( tDaten[ i ] );&lt;br /&gt;
			if ( t !== null &amp;amp;&amp;amp; inKelvin ) {&lt;br /&gt;
				t -= 273.15;&lt;br /&gt;
			}&lt;br /&gt;
			schluessel = tagesSchluessel( zeiten[ i ] );&lt;br /&gt;
			if ( !proTag[ schluessel ] ) {&lt;br /&gt;
				proTag[ schluessel ] = {&lt;br /&gt;
					ersteZeit: zeiten[ i ], min: null, max: null,&lt;br /&gt;
					regen: null, stunden: 0&lt;br /&gt;
				};&lt;br /&gt;
				reihenfolge.push( schluessel );&lt;br /&gt;
			}&lt;br /&gt;
			eintrag = proTag[ schluessel ];&lt;br /&gt;
			eintrag.stunden += 1;&lt;br /&gt;
			if ( t !== null ) {&lt;br /&gt;
				eintrag.min = ( eintrag.min === null ) ? t : Math.min( eintrag.min, t );&lt;br /&gt;
				eintrag.max = ( eintrag.max === null ) ? t : Math.max( eintrag.max, t );&lt;br /&gt;
			}&lt;br /&gt;
			if ( r !== null ) {&lt;br /&gt;
				eintrag.regen = ( eintrag.regen === null ) ? r : eintrag.regen + r;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		tage = [];&lt;br /&gt;
		for ( i = 0; i &amp;lt; reihenfolge.length &amp;amp;&amp;amp; tage.length &amp;lt; MAX_TAGE; i++ ) {&lt;br /&gt;
			tag = proTag[ reihenfolge[ i ] ];&lt;br /&gt;
			if ( tag.stunden &amp;gt;= 3 &amp;amp;&amp;amp; tag.min !== null ) {&lt;br /&gt;
				tage.push( {&lt;br /&gt;
					name: tagesName( tag.ersteZeit, reihenfolge[ i ] ),&lt;br /&gt;
					min: tag.min,&lt;br /&gt;
					max: tag.max,&lt;br /&gt;
					regen: tag.regen&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return tage.length ? { tage: tage } : null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function istKelvin( parameter, daten ) {&lt;br /&gt;
		var einheit = parameter &amp;amp;&amp;amp; parameter.unit ? String( parameter.unit ) : &amp;#039;&amp;#039;;&lt;br /&gt;
		var i, w;&lt;br /&gt;
		if ( /^k(elvin)?$/i.test( $.trim( einheit ) ) ) {&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		if ( /c/i.test( einheit ) ) {&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		for ( i = 0; i &amp;lt; daten.length; i++ ) {&lt;br /&gt;
			w = zahlOderNull( daten[ i ] );&lt;br /&gt;
			if ( w !== null ) {&lt;br /&gt;
				return w &amp;gt; 150; /* plausible Celsiuswerte liegen weit darunter */&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function tagesSchluessel( datum ) {&lt;br /&gt;
		try {&lt;br /&gt;
			return datum.toLocaleDateString( &amp;#039;de-AT&amp;#039;, { timeZone: ZEITZONE } );&lt;br /&gt;
		} catch ( e ) {&lt;br /&gt;
			return datum.toDateString();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function tagesName( datum, schluessel ) {&lt;br /&gt;
		var heute = tagesSchluessel( new Date() );&lt;br /&gt;
		var morgen = tagesSchluessel( new Date( Date.now() + 86400000 ) );&lt;br /&gt;
		if ( schluessel === heute ) {&lt;br /&gt;
			return &amp;#039;Heute&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if ( schluessel === morgen ) {&lt;br /&gt;
			return &amp;#039;Morgen&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			return datum.toLocaleDateString( &amp;#039;de-AT&amp;#039;,&lt;br /&gt;
				{ weekday: &amp;#039;long&amp;#039;, timeZone: ZEITZONE } );&lt;br /&gt;
		} catch ( e ) {&lt;br /&gt;
			return schluessel;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function uhrzeit( datum ) {&lt;br /&gt;
		try {&lt;br /&gt;
			return datum.toLocaleTimeString( &amp;#039;de-AT&amp;#039;,&lt;br /&gt;
				{ hour: &amp;#039;2-digit&amp;#039;, minute: &amp;#039;2-digit&amp;#039;, timeZone: ZEITZONE } );&lt;br /&gt;
		} catch ( e ) {&lt;br /&gt;
			return &amp;#039;&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* ------------------------------------------------------------------&lt;br /&gt;
	 * Darstellung&lt;br /&gt;
	 * ------------------------------------------------------------------ */&lt;br /&gt;
	function zeichneWidget( $box, cfg, stand ) {&lt;br /&gt;
		$box.empty().append( titelZeile( cfg ) );&lt;br /&gt;
&lt;br /&gt;
		/* --- Abschnitt: aktuelle Messwerte --- */&lt;br /&gt;
		if ( stand.mess ) {&lt;br /&gt;
			$box.append( messwerteBlock( cfg, stand.mess ) );&lt;br /&gt;
		} else if ( cfg.mitMesswerten || stand.messFehler ) {&lt;br /&gt;
			$box.append( fehlerZeile( &amp;#039;Aktuelle Messwerte nicht verfügbar: &amp;#039; +&lt;br /&gt;
				stand.messFehler ) );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* --- Abschnitt: Vorhersage --- */&lt;br /&gt;
		if ( stand.prognose ) {&lt;br /&gt;
			$box.append( trennlinie(), vorhersageBlock( stand.prognose ) );&lt;br /&gt;
		} else if ( cfg.mitVorhersage ) {&lt;br /&gt;
			$box.append( trennlinie(), fehlerZeile( &amp;#039;Vorhersage nicht verfügbar: &amp;#039; +&lt;br /&gt;
				stand.prognoseFehler ) );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		$box.append(&lt;br /&gt;
			$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
				.css( { &amp;#039;margin-top&amp;#039;: &amp;#039;0.6em&amp;#039;, &amp;#039;font-size&amp;#039;: &amp;#039;80%&amp;#039;, color: &amp;#039;#54595d&amp;#039; } )&lt;br /&gt;
				.text( &amp;#039;Datenquelle: GeoSphere Austria (CC BY 4.0)&amp;#039; +&lt;br /&gt;
					( stand.prognose ? &amp;#039; · Vorhersage: AROME-Modell&amp;#039; : &amp;#039;&amp;#039; ) )&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function messwerteBlock( cfg, mess ) {&lt;br /&gt;
		var w = mess.werte;&lt;br /&gt;
		var $block = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; );&lt;br /&gt;
		var zeilen = [];&lt;br /&gt;
		var windKmh, boeenKmh, stationsZeile;&lt;br /&gt;
&lt;br /&gt;
		if ( w.TL !== null &amp;amp;&amp;amp; w.TL !== undefined ) {&lt;br /&gt;
			$block.append(&lt;br /&gt;
				$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
					.css( { &amp;#039;font-size&amp;#039;: &amp;#039;2.1em&amp;#039;, &amp;#039;font-weight&amp;#039;: &amp;#039;bold&amp;#039;,&lt;br /&gt;
						&amp;#039;line-height&amp;#039;: &amp;#039;1.15&amp;#039; } )&lt;br /&gt;
					.text( formatZahl( w.TL, 1 ) + &amp;#039; °C&amp;#039; )&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if ( istZahl( w.FFAM ) ) {&lt;br /&gt;
			windKmh = Math.round( w.FFAM * 3.6 );&lt;br /&gt;
			boeenKmh = istZahl( w.FFX ) ? Math.round( w.FFX * 3.6 ) : null;&lt;br /&gt;
			zeilen.push( &amp;#039;Wind: &amp;#039; + windKmh + &amp;#039; km/h&amp;#039; +&lt;br /&gt;
				( istZahl( w.DD ) ? &amp;#039; aus &amp;#039; + windrichtung( w.DD ) : &amp;#039;&amp;#039; ) +&lt;br /&gt;
				( boeenKmh !== null &amp;amp;&amp;amp; boeenKmh &amp;gt; windKmh + 5 ?&lt;br /&gt;
					&amp;#039;, Böen &amp;#039; + boeenKmh + &amp;#039; km/h&amp;#039; : &amp;#039;&amp;#039; ) );&lt;br /&gt;
		}&lt;br /&gt;
		if ( istZahl( w.RF ) ) {&lt;br /&gt;
			zeilen.push( &amp;#039;Luftfeuchtigkeit: &amp;#039; + Math.round( w.RF ) + &amp;#039; %&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if ( istZahl( w.RR ) &amp;amp;&amp;amp; w.RR &amp;gt;= 0.05 ) {&lt;br /&gt;
			zeilen.push( &amp;#039;Niederschlag: &amp;#039; + formatZahl( w.RR, 1 ) +&lt;br /&gt;
				&amp;#039; mm in 10 Minuten&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if ( istZahl( w.P0 ) ) {&lt;br /&gt;
			zeilen.push( &amp;#039;Luftdruck: &amp;#039; + Math.round( w.P0 ) + &amp;#039; hPa&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
		if ( istZahl( w.SH ) &amp;amp;&amp;amp; w.SH &amp;gt;= 1 ) {&lt;br /&gt;
			zeilen.push( &amp;#039;Schneehöhe: &amp;#039; + Math.round( w.SH ) + &amp;#039; cm&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
		$.each( zeilen, function ( i, text ) {&lt;br /&gt;
			$block.append( $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( { &amp;#039;font-size&amp;#039;: &amp;#039;92%&amp;#039;,&lt;br /&gt;
				margin: &amp;#039;0.15em 0&amp;#039; } ).text( text ) );&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		stationsZeile = &amp;#039;Station &amp;#039; + ( cfg.stationsname || &amp;#039;Nr. &amp;#039; + cfg.station );&lt;br /&gt;
		if ( cfg.stationshoehe ) {&lt;br /&gt;
			stationsZeile += &amp;#039;, &amp;#039; + cfg.stationshoehe + &amp;#039; m&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if ( mess.zeit ) {&lt;br /&gt;
			stationsZeile = &amp;#039;Gemessen um &amp;#039; + uhrzeit( mess.zeit ) + &amp;#039; Uhr · &amp;#039; +&lt;br /&gt;
				stationsZeile;&lt;br /&gt;
		}&lt;br /&gt;
		$block.append( $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( kleinGrau() ).text( stationsZeile ) );&lt;br /&gt;
		return $block;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function vorhersageBlock( prognose ) {&lt;br /&gt;
		var $block = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; );&lt;br /&gt;
		var $reihe = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( { display: &amp;#039;flex&amp;#039;, &amp;#039;flex-wrap&amp;#039;: &amp;#039;wrap&amp;#039; } );&lt;br /&gt;
		$block.append(&lt;br /&gt;
			$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
				.css( { &amp;#039;font-weight&amp;#039;: &amp;#039;bold&amp;#039;, &amp;#039;font-size&amp;#039;: &amp;#039;92%&amp;#039;,&lt;br /&gt;
					&amp;#039;margin-bottom&amp;#039;: &amp;#039;0.3em&amp;#039; } )&lt;br /&gt;
				.text( &amp;#039;Vorhersage (Höchst- / Tiefstwert)&amp;#039; )&lt;br /&gt;
		);&lt;br /&gt;
		$.each( prognose.tage, function ( i, tag ) {&lt;br /&gt;
			var regenText = ( tag.regen === null ) ? &amp;#039;&amp;#039; :&lt;br /&gt;
				( tag.regen &amp;lt; 0.05 ? &amp;#039;trocken&amp;#039; :&lt;br /&gt;
					formatZahl( tag.regen, 1 ) + &amp;#039; mm&amp;#039; );&lt;br /&gt;
			var $zelle = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( { flex: &amp;#039;1 1 6em&amp;#039;,&lt;br /&gt;
				&amp;#039;min-width&amp;#039;: &amp;#039;6em&amp;#039;, margin: &amp;#039;0.15em 0&amp;#039; } );&lt;br /&gt;
			$zelle.append(&lt;br /&gt;
				$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( { &amp;#039;font-size&amp;#039;: &amp;#039;88%&amp;#039;, &amp;#039;font-weight&amp;#039;: &amp;#039;bold&amp;#039; } )&lt;br /&gt;
					.text( tag.name ),&lt;br /&gt;
				$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).text( Math.round( tag.max ) + &amp;#039;° / &amp;#039; +&lt;br /&gt;
					Math.round( tag.min ) + &amp;#039;°&amp;#039; )&lt;br /&gt;
			);&lt;br /&gt;
			if ( regenText ) {&lt;br /&gt;
				$zelle.append( $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( { &amp;#039;font-size&amp;#039;: &amp;#039;85%&amp;#039;,&lt;br /&gt;
					color: &amp;#039;#54595d&amp;#039; } ).text( regenText ) );&lt;br /&gt;
			}&lt;br /&gt;
			$reihe.append( $zelle );&lt;br /&gt;
		} );&lt;br /&gt;
		$block.append( $reihe );&lt;br /&gt;
		return $block;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function titelZeile( cfg ) {&lt;br /&gt;
		return $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
			.css( { &amp;#039;font-weight&amp;#039;: &amp;#039;bold&amp;#039;, &amp;#039;font-size&amp;#039;: &amp;#039;108%&amp;#039;,&lt;br /&gt;
				&amp;#039;margin-bottom&amp;#039;: &amp;#039;0.35em&amp;#039; } )&lt;br /&gt;
			.text( &amp;#039;Wetter in &amp;#039; + ( cfg.ort || &amp;#039;der Region&amp;#039; ) );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function trennlinie() {&lt;br /&gt;
		return $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( { &amp;#039;border-top&amp;#039;: &amp;#039;1px solid #c8ccd1&amp;#039;,&lt;br /&gt;
			margin: &amp;#039;0.6em 0&amp;#039; } );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function fehlerZeile( text ) {&lt;br /&gt;
		return $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).css( { &amp;#039;font-size&amp;#039;: &amp;#039;88%&amp;#039;, color: &amp;#039;#b32424&amp;#039;,&lt;br /&gt;
			margin: &amp;#039;0.3em 0&amp;#039; } ).text( text );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function gestalteBox( $box ) {&lt;br /&gt;
		$box.css( {&lt;br /&gt;
			border: &amp;#039;1px solid #a2a9b1&amp;#039;,&lt;br /&gt;
			&amp;#039;border-radius&amp;#039;: &amp;#039;2px&amp;#039;,&lt;br /&gt;
			background: &amp;#039;#f8f9fa&amp;#039;,&lt;br /&gt;
			padding: &amp;#039;0.8em 1em&amp;#039;,&lt;br /&gt;
			&amp;#039;max-width&amp;#039;: &amp;#039;26em&amp;#039;,&lt;br /&gt;
			&amp;#039;box-sizing&amp;#039;: &amp;#039;border-box&amp;#039;&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function kleinGrau() {&lt;br /&gt;
		return { &amp;#039;font-size&amp;#039;: &amp;#039;85%&amp;#039;, color: &amp;#039;#54595d&amp;#039;, &amp;#039;margin-top&amp;#039;: &amp;#039;0.35em&amp;#039; };&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* ------------------------------------------------------------------&lt;br /&gt;
	 * Kleine Helfer&lt;br /&gt;
	 * ------------------------------------------------------------------ */&lt;br /&gt;
	function istZahl( wert ) {&lt;br /&gt;
		return typeof wert === &amp;#039;number&amp;#039; &amp;amp;&amp;amp; isFinite( wert );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function formatZahl( wert, nachkomma ) {&lt;br /&gt;
		return wert.toFixed( nachkomma ).replace( &amp;#039;.&amp;#039;, &amp;#039;,&amp;#039; ).replace( &amp;#039;-0,0&amp;#039;, &amp;#039;0,0&amp;#039; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function windrichtung( grad ) {&lt;br /&gt;
		var richtungen = [ &amp;#039;Nord&amp;#039;, &amp;#039;Nordost&amp;#039;, &amp;#039;Ost&amp;#039;, &amp;#039;Südost&amp;#039;,&lt;br /&gt;
			&amp;#039;Süd&amp;#039;, &amp;#039;Südwest&amp;#039;, &amp;#039;West&amp;#039;, &amp;#039;Nordwest&amp;#039; ];&lt;br /&gt;
		return richtungen[ Math.round( grad / 45 ) % 8 ];&lt;br /&gt;
	}&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>