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)); 

Hallo,
ich bin mich gerade am einarbeiten in die IPSView und Syncom. Hatte vorher ioBroker im Einsatz aber möchte jetzt gerne mit IPSyncom weitermachen.
Allerdings durchblicke ich dieses Thema mit dem Media Ordner nicht.


Bei mir läuft IPSymcon auf einem Raspberry PI 5 und ich kann diesen Ordner nicht finden.
Muss man diesen manuell erstellen ?
Und wie lege ich dann die diese Bilder an?

Oder bin ich auf dem komplett falschen Weg?

Vielen Dank schonmal.
Gruß
Günter

Die Icons musst Du manuell in das Subverzeichnis „Wettersymbole“ im Media Verzeichnis kopieren, das Skript verlinkt dann das jeweilige File mit dem MediaObjekt.

IPSView kann dann das MediaImage per ID visualisieren und wird bei Änderungen am Image auch notifiziert :wink:

Hi, Danke für die schnelle Antwort.
Hab jetzt gefunden wo ich die Bilder hin kopieren muss.
Bei meinem Raspi liegt das media Verzeichnis unter:
/var/lib/symcon/media.
Dort habe ich jetzt den Ordner Wettersymbole erstellt und alle Bilder reinkopiert.
Allerdings bekomme ich vom PHP Script noch eine Fehlermeldung:
„Warning: Undefined array key „VARIABLE“ in /var/lib/symcon/scripts/27342.ips.php on line 4“
„Warning: Variable #0 existiert nicht in /var/lib/symcon/scripts/27342.ips.php on line 4“

In der Zeile 4 ist folgendes hinterlegt:
$Wetterbedingung = GetValue($_IPS[‚VARIABLE‘]);

So ist mein Objektbaum:

Das Skript funktioniert nur wenn es durch ein Event aufgerufen wird.

Grundlagen dazu findest Du unter
https://www.symcon.de/de/service/dokumentation/grundlagen/automationen/php-skripte/systemvariablen/
und
https://www.symcon.de/de/service/dokumentation/grundlagen/ereignisse/

Für einen manuellen Test musst Du im Skript die Variablen manuell setzen:

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

$Wetterbedingung = GetValue( 13422); // Wetterbedingungssymbol von OpenWeatherMap (auslösende Variable)
$MediaID         = 48827; // Image im MedienPool (übergeodnetes Objekt)

1 „Gefällt mir“

Hi Brownson,

hat alles geklappt. Vielen Dank für deine Unterstützung.
Gruß
Günter

Dazu habe ich auch mal eine Frage, da ich mich damit auch schon befasst hatte. Ich bekomme bei meinem Raspi keinen Zugriff auf das Symcon-Verzeichnis. Dieses liegt ja in /var/lib/symcon.
Sobald ich in das Symcon Verzeichnis wechseln möchte bekomme ich nur „Permission denied“. Habe es u.a. mit Filezilla versucht…

Der normale pi User hat kein Zugriffsrecht auf das Verzeichnis.
Also ich habe das bei mir so gelöst:
SSH zu dem Raspi (puTTY oder ähnliches)
Mit dem pi User anmelden.
Dann sudo su eingeben.
Danach kannst du die Berechtigungen mit dem Befehl chmod ändern.
Hier ist erklärt was chmod macht.
chmod › Wiki › ubuntuusers.de

Hallo Browson,

vielen Dank für den Tipp mit der manuellen Setzung der Auslöser.

Die ICONs habe ich wie folgt abgelegt:

ich erhalte noch folgenden Fehler beim Skript ausführen

Was habe ich noch falsch gemacht?

Vielen Dank.