Baue Deinen eigenen Wetterdienst - Dark Sky API

@Fonzo

Bei mir wird in den Meldungen das Skript bei jeder Ausführung aufgelistet.
Fehlt evtl. ein Steuerzeichen das das nicht mehr gemeldet wird?


26.03.2019, 12:12:10 | VariableManager | [Wetter2\Wetterbericht] = <head>
<meta charset="utf-8">
<title>Wetter</title>
<!--The following script tag downloads a font from the Adobe Edge Web Fonts server for use within the web page. We recommend that you do not modify it.-->
<script>var __adobewebfontsappname__="dreamweaver"</script>
<script src="http://use.edgefonts.net/source-sans-pro:n6:default;acme:n4:default;bilbo:n4:default.js" type="text/javascript"></script><style>
body { background-color:transparent; }
.weathertablecell {
    width: 170px;
    text-shadow: 1px 1px 0px rgba(66,66,66,1.00);
    vertical-align: top;
    padding-bottom: 0px;
    padding-top: 0px;
    margin-top: 0px;
    margin-right: 0px;
    margin-bottom: 0px;
    margin-left: 0px;
}
........  es geht noch weiter

Das ist Standard bei IP-Symcon, dass das in das Meldungsfenster geschrieben wird, da der Inhalt der Variable halt mehr als nur ein Wort oder eine Zahl ist, steht da dann auch ziemlich viel.
Ob es eine Möglichkeit gibt das selektiv zu unterdrücken weis ich nicht, das muss jemand von IP-Symcon beantworten.
Wenn Dich das generell stört kannst Du das bei Spezialschalter anzeigen hinter Variable Watch den Haken entfernen, dann sollte da aber grundsätzlich nichts mehr angezeigt werden bei einer Variablenänderung.

:banghead:
Manchmal ist man wirklich blind, danke. Jetzt werden auch die deutschen Texte geladen.

Hallo Matthias, daß ist bei mir auch schon passiert und wenn ich dann beim Browser auf aktualisieren klicke ist es wieder da.

Gruß
Thomas

Danke für die Bereitstellung und den Hinweis auf die Dark Sky API.

Orientiert am ursprünglichen Skript habe ich es etwas überarbeitet und umprogrammiert.

Vielleicht nütz es ja jemanden, - deshalb hier auch meine angepasste Version (siehe Screenshot).

Falls weitere Tage in der Vorausschau gewünscht sind, einfach das array erweitern („Tag 4“). Analoges gilt für weitere Stunden.

<?

$api = "x";
$latitude = "45.00";
$longitude = "10.00";

$Tagesvorraussage = array("Tag 0 - Heute","Tag 1 - Morgen","Tag 2 - Übermorgen","Tag 3");
$Stundenvorraussage = array("Stunde 1","Stunde 2","Stunde 3");


$Wochentage = Array('Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'); 
$Niederschlag = array(  'rain'=>'Regen',
                        'snow'=>'Schnee',
                        'sleet'=>'Schneeregen');


$json_string = file_get_contents("https://api.darksky.net/forecast/$api/$latitude,$longitude?exclude=minutely&lang=de&units=si"); 
$json = json_decode($json_string);



$pid = InstanceId( $_IPS['SELF'], "Aktuell");

SetValue(VariableId($pid, "Zusammenfassung", 3, "~String"),$json->currently->summary); 
SetValue(VariableId($pid, "Temperatur", 2, "~Temperature"), $json->currently->temperature);
SetValue(VariableId($pid, "Temperatur gefühlt", 2, "~Temperature"),$json->currently->apparentTemperature);
SetValue(VariableId($pid, "Windgeschwindigkeit", 2, "~WindSpeed.ms"),$json->currently->windSpeed);
SetValue(VariableId($pid, "Windgeschwindigkeit (Böen)", 2, "~WindSpeed.ms"),$json->currently->windGust);
SetValue(VariableId($pid, "Wolkig", 2, "~Intensity.1"),$json->currently->cloudCover);
SetValue(VariableId($pid, "Luftfeuchtigkeit", 2, "~Intensity.1"),$json->currently->humidity);
SetValue(VariableId($pid, "Niederschlag", 2, "~Rainfall"),$json->currently->precipIntensity);
SetValue(VariableId($pid, "Niederschlag (Wahrsch.)", 2, "~Intensity.1"),$json->currently->precipProbability);

if( isset($json->currently->precipType) )
    $precisType = $Niederschlag[$json->currently->precipType];
else
    $precisType = "-";
SetValue(VariableId($pid, "Niederschlag (Art)", 3, "~String"),$precisType);


