[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81228":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":13,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":13,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":19,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":13,"lastSyncTime":29,"discoverSource":30},81228,"ha-solar-dashboard","404GamerNotFound\u002Fha-solar-dashboard","404GamerNotFound","A custom Home Assistant Lovelace card for HACS that renders a modern PV\u002Fenergy overview with an image-based layout.","",null,"JavaScript",26,2,1,0,3,1.43,"MIT License",false,"main",[22,23,24,25],"hacs","hacs-dashboard","hacs-integration","homeassistant","2026-06-12 02:04:12","# HA Solar Dashboard Card\n\nA custom Home Assistant Lovelace card for HACS that renders a modern PV\u002Fenergy overview with an image-based layout.\n\n## Example\n\n![HA Solar Dashboard Card example](https:\u002F\u002Fraw.githubusercontent.com\u002F404GamerNotFound\u002Fha-solar-dashboard\u002Fmain\u002Fexample5.png)\n\n## Features\n\n- Hero background image (your house\u002Fpv design)\n- Automatic day image variants via `sun.sun`: day uses `*_day.png`, night uses the standard image\n- Overlay widgets placed on matching points in the image\n- Selectable house layouts from the `images` folder:\n  - `single_family_home`\n  - `duplex_house`\n  - `terraced_middle_house`\n  - `apartment_building`\n  - `apartment_building_balcony_solar`\n  - `bungalow`\n  - `city_villa`\n  - `city_villa_pitched_roof`\n- Configurable entities for:\n  - Roof PV\n  - Shed PV\n  - Battery\n  - Battery charge\u002Fdischarge flow (signed or split entities)\n  - Inverter power\n  - EV charger power\n  - Optional second EV charger power\n  - PV Total (summary tile below the image)\n  - Optional house consumption power\n  - Optional water meter in `m³`\n  - Optional import\u002Fexport power\n- Individual HUD and summary boxes can be hidden when a device is not present, for example no Wallbox\n- Dynamic tile colors and glow states based on configurable thresholds, for example green for high PV production or orange while importing from the grid\n- Battery state of charge is visualized with a compact fill meter in the battery HUD and tile\n- Optional battery flow badge on the image and battery summary tile: green down arrow for charging\u002Fincoming, red up arrow for discharging\u002Foutgoing; the badge follows the entity unit, so power sensors show `W`\u002F`kW` and energy sensors show `kWh`\n- Optional battery min\u002Fmax SoC entities feed the Advisor Dashboard so reserve and target limits are respected; long high-SoC states are highlighted when the house battery stays between 90 and 100%\n- Optional battery temperature badge on the battery HUD and tile\n- Advisor diagnostics for stale sensors, high grid import despite a full battery, battery temperature limits, very deep SoC, frequent daily battery cycles, and simultaneous split import\u002Fexport readings\n- Animated power flow overlay between the existing image elements, using the configured HUD positions without changing the image files\n- Optional smoke and heat pump image overlays with per-element enable, position, size, and heat pump orientation controls\n- PV, inverter, and EV charger values can show utilization bars based on configurable kW\u002FkWp maxima\n- Optional second EV charger entity, disabled by default and positioned automatically next to the first EV charger\n- Optional EV charger phase badges from separate phase entities (`Auto`, `1`, `2`, or `3`)\n- Optional EV vehicle SoC badges shown next to the EV charger phase badges\n- Optional EV max\u002Ftarget SoC, connected, and charging-enabled entities feed the Advisor Dashboard so surplus charging recommendations respect the vehicle's real charge state; long EV SoC states above 80%\u002F90% trigger prioritized battery-care warnings\n- Optional remaining EV charge time badge, shown only while the EV charger is actively charging\n- Optional import\u002Fexport HUD box, positioned near the lower-right power cable by default, plus a grid status tile showing import, export, or self-sufficient operation\n- Hover tooltips on values show the linked entity, raw state, formatted value, and update time\n- Clickable entity boxes and tiles open a 24\u002F48 hour history chart using Home Assistant history data\n- Dedicated Advisor Dashboard with live status, PV\u002Fgrid\u002Fload\u002Fbattery KPIs, custom KPI values, autarky\u002Fself-consumption estimates, sensor diagnostics, and multiple prioritized recommendations for surplus, grid import, battery state, EV charging, heat pump use, flexible appliances, and unusual PV\u002Fload situations\n- Warning states highlight unavailable\u002Foffline sensors and low battery levels\n- Configurable KPI tiles below the image, including custom labels, entities or static values, units, color, sort position, and tile width\n- Separate environment sensor tiles for values like indoor temperature, hot water temperature, outdoor temperature, pressure, or air quality, using the entity unit by default\n- Optional \"Additional Large Consumers\" tiles for washing machine, dishwasher, fan heater, dryer, domestic hot water heat pump, and one custom device; their power and kWh counter entities feed extra Advisor recommendations\n- Custom standard and daylight images\n- Free X\u002FY positioning for every overlay box\n- Localized card and editor labels based on the Home Assistant language (`en`, `de`, `es`, `fr`, `pl`)\n- Registered for Home Assistant's card picker with a live preview\n- Built-in setup wizard in the card editor that detects likely Home Assistant entities for PV, battery, inverter, wallbox, grid import\u002Fexport, house consumption, water, weather, and kWh counters\n- Dark glass style matching the provided design\n\n## Installation (HACS)\n\n1. Add this repository as a **Custom repository** in HACS with type **Dashboard**. HACS calls Lovelace cards \"Dashboard\" in the UI.\n2. Install **HA Solar Dashboard Card**.\n3. Restart Home Assistant (or reload resources).\n4. Add the card in Lovelace.\n\n## Lovelace resource (if needed)\n\n```yaml\nurl: \u002Fhacsfiles\u002Fha-solar-dashboard\u002Fha-solar-dashboard.js\ntype: module\n```\n\n## Setup wizard\n\nWhen the card is edited in Home Assistant, the editor includes a setup wizard that scans available entities and suggests matching sensors. It can fill only empty fields or replace detected fields on request.\n\nThe wizard uses entity ids, friendly names, units, `device_class`, and `state_class` to suggest common sensors such as PV power, battery SoC and flow, inverter power, wallbox power and badges, grid import\u002Fexport, house consumption, weather, and cumulative kWh counters. Review the suggestions before applying them, especially when your system has multiple inverters, batteries, EV chargers, or split import\u002Fexport sensors.\n\n## Example configuration\n\n```yaml\ntype: custom:ha-solar-dashboard-card\ntitle: Solar Dashboard\nhouse: single_family_home\nview_mode: house\nshow_view_selector: true\nshow_house_selector: true\nshow_environment_sensors: true\nentities:\n  pv_roof_power: sensor.pv_dach_leistung\n  pv_shed_power: sensor.pv_schuppen_leistung\n  battery_level: sensor.batterie_soc\n  # Option A: one signed entity; positive = charging, negative = discharging\n  battery_flow_power: sensor.batterie_leistung\n  # Option B: separate entities; used when the signed entity is empty\n  battery_charge_power: sensor.batterie_ladeleistung\n  battery_discharge_power: sensor.batterie_entladeleistung\n  battery_min_soc: number.batterie_min_soc\n  battery_max_soc: number.batterie_max_soc\n  battery_temperature: sensor.batterie_temperatur\n  battery_cycles_today: sensor.batterie_zyklen_heute\n  inverter_power: sensor.wechselrichter_leistung\n  wallbox_power: sensor.wallbox_leistung\n  wallbox_phase: sensor.wallbox_phasen\n  wallbox_soc: sensor.wallbox_auto_soc\n  wallbox_max_soc: number.wallbox_ziel_soc\n  wallbox_connected: binary_sensor.wallbox_auto_verbunden\n  wallbox_charging_enabled: switch.wallbox_laden_aktiviert\n  wallbox_remaining_time: sensor.wallbox_verbleibende_ladezeit\n  wallbox2_power: sensor.wallbox_2_leistung\n  wallbox2_phase: sensor.wallbox_2_phasen\n  wallbox2_soc: sensor.wallbox_2_auto_soc\n  wallbox2_max_soc: number.wallbox_2_ziel_soc\n  wallbox2_connected: binary_sensor.wallbox_2_auto_verbunden\n  wallbox2_charging_enabled: switch.wallbox_2_laden_aktiviert\n  wallbox2_remaining_time: sensor.wallbox_2_verbleibende_ladezeit\n  pv_total_power: sensor.pv_gesamt_leistung\n  house_consumption_power: sensor.hausverbrauch_leistung\n  water_meter: sensor.wasserzaehler\n  # Option A: one signed entity; positive = import, negative = export\n  import_export_power: sensor.netzbezug_einspeisung\n  # Option B: separate entities; used when the signed entity is empty\n  import_power: sensor.netzbezug_leistung\n  export_power: sensor.netzeinspeisung_leistung\nvisible_boxes:\n  wallbox_power: false\n  wallbox2_power: false\n  water_meter: true\nlabels:\n  pv_roof_power: PV Dach\n  battery_level: Speicher\n  wallbox_power: Wallbox Garage\n  water_meter: Water\n  import_export_power: Grid\n  import_export_import: Import\n  import_export_export: Export\n  import_export_neutral: Self-sufficient\nenergy_entities:\n  pv_roof_power:\n    entity: sensor.pv_dach_energy_total\n  house_consumption_power:\n    entity: sensor.house_consumption_total\nshow_grid_status_tile: true\nshow_power_flows: false\nadvisor_max_suggestions: 8\nimage_overlays:\n  smoke:\n    enabled: false\n    label: Gas\n    entity: sensor.zaehlerstand_2\n    period: 1h\n    left: 58\n    top: 18\n    width: 9\n  heatpump:\n    enabled: false\n    label: Heat pump\n    entity: sensor.heatpump_power\n    left: 82\n    top: 63\n    width: 11\n    orientation: right\npositions:\n  pv_roof_power:\n    left: 64\n    top: 28\n  water_meter:\n    left: 84\n    top: 72\nweather_entity: weather.home\nimage: \u002Flocal\u002Fsolar\u002Fhouse_night.png\nday_image: \u002Flocal\u002Fsolar\u002Fhouse_day.png\nunits:\n  power: auto\n  battery: \"%\"\n  water_meter: m³\npower_display_mode: auto_kw\npower_decimals: 2\ngrid_neutral_threshold: 25\nadvisor_surplus_threshold: 250\nadvisor_import_threshold: 250\nadvisor_high_load_threshold: 3000\nadvisor_stale_sensor_warning_minutes: 30\nadvisor_stale_sensor_critical_minutes: 120\nbattery_low_threshold: 20\nchart_hours: 24\nmax_power_kw:\n  pv_roof_power: 10\n  pv_shed_power: 3\n  pv_total_power: 13\n  inverter_power: 10\n  wallbox_power: 11\n  wallbox2_power: 11\ndynamic_tile_colors: true\ntile_color_rules:\n  pv_total_power:\n    - above: 3000\n      color: \"#34d399\"\n      glow: true\n    - above: 1000\n      color: \"#ffc233\"\n    - below: 100\n      color: \"#9ba3b8\"\n  import_export_power:\n    - gt: 25\n      color: \"#fb923c\"\n      glow: true\n    - lt: -25\n      color: \"#34d399\"\n      glow: true\ncustom_kpis:\n  - label: CO2 saved today\n    entity: sensor.co2_saved_today\n    unit: kg\n    position: 100\n    columns: 2\n    color: \"#34d399\"\n  - label: Autarky\n    entity: sensor.autarky_degree\n    unit: \"%\"\n    position: 101\n    columns: 1\n    color: \"#ffc233\"\n  - label: Specific yield\n    entity: sensor.specific_yield\n    unit: kWh\u002FkWp\n    position: 102\n    columns: 2\n    color: \"#1f8fff\"\nenvironment_sensors:\n  - label: Indoor\n    entity: sensor.indoor_temperature\n    unit: auto\n    position: 300\n    color: \"#34d399\"\n  - label: Hot water\n    entity: sensor.hot_water_temperature\n    unit: auto\n    position: 301\n    color: \"#fb923c\"\n  - label: Air quality\n    entity: sensor.air_quality\n    unit: auto\n    position: 302\n    color: \"#a78bfa\"\nlarge_consumers:\n  - id: washing_machine\n    power_entity: sensor.washing_machine_power\n    energy_entity: sensor.washing_machine_energy\n    max_power_kw: 2.2\n    columns: 1\n    color: \"#34d399\"\n  - id: custom_1\n    label: Dehumidifier\n    power_entity: sensor.dehumidifier_power\n    energy_entity: sensor.dehumidifier_energy\n    max_power_kw: 0.6\n    columns: 1\n    color: \"#a78bfa\"\n```\n\n## Card options\n\n- `title` (string, default: `Energy Flow`)\n- `house` (string, default: `single_family_home`; options: `single_family_home`, `duplex_house`, `terraced_middle_house`, `apartment_building`, `apartment_building_balcony_solar`, `bungalow`, `city_villa`, `city_villa_pitched_roof`; legacy German values are still accepted as aliases)\n- `view_mode` (string, default: `house`; options: `house`, `advisor`; controls whether the card opens with the house visualization or the Advisor Dashboard)\n- `show_title` (boolean, default: `true`; shows\u002Fhides the title)\n- `show_view_selector` (boolean, default: `true`; shows\u002Fhides the House View \u002F Advisor Dashboard selector in the card header)\n- `show_house_selector` (boolean, default: `true`)\n- `show_energy_range_selector` (boolean, default: `false`; shows the `Live` \u002F `1h` \u002F `24h` \u002F `1 month` \u002F `1 year` \u002F `Total` selector in the header when enabled)\n- `show_metric_tiles` (boolean, default: `true`; shows\u002Fhides the summary boxes below the image)\n- `show_environment_sensors` (boolean, default: `true`; shows\u002Fhides the separate environment sensor tile section)\n- `show_status_label` (boolean, default: `true`; shows\u002Fhides the subtle bottom-right image label with last update and optional weather status)\n- `show_weather_status` (boolean, default: `false`; adds the current weather state to the bottom-right status label)\n- `show_grid_status_tile` (boolean, default: `true`; shows a grid status tile when `entities.import_export_power` or split import\u002Fexport entities are configured)\n- `show_power_flows` (boolean, default: `false`; shows animated SVG power flow lines between configured image\u002FHUD positions when enabled)\n- `image_overlays.smoke.enabled` \u002F `image_overlays.heatpump.enabled` (boolean, default: `false`; shows the smoke or heat pump overlay on the house image)\n- `image_overlays.\u003Coverlay>.label` (string, optional; custom label shown in the image badge and bottom tile, for example `Gas` or `Wärmepumpe`)\n- `image_overlays.smoke.entity` (entity id, optional; cumulative gas meter used to show consumption for the selected period)\n- `image_overlays.smoke.period` (string, default: `1h`; supported values: `30m`, `1h`, `24h`)\n- `image_overlays.heatpump.entity` (entity id, optional; power or energy sensor shown next to the heat pump and in the bottom tile)\n- `image_overlays.\u003Coverlay>.left` \u002F `image_overlays.\u003Coverlay>.top` (number, optional percentage position for `smoke` or `heatpump`)\n- `image_overlays.\u003Coverlay>.width` (number, optional percentage width for `smoke` or `heatpump`)\n- `image_overlays.heatpump.orientation` (string, default: `right`; use `left` or `right` to mirror the heat pump toward the matching side of the house)\n- `daylight_entity` (string, default: `sun.sun`; uses `_day` images during the day and standard images before sunrise\u002Fafter sunset)\n- `weather_entity` (string, optional; uses weather-specific image suffixes when present, for example `_sunny`, `_rainy`, `_cloudy`, `_snowy`, `_thunderstorm`)\n- `image` (string, optional custom standard\u002Fnight image; supports `\u002Flocal\u002F...` or `https:\u002F\u002F...`)\n- `day_image` (string, optional custom daylight image used when `daylight_entity` indicates daylight)\n- `visible_boxes.\u003Centity_key>` (boolean, default: `true`; set to `false` to hide one HUD box and its summary tile; supported keys are `pv_roof_power`, `pv_shed_power`, `pv_total_power`, `house_consumption_power`, `battery_level`, `inverter_power`, `wallbox_power`, `wallbox2_power`, `water_meter`, and `import_export_power`)\n- `boxes.\u003Centity_key>` (boolean, legacy alias for `visible_boxes.\u003Centity_key>`)\n- `labels.\u003Centity_key>` (string, optional; custom label for HUD boxes and summary tiles, for example `PV Dach`, `Speicher` or `Wallbox Garage`)\n- `labels.import_export_import` \u002F `labels.import_export_export` \u002F `labels.import_export_neutral` (strings, optional; custom direction labels for the import\u002Fexport display, for example `Grid import`, `Feed-in`, and `Self-sufficient`)\n- `energy_entities.\u003Centity_key>.entity` (entity id, optional; cumulative kWh counter used like the gas meter: `1h`, `24h`, `1 month`, and `1 year` are calculated from Home Assistant history, while `Total` shows the current counter value)\n- `positions.\u003Centity_key>.left` \u002F `positions.\u003Centity_key>.top` (number, optional percentage overrides from `4` to `96`)\n- `entities.pv_roof_power` (entity id)\n- `entities.pv_shed_power` (entity id)\n- `entities.pv_total_power` (entity id; shown as `PV Total` in the summary boxes below the image)\n- `entities.house_consumption_power` (entity id, optional; shown as `Consumption` in the summary boxes below the image)\n- `entities.water_meter` (entity id, optional; cumulative water meter shown as a HUD box and summary tile in `m³`; when the value-range selector is enabled, `1h`, `24h`, `1 month`, and `1 year` show consumption from Home Assistant history, while `Total` shows the current meter value)\n- `entities.battery_level` (entity id)\n- `entities.battery_flow_power` (entity id, optional; signed battery power or energy shown on the battery HUD, positive values mean charging\u002Fincoming and negative values mean discharging\u002Foutgoing; the badge follows the entity unit)\n- `entities.battery_charge_power` \u002F `entities.battery_discharge_power` (entity ids, optional; separate incoming\u002Foutgoing battery power or energy values, used when `battery_flow_power` is not configured; the badge follows the entity unit)\n- `entities.battery_min_soc` (entity id, optional; battery minimum\u002Freserve SoC used by the Advisor Dashboard and low-battery warning; falls back to `battery_low_threshold`)\n- `entities.battery_max_soc` (entity id, optional; battery maximum\u002Ftarget SoC used by the Advisor Dashboard so exported surplus is treated as expected when the battery is already at its target)\n- `entities.battery_temperature` (entity id, optional; battery temperature badge shown on the battery HUD and tile)\n- `entities.battery_cycles_today` (entity id, optional; daily\u002Ffull cycles used by the Advisor Dashboard to warn about frequent battery cycling)\n- `entities.inverter_power` (entity id)\n- `inverter_display` (`sum`, `values`, or `dominant`, default: `sum`; controls how multiple inverters are shown on the inverter HUD\u002Ftile)\n- `inverters` (array, optional; additional inverters after the existing `entities.inverter_power` \u002F `energy_entities.inverter_power.entity` \u002F `max_power_kw.inverter_power` base inverter; each item supports `label`, `power_entity`, `energy_entity`, `voltage_entity`, `voltage_entity_l1`, `voltage_entity_l2`, `voltage_entity_l3`, `max_power_kw`, and `visible`)\n- `entities.wallbox_power` (entity id)\n- `entities.wallbox_phase` (entity id, optional; state can be `Auto`, `1`, `2`, or `3` and is shown as a compact phase badge on the Wallbox HUD and tile)\n- `entities.wallbox_soc` (entity id, optional; vehicle battery SoC shown as a compact `Auto 78%` badge next to the Wallbox phase badge)\n- `entities.wallbox_max_soc` (entity id, optional; vehicle max\u002Ftarget SoC used by the Advisor Dashboard so EV charging is not recommended when the vehicle already reached its target)\n- `entities.wallbox_connected` (entity id, optional; boolean\u002Fbinary\u002Fsensor state used by the Advisor Dashboard to distinguish plugged-in vs. disconnected vehicles)\n- `entities.wallbox_charging_enabled` (entity id, optional; boolean\u002Fswitch\u002Fsensor state used by the Advisor Dashboard to notice when charging is disabled or blocked)\n- `entities.wallbox_remaining_time` (entity id, optional; remaining charge time badge shown next to the Wallbox phase\u002FSoC badges only while `wallbox_power` is charging)\n- `entities.wallbox2_power` (entity id, optional; second EV charger, hidden by default and auto-positioned next to `wallbox_power` unless `positions.wallbox2_power` is set)\n- `entities.wallbox2_phase` (entity id, optional; phase badge for the second EV charger)\n- `entities.wallbox2_soc` (entity id, optional; vehicle battery SoC badge for the second EV charger)\n- `entities.wallbox2_max_soc` (entity id, optional; max\u002Ftarget SoC for the second EV charger)\n- `entities.wallbox2_connected` (entity id, optional; connected\u002Fplugged-in state for the second EV charger)\n- `entities.wallbox2_charging_enabled` (entity id, optional; charging-enabled state for the second EV charger)\n- `entities.wallbox2_remaining_time` (entity id, optional; remaining charge time badge for the second EV charger)\n- `entities.import_export_power` (entity id, optional; signed grid power where positive values are shown as `Import` and negative values as `Export`)\n- `entities.import_power` \u002F `entities.export_power` (entity ids, optional; separate positive import and export sensors, used when `entities.import_export_power` is empty; aliases `grid_import_power`, `grid_export_power`, `import_export_import_power`, and `import_export_export_power` are also accepted)\n- `units.power` (string, default: `auto`; power values are shown in `W` below `1000 W` and in `kW` with two decimals from `1000 W`)\n- `units.battery` (string, default: `%`)\n- `units.volume` \u002F `units.water_meter` (string, default: `m³`; water values are displayed in cubic meters by default, even when the entity reports liters)\n- `units.\u003Centity_key>` (string, optional; overrides the unit for a single metric, for example `units.wallbox_power: W`; `auto` respects Home Assistant units such as `W`, `kW`, and `kWh`)\n- `power_display_mode` (string, default: `auto_kw`; options: `raw`, `auto_kw`)\n- `power_decimals` (number, default: `2`; used for kW values in `auto_kw` mode, range: `0`-`3`)\n- `grid_neutral_threshold` (number, default: `25`; watt threshold below which the grid tile shows self-sufficient\u002Fautark operation)\n- `advisor_surplus_threshold` (number, default: `250`; watts of export before the Energy Advisor treats PV surplus as actionable)\n- `advisor_import_threshold` (number, default: `250`; watts of import before the Energy Advisor highlights grid draw)\n- `advisor_high_load_threshold` (number, default: `3000`; watts of load before the Energy Advisor calls out unusually high consumption)\n- `advisor_max_suggestions` (number, default: `8`; maximum number of prioritized recommendations shown in the Advisor Dashboard, clamped from `1` to `12`)\n- `advisor_stale_sensor_warning_minutes` (number, default: `30`; minutes without an entity update before the Advisor shows a yellow stale-sensor diagnostic for dynamic live sensors only, such as PV, grid, load, inverter, battery flow\u002Ftemperature, and charger power; power sensors below 100 W are treated as idle and do not trigger this diagnostic, and battery temperature uses a longer 5-hour window)\n- `advisor_stale_sensor_critical_minutes` (number, default: `120`; minutes without an entity update before the Advisor escalates the dynamic stale-sensor diagnostic to red)\n- `battery_low_threshold` (number, default: `20`; battery percentage at or below which the battery tile is highlighted as a warning)\n- `chart_hours` (number, default: `24`; initial range for the click-to-open history chart, supported values: `24` or `48`)\n- `max_power_kw.\u003Centity_key>` (number\u002Fstring, optional; enables a utilization bar for power metrics based on max kW\u002FkWp, for example `max_power_kw.wallbox_power: 11`)\n- `dynamic_tile_colors` (boolean, default: `true`; enables threshold-based accent colors and glow states for HUD boxes, summary tiles, and the import\u002Fexport status label)\n- `tile_color_rules.\u003Centity_key>[]` (array, optional; first matching rule wins; supported keys include the visible box keys plus `import_export_power`)\n- `tile_color_rules.\u003Centity_key>[].color` (CSS color, for example `#34d399`, `orange`, `rgb(251,146,60)`, or `var(--my-color)`)\n- `tile_color_rules.\u003Centity_key>[].glow` (boolean or CSS color, optional; `true` derives a soft glow from `color`)\n- Rule thresholds can use `above`, `below`, `min`, `max`, `gte`, `lte`, `gt`, `lt`, `equals`, or `threshold` with `operator`. Power values are evaluated in watts, even when the entity reports `kW`.\n- `custom_kpis[]` (array, optional; adds free KPI tiles below the image alongside the built-in summary tiles)\n- `custom_kpis[].label` (string; tile title)\n- `custom_kpis[].entity` (entity id, optional; used as the tile value when set)\n- `custom_kpis[].value` (string\u002Fnumber, optional; static fallback value when no entity is set)\n- `custom_kpis[].unit` (string, default: `auto`; `auto` uses the entity unit, `none` hides the unit)\n- `custom_kpis[].position` (number, default: after built-in tiles; controls tile order in the bottom grid)\n- `custom_kpis[].columns` (number, default: `1`, range: `1`-`6`; controls tile width on desktop, capped to `2` on mobile)\n- `custom_kpis[].color` (CSS color, default: `#1f8fff`)\n- `kpis[]` (legacy-friendly alias for `custom_kpis[]`)\n- `environment_sensors[]` (array, optional; adds a separate \"Environment\" tile section below the normal summary\u002FKPI tiles for arbitrary Home Assistant sensor values such as temperature, pressure, humidity, CO₂, PM2.5, or AQI)\n- `environment_sensors[].label` (string, optional; tile title; when omitted the entity friendly name is used)\n- `environment_sensors[].entity` (entity id; Home Assistant sensor used as the tile value)\n- `environment_sensors[].unit` (string, default: `auto`; `auto` uses the entity unit, `none` hides the unit, any other value overrides the displayed unit)\n- `environment_sensors[].visible` (boolean, default: `true`; hides that environment tile when `false`)\n- `environment_sensors[].show_footer` (boolean, default: `true`; shows the sensor as a tile in the Environment footer section)\n- `environment_sensors[].show_image` (boolean, default: `false`; shows the sensor as a HUD box on the house image)\n- `environment_sensors[].left` \u002F `environment_sensors[].top` (number, default: `50`; percentage position for the optional image HUD box)\n- `environment_sensors[].position`, `environment_sensors[].columns`, `environment_sensors[].color` follow the same behavior as custom KPI tile positioning, width, and color.\n- `large_consumers[]` (array, optional; configures the separate \"Additional Large Consumers\" tile section below the normal\u002FKPI tiles and enables dedicated Advisor tips)\n- `large_consumers[].id` (string; built-in slots include `washing_machine`, `dishwasher`, `space_heater`, `dryer`, `dhw_heatpump`, and `custom_1`)\n- `large_consumers[].label` (string, optional; display name, especially useful for `custom_1`)\n- `large_consumers[].power_entity` (entity id, optional; live power sensor used for the tile, stale-sensor checks, active-load warnings, and surplus\u002Fcovering logic)\n- `large_consumers[].energy_entity` (entity id, optional; kWh counter used when the card is switched from `Live` to a time range)\n- `large_consumers[].max_power_kw` (number\u002Fstring, optional; expected maximum power used for the tile utilization bar and to decide whether current surplus is enough)\n- `large_consumers[].visible` (boolean, default: `true`; hides that consumer tile and excludes it from Advisor logic when `false`)\n- `large_consumers[].position`, `large_consumers[].columns`, `large_consumers[].color` follow the same behavior as custom KPI tile positioning, width, and color.\n\nThe card automatically follows the active Home Assistant language for built-in UI labels, status text, weather labels, and editor labels. Supported languages are English, German, Spanish, French, and Polish. Configuration keys, entity keys, and image file names remain English for compatibility and maintainability.\n\n## Image naming scheme\n\nBuilt-in images are grouped by house key and use English file names so the card stays easy to maintain for an open-source audience.\n\n- Standard\u002Fnight image: `\u003Chouse>\u002F\u003Chouse>.png`, for example `single_family_home\u002Fsingle_family_home.png`\n- Day image: `\u003Chouse>\u002F\u003Chouse>_day.png`, for example `single_family_home\u002Fsingle_family_home_day.png`\n- Weather image: `\u003Chouse>\u002F\u003Cbase>_\u003Cweather_suffix>.png`, for example `single_family_home\u002Fsingle_family_home_day_sunny.png`\n\nWhen `weather_entity` is configured, the card tries weather-specific files first and falls back automatically when a file does not exist. During daylight it tries `\u003Chouse>\u002F\u003Chouse>_day_\u003Cweather_suffix>.png`, then `\u003Chouse>\u002F\u003Chouse>_\u003Cweather_suffix>.png`, then the normal day and standard images. At night the same logic starts with `\u003Chouse>\u002F\u003Chouse>_\u003Cweather_suffix>.png` and then falls back to the day weather image.\n\n## Built-in image overview\n\nThe previews below are intentionally small so the README stays lightweight while still showing the available variants.\n\n### `single_family_home`\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Cth>Variant\u003C\u002Fth>\n    \u003Cth>File\u003C\u002Fth>\n    \u003Cth>Preview\u003C\u002Fth>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Standard\u002Fnight\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home.png\" width=\"96\" alt=\"single_family_home\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day.png\" width=\"96\" alt=\"single_family_home_day\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Sunny day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day_sunny.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day_sunny.png\" width=\"96\" alt=\"single_family_home_day_sunny\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Cloudy day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day_cloudy.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day_cloudy.png\" width=\"96\" alt=\"single_family_home_day_cloudy\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Cloudy standard\u002Fnight\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_cloudy.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_cloudy.png\" width=\"96\" alt=\"single_family_home_cloudy\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Rainy day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day_rainy.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day_rainy.png\" width=\"96\" alt=\"single_family_home_day_rainy\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Rainy standard\u002Fnight\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_rainy.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_rainy.png\" width=\"96\" alt=\"single_family_home_rainy\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Thunderstorm day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day_thunderstorm.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day_thunderstorm.png\" width=\"96\" alt=\"single_family_home_day_thunderstorm\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Thunderstorm standard\u002Fnight\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_thunderstorm.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_thunderstorm.png\" width=\"96\" alt=\"single_family_home_thunderstorm\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Snowy day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day_snowy.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day_snowy.png\" width=\"96\" alt=\"single_family_home_day_snowy\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Snowy standard\u002Fnight\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_snowy.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_snowy.png\" width=\"96\" alt=\"single_family_home_snowy\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Snow standard\u002Fnight\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_snow.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_snow.png\" width=\"96\" alt=\"single_family_home_snow\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Winter day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day_winter.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day_winter.png\" width=\"96\" alt=\"single_family_home_day_winter\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Hail day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_day_hail.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_day_hail.png\" width=\"96\" alt=\"single_family_home_day_hail\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Legacy standard\u002Fnight\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_legacy.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_legacy.png\" width=\"96\" alt=\"single_family_home_legacy\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>Legacy day\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>single_family_home_legacy_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fsingle_family_home\u002Fsingle_family_home_legacy_day.png\" width=\"96\" alt=\"single_family_home_legacy_day\">\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n### Other shipped house images\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Cth>House key\u003C\u002Fth>\n    \u003Cth>Standard\u002Fnight\u003C\u002Fth>\n    \u003Cth>Day\u003C\u002Fth>\n    \u003Cth>Weather\u002Fextra\u003C\u002Fth>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Ccode>duplex_house\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fduplex_house\u002Fduplex_house.png\" width=\"86\" alt=\"duplex_house\">\u003Cbr>\u003Ccode>duplex_house.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fduplex_house\u002Fduplex_house_day.png\" width=\"86\" alt=\"duplex_house_day\">\u003Cbr>\u003Ccode>duplex_house_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fduplex_house\u002Fduplex_house_day_cloudy.png\" width=\"86\" alt=\"duplex_house_day_cloudy\">\u003Cbr>\u003Ccode>duplex_house_day_cloudy.png\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Ccode>terraced_middle_house\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fterraced_middle_house\u002Fterraced_middle_house.png\" width=\"86\" alt=\"terraced_middle_house\">\u003Cbr>\u003Ccode>terraced_middle_house.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fterraced_middle_house\u002Fterraced_middle_house_day.png\" width=\"86\" alt=\"terraced_middle_house_day\">\u003Cbr>\u003Ccode>terraced_middle_house_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>-\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Ccode>apartment_building\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fapartment_building\u002Fapartment_building.png\" width=\"86\" alt=\"apartment_building\">\u003Cbr>\u003Ccode>apartment_building.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fapartment_building\u002Fapartment_building_day.png\" width=\"86\" alt=\"apartment_building_day\">\u003Cbr>\u003Ccode>apartment_building_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>-\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Ccode>apartment_building_balcony_solar\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fapartment_building_balcony_solar\u002Fapartment_building_balcony_solar.png\" width=\"86\" alt=\"apartment_building_balcony_solar\">\u003Cbr>\u003Ccode>apartment_building_balcony_solar.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fapartment_building_balcony_solar\u002Fapartment_building_balcony_solar_day.png\" width=\"86\" alt=\"apartment_building_balcony_solar_day\">\u003Cbr>\u003Ccode>apartment_building_balcony_solar_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>-\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Ccode>city_villa\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fcity_villa\u002Fcity_villa.png\" width=\"86\" alt=\"city_villa\">\u003Cbr>\u003Ccode>city_villa.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fcity_villa\u002Fcity_villa_day.png\" width=\"86\" alt=\"city_villa_day\">\u003Cbr>\u003Ccode>city_villa_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>-\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Ccode>city_villa_pitched_roof\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fcity_villa_pitched_roof\u002Fcity_villa_pitched_roof.png\" width=\"86\" alt=\"city_villa_pitched_roof\">\u003Cbr>\u003Ccode>city_villa_pitched_roof.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fcity_villa_pitched_roof\u002Fcity_villa_pitched_roof_day.png\" width=\"86\" alt=\"city_villa_pitched_roof_day\">\u003Cbr>\u003Ccode>city_villa_pitched_roof_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Ccode>clear\u003C\u002Fcode>, \u003Ccode>cloudy\u003C\u002Fcode>, \u003Ccode>fog\u003C\u002Fcode>, \u003Ccode>rainy\u003C\u002Fcode>, \u003Ccode>thunderstorm\u003C\u002Fcode>, \u003Ccode>snow\u003C\u002Fcode>, \u003Ccode>snowy\u003C\u002Fcode>, \u003Ccode>winter\u003C\u002Fcode>, \u003Ccode>hail\u003C\u002Fcode>, \u003Ccode>wind\u003C\u002Fcode>, plus day variants for \u003Ccode>cloudy\u003C\u002Fcode>, \u003Ccode>fog\u003C\u002Fcode>, \u003Ccode>rainy\u003C\u002Fcode>, \u003Ccode>thunderstorm\u003C\u002Fcode>, \u003Ccode>snowy\u003C\u002Fcode>, \u003Ccode>hail\u003C\u002Fcode>, \u003Ccode>sunny\u003C\u002Fcode>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd>\u003Ccode>bungalow\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fbungalow\u002Fbungalow.png\" width=\"86\" alt=\"bungalow\">\u003Cbr>\u003Ccode>bungalow.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>\u003Cimg src=\"images\u002Fbungalow\u002Fbungalow_day.png\" width=\"86\" alt=\"bungalow_day\">\u003Cbr>\u003Ccode>bungalow_day.png\u003C\u002Fcode>\u003C\u002Ftd>\n    \u003Ctd>-\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\nCurrent weather suffixes:\n\n| Home Assistant weather state | Tried suffixes |\n| --- | --- |\n| `sunny`, `clear` | `sunny` |\n| `clear-night` | `clear` |\n| `partlycloudy`, `cloudy` | `cloudy` |\n| `fog` | `cloudy`, `fog` |\n| `rainy`, `pouring` | `rainy` |\n| `lightning-rainy` | `rainy`, `thunderstorm` |\n| `snowy` | `snowy`, `snow`, `winter` |\n| `snowy-rainy`, `snowy_rainy` | `snowy`, `snow`, `rainy` |\n| `hail` | `hail` |\n| `lightning` | `thunderstorm` |\n| `windy` | `wind` |\n| `windy-variant`, `windy_variant` | `wind`, `cloudy` |\n\n## Validation\n\nRun the local package checks before pushing or releasing:\n\n```bash\nnpm test\n```\n\nThe CI workflow runs the same checks on pull requests and pushes to `main`. The HACS validation workflow runs `hacs\u002Faction` with `category: plugin`, including a daily scheduled run so future HACS validation changes are caught early.\n\nHassfest is included as a guarded workflow for future integration files, but it only runs when `custom_components\u002F**` exists. Dashboard cards are validated through the HACS plugin action instead.\n\n## Troubleshooting HACS install\n\nIf HACS shows an \"Unknown error\" while downloading, make sure you selected repository type **Dashboard**. If you previously added it as a different type, remove the failed entry in HACS and add it again as Dashboard before retrying.\n\nThis repository ships the HACS entry file as `ha-solar-dashboard.js` in the repository root and declares the same filename in `hacs.json`. The filename must match the repository name (`ha-solar-dashboard`) so HACS can identify it as a valid Dashboard plugin. Do not enable `zip_release` for this repository: HACS only supports that mode for integrations, not Dashboard plugins. Source files live once in `src\u002F`, `i18n\u002F`, `styles\u002F`, `modules\u002F`, and `images\u002F`; the public entry file is generated from them with `npm run build`. `dist\u002Fha-solar-dashboard.js` is only a tiny compatibility loader for older Home Assistant resource URLs and does not duplicate the card bundle.\n\nWhen publishing a GitHub release, attach `ha-solar-dashboard.js` and every `images\u002F**\u002F*.png` file as release assets. The included Release workflow does this automatically for tag pushes and published releases by flattening the uniquely named image files into release assets. If a release already exists without the image assets, run the `HACS Release Asset Repair` workflow with that tag, for example `v1.0.8`.\n\nThe `homeassistant` value in `hacs.json` must be a plain minimum version such as `2023.8.0`, not a comparator expression like `>=2023.8.0`.\n","HA Solar Dashboard Card 是一个为 Home Assistant Lovelace 设计的自定义卡片，用于通过图像布局展示现代化的光伏\u002F能源概览。其核心功能包括基于房屋或光伏设计的背景图片、根据时间自动切换日夜模式图片、以及可配置的多种能源实体（如屋顶光伏、电池充放电状态等）显示。该项目支持多种住宅布局，并允许用户根据实际设备情况隐藏不需要的HUD和摘要框，动态调整颜色以反映不同状态。适用于希望在Home Assistant中获得美观且直观的家庭能源管理系统界面的用户，特别是那些拥有光伏发电系统并希望对其进行精细化监控的家庭。","2026-06-11 04:03:59","CREATED_QUERY"]