Skip to content

Commit a584995

Browse files
authored
added possibility to use invidual entities instead of whole device. added new optional parameter for max input power per mppt (#2)
1 parent b5d2bcc commit a584995

2 files changed

Lines changed: 101 additions & 25 deletions

File tree

README.md

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
Eine Home Assistand Custom Card für den Marstek B2500d Speicher.
44

5+
Da man aber auch einzelne Entitäten und Optionen angeben kann, eignet sich diese Karte auch für andere Speicher!
6+
57
<u>Große Karte:</u>
68

79
![Beispielcard](./examples/Screenshot.png)
@@ -57,6 +59,8 @@ Aktuell können folgende Modi eingestellt/umgestellt bzw. angezeigt werden
5759

5860
Wobei jede dieser einzelnen Karten auch optional ausgeblendet werden können, siehe Abschnitt Parameter
5961

62+
Hinweis: Die Einstellungskarte wird standardmäßig im Entitätsmodus ausgeblendet!
63+
6064
#### Kompakte Karte
6165
Diese Karte lässt sich nicht anpassen
6266

@@ -65,12 +69,15 @@ Diese Karte lässt sich nicht anpassen
6569

6670
## ⚙️ Installation
6771

68-
### Abhängigkeiten
69-
Die b2500d-card verwendet man am einfachsten mit einem Gerät was von folgendem Addon stammt:
72+
### Optionale Abhängigkeiten
73+
Optional: Die b2500d-card verwendet man am einfachsten mit einem Gerät was von folgendem Addon stammt:
74+
75+
- [hm2mqtt von @tomquist](https://github.com/tomquist/hm2mqtt)
7076

71-
- [hm2mqtt by tomquist](https://github.com/tomquist/hm2mqtt)
77+
So kann man einfach das ganze Device übergeben. Die Card nutzt die Standard Entities.
78+
Hierfür nutzt du bitte den Parameter device.
7279

73-
So kann man einfach das ganze Device übergeben. Die Card nutzt die Standard Entities. Wurden die Entitäten umbenannt funktioniert dieser einfache Weg nicht mehr.
80+
Wurden die Entitäten umbenannt funktioniert dieser einfache Weg nicht mehr. Du kannst trotzdem dann einzelne Entitäten übergeben. Bitte schaue dir den Abschnitt Parameter an.
7481

7582

7683
### HACS
@@ -99,46 +106,69 @@ resources:
99106
Hier sind die verfügbaren Parameter für diese Lovelace Card beschrieben.
100107
101108
### 🔒 Erforderliche Parameter
109+
Du **musst genau einen** der folgenden Parameter angeben:
110+
111+
| Name | Typ | Beschreibung |
112+
|------------|--------|------------------------------------------------------------------------------|
113+
| `device` | string | Der Name deines Geräts. Heißt z.B. der Sensor für die aktuelle Batterie "sensor.speicher_1_links_battery_percentage" ist <speicher_1_links> der Name des Geräts. |
114+
| `entities` | object | Sammlung einzelner Entitäten, falls du kein komplettes `device` übergeben möchtest. Siehe unten. In diesem Modus wird automatisch die Einstellungskarte ausgeblendet |
115+
116+
---
117+
118+
### 📦 `entities` Objekt
102119

103-
| Name | Typ | Beschreibung |
104-
|--------------|----------|-------------------------------------------|
105-
| `device` | string | Der Name deines Geräts. Heißt z.B. der Sensor für die aktuelle Batterie "sensor.speicher_1_links_battery_percentage" ist <speicher_1_links> der Name des Geräts. |
120+
Wenn du statt `device` einzelne Entitäten angibst, sieht das Objekt so aus:
106121

122+
| Schlüssel | Typ | Beschreibung |
123+
|-------------------------|--------|--------------|
124+
| `battery_percentage` | string | Sensor für Batterieladung in % |
125+
| `battery_capacity` | string | Sensor für verfügbare Batteriekapazität (in Wh) |
126+
| `solar_power` | string | Sensor für gesamte Solarleistung |
127+
| `p1_power` | string | Sensor für PV-String 1 |
128+
| `p2_power` | string | Sensor für PV-String 2 |
129+
| `output_power` | string | Sensor für Gesamt-Ausgangsleistung |
130+
| `production_today` | string | Sensor für die tägliche PV-Erzeugung (in Wh) |
131+
132+
---
133+
Du musst nicht zwingend alle Entitäten angeben. Entitäten die du nicht übergibst sind automatisch 0. Für die kompakte Karte reicht es z.B. aus `battery_percentage`, `solar_power` und `output_power` anzugeben.
107134

108135
### 🧩 Optionale Parameter
109136

110137
| Name | Typ | Beschreibung | Standardwert |
111138
|----------------|----------|------------------------------------------------------------|------------------|
112-
| `name` | string | Wie heißt dein Speicher ? Der Name wird oben links in der Karte angezeigt | Std. Gerätename (also z.B. "speicher_1_links" |
139+
| `name` | string | Wie heißt dein Speicher ? Der Name wird oben links in der Karte angezeigt | Std. Gerätename (also z.B. `speicher_1_links` |
113140
| `output` | boolean | Legt fest, ob die Karte Ausgangsleistung angezeigt werden soll | `true` |
114141
| `battery` | boolean | Legt fest, ob die Karte Batterie angezeigt werden soll | `true`|
115142
| `production` | boolean | Legt fest, ob die Karte Stromerzeugung angezeigt werden soll | `true` |
116143
| `settings` | boolean | Legt fest, ob die Karte Einstellungen angezeigt werden soll | `true`|
117144
| `solar` | boolean | Legt fest, ob die Karte Solarenergie angezeigt werden soll | `true`|
118145
| `compact` | boolean | Zeigt die kompakte Variante an | `false`|
146+
| `max_input_power` | number | Maximalleistung in W pro Eingang (Skalierung der Balkenanzeige P1 und P2) | `600` |
119147

120148
### 📘 Beispielkonfiguration
149+
#### mit Device
150+
121151
Füge die komplette Karte ganz einfach in dein Dashboard ein
122152
```yaml
123153
type: custom:b2500d-card
124-
device: speicher_1_links
125-
name: Speicher 1 links
154+
device: speicher_2_rechts
155+
name: Speicher 2 rechts
126156
```
127157

128158
Karte Einstellungen ausblenden:
129159
```yaml
130160
type: custom:b2500d-card
131-
device: speicher_1_links
132-
name: Speicher 1 links
161+
device: speicher_2_rechts
162+
name: Speicher 2 rechts
133163
settings: false
134164
```
135165
![Modus off](./examples/Modus_off.png)
136166

137167
Zeigt nur die Karte Solarenergie an:
138168
```yaml
139169
type: custom:b2500d-card
140-
device: speicher_1_links
141-
name: Speicher 1 links
170+
device: speicher_2_rechts
171+
name: Speicher 2 rechts
142172
settings: false
143173
output: false
144174
production: false
@@ -149,8 +179,8 @@ battery: false
149179
Zeigt nur die Status Karte an:
150180
```yaml
151181
type: custom:b2500d-card
152-
device: speicher_1_links
153-
name: Speicher 1 links
182+
device: speicher_2_rechts
183+
name: Speicher 2 rechts
154184
settings: false
155185
output: false
156186
production: false
@@ -169,5 +199,18 @@ compact: true
169199
![Nur Solarenergie](./examples/Kompakt.png)
170200

171201

202+
#### mit Entitäten
203+
204+
Beispiel mit Entitäten statt device
205+
```yaml
206+
type: custom:b2500d-card
207+
entities:
208+
solar_power: sensor.mein_speicher_total_input_power
209+
battery_capacity: sensor.mein_speicher_battery_capacity
210+
......
211+
name: Mein Speicher
212+
```
213+
214+
172215

173216

b2500d-card.js

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,17 @@ class B2500DCard extends LitElement {
337337
}
338338

339339
setConfig(config) {
340-
if (!config.device) {
341-
throw new Error("You need to define a device!");
342-
}
340+
const { device, entities } = config;
341+
342+
// Prüfen: entweder device oder entities, aber nicht beides
343+
if (device && entities) {
344+
throw new Error("Bitte entweder 'device' oder 'entities' angeben, nicht beides.");
345+
}
346+
347+
if (!device && !entities) {
348+
throw new Error("Du musst entweder 'device' oder 'entities' angeben.");
349+
}
350+
343351
this.config = {
344352
output: true,
345353
battery: true,
@@ -355,6 +363,8 @@ class B2500DCard extends LitElement {
355363
this._hass = hass;
356364
if (!this.config) return;
357365

366+
if (this.config.device) {
367+
// Device-Modus
358368
const device = this.config.device;
359369
const getState = (entity) => hass.states[entity]?.state || 0;
360370

@@ -365,7 +375,22 @@ class B2500DCard extends LitElement {
365375
this._batteryPercent = getState(`sensor.${device}_battery_percentage`);
366376
this._batteryKwh = getState(`sensor.${device}_battery_capacity`) / 1000;
367377
this._productionToday = getState(`sensor.${device}_daily_pv_charging`) / 1000;
368-
378+
} else if (this.config.entities) {
379+
// Entities-Modus
380+
const e = this.config.entities;
381+
const getState = (entity) => hass.states[entity]?.state || 0;
382+
383+
this._solarPower = getState(e.solar_power);
384+
this._p1 = getState(e.p1_power);
385+
this._p2 = getState(e.p2_power);
386+
this._outputPower = getState(e.output_power);
387+
this._batteryPercent = getState(e.battery_percentage);
388+
this._batteryKwh = getState(e.battery_capacity) / 1000;
389+
this._productionToday = getState(e.production_today) / 1000;
390+
391+
//blende die Settingskarte im Entitätsmodus aus
392+
this.config.settings = false;
393+
}
369394
this.requestUpdate();
370395
}
371396

@@ -377,6 +402,13 @@ class B2500DCard extends LitElement {
377402
});
378403
this.dispatchEvent(event);
379404
}
405+
406+
_getEntity(type) {
407+
if (this.config.device) {
408+
return `sensor.${this.config.device}_${type}`;
409+
}
410+
return this.config.entities?.[type] || null;
411+
}
380412

381413
_toggleSwitch(entityId, checked) {
382414
this._hass.callService("switch", checked ? "turn_on" : "turn_off", {
@@ -463,9 +495,10 @@ class B2500DCard extends LitElement {
463495
`;
464496
}
465497

466-
467-
const p1Pct = Math.round((this._p1 / 400) * 100);
468-
const p2Pct = Math.round((this._p2 / 400) * 100);
498+
// Fallback: 600 wenn nix übergeben (standard beim b2500d)
499+
const maxInputPower = this.config.max_input_power || 600;
500+
const p1Pct = Math.round((this._p1 / maxInputPower) * 100);
501+
const p2Pct = Math.round((this._p2 / maxInputPower) * 100);
469502

470503
const selectEntity = this._hass.states[`select.${this.config.device}_charging_mode`];
471504
const switchEntity = this._hass.states[`switch.${this.config.device}_adaptive_mode`];
@@ -549,7 +582,7 @@ class B2500DCard extends LitElement {
549582
rgb(13, 13, 13) ${this._batteryPercent}% 100%
550583
);
551584
"
552-
@click=${() => this._handleMoreInfo(`sensor.${this.config.device}_battery_percentage`)}>
585+
@click=${() => this._handleMoreInfo(this._getEntity("battery_percentage"))}>
553586
<div class="inner" style="position: relative;">
554587
${solar > output && this._batteryPercent < 100 ? html`
555588
<ha-icon
@@ -664,4 +697,4 @@ class B2500DCard extends LitElement {
664697
getCardSize() { return 3; }
665698
}
666699

667-
customElements.define("b2500d-card", B2500DCard);
700+
customElements.define("b2500d-card", B2500DCard);

0 commit comments

Comments
 (0)