$x=0;
foreach( $Tagesvorraussage as $Tag )
{
    if( !isset($json->daily->data[$x]) )
        break;

    $pid = InstanceId( $_IPS['SELF'], $Tag);

    SetValue(VariableId($pid, "Zusammenfassung", 3, "~String"),$Wochentage[date('w',$json->daily->data[$x]->time)].": ".$json->daily->data[$x]->summary); 
    SetValue(VariableId($pid, "Temperatur Max", 2, "~Temperature"),$json->daily->data[$x]->temperatureHigh);
    SetValue(VariableId($pid, "Temperatur Min", 2, "~Temperature"),$json->daily->data[$x]->temperatureLow);
    SetValue(VariableId($pid, "Windgeschwidigkeit", 2, "~WindSpeed.ms"),$json->daily->data[$x]->windSpeed);
    SetValue(VariableId($pid, "Windgeschwidigkeit (Böen)", 2, "~WindSpeed.ms"),$json->daily->data[$x]->windGust);
    SetValue(VariableId($pid, "Wolkig", 2, "~Intensity.1"),$json->daily->data[$x]->cloudCover);
    SetValue(VariableId($pid, "Luftfeuchtigkeit", 2, "~Intensity.1"),$json->daily->data[$x]->humidity);
    SetValue(VariableId($pid, "Niederschlag", 2, "~Rainfall"),$json->daily->data[$x]->precipIntensity);
    SetValue(VariableId($pid, "Niederschlag (Wahrsch.)", 2, "~Intensity.1"),$json->daily->data[$x]->precipIntensity);
    
    if( isset($json->daily->data[$x]->precipType) )
        $precisType = $Niederschlag[$json->daily->data[$x]->precipType];
    else
        $precisType = "-";

    SetValue(VariableId($pid, "Niederschlag (Art)", 3, "~String"),$precisType);

    $x++;
}

$x=1; 
foreach( $Stundenvorraussage as $Stunde )
{
    if( !isset($json->hourly->data[$x]) )
        break;

    $pid = InstanceId( $_IPS['SELF'], $Stunde);

    SetValue(VariableId($pid, "Zusammenfassung", 3, "~String"),date("H:i",$json->hourly->data[$x]->time).": ".$json->hourly->data[$x]->summary); 
    SetValue(VariableId($pid, "Temperatur", 2, "~Temperature"), $json->hourly->data[$x]->temperature);
    SetValue(VariableId($pid, "Temperatur gefühlt", 2, "~Temperature"),$json->hourly->data[$x]->apparentTemperature);
    SetValue(VariableId($pid, "Windgeschwindigkeit", 2, "~WindSpeed.ms"),$json->hourly->data[$x]->windSpeed);
    SetValue(VariableId($pid, "Windgeschwindigkeit (Böen)", 2, "~WindSpeed.ms"),$json->hourly->data[$x]->windGust);
    SetValue(VariableId($pid, "Wolkig", 2, "~Intensity.1"),$json->hourly->data[$x]->cloudCover);
    SetValue(VariableId($pid, "Luftfeuchtigkeit", 2, "~Intensity.1"),$json->hourly->data[$x]->humidity);
    SetValue(VariableId($pid, "Niederschlag", 2, "~Rainfall"),$json->hourly->data[$x]->precipIntensity);
    SetValue(VariableId($pid, "Niederschlag (Wahrsch.)", 2, "~Intensity.1"),$json->hourly->data[$x]->precipProbability);

    if( isset($json->hourly->data[$x]->precipType) )
        $precisType = $Niederschlag[$json->hourly->data[$x]->precipType];
    else
        $precisType = "-";

    SetValue(VariableId($pid, "Niederschlag (Art)", 3, "~String"),$precisType);

    $x++;
}

function InstanceId($id, $name)
{
    $iid = @IPS_GetInstanceIDByName($name, $id);

    if ($iid === false)
    {
        $iid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");    
        IPS_SetName($iid, $name);
        IPS_SetParent($iid, $id); 
        IPS_ApplyChanges($iid);
    }
    
    return $iid;
}
       
function VariableId($id, $name, $type, $profile = "")
{
    $vid = @IPS_GetVariableIDByName($name, $id);

    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "created by script #".$_IPS['SELF']);
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }

    return $vid;
}

?>

Bildschirmfoto 2019-04-14 um 17.26.46.jpg

