A new install names no inverter. When that is the startup gate's only refusal, the add-on now serves the setup wizard in setup-only mode instead of exiting 78. It builds no controller, MQTT client or meter task, its HomeAssistant is read-only (every service call refuses before sending), Controller refuses a read-only HomeAssistant, and /action answers 409. Any other refusal still exits 78. DECISIONS/UX-15-setup-only-mode.md. Wizard fixes from the UX-13 P4 test: - F1: /config/validate converts what it can, so a conversion error blocks its own step and the live checks still run; save 422 carries steps. - F2: saves send the model the page opened (base); only keys this page changed are written onto the blob stored now. - A meter entity missing from Home Assistant is red on the last step. - Step 1 says the reading went down after a skip that followed a fall. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
220 lines
16 KiB
JSON
220 lines
16 KiB
JSON
{
|
|
"groups": {
|
|
"meter": {"name": "Meter", "description": "Where the grid reading comes from."},
|
|
"inverters": {"name": "Inverters and batteries", "description": "The inverters the add-on controls, and your solar."},
|
|
"tariff": {"name": "Tariff and prices", "description": "What you pay and are paid per kWh."},
|
|
"safety": {"name": "Safety limits", "description": "The peak limit, starting and stopping, and the safety stops."},
|
|
"maintenance": {"name": "Maintenance", "description": "The monthly battery cycle and the log."},
|
|
"tuning": {"name": "Control tuning", "description": "For support only, because these were measured on real hardware."}
|
|
},
|
|
"parts": {
|
|
"meter.timing": {"name": "Timing"},
|
|
"inverters.solar": {"name": "Solar"},
|
|
"tariff.selling": {"name": "Charging and selling on price"},
|
|
"tariff.feed": {"name": "Price feed details"},
|
|
"safety.peak": {"name": "Peak limit"},
|
|
"safety.start": {"name": "Starting and stopping"},
|
|
"safety.stops": {"name": "Safety stops", "description": "Measured on real hardware, so leave them unchanged."},
|
|
"maintenance.support": {"name": "Support"}
|
|
},
|
|
"fields": {
|
|
"solar": {"name": "Solar inverters", "description": "Each solar inverter's power sensor, which the add-on records but does not use for control."},
|
|
"contract": {"name": "Your contract", "description": "How your supplier prices each kWh you take from the grid."},
|
|
"region": {"name": "Region", "description": "Fills in grid costs, levies and VAT for the year shown, but not yet for Wallonia or Brussels, so check your bill."},
|
|
"fallback": {"name": "Price when the feed is down", "description": "Used when the price source does not answer."},
|
|
"fixed_price": {"name": "Price per kWh, all in", "description": "Energy, supplier costs, grid costs, levies and VAT together."},
|
|
"day_price": {"name": "Day price, weekdays 07:00 to 22:00", "description": "All in, as on your bill."},
|
|
"night_price": {"name": "Night and weekend price", "description": "All in, as on your bill."}
|
|
},
|
|
"choices": {
|
|
"contract": {"none": "No prices", "fixed": "Fixed price", "daynight": "Day and night", "dynamic": "Dynamic, hourly", "custom": "Other time windows"},
|
|
"fallback": {"none": "None", "fixed": "One price", "daynight": "Day and night", "custom": "Other time windows"},
|
|
"region": {"flanders": "Flanders, Fluvius Antwerpen", "own": "I enter my own figure"},
|
|
"meter_source": {"off": "One grid power entity", "ha_dsmr": "Import and export entities", "mqtt_p1": "Meter over MQTT", "ha_signed": "One net power entity", "homewizard_local": "HomeWizard meter on the network"},
|
|
"meter_phases": {"1": "1 phase", "3": "3 phases"},
|
|
"shadow_mode": {"auto": "Automatic", "on": "Always on", "off": "Off"},
|
|
"price_provider": {"generic_dayahead": "Day-ahead market price", "custom_formula": "Your own price formula", "manual_csv": "A price file"},
|
|
"log_level": {"trace": "Everything, for support", "debug": "Detailed, to find a problem", "info": "Normal", "warning": "Warnings and errors", "error": "Errors only"}
|
|
},
|
|
"applies": {
|
|
"restart": {"name": "Applies after a restart"},
|
|
"now": {"name": "Applies right away"}
|
|
},
|
|
"home": {
|
|
"app": {"name": "Battery add-on"},
|
|
"tabs": {"home": "Home", "batteries": "Batteries", "settings": "Settings", "setup": "Setup", "label": "Screens"},
|
|
"now": {"name": "Now", "description": "Updated every 3 seconds.", "solar": "Solar", "house": "House", "grid": "Grid", "batteries": "Batteries"},
|
|
"plan": {
|
|
"name": "Today's plan",
|
|
"description": "Point at a bar or a block for details, or tap it on a phone.",
|
|
"cheap": "Low price",
|
|
"dear": "High price",
|
|
"estimate": "Estimate",
|
|
"grid": "Charges from the grid",
|
|
"give": "Gives power",
|
|
"cycle": "Monthly battery cycle",
|
|
"peak": "Peak limit",
|
|
"house": "Follows the house",
|
|
"now": "now",
|
|
"time_to": "to",
|
|
"per_kwh": "per kWh",
|
|
"cheap_tip": "low for today",
|
|
"dear_tip": "high for today",
|
|
"estimate_tip": "estimate from yesterday",
|
|
"none_tip": "No price known",
|
|
"no_prices": {"description": "No prices for today, so the chart shows only the plan."},
|
|
"list": "The plan in words",
|
|
"average_tip": "hour average"
|
|
},
|
|
"peak": {"name": "Peak limit", "this_month": "This month's peak", "limit": "Limit", "none": "None recorded yet", "unreadable": "Cannot be read now"},
|
|
"attention": {"name": "Needs attention", "nothing": "Nothing to look at", "to_look": "to look at", "details": "Details", "alarm": "Alarm", "warning": "Warning", "info": "Info"},
|
|
"control": {"name": "Control", "stop": "Stop control", "start": "Start control", "maint_start": "Start a battery cycle now", "maint_abort": "Stop the battery cycle", "docs": "Add-on documentation", "more": "More actions"},
|
|
"details": {"name": "Details for installers", "rows": "Status rows", "checks": "Checks", "event": "Last event"},
|
|
"dialog": {
|
|
"cancel": "Cancel",
|
|
"stop": {"name": "Stop control?", "description": "Every inverter is set to 0 W until you start control again.", "yes": "Stop control"},
|
|
"start": {"name": "Start control?", "description": "The add-on controls the batteries again and clears any safety stop.", "yes": "Start control"},
|
|
"maint_start": {"name": "Start a battery cycle?", "description": "The battery empties, refills and holds full, which takes a few hours.", "yes": "Start the cycle"},
|
|
"maint_abort": {"name": "Stop the battery cycle?", "description": "Every inverter is set to 0 W for a moment, then control carries on.", "yes": "Stop the cycle"}
|
|
},
|
|
"toast": {"started": "Control started.", "stopped": "Control stopped.", "done": "Done.", "failed": "That did not work. Try again."},
|
|
"offline": {"name": "Cannot reach the add-on", "description": "The page tries again every 3 seconds."},
|
|
"setup_only": {"description": "Nothing is sent to any inverter until setup is saved and the add-on restarts.", "control": "Control starts after setup.", "open": "Open Setup"},
|
|
"batteries": {"name": "Batteries", "description": "Battery modes and on and off switches arrive in a later update.", "level": "Level", "now": "Now", "stored": "Stored", "mode": "Mode", "settings": "Change inverter settings"},
|
|
"settings": {"name": "Settings", "description": "The settings are grouped by task below.", "open": "Open the settings page"}
|
|
},
|
|
"choices_later": {
|
|
"region": {"wallonia": "Wallonia, no preset yet", "brussels": "Brussels, no preset yet"}
|
|
},
|
|
"choice_help": {
|
|
"meter_source": {
|
|
"off": {"description": "A Home Assistant entity that reads grid power in W, positive when you take from the grid."},
|
|
"ha_dsmr": {"description": "Two Home Assistant entities from the DSMR integration, one for import and one for export."},
|
|
"mqtt_p1": {"description": "The meter's readings arrive over MQTT on a topic you name."},
|
|
"ha_signed": {"description": "One Home Assistant entity that reads net grid power, positive for import."},
|
|
"homewizard_local": {"description": "The add-on reads a HomeWizard meter on your network, and can spot a stuck meter."}
|
|
}
|
|
},
|
|
"settings": {
|
|
"name": "Settings",
|
|
"description": "Every setting, grouped by task, and the simple view follows in a later update.",
|
|
"classic": "Classic settings",
|
|
"search": {"name": "Find a setting", "description": "Find a setting, for example peak or meter."},
|
|
"no_match": {"description": "No setting matches your search."},
|
|
"loading": "Loading the settings",
|
|
"load_failed": {"name": "Cannot read the settings", "description": "The add-on could not read its stored settings, so use Classic settings or the Configuration tab."},
|
|
"footer": {"description": "Every change is checked by the add-on's own start checks before it is saved."},
|
|
"to_fix": "to fix",
|
|
"to_check": "to check",
|
|
"changed": "changed",
|
|
"on": "On",
|
|
"off": "Off",
|
|
"not_set": "Not set",
|
|
"locked": "Locked",
|
|
"change": "Change",
|
|
"support": {"description": "These were measured on real hardware, so change them only when support asks."},
|
|
"picker": {
|
|
"choose": "Choose an entity",
|
|
"search": {"description": "Search by name or entity id."},
|
|
"all": "Show every entity",
|
|
"use": "Use this entity id",
|
|
"clear": "Clear",
|
|
"missing": "Not in Home Assistant",
|
|
"none": {"description": "Nothing matches, so check the entity in Developer Tools."}
|
|
},
|
|
"add_inverter": "Add an inverter",
|
|
"inverter": "Inverter",
|
|
"remove": "Remove",
|
|
"add_row": "Add a row",
|
|
"add_solar": "Add a solar inverter",
|
|
"reversed": "Reads negative",
|
|
"phase": "Phase",
|
|
"raw_roster": {"description": "This inverter list can only be changed in the Configuration tab."},
|
|
"region_year": "{year} figures",
|
|
"hour": "{hour}:00 UTC",
|
|
"preset": {"description": "Filled in by the region above, so choose your own figure to change it."},
|
|
"cycle": {"name": "Run a cycle by hand", "description": "The same actions as on Home, each asking first."},
|
|
"savebar": {"label": "Unsaved changes", "one": "change not saved", "many": "changes not saved", "discard": "Discard", "save": "Save", "saving": "Saving"},
|
|
"saved": {"name": "Saved, not running yet", "description": "The add-on runs the settings it started with until you restart it."},
|
|
"differs": {"name": "Stored settings are not running", "description": "Some stored settings differ from what runs now, so restart the add-on to apply them."},
|
|
"stale": {"name": "Changed somewhere else", "description": "These settings changed elsewhere while you edited, so save again to keep yours or discard to load theirs."},
|
|
"other": "Other messages",
|
|
"restart": "Restart now",
|
|
"dialog": {"name": "Restart the add-on?", "description": "Every inverter is set to 0 W while the add-on restarts, and then the new settings apply.", "yes": "Restart now"},
|
|
"toast": {
|
|
"saved": "Saved. Restart to apply.",
|
|
"discarded": "Changes discarded.",
|
|
"failed": "That did not work. Try again.",
|
|
"blocked": {"description": "Fix the settings marked in red, then save again."},
|
|
"restarting": {"description": "Restart requested, so this page stops answering for a moment."}
|
|
},
|
|
"tier": {"bad": "Must fix", "warn": "Check this", "info": "Note", "ok": "Passed"},
|
|
"derive": {
|
|
"raw_roster": {"description": "This inverter list can only be changed in the Configuration tab."},
|
|
"no_inverter": {"description": "Add at least one inverter."},
|
|
"flat_named": {"description": "Add a second inverter before naming this one."},
|
|
"no_source": {"description": "Choose where the dynamic prices come from."},
|
|
"custom_profile": {"description": "Other time windows can only be changed in the Configuration tab."},
|
|
"no_price": {"description": "Enter a price per kWh."},
|
|
"unknown": {"description": "The page cannot store this choice, so reload the page."}
|
|
},
|
|
"setup": {
|
|
"name": "Setup",
|
|
"description": "For installers: six steps to a working site, and each can be changed later under Settings.",
|
|
"done_before": {"description": "This site is set up already, so a change here replaces its stored settings."},
|
|
"step": "Step {n} of {total}",
|
|
"back": "Back",
|
|
"next": "Next",
|
|
"skip": "Next, or skip",
|
|
"finish": "Save and restart",
|
|
"not_now": "Not now",
|
|
"steps": {
|
|
"1": {"name": "Your meter", "description": "The add-on steers the grid reading to zero, so it needs your meter first."},
|
|
"2": {"name": "Inverters and batteries", "description": "One card for each inverter with a battery, with its entities in Home Assistant."},
|
|
"3": {"name": "Solar", "description": "Optional, so skip this step if the add-on should not record solar production."},
|
|
"4": {"name": "Prices", "description": "What you pay per kWh, so the batteries can charge when power is cheap."},
|
|
"5": {"name": "Peak limit", "description": "The grid stays under this limit, averaged over each 15-minute period."},
|
|
"6": {"name": "Check and start", "description": "The add-on checks everything with its own start checks, then restarts."}
|
|
},
|
|
"modes_later": {"description": "Choosing a mode for each battery comes in a later update."},
|
|
"kettle": {
|
|
"name": "Check the direction",
|
|
"description": "Read the meter, switch on a kettle, then read the meter again.",
|
|
"read": "Read the meter",
|
|
"again": "Read again",
|
|
"skip": "Skip this test",
|
|
"before": {"description": "The meter reads {w} now, so switch on a kettle and press Read again."},
|
|
"unread": {"description": "The meter cannot be read now, so check the entity and try again."},
|
|
"none": {"description": "The reading moved only {d}, so switch the kettle on and read again."},
|
|
"ok": {"description": "Good, the reading went up by {d} when the kettle came on."},
|
|
"flip": {"description": "The reading went down by {d}, so the add-on flips its sign for you."},
|
|
"wrong_signed": {"description": "The reading went down by {d}, so choose “One grid power entity” above, which can flip it."},
|
|
"wrong_dsmr": {"description": "The reading went down by {d}, so check that import and export are not swapped."},
|
|
"self": {"description": "The add-on reads this meter itself, so Home shows its direction after the restart."},
|
|
"skipped": {"description": "The meter direction is not tested, so check it on Home after the restart."},
|
|
"skipped_wrong": {"description": "The kettle test saw the meter reading go down, so check its direction in step 1 before you start control."},
|
|
"skipped_down": {"description": "The reading went down when the kettle came on, so check the meter's direction before you start control."},
|
|
"tested": {"description": "The meter direction was tested with a kettle."},
|
|
"needed": {"description": "Do the kettle test first, or skip it."}
|
|
},
|
|
"check": {
|
|
"name": "What the add-on checked",
|
|
"running": {"description": "Checking with the add-on's own start checks."},
|
|
"pass": {"description": "The add-on's start checks pass."},
|
|
"failed": {"description": "The check did not run, so try again."},
|
|
"again": "Check again",
|
|
"blocked": {"description": "Fix the items marked in red, then check again."}
|
|
},
|
|
"shadow": {"name": "Start in shadow mode", "description": "Recommended, because every inverter then stays at 0 W until you turn shadow mode off under Settings."},
|
|
"dialog": {"name": "Save and restart?", "description": "Every inverter is set to 0 W while the add-on restarts, and shadow mode keeps them at 0 W after that.", "yes": "Save and restart"},
|
|
"dialog_live": {"name": "Save and restart?", "description": "Every inverter is set to 0 W while the add-on restarts, and then the new settings apply.", "yes": "Save and restart"},
|
|
"dialog_setup": {"name": "Save and restart?", "description": "The add-on restarts with these settings, and shadow mode keeps every inverter at 0 W.", "yes": "Save and restart"},
|
|
"dialog_setup_live": {"name": "Save and restart?", "description": "The add-on restarts with these settings, and then they apply.", "yes": "Save and restart"},
|
|
"done": {"name": "Setup is done", "description": "The add-on restarts in shadow mode now, so open Home in a minute to see what it would do."},
|
|
"done_live": {"name": "Setup is done", "description": "The add-on restarts now, so open Home in a minute to start control."},
|
|
"restart_failed": {"name": "Saved, not running yet", "description": "The restart did not go through, so press Restart now to apply the settings."},
|
|
"home": "Open Home"
|
|
}
|
|
}
|
|
}
|