|
20 | 20 | ATTR_MONTHLY_COMPONENTS, |
21 | 21 | ATTR_PERIOD, |
22 | 22 | ATTR_CURRENT_RATE_NAME, |
| 23 | + ATTR_EXPORT_RATE_SOURCE, |
| 24 | + ATTR_EXPORT_RATE_WARNING, |
23 | 25 | ATTR_NEXT_RATE_CHANGE, |
24 | 26 | ATTR_NEXT_RATE_NAME, |
25 | 27 | ATTR_NEXT_RATE_VALUE, |
26 | 28 | ATTR_RATE_CODE, |
27 | 29 | ATTR_RATE_NAME, |
| 30 | + ATTR_RIDER18_EXPORT_AVAILABLE, |
28 | 31 | ATTR_RIDER18_SOURCE_URL, |
29 | 32 | ATTR_SCHEDULE_BY_SEASON, |
30 | 33 | ATTR_SCHEDULE_TEXT, |
@@ -123,6 +126,25 @@ def _export_rate_cents(self, period: SeasonalPeriodRate): |
123 | 126 | self._rider18_export_rate_cents(period), |
124 | 127 | ) |
125 | 128 |
|
| 129 | + def _export_rate_source(self, period: SeasonalPeriodRate) -> str: |
| 130 | + if self._entry.data.get(CONF_NET_METERING, False): |
| 131 | + return "net_metering" |
| 132 | + if self._rider18_export_rate_cents(period) is not None: |
| 133 | + return "rider18" |
| 134 | + return "pdf_generation_components" |
| 135 | + |
| 136 | + def _export_rate_warning(self, period: SeasonalPeriodRate) -> str | None: |
| 137 | + if self._entry.data.get(CONF_NET_METERING, False): |
| 138 | + return None |
| 139 | + if self._rider18_export_rate_cents(period) is not None: |
| 140 | + return None |
| 141 | + if not self.coordinator.data.rider18_source_url: |
| 142 | + return "Rider 18 export credits are not loaded; using PDF generation-only export pricing." |
| 143 | + return ( |
| 144 | + "No Rider 18 export credit matched the selected rate's active season and period; " |
| 145 | + "using PDF generation-only export pricing." |
| 146 | + ) |
| 147 | + |
126 | 148 | def _warning(self) -> str | None: |
127 | 149 | selected = self._entry.data[CONF_SELECTED_RATE] |
128 | 150 | if selected not in self.coordinator.data.rates: |
@@ -282,6 +304,13 @@ def native_value(self) -> float | None: |
282 | 304 | def extra_state_attributes(self) -> dict: |
283 | 305 | attrs = self._base_attributes() |
284 | 306 | attrs[CONF_NET_METERING] = self._entry.data.get(CONF_NET_METERING, False) |
| 307 | + period = self._active_period() |
| 308 | + if period is not None: |
| 309 | + attrs[ATTR_EXPORT_RATE_SOURCE] = self._export_rate_source(period) |
| 310 | + attrs[ATTR_RIDER18_EXPORT_AVAILABLE] = self._rider18_export_rate_cents(period) is not None |
| 311 | + warning = self._export_rate_warning(period) |
| 312 | + if warning is not None: |
| 313 | + attrs[ATTR_EXPORT_RATE_WARNING] = warning |
285 | 314 | return attrs |
286 | 315 |
|
287 | 316 | def _period_value_usd(self, period: SeasonalPeriodRate | None) -> float | None: |
|
0 commit comments