Schön dass sich jemand mit der Wetterseite beschäftigt. Leider habe ich im Moment keine Zeit meine nicht funktionierende Wunderground Seite zu erneuern.
Mir fällt aber auf das hier bei allen Dark Sky Scripten kein aktueller Luftdruck zu finden ist. Nutzt das niemand?

Hallo zusammen,

ich wollte gerade das Skript etwas modifizieren um die Durchschnittstemperatur der nächsten 24h auszurechnen.

Ich hab mir also mal den Teil des Skripts angesehen wo die Vorhersage gemacht wird. Dort wollte ich mir den Temperaturwert, der ja als String vorliegen sollte soweit ich das verstanden habe, als Float wegspeichern.

Ich habe also folgende Zeilen eingefügt:

             echo $temp. "
";
             $float  = floatval($temp);
             echo $float. "
";

Mir wird aber nun der Wert ohne Nachkommastelle angezeigt. An was könnte das noch liegen? Hier die Ausgabe:
9,92
9
8,92
8
7,47
7
6,38
6
5,86
5
5,72
5

Hier der Ausschnitt:

$hourly = $parsed_json->{'hourly'}->{'data'}; 
   $message = array(); 

        for($i=0;$i<48;$i++) 
         { 
             $time = utf8_decode($hourly[$i]->time); 
             $summary = utf8_decode($hourly[$i]->summary); 
             $temp = utf8_decode($hourly[$i]->temperature); 
             echo $temp. "
";
             $float  = floatval($temp);
             echo $float. "
";
             $temp2 = utf8_decode($hourly[$i]->apparentTemperature); 
             $humidity = utf8_decode($hourly[$i]->humidity); 
             @$precipType = utf8_decode($hourly[$i]->precipType); 

Ich vermute, das Problem ist das Komma im String. Üblicherweise werden Kommazahlen (außerhalb von Deutschland) mit Punkt codiert. Ersetzt du das Komma vorher durch einen Punkt, sollte das alles klappen. Dafür kannst du zum Beispiel str_replace nutzen: PHP: str_replace - Manual

Hat geklappt, danke!

Hallo,

kann es sein das irgendwas geändert wurde, bei mir geht die Seite nicht mehr.

Hat jemand eine Tipp für mich?

Bei mir geht’s noch

Hallo,

meines ging auch nicht mehr, Script auf Seite 1 wurde mal angepasst, danach geht es bei mir wieder

Gruß

Oliver

https://blog.darksky.net

…nachdem Apple gerade DarkSky gekauft hat, müssen wir uns demnächst etwas Neues suchen…

Neue Nutzer bekommen schon keinen Zugriff mehr, für uns Altnutzer ist noch etwas Zeit. Sehr, sehr schade!

An dieser Stelle nochmals danke für die tolle Lösung hier im Form, ist wirklich sehr hilfreich!

ooh - kein Aprilscherz :eek::frowning:

Hilft das ? https://openweathermap.org/darksky-openweather

Ich glaube, es ist Zeit, mal ein universelleres Skript zu machen, bei dem man die intern benutzen APIs leichter austauschen kann. Letztlich tun sie ja alle das gleiche. Ich habe so etwas ähnliches schon am laufen, aber ich müsste mich mal daran setzen, es aufzubereiten zum Teilen. Aber diese API-Halbwertszeiten immer :banghead:

Also Wunderground läuft noch kostenlos … man muss halt nur einmal eine Wetterstation anmelden. Hier weitere Infos falls nicht bekannt.

[Modul] Wunderground Wetterstation (PWS) Upload

Wunderground sieht toll aus, bis man schnallt dass man selbst eine Wetterstation haben müsste, um es zu nutzen… das ist ja wie wenn ich selbst einen Gelenkbus kaufen muss, um den Nahverkehr nutzen zu können :wink:

Was spricht denn gegen das Modul OpenWeatherMap von demel42, das läuft absolut stabil und liefert Unmengen an Daten, wenn man sie will ;).

Ich habe das Problem mit DarkSky bei der Variable Niederschlagsart, wenn keine Regen o.ä. auftritt wirft mir das Skript bei all diesen Variablen eine Fehlermeldung aus.

23.02.2022, 15:30:00 | PHP                  | Error: Notice: Undefined index: precipType
   Error in Script /var/lib/symcon/scripts/46020.ips.php on Line 259
  137 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   44 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
  259 in 46020.ips.php (call IPSLogger_PhpErrorHandler)

Kann mir jemand bitte sagen wie ich das Problem umgehen kann?

Nächstes unschönes Problem. Bekomme die Meldungen in Englisch anstatt in Deutsch.

Hat sonst keiner mehr das DarkSky Wetter am laufen?