@dering said:
Das geht schon heute, ganz ohne neue Funktion. Das Hintergrundbild kann seinen Wert aus einem Datenpunkt holen.
Super, Danke für den Hinweis und den Denkanstoß, ich hab's gleich mal umgesetzt und es funktioniert einwandfrei.
[image: EG_Widget.png]
Jetzt hätte ich noch einen Punkt, wie du siehst, nutze ich die Bilder als Hintergrund für ein Universal-Widget und über die Spalten und Zeilen lasse ich mir dann noch andere Informationen in dem Widget anzeige (Temp, offene Fenster usw) jetzt würde ich gerne in jedem Raum ein Button (Bild oder Icon) einfügen mit dem ich bei 'Klick-Action' eine PopUp-View des jeweiligen Raums öffnen kann. Leider gibt es in der Auswahl die Option 'Button' nicht, siehe Bild:
[image: auswahl.png]
Kannst du das noch einfügen, oder gibt es eine andere Möglichkeit?
Edit: Ich füg hier noch das Script (TypeScript) ein welches ich zum wechsel der Bilder benutze falls einer sowas ähnliches bauen möchte.
// Datenpunkte definieren
const dpState = '0_userdata.0.vis.VIS_Light_State.state_vis_widget';
const dpTarget = '0_userdata.0.Aura.lights';
const dpSunrise = '0_userdata.0.Astrodaten.Astro.sunrise';
const dpSunset = '0_userdata.0.Astrodaten.Astro.sunset';
// Mappings für Tag und Nacht
const dayImages: { [key: number]: string } = {
0: 'vis-2.0/SmartHome/EG_Fertig2_Beleuchtung_test.png',
1: 'vis-2.0/SmartHome/EG_Light/hood.png',
2: 'vis-2.0/SmartHome/EG_Light/2_kueche.png',
3: 'vis-2.0/SmartHome/EG_Light/3_kueche_hood.png',
4: 'vis-2.0/SmartHome/EG_Light/wc.png',
5: 'vis-2.0/SmartHome/EG_Light/5_hood_gwc.png',
6: 'vis-2.0/SmartHome/EG_Light/8_tv_day.png',
7: 'vis-2.0/SmartHome/EG_Light/wz.png',
8: 'vis-2.0/SmartHome/EG_Light/wz_play.png',
9: 'vis-2.0/SmartHome/EG_Light/d_wz_hood.png',
10: 'vis-2.0/SmartHome/EG_Light/d_wz_play_hood.png',
11: 'vis-2.0/SmartHome/EG_Light/11_d_wz_play_cook.png',
12: 'vis-2.0/SmartHome/EG_Light/12_d_cook_gwc.png',
13: 'vis-2.0/SmartHome/EG_Light/13_d_cook_hood_gwc.png',
14: 'vis-2.0/SmartHome/EG_Light/14_d_wz_gwc.png',
15: 'vis-2.0/SmartHome/EG_Light/15_wz_play_gwc.png',
16: 'vis-2.0/SmartHome/EG_Light/16_d_wz_cook_gwc.png',
17: 'vis-2.0/SmartHome/EG_Light/17_d_wz_play_cook_gwc.png'
};
const nightImages: { [key: number]: string } = {
0: 'vis-2.0/SmartHome/EG_Fertig2_light_tv.png',
1: 'vis-2.0/SmartHome/night/n_hood.png',
2: 'vis-2.0/SmartHome/night/n_cook_bergsee.png',
3: 'vis-2.0/SmartHome/night/n_kueche_kochen.png',
4: 'vis-2.0/SmartHome/night/n_wc.png',
5: 'vis-2.0/SmartHome/night/n_hood_wc.png',
6: 'vis-2.0/SmartHome/night/n_play.png',
7: 'vis-2.0/SmartHome/night/n_wz.png',
8: 'vis-2.0/SmartHome/night/n_liv.png',
9: 'vis-2.0/SmartHome/night/n_wz_hood.png',
10: 'vis-2.0/SmartHome/night/n_wz_play_hood.png',
11: 'vis-2.0/SmartHome/night/n_wz_play_bergsee.png',
12: 'vis-2.0/SmartHome/night/12_n_cook_gwc.png',
13: 'vis-2.0/SmartHome/night/13_n_cook_hood_gwc.png',
14: 'vis-2.0/SmartHome/night/14_n_wz_gwc.png',
15: 'vis-2.0/SmartHome/night/15_n_wz_play_gwc.png',
16: 'vis-2.0/SmartHome/night/16_n_wz_tv_bergsee_gwc_essen.png',
17: 'vis-2.0/SmartHome/night/17_n_wz_play_bergsee_gwc_treppe.png'
};
// Hilfsfunktion zur Prüfung, ob es aktuell Tag ist (zwischen Sonnenaufgang und Sonnenuntergang)
function isDayTime(): boolean {
const now = new Date();
const currentTime = now.getHours() * 60 + now.getMinutes(); // Minuten seit Tagesbeginn
const sunriseVal = getState(dpSunrise).val;
const sunsetVal = getState(dpSunset).val;
if (typeof sunriseVal !== 'string' || typeof sunsetVal !== 'string') {
log('Astro-Daten (Sunrise/Sunset) haben kein gültiges String-Format!', 'warn');
return true; // Fallback auf Tag
}
// Erwartet Format "HH:MM" oder ISO-String; wir extrahieren die Uhrzeit
const parseTimeToMinutes = (timeStr: string): number => {
let hours = 0;
let minutes = 0;
if (timeStr.includes(':')) {
const parts = timeStr.split(':');
hours = parseInt(parts[0], 10);
minutes = parseInt(parts[1], 10);
} else {
// Falls es ein kompletter ISO-String ist
const d = new Date(timeStr);
hours = d.getHours();
minutes = d.getMinutes();
}
return hours * 60 + minutes;
};
const sunriseMinutes = parseTimeToMinutes(sunriseVal);
const sunsetMinutes = parseTimeToMinutes(sunsetVal);
return currentTime >= sunriseMinutes && currentTime < sunsetMinutes;
}
// Hauptfunktion zur Ermittlung und zum Schreiben des Bildpfades
function updateLightImage() {
const stateVal = getState(dpState).val;
const stateIndex = Number(stateVal);
if (isNaN(stateIndex)) {
log(`Ungültiger Wert im Widget-State: ${stateVal}`, 'warn');
return;
}
const dayTime = isDayTime();
let imagePath = '';
if (dayTime) {
imagePath = dayImages[stateIndex] || '';
} else {
imagePath = nightImages[stateIndex] || '';
}
if (imagePath) {
setState(dpTarget, imagePath, true);
log(`Bildpfad aktualisiert (${dayTime ? 'Tag' : 'Nacht'}, Index ${stateIndex}): ${imagePath}`, 'debug');
} else {
log(`Kein passender Bildpfad für Index ${stateIndex} gefunden!`, 'warn');
}
}
// Event-Listener: Ausführen, wenn sich das Widget ändert
on(dpState, () => {
updateLightImage();
});
// Event-Listener: Ausführen, wenn sich die Astro-Zeiten aktualisieren
on([dpSunrise, dpSunset], () => {
updateLightImage();
});
// Initialer Aufruf beim Start des Scripts
updateLightImage();