diff --git a/Energy_Pie/module.html b/Energy_Pie/module.html index e347aec..63ee989 100644 --- a/Energy_Pie/module.html +++ b/Energy_Pie/module.html @@ -8,6 +8,7 @@ + @@ -153,6 +154,34 @@ const mi = String(d.getMinutes()).padStart(2,'0'); return `${dd}.${mm}.${yyyy} ${hh}:${mi}`; } + + + function fmtDay(d) { + const dd = String(d.getDate()).padStart(2,'0'); + const mm = String(d.getMonth() + 1).padStart(2,'0'); + const yyyy = d.getFullYear(); + return `${dd}.${mm}.${yyyy}`; + } + + function monthNameDe(m) { + return ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'][m] || ''; + } + + // ISO Woche + ISO Jahr (wichtig: ISO-Jahr kann am Jahresrand abweichen) + function getISOWeekYear(date) { + const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); + // Donnerstag bestimmt ISO-Jahr + d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7)); + const isoYear = d.getUTCFullYear(); + const yearStart = new Date(Date.UTC(isoYear, 0, 1)); + const weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7); + return { week: weekNo, year: isoYear }; + } + + + + + function showErr(e) { const msg = (e && e.message) ? e.message : String(e); elErr.textContent = 'JS-Fehler: ' + msg; @@ -242,13 +271,24 @@ return ` elDate.disabled = isTotal; if (data?.tStart && data?.tEnd) { - const s = new Date(data.tStart * 1000); - const e = new Date(data.tEnd * 1000); - elPeriod.textContent = isTotal - ? 'Zeitraum: Gesamt' - : `Zeitraum: ${fmtDateTime(s)} – ${fmtDateTime(e)}`; + const s = new Date(data.tStart * 1000); + + if (data.range === 'total') { + elPeriod.textContent = 'Zeitraum: Gesamt'; + } else if (data.range === 'day') { + elPeriod.textContent = `Zeitraum: ${fmtDay(s)}`; + } else if (data.range === 'month') { + elPeriod.textContent = `Zeitraum: ${monthNameDe(s.getMonth())} ${s.getFullYear()}`; + } else if (data.range === 'week') { + const iso = getISOWeekYear(s); + elPeriod.textContent = `Zeitraum: Woche ${iso.week} ${iso.year}`; + } else if (data.range === 'year') { + elPeriod.textContent = `Zeitraum: ${s.getFullYear()}`; } else { - elPeriod.textContent = ''; + elPeriod.textContent = ''; + } + } else { + elPeriod.textContent = ''; } diff --git a/Energy_Pie/module.php b/Energy_Pie/module.php index fe878c3..75d6e1e 100644 --- a/Energy_Pie/module.php +++ b/Energy_Pie/module.php @@ -25,7 +25,7 @@ class Energy_Pie extends IPSModule parent::ApplyChanges(); // ensure range valid $range = $this->ReadAttributeString(self::ATTR_RANGE); - if (!in_array($range, ['day', 'week', 'month', 'total'], true)) { + if (!in_array($range, ['day', 'week', 'month', 'year', 'total'], true)) { $this->WriteAttributeString(self::ATTR_RANGE, 'day'); } // ensure date valid (not empty/invalid/future) @@ -51,7 +51,7 @@ class Energy_Pie extends IPSModule switch ($Ident) { case 'SetRange': $range = (string)$Value; - if (!in_array($range, ['day', 'week', 'month', 'total'], true)) { + if (!in_array($range, ['day', 'week', 'month', 'year', 'total'], true)) { return; } $this->WriteAttributeString(self::ATTR_RANGE, $range); @@ -137,6 +137,12 @@ class Energy_Pie extends IPSModule $start = strtotime(date('Y-m-01 00:00:00', $base)); $end = strtotime(date('Y-m-01 00:00:00', strtotime('+1 month', $start))); return [$start, $end]; + + case 'year': + $start = strtotime(date('Y-01-01 00:00:00', $base)); + $end = strtotime(date('Y-01-01 00:00:00', strtotime('+1 year', $start))); + return [$start, $end]; + default: return [$base, $base + 86400]; } @@ -227,6 +233,9 @@ class Energy_Pie extends IPSModule case 'month': $base = strtotime(($sign === -1 ? '-1 month' : '+1 month'), $base); break; + case 'year': + $base = strtotime(($sign === -1 ? '-1 year' : '+1 year'), $base); + break; } $this->WriteAttributeString(self::ATTR_DATE, date('Y-m-d', $base)); }