Wetterdaten Anzeige

Ich wollte mal fragen ob jemand das genauso hat wie hier beschrieben:

Und dazu ggf. auch eine detailliertere Anleitung hat, wie man die Bilder, Texte etc. erhält ?
Oder hat hier Brownson ggf. sogar eine Vorlage die man direkt in seine bestehende Visu integrieren kann und ich finde diese nur nicht ?

Ich hab es etwas anders gelöst:



Das Ganze nutzt die Daten meiner Wetterstation, Unwetterwarnung, Pollenflug, Wunderground, morgenwirdes.de.

Gruß
Burkhard

1 „Gefällt mir“

Hab das mittlerweile bei mir auch wieder etwas umgeändert :slight_smile:

Generierung des Icons findest Du in meinem Blog:

Ich habe mich mal rangemacht und es versucht.
Obwohl ich die aktuellen Daten von Openweather erhalte und auch auf der Synology den richtigen Order habe wo die Bilder drin sind, kommt das Script bei mir noch nicht ganz zurecht und aktualisiert mir nicht die Bilder.

$MediaID = IPS_GetParent($_IPS['SELF']);                        // Image im MedienPool (übergeodnetes Objekt)
$Wetterbedingung = GetValue($_IPS['12483']);                 // Wetterbedingungssymbol von OpenWeatherMap (auslösende Variable)

$Path = IPS_GetKernelDir()."/media/Wettersymbole/";

// ******************* Bedingungen vergleichen *************************

$Image = "44.png";                                              // N/A Wettersymbol wenn Wetter Code nicht vorhanden

//day
if ($Wetterbedingung == "01d") $Image = "32.png";        
if ($Wetterbedingung == "02d") $Image = "30.png";        
if ($Wetterbedingung == "03d") $Image = "28.png";        
if ($Wetterbedingung == "04d") $Image = "26.png";        
if ($Wetterbedingung == "09d") $Image = "40.png";        
if ($Wetterbedingung == "10d") $Image = "39.png";        
if ($Wetterbedingung == "11d") $Image = "3.png";        
if ($Wetterbedingung == "13d") $Image = "13.png";        
if ($Wetterbedingung == "50d") $Image = "34.png";        

//night
if ($Wetterbedingung == "01n") $Image = "31.png";        
if ($Wetterbedingung == "02n") $Image = "29.png";        
if ($Wetterbedingung == "03n") $Image = "27.png";        
if ($Wetterbedingung == "04n") $Image = "26.png";        
if ($Wetterbedingung == "09n") $Image = "40.png";        
if ($Wetterbedingung == "10n") $Image = "45.png";        
if ($Wetterbedingung == "11n") $Image = "47.png";        
if ($Wetterbedingung == "13n") $Image = "46.png";        
if ($Wetterbedingung == "50n") $Image = "33.png";       

// *********************************************************************

$ImageFile = $Path.$Image;                                      // Image-Datei
IPS_SetMediaFile($MediaID, $ImageFile, true);                   // Image im MedienPool mit Image-Datei

Ich bekomme auch beim testen immer das hier angezeigt:

Notice: Undefined offset: 12483 in /var/lib/symcon/scripts/55022.ips.php on line 4

Warning: Variable #0 existiert nicht in /var/lib/symcon/scripts/55022.ips.php on line 4

Die 12483 ist der Wert von Openweather für die Symbole und zeigt aktuell als Wert " 04d ".
Dennoch habe ich das Symbol ( Bild ) mit dem N/A
Jemand hier mal einen Tip wo mein Fehler liegt ?

Gerade gesehen, das Script kommt mir doch bekannt vor … :wink:
Versuch’ mal so …

$Wetterbedingung = GetValue(12483);

Grüße,
Doc

Danke, der Fehler Parse error: syntax error, unexpected ‚)‘, expecting ‚]‘ in /var/lib/symcon/scripts/55022.ips.php on line 4 ist aber noch vorhanden und Bild noch nicht aktualisiert

Habe es noch mal probiert und nicht kopiert eingesetzt und nun geht es scheinbar :wink: Danke Dir vielmals

Ich habe das bei mir ziemlich hässlich gelöst, aber es schaut so aus.

Ich verwende die Daten von OpenWeather, dort bekomme ich so Werte wie „04d“ und hab ein Mapping auf die einzelnen Bilder. Ich hab sie direkt ins IP-Symcon hochgeladen als Media-Dateien statt alle in einen Ordner auf dem Server selbst - da ich jetzt nicht auf Anhieb wusste ob alle Dateien unter media/ auch im Backup drin sind.

Und das ist das Script.
Es nimmt die Daten von OpenWeather und schreibt die Icons mit HTML verschönert in bestimmte Variablen und befüllt mir zusätzlich bestimmte Variablen mit den Namen der jeweiligen Tage (einmal als Kurz- und einmal als Langversion).

Über IPSView hab ich die Icons dann einfach in HTML-Boxen rein und die Icons werden so immer zentriert angezeigt.

<?php

$outputVariableIds = [
    59906,
    13357,
    10661,
    48138,
    32933,
];

$dayNameVariables = [
    19164,
    42066,
    22772,
    26349,
    32798,
];
$dayLongNameVariables = [
    32559,
    40099,
    54834,
    15950,
    17867,
];


$imageMap = [
    // DAY Icons
    '01d' => 21425, // clear sky
    '02d' => 53585, // few clouds
    '03d' => 42041, // scattered clouds
    '04d' => 53585, // broken clouds
    '09d' => 11987, // shower rain
    '10d' => 25899, // rain
    '11d' => 18508, // thunderstorm
    '13d' => 51334, // snow
    '50d' => 47594, // mist

    // NIGHT icons
    '01n' => 21789, // clear night
    '02n' => 58179, // few clouds
    '03n' => 43746, // scattered clouds
    '04n' => 43746, // broken clouds
    '09n' => 11987, // shower rain
    '10n' => 28855, // rain
    '11n' => 45748, // thunderstorm
    '13n' => 51334, // snow
    '50n' => 47594, // mist
];

