- app/ui_text/nl.json and app/uitext.py: every page word in Dutch, English fallback per key; the page picks by browser language. Home's sentences move into ui_text `home_words`, so /status?lang=nl builds them in Dutch. - test_ui_text.py: EN/NL key and placeholder parity, STYLE limits, jargon lists for both languages, no inline details, untranslated Dutch caught. Shared rules moved unchanged to tools/style_rules.py. - tools/ux13_screenshots.sh/.py: DOCS screenshots from the demo fixtures in headless Chromium; docs/img/ux13/. Battery modes (P3): no screenshot. - "Other time windows": a list editor (ui.periods) that builds static_profile and names bad times, empty prices, overlaps and gaps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
385 lines
24 KiB
JSON
385 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"},
|
|
"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": "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",
|
|
"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",
|
|
"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"]
|
|
}
|
|
}
|