Hallo,
es ist schon lange her, aber ich versuche es doch noch einmal hier. Ich hoffe, es kann mir jemand helfen:
Ich habe den Code folgendermaßen geändert, da dieser Fehler produziert hat. Jetzt schaut der COde bei mir so aus, aber ich bekomme folgenden Fehler:
ImageNumber ist undefined
Hier der überarbeitetet COde:
var ImageName, ImageNumber, ImageNumberConverted, NewLink;
on({id: "daswetter.0.NextHours.Location_1.Day_1.current.iconURL", change: "any"}, async function (obj) {
// Sicherstellen, dass obj.state und obj.state.val existieren
if (!obj.state || typeof obj.state.val === 'undefined') {
console.error("obj.state.val ist undefined!");
return; // Früher zurückkehren, wenn der Wert nicht definiert ist
}
var value = obj.state.val;
var oldValue = obj.oldState.val;
// Extrahiert den ImageNumber aus der URL
ImageName = (obj.state ? obj.state.val : "").split('/');
// Sicherstellen, dass ImageName genügend Teile hat
if (ImageName.length > 6) {
ImageNumber = ImageName[6]; // Greife auf den 7. Teil der URL zu (Index 6)
} else {
console.error("Die URL hat nicht genügend Teile. ImageName:", ImageName);
return; // Rückgabe, wenn die URL nicht das erwartete Format hat
}
// Überprüfet, ob ImageNumber existiert und berechnet ImageNumberConverted
if (ImageNumber) {
ImageNumberConverted = parseFloat(ImageNumber.slice(0, ImageNumber.length - 4));
} else {
console.error("ImageNumber ist undefined");
return; // Früher zurückkehren, wenn ImageNumber nicht definiert ist
}
// Berechnet die Zeit für Sonnenaufgang und Sonnenuntergang
var sunrise = getDateObject(getAstroDate("sunrise", undefined, 0));
var sunrise_m = sunrise.getHours() * 60 + sunrise.getMinutes();
var sunset = getDateObject(getAstroDate("sunset", undefined, 0));
var sunset_m = sunset.getHours() * 60 + sunset.getMinutes();
var now = new Date();
var now_m = now.getHours() * 60 + now.getMinutes();
// Setzt den Wert für die Animation
setState("0_userdata.0.Wetter.WeatherAnimation.WeatherAnimation", ImageNumberConverted);
// Logik für unterschiedliche Tageszeiten
if (now_m > sunset_m - 60 && now_m <= sunset_m + 60) {
log("dusk " + sunrise_m + " " + sunset_m);
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", obj.state.val, true);
} else if (now_m > sunrise_m - 60 && now_m <= sunrise_m + 60) {
log("dawn " + sunrise_m + " " + sunset_m);
NewLink = ['http://192.168.178.70:8082/vis.0/Wetter/WeatherAnimation/', ImageNumberConverted + 50, '.png'].join('');
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", NewLink, true);
} else if (now_m > sunrise_m + 60 && now_m <= sunset_m - 60) {
log("day " + sunrise_m + " " + sunset_m);
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", obj.state.val, true);
} else {
log("night " + sunrise_m + " " + sunset_m);
NewLink = ['http://192.168.178.70:8082/vis.0/Wetter/WeatherAnimation/', ImageNumberConverted + 50, '.png'].join('');
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", NewLink, true);
}
// Konsolenausgaben für Debugging
console.log("ImageName:", ImageName);
console.log("ImageNumber:", ImageNumber);
console.log("ImageNumberConverted:", ImageNumberConverted);
console.log("sunrise_m:", sunrise_m);
console.log("sunset_m:", sunset_m);
console.log("now_m:", now_m);
});
Ich habe folgenden DAtenpunkte angelegt:
0_userdata.0.Wetter.WeatherAnimation.WeatherAnimation
0_userdata.0.Wetter.WeatherAnimation.Weatherurl
Der DAtenpunkt Animation wird befüllt mit einer Zahl, auch die WeatherURL. Aber ich erhalte dann eine z.B. Animation 2 und url http://192.168.178.70:8082/vis.0/Wetter/WeatherAnimation/52.png
In der VIS wird dann logischerweise auch nicht das richtige Bild angezeigt. Kann mir jemand bitte helfen?
edit:
Ich habe den Code wie folgt abgeändert:
var ImageName, ImageNumber, ImageNumberConverted, NewLink;
on({id: "daswetter.0.NextHours.Location_1.Day_1.current.iconURL", change: "any"}, async function (obj) {
// Sicherstellen, dass obj.state und obj.state.val existieren
if (!obj.state || typeof obj.state.val === 'undefined') {
console.error("obj.state.val ist undefined!");
return; // Früher zurückkehren, wenn der Wert nicht definiert ist
}
var value = obj.state.val;
var oldValue = obj.oldState.val;
// Ausgabe der URL, um zu sehen, wie sie aussieht
console.log("URL:", value);
// Falls die URL leer oder ungültig ist, logge eine Fehlermeldung
if (!value) {
console.error("Die URL (obj.state.val) ist leer oder ungültig!");
return;
}
// Extrahiere den ImageNumber aus der URL
ImageName = value.split('/');
console.log("ImageName Teile:", ImageName); // Ausgabe der Teile nach dem Split
// Versuchen, den Dateinamen zu extrahieren
if (ImageName.length > 0) {
// Der Dateiname könnte der letzte Teil der URL sein
const filename = ImageName[ImageName.length - 1];
console.log("Dateiname:", filename);
// Versuchen, die Bildnummer aus dem Dateinamen zu extrahieren
const match = filename.match(/^(\d+)\.png$/); // Annahme: Der Dateiname ist eine Zahl gefolgt von .png
if (match) {
ImageNumber = match[1];
ImageNumberConverted = parseFloat(ImageNumber);
console.log("Extrahierte Bildnummer:", ImageNumber);
} else {
console.error("Kein gültiger Dateiname gefunden");
return;
}
} else {
console.error("Die URL hat nicht genügend Teile.");
return; // Rückgabe, wenn die URL nicht das erwartete Format hat
}
// Berechne die Zeit für Sonnenaufgang und Sonnenuntergang
var sunrise = getDateObject(getAstroDate("sunrise", undefined, 0));
var sunrise_m = sunrise.getHours() * 60 + sunrise.getMinutes();
var sunset = getDateObject(getAstroDate("sunset", undefined, 0));
var sunset_m = sunset.getHours() * 60 + sunset.getMinutes();
var now = new Date();
var now_m = now.getHours() * 60 + now.getMinutes();
// Setze den Wert für die Animation
setState("0_userdata.0.Wetter.WeatherAnimation.WeatherAnimation", ImageNumberConverted);
// Logik für unterschiedliche Tageszeiten
if (now_m > sunset_m - 60 && now_m <= sunset_m + 60) {
log("dusk " + sunrise_m + " " + sunset_m);
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", obj.state.val, true);
} else if (now_m > sunrise_m - 60 && now_m <= sunrise_m + 60) {
log("dawn " + sunrise_m + " " + sunset_m);
NewLink = ['http://192.168.178.70:8082/vis.0/Wetter/WeatherAnimation/', ImageNumberConverted + 50, '.png'].join('');
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", NewLink, true);
} else if (now_m > sunrise_m + 60 && now_m <= sunset_m - 60) {
log("day " + sunrise_m + " " + sunset_m);
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", obj.state.val, true);
} else {
log("night " + sunrise_m + " " + sunset_m);
NewLink = ['http://192.168.178.70:8082/vis.0/Wetter/WeatherAnimation/', ImageNumberConverted + 50, '.png'].join('');
setState("0_userdata.0.Wetter.WeatherAnimation.Weatherurl", NewLink, true);
}
// Konsolenausgaben für Debugging
//console.log("ImageName:", ImageName);
//console.log("ImageNumber:", ImageNumber);
//console.log("ImageNumberConverted:", ImageNumberConverted);
//console.log("sunrise_m:", sunrise_m);
//console.log("sunset_m:", sunset_m);
//console.log("now_m:", now_m);
});
Jetzt bekomme ich in
0_userdata.0.Wetter.WeatherAnimation.Weatherurl = /vis.0/main/Wetter/Wetter Hd/2.png
und
0_userdata.0.Wetter.WeatherAnimation.WeatherAnimation = 2
Außerdem erhalte ich noch folgenden Fehler, den ich schon einmal hatte:
web.0
2025-03-25 16:37:01.785 error Invalid pattern on subscribe: The pattern "id: "daswetter.0.NextHours.Location_1.Day_1.current.iconURL", change: "any"" is not a valid ID pattern