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?