diff --git a/README.md b/README.md index e5ec24c2..0cff6bdd 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ Since v5.5.0 of the JavaScript adapter the following locations (relative to the * (klein0r) Configurable trigger warning limit (default: 100 per script) * (klein0r) Allow to use objects in create state blocks for common +* (klein0r) Added warning if latitude or longitude is not configured correctly ### 7.9.0 (2024-03-13) diff --git a/main.js b/main.js index 883b7c6f..1923aec8 100644 --- a/main.js +++ b/main.js @@ -1457,37 +1457,43 @@ function formatHoursMinutesSeconds(date) { async function sunTimeSchedules(adapter, context) { if (adapter.config.createAstroStates) { - const calcDate = getAstroStartOfDay(); - - const times = mods.suncalc.getTimes(calcDate, adapter.config.latitude, adapter.config.longitude); - - for (const t in times) { - const timeFormatted = formatHoursMinutesSeconds(times[t]); - const objId = `variables.astro.${t}`; - - await adapter.setObjectNotExistsAsync(objId, { - type: 'state', - common: { - name: `Astro ${t}`, - type: 'string', - role: 'value', - read: true, - write: false, - }, - native: {}, - }); - await adapter.setStateAsync(objId, { val: timeFormatted, c: times[t].toISOString(), ack: true }); - } + if (!isNaN(adapter.config.longitude) && !isNaN(adapter.config.longitude)) { + const calcDate = getAstroStartOfDay(); - const todayDate = new Date(); - todayDate.setHours(0); - todayDate.setMinutes(0); - todayDate.setSeconds(1); - todayDate.setMilliseconds(0); - todayDate.setDate(todayDate.getDate() + 1); + const times = mods.suncalc.getTimes(calcDate, adapter.config.latitude, adapter.config.longitude); + + for (const t in times) { + try { + const timeFormatted = formatHoursMinutesSeconds(times[t]); + const objId = `variables.astro.${t}`; - adapter.log.debug(`[sunTimeSchedules] Next: ${todayDate.toISOString()}`); - sunScheduleTimer = setTimeout(sunTimeSchedules, todayDate.getTime() - Date.now(), adapter, context); + await adapter.setObjectNotExistsAsync(objId, { + type: 'state', + common: { + name: `Astro ${t}`, + type: 'string', + role: 'value', + read: true, + write: false, + }, + native: {}, + }); + await adapter.setStateAsync(objId, { val: timeFormatted, c: times[t].toISOString(), ack: true }); + } catch (err) { + adapter.log.error(`[sunTimeSchedules] Unable to set state for astro time "${t}"`); + } + } + + const todayDate = new Date(); + todayDate.setHours(0); + todayDate.setMinutes(0); + todayDate.setSeconds(1); + todayDate.setMilliseconds(0); + todayDate.setDate(todayDate.getDate() + 1); + + adapter.log.debug(`[sunTimeSchedules] Next: ${todayDate.toISOString()}`); + sunScheduleTimer = setTimeout(sunTimeSchedules, todayDate.getTime() - Date.now(), adapter, context); + } } else { // remove astro states if disabled adapter.delObject('variables.astro', { recursive: true }); @@ -2303,6 +2309,18 @@ async function getData(callback) { adapter.config.latitude = parseFloat(adapter.config.latitude); adapter.config.longitude = parseFloat(adapter.config.longitude); + if (isNaN(adapter.config.latitude)) { + adapter.log.warn(`Configured latitude is not a number - check (instance/system) configuration`); + } else if (adapter.config.latitude < -90 || adapter.config.latitude > 90) { + adapter.log.warn(`Configured latitude "${adapter.config.latitude}" is invalid - check (instance/system) configuration`); + } + + if (isNaN(adapter.config.longitude)) { + adapter.log.warn(`Configured longitude is not a number - check (instance/system) configuration`); + } else if (adapter.config.longitude < -180 || adapter.config.longitude > 180) { + adapter.log.warn(`Configured longitude "${adapter.config.longitude}" is invalid - check (instance/system) configuration`); + } + adapter.config.sunriseEvent = adapter.config.sunriseEvent || 'nightEnd'; adapter.config.sunriseOffset = adapter.config.sunriseOffset || 0; adapter.config.sunriseLimitStart = adapter.config.sunriseLimitStart || '06:00';