+
this._handleClick(entities.solar)}>
${renderMainIcon('solar', solarVal, iconSolar, solarColor)}
- ${renderLabel(labelSolarText, showLabelSolar)}
-
${this._formatPower(solarVal)}
+ ${renderSecondaryOrLabel(labelSolarText, showLabelSolar, entities.secondary_solar, hasSecondarySolar)}
+
${this._formatPower(solarVal)}
` : ''}
${hasGrid ? html`
-
- ${renderMainIcon('grid', gridImport, iconGrid, gridColor)}
- ${renderLabel(labelGridText, showLabelGrid)}
-
${this._formatPower(gridImport)}
+
this._handleClick(entities.grid_combined || entities.grid)}>
+ ${renderMainIcon('grid', isGridExporting ? gridExport : gridImport, iconGrid, gridIconColor)}
+ ${renderSecondaryOrLabel(labelGridText, showLabelGrid, entities.secondary_grid, hasSecondaryGrid)}
+
+ ${isGridExporting ? html`▲` : (isGridActive ? html`▼` : '')}
+ ${this._formatPower(isGridExporting ? gridExport : gridImport)}
+
` : ''}
${hasBattery ? html`
-
+
this._handleClick(entities.battery)}>
${renderMainIcon('battery', battSoc, iconBattery)}
- ${renderLabel(labelBatteryText, showLabelBattery)}
-
${Math.round(battSoc)}%
+ ${renderSecondaryOrLabel(labelBatteryText, showLabelBattery, entities.secondary_battery, hasSecondaryBattery)}
+
${Math.round(battSoc)}%
` : ''}
-
- ${renderMainIcon('house', 0, null, houseDominantColor)}
+
this._handleClick(entities.house)}>
+ ${renderMainIcon('house', 0, null, this.config.color_icon_house ? 'var(--icon-house-color)' : houseDominantColor)}
${renderLabel(labelHouseText, showLabelHouse)}
-
${this._formatPower(house)}
+
${this._formatPower(houseDisplay)}
- ${renderConsumer(showC1, 'c1', 'consumer_1', labelC1, 'car', c1Val, '#a855f7')}
- ${renderConsumer(showC2, 'c2', 'consumer_2', labelC2, 'heater', c2Val, '#f97316')}
- ${renderConsumer(showC3, 'c3', 'consumer_3', labelC3, 'pool', c3Val, '#06b6d4')}
+ ${renderConsumer(showC1, 'c1', 'consumer_1', labelC1, 'car', c1Val, this._getConsumerColor(1))}
+ ${renderConsumer(showC2, 'c2', 'consumer_2', labelC2, 'heater', c2Val, this._getConsumerColor(2))}
+ ${renderConsumer(showC3, 'c3', 'consumer_3', labelC3, 'pool', c3Val, this._getConsumerColor(3))}
diff --git a/docs/README-de.md b/docs/README-de.md
index 88e103c..8f75370 100644
--- a/docs/README-de.md
+++ b/docs/README-de.md
@@ -9,10 +9,12 @@
# Power Flux Card
-Die ⚡Power Flux Card ist eine erweiterte, animierte Energiefluss-Karte für Home Assistant. Sie visualisiert die Energieverteilung zwischen Solar, Netz, Batterie und Verbrauchern mit wunderschönen Neon-Effekten und flüssigen Animationen.
+Die ⚡Power Flux Card ist eine erweiterte, animierte Energiefluss-Karte für Home Assistant. Sie visualisiert die Energieverteilung zwischen Solar, Netz, Batterie und Verbrauchern mit wunderschönen Neon-Effekten und verschiedenen Animationen.
+
+Wenn euch die custom Card gefällt, würde ich mich sehr über eine Sternebewertung ⭐ freuen. 🤗

-

+

### ✨ Funktionen
@@ -24,9 +26,21 @@ Die ⚡Power Flux Card ist eine erweiterte, animierte Energiefluss-Karte für Ho
- **Donut Chart**: Optionales Donut-Diagramm um das Haus-Icon, das den Energiemix zeigt.
- **Kometenschweif / Gestrichelte Linien**: Wählen Sie Ihren bevorzugten Animationsstil.
- **Zoom**: Anpassbare Größe für Ihr Dashboard.
+ - **Benutzerdefinierte Farben**: Definiere benutzerdefinierte Farben für jede Quelle und jeden Verbraucher über den Editor.
+ - **Hintergrundfarbe**: Aktiviere einen leicht getönten Hintergrund für die Kreise in der Standard-Ansicht.
+- **Dynamische Animationsgeschwindigkeit**: Partikelgeschwindigkeit und -dichte passen sich dem aktuellen Energiefluss an.
+- **Weitere Informationen**: Klicke auf eine beliebige Quelle/Verbraucher, um detaillierte Informationen in einem More-Info-Dialog anzuzeigen.
+- **Netz-Import/Export**: Unterstützt sowohl separate Import/Export-Entitäten als auch eine kombinierte Entität mit positiven/negativen Werten.
+- **Netz-zu-Batterie**: Optionaler direkter Sensor für den Netz-zu-Batterie-Fluss, der die Standardberechnung umgeht.
+- **Sekundäre Sensoren**: Optional können sekundäre Sensorwerte in den Hauptkreisen (z.B. Tagesertrag für Solar, aktuelle Lade-/Entladeleistung für Batterie) angezeigt werden.
- **Lokalisierung**: Vollständig übersetzt in Deutsch und Englisch.
- **Visueller Editor**: Einfache Konfiguration über die Home Assistant UI.
+[](https://www.youtube.com/watch?v=HGFBJJRWGW0
+)
+
+---
+
### 🚀 Installation
### HACS (Empfohlen)
@@ -48,9 +62,12 @@ Die ⚡Power Flux Card ist eine erweiterte, animierte Energiefluss-Karte für Ho
1. Lade die Datei `power-flux-card.js` von der [Releases](../../releases)-Seite herunter.
2. Lade sie in Ihren `www/community/power-flux-card/`-Ordner in Home Assistant hoch.
3. Füge die Ressource in Ihrer Dashboard-Konfiguration hinzu:
- - URL: `/local/power-flux-card.js`
+ - URL: `/local/community/power-flux-card/power-flux-card.js`
- Typ: JavaScript Module
+
+---
+
### ⚙️ Konfiguration
Du kannst die Karte direkt über den visuellen Editor in Home Assistant konfigurieren.
@@ -69,3 +86,151 @@ Du kannst die Karte direkt über den visuellen Editor in Home Assistant konfigur
- **Donut Chart**: Zeigt den Energiemix als Ring um das Haus an.
- **Kometenschweif / Gestrichelte Linie**: Ändern Sie den Stil der Flussanimation.
- **Kompakte Ansicht**: Wechseln Sie zum Balkendiagramm-Layout.
+- **Farboptionen**: Definieren Sie benutzerdefinierte Farben für jede Quelle und Verbraucher.
+- **Netz-Import/Export**: Konfigurieren Sie separate oder kombinierte Entitäten.
+- **Netz-zu-Batterie**: Optionaler direkter Sensor für den Netz-zu-Batterie-Fluss.
+- **Batterie getrennte Sensoren**: Optional separate Sensoren für Batterie-Ladung und -Entladung.
+- **Sekundäre Sensoren**: Zeigen Sie alternative Werte in den Hauptkreisen an (z.B. Tagesertrag, aktuelle Ladeleistung).
+
+
+
+ Custom Farben mit card_mod und Jinja2 Templates
+
+Mit der [card_mod](https://github.com/thomasloven/lovelace-card-mod) Integration können die CSS-Variablen der Power Flux Card dynamisch per Jinja2-Templates überschrieben werden. So lassen sich Farben abhängig von Sensorwerten ändern — z.B. Solar-Icon grün bei Produktion, grau bei Stillstand.
+
+### Verfügbare CSS-Variablen
+
+| Variable | Beschreibung |
+|---|---|
+| `--neon-yellow` | Bubble-Farbe Solar |
+| `--neon-blue` | Bubble-Farbe Grid |
+| `--neon-green` | Bubble-Farbe Batterie |
+| `--neon-pink` | Bubble-Farbe Haus |
+| `--pipe-solar-color` | Pipe-Farbe Solar |
+| `--pipe-grid-color` | Pipe-Farbe Grid |
+| `--pipe-battery-color` | Pipe-Farbe Batterie |
+| `--icon-solar-color` | Icon-Farbe Solar |
+| `--icon-grid-color` | Icon-Farbe Grid |
+| `--icon-battery-color` | Icon-Farbe Batterie |
+| `--icon-house-color` | Icon-Farbe Haus |
+| `--icon-consumer-1-color` | Icon-Farbe Consumer 1 |
+| `--text-solar-color` | Text-Farbe Solar |
+| `--text-grid-color` | Text-Farbe Grid |
+| `--text-battery-color` | Text-Farbe Batterie |
+| `--text-house-color` | Text-Farbe Haus |
+| `--text-consumer-1-color` | Text-Farbe Consumer 1 |
+| `--consumer-1-color` | Bubble-Farbe Consumer 1 |
+| `--consumer-2-color` | Bubble-Farbe Consumer 2 |
+| `--consumer-3-color` | Bubble-Farbe Consumer 3 |
+| `--export-color` | Farbe für Export |
+
+### Beispiel 1: Solar-Icon — grün bei Produktion, grau bei Stillstand
+
+```yaml
+type: custom:power-flux-card
+entities:
+ solar: sensor.solar_power
+ grid: sensor.grid_power
+ battery: sensor.battery_power
+ battery_soc: sensor.battery_soc
+card_mod:
+ style: |
+ :host {
+ {% if states('sensor.solar_power') | float > 0 %}
+ --icon-solar-color: #00ff88;
+ {% else %}
+ --icon-solar-color: #9e9e9e;
+ {% endif %}
+ }
+```
+
+### Beispiel 2: Grid-Textfarbe — rot bei Export, blau bei Import
+
+```yaml
+type: custom:power-flux-card
+entities:
+ solar: sensor.solar_power
+ grid_combined: sensor.grid_power_combined
+ battery: sensor.battery_power
+ battery_soc: sensor.battery_soc
+card_mod:
+ style: |
+ :host {
+ {% if states('sensor.grid_power_combined') | float < 0 %}
+ --text-grid-color: #ff3333;
+ {% else %}
+ --text-grid-color: #3b82f6;
+ {% endif %}
+ }
+```
+
+### Beispiel 3: Batterie-Bubble — Farbe nach Ladestand (SoC)
+
+```yaml
+type: custom:power-flux-card
+entities:
+ solar: sensor.solar_power
+ grid: sensor.grid_power
+ battery: sensor.battery_power
+ battery_soc: sensor.battery_soc
+card_mod:
+ style: |
+ :host {
+ {% set soc = states('sensor.battery_soc') | float %}
+ {% if soc > 80 %}
+ --neon-green: #00ff88;
+ {% elif soc > 30 %}
+ --neon-green: #f59e0b;
+ {% else %}
+ --neon-green: #ff3333;
+ {% endif %}
+ }
+```
+
+### Beispiel 4: Consumer-1-Pipe — sichtbar nur bei hoher Leistung, sonst transparent
+
+```yaml
+type: custom:power-flux-card
+entities:
+ solar: sensor.solar_power
+ grid: sensor.grid_power
+ battery: sensor.battery_power
+ battery_soc: sensor.battery_soc
+ consumer_1: sensor.wallbox_power
+card_mod:
+ style: |
+ :host {
+ {% if states('sensor.wallbox_power') | float > 500 %}
+ --pipe-consumer-1-color: #a855f7;
+ --icon-consumer-1-color: #a855f7;
+ {% else %}
+ --pipe-consumer-1-color: rgba(168, 85, 247, 0.2);
+ --icon-consumer-1-color: #9e9e9e;
+ {% endif %}
+ }
+```
+
+### Beispiel 5: Mehrere Farben gleichzeitig — Nachtmodus (alles gedimmt wenn Solar = 0)
+
+```yaml
+type: custom:power-flux-card
+entities:
+ solar: sensor.solar_power
+ grid: sensor.grid_power
+ battery: sensor.battery_power
+ battery_soc: sensor.battery_soc
+ consumer_1: sensor.wallbox_power
+card_mod:
+ style: |
+ :host {
+ {% if states('sensor.solar_power') | float == 0 %}
+ --icon-solar-color: #555555;
+ --text-solar-color: #777777;
+ --neon-yellow: #666633;
+ --pipe-solar-color: #444422;
+ {% endif %}
+ }
+```
+
+> **Hinweis:** card_mod muss separat über HACS installiert werden. Die Templates werden bei jedem State-Update ausgewertet, die Farben ändern sich also in Echtzeit.
+
\ No newline at end of file
diff --git a/docs/images/power-flux-card-compact.jpg b/docs/images/power-flux-card-compact.jpg
index 1c9f043..19fafd0 100644
Binary files a/docs/images/power-flux-card-compact.jpg and b/docs/images/power-flux-card-compact.jpg differ
diff --git a/docs/images/power-flux-card-compact2.jpg b/docs/images/power-flux-card-compact2.jpg
new file mode 100644
index 0000000..04dc763
Binary files /dev/null and b/docs/images/power-flux-card-compact2.jpg differ
diff --git a/src/lang-de.js b/src/lang-de.js
index bb15bc2..8e7845b 100644
--- a/src/lang-de.js
+++ b/src/lang-de.js
@@ -13,14 +13,14 @@ export default {
"editor.label_toggle": "Label im Kreis anzeigen",
"editor.compact_view": "Kompakte Ansicht (evcc)",
"editor.hide_inactive": "Inaktive Röhren ausblenden",
- "editor.entity": "Entität (Watt)",
+ "editor.entity": "Kombinierter Batterie Sensor (W)",
"editor.label": "Beschriftung",
"editor.icon": "Icon",
"editor.back": "Zurück",
"editor.battery_soc_label": "Ladestand (%)",
"editor.house_total_title": "🏠 Gesamtverbrauch (optional)",
"editor.house_sensor_label": "Sensor für Hausverbrauch (optional)",
- "editor.house_sensor_hint": "Wird benötigt, damit das Haus-Icon anklickbar ist (compact view).",
+ "editor.house_sensor_hint": "Wird benötigt, damit das Haus-Icon anklickbar ist (more-details). Ansonsten wird der Hausverbrauch berechnet.",
"editor.consumer_1_title": "🚗 Links (Lila)",
"editor.consumer_2_title": "♨️ Mitte (Orange)",
"editor.consumer_3_title": "🏊 Rechts (Türkis)",
@@ -29,8 +29,27 @@ export default {
"editor.donut_chart": "Donut Chart (Grid/Haus)",
"editor.comet_tail": "Comet Tail Effect",
"editor.dashed_line": "Dashed Line Effect",
+ "editor.tinted_background": "Farbiger Hintergrund in Kreisen",
"editor.colored_values": "Farbige Textwerte",
"editor.hide_consumer_icons": "Icons unten ausblenden",
+ "editor.invert_consumer_1": "Sensorwert invertieren (+/-)",
+ "editor.secondary_sensor": "Zweiter Sensor (nur Anzeige)",
+ "editor.grid_to_battery_sensor": "Netz-zu-Batterie Sensor (W, Optional)",
+ "editor.grid_to_battery_hint": "Optional: separater Sensor für den Netz-zu-Batterie Fluss. Wenn leer, wird der Wert automatisch berechnet.",
+ "editor.grid_combined_sensor": "Kombinierter Netz-Sensor (W, Optional)",
+ "editor.grid_combined_hint": "Ein Sensor für Import UND Export: positiv = Import, negativ = Export. Überschreibt den kombinierten Import/Export Sensor.",
+ "editor.color_picker": "Bubble",
+ "editor.pipe_color": "Pipe",
+ "editor.export_color": "Export",
+ "editor.consumer_unit_kw": "Sensor meldet in kW",
+ "editor.show_consumer_always": "Verbraucher bei null Watt anzeigen",
+ "editor.battery_charge_sensor": "Batterie-Ladung Sensor (W, Optional)",
+ "editor.battery_discharge_sensor": "Batterie-Entladung Sensor (W, Optional)",
+ "editor.battery_separate_hint": "Optional: Separate Sensoren für Laden/Entladen. Überschreiben den Hauptsensor für die Berechnung.",
+ "editor.consumer_1_hide_pipe": "Pipe bei geringer Leistung ausblenden",
+ "editor.consumer_pipe_threshold": "Pipe-Schwellenwert (Watt)",
+ "editor.text_color": "Text",
+ "editor.icon_color": "Icon",
},
card: {
"card.label_solar": "Solar",
@@ -38,7 +57,7 @@ export default {
"card.label_battery": "Batterie",
"card.label_house": "Verbrauch",
"card.label_car": "E-Auto",
- "card.label_import": "Import",
- "card.label_export": "Export",
+ "card.label_heater": "Heizung",
+ "card.label_pool": "Pool",
}
};
diff --git a/src/lang-en.js b/src/lang-en.js
index 774f660..46ae1ca 100644
--- a/src/lang-en.js
+++ b/src/lang-en.js
@@ -13,14 +13,14 @@ export default {
"editor.label_toggle": "Show Label in Bubble",
"editor.compact_view": "Compact View (evcc)",
"editor.hide_inactive": "Hide Inactive Pipes",
- "editor.entity": "Entity (Watt)",
+ "editor.entity": "Combined Battery Sensor (W)",
"editor.label": "Label",
"editor.icon": "Icon",
"editor.back": "Back",
"editor.battery_soc_label": "State of Charge (%)",
"editor.house_total_title": "🏠 Total Consumption (optional)",
"editor.house_sensor_label": "Sensor for House Consumption (optional)",
- "editor.house_sensor_hint": "Required to make the house icon clickable (compact view).",
+ "editor.house_sensor_hint": "Required to make the house icon clickable (more-details). Otherwise, the house consumption is calculated.",
"editor.consumer_1_title": "🚗 Left (Purple)",
"editor.consumer_2_title": "♨️ Center (Orange)",
"editor.consumer_3_title": "🏊 Right (Cyan)",
@@ -29,8 +29,27 @@ export default {
"editor.donut_chart": "Donut Chart (Grid/House)",
"editor.comet_tail": "Comet Tail Effect",
"editor.dashed_line": "Dashed Line Effect",
+ "editor.tinted_background": "Tinted Background in Bubbles",
"editor.colored_values": "Colored Text Values",
"editor.hide_consumer_icons": "Hide Consumer Icons",
+ "editor.invert_consumer_1": "Invert Sensor Value (+/-)",
+ "editor.secondary_sensor": "Secondary Sensor (display only)",
+ "editor.grid_to_battery_sensor": "Grid to Battery Sensor (W, optional)",
+ "editor.grid_to_battery_hint": "Optional: separate sensor for grid-to-battery flow. If empty, the value is calculated automatically.",
+ "editor.grid_combined_sensor": "Combined Grid Sensor (W, Optional)",
+ "editor.grid_combined_hint": "Single sensor for import AND export: positive = import, negative = export. Overrides combined import/export sensor.",
+ "editor.color_picker": "Bubble Color",
+ "editor.pipe_color": "Pipe Color",
+ "editor.export_color": "Export Color",
+ "editor.consumer_unit_kw": "Sensor reports in kW",
+ "editor.show_consumer_always": "Show Consumers at zero watts",
+ "editor.battery_charge_sensor": "Battery Charge Sensor (W, Optional)",
+ "editor.battery_discharge_sensor": "Battery Discharge Sensor (W, Optional)",
+ "editor.battery_separate_hint": "Optional: Separate sensors for charge/discharge. Override the main sensor for calculations.",
+ "editor.consumer_1_hide_pipe": "Hide pipe at low power",
+ "editor.consumer_pipe_threshold": "Pipe Threshold (Watts)",
+ "editor.text_color": "Text Color",
+ "editor.icon_color": "Icon Color",
},
card: {
"card.label_solar": "Solar",
@@ -38,7 +57,7 @@ export default {
"card.label_battery": "Battery",
"card.label_house": "Consumption",
"card.label_car": "Car",
- "card.label_import": "Import",
- "card.label_export": "Export",
+ "card.label_heater": "Heater",
+ "card.label_pool": "Pool",
}
};
diff --git a/src/power-flux-card-editor.js b/src/power-flux-card-editor.js
index fc488e0..7702902 100644
--- a/src/power-flux-card-editor.js
+++ b/src/power-flux-card-editor.js
@@ -48,7 +48,7 @@ class PowerFluxCardEditor extends LitElement {
if (!this._config || !this.hass) return;
const target = ev.target;
- const key = target.configValue || this._currentConfigValue;
+ const key = target.configValue;
let value;
if (target.tagName === 'HA-SWITCH') {
@@ -65,10 +65,13 @@ class PowerFluxCardEditor extends LitElement {
if (key) {
const entityKeys = [
- 'solar', 'grid', 'grid_export',
- 'battery', 'battery_soc',
+ 'solar', 'grid', 'grid_export', 'grid_combined',
+ 'battery', 'battery_soc', 'grid_to_battery',
+ 'battery_charge', 'battery_discharge',
'house',
- 'consumer_1', 'consumer_2', 'consumer_3'
+ 'consumer_1', 'consumer_2', 'consumer_3',
+ 'secondary_solar', 'secondary_grid', 'secondary_battery',
+ 'secondary_consumer_1', 'secondary_consumer_2', 'secondary_consumer_3'
];
let newConfig = { ...this._config };
@@ -101,6 +104,93 @@ class PowerFluxCardEditor extends LitElement {
this._subView = null;
}
+ _clearEntity(key) {
+ const newConfig = { ...this._config };
+ const currentEntities = newConfig.entities || {};
+ const newEntities = { ...currentEntities, [key]: "" };
+ newConfig.entities = newEntities;
+ this._config = newConfig;
+ fireEvent(this, "config-changed", { config: this._config });
+ }
+
+ _colorChanged(key, ev) {
+ const newConfig = { ...this._config, [key]: ev.target.value };
+ this._config = newConfig;
+ fireEvent(this, "config-changed", { config: this._config });
+ }
+
+ _resetColor(key) {
+ const newConfig = { ...this._config };
+ delete newConfig[key];
+ this._config = newConfig;
+ fireEvent(this, "config-changed", { config: this._config });
+ }
+
+ _renderEntitySelector(entitySelectorSchema, value, configValue, label) {
+ const val = value || "";
+ return html`
+
+
+ ${val ? html` this._clearEntity(configValue)}
+ >` : ''}
+
+ `;
+ }
+
+ _renderColorPicker(key, label, defaultColor) {
+ const currentColor = this._config[key] || defaultColor;
+ const hasCustom = !!this._config[key];
+ return html`
+
+ this._colorChanged(key, e)}>
+ ${label}
+ ${hasCustom ? html` this._resetColor(key)}>` : ''}
+
+ `;
+ }
+
+ _renderColorPickerQuad(bubbleKey, pipeKey, textKey, iconKey, defaultColor) {
+ const items = [
+ { key: bubbleKey, label: this._localize('editor.color_picker'), default: defaultColor },
+ ];
+ if (pipeKey) items.push({ key: pipeKey, label: this._localize('editor.pipe_color'), default: defaultColor });
+ items.push({ key: textKey, label: this._localize('editor.text_color'), default: defaultColor });
+ items.push({ key: iconKey, label: this._localize('editor.icon_color'), default: defaultColor });
+ return html`
+
+ ${items.map(item => {
+ const color = this._config[item.key] || item.default;
+ const hasCustom = !!this._config[item.key];
+ return html`
+
+ this._colorChanged(item.key, e)}>
+ ${item.label}
+ ${hasCustom ? html` this._resetColor(item.key)}>` : ''}
+
+ `;
+ })}
+
+ `;
+ }
+
static get styles() {
return css`
.card-config {
@@ -179,6 +269,67 @@ class PowerFluxCardEditor extends LitElement {
border-bottom: 1px solid var(--divider-color);
margin: 10px 0;
}
+ .entity-picker-wrapper {
+ position: relative;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ }
+ .entity-picker-wrapper ha-selector {
+ flex: 1;
+ }
+ .clear-entity-btn {
+ --mdc-icon-size: 20px;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ flex-shrink: 0;
+ margin-top: -12px;
+ }
+ .clear-entity-btn:hover {
+ color: var(--error-color, #db4437);
+ }
+ .color-picker-row {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 8px 0;
+ }
+ .color-picker-row input[type="color"] {
+ -webkit-appearance: none;
+ border: 2px solid var(--divider-color);
+ border-radius: 50%;
+ width: 30px;
+ height: 30px;
+ padding: 2px;
+ cursor: pointer;
+ background: transparent;
+ }
+ .color-picker-row input[type="color"]::-webkit-color-swatch-wrapper {
+ padding: 0;
+ }
+ .color-picker-row input[type="color"]::-webkit-color-swatch {
+ border: none;
+ border-radius: 50%;
+ }
+ .color-label {
+ flex: 1;
+ font-size: 14px;
+ }
+ .color-reset-btn {
+ --mdc-icon-size: 20px;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ }
+ .color-reset-btn:hover {
+ color: var(--primary-color);
+ }
+ .color-picker-quad {
+ display: flex;
+ gap: 8px;
+ }
+ .color-picker-quad .color-picker-row {
+ flex: 1;
+ }
`;
}
@@ -193,14 +344,7 @@ class PowerFluxCardEditor extends LitElement {
${this._localize('editor.solar_section')}
-
+ ${this._renderEntitySelector(entitySelectorSchema, entities.solar, 'solar', this._localize('editor.entity'))}
@@ -222,6 +366,10 @@ class PowerFluxCardEditor extends LitElement {
@value-changed=${this._valueChanged}
>
+ ${this._renderEntitySelector(entitySelectorSchema, entities.secondary_solar || "", 'secondary_solar', this._localize('editor.secondary_sensor'))}
+
+ ${this._renderColorPickerQuad('color_solar', 'color_pipe_solar', 'color_text_solar', 'color_icon_solar', '#ffdd00')}
+
@@ -253,23 +401,18 @@ class PowerFluxCardEditor extends LitElement {
${this._localize('editor.grid_section')}
-
+ ${this._renderEntitySelector(entitySelectorSchema, entities.grid_combined || "", 'grid_combined', this._localize('editor.grid_combined_sensor'))}
+
+
-
+
+ ${this._localize('editor.grid_combined_hint')}
+
+
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.grid, 'grid', this._localize('card.label_import') + " (W)")}
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.grid_export, 'grid_export', this._localize('card.label_export') + " (W, Optional)")}
@@ -291,6 +434,12 @@ class PowerFluxCardEditor extends LitElement {
@value-changed=${this._valueChanged}
>
+ ${this._renderEntitySelector(entitySelectorSchema, entities.secondary_grid || "", 'secondary_grid', this._localize('editor.secondary_sensor'))}
+
+ ${this._renderColorPickerQuad('color_grid', 'color_pipe_grid', 'color_text_grid', 'color_icon_grid', '#3b82f6')}
+
+ ${this._renderColorPicker('color_export', this._localize('editor.export_color'), '#ff3333')}
+
@@ -322,24 +471,16 @@ class PowerFluxCardEditor extends LitElement {
${this._localize('editor.battery_section')}
-
+ ${this._renderEntitySelector(entitySelectorSchema, entities.battery, 'battery', this._localize('editor.entity'))}
+
+
+
+
+ ${this._localize('editor.battery_separate_hint')}
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.battery_charge || "", 'battery_charge', this._localize('editor.battery_charge_sensor'))}
+ ${this._renderEntitySelector(entitySelectorSchema, entities.battery_discharge || "", 'battery_discharge', this._localize('editor.battery_discharge_sensor'))}
-
-
+
+
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.battery_soc, 'battery_soc', this._localize('editor.battery_soc_label'))}
+
+
+
+
+ ${this._localize('editor.grid_to_battery_hint')}
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.grid_to_battery || "", 'grid_to_battery', this._localize('editor.grid_to_battery_sensor'))}
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.secondary_battery || "", 'secondary_battery', this._localize('editor.secondary_sensor'))}
+
+ ${this._renderColorPickerQuad('color_battery', 'color_pipe_battery', 'color_text_battery', 'color_icon_battery', '#00ff88')}
@@ -402,29 +558,17 @@ class PowerFluxCardEditor extends LitElement {
${this._localize('editor.house_total_title')}
-
+ ${this._renderEntitySelector(entitySelectorSchema, entities.house || "", 'house', this._localize('editor.house_sensor_label'))}
${this._localize('editor.house_sensor_hint')}
+
+ ${this._renderColorPickerQuad('color_house', null, 'color_text_house', 'color_icon_house', '#ff0080')}
${this._localize('editor.consumer_1_title')}
-
+ ${this._renderEntitySelector(entitySelectorSchema, entities.consumer_1, 'consumer_1', this._localize('editor.entity'))}
+
+
+ ${this._localize('editor.invert_consumer_1')}
+
+
+
+
+ ${this._localize('editor.consumer_1_hide_pipe')}
+
+
+
+ ${this._config.consumer_1_hide_pipe === true ? html`
+
+ ` : ''}
+
+
+ ${this._localize('editor.consumer_unit_kw')}
+
+
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.secondary_consumer_1 || "", 'secondary_consumer_1', this._localize('editor.secondary_sensor'))}
+
+ ${this._renderColorPickerQuad('color_consumer_1', 'color_pipe_consumer_1', 'color_text_consumer_1', 'color_icon_consumer_1', '#a855f7')}
${this._localize('editor.consumer_2_title')}
-
+ ${this._renderEntitySelector(entitySelectorSchema, entities.consumer_2, 'consumer_2', this._localize('editor.entity'))}
+
+
+ ${this._localize('editor.consumer_unit_kw')}
+
+
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.secondary_consumer_2 || "", 'secondary_consumer_2', this._localize('editor.secondary_sensor'))}
+
+ ${this._renderColorPickerQuad('color_consumer_2', 'color_pipe_consumer_2', 'color_text_consumer_2', 'color_icon_consumer_2', '#f97316')}
${this._localize('editor.consumer_3_title')}
-
+ ${this._renderEntitySelector(entitySelectorSchema, entities.consumer_3, 'consumer_3', this._localize('editor.entity'))}
+
+
+ ${this._localize('editor.consumer_unit_kw')}
+
+
+
+ ${this._renderEntitySelector(entitySelectorSchema, entities.secondary_consumer_3 || "", 'secondary_consumer_3', this._localize('editor.secondary_sensor'))}
+
+ ${this._renderColorPickerQuad('color_consumer_3', 'color_pipe_consumer_3', 'color_text_consumer_3', 'color_icon_consumer_3', '#06b6d4')}
`;
}
@@ -600,6 +798,15 @@ class PowerFluxCardEditor extends LitElement {
${this._localize('editor.dashed_line')}