A battery's mode is a soft unit limit (source `mode`, P_MODE 35) kept
apart from the hard limits in pre_resolve(). The allocator applies it
only while the site target is decided at or below 35 (new
Resolution.deciding_priority), so the peak floor releases it and a mode
`hi` never meets the site `lo`. At N=1 resolve() applies the same rule
to the site target after stage 2. A mode range without 0 W is dropped
as a software fault, so REFUSE_SIGN stays unreachable from a mode.
compute() gets the loop bound (sum over live units of hard limits with
modes applied), so the loop never asks for watts no battery may give
and the saturation freeze never parks on them. While charging, Leftover
solar weighs 0 so Solar first fills first. Store keys pack_use and
pack_mode per battery, set by two new /action values; Off stops and
skips maintenance with a log line. Minimal Batteries cards (EN/NL).
Off by default (battery_modes_enabled); off, commands are byte-identical
to a5dddad at N=1 and N=2 (test_modes.py part 1).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
394 lines
24 KiB
JSON
394 lines
24 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"},
|
|
"inverters.modes": {"name": "Battery modes"},
|
|
"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."},
|
|
"periods": {"name": "Time windows and prices", "description": "One price per kWh for each time window, 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"},
|
|
"period_days": {"mon-sun": "Every day", "mon-fri": "Monday to Friday", "sat,sun": "Saturday and Sunday", "mon": "Monday", "tue": "Tuesday", "wed": "Wednesday", "thu": "Thursday", "fri": "Friday", "sat": "Saturday", "sun": "Sunday"}
|
|
},
|
|
"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": {"name": "Setup: nothing is controlled yet", "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": "To choose a mode for each battery, turn on battery modes in the settings.", "level": "Level", "now": "Now", "stored": "Stored", "mode": "Mode", "settings": "Change inverter settings",
|
|
"with_modes": {"description": "Each battery follows its mode, after the peak limit and safety stops."},
|
|
"use": "Use this battery", "on": "On", "off": "Off",
|
|
"choice": {
|
|
"solar_first": {"name": "Solar first", "description": "Charges from solar before the other batteries and covers the house."},
|
|
"leftover_solar": {"name": "Leftover solar", "description": "Charges from solar the other batteries cannot take, and covers the house."},
|
|
"off": {"name": "Off", "description": "The add-on asks this battery for 0 W, unless the peak limit needs it."}
|
|
}},
|
|
"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",
|
|
"periods": {"window": "Window", "from": "From", "to": "To", "days": "Days", "price": "Price", "add": "Add a time window"},
|
|
"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."},
|
|
"no_periods": {"description": "Add at least one time window."},
|
|
"period_time": {"description": "Window {row}: write each time as hours and minutes, like 07:00 or 24:00."},
|
|
"period_zero": {"description": "Window {row} starts and ends at the same time, so change one of them."},
|
|
"period_price": {"description": "Window {row}: enter a price per kWh."},
|
|
"period_price_range": {"description": "Window {row}: enter the price in euro per kWh, like 0.34."},
|
|
"period_overlap": {"description": "Windows {a} and {b} both cover {day} {from} to {to}, so change one of them."},
|
|
"period_gap": {"description": "No window covers {day} {from} to {to}, so add one or widen one."},
|
|
"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"
|
|
}
|
|
},
|
|
"home_words": {
|
|
"mode_house": "Follows the house",
|
|
"modes": {"solar_first": "Solar first", "leftover_solar": "Leftover solar", "off": "Off"},
|
|
"attn_shadow": "Shadow mode is on",
|
|
"attn_shadow_body": "The add-on decides everything, but every inverter stays at 0 W.",
|
|
"zero_held": "Held at 0 W",
|
|
"zero_going": "Going to 0 W",
|
|
"verdict": {
|
|
"held": "Held at 0 W",
|
|
"stopped": "Stopped",
|
|
"cycle": "Monthly cycle today",
|
|
"trade": "Trading on price",
|
|
"house": "Follows the house"
|
|
},
|
|
"pill": {
|
|
"running": "Running",
|
|
"shadow": "Shadow mode",
|
|
"stopped": "Stopped",
|
|
"alarm": "Needs you now",
|
|
"warning": "Running, with a warning"
|
|
},
|
|
"banner_sub": {
|
|
"running": "The batteries follow the plan below.",
|
|
"shadow": "The plans below say what the add-on would do.",
|
|
"stopped": "Start control below when you are ready.",
|
|
"alarm": "See Needs attention below for what to do.",
|
|
"warning": "See Needs attention below."
|
|
},
|
|
"tile": {
|
|
"not_set_up": "Not set up",
|
|
"no_reading": "No reading",
|
|
"producing": "Producing",
|
|
"not_producing": "Not producing",
|
|
"needs_solar": "Needs a solar reading",
|
|
"not_adding_up": "Readings do not add up",
|
|
"using": "Using",
|
|
"taking": "Taking from the grid",
|
|
"feeding": "Feeding in",
|
|
"balanced": "Balanced",
|
|
"giving": "Giving power",
|
|
"charging": "Charging",
|
|
"resting": "Resting"
|
|
},
|
|
"now": {
|
|
"no_reading": "No reading from this battery.",
|
|
"would_rest": "{zero}. Would rest now.",
|
|
"would_give": "{zero}. Would give {kw} now.",
|
|
"would_charge": "{zero}. Would charge {kw} now.",
|
|
"held": "{zero} until the alarm clears.",
|
|
"stopped": "{zero} while control is stopped.",
|
|
"cycle_drain": "Monthly cycle: emptying.",
|
|
"cycle_charge": "Monthly cycle: refilling.",
|
|
"cycle_hold": "Monthly cycle: holding full.",
|
|
"cycle": "Monthly cycle under way.",
|
|
"giving": "Giving {kw} now.",
|
|
"charging": "Charging {kw} now.",
|
|
"resting": "Resting now."
|
|
},
|
|
"head": {
|
|
"held": "Every inverter is at 0 W until the alarm clears.",
|
|
"held_going": "Every inverter goes to 0 W until the alarm clears.",
|
|
"stopped": "Control is stopped, so nothing is planned.",
|
|
"cycle": "A battery runs its monthly cycle today.",
|
|
"trade": "Charges in the cheapest hour, gives power in the dearest.",
|
|
"house": "Charges from spare solar and covers the house.",
|
|
"shadow": "Shadow mode: this is what the add-on would do.",
|
|
"cycle_would": "A battery would run its monthly cycle today.",
|
|
"trade_would": "Would charge when cheapest and give power when dearest.",
|
|
"house_would": "Would charge from spare solar and cover the house."
|
|
},
|
|
"run": {
|
|
"grid_what": "Charges up to {kwh} from the grid.",
|
|
"grid_what_would": "Would charge up to {kwh} from the grid.",
|
|
"grid_why": "Lowest published price, {eur} per kWh.",
|
|
"grid_amount": "Costs up to {eur}.",
|
|
"give_what": "Gives up to {kwh}, to the house first.",
|
|
"give_what_would": "Would give up to {kwh}, to the house first.",
|
|
"give_why": "Highest published price, {eur} per kWh.",
|
|
"give_amount": "Worth up to {eur} at that price.",
|
|
"cycle_start": "Starts the monthly battery cycle.",
|
|
"cycle_start_would": "Would start the monthly battery cycle.",
|
|
"cycle_now": "Runs the monthly battery cycle now.",
|
|
"cycle_now_would": "Would run the monthly battery cycle now.",
|
|
"cycle_why": "Empties, refills and holds full, so the level reads right.",
|
|
"cycle_why_would": "Would empty, refill and hold full, so the level reads right.",
|
|
"cycle_amount_unknown": "How long depends on the battery.",
|
|
"cycle_amount": "Takes about {hours} hours.",
|
|
"peak_what": "Gives power to stay under {kw}.",
|
|
"peak_what_would": "Would give power to stay under {kw}.",
|
|
"peak_why": "The peak limit comes before everything else.",
|
|
"house_what": "Follows the house.",
|
|
"house_what_would": "Would follow the house.",
|
|
"house_why": "Charges from spare solar, gives power when the house needs it.",
|
|
"house_why_would": "Would charge from spare solar, give power when the house needs it.",
|
|
"house_amount": "Amounts depend on the sun and the house."
|
|
},
|
|
"no_trade": {
|
|
"not_covered": "No trading on price: nothing measures the 15-minute peak.",
|
|
"no_prices": "No trading on price yet: no prices have arrived.",
|
|
"peak": "No trading on price now: the peak limit comes first.",
|
|
"not_firm": "No trading on price yet: the prices are not published.",
|
|
"not_worth": "No trading on price today. The price gap is too small.",
|
|
"no_level": "No trading on price now: a battery level is unknown."
|
|
},
|
|
"tomorrow_trade": {
|
|
"grid": "Tomorrow: charges at {at}, {eur} per kWh.",
|
|
"grid_would": "Tomorrow: would charge at {at}, {eur} per kWh.",
|
|
"give": "Tomorrow: gives power at {at}, {eur} per kWh.",
|
|
"give_would": "Tomorrow: would give power at {at}, {eur} per kWh."
|
|
},
|
|
"cycle_waits": "{name} waits its turn for the monthly cycle.",
|
|
"step_in": "The batteries step in above {kw}.",
|
|
"step_in_would": "The batteries would step in above {kw}.",
|
|
"period": "This 15-minute period is heading for {kw}.",
|
|
"prices": {
|
|
"now": "Price now {eur} per kWh, all in.",
|
|
"today": "Today: lowest {lo} at {lo_at}, highest {hi} at {hi_at}.",
|
|
"none": "No prices for today."
|
|
},
|
|
"tomorrow": {
|
|
"known": "Tomorrow's prices are in.",
|
|
"unknown": "Tomorrow's prices usually arrive after 13:00."
|
|
},
|
|
"region": {
|
|
"preset": "Levies and VAT: {region}, {year} figures.",
|
|
"own": "Levies and VAT: your own figure."
|
|
},
|
|
"peak_not_covered": "No peak limit: this meter does not measure 15-minute periods.",
|
|
"control": {
|
|
"shadow": "Shadow mode: every inverter stays at 0 W.",
|
|
"running": "Control is running.",
|
|
"stopped": "Control is stopped. Every inverter is at 0 W."
|
|
},
|
|
"attn": {
|
|
"controller": "Control is not running",
|
|
"meter": "Meter reading",
|
|
"meter_frozen": "Meter reading may be stuck",
|
|
"freeze_check": "Stuck meter check",
|
|
"month_peak": "This month's peak",
|
|
"peak_guard": "Peak limit",
|
|
"peak_forecast": "Peak limit forecast",
|
|
"sensor": "Battery readings",
|
|
"control": "Inverter control",
|
|
"power_too_high": "Power request too high",
|
|
"not_keeping_up": "Battery is not keeping up",
|
|
"write": "Power request not accepted",
|
|
"direction": "Power went the wrong way",
|
|
"site_direction": "Power went the wrong way",
|
|
"circulating": "Inverters working against each other",
|
|
"delivery": "An inverter is not delivering",
|
|
"estop": "Emergency stop",
|
|
"pv": "Solar reading",
|
|
"none": "Inverter connection"
|
|
},
|
|
"months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
|
}
|
|
}
|