Skip to content

Commit 106e9cd

Browse files
authored
Add dim, curtail (#1066)
1 parent 73e8709 commit 106e9cd

7 files changed

Lines changed: 105 additions & 50 deletions

File tree

src/components/DeviceFilter.astro

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,37 @@ const labels = lang === "de"
5151
</button>
5252
</label>
5353

54-
{usages.map((u) => (
55-
<button
56-
type="button"
57-
class="tag tag-usages"
58-
data-device-filter-usage={u}
59-
aria-pressed="false"
60-
aria-label={`${labels.filterByPrefix} ${usageLabel(u, lang)}`}
61-
title={usageLabel(u, lang)}
62-
>
63-
<UsageIcons usages={[u]} lang={lang} />
64-
</button>
65-
))}
66-
67-
{features.map((f) => (
68-
<button
69-
type="button"
70-
class="tag tag-feature"
71-
data-device-filter-feature={f}
72-
aria-pressed="false"
73-
>{featureShortLabel(f, lang)}</button>
74-
))}
54+
<div class="device-filter__tags">
55+
{usages.length > 0 && (
56+
<div class="device-filter__tag-row device-filter__tag-row--usages">
57+
{usages.map((u) => (
58+
<button
59+
type="button"
60+
class="tag tag-usages"
61+
data-device-filter-usage={u}
62+
aria-pressed="false"
63+
aria-label={`${labels.filterByPrefix} ${usageLabel(u, lang)}`}
64+
title={usageLabel(u, lang)}
65+
>
66+
<UsageIcons usages={[u]} lang={lang} />
67+
</button>
68+
))}
69+
</div>
70+
)}
71+
72+
{features.length > 0 && (
73+
<div class="device-filter__tag-row device-filter__tag-row--features">
74+
{features.map((f) => (
75+
<button
76+
type="button"
77+
class="tag tag-feature"
78+
data-device-filter-feature={f}
79+
aria-pressed="false"
80+
>{featureShortLabel(f, lang)}</button>
81+
))}
82+
</div>
83+
)}
84+
</div>
7585
</div>
7686
</div>
7787

src/components/features.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ const labels: Record<string, Partial<Record<Lang, string>>> = {
88
"battery-control": { de: "Batteriesteuerung", en: "Battery control" },
99
iso151182: { de: "ISO 15118-2", en: "ISO 15118-2" },
1010
"iso15118-2": { de: "ISO 15118-2", en: "ISO 15118-2" },
11+
dim: { de: "Dimmbar", en: "Dimmable" },
12+
curtail: { de: "Abregelbar", en: "Curtailable" },
1113
sponsorship: { de: "Sponsortoken", en: "Sponsor token" },
1214
sponsorfree: { de: "Kein Sponsortoken", en: "No sponsor token" },
1315
skiptest: { de: "", en: "" },
@@ -17,11 +19,14 @@ const labels: Record<string, Partial<Record<Lang, string>>> = {
1719

1820
const shortLabels: Record<string, Partial<Record<Lang, string>>> = {
1921
mA: { de: "mA", en: "mA" },
20-
meter: { de: "Zähler", en: "Meter" },
22+
meter: { de: "Zähler", en: "meter" },
23+
"battery-control": { de: "Batteriesteuerung", en: "battery control" },
2124
iso151182: { de: "ISO", en: "ISO" },
2225
"iso15118-2": { de: "ISO", en: "ISO" },
23-
sponsorship: { de: "Sponsor", en: "Sponsor" },
24-
sponsorfree: { de: "Sponsor-frei", en: "Sponsor free" },
26+
dim: { de: "dimmbar", en: "dimmable" },
27+
curtail: { de: "abregelbar", en: "curtailable" },
28+
sponsorship: { de: "Sponsor", en: "sponsor" },
29+
sponsorfree: { de: "sponsorfrei", en: "sponsor free" },
2530
};
2631

2732
const descriptions: Record<string, Partial<Record<Lang, string>>> = {
@@ -53,6 +58,14 @@ const descriptions: Record<string, Partial<Record<Lang, string>>> = {
5358
de: "Externe Steuerung von Hausbatterie-Lade- und Entladevorgängen durch evcc.",
5459
en: "External control of home battery charging and discharging via evcc.",
5560
},
61+
dim: {
62+
de: "Verbrauchsleistung kann reduziert werden (bspw. §14a EnWG). Siehe [Externe Steuerung](/de/features/external-control).",
63+
en: "Power consumption can be reduced (e.g. §14a EnWG). See [External Control](/en/features/external-control).",
64+
},
65+
curtail: {
66+
de: "Wechselrichter-Erzeugung kann reduziert werden (bspw. §9 EEG). Siehe [Externe Steuerung](/de/features/external-control).",
67+
en: "Inverter production can be reduced (e.g. §9 EEG). See [External Control](/en/features/external-control).",
68+
},
5669
ocpp: {
5770
de: "Kommunikation über das offene OCPP-Protokoll.",
5871
en: "Communication via the open OCPP protocol.",

src/components/intros/ChargersIntro.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ interface Props {
77
}
88
const { lang } = Astro.props;
99
10-
const featureKeys = ["1p3p", "rfid", "mA", "meter", "iso15118-2"];
10+
const featureKeys = ["1p3p", "rfid", "mA", "meter", "iso15118-2", "dim"];
1111
1212
const t = lang === "de"
1313
? {

src/components/intros/MetersIntro.astro

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
---
22
import UsageIcons from "@components/UsageIcons.astro";
3+
import { featureLabel, featureDescription } from "@components/features";
4+
import { renderMarkdownInline } from "@utils/devices";
35
46
interface Props {
57
lang: "de" | "en";
68
}
79
const { lang } = Astro.props;
10+
11+
const featureKeys = ["battery-control", "dim", "curtail"];
812
---
913

1014
{lang === "de" ? (
@@ -44,11 +48,12 @@ const { lang } = Astro.props;
4448

4549
<h2 id="features">Eigenschaften</h2>
4650
<ul>
47-
<li>
48-
<strong>Batteriesteuerung:</strong> Geräte mit aktiver Steuerung erlauben weitere Optimierungen,
49-
z. B. eine Entladesperre beim Schnellladen des Fahrzeugs.
50-
Passive Batteriesteuerung funktioniert mit allen Hausakkus.
51-
</li>
51+
{featureKeys.map((f) => (
52+
<li>
53+
<strong>{featureLabel(f, lang)}:</strong>{" "}
54+
<span set:html={renderMarkdownInline(featureDescription(f, lang))} />
55+
</li>
56+
))}
5257
</ul>
5358
</>
5459
) : (
@@ -88,11 +93,12 @@ const { lang } = Astro.props;
8893

8994
<h2 id="features">Features</h2>
9095
<ul>
91-
<li>
92-
<strong>Battery control:</strong> Devices with active control unlock further optimisations,
93-
e.g. preventing discharge while fast-charging the vehicle.
94-
Passive battery control works with every home battery.
95-
</li>
96+
{featureKeys.map((f) => (
97+
<li>
98+
<strong>{featureLabel(f, lang)}:</strong>{" "}
99+
<span set:html={renderMarkdownInline(featureDescription(f, lang))} />
100+
</li>
101+
))}
96102
</ul>
97103
</>
98104
)}

src/content/docs/de/features/external-control.mdx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,17 @@ Wichtige Punkte:
2626

2727
### Einspeisemanagement (§9 EEG)
2828

29-
:::caution[In Entwicklung]
30-
Der Mechanismus ist implementiert.
31-
Die Integration und Dokumentation unterstützter Wechselrichter ist in Arbeit.
29+
:::caution[Experimentell]
30+
Unterstützte Geräte sind in der [Geräteübersicht](/de/meters) mit "Abregelbar" markiert.
3231
:::
3332

3433
Nach §9 des Erneuerbare-Energien-Gesetzes (EEG) können Netzbetreiber bei drohender Netzüberlastung die Einspeisung von Erneuerbare-Energien-Anlagen abregeln.
3534
Dies betrifft hauptsächlich größere PV-Anlagen, kann aber auch im privaten Bereich relevant werden.
3635

36+
Erhält evcc ein Abregelungssignal, wird die Wechselrichter-Erzeugung direkt am Gerät auf 0 W begrenzt.
37+
Die Abregelung ist aktuell ein binäres Signal (an/aus) ohne dynamischen Grenzwert.
38+
Nach Ende des Signals wird die volle Erzeugung wieder freigegeben.
39+
3740
### Anbindungsmöglichkeiten
3841

3942
Die Anbindung erfolgt über **Relais** (über einen Schaltkontakt) oder **EEBus** (über das EEBus-Protokoll).

src/content/docs/en/features/external-control.mdx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,17 @@ Important points:
2626

2727
### Feed-in Management (§9 EEG)
2828

29-
:::caution[Under development]
30-
The mechanism is implemented.
31-
Integration and documentation of supported inverters is work in progress.
29+
:::caution[Experimental]
30+
Supported devices are marked with "Curtailable" in the [device overview](/en/meters).
3231
:::
3332

3433
According to §9 of the Renewable Energy Act (EEG), grid operators can curtail the feed-in of renewable energy installations in the event of imminent grid overload.
3534
This mainly affects larger solar installations, but can also become relevant in the residential sector.
3635

36+
When evcc receives a curtailment signal, inverter production is limited to 0 W directly at the device.
37+
Curtailment is currently a binary signal (on/off) without a dynamic setpoint.
38+
Full production resumes once the signal clears.
39+
3740
### Connection Options
3841

3942
Connection is established via **Relay** (via a switch contact) or **EEBus** (via the EEBus protocol).

src/styles/custom.css

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -215,19 +215,18 @@ header.header .social-icons::after {
215215

216216
.device-filter__body {
217217
display: flex;
218-
flex-wrap: wrap;
219-
align-items: center;
218+
flex-direction: column;
220219
gap: 0.5rem;
221220
}
222221
@media (min-width: 50rem) {
223-
.device-filter__search {
224-
margin-right: auto;
222+
.device-filter__body {
223+
flex-direction: row;
224+
align-items: flex-start;
225+
gap: 1rem;
225226
}
226227
}
227228

228229
.device-filter__search {
229-
flex: 0 1 260px;
230-
min-width: 180px;
231230
display: flex;
232231
align-items: center;
233232
gap: 0.5rem;
@@ -236,9 +235,28 @@ header.header .social-icons::after {
236235
border: 1px solid var(--sl-color-hairline);
237236
border-radius: 0.4rem;
238237
}
239-
@media (max-width: 47.99rem) {
238+
@media (min-width: 50rem) {
240239
.device-filter__search {
241-
flex: 1 1 100%;
240+
flex: 1;
241+
min-width: 0;
242+
}
243+
}
244+
245+
.device-filter__tags {
246+
display: flex;
247+
flex-direction: column;
248+
gap: 0.5rem;
249+
flex: 1;
250+
min-width: 0;
251+
}
252+
.device-filter__tag-row {
253+
display: flex;
254+
flex-wrap: wrap;
255+
gap: 0.5rem;
256+
}
257+
@media (min-width: 50rem) {
258+
.device-filter__tag-row {
259+
justify-content: flex-end;
242260
}
243261
}
244262
.device-filter__search:focus-within {
@@ -535,9 +553,11 @@ nav.sidebar details:has(> summary[id*="authors"]) {
535553
border: 1px solid var(--sl-color-accent-low);
536554
padding: 0.15rem 0.45rem;
537555
border-radius: 0.4rem;
538-
margin-inline-end: 0.4rem;
539556
vertical-align: middle;
540557
}
558+
.sl-markdown-content .usage-list .tag.tag-usages {
559+
margin-inline-end: 0.4rem;
560+
}
541561
.sl-markdown-content ul.usage-list {
542562
list-style: none;
543563
padding-left: 0;

0 commit comments

Comments
 (0)