$data = [
    // NOW
    [
        'title'     => 'Aktuell',
        'titleLong' => 'Aktuell',
        'image'     => function() use ($imageMap) {
            $var     = IPS_GetVariable(53154);
            $icon    = $var['VariableValue'];
            $imageId = $imageMap[$icon];

            return IPS_GetMedia($imageId);
        },
    ],
    // #D1
    [
        'title'     => getWeekday(55021),
        'titleLong' => getWeekdayLong(55021),
        'image'     => function() use ($imageMap) {
            $var     = IPS_GetVariable(18360);
            $icon    = $var['VariableValue'];
            $imageId = $imageMap[$icon];

            return IPS_GetMedia($imageId);
        },
    ],

    // #D2
    [
        'title'     => getWeekday(38859),
        'titleLong' => getWeekdayLong(38859),
        'image'     => function() use ($imageMap) {
            $var     = IPS_GetVariable(27669);
            $icon    = $var['VariableValue'];
            $imageId = $imageMap[$icon];

            return IPS_GetMedia($imageId);
        },
    ],
    // #D3
    [
        'title'     => getWeekday(46708),
        'titleLong' => getWeekdayLong(46708),
        'image'     => function() use ($imageMap) {
            $var     = IPS_GetVariable(38568);
            $icon    = $var['VariableValue'];
            $imageId = $imageMap[$icon];

            return IPS_GetMedia($imageId);
        },
    ],
    // #D4
    [
        'title'     => getWeekday(36449),
        'titleLong' => getWeekdayLong(36449),
        'image'     => function() use ($imageMap) {
            $var     = IPS_GetVariable(18081);
            $icon    = $var['VariableValue'];
            $imageId = $imageMap[$icon];

            return IPS_GetMedia($imageId);
        },
    ],
];

foreach ($data as $index => $row) {
    $image     = getVariableValue($row['image']);
    $imageHtml = sprintf('<img class="weatherIcon" style="max-width:50vw;height:auto;padding:0;margin:0;" src="data:image/png;base64, %s" />', IPS_GetMediaContent($image['MediaID']));
    $container = <<<HTML
            <style>
            html, body {
                overflow: hidden;
                scrollbar-width: none;
                padding: 0;
                margin: 0;
                max-width: 100%;
                max-height: 100%;
            }
            </style>
            <div style="display:flex;align-items:flex-start;justify-content:center;height: 100%;padding:0;margin:0;overflow:hidden;scrollbar-width: none;">{$imageHtml}</div>
        HTML;

    SetValue($outputVariableIds[$index], trim($container));
    SetValue($dayNameVariables[$index], $row['title']);
    SetValue($dayLongNameVariables[$index], $row['titleLong']);
}

function getVariableValue($input) {
    $value = $input;
    if (is_array($input) && isset($input['VariableValue'])) {
        $value = $input['VariableValue'];
    } else if (is_callable($input)) {
        $value = $input();
    }

    return $value;
}

function getWeekday($objectId) {
    $timestamp = GetValue($objectId);

    $days = [
        'Mon' => 'Mo',
        'Tue' => 'Di',
        'Wed' => 'Mi',
        'Thu' => 'Do',
        'Fri' => 'Fr',
        'Sat' => 'Sa',
        'Sun' => 'So',
    ];
    
    return $days[date('D', $timestamp)];
}

function getWeekdayLong($objectId) {
    $timestamp = GetValue($objectId);

    $days = [
        'Mon' => 'Montag',
        'Tue' => 'Dienstag',
        'Wed' => 'Mittwoch',
        'Thu' => 'Donnerstag',
        'Fri' => 'Freitag',
        'Sat' => 'Samstag',
        'Sun' => 'Sonntag',
    ];
    
    return $days[date('D', $timestamp)];
}

Da setLocale bei mir auf der Symbox nicht erlaubt ist, kann ich die Wochentage nicht über PHP lokalisieren, darum brauch ich da ein manuelles Mapping. Vll gehts aber doch und jemand weiß, wie?

Hallo
Ich hätte da mal eine frage ich rufe die daten über OneCall ab und es funktioniert auch alles das einzige was ich nicht ganz verstehe ist wie kann ich über Openweathermap die Wettervorhersage abrufen ?
bekomme dazu keine Variable ? und kann dieses auch beim OneCall nicht einstellen :thinking:

LG und danke im Voraus :smiley:

Das kommt nicht von OpenWeatherMap sondern von einer Wetterseite in Österreich, im Prinzip ist das noch immer der Code aus der Library, siehe https://ipslibrary.brownson.at/module-ipsweatherforecastat/ und funktioniert halt nur für Österreich :wink:

Danke für die schnelle Antwort :smiley:

Hallo Brownson,

Habe nach deiner Anleitung alles eingerichtet. Funktioniert super, aber die ikons werden nicht in View aktuallisiert. Manchmal 3x hintereinander ok, dann wieder 10x nicht. In der Visu funktioniert es bestens. Das MediaImage wird richtig geladen aber nicht immer in der View.

Hast du einen Tip. MfG. Henry

Das sieht nach einem kleinem Bug aus :thinking:

Kannst Du mal als Workaround folgende Zeile am Ende einfügen:

IPS_SetMediaContent($MediaID, IPS_GetMediaContent($MediaID));