Wetterdaten die x. - hier: brightsky.dev/DWD

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
mademyday
Beiträge: 281
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 44 Mal

Wetterdaten die x. - hier: brightsky.dev/DWD

Beitrag von mademyday » 28.09.2023, 19:58

Daten (JSON-Format) werden online stündlich aktualisiert angeboten, häufiger abrufen macht also keinen Sinn
Quelle: https://brightsky.dev/docs/#/operations/getWeather

Code: Alles auswählen

! --- Aussentemp (brightsky.dev/DWD) ---
string stdout;
string stderr;
string CARET = "%5E".UriDecode();

string URL = 'https://api.brightsky.dev/weather?lat=' # system.Latitude().ToString(3) # '&lon=' # system.Longitude().ToString(3)
           # '&date=' # system.Date( "%Y-%m-%dT%H:00" ) # '&last_date=' # system.Date( "%Y-%m-%dT%H:00" ) # '&tz=Europe%2FBerlin';

WriteLine( '# URL: "' # URL # '"' );

system.Exec( 'curl -s --max-time 10 "' # URL # '" | grep -o "\\"temperature\\":['#CARET#',}]*" | cut -d: -f2;', &stdout, &stderr );

if( stdout != "" ) {
  dom.GetObject(ID_SYSTEM_VARIABLES).Get( "log" ).State( "Aussentemp (brightsky.dev): " # stdout.Trim( ).ToString(0) # " C" );
  WriteLine( dom.GetObject(ID_SYSTEM_VARIABLES).Get( "log" ).Value() );
} else {
  WriteLine( "failed!" );
}

WriteLine( "--- Ende ---" ); 
<--->
# URL: "https://api.brightsky.dev/weather?lat=4 ... e%2FBerlin"
Aussentemp (brightsky.dev): 16 C
--- Ende ---

weitere Werte die abrufbar sind - außer der Temperatur - sind zB Niederschlagsmenge und -Wahrscheinlichkeit, Windgeschwindigkeit usw:

Code: Alles auswählen

  "weather": [
    {
      "timestamp": "2023-09-29T09:00:00+02:00",
      "source_id": 1625,
      "precipitation": 0.0,
      "pressure_msl": 1019.5,
      "sunshine": 28.0,
      "temperature": 15.9,
      "wind_direction": 183,
      "wind_speed": 3.7,
      "cloud_cover": 57,
      "dew_point": 12.4,
      "relative_humidity": null,
      "visibility": 32300,
      "wind_gust_direction": null,
      "wind_gust_speed": 7.4,
      "condition": "dry",
      "precipitation_probability": 1,
      "precipitation_probability_6h": null,
      "solar": 0.081,
      "icon": "partly-cloudy-day"
    }
  ],
  "sources": [
    {
...
      "first_record": "2023-09-29T05:00:00+00:00",
      "last_record": "2023-10-09T10:00:00+00:00",
...
    }
  ]
Auch Vorhersagedaten gibts da (im Bsp oben: bis "last_record": "2023-10-09T10:00:00+00:00"), so könnte zb die wahrscheinliche Tageshöchst- und -minimaltemperatur von "morgen" bestimmt werden um ggf Heizungs-/Lüftungsempfehlungen zu geben...


Mehrere Werte aus einem curl-Result ginge zB so:

Code: Alles auswählen

! --- Aussentemp (brightsky.dev/DWD) ---
string stdout;
string stderr;
string CARET = "%5E".UriDecode();

string URL = 'https://api.brightsky.dev/weather?lat=' # system.Latitude().ToString(3) # '&lon=' # system.Longitude().ToString(3)
           # '&date=' # system.Date( "%Y-%m-%dT%H:00" ) # '&last_date=' # system.Date( "%Y-%m-%dT%H:00" ) # '&tz=Europe%2FBerlin';

WriteLine( '# URL: "' # URL # '"' );

system.Exec( '
  JSON=$( curl -s --max-time 10 "' # URL # '" );
  echo "$JSON" | grep -o "\\"timestamp\\":\\"['#CARET#'\\"]*\\"";
  echo "$JSON" | grep -o "\\"temperature\\":['#CARET#',}]*";
  echo "$JSON" | grep -o "\\"precipitation\\":['#CARET#',}]*";
  echo "$JSON" | grep -o "\\"wind_speed\\":['#CARET#',}]*";
', &stdout, &stderr );

if( stdout != "" ) {
  WriteLine( stdout.Trim() );
} else {
  WriteLine( "failed!" );
}

WriteLine( "--- Ende ---" ); 
<--->
# URL: "https://api.brightsky.dev/weather?lat=4 ... e%2FBerlin"
"timestamp":"2023-09-29T13:00:00+02:00"
"temperature":25.7
"precipitation":0.0
"wind_speed":20.4
--- Ende ---

mademyday
Beiträge: 281
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 44 Mal

Re: Wetterdaten die x. - hier: brightsky.dev/DWD

Beitrag von mademyday » 30.09.2023, 17:24

als "Fingerübung", hier ein Skript mit 2 Beispielen:
zum einen die "aktuellen" Wetterdaten und zum anderen die min/max-Temperatur-Vorhersage für den nächsten Tag

Code: Alles auswählen

! --- Aussentemp (brightsky.dev/DWD) ---
string stdout;
string stderr;
string CARET = "%5E".UriDecode();


! --- aktuelle Werte: ---
string URL = 'https://api.brightsky.dev/weather?lat=' # system.Latitude().ToString(3) # '&lon=' # system.Longitude().ToString(3)
           # '&date=' # system.Date( "%Y-%m-%dT%H:00" ) # '&last_date=' # system.Date( "%Y-%m-%dT%H:00" ) # '&tz=Europe%2FBerlin';

WriteLine( '\n# URL: "' # URL # '"' );

system.Exec( 'curl -s --max-time 3 "'#URL#'" | \
  grep -Eo "\\"temperature\\":['#CARET#',}]*|\\"precipitation\\":['#CARET#',}]*|\\"wind_speed\\":['#CARET#',}]*"
', &stdout, &stderr );

if( stdout != "" ) {
  WriteLine( "Wetterdaten (" # system.Date( "%d.%m., %H:00" ) # " Uhr):\n" # stdout.Trim() );
} else { WriteLine( stderr ); }


! --- Vorhersage fuer morgen: ---
string URL = 'https://api.brightsky.dev/weather?lat=' # system.Latitude().ToString(3) # '&lon=' # system.Longitude().ToString(3)
           # '&date=' # ( system.Date("%F %X").ToTime().ToInteger() + 86400 ).ToTime().Format("%Y%m%d") # '&tz=Europe%2FBerlin';

WriteLine( '\n# URL: "' # URL # '"' );

system.Exec( 'curl -s --max-time 3 "'#URL#'" | \
  grep -o "\\"temperature\\":['#CARET#',}]*" | \
  awk -F\':\' \'(!init && NF>0){init=1;min=max=$2} (init==1 && NF>0){if($2<min){min=$2} else if($2>max){max=$2}} END {printf("%.0f / %.0f",min,max)}\'
', &stdout, &stderr );

if( stdout != "" ) {
  WriteLine( "morgen (" # ( system.Date("%F %X").ToTime().ToInteger() + 86400 ).ToTime().Format("%d.%m.") # "): " # stdout.Trim() # " C" );
} else { WriteLine( stderr ); }


WriteLine( "--- Ende ---" ); 
<--->
# URL: "https://api.brightsky.dev/weather?lat=4 ... e%2FBerlin"
Wetterdaten (30.09., 17:00 Uhr):
"precipitation":0.0
"temperature":21.6
"wind_speed":7.4

# URL: "https://api.brightsky.dev/weather?lat=4 ... e%2FBerlin"
morgen (01.10.): 8 / 23 C
--- Ende ---

MichaelN
Beiträge: 9807
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 711 Mal
Danksagung erhalten: 1656 Mal

Re: Wetterdaten die x. - hier: brightsky.dev/DWD

Beitrag von MichaelN » 30.09.2023, 17:56

Wenn es JSON ist, dann brauchst Du keine Fingerübungen, nur mein Skript aus der Signatur :wink:
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Fonzo
Beiträge: 6848
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 499 Mal

Re: Wetterdaten die x. - hier: brightsky.dev/DWD

Beitrag von Fonzo » 30.09.2023, 18:48

mademyday hat geschrieben:
30.09.2023, 17:24
als "Fingerübung", hier ein Skript mit 2 Beispielen:
zum einen die "aktuellen" Wetterdaten und zum anderen die min/max-Temperatur-Vorhersage für den nächsten Tag
Wenn man auf irgendwelche Übungen verzichten will oder sich nicht mit den Tiefen einer eher schlecht dokumentierten Skript Sprache von eQ-3 beschäftigen will, kann man auch alternativ einfach auf der Bright Sky API Documentation Seite als Request Sample: Node /Native auswählen, dann bekommt man einen funktionsfähigen Javascript Code.

Diesen kann man dann z.B. im NEO Server der CCU3 ausführen, wenn man lieber Javascript benutzen will, bzw. sich den Code schon von der Bright Sky API Documentation Seite bereits passend generieren lassen will.

Sieht dann z.B. so aus:

Code: Alles auswählen

const http = require('https');

const options = {
  method: 'GET',
  hostname: 'api.brightsky.dev',
  port: null,
  path: '/weather?date=2023-09-30&last_date=2023-09-30&lat=52.52&lon=13.4',
  headers: {
    Accept: 'application/json'
  }
};

const req = http.request(options, function (res) {
  const chunks = [];

  res.on('data', function (chunk) {
    chunks.push(chunk);
  });

  res.on('end', function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
    try {
          const responseData = JSON.parse(body);
          const weatherData = responseData.weather;
        
          // Find the newest data based on the timestamp
          const newestData = weatherData.reduce((latest, current) => {
            const currentTimestamp = new Date(current.timestamp);
            const latestTimestamp = new Date(latest.timestamp);
        
            return currentTimestamp > latestTimestamp ? current : latest;
          });
        
          // Access values from the newest data and save them to variables
          const newestTimestamp = newestData.timestamp;
          const newestTemperature = newestData.temperature;
          const newestHumidity = newestData.relative_humidity;
          const newestCondition = newestData.condition;
        
          // Now you can use these variables as needed
          console.log('Newest Timestamp:', newestTimestamp);
          console.log('Newest Temperature:', newestTemperature);
          console.log('Newest Humidity:', newestHumidity);
          console.log('Newest Condition:', newestCondition);
        } catch (error) {
          console.error('Error parsing JSON:', error);
        }
  });
});

req.end();

Benutzeravatar
Black
Beiträge: 5548
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 434 Mal
Danksagung erhalten: 1096 Mal
Kontaktdaten:

Re: Wetterdaten die x. - hier: brightsky.dev/DWD

Beitrag von Black » 30.09.2023, 19:21

Es gibt allerdings auch Leute, die die Homematik Skriptsprache beherrschen und so deine unnötige und je nach Einsatzzweck auch noch kostenintensive Werbelösung nicht brauchen.

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“