This commit is contained in:
Home Assistant Version Control
2026-08-18 14:36:46 +00:00
parent 13dc64b70f
commit 88e26358aa
89 changed files with 26068 additions and 18351 deletions
+28 -1
View File
@@ -302,7 +302,7 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
minor_version=8, minor_version=8,
) )
_log.info( _log.info(
"Migrated WashData entry from version %s.%s to 3.7", version, minor_version "Migrated WashData entry from version %s.%s to 3.8", version, minor_version
) )
return True return True
@@ -646,6 +646,33 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
await async_load_panel_config(hass) # self-guards; safe to call repeatedly await async_load_panel_config(hass) # self-guards; safe to call repeatedly
from . import store_account # pylint: disable=import-outside-toplevel from . import store_account # pylint: disable=import-outside-toplevel
await store_account.async_load(hass) # integration-wide online flag + account await store_account.async_load(hass) # integration-wide online flag + account
# Cache the integration version from HA's already-loaded manifest (no file IO).
# ws_get_constants reads it from hass.data; we can't do a module-level read_text
# in ws_api.py because the module is imported lazily inside this coroutine and the
# IO runs on the event loop (#328/#335).
if "ha_washdata_version" not in hass.data:
try:
from homeassistant.loader import async_get_integration as _aget_integration # pylint: disable=import-outside-toplevel
_integ = await _aget_integration(hass, DOMAIN)
hass.data["ha_washdata_version"] = _integ.manifest.get("version", "") or ""
except Exception as err: # pylint: disable=broad-exception-caught
_LOGGER.debug("Could not load ha_washdata version from manifest: %s", err)
# Fall back to reading manifest.json off the event loop. Only
# write the key when the read succeeds so that a double failure
# (loader + file) leaves the key absent rather than storing ""
# (which would shadow _INTEGRATION_VERSION in ws_get_constants).
def _read_manifest_version() -> str:
try:
return json.loads(
(Path(__file__).parent / "manifest.json").read_text(encoding="utf-8")
).get("version") or ""
except Exception: # pylint: disable=broad-exception-caught
return ""
_fallback_version = await hass.async_add_executor_job(_read_manifest_version)
if _fallback_version:
hass.data["ha_washdata_version"] = _fallback_version
async_register_commands(hass) async_register_commands(hass)
hass.data["ha_washdata_ws_registered"] = True hass.data["ha_washdata_ws_registered"] = True
+43 -2
View File
@@ -41,9 +41,23 @@ from .const import (
MATCH_MAE_PEAK_FLOOR, MATCH_MAE_PEAK_FLOOR,
MATCH_MAE_REF_PEAK, MATCH_MAE_REF_PEAK,
MATCH_MAE_SCALE, MATCH_MAE_SCALE,
STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES,
) )
def stage4_energy_mode(device_type: str | None) -> str:
"""Return the Stage-4 ``energy_mode`` for a device type.
``"integrated"`` for device types in
``STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES`` (washing machine / washer-dryer),
where same-duration temperature/spin variants make integrated energy the
right discriminator; ``"mean"`` (the historical default) otherwise. Single
source of truth for the gate, used by the manager, Playground and matching
tuner so all three stay consistent with the live matcher.
"""
return "integrated" if device_type in STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES else "mean"
def _agreement(observed: float, expected: float, scale: float) -> float: def _agreement(observed: float, expected: float, scale: float) -> float:
"""1.0 when observed==expected, decaying with the |log-ratio| / scale.""" """1.0 when observed==expected, decaying with the |log-ratio| / scale."""
if observed <= 0 or expected <= 0 or scale <= 0: if observed <= 0 or expected <= 0 or scale <= 0:
@@ -426,12 +440,18 @@ def compute_matches_worker(
dur_w, en_w = dur_w / de_sum, en_w / de_sum dur_w, en_w = dur_w / de_sum, en_w / de_sum
shape_w = max(0.0, 1.0 - dur_w - en_w) shape_w = max(0.0, 1.0 - dur_w - en_w)
if (dur_w > 0 or en_w > 0) and candidates and current_duration > 0: if (dur_w > 0 or en_w > 0) and candidates and current_duration > 0:
cur_energy = float(np.mean(curr_arr)) # mean power (W) — no duration multiplication # energy_mode: "mean" (default) compares whole-cycle mean power (W);
# "integrated" compares true integrated energy (mean x duration). Opt-in so
# the historical default is byte-for-byte preserved. See register item 99.
integrated = config.get("energy_mode", "mean") == "integrated"
cur_mean = float(np.mean(curr_arr))
cur_energy = cur_mean * current_duration if integrated else cur_mean
for cand in candidates: for cand in candidates:
prof_dur = float(cand.get("profile_duration") or 0.0) prof_dur = float(cand.get("profile_duration") or 0.0)
dur_ag = _agreement(current_duration, prof_dur, dur_scale) dur_ag = _agreement(current_duration, prof_dur, dur_scale)
sample = cand.get("sample") or [] sample = cand.get("sample") or []
cand_energy = float(np.mean(sample)) if sample else 0.0 cand_mean = float(np.mean(sample)) if sample else 0.0
cand_energy = cand_mean * prof_dur if integrated else cand_mean
en_ag = _agreement(cur_energy, cand_energy, en_scale) en_ag = _agreement(cur_energy, cand_energy, en_scale)
cand["shape_score"] = float(cand["score"]) cand["shape_score"] = float(cand["score"])
cand["score"] = float( cand["score"] = float(
@@ -620,6 +640,27 @@ def compute_envelope_worker(
if len(offsets) < 3: if len(offsets) < 3:
continue continue
# Stored offsets are rounded to 0.1s, so two readings less than 0.1s apart
# collapse onto the same offset. A single such duplicate must not discard the
# whole trace (#377): drop the duplicate sample(s) instead of the cycle. Only
# exact duplicates are collapsed here; a genuinely out-of-order (decreasing)
# offset - which sorted storage never produces - is left for the strict check
# below to reject, exactly as before.
if offsets.size > 1:
diffs = np.diff(offsets)
if np.any(diffs == 0):
keep = np.concatenate(([True], diffs != 0))
dropped = int((~keep).sum())
offsets = offsets[keep]
values = values[keep]
_LOGGER.debug(
"compute_envelope_worker: dropped %d duplicate sample offset(s) "
"from a cycle trace (0.1s offset rounding)",
dropped,
)
if len(offsets) < 3:
continue
if not np.all(np.diff(offsets) > 0): if not np.all(np.diff(offsets) > 0):
continue continue
+53
View File
@@ -43,6 +43,10 @@ CONF_POWER_SENSOR = "power_sensor"
CONF_NAME = "name" CONF_NAME = "name"
CONF_MIN_POWER = "min_power" CONF_MIN_POWER = "min_power"
CONF_OFF_DELAY = "off_delay" CONF_OFF_DELAY = "off_delay"
# Bucket size (minutes) for the per-profile `power_profile` sensor attribute that
# external planners (EMHASS, tibber_prices) consume. Configurable so short sharp
# spikes are not blurred by the fixed 15-min default (#367). Read-time only.
CONF_POWER_PROFILE_INTERVAL_MIN = "power_profile_interval_min"
CONF_NOTIFY_SERVICE = "notify_service" # Deprecated - kept for migration only CONF_NOTIFY_SERVICE = "notify_service" # Deprecated - kept for migration only
CONF_NOTIFY_ACTIONS = "notify_actions" CONF_NOTIFY_ACTIONS = "notify_actions"
CONF_NOTIFY_PEOPLE = "notify_people" CONF_NOTIFY_PEOPLE = "notify_people"
@@ -132,6 +136,7 @@ CONF_ANTI_WRINKLE_MAX_POWER = "anti_wrinkle_max_power" # W threshold for anti-w
CONF_ANTI_WRINKLE_MAX_DURATION = "anti_wrinkle_max_duration" # Seconds to treat as anti-wrinkle CONF_ANTI_WRINKLE_MAX_DURATION = "anti_wrinkle_max_duration" # Seconds to treat as anti-wrinkle
CONF_ANTI_WRINKLE_EXIT_POWER = "anti_wrinkle_exit_power" # W threshold for true-off exit CONF_ANTI_WRINKLE_EXIT_POWER = "anti_wrinkle_exit_power" # W threshold for true-off exit
CONF_ANTI_WRINKLE_IDLE_TIMEOUT = "anti_wrinkle_idle_timeout" # Seconds below exit power before anti-wrinkle ends CONF_ANTI_WRINKLE_IDLE_TIMEOUT = "anti_wrinkle_idle_timeout" # Seconds below exit power before anti-wrinkle ends
CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE = "dishwasher_end_spike_quiet_release" # Dishwasher: sustained-quiet seconds after expected duration that release the end-of-cycle drain wait early (#379)
CONF_DELAY_START_DETECT_ENABLED = "delay_start_detect_enabled" # Enable delayed-start detection CONF_DELAY_START_DETECT_ENABLED = "delay_start_detect_enabled" # Enable delayed-start detection
CONF_DELAY_CONFIRM_SECONDS = "delay_confirm_seconds" # Seconds power must stay in standby band before DELAY_WAIT engages CONF_DELAY_CONFIRM_SECONDS = "delay_confirm_seconds" # Seconds power must stay in standby band before DELAY_WAIT engages
CONF_DELAY_TIMEOUT_HOURS = "delay_timeout_hours" # Safety timeout (hours) while waiting to start CONF_DELAY_TIMEOUT_HOURS = "delay_timeout_hours" # Safety timeout (hours) while waiting to start
@@ -153,6 +158,10 @@ CONF_NOTIFY_PRE_COMPLETE_MESSAGE = "notify_pre_complete_message"
CONF_NOTIFY_LIVE_INTERVAL_SECONDS = "notify_live_interval_seconds" CONF_NOTIFY_LIVE_INTERVAL_SECONDS = "notify_live_interval_seconds"
CONF_NOTIFY_LIVE_OVERRUN_PERCENT = "notify_live_overrun_percent" CONF_NOTIFY_LIVE_OVERRUN_PERCENT = "notify_live_overrun_percent"
CONF_NOTIFY_LIVE_CHRONOMETER = "notify_live_chronometer" CONF_NOTIFY_LIVE_CHRONOMETER = "notify_live_chronometer"
# Opt-in data keys on the EXISTING live progress notification (#347): keep-on-tap
# (sticky) and a tap target (clickAction). Not new notification types. Mobile-only.
CONF_NOTIFY_LIVE_STICKY = "notify_live_sticky"
CONF_NOTIFY_LIVE_CLICK_ACTION = "notify_live_click_action"
CONF_NOTIFY_REMINDER_MESSAGE = "notify_reminder_message" # Distinct one-time pre-end alert CONF_NOTIFY_REMINDER_MESSAGE = "notify_reminder_message" # Distinct one-time pre-end alert
CONF_NOTIFY_TIMEOUT_SECONDS = "notify_timeout_seconds" # Auto-dismiss after N seconds (0 = never) CONF_NOTIFY_TIMEOUT_SECONDS = "notify_timeout_seconds" # Auto-dismiss after N seconds (0 = never)
CONF_NOTIFY_CHANNEL = "notify_channel" # Android channel for status/live/reminder CONF_NOTIFY_CHANNEL = "notify_channel" # Android channel for status/live/reminder
@@ -174,10 +183,19 @@ CONF_PEAK_RATE_MESSAGE = "peak_rate_message"
# Door sensor & pause # Door sensor & pause
CONF_DOOR_SENSOR_ENTITY = "door_sensor_entity" # Optional binary_sensor for machine door CONF_DOOR_SENSOR_ENTITY = "door_sensor_entity" # Optional binary_sensor for machine door
# Auto-open dishwashers (AirDry etc.) pop the door at cycle end; a sustained
# door-open then means the cycle finished, not a mid-cycle pause (#342).
CONF_DOOR_OPENS_AT_END = "door_opens_at_end"
CONF_DOOR_END_DWELL_SECONDS = "door_end_dwell_seconds"
DEFAULT_DOOR_OPENS_AT_END = False
DEFAULT_DOOR_END_DWELL_SECONDS = 60 # door must stay open this long to finalize
CONF_PAUSE_CUTS_POWER = "pause_cuts_power" # Also turn off switch entity when pausing CONF_PAUSE_CUTS_POWER = "pause_cuts_power" # Also turn off switch entity when pausing
CONF_SWITCH_ENTITY = "switch_entity" # Optional switch entity toggled on pause/resume CONF_SWITCH_ENTITY = "switch_entity" # Optional switch entity toggled on pause/resume
CONF_NOTIFY_UNLOAD_DELAY_MINUTES = "notify_unload_delay_minutes" # Minutes before "laundry waiting" nag CONF_NOTIFY_UNLOAD_DELAY_MINUTES = "notify_unload_delay_minutes" # Minutes before "laundry waiting" nag
CONF_NOTIFY_UNLOAD_MESSAGE = "notify_unload_message" # Template for the clean-laundry nag message CONF_NOTIFY_UNLOAD_MESSAGE = "notify_unload_message" # Template for the clean-laundry nag message
# Repeat the unload reminder every delay-minutes until the door opens or the user
# taps the notification's "stop reminding" action (opt-in, #374).
CONF_NOTIFY_UNLOAD_REPEAT = "notify_unload_repeat"
# Quiet hours (do-not-disturb window). Both hours 0-23; unset/None (or start==end) # Quiet hours (do-not-disturb window). Both hours 0-23; unset/None (or start==end)
# = feature off. When configured, finish-type notifications (finish, clean-laundry # = feature off. When configured, finish-type notifications (finish, clean-laundry
@@ -209,11 +227,22 @@ DEFAULT_NOTIFY_FIRE_EVENTS = True
DEFAULT_NOTIFY_LIVE_INTERVAL_SECONDS = 300 DEFAULT_NOTIFY_LIVE_INTERVAL_SECONDS = 300
DEFAULT_NOTIFY_LIVE_OVERRUN_PERCENT = 20 DEFAULT_NOTIFY_LIVE_OVERRUN_PERCENT = 20
DEFAULT_NOTIFY_LIVE_CHRONOMETER = False DEFAULT_NOTIFY_LIVE_CHRONOMETER = False
DEFAULT_NOTIFY_LIVE_STICKY = False # #347: off = today's behaviour (tap dismisses)
DEFAULT_NOTIFY_LIVE_CLICK_ACTION = "" # #347: empty = no tap target (today's behaviour)
DEFAULT_NOTIFY_TIMEOUT_SECONDS = 0 # 0 = notifications never auto-dismiss DEFAULT_NOTIFY_TIMEOUT_SECONDS = 0 # 0 = notifications never auto-dismiss
DEFAULT_NOTIFY_CHANNEL = "" # Empty = omit channel (companion app default) DEFAULT_NOTIFY_CHANNEL = "" # Empty = omit channel (companion app default)
DEFAULT_NOTIFY_FINISH_CHANNEL = "" # Empty = reuse status channel DEFAULT_NOTIFY_FINISH_CHANNEL = "" # Empty = reuse status channel
DEFAULT_NOTIFY_UNLOAD_DELAY_MINUTES = 60 # 1 hour before "still waiting" nag notification DEFAULT_NOTIFY_UNLOAD_DELAY_MINUTES = 60 # 1 hour before "still waiting" nag notification
DEFAULT_NOTIFY_UNLOAD_MESSAGE = "{device} finished {duration}m ago - laundry is still inside." DEFAULT_NOTIFY_UNLOAD_MESSAGE = "{device} finished {duration}m ago - laundry is still inside."
DEFAULT_NOTIFY_UNLOAD_REPEAT = False # opt-in: re-send the unload reminder until dismissed (#374)
# Safety bound on repeat mode (#374). The reminder is meant to run "until the door
# opens", and the in-notification "Stop reminding" button is mobile_app-only - so a
# user whose only notify target is non-mobile has the door sensor as their sole
# escape. If that sensor never reports open (offline, or nobody home), the reminder
# would re-fire forever AND pin the entity in Clean state, blocking the power-based
# Off detection indefinitely. 48 reminders is ~2 days at the 60-minute default, far
# past any legitimate reminder window, so normal use never reaches it.
NOTIFY_UNLOAD_REPEAT_MAX_REMINDERS = 48
DEFAULT_PEAK_RATE_MESSAGE = "Running at peak rate ({price}/kWh)." DEFAULT_PEAK_RATE_MESSAGE = "Running at peak rate ({price}/kWh)."
# Quiet hours default: feature off (both hours unset). See CONF_NOTIFY_QUIET_*. # Quiet hours default: feature off (both hours unset). See CONF_NOTIFY_QUIET_*.
@@ -227,6 +256,7 @@ DEFAULT_NOTIFY_MILESTONE_MESSAGE = "{device} has completed {cycle_count} cycles!
# Defaults # Defaults
DEFAULT_MIN_POWER = 2.0 # Watts DEFAULT_MIN_POWER = 2.0 # Watts
DEFAULT_OFF_DELAY = 180 # Seconds (3 minutes, safer for 60s polling) DEFAULT_OFF_DELAY = 180 # Seconds (3 minutes, safer for 60s polling)
DEFAULT_POWER_PROFILE_INTERVAL_MIN = 15 # power_profile attribute bucket (#367)
DEFAULT_NAME = "Washing Machine" DEFAULT_NAME = "Washing Machine"
# Seconds without updates while active before forced stop (publish-on-change sockets) # Seconds without updates while active before forced stop (publish-on-change sockets)
DEFAULT_NO_UPDATE_ACTIVE_TIMEOUT = 600 # 10 minutes DEFAULT_NO_UPDATE_ACTIVE_TIMEOUT = 600 # 10 minutes
@@ -492,6 +522,7 @@ MATCH_ENERGY_WEIGHT = 0.22
MATCH_DURATION_SCALE = 0.175 # ~ln ratio at which duration agreement halves MATCH_DURATION_SCALE = 0.175 # ~ln ratio at which duration agreement halves
MATCH_ENERGY_SCALE = 0.25 # ~ln ratio at which energy agreement halves MATCH_ENERGY_SCALE = 0.25 # ~ln ratio at which energy agreement halves
# States # States
STATE_OFF = "off" STATE_OFF = "off"
STATE_DELAY_WAIT = "delay_wait" STATE_DELAY_WAIT = "delay_wait"
@@ -551,6 +582,21 @@ DEVICE_TYPE_GENERIC = "generic"
# to this bucket on load (see __init__.py), preserving their tuned options. # to this bucket on load (see __init__.py), preserving their tuned options.
DEVICE_TYPE_OTHER = "other" DEVICE_TYPE_OTHER = "other"
# Device types whose Stage-4 "energy agreement" compares INTEGRATED energy
# (mean power x duration) instead of mean power. On these, same-base program
# variants differ mainly in temperature/spin at roughly equal duration, so
# integrated energy (which mean power dilutes) is the right discriminator -
# validated on real store data (washer top-1 +3.4pp, FP down). Other device
# types (dishwasher/dryer/...) keep mean power, because their programs are
# distinguished by duration and integrated energy would conflate the two axes
# (validated: it regresses there). See register item 99 / the cycle-variant
# discrimination spec. Defined from the device-type constants above (not string
# literals) so it can never drift from them.
STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES = (
DEVICE_TYPE_WASHING_MACHINE,
DEVICE_TYPE_WASHER_DRYER,
)
DEVICE_TYPES = { DEVICE_TYPES = {
DEVICE_TYPE_WASHING_MACHINE: "Washing Machine", DEVICE_TYPE_WASHING_MACHINE: "Washing Machine",
DEVICE_TYPE_DRYER: "Dryer", DEVICE_TYPE_DRYER: "Dryer",
@@ -1013,3 +1059,10 @@ PLAYGROUND_STRESS_MAX_SPARSE_STEPS: int = 15 # max sparse steps → max
PLAYGROUND_STRESS_MAX_IDLE_W: float = 100000.0 # upper bound for a manual idle override PLAYGROUND_STRESS_MAX_IDLE_W: float = 100000.0 # upper bound for a manual idle override
# (far beyond any appliance; guards against # (far beyond any appliance; guards against
# inf/absurd values corrupting synthesis) # inf/absurd values corrupting synthesis)
# ─── Playground setting presets (sandbox snapshots, per device) ────────────────
# Named snapshots of the Playground control panel's values, stored under the
# "playground_presets" store key. They never touch the live config: publishing a
# value to entry.options is always an explicit, per-setting user action.
PLAYGROUND_PRESET_MAX: int = 30 # per-device cap (keeps the store small)
PLAYGROUND_PRESET_NAME_MAX: int = 60 # preset name length cap
+118 -10
View File
@@ -123,7 +123,7 @@ class CycleDetectorConfig:
completion_min_seconds: int = 600 completion_min_seconds: int = 600
start_duration_threshold: float = 5.0 start_duration_threshold: float = 5.0
start_energy_threshold: float = 0.005 start_energy_threshold: float = 0.005
end_energy_threshold: float = 0.05 # 50 Wh threshold for "still active" end_energy_threshold: float = 0.05 # 0.05 Wh (50 mWh) threshold for "still active"
end_repeat_count: int = 1 end_repeat_count: int = 1
min_off_gap: int = 60 min_off_gap: int = 60
start_threshold_w: float = 2.0 start_threshold_w: float = 2.0
@@ -141,6 +141,11 @@ class CycleDetectorConfig:
anti_wrinkle_max_duration: float = 60.0 anti_wrinkle_max_duration: float = 60.0
anti_wrinkle_exit_power: float = 0.8 anti_wrinkle_exit_power: float = 0.8
anti_wrinkle_idle_timeout: float = 120.0 anti_wrinkle_idle_timeout: float = 120.0
# Dishwasher only: sustained-quiet seconds (after reaching expected duration)
# that release the end-of-cycle pump-out/drain wait early (#379). Defaults to
# the shipped constant; per-device configurable so a machine with a long silent
# passive-drying phase before its final drain can absorb profile drift.
dishwasher_end_spike_quiet_release: float = DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS
delay_detect_enabled: bool = False delay_detect_enabled: bool = False
# Sustained seconds power must stay in the standby band (between # Sustained seconds power must stay in the standby band (between
# stop_threshold_w and start_threshold_w) before DELAY_WAIT engages. # stop_threshold_w and start_threshold_w) before DELAY_WAIT engages.
@@ -221,7 +226,7 @@ class CycleDetector:
profile_matcher: ( profile_matcher: (
Callable[ Callable[
[list[tuple[datetime, float]]], [list[tuple[datetime, float]]],
tuple[str | None, float, float, str | None], tuple[str | None, float, float, str | None] | None,
] ]
| None | None
) = None, ) = None,
@@ -276,6 +281,11 @@ class CycleDetector:
self._energy_since_idle_wh: float = 0.0 self._energy_since_idle_wh: float = 0.0
self._time_above_threshold: float = 0.0 self._time_above_threshold: float = 0.0
self._time_below_threshold: float = 0.0 self._time_below_threshold: float = 0.0
# As above, but restarts whenever an outage-sized gap breaks the observed
# quiet tail, so it counts only quiet WashData actually saw. Used by the
# dishwasher quiet-release gates so a single low sample after a telemetry
# dropout can't satisfy them without the quiet having been observed.
self._time_below_threshold_gapfree: float = 0.0
self._last_process_time: datetime | None = None self._last_process_time: datetime | None = None
# New State Machine trackers # New State Machine trackers
@@ -301,6 +311,7 @@ class CycleDetector:
self._end_spike_duration: float = 0.0 # cycle duration (s) when _end_spike_seen was last set self._end_spike_duration: float = 0.0 # cycle duration (s) when _end_spike_seen was last set
self._match_ambiguous: bool = False # last live match was ambiguous (gates predictive end) self._match_ambiguous: bool = False # last live match was ambiguous (gates predictive end)
self._match_prefix_ambiguous: bool = False # longer candidate with good shape exists (prefix guard) self._match_prefix_ambiguous: bool = False # longer candidate with good shape exists (prefix guard)
self._last_smart_term_block_reason: str | None = None # #346 diagnostic throttle
# Anti-wrinkle tracking (dryers only) # Anti-wrinkle tracking (dryers only)
self._anti_wrinkle_candidate_start: datetime | None = None self._anti_wrinkle_candidate_start: datetime | None = None
@@ -626,6 +637,7 @@ class CycleDetector:
# (ANTI_WRINKLE needs to track idle time to determine true-off) # (ANTI_WRINKLE needs to track idle time to determine true-off)
if target_state != STATE_ANTI_WRINKLE: if target_state != STATE_ANTI_WRINKLE:
self._time_below_threshold = 0.0 self._time_below_threshold = 0.0
self._time_below_threshold_gapfree = 0.0
self._last_match_time = None self._last_match_time = None
self._matched_profile = None self._matched_profile = None
# Clear stale match state so the next cycle starts with clean defaults. # Clear stale match state so the next cycle starts with clean defaults.
@@ -635,6 +647,11 @@ class CycleDetector:
self._last_match_confidence = 0.0 self._last_match_confidence = 0.0
self._match_ambiguous = False self._match_ambiguous = False
self._match_prefix_ambiguous = False self._match_prefix_ambiguous = False
# Per-cycle diagnostic throttle (#346): the "Smart Termination not applied"
# line only logs when the reason CHANGES. Carrying the previous cycle's
# reason across a reset swallows the new cycle's very first diagnostic
# whenever it happens to be blocked for the same reason.
self._last_smart_term_block_reason = None
self._ignore_power_until_idle = False # Reset lockout self._ignore_power_until_idle = False # Reset lockout
self._lockout_high_seconds = 0.0 self._lockout_high_seconds = 0.0
# Clear the verified-pause flag so it can't leak into the next cycle (B6): # Clear the verified-pause flag so it can't leak into the next cycle (B6):
@@ -688,6 +705,35 @@ class CycleDetector:
"""Return the expected duration of the current cycle in seconds.""" """Return the expected duration of the current cycle in seconds."""
return self._expected_duration return self._expected_duration
@staticmethod
def _smart_term_block_reason(
current_duration: float,
expected: float,
smart_ratio: float,
is_confident: bool,
ambiguous: bool,
prefix_ambiguous: bool,
) -> str | None:
"""Why the Smart-Termination fast end-path did NOT fire, for diagnostics.
Returns None when the gate would pass, or when no expected duration is known
yet (nothing meaningful to report). Mirrors the gate's four conditions in
order so the first blocking reason is surfaced. Pure and side-effect-free;
the detector logs the result (throttled to reason changes) - no behaviour
change (#346).
"""
if expected <= 0:
return None
if current_duration < expected * smart_ratio:
return "duration_not_reached"
if not is_confident:
return "low_confidence"
if ambiguous:
return "match_ambiguous"
if prefix_ambiguous:
return "prefix_ambiguous"
return None
def process_reading(self, power: float, timestamp: datetime) -> None: def process_reading(self, power: float, timestamp: datetime) -> None:
"""Process a new power reading using robust dt-aware logic.""" """Process a new power reading using robust dt-aware logic."""
@@ -731,6 +777,12 @@ class CycleDetector:
) )
# Fall through: the state machine will start a new cycle. # Fall through: the state machine will start a new cycle.
# Snapshot the cadence BEFORE folding this reading in: the gap-free tally
# below classifies `dt` against a ceiling derived from the cadence, and an
# outage that has already widened p95 would raise the very threshold that
# is supposed to catch it (a 120 s gap after a 10 s cadence lifts p95 to
# ~15.5 s -> ceiling 155 s -> the gap counts as observed quiet).
prior_p95_dt = self._p95_dt
self._update_cadence(dt) self._update_cadence(dt)
self._last_process_time = timestamp self._last_process_time = timestamp
@@ -751,6 +803,7 @@ class CycleDetector:
if is_high: if is_high:
self._time_above_threshold += dt self._time_above_threshold += dt
self._time_below_threshold = 0.0 self._time_below_threshold = 0.0
self._time_below_threshold_gapfree = 0.0
# Energy integration (trapezoidal approx for this single step) # Energy integration (trapezoidal approx for this single step)
# prev_p = self._last_power if self._last_power is not None else power # prev_p = self._last_power if self._last_power is not None else power
# step_wh = ((power + prev_p) / 2.0) * (dt / 3600.0) # step_wh = ((power + prev_p) / 2.0) * (dt / 3600.0)
@@ -762,6 +815,17 @@ class CycleDetector:
self._last_active_time = timestamp self._last_active_time = timestamp
else: else:
self._time_below_threshold += dt self._time_below_threshold += dt
# Gap-free tally: an outage-sized step is unobserved time, so restart
# the observed-quiet tally from this sample instead of crediting the
# gap. Ceiling mirrors energy_gap_threshold_s (clip(10x cadence, 60,
# 3600)) but reuses the maintained p95 cadence to stay O(1) in this
# per-reading hot path. Uses the cadence as it stood BEFORE this
# reading, so a gap cannot widen its own acceptance threshold.
outage_ceiling = min(3600.0, max(60.0, 10.0 * prior_p95_dt))
if dt > outage_ceiling:
self._time_below_threshold_gapfree = 0.0
else:
self._time_below_threshold_gapfree += dt
self._time_above_threshold = 0.0 self._time_above_threshold = 0.0
self._time_in_state += dt self._time_in_state += dt
@@ -1347,6 +1411,31 @@ class CycleDetector:
# waits for the fallback timeout instead of getting an early # waits for the fallback timeout instead of getting an early
# close — an acceptable trade-off against the alternative of # close — an acceptable trade-off against the alternative of
# splitting a Normal wash into two separate cycle records. # splitting a Normal wash into two separate cycle records.
# Surface why the fast end-path is (not) firing, throttled to
# reason changes so a stuck cycle's cause is visible in the log
# without spamming every reading. Pure diagnostic (#346).
_block_reason = self._smart_term_block_reason(
current_duration,
self._expected_duration,
smart_ratio,
is_confident_match,
self._match_ambiguous,
self._match_prefix_ambiguous,
)
if _block_reason != self._last_smart_term_block_reason:
self._last_smart_term_block_reason = _block_reason
if _block_reason is not None:
self._logger.debug(
"Smart Termination not applied (%s): dur=%.0fs/%.0fs conf=%.2f "
"ambiguous=%s prefix_ambiguous=%s",
_block_reason,
current_duration,
self._expected_duration * smart_ratio,
getattr(self, "_last_match_confidence", 0.0),
self._match_ambiguous,
self._match_prefix_ambiguous,
)
if ( if (
current_duration >= (self._expected_duration * smart_ratio) current_duration >= (self._expected_duration * smart_ratio)
and is_confident_match and is_confident_match
@@ -1421,8 +1510,8 @@ class CycleDetector:
+ DISHWASHER_END_SPIKE_WAIT_SECONDS + DISHWASHER_END_SPIKE_WAIT_SECONDS
) or ( ) or (
current_duration >= self._expected_duration current_duration >= self._expected_duration
and self._time_below_threshold and self._time_below_threshold_gapfree
>= DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS >= self._config.dishwasher_end_spike_quiet_release
) )
if ( if (
self._config.device_type == "dishwasher" self._config.device_type == "dishwasher"
@@ -2130,8 +2219,8 @@ class CycleDetector:
# passive-drying phase that still precedes a late pump-out deferred. # passive-drying phase that still precedes a late pump-out deferred.
quiet_released = ( quiet_released = (
duration >= self._expected_duration duration >= self._expected_duration
and self._time_below_threshold and self._time_below_threshold_gapfree
>= DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS >= self._config.dishwasher_end_spike_quiet_release
) )
if ( if (
self._config.device_type == "dishwasher" self._config.device_type == "dishwasher"
@@ -2142,13 +2231,18 @@ class CycleDetector:
< (self._expected_duration + DISHWASHER_END_SPIKE_WAIT_SECONDS) < (self._expected_duration + DISHWASHER_END_SPIKE_WAIT_SECONDS)
and not quiet_released and not quiet_released
): ):
# Report the gap-free tally: that is what `quiet_released` above reads,
# and after a telemetry outage the two diverge - logging the plain one
# would show quiet time that played no part in the decision.
self._logger.debug( self._logger.debug(
"Deferring cycle finish: dishwasher waiting for end-of-cycle " "Deferring cycle finish: dishwasher waiting for end-of-cycle "
"pump-out (%.0fs < expected %.0fs + %.0fs wait, quiet %.0fs, profile: %s)", "pump-out (%.0fs < expected %.0fs + %.0fs wait, observed quiet "
"%.0fs of %.0fs needed, profile: %s)",
duration, duration,
self._expected_duration, self._expected_duration,
DISHWASHER_END_SPIKE_WAIT_SECONDS, DISHWASHER_END_SPIKE_WAIT_SECONDS,
self._time_below_threshold, self._time_below_threshold_gapfree,
self._config.dishwasher_end_spike_quiet_release,
self._matched_profile, self._matched_profile,
) )
return True return True
@@ -2247,9 +2341,13 @@ class CycleDetector:
final_readings.append((end_time, last_p)) final_readings.append((end_time, last_p))
start_ts = self._current_cycle_start.timestamp() start_ts = self._current_cycle_start.timestamp()
# Store timestamps in canonical UTC (#369). Reading timestamps arrive from
# dt_util.now() (HA-local-aware) while trim/split paths emit UTC, which left
# past_cycles with a mix of offsets. Normalizing here (instant-preserving)
# keeps stored cycles consistent and safe for cross-device/store transfer.
cycle_data: dict[str, Any] = { cycle_data: dict[str, Any] = {
"start_time": self._current_cycle_start.isoformat(), "start_time": dt_util.as_utc(self._current_cycle_start).isoformat(),
"end_time": end_time.isoformat(), "end_time": dt_util.as_utc(end_time).isoformat(),
"duration": duration, "duration": duration,
"max_power": self._cycle_max_power, "max_power": self._cycle_max_power,
"status": status, "status": status,
@@ -2329,6 +2427,7 @@ class CycleDetector:
"accumulated_energy_wh": self._energy_since_idle_wh, "accumulated_energy_wh": self._energy_since_idle_wh,
"time_above": self._time_above_threshold, "time_above": self._time_above_threshold,
"time_below": self._time_below_threshold, "time_below": self._time_below_threshold,
"time_below_gapfree": self._time_below_threshold_gapfree,
"cycle_max_power": self._cycle_max_power, "cycle_max_power": self._cycle_max_power,
"last_active_time": ( "last_active_time": (
self._last_active_time.isoformat() if self._last_active_time else None self._last_active_time.isoformat() if self._last_active_time else None
@@ -2366,6 +2465,15 @@ class CycleDetector:
self._energy_since_idle_wh = snapshot.get("accumulated_energy_wh", 0.0) self._energy_since_idle_wh = snapshot.get("accumulated_energy_wh", 0.0)
self._time_above_threshold = snapshot.get("time_above", 0.0) self._time_above_threshold = snapshot.get("time_above", 0.0)
self._time_below_threshold = snapshot.get("time_below", 0.0) self._time_below_threshold = snapshot.get("time_below", 0.0)
# Old snapshots lack the gap-free tally, and the plain value they do
# carry may already include outage-sized intervals — the exact
# contamination this field exists to exclude — so it must NOT be used
# as the fallback. 0.0 is also the honest value on a restore in
# general: the restart itself is unobserved time (the manager records
# it as a restart gap), so no quiet observed before it still counts.
self._time_below_threshold_gapfree = float(
snapshot.get("time_below_gapfree", 0.0) or 0.0
)
self._cycle_max_power = snapshot.get("cycle_max_power", 0.0) self._cycle_max_power = snapshot.get("cycle_max_power", 0.0)
# Sanitize via the same helper as update_match so the class # Sanitize via the same helper as update_match so the class
# invariant on _expected_duration holds across restarts and the # invariant on _expected_duration holds across restarts and the
+73 -9
View File
@@ -161,8 +161,23 @@ class LearningManager:
and (len(past_cycles) - last_apply_count) < MIN_SUGGESTION_COOLDOWN_CYCLES and (len(past_cycles) - last_apply_count) < MIN_SUGGESTION_COOLDOWN_CYCLES
) )
# Locked keys (#343): the user has told the auto-tuner to stop proposing
# these (e.g. thresholds that break an anti-crease-tuned device). Drop them
# from the pending map so they never re-surface until unlocked.
try:
locked = set(self.profile_store.get_locked_suggestions())
except Exception: # pylint: disable=broad-exception-caught
locked = set()
existing_suggestions = self.profile_store.get_suggestions()
filtered_suggestions: dict[str, Any] = {} filtered_suggestions: dict[str, Any] = {}
any_deleted = False
for key, data in suggestions.items(): for key, data in suggestions.items():
if key in locked:
if key in existing_suggestions:
self.profile_store.delete_suggestion(key)
any_deleted = True
continue
if isinstance(data, dict) and "value" in data: if isinstance(data, dict) and "value" in data:
current_val = current_options.get(key) current_val = current_options.get(key)
suggested_val = data["value"] suggested_val = data["value"]
@@ -174,6 +189,7 @@ class LearningManager:
# Gate 1: exact equality → stale, delete so it doesn't linger. # Gate 1: exact equality → stale, delete so it doesn't linger.
if abs_delta < 1e-9: if abs_delta < 1e-9:
self.profile_store.delete_suggestion(key) self.profile_store.delete_suggestion(key)
any_deleted = True
continue continue
# Gate 2: change too small to be meaningful → delete (noise). # Gate 2: change too small to be meaningful → delete (noise).
@@ -181,6 +197,7 @@ class LearningManager:
if (rel_delta < MIN_SUGGESTION_REL_DELTA if (rel_delta < MIN_SUGGESTION_REL_DELTA
and abs_delta < _suggestion_min_abs_delta(key)): and abs_delta < _suggestion_min_abs_delta(key)):
self.profile_store.delete_suggestion(key) self.profile_store.delete_suggestion(key)
any_deleted = True
continue continue
# Gate 3: cooldown active → skip update without deleting. # Gate 3: cooldown active → skip update without deleting.
@@ -195,6 +212,8 @@ class LearningManager:
filtered_suggestions[key] = data filtered_suggestions[key] = data
if not filtered_suggestions: if not filtered_suggestions:
if any_deleted:
self.hass.async_create_task(self.profile_store.async_save())
return return
self.suggestion_engine.apply_suggestions(filtered_suggestions) self.suggestion_engine.apply_suggestions(filtered_suggestions)
@@ -295,8 +314,9 @@ class LearningManager:
async def _async_run_batch_simulation(self, cycles: list[dict[str, Any]]) -> None: async def _async_run_batch_simulation(self, cycles: list[dict[str, Any]]) -> None:
"""Run multi-cycle batch simulation asynchronously.""" """Run multi-cycle batch simulation asynchronously."""
try: try:
engine = self.suggestion_engine.for_job()
new_suggestions = await self.hass.async_add_executor_job( new_suggestions = await self.hass.async_add_executor_job(
self.suggestion_engine.run_batch_simulation, cycles engine.run_batch_simulation, cycles
) )
if new_suggestions: if new_suggestions:
self._apply_suggestions_and_notify(new_suggestions) self._apply_suggestions_and_notify(new_suggestions)
@@ -313,8 +333,9 @@ class LearningManager:
try: try:
# Simulation runner derives optimal thresholds # Simulation runner derives optimal thresholds
# Offload to executor since simulation can be heavy (CPU bound) # Offload to executor since simulation can be heavy (CPU bound)
engine = self.suggestion_engine.for_job()
new_suggestions = await self.hass.async_add_executor_job( new_suggestions = await self.hass.async_add_executor_job(
self.suggestion_engine.run_simulation, cycle_data engine.run_simulation, cycle_data
) )
if new_suggestions: if new_suggestions:
self._apply_suggestions_and_notify(new_suggestions) self._apply_suggestions_and_notify(new_suggestions)
@@ -342,8 +363,10 @@ class LearningManager:
# Throttle before dispatching so repeated readings within the window do # Throttle before dispatching so repeated readings within the window do
# not schedule overlapping passes. # not schedule overlapping passes.
self._last_suggestion_update = now self._last_suggestion_update = now
# Bind the config snapshot here, on the loop, not inside the executor job.
engine = self.suggestion_engine.for_job()
self._dispatch_scan_and_apply( self._dispatch_scan_and_apply(
lambda: self.suggestion_engine.generate_operational_suggestions(p95, median), lambda: engine.generate_operational_suggestions(p95, median),
"Operational", "Operational",
) )
@@ -354,7 +377,7 @@ class LearningManager:
offloaded to an executor thread by ``_dispatch_scan_and_apply``. offloaded to an executor thread by ``_dispatch_scan_and_apply``.
""" """
self._dispatch_scan_and_apply( self._dispatch_scan_and_apply(
self.suggestion_engine.generate_model_suggestions, self.suggestion_engine.for_job().generate_model_suggestions,
"Model", "Model",
) )
@@ -408,8 +431,9 @@ class LearningManager:
async def _async_run_detection_suggestions(self) -> None: async def _async_run_detection_suggestions(self) -> None:
"""Run the detection-suggestion pass off the event loop.""" """Run the detection-suggestion pass off the event loop."""
try: try:
engine = self.suggestion_engine.for_job()
new_suggestions = await self.hass.async_add_executor_job( new_suggestions = await self.hass.async_add_executor_job(
self.suggestion_engine.generate_detection_suggestions engine.generate_detection_suggestions
) )
if new_suggestions: if new_suggestions:
self._apply_suggestions_and_notify(new_suggestions) self._apply_suggestions_and_notify(new_suggestions)
@@ -432,12 +456,13 @@ class LearningManager:
if model.count >= 20 and model.p95 is not None and model.median is not None: if model.count >= 20 and model.p95 is not None and model.median is not None:
p95, median = model.p95, model.median p95, median = model.p95, model.median
op = await self.hass.async_add_executor_job( op = await self.hass.async_add_executor_job(
self.suggestion_engine.generate_operational_suggestions, p95, median self.suggestion_engine.for_job().generate_operational_suggestions,
p95, median
) )
if op: if op:
self._apply_suggestions_and_notify(op) self._apply_suggestions_and_notify(op)
model_sug = await self.hass.async_add_executor_job( model_sug = await self.hass.async_add_executor_job(
self.suggestion_engine.generate_model_suggestions self.suggestion_engine.for_job().generate_model_suggestions
) )
if model_sug: if model_sug:
self._apply_suggestions_and_notify(model_sug) self._apply_suggestions_and_notify(model_sug)
@@ -445,7 +470,7 @@ class LearningManager:
# Snapshot the live cycles list before handing it to the executor. # Snapshot the live cycles list before handing it to the executor.
cycles = list(self.profile_store.get_past_cycles()) cycles = list(self.profile_store.get_past_cycles())
batch = await self.hass.async_add_executor_job( batch = await self.hass.async_add_executor_job(
self.suggestion_engine.run_batch_simulation, cycles self.suggestion_engine.for_job().run_batch_simulation, cycles
) )
if batch: if batch:
self._apply_suggestions_and_notify(batch) self._apply_suggestions_and_notify(batch)
@@ -844,10 +869,49 @@ class LearningManager:
affected envelopes), so this only records the feedback response and removes affected envelopes), so this only records the feedback response and removes
the pending entry - it deliberately does NOT re-label or rebuild again. the pending entry - it deliberately does NOT re-label or rebuild again.
Returns True when a pending entry existed and was resolved. Returns True when a pending entry existed and was resolved, OR when no
pending feedback was found but the cycle was sitting in the review queue
(uncertain quality / force_stopped / interrupted) and was marked reviewed.
Returns False when there was nothing to resolve or update.
""" """
pending = self.profile_store.get_pending_feedback().get(cycle_id) pending = self.profile_store.get_pending_feedback().get(cycle_id)
if not pending: if not pending:
# No detection feedback to resolve. A manual (re)label is still the user
# engaging with the cycle, so if it is sitting in the review queue only
# for an uncertain quality label or a force_stopped/interrupted status
# (no pending feedback, so it has no resolve buttons), stamp it reviewed
# to clear the red dot (#331 residual). The quality/label fields are left
# untouched, so no training signal is lost; normal cycles are not touched.
try:
cycle = next(
(c for c in self.profile_store.get_past_cycles() if c.get("id") == cycle_id),
None,
)
except Exception: # pylint: disable=broad-exception-caught
cycle = None
if cycle is not None:
rv = cycle.get("ml_review") if isinstance(cycle.get("ml_review"), dict) else {}
already_reviewed = bool(rv.get("reviewed_at"))
needs_review = (
rv.get("label") in ("uncertain", "review")
or rv.get("quality") in ("uncertain", "review")
or cycle.get("status") in ("force_stopped", "interrupted")
or (cycle.get("ml_health") or {}).get("label") in ("uncertain", "review")
)
if needs_review and not already_reviewed:
try:
await self.profile_store.set_cycle_review(cycle_id)
except Exception as err: # pylint: disable=broad-exception-caught
self._logger.debug(
"set_cycle_review failed for cycle %s: %s", cycle_id, err
)
return False
async_dispatcher_send(self.hass, f"ha_washdata_update_{self.entry_id}")
self._logger.info(
"Marked cycle %s reviewed from manual label (no pending feedback; "
"cleared needs-review red dot)", cycle_id
)
return True
return False return False
detected = pending.get("detected_profile") detected = pending.get("detected_profile")
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -21,5 +21,5 @@
"requirements": [ "requirements": [
"numpy" "numpy"
], ],
"version": "0.5.3" "version": "0.5.4"
} }
@@ -156,6 +156,7 @@ def _grid() -> list[dict[str, Any]]:
def tune_matching_config( def tune_matching_config(
cycles: list[dict[str, Any]], cycles: list[dict[str, Any]],
device_type: str | None = None,
*, *,
min_cycles: int = 25, min_cycles: int = 25,
# Kept intentionally low so per-device tuning becomes useful early; the noise # Kept intentionally low so per-device tuning becomes useful early; the noise
@@ -206,7 +207,9 @@ def tune_matching_config(
if not holdout_pool: if not holdout_pool:
return {"promoted": False, "reason": "too few targets", "n_targets": len(targets)} return {"promoted": False, "reason": "too few targets", "n_targets": len(targets)}
base = {**_BASE_CFG} # Tune under the same Stage-4 energy mode production uses for this device type,
# so promoted weights are consistent with the live matcher.
base = {**_BASE_CFG, "energy_mode": analysis.stage4_energy_mode(device_type)}
# Candidate: the grid config with the best top-1 on the SEARCH pool only. # Candidate: the grid config with the best top-1 on the SEARCH pool only.
best_search = _top1(by_profile, search_pool, base) best_search = _top1(by_profile, search_pool, base)
best_cfg = base best_cfg = base
+119 -1
View File
@@ -53,6 +53,7 @@ from .const import (
CONF_ANTI_WRINKLE_ENABLED, CONF_ANTI_WRINKLE_ENABLED,
CONF_ANTI_WRINKLE_EXIT_POWER, CONF_ANTI_WRINKLE_EXIT_POWER,
CONF_ANTI_WRINKLE_IDLE_TIMEOUT, CONF_ANTI_WRINKLE_IDLE_TIMEOUT,
CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE,
CONF_ANTI_WRINKLE_MAX_DURATION, CONF_ANTI_WRINKLE_MAX_DURATION,
CONF_ANTI_WRINKLE_MAX_POWER, CONF_ANTI_WRINKLE_MAX_POWER,
CONF_COMPLETION_MIN_SECONDS, CONF_COMPLETION_MIN_SECONDS,
@@ -74,19 +75,24 @@ from .const import (
CONF_STOP_THRESHOLD_W, CONF_STOP_THRESHOLD_W,
CYCLE_OVERRUN_ANOMALY_RATIO, CYCLE_OVERRUN_ANOMALY_RATIO,
CYCLE_UNDERRUN_ANOMALY_RATIO, CYCLE_UNDERRUN_ANOMALY_RATIO,
DEFAULT_DTW_BANDWIDTH,
DEFAULT_MATCH_PERSISTENCE, DEFAULT_MATCH_PERSISTENCE,
DEFAULT_NOTIFY_BEFORE_END_MINUTES, DEFAULT_NOTIFY_BEFORE_END_MINUTES,
DEFAULT_NOTIFY_MILESTONES, DEFAULT_NOTIFY_MILESTONES,
DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO,
DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO,
MATCH_CORR_WEIGHT, MATCH_CORR_WEIGHT,
MATCH_DDTW_DIST_SCALE, MATCH_DDTW_DIST_SCALE,
MATCH_DTW_BLEND, MATCH_DTW_BLEND,
MATCH_DTW_DIST_SCALE, MATCH_DTW_DIST_SCALE,
MATCH_DTW_ENSEMBLE_W, MATCH_DTW_ENSEMBLE_W,
MATCH_DTW_REFINE_TOP_N,
MATCH_DTW_RESAMPLE_N, MATCH_DTW_RESAMPLE_N,
MATCH_DURATION_SCALE, MATCH_DURATION_SCALE,
MATCH_DURATION_WEIGHT, MATCH_DURATION_WEIGHT,
MATCH_ENERGY_SCALE, MATCH_ENERGY_SCALE,
MATCH_ENERGY_WEIGHT, MATCH_ENERGY_WEIGHT,
MATCH_KEEP_MIN_SCORE,
MATCH_MAE_PEAK_FLOOR, MATCH_MAE_PEAK_FLOOR,
MATCH_MAE_REF_PEAK, MATCH_MAE_REF_PEAK,
MATCH_MAE_SCALE, MATCH_MAE_SCALE,
@@ -161,6 +167,7 @@ _OVERRIDE_FIELD_MAP: dict[str, tuple[str, Callable[[Any], Any]]] = {
CONF_ANTI_WRINKLE_MAX_DURATION: ("anti_wrinkle_max_duration", float), CONF_ANTI_WRINKLE_MAX_DURATION: ("anti_wrinkle_max_duration", float),
CONF_ANTI_WRINKLE_EXIT_POWER: ("anti_wrinkle_exit_power", float), CONF_ANTI_WRINKLE_EXIT_POWER: ("anti_wrinkle_exit_power", float),
CONF_ANTI_WRINKLE_IDLE_TIMEOUT: ("anti_wrinkle_idle_timeout", float), CONF_ANTI_WRINKLE_IDLE_TIMEOUT: ("anti_wrinkle_idle_timeout", float),
CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE: ("dishwasher_end_spike_quiet_release", float),
CONF_OFF_DELAY: ("off_delay", int), CONF_OFF_DELAY: ("off_delay", int),
CONF_MIN_OFF_GAP: ("min_off_gap", int), CONF_MIN_OFF_GAP: ("min_off_gap", int),
CONF_COMPLETION_MIN_SECONDS: ("completion_min_seconds", int), CONF_COMPLETION_MIN_SECONDS: ("completion_min_seconds", int),
@@ -200,6 +207,112 @@ _MATCH_OVERRIDE_KEYS: dict[str, tuple[str, Callable[[Any], Any]]] = {
} }
# Canonical default for every matching override key, keyed by the OPTION key the
# Playground uses. The Stage 2-4 entries are code constants (not stored options),
# so this table is the only place the panel can read them from; ``ws_get_constants``
# ships it as ``pg_match_defaults`` and ``effective_settings`` falls back to it for
# any key the live matcher config does not carry.
MATCH_DEFAULTS_BY_OPTION: dict[str, Any] = {
CONF_PROFILE_MATCH_MIN_DURATION_RATIO: DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO,
CONF_PROFILE_MATCH_MAX_DURATION_RATIO: DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO,
"corr_weight": MATCH_CORR_WEIGHT,
"keep_min_score": MATCH_KEEP_MIN_SCORE,
"dtw_bandwidth": DEFAULT_DTW_BANDWIDTH,
"dtw_blend": MATCH_DTW_BLEND,
"dtw_ensemble_w": MATCH_DTW_ENSEMBLE_W,
"dtw_ddtw_scale": MATCH_DDTW_DIST_SCALE,
"dtw_refine_top_n": MATCH_DTW_REFINE_TOP_N,
"duration_weight": MATCH_DURATION_WEIGHT,
"energy_weight": MATCH_ENERGY_WEIGHT,
"duration_scale": MATCH_DURATION_SCALE,
"energy_scale": MATCH_ENERGY_SCALE,
}
# Every option key the Playground control panel may carry (detection + matching).
# This is the allow-list for a saved Playground preset: anything else submitted by
# a client is dropped rather than stored.
SETTING_KEYS: frozenset[str] = frozenset(_OVERRIDE_FIELD_MAP) | frozenset(_MATCH_OVERRIDE_KEYS)
# The subset a user may publish from the Playground back into the live config:
# exactly the override keys that are REAL config-entry options (``CONF_*``). The
# Stage 2-4 scoring knobs above are sandbox-only code constants - there is no
# option behind them, so writing them into ``entry.options`` would create dead
# keys the integration never reads. The panel gates its publish buttons on this
# list (shipped by ``get_playground_settings``).
PUBLISHABLE_SETTING_KEYS: frozenset[str] = frozenset(_OVERRIDE_FIELD_MAP) | {
CONF_PROFILE_MATCH_MIN_DURATION_RATIO,
CONF_PROFILE_MATCH_MAX_DURATION_RATIO,
}
def effective_settings(
base_config: CycleDetectorConfig, match_config: dict[str, Any] | None
) -> dict[str, Any]:
"""Option-keyed view of the values a simulation runs with when NO override is
staged - i.e. the device's live, fully-resolved settings.
The exact inverse of ``build_sim_config`` / ``apply_match_overrides``: it reads
back the same fields those two write, so the Playground control panel shows the
values the integration actually uses (device-type defaults included) instead of
a static schema default that may have drifted. Never raises.
"""
out: dict[str, Any] = {}
for opt_key, (field, coerce) in _OVERRIDE_FIELD_MAP.items():
value = getattr(base_config, field, None)
if value is None:
continue
try:
out[opt_key] = coerce(value)
except (TypeError, ValueError): # pragma: no cover - defensive
continue
cfg = match_config or {}
for opt_key, (cfg_key, coerce) in _MATCH_OVERRIDE_KEYS.items():
value = cfg.get(cfg_key, MATCH_DEFAULTS_BY_OPTION.get(opt_key))
if value is None:
continue
try:
out[opt_key] = coerce(value)
except (TypeError, ValueError): # pragma: no cover - defensive
continue
return out
def sanitize_setting_values(values: Any) -> dict[str, Any]:
"""Filter a client-supplied settings map down to storable Playground values.
Keeps only keys in :data:`SETTING_KEYS`, coerced with the same coercers the
simulation uses, so a preset can never carry an unknown key or a value that
would be silently ignored at replay time. Never raises.
"""
if not isinstance(values, dict):
return {}
out: dict[str, Any] = {}
for key, value in values.items():
if value is None:
continue
mapping = _OVERRIDE_FIELD_MAP.get(key) or _MATCH_OVERRIDE_KEYS.get(key)
if mapping is None:
continue
_target, coerce = mapping
try:
coerced = coerce(value)
except (TypeError, ValueError):
continue
if isinstance(coerced, float) and not math.isfinite(coerced):
continue
# Every Playground setting is a physical quantity - watts, seconds, a
# count, or a ratio - so a negative value is structurally meaningless and
# would make the replayed detector behave in ways the live one never can
# (e.g. an off_delay that expires before it starts). Rejected rather than
# clamped: silently rewriting a value the user typed would make the sim
# disagree with the control panel showing it back.
if isinstance(coerced, (int, float)) and not isinstance(coerced, bool):
if coerced < 0:
continue
out[key] = coerced
return out
def apply_match_overrides( def apply_match_overrides(
match_config: dict[str, Any], settings_override: dict[str, Any] | None match_config: dict[str, Any], settings_override: dict[str, Any] | None
) -> dict[str, Any]: ) -> dict[str, Any]:
@@ -207,7 +320,8 @@ def apply_match_overrides(
``settings_override`` overlaid onto the matcher-config keys they drive. ``settings_override`` overlaid onto the matcher-config keys they drive.
Unknown/None/malformed values are ignored, so a detection-only override leaves Unknown/None/malformed values are ignored, so a detection-only override leaves
matching byte-identical to the live config.""" matching byte-identical to the live config."""
if not settings_override: settings_override = sanitize_setting_values(settings_override)
if not isinstance(settings_override, dict) or not settings_override:
return match_config return match_config
out = dict(match_config) out = dict(match_config)
for opt_key, (cfg_key, coerce) in _MATCH_OVERRIDE_KEYS.items(): for opt_key, (cfg_key, coerce) in _MATCH_OVERRIDE_KEYS.items():
@@ -229,6 +343,7 @@ def build_sim_config(
Unknown keys and un-coercible values are ignored so a malformed override can Unknown keys and un-coercible values are ignored so a malformed override can
never break a simulation. ``base`` is left untouched. never break a simulation. ``base`` is left untouched.
""" """
settings_override = sanitize_setting_values(settings_override)
if not isinstance(settings_override, dict) or not settings_override: if not isinstance(settings_override, dict) or not settings_override:
return base return base
changes: dict[str, Any] = {} changes: dict[str, Any] = {}
@@ -348,6 +463,8 @@ def _matching_config(store: Any) -> dict[str, Any]:
"min_duration_ratio": float(getattr(store, "_min_duration_ratio", 0.07)), "min_duration_ratio": float(getattr(store, "_min_duration_ratio", 0.07)),
"max_duration_ratio": float(getattr(store, "_max_duration_ratio", 1.5)), "max_duration_ratio": float(getattr(store, "_max_duration_ratio", 1.5)),
"dtw_bandwidth": float(getattr(store, "dtw_bandwidth", 0.2)), "dtw_bandwidth": float(getattr(store, "dtw_bandwidth", 0.2)),
# Mirror the live Stage-4 energy discriminator so the sim is byte-identical.
"energy_mode": str(getattr(store, "energy_mode", "mean")),
} }
try: try:
overrides = store._matching_overrides() # pylint: disable=protected-access overrides = store._matching_overrides() # pylint: disable=protected-access
@@ -1238,6 +1355,7 @@ def _sim_config_summary(config: CycleDetectorConfig) -> dict[str, Any]:
"anti_wrinkle_max_duration": getattr(config, "anti_wrinkle_max_duration", None), "anti_wrinkle_max_duration": getattr(config, "anti_wrinkle_max_duration", None),
"anti_wrinkle_exit_power": getattr(config, "anti_wrinkle_exit_power", None), "anti_wrinkle_exit_power": getattr(config, "anti_wrinkle_exit_power", None),
"anti_wrinkle_idle_timeout": getattr(config, "anti_wrinkle_idle_timeout", None), "anti_wrinkle_idle_timeout": getattr(config, "anti_wrinkle_idle_timeout", None),
"dishwasher_end_spike_quiet_release": getattr(config, "dishwasher_end_spike_quiet_release", None),
} }
+322 -51
View File
@@ -49,6 +49,8 @@ from .const import (
PHASE_HEAT_CV_WARN, PHASE_HEAT_CV_WARN,
PHASE_HEAT_OCC_MIXED_LO, PHASE_HEAT_OCC_MIXED_LO,
PHASE_HEAT_OCC_MIXED_HI, PHASE_HEAT_OCC_MIXED_HI,
PLAYGROUND_PRESET_MAX,
PLAYGROUND_PRESET_NAME_MAX,
REFERENCE_PROFILE_CURVE_POINTS, REFERENCE_PROFILE_CURVE_POINTS,
SHAPE_DRIFT_MIN_CYCLES, SHAPE_DRIFT_MIN_CYCLES,
SHAPE_DRIFT_RESAMPLE_N, SHAPE_DRIFT_RESAMPLE_N,
@@ -95,6 +97,12 @@ _LOGGER = logging.getLogger(__name__)
# and reference selection so degenerate cycles never become the matching template. # and reference selection so degenerate cycles never become the matching template.
_DEGENERATE_POWER_FLOOR = 15.0 # watts _DEGENERATE_POWER_FLOOR = 15.0 # watts
# How far outside the requested trim window a stored sample may still be snapped
# to. Trim boundaries arrive quantized to whole seconds (panel number input, the
# trim_cycle service), so one second is exactly the input's own resolution -- it
# absorbs that rounding without letting the kept window grow measurably.
_TRIM_SNAP_TOLERANCE_S = 1.0
JSONDict: TypeAlias = dict[str, Any] JSONDict: TypeAlias = dict[str, Any]
CycleDict: TypeAlias = dict[str, Any] CycleDict: TypeAlias = dict[str, Any]
@@ -1216,6 +1224,10 @@ class ProfileStore:
self._match_threshold = match_threshold self._match_threshold = match_threshold
self._unmatch_threshold = unmatch_threshold self._unmatch_threshold = unmatch_threshold
self.dtw_bandwidth: float = DEFAULT_DTW_BANDWIDTH self.dtw_bandwidth: float = DEFAULT_DTW_BANDWIDTH
# Stage-4 energy-agreement mode ("mean"|"integrated"); the manager sets it
# from the device type via analysis.stage4_energy_mode. Default "mean"
# keeps behaviour byte-identical until wired.
self.energy_mode: str = "mean"
self._save_debug_traces = save_debug_traces self._save_debug_traces = save_debug_traces
# Cache for resampled sample segments: key=(cycle_id, dt) # Cache for resampled sample segments: key=(cycle_id, dt)
@@ -1255,6 +1267,7 @@ class ProfileStore:
"ml_model_versions": {}, # On-device trained model specs (Stage 4) "ml_model_versions": {}, # On-device trained model specs (Stage 4)
"profile_groups": {}, # Named groups of near-duplicate profiles (Stage 5) "profile_groups": {}, # Named groups of near-duplicate profiles (Stage 5)
"maintenance_log": [], # User-logged maintenance events (Group E) "maintenance_log": [], # User-logged maintenance events (Group E)
"playground_presets": {}, # Named Playground setting snapshots (sandbox only)
} }
@@ -1302,6 +1315,31 @@ class ProfileStore:
suggestions: JSONDict = self._data.setdefault("suggestions", {}) suggestions: JSONDict = self._data.setdefault("suggestions", {})
suggestions.pop(key, None) suggestions.pop(key, None)
def get_locked_suggestions(self) -> list[str]:
"""Return the setting keys the user has locked against auto-tuning (#343).
A locked key is never re-surfaced as a suggestion, so the auto-tuner stops
repeatedly proposing a value the user has rejected (e.g. a stop/start
threshold that breaks an anti-crease-tuned device). Never raises.
"""
raw = self._data.get("locked_suggestions")
return [str(k) for k in raw] if isinstance(raw, list) else []
async def set_suggestion_locked(self, key: str, locked: bool) -> None:
"""Lock or unlock a suggestion key and persist (#343).
Locking also drops any currently-pending suggestion for the key so it
disappears immediately; unlocking lets the auto-tuner surface it again.
"""
cur = set(self.get_locked_suggestions())
if locked:
cur.add(key)
self.delete_suggestion(key)
else:
cur.discard(key)
self._data["locked_suggestions"] = sorted(cur)
await self.async_save()
async def clear_suggestions(self) -> None: async def clear_suggestions(self) -> None:
"""Clear all pending suggestions and persist.""" """Clear all pending suggestions and persist."""
self._data["suggestions"] = {} self._data["suggestions"] = {}
@@ -1746,7 +1784,7 @@ class ProfileStore:
if pairs[0][0] != 0.0: if pairs[0][0] != 0.0:
origin = pairs[0][0] origin = pairs[0][0]
pairs = [[p[0] - origin, p[1]] for p in pairs] pairs = [[p[0] - origin, p[1]] for p in pairs]
now = dt_util.now() now = dt_util.as_utc(dt_util.now())
store_id = str(meta.get("store_cycle_id") or "") store_id = str(meta.get("store_cycle_id") or "")
cycle: CycleDict = { cycle: CycleDict = {
"profile_name": profile_name, "profile_name": profile_name,
@@ -2010,14 +2048,31 @@ class ProfileStore:
self, current_power: list[float], current_duration: float, self, current_power: list[float], current_duration: float,
members: list[str], member_snaps: dict[str, dict[str, Any]], members: list[str], member_snaps: dict[str, dict[str, Any]],
) -> tuple[str, float | None, float | None]: ) -> tuple[str, float | None, float | None]:
"""Within a winning group, pick the member whose duration + mean power + """Within a winning group, pick the member whose integrated ENERGY best
peak best match the cycle (temperature -> mean power, spin -> peak). matches the cycle.
Group members already share shape and duration (that is what the cohesion
gate collapses them for), so the within-group discriminator is temperature
/ spin, and the clean signal for that is integrated energy (Sum P*dt) --
NOT whole-cycle mean power (diluted, because hotter cycles also run longer)
nor peak (dominated by the ~constant heating-element draw, so it is flat
across variants). Validated on real store data (leave-one-cycle-out member
pick, 196 cycles): energy-only 73.3% vs the old duration*mean*peak product
63.3%; adding any duration term back regressed it (grouped members are
duration-cohesive, so duration only adds noise). Duration is still returned
(for ETA and the overrun guard) but is intentionally not part of selection.
Returns (member_name, individual_fit_score, member_avg_duration). The fit Returns (member_name, individual_fit_score, member_avg_duration). The fit
score is the chosen member's own alignment score, used as a sanity check.""" score is the chosen member's own alignment score, used as a sanity check."""
cur = np.asarray(current_power, dtype=float) cur = np.asarray(current_power, dtype=float)
if cur.size == 0 or not members: if cur.size == 0 or not members:
return (members[0] if members else ""), None, None return (members[0] if members else ""), None, None
cur_mp = float(cur.mean()); cur_pk = float(cur.max()) # Energy proxy = mean power * duration; the 1/3600 Wh factor cancels in the
# log-ratio, so this is exact up to that constant. This proxy equals the
# true integral only because `current_power` is already resampled onto a
# uniform grid by the matcher; raw or irregular traces must use
# signal_processing.integrate_wh instead.
cur_energy = float(cur.mean()) * float(current_duration)
def agree(a: float, b: float, scale: float) -> float: def agree(a: float, b: float, scale: float) -> float:
if a <= 0 or b <= 0: if a <= 0 or b <= 0:
@@ -2033,9 +2088,9 @@ class ProfileStore:
if sp.size == 0: if sp.size == 0:
continue continue
md = float(snap.get("avg_duration") or 0.0) md = float(snap.get("avg_duration") or 0.0)
sc = (agree(current_duration, md, 0.15) mem_energy = float(sp.mean()) * md
* agree(cur_mp, float(sp.mean()), 0.20) # Scale 0.30 is validated as insensitive over 0.25-0.40 on real data.
* agree(cur_pk, float(sp.max()), 0.20)) sc = agree(cur_energy, mem_energy, 0.30)
if sc > best_sc: if sc > best_sc:
best_sc, best_m, best_dur = sc, m, md best_sc, best_m, best_dur = sc, m, md
fit = None fit = None
@@ -2286,6 +2341,83 @@ class ProfileStore:
await self.async_save() await self.async_save()
return True return True
# ─── Playground presets ────────────────────────────────────────────────────
# Named snapshots of the Playground's settings control panel. Sandbox data:
# nothing here ever reaches the live detector or matcher - the user publishes
# individual values to entry.options explicitly (ws_set_options) if they want
# them live. Stored per device because the values are device-scale (watts,
# seconds tuned for THIS appliance).
def get_playground_presets(self) -> dict[str, JSONDict]:
"""Return the mutable playground-presets mapping (name -> record).
Each record is ``{"values": {...}, "created_at": iso, "updated_at": iso}``.
Self-heals a corrupt/missing key to an empty mapping. Never raises.
"""
raw = self._data.setdefault("playground_presets", {})
if not isinstance(raw, dict):
self._data["playground_presets"] = {}
return cast(dict[str, JSONDict], self._data["playground_presets"])
return cast(dict[str, JSONDict], raw)
@staticmethod
def _playground_preset_key(name: str) -> str:
"""Canonical storage key for a Playground preset name.
Save and delete MUST derive the key the same way: truncating only on save
meant a name longer than the cap was stored truncated but looked up in
full, leaving a preset that could never be deleted. The trailing strip()
runs after the clamp so a cut landing mid-space cannot bake a trailing
space into the key.
"""
return (name or "").strip()[:PLAYGROUND_PRESET_NAME_MAX].strip()
async def async_save_playground_preset(
self, name: str, values: dict[str, Any]
) -> JSONDict:
"""Create or overwrite a named Playground preset and persist it.
``values`` must already be sanitized by ``playground.sanitize_setting_values``
(the store deliberately does not import the playground module - that would
be a cycle). Raises ``ValueError`` for an empty name, an empty value map, or
when the per-device preset cap is reached by a NEW name.
"""
name = self._playground_preset_key(name)
if not name:
raise ValueError("Preset name is required")
if not isinstance(values, dict) or not values:
raise ValueError("Preset has no settings to save")
presets = self.get_playground_presets()
existing = presets.get(name)
if existing is None and len(presets) >= PLAYGROUND_PRESET_MAX:
raise ValueError(
f"Preset limit reached ({PLAYGROUND_PRESET_MAX}); delete one first"
)
now = dt_util.now().isoformat()
created = now
if isinstance(existing, dict) and isinstance(existing.get("created_at"), str):
created = existing["created_at"]
record: JSONDict = {
"values": dict(values),
"created_at": created,
"updated_at": now,
}
presets[name] = record
await self.async_save()
self._logger.info(
"Saved playground preset %r with %d values", name, len(values)
)
return record
async def async_delete_playground_preset(self, name: str) -> bool:
"""Remove a Playground preset by name; report whether one was removed."""
presets = self.get_playground_presets()
if presets.pop(self._playground_preset_key(name), None) is None:
return False
await self.async_save()
self._logger.info("Deleted playground preset %r", name)
return True
def cycles_since_maintenance(self, event_type: str) -> int: def cycles_since_maintenance(self, event_type: str) -> int:
"""Count completed cycles since the most recent maintenance event of a type. """Count completed cycles since the most recent maintenance event of a type.
@@ -3835,9 +3967,11 @@ class ProfileStore:
if first_offset > 0: if first_offset > 0:
# Leading zeros removed - Must shift start_time forward # Leading zeros removed - Must shift start_time forward
try: try:
start_dt = datetime.fromisoformat(cycle["start_time"]) start_dt = _parse_start_dt(cycle["start_time"])
if start_dt is None:
raise ValueError("unparseable start_time")
new_start = start_dt + timedelta(seconds=first_offset) new_start = start_dt + timedelta(seconds=first_offset)
cycle["start_time"] = new_start.isoformat() cycle["start_time"] = dt_util.as_utc(new_start).isoformat()
# Re-normalize offsets to 0 # Re-normalize offsets to 0
shifted_data: list[list[float]] = [] shifted_data: list[list[float]] = []
@@ -4501,6 +4635,92 @@ class ProfileStore:
return cast(JSONDict, env) if isinstance(env, dict) else None return cast(JSONDict, env) if isinstance(env, dict) else None
return None return None
@staticmethod
def _envelope_time_power(
envelope: JSONDict | None,
) -> tuple[list[float], list[float]] | None:
"""Extract (time_grid, power) from an envelope's ``avg`` curve, or None.
Handles both the new ``[[t, p], ...]`` and legacy ``[p, ...]`` formats
(reconstructing the grid from ``time_grid`` / ``target_duration`` / a 60 s
fallback). Single source of the envelope time axis for both the alignment
worker and the Smart-Termination release span (#348), so the mapped position
and the span it is compared against always live on the same grid.
"""
if not envelope:
return None
env_avg_raw = envelope.get("avg", [])
if not env_avg_raw:
return None
try:
if isinstance(env_avg_raw[0], (list, tuple)) and len(env_avg_raw[0]) >= 2:
env_points = cast(list[list[Any] | tuple[Any, ...]], env_avg_raw)
env_time = [float(p[0]) for p in env_points]
env_power = [float(p[1]) for p in env_points]
else:
env_values = cast(list[float | int], env_avg_raw)
env_power = [float(p) for p in env_values]
env_time_raw = envelope.get("time_grid")
env_time = cast(list[float], env_time_raw) if isinstance(env_time_raw, list) else None
if not env_time or len(env_time) != len(env_power):
target_dur = float(envelope.get("target_duration", 0.0) or 0.0)
if target_dur > 0:
env_time = cast(list[float], np.linspace(0, target_dur, len(env_power)).tolist())
else:
env_time = [float(i * 60) for i in range(len(env_power))]
# Inside the try: a stored time_grid with non-numeric entries must
# yield the safe None fallback, not propagate to async_verify_alignment.
return [float(t) for t in env_time], env_power
except (TypeError, ValueError, IndexError):
return None
@staticmethod
def _resample_trace_to_grid(
offsets: list[float], powers: list[float], env_time: list[float]
) -> list[float]:
"""Resample a live ``(offsets, powers)`` trace onto the envelope's uniform
time step, so its sample index maps to elapsed seconds on the envelope grid
(#350). Linear interpolation (matching the envelope build side), bounded at
2x the envelope length. Falls back to the raw powers when a grid cannot be
formed (too few points / non-positive step), leaving behavior unchanged.
"""
if len(offsets) < 2 or len(env_time) < 2:
return list(powers)
diffs = np.diff(np.asarray(env_time, dtype=float))
pos = diffs[diffs > 0]
if pos.size == 0:
return list(powers)
step = float(np.median(pos))
span = float(env_time[-1])
# Sort and deduplicate before computing t_max so the grid span reflects the
# true maximum offset even when the raw trace is non-monotonic.
off_arr = np.asarray(offsets, dtype=float)
pow_arr = np.asarray(powers, dtype=float)
order = np.argsort(off_arr, kind="stable")
off_arr, pow_arr = off_arr[order], pow_arr[order]
# Remove duplicate offsets; np.unique keeps the first occurrence after sorting.
off_arr, unique_idx = np.unique(off_arr, return_index=True)
pow_arr = pow_arr[unique_idx]
t_max = min(float(off_arr[-1]), 2.0 * span) if span > 0 else float(off_arr[-1])
if step <= 0 or t_max <= 0:
return list(powers)
n = max(2, round(t_max / step) + 1)
grid = np.arange(n, dtype=float) * step
return np.interp(grid, off_arr, pow_arr).tolist()
def envelope_time_span(self, profile_name: str) -> float:
"""Total time span (seconds) of a profile's envelope grid, 0 if unavailable.
This is exactly the maximum value ``async_verify_alignment`` maps onto, so
dividing a mapped position by it yields a true 0..1 fraction through the
cycle - unlike ``avg_duration`` (a differently-derived trimmed mean) which
could push the 0.95 Smart-Termination release threshold out of reach (#348).
"""
curves = self._envelope_time_power(self.get_envelope(profile_name))
if not curves or not curves[0]:
return 0.0
return float(curves[0][-1])
def reference_curve( def reference_curve(
self, profile_name: str, n: int = REFERENCE_PROFILE_CURVE_POINTS self, profile_name: str, n: int = REFERENCE_PROFILE_CURVE_POINTS
) -> JSONDict | None: ) -> JSONDict | None:
@@ -5099,6 +5319,7 @@ class ProfileStore:
"min_duration_ratio": self._min_duration_ratio, "min_duration_ratio": self._min_duration_ratio,
"max_duration_ratio": self._max_duration_ratio, "max_duration_ratio": self._max_duration_ratio,
"dtw_bandwidth": self.dtw_bandwidth, "dtw_bandwidth": self.dtw_bandwidth,
"energy_mode": self.energy_mode,
# On-device tuned scoring weights (opt-in); empty = shipped defaults. # On-device tuned scoring weights (opt-in); empty = shipped defaults.
**self._matching_overrides(), **self._matching_overrides(),
} }
@@ -5203,48 +5424,50 @@ class ProfileStore:
Verify if the current power trace aligns with an expected low-power region in the envelope. Verify if the current power trace aligns with an expected low-power region in the envelope.
Returns: (is_confirmed_low_power, mapped_envelope_time, mapped_envelope_power) Returns: (is_confirmed_low_power, mapped_envelope_time, mapped_envelope_power)
""" """
if not current_power_data:
return False, 0.0, 9999.0
# "avg" can be a list of [t, p] (new) or [p, ...] (legacy); the shared helper
# normalizes both to (time_grid, power) - identical to envelope_time_span so
# the mapped position and the release span live on the same grid (#348).
envelope = self.get_envelope(profile_name) envelope = self.get_envelope(profile_name)
if not envelope or not envelope.get("avg") or not current_power_data: curves = self._envelope_time_power(envelope)
return False, 0.0, 9999.0 if curves is None:
if envelope and envelope.get("avg"):
# Extract envelope curves self._logger.error(
# "avg" can be list of [t, p] (new) or [p, ...] (legacy) "Malformed envelope 'avg' data for %s", profile_name
env_avg_raw = envelope.get("avg", []) )
if not env_avg_raw:
return False, 0.0, 9999.0 return False, 0.0, 9999.0
env_time, env_power = curves
# Resample the live trace onto the envelope's own time step BEFORE alignment,
# so its sample index corresponds to elapsed SECONDS, not sample count (#350).
# The worker warps power-vs-power; with no shared time axis an irregularly or
# sparsely sampled tail (e.g. 0 W keepalives every off_delay) maps one grid
# step per sample regardless of wall-clock, so the position crawls - and a
# dense short prefix instead races to the end. Linear interpolation matches
# the envelope build side so the two curves stay comparable.
try: try:
# Handle both formats: [[t, y], ...] (new) or [y, ...] (legacy) offsets = [float(x[0]) for x in current_power_data]
if isinstance(env_avg_raw[0], (list, tuple)) and len(env_avg_raw[0]) >= 2: powers = [float(x[1]) for x in current_power_data]
# New format: [[t, y], ...] except (TypeError, ValueError, IndexError):
env_points = cast(list[list[Any] | tuple[Any, ...]], env_avg_raw) # A legacy ISO-timestamped trace (x[0] is a string) lands here. The
env_time = [float(p[0]) for p in env_points] # signature admits ``list[tuple[Any, ...]]``, so normalize through the
env_power = [float(p[1]) for p in env_points] # shared helper instead of bailing out: returning early skipped
else: # alignment entirely, which silently reduced the legacy-envelope guard
# Legacy format: [y, ...] # in tests/repro/test_issue_112.py to a no-op. Production callers pass
env_values = cast(list[float | int], env_avg_raw) # offsets and never reach this branch, so the fast path is unchanged.
env_power = [float(p) for p in env_values] normalized = power_data_to_offsets(
# Reconstruct time grid from envelope if available, or assume 60s intervals cast(list[list[Any] | tuple[Any, ...]], current_power_data)
env_time_raw = envelope.get("time_grid")
env_time = cast(list[float], env_time_raw) if isinstance(env_time_raw, list) else None
if not env_time or len(env_time) != len(env_power):
target_dur = float(envelope.get("target_duration", 0.0) or 0.0)
if target_dur > 0:
env_time = cast(list[float], np.linspace(0, target_dur, len(env_power)).tolist())
else:
env_time = [float(i * 60) for i in range(len(env_power))]
except (TypeError, ValueError, IndexError) as e:
first_type_name = type(env_avg_raw[0]).__name__ if env_avg_raw else "None"
self._logger.error(
"Malformed envelope 'avg' data for %s. Type: %s, Length: %d, Error: %s",
profile_name, first_type_name, len(env_avg_raw), e
) )
return False, 0.0, 9999.0 if not normalized:
return False, 0.0, 9999.0
try: try:
current_power_list = [float(x[1]) for x in current_power_data] offsets = [float(x[0]) for x in normalized]
except Exception: # pylint: disable=broad-exception-caught powers = [float(x[1]) for x in normalized]
return False, 0.0, 9999.0 except (TypeError, ValueError, IndexError):
return False, 0.0, 9999.0
current_power_list = self._resample_trace_to_grid(offsets, powers, env_time)
# Offload to worker # Offload to worker
mapped_time, mapped_power, score = await self.hass.async_add_executor_job( mapped_time, mapped_power, score = await self.hass.async_add_executor_job(
@@ -5593,6 +5816,7 @@ class ProfileStore:
self._data["profiles"] = {} self._data["profiles"] = {}
self._data["envelopes"] = {} self._data["envelopes"] = {}
self._data["suggestions"] = {} self._data["suggestions"] = {}
self._data["locked_suggestions"] = []
self._data["feedback_history"] = {} self._data["feedback_history"] = {}
self._data["pending_feedback"] = {} self._data["pending_feedback"] = {}
self._data["auto_adjustments"] = [] self._data["auto_adjustments"] = []
@@ -5604,6 +5828,7 @@ class ProfileStore:
self._data["ml_model_versions"] = {} self._data["ml_model_versions"] = {}
self._data["profile_groups"] = {} self._data["profile_groups"] = {}
self._data["maintenance_log"] = [] self._data["maintenance_log"] = []
self._data["playground_presets"] = {}
self._data["matching_config"] = {} self._data["matching_config"] = {}
self._data["match_ranking_history"] = [] self._data["match_ranking_history"] = []
self._data["ml_last_training_run"] = None self._data["ml_last_training_run"] = None
@@ -6261,8 +6486,8 @@ class ProfileStore:
for c in self._data.get("reference_cycles", []): for c in self._data.get("reference_cycles", []):
if not isinstance(c, dict): if not isinstance(c, dict):
continue continue
meta = c.get("meta") cyc_meta = c.get("meta")
src = meta.get("source") if isinstance(meta, dict) else None src = cyc_meta.get("source") if isinstance(cyc_meta, dict) else None
if src: if src:
existing_ref_sources.add(_ref_dedup_key(src)) existing_ref_sources.add(_ref_dedup_key(src))
@@ -6530,6 +6755,36 @@ class ProfileStore:
new_start_s = max(0.0, float(new_start_s)) new_start_s = max(0.0, float(new_start_s))
new_end_s = float(new_end_s) new_end_s = float(new_end_s)
# Guard against a destructive trim (#366): an inverted/empty window would
# produce a zero- or single-sample segment that collapses the cycle to
# duration 0 / energy 0. Reject before touching the cycle.
if new_end_s <= new_start_s:
return False
# Snap both boundaries to a real sample offset (#373). Trim inputs round
# to whole seconds, but sample offsets are frequently fractional -- a
# nominal 10 s cadence drifts, so ~3132.3 is the norm -- and the
# [start, end] filter below is inclusive, so a whole-second entry lands
# just below the sample the user aimed at and silently drops it. Snapping
# against the full-resolution stored trace (independent of any client-side
# curve decimation) makes the kept window land on the samples the
# boundaries name, on both ends.
#
# Snap *inward*, tolerating only the whole-second input quantization
# (_TRIM_SNAP_TOLERANCE_S). Nearest-in-either-direction snapping could
# widen the window by up to half a sample interval per side -- on a
# coarse trace (samples at 0 s and 100 s, request 40-60 s) that silently
# kept the entire cycle while meta["trim"] claimed a narrow window.
offsets = [float(offset) for offset, _ in p_data]
starts = [o for o in offsets if o >= new_start_s - _TRIM_SNAP_TOLERANCE_S]
ends = [o for o in offsets if o <= new_end_s + _TRIM_SNAP_TOLERANCE_S]
if not starts or not ends:
return False
new_start_s = min(starts)
new_end_s = max(ends)
if new_end_s <= new_start_s:
return False
kept = sorted( kept = sorted(
( (
(offset, power) (offset, power)
@@ -6547,6 +6802,13 @@ class ProfileStore:
[round(offset - base, 2), power] for offset, power in kept [round(offset - base, 2), power] for offset, power in kept
] ]
# A window that keeps fewer than two samples (or whose kept span is zero)
# would collapse the cycle to duration 0 with no recovery. Reject here,
# BEFORE the start_time mutation below, so the stored cycle is untouched
# and the caller reports a failure instead of destroying data (#366).
if len(renorm) < 2 or round(renorm[-1][0], 1) <= 0.0:
return False
# Advance start_time when trimming from the front # Advance start_time when trimming from the front
if base > 0: if base > 0:
start_ts = _value_to_timestamp(cycle.get("start_time")) start_ts = _value_to_timestamp(cycle.get("start_time"))
@@ -6817,8 +7079,8 @@ class ProfileStore:
# Create Cycle Record # Create Cycle Record
new_cycle: dict[str, Any] = { new_cycle: dict[str, Any] = {
"start_time": new_cycle_start.isoformat(), "start_time": dt_util.as_utc(new_cycle_start).isoformat(),
"end_time": (new_cycle_start + timedelta(seconds=seg_dur)).isoformat(), "end_time": dt_util.as_utc(new_cycle_start + timedelta(seconds=seg_dur)).isoformat(),
"duration": round(seg_dur, 1), "duration": round(seg_dur, 1),
"status": "completed", "status": "completed",
"power_data": p_data_abs, "power_data": p_data_abs,
@@ -6860,6 +7122,10 @@ class ProfileStore:
for name in touched: for name in touched:
await self.async_rebuild_envelope(name) await self.async_rebuild_envelope(name)
# The original cycle is gone; drop its now-orphaned pending feedback so the
# "needs review" badge stays consistent with the review list (#362).
self.prune_orphaned_feedback()
await self.async_save() await self.async_save()
self._logger.info("Interactive Split Applied to %s -> %s", cycle_id, new_ids) self._logger.info("Interactive Split Applied to %s -> %s", cycle_id, new_ids)
return new_ids return new_ids
@@ -6995,7 +7261,8 @@ class ProfileStore:
new_dur = (final_end_dt - c1_start_dt).total_seconds() new_dur = (final_end_dt - c1_start_dt).total_seconds()
c1["end_time"] = final_end_dt.isoformat() c1["start_time"] = dt_util.as_utc(c1_start_dt).isoformat()
c1["end_time"] = dt_util.as_utc(final_end_dt).isoformat()
c1["duration"] = round(new_dur, 1) c1["duration"] = round(new_dur, 1)
c1["max_power"] = max_power c1["max_power"] = max_power
c1["profile_name"] = target_profile c1["profile_name"] = target_profile
@@ -7050,6 +7317,10 @@ class ProfileStore:
except Exception as e: # pylint: disable=broad-exception-caught except Exception as e: # pylint: disable=broad-exception-caught
self._logger.warning("Failed to update signature for merged cycle %s: %s", new_id, e) self._logger.warning("Failed to update signature for merged cycle %s: %s", new_id, e)
# Consumed cycles are gone; drop any pending feedback that pointed at them so
# the "needs review" badge does not keep counting non-existent cycles (#362).
self.prune_orphaned_feedback()
await self.async_save() await self.async_save()
self._logger.info("Interactive Merge Applied: %s -> %s", cycle_ids, new_id) self._logger.info("Interactive Merge Applied: %s -> %s", cycle_ids, new_id)
+21 -3
View File
@@ -56,6 +56,8 @@ from .const import (
SIGNAL_WASHER_UPDATE, SIGNAL_WASHER_UPDATE,
CONF_WATCHDOG_INTERVAL, CONF_WATCHDOG_INTERVAL,
CONF_EXPOSE_DEBUG_ENTITIES, CONF_EXPOSE_DEBUG_ENTITIES,
CONF_POWER_PROFILE_INTERVAL_MIN,
DEFAULT_POWER_PROFILE_INTERVAL_MIN,
DEVICE_TYPE_PUMP, DEVICE_TYPE_PUMP,
STATE_OFF, STATE_OFF,
STATE_IDLE, STATE_IDLE,
@@ -419,6 +421,7 @@ class WasherTimeRemainingSensor(WasherBaseSensor):
# duration display-format options, even while the appliance is idle # duration display-format options, even while the appliance is idle
# and the value is unknown (see issue #261). # and the value is unknown (see issue #261).
native_unit_of_measurement="min", native_unit_of_measurement="min",
suggested_display_precision=0,
icon="mdi:timer-sand", icon="mdi:timer-sand",
) )
super().__init__(manager, entry) super().__init__(manager, entry)
@@ -444,6 +447,7 @@ class WasherTotalDurationSensor(WasherBaseSensor):
# See WasherTimeRemainingSensor / issue #261: keep the unit static so # See WasherTimeRemainingSensor / issue #261: keep the unit static so
# the duration display-format options are available even while idle. # the duration display-format options are available even while idle.
native_unit_of_measurement="min", native_unit_of_measurement="min",
suggested_display_precision=0,
icon="mdi:timer-check-outline", icon="mdi:timer-check-outline",
) )
super().__init__(manager, entry) super().__init__(manager, entry)
@@ -529,6 +533,7 @@ class WasherElapsedTimeSensor(WasherBaseSensor):
translation_key="elapsed_time", translation_key="elapsed_time",
native_unit_of_measurement="s", native_unit_of_measurement="s",
device_class=SensorDeviceClass.DURATION, device_class=SensorDeviceClass.DURATION,
suggested_display_precision=0,
icon="mdi:timer-outline", icon="mdi:timer-outline",
) )
super().__init__(manager, entry) super().__init__(manager, entry)
@@ -736,6 +741,19 @@ class WasherProfileCountSensor(WasherBaseSensor):
def _to_min(sec: float) -> int: def _to_min(sec: float) -> int:
return int(sec / 60) if sec else 0 return int(sec / 60) if sec else 0
# power_profile bucket size (minutes) is configurable (#367); default 15.
# Clamp to >=1 (get_profile_power_profile returns [] for interval <= 0).
interval_min = DEFAULT_POWER_PROFILE_INTERVAL_MIN
try:
interval_min = int(
self._entry.options.get(
CONF_POWER_PROFILE_INTERVAL_MIN, DEFAULT_POWER_PROFILE_INTERVAL_MIN
)
)
except (TypeError, ValueError, OverflowError):
interval_min = DEFAULT_POWER_PROFILE_INTERVAL_MIN
interval_min = max(1, interval_min)
return { return {
"average_consumption_kwh": avg_energy, "average_consumption_kwh": avg_energy,
"total_consumption_kwh": total_energy, "total_consumption_kwh": total_energy,
@@ -744,16 +762,16 @@ class WasherProfileCountSensor(WasherBaseSensor):
"min_length_min": _to_min(profile.get("min_duration", 0)), "min_length_min": _to_min(profile.get("min_duration", 0)),
"max_length_min": _to_min(profile.get("max_duration", 0)), "max_length_min": _to_min(profile.get("max_duration", 0)),
"consistency_min": consistency_min, "consistency_min": consistency_min,
# Average power (W) per 15-min slot of this profile's learned shape, # Average power (W) per configured interval of this profile's learned shape,
# e.g. [2200, 2200, 800, ...] - the flat array external planners such # e.g. [2200, 2200, 800, ...] - the flat array external planners such
# as tibber_prices' `power_profile` consume to pick the cheapest run # as tibber_prices' `power_profile` consume to pick the cheapest run
# window (issue #272). Empty until the profile has a learned envelope. # window (issue #272). Empty until the profile has a learned envelope.
# Refreshes with the profile: the envelope is rebuilt on each new # Refreshes with the profile: the envelope is rebuilt on each new
# labelled cycle, which bumps this sensor's cycle_count state. # labelled cycle, which bumps this sensor's cycle_count state.
"power_profile": self._manager.profile_store.get_profile_power_profile( "power_profile": self._manager.profile_store.get_profile_power_profile(
self._profile_name self._profile_name, interval_s=interval_min * 60.0
), ),
"power_profile_interval_min": 15, "power_profile_interval_min": interval_min,
} }
+4 -3
View File
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData Setup", "title": "WashData Setup",
"description": "Configure your washing machine or other appliance.\n\nPower sensor is required.", "description": "Configure your washing machine or other appliance.\n\nPower sensor is required.\n\nAfter setup, open the WashData panel from the sidebar (or go to [/ha-washdata](/ha-washdata)) to view cycles, tune detection and manage profiles.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Update the device name, appliance type, or power sensor.\n\nThe WashData panel (sidebar, or [/ha-washdata](/ha-washdata)) is where detection, cycles, profiles and notifications are managed.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the WashData panel.", "description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the [WashData panel](/ha-washdata) (also reachable from the sidebar).",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -57,6 +57,7 @@
"timer_default_message": "{device}: {minutes} min timer", "timer_default_message": "{device}: {minutes} min timer",
"timer_pause_action_title": "Resume Cycle", "timer_pause_action_title": "Resume Cycle",
"timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.", "timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.",
"unload_dismiss_action_title": "Stop reminding",
"vs_typical_longer": "{pct}% longer than usual", "vs_typical_longer": "{pct}% longer than usual",
"vs_typical_shorter": "{pct}% shorter than usual", "vs_typical_shorter": "{pct}% shorter than usual",
"notify_live_waiting_message": "{device}: No profile matched yet." "notify_live_waiting_message": "{device}: No profile matched yet."
@@ -18,12 +18,14 @@
from __future__ import annotations from __future__ import annotations
import copy
import logging import logging
import math
from datetime import datetime from datetime import datetime
from typing import Any, TYPE_CHECKING, cast from typing import Any, TYPE_CHECKING, cast
import numpy as np import numpy as np
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant, callback
from .const import ( from .const import (
CONF_WATCHDOG_INTERVAL, CONF_WATCHDOG_INTERVAL,
@@ -51,6 +53,9 @@ from .const import (
CONF_START_DURATION_THRESHOLD, CONF_START_DURATION_THRESHOLD,
CONF_ANTI_WRINKLE_MAX_POWER, CONF_ANTI_WRINKLE_MAX_POWER,
CONF_ANTI_WRINKLE_EXIT_POWER, CONF_ANTI_WRINKLE_EXIT_POWER,
CONF_ANTI_WRINKLE_ENABLED,
DEFAULT_ANTI_WRINKLE_ENABLED,
DEFAULT_ANTI_WRINKLE_MAX_POWER,
CONF_DEVICE_TYPE, CONF_DEVICE_TYPE,
CONF_PUMP_STUCK_DURATION, CONF_PUMP_STUCK_DURATION,
DEVICE_TYPE_DRYER, DEVICE_TYPE_DRYER,
@@ -88,6 +93,56 @@ _MAX_PAUSE_GAP_H = 1.0 # a gap > this (hours) between samples i
_MIN_RESUME_ACTIVE_S = 120.0 _MIN_RESUME_ACTIVE_S = 120.0
def _measured_off_delay_floor(device_floor: int) -> int:
"""Lower bound for an off_delay suggestion backed by *measured* pauses.
``DEFAULT_OFF_DELAY_BY_DEVICE`` is a blind prior for devices we have no
traces for: the dishwasher entry (1800 s) is sized to bridge a passive
drying phase. Once real intra-cycle pauses have been measured that prior is
stale evidence, and clamping the measurement up to it is actively harmful -
off_delay is *never* what holds a cycle together (every finalize path in
``cycle_detector`` uses ``max(off_delay, min_off_gap)``, and min_off_gap
keeps its own 3600 s dishwasher floor). Solo uses of off_delay are the
end-gate energy lookback window, the watchdog's keepalive cadence and the
Rule-12 end_energy_threshold coupling - all of which get *worse* as it
grows: a 1800 s window sweeps standby blips into the end gate and holds the
cycle open long past the real end.
So a measured suggestion is floored at the generic ``DEFAULT_OFF_DELAY``,
while device priors that are *below* it (e.g. pumps at 20 s, which cut off
sharply) are still honoured.
"""
return min(int(device_floor), DEFAULT_OFF_DELAY)
#: Evidence bar for a *measured* ``min_off_gap`` proposal. Below this we keep the
#: conservative per-device prior rather than guess from a thin sample.
_MIN_GAP_MIN_TRACED_CYCLES = 5
_MIN_GAP_MIN_SPANS = 3
#: Absolute sanity cap, mirroring the inter-cycle-gap path.
_MIN_GAP_ABS_CAP = 3600
def _bridged_spans(
points: list[tuple[float, float]], active_thr: float, max_gap_s: float
) -> list[float]:
"""Quiet spans a cycle has to survive to stay whole, in seconds.
The mirror image of the off-delay pause scan: here *any* resumption counts
(``min_resume_active_s=0``), including a dishwasher's short terminal
pump-out. That blip is deliberately excluded from the off-delay statistic -
it must not inflate the end-gate window - but it is exactly what
``min_off_gap`` exists to bridge, because if the cycle closes before it
lands, the pump-out is recorded as a separate ghost cycle (#43).
"""
return [
points[resume_idx][0] - low_start
for low_start, resume_idx in _resumed_low_runs(
points, active_thr, max_gap_s, min_resume_active_s=0.0
)
]
def _resumed_low_runs( def _resumed_low_runs(
points: list[tuple[float, float]], points: list[tuple[float, float]],
active_thr: float, active_thr: float,
@@ -569,6 +624,32 @@ def reconcile_suggestions(
else: else:
adjust(CONF_PROFILE_MATCH_MIN_DURATION_RATIO, round(max_r * 0.5, 2), "the max duration ratio") adjust(CONF_PROFILE_MATCH_MIN_DURATION_RATIO, round(max_r * 0.5, 2), "the max duration ratio")
# ── Rule 12: end_energy_threshold >= stop_threshold_w * off_delay / 3600 ──
# The energy end-gate is evaluated over an off_delay-long window, so it
# implies a wattage; below stop_threshold_w it forbids what the power gate
# allows and the cycle can only close via a fallback path (#376). Only ever
# RAISE end_energy to the implied floor (the safe direction that makes the
# end gate satisfiable); never lower stop_threshold_w, which would make
# start/end detection more aggressive.
stop_ee = eff(CONF_STOP_THRESHOLD_W)
off_delay_ee = eff(CONF_OFF_DELAY)
end_energy = eff(CONF_END_ENERGY_THRESHOLD)
if (
stop_ee is not None and off_delay_ee is not None and end_energy is not None
and off_delay_ee > 0 and end_energy < stop_ee * off_delay_ee / 3600.0
and in_out(CONF_END_ENERGY_THRESHOLD, CONF_STOP_THRESHOLD_W, CONF_OFF_DELAY)
):
# Round the floor UP at adjust()'s own 2-decimal precision. Rounding
# to-nearest would land *below* the floor (stop=2 W, off_delay=60 s ->
# 0.0333 Wh -> 0.03 Wh), the next fixpoint pass would then see the same
# violation, find the value unchanged, and return a map that still
# breaks Rule 12.
adjust(
CONF_END_ENERGY_THRESHOLD,
math.ceil(stop_ee * off_delay_ee / 36.0) / 100.0,
"the stop threshold and off delay",
)
if change_count[0] == prev_count: if change_count[0] == prev_count:
break break
@@ -605,22 +686,62 @@ class SuggestionEngine:
self.entry_id = entry_id self.entry_id = entry_id
self.profile_store = profile_store self.profile_store = profile_store
self.device_type = device_type self.device_type = device_type
# Loop-affine config snapshot, refreshed by refresh_options_snapshot()
# immediately before an executor dispatch. See _entry_options().
self._options_snapshot: dict[str, Any] | None = None
@callback
def for_job(self, options: dict[str, Any] | None = None) -> "SuggestionEngine":
"""A throwaway engine bound to one config snapshot; loop-only.
Every generator below runs in an executor thread, but reading the config
entry is loop-affine: ``async_get_entry`` walks loop-owned state, and the
two-mapping merge in :meth:`_read_entry_options` can tear if
``async_update_entry`` replaces ``data``/``options`` between the reads.
The snapshot is bound to a **shallow copy** rather than to ``self`` so
concurrent jobs cannot overwrite each other's view, and so the shared
engine never holds a snapshot that a later loop-side caller would silently
read as stale. The copy shares ``profile_store``/``hass`` deliberately -
the generators only read them.
"""
job = copy.copy(self)
job._options_snapshot = (
dict(options) if options is not None else self._read_entry_options()
)
return job
def generate_operational_suggestions(self, p95_dt: float, median_dt: float) -> dict[str, Any]: def generate_operational_suggestions(self, p95_dt: float, median_dt: float) -> dict[str, Any]:
"""Generate suggestions for operational parameters based on cadence.""" """Generate suggestions for operational parameters based on cadence."""
suggestions: dict[str, dict[str, Any]] = {} suggestions: dict[str, dict[str, Any]] = {}
# 1. Watchdog Interval # 1. Watchdog Interval
# Goal: as LOW (responsive) as safely possible so a stalled cycle is # This is only the *tick period* of the background timer - it is never
# caught quickly. The only hard constraint is that it must sit above the # itself a staleness threshold, so it cannot cause a false stop (those
# normal update cadence to avoid false stops, so target just above p95 # are gated by no_update_active_timeout / the device low-power floor in
# (3x) rather than a very conservative multiple. # ``manager._watchdog_check_stuck_cycle``). It does bound how late the
suggested_watchdog = int(max(30, round(p95_dt * 3))) # 0 W keepalive injection and the timeout checks can fire, so every extra
# second is pure end-detection lag. Tick just past the p95 update gap -
# matching DEFAULT_WATCHDOG_INTERVAL's documented "2 x sampling + 1"
# derivation for a publish-on-change sensor that skips at most one
# sample. The old 3x multiple polled ~6x slower than the sensor updates
# and delayed end detection for no safety benefit.
# Floor at 2 x median + 1 so the suggestion pre-satisfies reconciler
# Rule 3a (watchdog >= 2 x sampling_interval) when CONF_SAMPLING_INTERVAL
# is suggested from the same median_dt. Without this, a regular sensor
# (p95 ≈ median) would produce ceil(p95)+1 which Rule 3a then silently
# overwrites, leaving a stored value whose reason text no longer matches.
suggested_watchdog = int(max(30, max(math.ceil(p95_dt) + 1,
2 * math.ceil(median_dt) + 1)))
suggestions[CONF_WATCHDOG_INTERVAL] = { suggestions[CONF_WATCHDOG_INTERVAL] = {
"value": suggested_watchdog, "value": suggested_watchdog,
"reason": f"Kept as low as safe (3x the p95 update gap of {p95_dt:.1f}s, min 30s) so stalls are caught quickly without false stops.", "reason": (
f"Kept as low as safe (just above the p95 update gap of {p95_dt:.1f}s"
f" and at least 2x the sampling interval of {median_dt:.1f}s, min 30s)"
f" so stalls are caught quickly without false stops."
),
"reason_key": "suggestion.reason.watchdog", "reason_key": "suggestion.reason.watchdog",
"reason_params": {"p95": f"{p95_dt:.1f}"}, "reason_params": {"p95": f"{p95_dt:.1f}", "median": f"{median_dt:.1f}"},
} }
# 2. No Update Timeout # 2. No Update Timeout
@@ -645,19 +766,32 @@ class SuggestionEngine:
# cadence only sets a lower sanity bound, so fall back to it when we do # cadence only sets a lower sanity bound, so fall back to it when we do
# not yet have enough traces to measure pauses. # not yet have enough traces to measure pauses.
raw_cycles = self.profile_store.get_past_cycles()[-100:] raw_cycles = self.profile_store.get_past_cycles()[-100:]
stop_thr = self._current_stop_threshold(self._entry_options()) # Resolve the config entry once (loop-affine; this runs in an executor) and
# reuse it for both the stop threshold and the anti-crease check below.
_op_opts = self._entry_options()
stop_thr = self._current_stop_threshold(_op_opts)
clean, _excl = select_clean_cycles(raw_cycles, stop_threshold_w=stop_thr) clean, _excl = select_clean_cycles(raw_cycles, stop_threshold_w=stop_thr)
pause_based = self._suggest_off_delay_from_pauses(clean, stop_thr, device_floor) pause_based = self._suggest_off_delay_from_pauses(
clean, stop_thr, device_floor, options=_op_opts
)
reason_off_key: str | None = None
reason_off_params: dict[str, Any] | None = None
if pause_based is not None: if pause_based is not None:
suggested_off_delay, reason_off, reason_off_key, reason_off_params = pause_based suggested_off_delay, reason_off, reason_off_key, reason_off_params = pause_based
else: suggestions[CONF_OFF_DELAY] = {
"value": suggested_off_delay,
"reason": reason_off,
"reason_key": reason_off_key,
"reason_params": reason_off_params,
}
elif not self._is_anti_crease_enabled(_op_opts):
# Cadence fallback: p95_dt * 5. Safe for most devices, but on anti-crease
# devices the update gap is dominated by the inter-burst quiet period, so
# the result often exceeds the burst interval and resets the end timer on
# every tumble burst. Skip it when anti-crease is enabled (#343 gap B).
suggested_off_delay = int(max(device_floor, p95_dt * 5)) suggested_off_delay = int(max(device_floor, p95_dt * 5))
reason_off = f"Based on observed update cadence (p95={p95_dt:.1f}s) * 5" reason_off = f"Based on observed update cadence (p95={p95_dt:.1f}s) * 5"
reason_off_key = "suggestion.reason.off_delay_cadence" reason_off_key: str = "suggestion.reason.off_delay_cadence"
reason_off_params = {"p95": f"{p95_dt:.1f}"} reason_off_params: dict[str, Any] = {"p95": f"{p95_dt:.1f}"}
if suggested_off_delay == device_floor: if suggested_off_delay == device_floor:
if self.device_type and self.device_type in DEFAULT_OFF_DELAY_BY_DEVICE: if self.device_type and self.device_type in DEFAULT_OFF_DELAY_BY_DEVICE:
reason_off = ( reason_off = (
@@ -669,13 +803,12 @@ class SuggestionEngine:
reason_off = f"Used generic safe minimum ({DEFAULT_OFF_DELAY}s)." reason_off = f"Used generic safe minimum ({DEFAULT_OFF_DELAY}s)."
reason_off_key = "suggestion.reason.off_delay_generic_floor" reason_off_key = "suggestion.reason.off_delay_generic_floor"
reason_off_params = {"floor": DEFAULT_OFF_DELAY} reason_off_params = {"floor": DEFAULT_OFF_DELAY}
suggestions[CONF_OFF_DELAY] = {
suggestions[CONF_OFF_DELAY] = { "value": suggested_off_delay,
"value": suggested_off_delay, "reason": reason_off,
"reason": reason_off, "reason_key": reason_off_key,
"reason_key": reason_off_key, "reason_params": reason_off_params,
"reason_params": reason_off_params, }
}
# 4. Profile Match Interval # 4. Profile Match Interval
suggested_match = int(max(10, median_dt * 10)) suggested_match = int(max(10, median_dt * 10))
@@ -791,14 +924,28 @@ class SuggestionEngine:
"reason_params": {"p95": f"{p95_ratio:.2f}"}, "reason_params": {"p95": f"{p95_ratio:.2f}"},
} }
# Min-off-gap: derived from observed inter-cycle gaps # Min-off-gap: measured bridge requirement, capped by back-to-back headroom
min_off_gap = self._suggest_min_off_gap(cycles) min_off_gap = self._suggest_min_off_gap(
cycles, stop_threshold_w=stop_thr, gap_cycles=raw_cycles
)
if min_off_gap is not None: if min_off_gap is not None:
suggestions[CONF_MIN_OFF_GAP] = min_off_gap suggestions[CONF_MIN_OFF_GAP] = min_off_gap
return suggestions return suggestions
def _entry_options(self) -> dict[str, Any]: def _entry_options(self) -> dict[str, Any]:
"""Config options for this pass: the job-bound snapshot when present.
Only a :meth:`for_job` copy carries a snapshot; on the shared engine this
is always ``None``, so loop-side callers (tests, direct calls) get a live
read and can never observe a stale snapshot left by a finished job.
"""
snapshot = self._options_snapshot
if snapshot is not None:
return snapshot
return self._read_entry_options()
def _read_entry_options(self) -> dict[str, Any]:
"""Best-effort read of the current config entry options.""" """Best-effort read of the current config entry options."""
try: try:
entry = self.hass.config_entries.async_get_entry(self.entry_id) entry = self.hass.config_entries.async_get_entry(self.entry_id)
@@ -898,9 +1045,12 @@ class SuggestionEngine:
} }
# --- min_power: keep the noise gate below the lowest genuine draw --- # --- min_power: keep the noise gate below the lowest genuine draw ---
# Strip the anti-crease tail before taking the per-cycle minimum so that the
# ~3 W between-burst baseline does not drag the p05 down on anti-crease
# devices and produce a noise gate below the real operating draw (#343 gap A).
lowest_active: list[float] = [] lowest_active: list[float] = []
for c in clean: for c in clean:
readings = _cycle_readings(c) readings = self._strip_anti_crease_readings(_cycle_readings(c), options=options)
if len(readings) < 5: if len(readings) < 5:
continue continue
active = np.array([p for _, p in readings if p > 0.5]) active = np.array([p for _, p in readings if p > 0.5])
@@ -1085,27 +1235,38 @@ class SuggestionEngine:
cycles: list[dict[str, Any]], cycles: list[dict[str, Any]],
stop_threshold_w: float, stop_threshold_w: float,
device_floor: int, device_floor: int,
options: dict[str, Any] | None = None,
) -> tuple[int, str, str, dict[str, Any]] | None: ) -> tuple[int, str, str, dict[str, Any]] | None:
"""Off-delay sized to outlast the longest genuine intra-cycle pause. """Off-delay sized to outlast the longest genuine intra-cycle pause.
Collects every low-power segment that *resumed* (a proven pause, not the Collects every low-power segment that *resumed* (a proven pause, not the
trailing wind-down) across clean cycles and sets off_delay to the p95 trailing wind-down) across clean cycles and sets off_delay to the p95
pause length plus a 60 s buffer, floored by the device minimum. Returns pause length plus a 60 s buffer. Returns ``None`` when too few traces
``None`` when too few traces exist, so the caller falls back to the exist, so the caller falls back to the update-cadence heuristic.
update-cadence heuristic.
The floor is :func:`_measured_off_delay_floor` (the *generic* minimum),
not ``device_floor``: once real pauses have been measured the blind
per-device prior is stale evidence and must not override the
measurement. ``device_floor`` still applies on the caller's no-data
fallback path.
""" """
pause_durations: list[float] = [] pause_durations: list[float] = []
n_traced = 0 n_traced = 0
max_gap_s = _MAX_PAUSE_GAP_H * 3600 max_gap_s = _MAX_PAUSE_GAP_H * 3600
_anti_crease_opts = options if options is not None else self._entry_options()
for c in cycles: for c in cycles:
readings = _cycle_readings(c) # Strip the anti-crease tail before pause analysis so that the inter-burst
# quiet periods (up to 180-240 s on Miele/Bosch) are not counted as genuine
# intra-cycle pauses, which would inflate p95 beyond the burst interval and
# reset the end timer on every tumble burst (#343 gap C).
readings = self._strip_anti_crease_readings(_cycle_readings(c), options=_anti_crease_opts)
if len(readings) < 10: if len(readings) < 10:
continue continue
n_traced += 1
powers = [p for _, p in readings] powers = [p for _, p in readings]
peak = max(powers) if powers else 0.0 peak = max(powers) if powers else 0.0
if peak <= 0: if peak <= 0:
continue continue
n_traced += 1
active_thr = max(stop_threshold_w, _CLEAN_ACTIVE_FLOOR_RATIO * peak) active_thr = max(stop_threshold_w, _CLEAN_ACTIVE_FLOOR_RATIO * peak)
# Genuine intra-cycle pauses only: a low run that resumed into # Genuine intra-cycle pauses only: a low run that resumed into
# sustained activity. A terminal drying/pump-out blip that does not # sustained activity. A terminal drying/pump-out blip that does not
@@ -1120,11 +1281,12 @@ class SuggestionEngine:
return None return None
p95_pause = float(np.percentile(pause_durations, 95)) p95_pause = float(np.percentile(pause_durations, 95))
value = int(max(device_floor, round(p95_pause + 60.0))) floor = _measured_off_delay_floor(device_floor)
value = int(max(floor, round(p95_pause + 60.0)))
reason = ( reason = (
f"Sized to outlast real pauses: p95 intra-cycle pause {p95_pause:.0f}s " f"Sized to outlast real pauses: p95 intra-cycle pause {p95_pause:.0f}s "
f"+ 60s buffer, from {len(pause_durations)} pauses across {n_traced} " f"+ 60s buffer, from {len(pause_durations)} pauses across {n_traced} "
f"clean cycles (floor {device_floor}s)." f"clean cycles (floor {floor}s)."
) )
return ( return (
value, value,
@@ -1134,17 +1296,67 @@ class SuggestionEngine:
"p95": f"{p95_pause:.0f}", "p95": f"{p95_pause:.0f}",
"pauses": len(pause_durations), "pauses": len(pause_durations),
"cycles": n_traced, "cycles": n_traced,
"floor": device_floor, "floor": floor,
}, },
) )
def _suggest_min_off_gap( def _suggest_min_off_gap(
self, cycles: list[dict[str, Any]] self,
cycles: list[dict[str, Any]],
stop_threshold_w: float | None = None,
gap_cycles: list[dict[str, Any]] | None = None,
) -> dict[str, Any] | None: ) -> dict[str, Any] | None:
"""Derive a min_off_gap suggestion from observed inter-cycle gaps.""" """Size ``min_off_gap`` from what the cycles actually need to bridge.
``min_off_gap`` is bounded from two sides and both bounds are measurable:
* **must not split** - it has to outlast the longest quiet span *inside*
a cycle that is followed by more of that same cycle (see
:func:`_bridged_spans`). This is the requirement, so it sets the value.
* **must not merge** - it has to stay under the shortest gap the user
leaves between two separate loads, because a high reading while the
previous cycle is still in ENDING revives that cycle rather than
starting a new one (``cycle_detector`` STATE_ENDING). This is a
*ceiling*, not a target.
The previous implementation derived the value from the ceiling
(``p05_inter_cycle_gap * 0.8``) and then floored it with the blind
per-device prior. That proposed a value sitting right against the merge
boundary with no evidence any bridging was needed - on a real washer
export it lands at ~1748 s against a measured need of ~1271 s and a real
inter-load gap of 181 s, i.e. it guarantees back-to-back loads merge
(#296). It also suppressed itself whenever the result equalled the
device floor, so a dishwasher user was never told their 3600 s prior was
1.7x what their machine measurably needs.
When the two bounds conflict (the cycle needs more bridging than the
user's own turnaround allows) no suggestion is made: that machine cannot
be separated by a quiet-gap rule at all and needs the event-based
splitters instead (anti-crease finalize, dishwasher end-spike), so the
safe move is to leave the current value alone. Splitting a cycle
corrupts the learned profile; merging produces one visibly over-long
record the user can correct.
``cycles`` supplies the bridge measurement and must be clean;
``gap_cycles`` supplies the merge ceiling and must be the *unfiltered*
history (defaults to ``cycles``). The distinction matters: dropping a
mis-detected cycle silently fuses its two neighbouring gaps into one long
gap, which inflates the ceiling and would let the proposal sail past the
user's real turnaround. On a real washer export that is the difference
between a 1748 s and a 181 s ceiling.
Falls back to the historical inter-cycle-gap heuristic when there are too
few traces to measure a bridge requirement.
Validated with ``devtools/min_off_gap_eval.py``: replaying all 152 clean
cycles across the ``cycle_data/`` corpus through a real unmatched
``CycleDetector`` at the proposed value produces zero splits (the only
trace that splits is tron4r's known back-to-back *merged* 206-min cycle,
where splitting is the correct outcome).
"""
# Only consider completed, labeled cycles with valid timestamps # Only consider completed, labeled cycles with valid timestamps
timed_cycles: list[tuple[float, float]] = [] timed_cycles: list[tuple[float, float]] = []
for c in cycles: for c in (cycles if gap_cycles is None else gap_cycles):
if not isinstance(c, dict): if not isinstance(c, dict):
continue continue
if c.get("status") not in ("completed", "force_stopped"): if c.get("status") not in ("completed", "force_stopped"):
@@ -1179,15 +1391,59 @@ class SuggestionEngine:
return None return None
gaps_arr = np.array(gaps) gaps_arr = np.array(gaps)
# Use the 5th-percentile gap as the safe minimum, with device-type floor # 5th percentile, kept only for the no-evidence fallback path's reason text.
p05_gap = float(np.percentile(gaps_arr, 5)) p05_gap = float(np.percentile(gaps_arr, 5))
device_floor = ( device_floor = (
DEFAULT_MIN_OFF_GAP_BY_DEVICE.get(self.device_type, DEFAULT_MIN_OFF_GAP) DEFAULT_MIN_OFF_GAP_BY_DEVICE.get(self.device_type, DEFAULT_MIN_OFF_GAP)
if self.device_type is not None if self.device_type is not None
else DEFAULT_MIN_OFF_GAP else DEFAULT_MIN_OFF_GAP
) )
# Add a 20% safety margin so we never split a real gap into two cycles # Merge ceiling: the SHORTEST turnaround this user has actually run, less a
suggested = int(max(device_floor, min(p05_gap * 0.8, 3600))) # 20% margin. Deliberately not a percentile - these distributions are
# strongly skewed (one 181 s turnaround, then a jump to 5000 s+), so p05
# interpolates straight past the single tight pair that is precisely the
# merge case we must not propose through. Tolerating it as an "outlier"
# would be tolerating the bug. Erring low only ever suppresses a
# suggestion, which leaves the user's current value in place.
ceiling = int(min(float(gaps_arr.min()) * 0.8, _MIN_GAP_ABS_CAP))
# --- Preferred: size from the measured bridge requirement ---------------
bridge = self._measured_bridge_requirement(cycles, stop_threshold_w)
if bridge is not None:
longest, n_spans, n_traced = bridge
needed = int(
min(
_MIN_GAP_ABS_CAP,
max(DEFAULT_MIN_OFF_GAP, round(longest + 60.0)),
)
)
if needed > ceiling:
# The cycle needs more bridging than this user's turnaround
# allows - no quiet-gap value satisfies both. Leave it alone.
return None
reason = (
f"Sized to bridge the longest quiet stretch inside a cycle: "
f"{longest:.0f}s + 60s buffer, from {n_spans} bridged gaps across "
f"{n_traced} clean cycles (stays under your {ceiling}s "
f"back-to-back headroom)."
)
return {
"value": needed,
"reason": reason,
"reason_key": "suggestion.reason.min_off_gap_bridge",
"reason_params": {
"span": f"{longest:.0f}",
"spans": n_spans,
"cycles": n_traced,
"ceiling": ceiling,
},
}
# --- Fallback: no trace evidence, keep the conservative prior ----------
# Unchanged from the historical heuristic (p05-based, device floor wins),
# because with no measured bridge requirement the blind prior is still the
# best evidence available.
suggested = int(max(device_floor, min(p05_gap * 0.8, _MIN_GAP_ABS_CAP)))
# When the data-derived value is equal to the device floor, we have no # When the data-derived value is equal to the device floor, we have no
# useful signal to surface - return None to suppress a misleading suggestion. # useful signal to surface - return None to suppress a misleading suggestion.
if suggested == device_floor: if suggested == device_floor:
@@ -1207,6 +1463,139 @@ class SuggestionEngine:
}, },
} }
def _measured_bridge_requirement(
self,
cycles: list[dict[str, Any]],
stop_threshold_w: float | None = None,
) -> tuple[float, int, int] | None:
"""Longest quiet span these cycles had to bridge to stay whole.
Returns ``(longest_span_s, n_spans, n_traced)`` or ``None`` when there is
not enough traced history to trust the measurement.
The statistic is the **maximum**, not a percentile: ``min_off_gap`` has to
outlast the *longest* gap a cycle ever has to survive, and a percentile
under-shoots it. On washers the bridged-span distribution is dominated by
thousands of sampling-jitter dips, so p95 collapses to ~100 s while the
real phase gap is ~1300 s. Outliers are bounded by construction:
``select_clean_cycles`` has already dropped mis-detected cycles,
:func:`_resumed_low_runs` abandons any run straddling an outage-sized
sampling gap, and the caller clamps the result under both
``_MIN_GAP_ABS_CAP`` and the user's own back-to-back headroom.
"""
stop_thr = (
float(stop_threshold_w)
if stop_threshold_w is not None
else self._current_stop_threshold(self._entry_options())
)
max_gap_s = _MAX_PAUSE_GAP_H * 3600
spans: list[float] = []
n_traced = 0
for c in cycles:
if not isinstance(c, dict):
continue
readings = _cycle_readings(c)
if len(readings) < 10:
continue
peak = max((p for _, p in readings), default=0.0)
if peak <= 0:
continue
n_traced += 1
active_thr = max(stop_thr, _CLEAN_ACTIVE_FLOOR_RATIO * peak)
spans.extend(_bridged_spans(readings, active_thr, max_gap_s))
if n_traced < _MIN_GAP_MIN_TRACED_CYCLES or len(spans) < _MIN_GAP_MIN_SPANS:
return None
return (max(spans), len(spans), n_traced)
#: Device types where the anti-crease/anti-wrinkle tail must be excluded from
#: the stop/start min-active statistic (#343).
_ANTI_CREASE_DEVICE_TYPES = (
DEVICE_TYPE_WASHING_MACHINE,
DEVICE_TYPE_DRYER,
DEVICE_TYPE_WASHER_DRYER,
)
def _strip_anti_crease_tail(
self,
ordered_powers: np.ndarray,
options: dict[str, Any] | None = None,
) -> np.ndarray:
"""Drop the post-cycle anti-crease tail from an ordered power trace (#343).
Stop/start thresholds detect the MAIN cycle; the anti-crease tumble-pulse
tail is governed by its own ``anti_wrinkle_*`` settings, but its near-zero
between-pulse baseline is the global minimum of the stored trace and used
to poison the min-active statistic (the tuner then proposes thresholds just
above that baseline, breaking end-detection).
The tail is everything after the last sample that reaches
``anti_wrinkle_max_power`` - by the config's own rule a pulse above that
ends anti-wrinkle, so nothing in the tail can reach it. Returns the trace
unchanged when anti-crease is off, the device type is ineligible, or no
sample reaches the ceiling (no identifiable main phase) - so it can never
over-exclude for a non-anti-crease device or a gentle program.
Pass ``options`` when calling from a loop to avoid repeated config-entry
reads (``hass.config_entries.async_get_entry`` is loop-affine).
"""
if self.device_type not in self._ANTI_CREASE_DEVICE_TYPES:
return ordered_powers
opts = options if options is not None else self._entry_options()
if not opts.get(CONF_ANTI_WRINKLE_ENABLED, DEFAULT_ANTI_WRINKLE_ENABLED):
return ordered_powers
try:
max_power = float(opts.get(CONF_ANTI_WRINKLE_MAX_POWER, DEFAULT_ANTI_WRINKLE_MAX_POWER))
except (TypeError, ValueError):
max_power = DEFAULT_ANTI_WRINKLE_MAX_POWER
if max_power <= 0 or ordered_powers.size == 0:
return ordered_powers
above = np.flatnonzero(ordered_powers >= max_power)
if above.size == 0:
return ordered_powers # no main high-power phase -> nothing to strip
return ordered_powers[: int(above[-1]) + 1]
def _is_anti_crease_enabled(self, options: dict[str, Any] | None = None) -> bool:
"""True when anti-crease mode is active on an eligible device type."""
if self.device_type not in self._ANTI_CREASE_DEVICE_TYPES:
return False
opts = options if options is not None else self._entry_options()
return bool(opts.get(CONF_ANTI_WRINKLE_ENABLED, DEFAULT_ANTI_WRINKLE_ENABLED))
def _strip_anti_crease_readings(
self,
readings: list[tuple[float, float]],
options: dict[str, Any] | None = None,
) -> list[tuple[float, float]]:
"""Time-domain equivalent of _strip_anti_crease_tail for (offset, power) pairs.
Returns the readings list trimmed to the last sample >= anti_wrinkle_max_power
so that pause-duration and min-power statistics ignore the anti-crease tail
(#343 gap B/C). No-op when anti-crease is off, the device type is ineligible,
or no sample reaches the ceiling.
Pass ``options`` when calling from a loop to avoid repeated config-entry
reads (``hass.config_entries.async_get_entry`` is loop-affine).
"""
if not readings:
return readings
opts = options if options is not None else self._entry_options()
if not self._is_anti_crease_enabled(opts):
return readings
try:
max_power = float(opts.get(CONF_ANTI_WRINKLE_MAX_POWER, DEFAULT_ANTI_WRINKLE_MAX_POWER))
except (TypeError, ValueError):
max_power = DEFAULT_ANTI_WRINKLE_MAX_POWER
if max_power <= 0:
return readings
last_above = -1
for i, (_, p) in enumerate(readings):
if p >= max_power:
last_above = i
if last_above < 0:
return readings # no main high-power phase identifiable
return readings[: last_above + 1]
def run_simulation(self, cycle_data: dict[str, Any]) -> dict[str, Any]: def run_simulation(self, cycle_data: dict[str, Any]) -> dict[str, Any]:
"""Replay a single cycle with varied parameters to find optimal settings. """Replay a single cycle with varied parameters to find optimal settings.
@@ -1235,7 +1624,10 @@ class SuggestionEngine:
return {} return {}
powers = np.array([p[1] for p in readings]) powers = np.array([p[1] for p in readings])
active_powers = powers[powers > 0.5] # Exclude the anti-crease tail so its near-zero baseline does not poison the
# stop/start thresholds on anti-crease devices (#343). No-op otherwise.
main_powers = self._strip_anti_crease_tail(powers)
active_powers = main_powers[main_powers > 0.5]
if len(active_powers) < 5: if len(active_powers) < 5:
return {} return {}
@@ -1245,9 +1637,11 @@ class SuggestionEngine:
suggested_stop = round(min_active * 0.8, 2) suggested_stop = round(min_active * 0.8, 2)
suggested_start = round(min_active * 1.2, 2) suggested_start = round(min_active * 1.2, 2)
# Energy suggestions # end_energy_threshold is intentionally NOT suggested from a single cycle:
suggested_end_energy = 0.05 # a context-free 0.05 Wh was below the anti-crease baseline energy accumulated
# over the off_delay window, so the end gate never fired (#343 gap D). The
# batch path (run_batch_simulation) derives a cycle-energy-proportional floor
# from actual false-end events once 5+ cycles exist; use that instead.
return { return {
CONF_STOP_THRESHOLD_W: { CONF_STOP_THRESHOLD_W: {
"value": suggested_stop, "value": suggested_stop,
@@ -1261,12 +1655,6 @@ class SuggestionEngine:
"reason_key": "suggestion.reason.min_active", "reason_key": "suggestion.reason.min_active",
"reason_params": {"min": f"{min_active:.1f}"}, "reason_params": {"min": f"{min_active:.1f}"},
}, },
CONF_END_ENERGY_THRESHOLD: {
"value": suggested_end_energy,
"reason": "Default recommended baseline for end-of-cycle noise gate.",
"reason_key": "suggestion.reason.end_energy_default",
"reason_params": {},
},
} }
def run_batch_simulation(self, cycles: list[dict[str, Any]]) -> dict[str, Any]: def run_batch_simulation(self, cycles: list[dict[str, Any]]) -> dict[str, Any]:
@@ -1289,7 +1677,11 @@ class SuggestionEngine:
""" """
_BATCH_MIN_CYCLES = 5 _BATCH_MIN_CYCLES = 5
stop_thr = self._current_stop_threshold(self._entry_options()) _batch_opts = self._entry_options()
stop_thr = self._current_stop_threshold(_batch_opts)
# Keep the unfiltered list: the min_off_gap merge ceiling must see the
# user's real turnaround, which dropping a cycle would fuse away.
raw_cycles = list(cycles)
cycles, _excluded = select_clean_cycles(cycles, stop_threshold_w=stop_thr) cycles, _excluded = select_clean_cycles(cycles, stop_threshold_w=stop_thr)
valid_cycles: list[list[tuple[float, float]]] = [] valid_cycles: list[list[tuple[float, float]]] = []
@@ -1326,7 +1718,13 @@ class SuggestionEngine:
false_end_energies: list[float] = [] false_end_energies: list[float] = []
max_gap_s = _MAX_PAUSE_GAP_H * 3600 max_gap_s = _MAX_PAUSE_GAP_H * 3600
for readings in valid_cycles: for readings in valid_cycles:
powers = np.array([p for _, p in readings]) # Exclude the post-cycle anti-crease tail before ANY per-cycle statistic
# so its low-power baseline drags neither the p05 min-active threshold nor
# the end-energy / false-end floors below the main cycle (#343). No-op for
# non-anti-crease devices. Trim the (offset, power) readings once so the
# threshold stat and the energy scan consume the same main-cycle data.
main_readings = self._strip_anti_crease_readings(readings, options=_batch_opts)
powers = np.array([p for _, p in main_readings])
active = powers[powers > 0.5] active = powers[powers > 0.5]
peak = float(np.max(powers)) if powers.size else 0.0 peak = float(np.max(powers)) if powers.size else 0.0
active_thr = max(stop_thr, _CLEAN_ACTIVE_FLOOR_RATIO * peak) active_thr = max(stop_thr, _CLEAN_ACTIVE_FLOOR_RATIO * peak)
@@ -1339,9 +1737,9 @@ class SuggestionEngine:
in_pause = False in_pause = False
pause_energy = 0.0 pause_energy = 0.0
stop_w = stop_thr stop_w = stop_thr
for i in range(1, len(readings)): for i in range(1, len(main_readings)):
t0, p0 = readings[i - 1] t0, p0 = main_readings[i - 1]
t1, p1 = readings[i] t1, p1 = main_readings[i]
dt_s = t1 - t0 dt_s = t1 - t0
# Guard against non-positive or excessively large time gaps # Guard against non-positive or excessively large time gaps
if dt_s <= 0 or dt_s > max_gap_s: if dt_s <= 0 or dt_s > max_gap_s:
@@ -1436,7 +1834,9 @@ class SuggestionEngine:
"reason_params": reason_end_params, "reason_params": reason_end_params,
} }
min_off_gap = self._suggest_min_off_gap(cycles) min_off_gap = self._suggest_min_off_gap(
cycles, stop_threshold_w=stop_thr, gap_cycles=raw_cycles
)
if min_off_gap is not None: if min_off_gap is not None:
suggestions[CONF_MIN_OFF_GAP] = min_off_gap suggestions[CONF_MIN_OFF_GAP] = min_off_gap
@@ -1626,7 +2026,12 @@ class MLSuggestionEngine:
end_feat_fn: Any, end_feat_fn: Any,
device_floor: int, device_floor: int,
) -> dict[str, Any] | None: ) -> dict[str, Any] | None:
"""Off-delay from end-detector-confirmed pauses (P(end) < 0.4).""" """Off-delay from end-detector-confirmed pauses (P(end) < 0.4).
Floored by :func:`_measured_off_delay_floor` for the same reason as the
classic twin: a model-verified pause measurement outranks the blind
per-device prior.
"""
confirmed: list[float] = [] confirmed: list[float] = []
n_cycles = 0 n_cycles = 0
for c in clean: for c in clean:
@@ -1643,20 +2048,21 @@ class MLSuggestionEngine:
if n_cycles < 5 or len(confirmed) < 3: if n_cycles < 5 or len(confirmed) < 3:
return None return None
p95 = float(np.percentile(confirmed, 95)) p95 = float(np.percentile(confirmed, 95))
value = int(max(device_floor, round(p95 + 60.0))) floor = _measured_off_delay_floor(device_floor)
value = int(max(floor, round(p95 + 60.0)))
return { return {
"value": value, "value": value,
"reason": ( "reason": (
f"End-detector-confirmed pauses: p95 {p95:.0f}s + 60s buffer, from " f"End-detector-confirmed pauses: p95 {p95:.0f}s + 60s buffer, from "
f"{len(confirmed)} model-verified pauses across {n_cycles} cycles " f"{len(confirmed)} model-verified pauses across {n_cycles} cycles "
f"(floor {device_floor}s)." f"(floor {floor}s)."
), ),
"reason_key": "suggestion.reason.ml_off_delay", "reason_key": "suggestion.reason.ml_off_delay",
"reason_params": { "reason_params": {
"p95": f"{p95:.0f}", "p95": f"{p95:.0f}",
"pauses": len(confirmed), "pauses": len(confirmed),
"cycles": n_cycles, "cycles": n_cycles,
"floor": device_floor, "floor": floor,
}, },
} }
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Настройка на WashData", "title": "Настройка на WashData",
"description": "Конфигурирайте вашата пералня или друг уред.\n\nНеобходим е сензор за мощност.\n\n**След това ще бъдете попитани дали искате да създадете своя първи профил.**", "description": "Конфигурирайте вашата пералня или друг уред.\n\nНеобходим е сензор за мощност.\n\nСлед настройката отворете панела на WashData от страничната лента (или отидете на [/ha-washdata](/ha-washdata)), за да преглеждате цикли, да настроите откриването и да управлявате профили.",
"data": { "data": {
"name": "Име на устройството", "name": "Име на устройството",
"device_type": "Тип устройство", "device_type": "Тип устройство",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Обновяване на името на устройството, типа на уреда, или сензор за мощност.", "description": "Обновете името на устройството, типа на уреда или сензора за мощност.\n\nПанелът на WashData (странична лента или [/ha-washdata](/ha-washdata)) е мястото, където се управляват откривате, циклите, профилите и известията.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "Всички настройки - откриване, съвпадение, време, уведомления, профили и цикли - са налични в панела на WashData. Използвайте този формуляр само за промяна на датчика за мощност, типа устройство или прага на готовност.", "description": "Преименувайте устройството или променете основните му хардуерни настройки. Всички настройки за откриване, съвпадение и известия са в [панела на WashData](/ha-washdata) (достъпен и от страничната лента).",
"data": { "data": {
"name": "Име на устройството", "name": "Име на устройството",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: таймер за {minutes} мин", "timer_default_message": "{device}: таймер за {minutes} мин",
"timer_pause_action_title": "Възобновяване на цикъла", "timer_pause_action_title": "Възобновяване на цикъла",
"timer_pause_body_suffix": "Цикълът е на пауза. Отворете панела на WashData, за да го възобновите.", "timer_pause_body_suffix": "Цикълът е на пауза. Отворете панела на WashData, за да го възобновите.",
"unload_dismiss_action_title": "Спри напомнянията",
"notify_live_waiting_message": "{device}: Все още няма съвпадащ профил.", "notify_live_waiting_message": "{device}: Все още няма съвпадащ профил.",
"vs_typical_longer": "{pct}% по-дълго от обичайното", "vs_typical_longer": "{pct}% по-дълго от обичайното",
"vs_typical_shorter": "{pct}% по-кратко от обичайното", "vs_typical_shorter": "{pct}% по-кратко от обичайното",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData Setup", "title": "WashData Setup",
"description": "Konfigurišite svoju mašinu za pranje veša ili drugi uređaj.\n\nPotreban je senzor snage.\n\n**Slijedeće ćete biti upitani da li želite da kreirate svoj prvi profil.**", "description": "Konfigurišite svoju mašinu za pranje veša ili drugi uređaj.\n\nSenzor snage je obavezan.\n\nNakon postavljanja otvorite WashData panel s bočne trake (ili idite na [/ha-washdata](/ha-washdata)) za pregled ciklusa, podešavanje otkrivanja i upravljanje profilima.",
"data": { "data": {
"name": "Naziv uređaja", "name": "Naziv uređaja",
"device_type": "Tip uređaja", "device_type": "Tip uređaja",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Ažurirajte naziv uređaja, tip uređaja ili senzor snage.\n\nWashData panel (bočna traka ili [/ha-washdata](/ha-washdata)) služi za upravljanje otkrivanjem, ciklusima, profilima i obavještenjima.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Preimenujte uređaj ili promijenite njegove osnovne postavke hardvera. Sve postavke otkrivanja, podudaranja i obavještavanja nalaze se na [WashData panelu](/ha-washdata) (dostupan i s bočne trake).",
"data": { "data": {
"name": "Naziv uređaja", "name": "Naziv uređaja",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: tajmer od {minutes} min", "timer_default_message": "{device}: tajmer od {minutes} min",
"timer_pause_action_title": "Nastavi ciklus", "timer_pause_action_title": "Nastavi ciklus",
"timer_pause_body_suffix": "Ciklus je pauziran. Otvorite WashData panel da biste nastavili.", "timer_pause_body_suffix": "Ciklus je pauziran. Otvorite WashData panel da biste nastavili.",
"unload_dismiss_action_title": "Prestani podsjećati",
"notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.", "notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.",
"vs_typical_longer": "{pct}% duže nego obično", "vs_typical_longer": "{pct}% duže nego obično",
"vs_typical_shorter": "{pct}% kraće nego obično", "vs_typical_shorter": "{pct}% kraće nego obično",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Nastavení WashData", "title": "Nastavení WashData",
"description": "Nakonfigurujte si pračku nebo jiný spotřebič.\n\nJe vyžadován snímač napájení.\n\n**Dále budete dotázáni, zda chcete vytvořit svůj první profil.**", "description": "Nakonfigurujte si pračku nebo jiný spotřebič.\n\nSenzor výkonu je vyžadován.\n\nPo nastavení otevřete panel WashData z postranního panelu (nebo přejděte na [/ha-washdata](/ha-washdata)) pro zobrazení cyklů, ladění detekce a správu profilů.",
"data": { "data": {
"name": "Název zařízení", "name": "Název zařízení",
"device_type": "Typ zařízení", "device_type": "Typ zařízení",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Aktualizujte název zařízení, typ spotřebiče nebo senzor výkonu.\n\nPanel WashData (postranní panel nebo [/ha-washdata](/ha-washdata)) slouží ke správě detekce, cyklů, profilů a oznámení.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Přejmenujte zařízení nebo změňte jeho základní hardwarová nastavení. Veškerá nastavení detekce, porovnávání a oznámení jsou na [panelu WashData](/ha-washdata) (dostupný také z postranního panelu).",
"data": { "data": {
"name": "Název zařízení", "name": "Název zařízení",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min časovač", "timer_default_message": "{device}: {minutes} min časovač",
"timer_pause_action_title": "Obnovit cyklus", "timer_pause_action_title": "Obnovit cyklus",
"timer_pause_body_suffix": "Cyklus je pozastaven. Pro pokračování otevřete panel WashData.", "timer_pause_body_suffix": "Cyklus je pozastaven. Pro pokračování otevřete panel WashData.",
"unload_dismiss_action_title": "Přestat připomínat",
"notify_live_waiting_message": "{device}: Zatím nebyl rozpoznán žádný profil.", "notify_live_waiting_message": "{device}: Zatím nebyl rozpoznán žádný profil.",
"vs_typical_longer": "o {pct}% déle než obvykle", "vs_typical_longer": "o {pct}% déle než obvykle",
"vs_typical_shorter": "o {pct}% kratší než obvykle", "vs_typical_shorter": "o {pct}% kratší než obvykle",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData opsætning", "title": "WashData opsætning",
"description": "Konfigurer din vaskemaskine eller andet apparat.\n\nStrømsensor er påkrævet.\n\n**Derefter bliver du spurgt, om du vil oprette din første profil.**", "description": "Konfigurer din vaskemaskine eller andet apparat.\n\nStrømsensor er påkrævet.\n\nEfter opsætning skal du åbne WashData-panelet fra sidebjælken (eller gå til [/ha-washdata](/ha-washdata)) for at se cyklusser, justere registrering og administrere profiler.",
"data": { "data": {
"name": "Enhedens navn", "name": "Enhedens navn",
"device_type": "Enhedstype", "device_type": "Enhedstype",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Opdater enhedsnavnet, apparattypen eller strømsensoren.\n\nWashData-panelet (sidebjælken eller [/ha-washdata](/ha-washdata)) er, hvor registrering, cyklusser, profiler og notifikationer administreres.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Omdøb enheden eller skift dens grundlæggende hardwareindstillinger. Alle indstillinger for registrering, matching og notifikationer findes i [WashData-panelet](/ha-washdata) (også tilgængeligt fra sidebjælken).",
"data": { "data": {
"name": "Enhedsnavn", "name": "Enhedsnavn",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min timer", "timer_default_message": "{device}: {minutes} min timer",
"timer_pause_action_title": "Genoptag cyklus", "timer_pause_action_title": "Genoptag cyklus",
"timer_pause_body_suffix": "Cyklussen er sat på pause. Åbn WashData-panelet for at genoptage.", "timer_pause_body_suffix": "Cyklussen er sat på pause. Åbn WashData-panelet for at genoptage.",
"unload_dismiss_action_title": "Stop påmindelser",
"notify_live_waiting_message": "{device}: Ingen profil genkendt endnu.", "notify_live_waiting_message": "{device}: Ingen profil genkendt endnu.",
"vs_typical_longer": "{pct}% længere end normalt", "vs_typical_longer": "{pct}% længere end normalt",
"vs_typical_shorter": "{pct}% kortere end normalt", "vs_typical_shorter": "{pct}% kortere end normalt",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData-Setup", "title": "WashData-Setup",
"description": "Konfigurieren Sie Ihre Waschmaschine oder ein anderes Gerät.\n\nLeistungssensor ist erforderlich.\n\n**Als nächstes werden Sie gefragt, ob Sie Ihr erstes Profil erstellen möchten.**", "description": "Konfigurieren Sie Ihre Waschmaschine oder ein anderes Gerät.\n\nLeistungssensor ist erforderlich.\n\nNach der Einrichtung öffnen Sie das WashData-Panel über die Seitenleiste (oder gehen Sie zu [/ha-washdata](/ha-washdata)), um Zyklen anzuzeigen, die Erkennung anzupassen und Profile zu verwalten.",
"data": { "data": {
"name": "Gerätename", "name": "Gerätename",
"device_type": "Gerätetyp", "device_type": "Gerätetyp",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Aktualisieren Sie den Gerätenamen, den Gerätetyp oder den Leistungssensor.\n\nDas WashData-Panel (Seitenleiste oder [/ha-washdata](/ha-washdata)) ist der Ort, an dem Erkennung, Zyklen, Profile und Benachrichtigungen verwaltet werden.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Benennen Sie das Gerät um oder ändern Sie seine grundlegenden Hardware-Einstellungen. Alle Erkennungs-, Abgleich- und Benachrichtigungseinstellungen befinden sich im [WashData-Panel](/ha-washdata) (auch über die Seitenleiste erreichbar).",
"data": { "data": {
"name": "Name des Geräts", "name": "Name des Geräts",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes}-Min.-Timer", "timer_default_message": "{device}: {minutes}-Min.-Timer",
"timer_pause_action_title": "Zyklus fortsetzen", "timer_pause_action_title": "Zyklus fortsetzen",
"timer_pause_body_suffix": "Der Zyklus ist angehalten. Öffnen Sie das WashData-Panel, um fortzufahren.", "timer_pause_body_suffix": "Der Zyklus ist angehalten. Öffnen Sie das WashData-Panel, um fortzufahren.",
"unload_dismiss_action_title": "Nicht mehr erinnern",
"notify_live_waiting_message": "{device}: Noch kein Profil erkannt.", "notify_live_waiting_message": "{device}: Noch kein Profil erkannt.",
"vs_typical_longer": "{pct}% länger als üblich", "vs_typical_longer": "{pct}% länger als üblich",
"vs_typical_shorter": "{pct}% kürzer als üblich", "vs_typical_shorter": "{pct}% kürzer als üblich",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Ρύθμιση WashData", "title": "Ρύθμιση WashData",
"description": "Διαμορφώστε το πλυντήριο ή άλλη συσκευή σας.\n\nΑπαιτείται αισθητήρας ισχύος.\n\n**Στη συνέχεια, θα ερωτηθείτε αν θέλετε να δημιουργήσετε το πρώτο σας προφίλ.**", "description": "Ρυθμίστε το πλυντήριο ρούχων ή άλλη συσκευή σας.\n\nΑπαιτείται αισθητήρας ισχύος.\n\nΜετά τη ρύθμιση, ανοίξτε τον πίνακα WashData από την πλευρική γραμμή (ή μεταβείτε στο [/ha-washdata](/ha-washdata)) για να δείτε κύκλους, να ρυθμίσετε την ανίχνευση και να διαχειριστείτε προφίλ.",
"data": { "data": {
"name": "Όνομα συσκευής", "name": "Όνομα συσκευής",
"device_type": "Τύπος συσκευής", "device_type": "Τύπος συσκευής",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Ενημέρωση του ονόματος της συσκευής, του τύπου συσκευής ή του αισθητήρα ισχύος.", "description": "Ενημερώστε το όνομα της συσκευής, τον τύπο συσκευής ή τον αισθητήρα ισχύος.\n\nΟ πίνακας WashData (πλευρική γραμμή ή [/ha-washdata](/ha-washdata)) είναι το μέρος όπου διαχειρίζεται η ανίχνευση, οι κύκλοι, τα προφίλ και οι ειδοποιήσεις.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "Όλες οι ρυθμίσεις -- ανίχνευση, ταίριασμα, συγχρονισμός, ειδοποιήσεις, προφίλ και κύκλοι -- είναι διαθέσιμες στον πίνακα WashData. Χρησιμοποιήστε αυτή τη φόρμα μόνο για να αλλάξετε τον αισθητήρα ισχύος, τον τύπο της συσκευής, ή το κατώφλι αναμονής.", "description": "Μετονομάστε τη συσκευή ή αλλάξτε τις βασικές ρυθμίσεις υλικού. Όλες οι ρυθμίσεις ανίχνευσης, αντιστοίχισης και ειδοποιήσεων βρίσκονται στον [πίνακα WashData](/ha-washdata) (επίσης προσβάσιμος από την πλευρική γραμμή).",
"data": { "data": {
"name": "Όνομα συσκευής", "name": "Όνομα συσκευής",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: χρονόμετρο {minutes} λεπτών", "timer_default_message": "{device}: χρονόμετρο {minutes} λεπτών",
"timer_pause_action_title": "Συνέχιση κύκλου", "timer_pause_action_title": "Συνέχιση κύκλου",
"timer_pause_body_suffix": "Ο κύκλος είναι σε παύση. Ανοίξτε τον πίνακα WashData για να συνεχίσετε.", "timer_pause_body_suffix": "Ο κύκλος είναι σε παύση. Ανοίξτε τον πίνακα WashData για να συνεχίσετε.",
"unload_dismiss_action_title": "Διακοπή υπενθυμίσεων",
"notify_live_waiting_message": "{device}: Δεν έχει αναγνωριστεί ακόμη κανένα προφίλ.", "notify_live_waiting_message": "{device}: Δεν έχει αναγνωριστεί ακόμη κανένα προφίλ.",
"vs_typical_longer": "{pct}% περισσότερο από το συνηθισμένο", "vs_typical_longer": "{pct}% περισσότερο από το συνηθισμένο",
"vs_typical_shorter": "{pct}% λιγότερο από το συνηθισμένο", "vs_typical_shorter": "{pct}% λιγότερο από το συνηθισμένο",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData Setup", "title": "WashData Setup",
"description": "Configure your washing machine or other appliance.\n\nPower sensor is required.", "description": "Configure your washing machine or other appliance.\n\nPower sensor is required.\n\nAfter setup, open the WashData panel from the sidebar (or go to [/ha-washdata](/ha-washdata)) to view cycles, tune detection and manage profiles.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Update the device name, appliance type, or power sensor.\n\nThe WashData panel (sidebar, or [/ha-washdata](/ha-washdata)) is where detection, cycles, profiles and notifications are managed.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the WashData panel.", "description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the [WashData panel](/ha-washdata) (also reachable from the sidebar).",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -57,6 +57,7 @@
"timer_default_message": "{device}: {minutes} min timer", "timer_default_message": "{device}: {minutes} min timer",
"timer_pause_action_title": "Resume Cycle", "timer_pause_action_title": "Resume Cycle",
"timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.", "timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.",
"unload_dismiss_action_title": "Stop reminding",
"vs_typical_longer": "{pct}% longer than usual", "vs_typical_longer": "{pct}% longer than usual",
"vs_typical_shorter": "{pct}% shorter than usual", "vs_typical_shorter": "{pct}% shorter than usual",
"notify_live_waiting_message": "{device}: No profile matched yet." "notify_live_waiting_message": "{device}: No profile matched yet."
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Configuración de WashData", "title": "Configuración de WashData",
"description": "Configura tu lavadora u otro electrodoméstico.\n\nSe requiere un sensor de potencia.\n\n**A continuación, se te preguntará si deseas crear tu primer perfil.**", "description": "Configura tu lavadora u otro electrodoméstico.\n\nSe requiere un sensor de potencia.\n\nTras la configuración, abre el panel de WashData desde la barra lateral (o ve a [/ha-washdata](/ha-washdata)) para ver los ciclos, ajustar la detección y gestionar los perfiles.",
"data": { "data": {
"name": "Nombre del dispositivo", "name": "Nombre del dispositivo",
"device_type": "Tipo de dispositivo", "device_type": "Tipo de dispositivo",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigurar WashData", "title": "Reconfigurar WashData",
"description": "Actualiza el nombre del dispositivo, el tipo de electrodoméstico o el sensor de potencia.", "description": "Actualiza el nombre del dispositivo, el tipo de electrodoméstico o el sensor de potencia.\n\nEl panel de WashData (barra lateral, o [/ha-washdata](/ha-washdata)) es donde se gestionan la detección, los ciclos, los perfiles y las notificaciones.",
"data": { "data": {
"name": "Nombre del dispositivo", "name": "Nombre del dispositivo",
"device_type": "Tipo de dispositivo", "device_type": "Tipo de dispositivo",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "Ajustes de WashData", "title": "Ajustes de WashData",
"description": "Todos los ajustes detección, coincidencia, temporización, notificaciones, perfiles y ciclos — están disponibles en el panel de WashData. Usa este formulario solo para cambiar el sensor de potencia, el tipo de dispositivo o el umbral en espera.", "description": "Cambia el nombre del dispositivo o su configuración de hardware principal. Todos los ajustes de detección, coincidencia y notificaciones están en el [panel de WashData](/ha-washdata) (también accesible desde la barra lateral).",
"data": { "data": {
"name": "Nombre del dispositivo", "name": "Nombre del dispositivo",
"device_type": "Tipo de dispositivo", "device_type": "Tipo de dispositivo",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: temporizador de {minutes} min", "timer_default_message": "{device}: temporizador de {minutes} min",
"timer_pause_action_title": "Reanudar ciclo", "timer_pause_action_title": "Reanudar ciclo",
"timer_pause_body_suffix": "El ciclo está en pausa. Abre el panel de WashData para reanudarlo.", "timer_pause_body_suffix": "El ciclo está en pausa. Abre el panel de WashData para reanudarlo.",
"unload_dismiss_action_title": "Dejar de recordar",
"notify_live_waiting_message": "{device}: todavía no se ha reconocido ningún perfil.", "notify_live_waiting_message": "{device}: todavía no se ha reconocido ningún perfil.",
"vs_typical_longer": "{pct}% más largo de lo habitual", "vs_typical_longer": "{pct}% más largo de lo habitual",
"vs_typical_shorter": "{pct}% más corto de lo habitual", "vs_typical_shorter": "{pct}% más corto de lo habitual",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData häälestus", "title": "WashData häälestus",
"description": "Seadistage oma pesumasin või muu seade.\n\nVajalik on võimsusandur.\n\n**Järgmisena küsitakse teilt, kas soovite luua oma esimese profiili.**", "description": "Seadistage oma pesumasin või muu seade.\n\nVajalik on võimsusandur.\n\nPärast seadistamist avage WashData paneel külgribalt (või minge [/ha-washdata](/ha-washdata)), et vaadata tsükleid, häälestada tuvastust ja hallata profiile.",
"data": { "data": {
"name": "Seadme nimi", "name": "Seadme nimi",
"device_type": "Seadme tüüp", "device_type": "Seadme tüüp",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "WashData uuesti seadistamine", "title": "WashData uuesti seadistamine",
"description": "Uuendage seadme nime, seadmetüüpi või võimsusandurit.", "description": "Uuendage seadme nime, seadmetüüpi või võimsusandurit.\n\nWashData paneelis (külgriba või [/ha-washdata](/ha-washdata)) hallatakse tuvastust, tsükleid, profiile ja teavitusi.",
"data": { "data": {
"name": "Seadme nimi", "name": "Seadme nimi",
"device_type": "Seadme tüüp", "device_type": "Seadme tüüp",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData seadistused", "title": "WashData seadistused",
"description": "Kõik seadistused — tuvastamine, sobitamine, ajastamine, teated, profiilid ja tsüklid — on saadaval WashData paneelil. Kasutage seda vormi ainult võimsusanduri, seadmetüübi või ooterežiimi läve muutmiseks.", "description": "Nimetage seade ümber või muutke selle põhilisi riistvara seadeid. Kõik tuvastus-, sobitamis- ja teavitusseaded asuvad [WashData paneelil](/ha-washdata) (ligipääsetav ka külgribalt).",
"data": { "data": {
"name": "Seadme nimi", "name": "Seadme nimi",
"device_type": "Seadme tüüp", "device_type": "Seadme tüüp",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min taimer", "timer_default_message": "{device}: {minutes} min taimer",
"timer_pause_action_title": "Tsükli jätkamine", "timer_pause_action_title": "Tsükli jätkamine",
"timer_pause_body_suffix": "Tsükkel on peatatud. Jätkamiseks avage WashData paneel.", "timer_pause_body_suffix": "Tsükkel on peatatud. Jätkamiseks avage WashData paneel.",
"unload_dismiss_action_title": "Lõpeta meeldetuletused",
"notify_live_waiting_message": "{device}: Ühtki profiili pole veel tuvastatud.", "notify_live_waiting_message": "{device}: Ühtki profiili pole veel tuvastatud.",
"vs_typical_longer": "{pct}% tavapärasest pikem", "vs_typical_longer": "{pct}% tavapärasest pikem",
"vs_typical_shorter": "{pct}% tavapärasest lühem", "vs_typical_shorter": "{pct}% tavapärasest lühem",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData-asetukset", "title": "WashData-asetukset",
"description": "Määritä pesukoneesi tai muu laite.\n\nTehoanturi tarvitaan.\n\n**Seuraavaksi sinulta kysytään, haluatko luoda ensimmäisen profiilisi.**", "description": "Määritä pesukoneesi tai muu laite.\n\nTehoanturi tarvitaan.\n\nAsetuksen jälkeen avaa WashData-paneeli sivupalkista (tai siirry osoitteeseen [/ha-washdata](/ha-washdata)) nähdäksesi syklit, säätääksesi tunnistuksen ja hallitaksesi profiileja.",
"data": { "data": {
"name": "Laitteen nimi", "name": "Laitteen nimi",
"device_type": "Laitteen tyyppi", "device_type": "Laitteen tyyppi",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Konfiguroi WashData uudelleen", "title": "Konfiguroi WashData uudelleen",
"description": "Päivitä laitteen nimi, laitteen tyyppi tai tehoanturi.", "description": "Päivitä laitteen nimi, laitteen tyyppi tai tehoanturi.\n\nWashData-paneelissa (sivupalkki tai [/ha-washdata](/ha-washdata)) hallitaan tunnistusta, syklejä, profiileja ja ilmoituksia.",
"data": { "data": {
"name": "Laitteen nimi", "name": "Laitteen nimi",
"device_type": "Laitteen tyyppi", "device_type": "Laitteen tyyppi",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData-asetukset", "title": "WashData-asetukset",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Nimeä laite uudelleen tai muuta sen ydinlaitteiston asetuksia. Kaikki tunnistus-, täsmäytys- ja ilmoitusasetukset ovat [WashData-paneelissa](/ha-washdata) (saavutettavissa myös sivupalkista).",
"data": { "data": {
"name": "Laitteen nimi", "name": "Laitteen nimi",
"device_type": "Laitteen tyyppi", "device_type": "Laitteen tyyppi",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min ajastin", "timer_default_message": "{device}: {minutes} min ajastin",
"timer_pause_action_title": "Jatka sykliä", "timer_pause_action_title": "Jatka sykliä",
"timer_pause_body_suffix": "Sykli on keskeytetty. Avaa WashData-paneeli jatkaaksesi.", "timer_pause_body_suffix": "Sykli on keskeytetty. Avaa WashData-paneeli jatkaaksesi.",
"unload_dismiss_action_title": "Lopeta muistuttaminen",
"notify_live_waiting_message": "{device}: Yhtään profiilia ei ole vielä tunnistettu.", "notify_live_waiting_message": "{device}: Yhtään profiilia ei ole vielä tunnistettu.",
"vs_typical_longer": "{pct}% tavallista pidempi", "vs_typical_longer": "{pct}% tavallista pidempi",
"vs_typical_shorter": "{pct}% tavallista lyhyempi", "vs_typical_shorter": "{pct}% tavallista lyhyempi",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Configuration des données de lavage", "title": "Configuration des données de lavage",
"description": "Configurez votre lave-linge ou autre appareil.\n\nUn capteur de puissance est requis.\n\n**Ensuite, il vous sera demandé si vous souhaitez créer votre premier profil.**", "description": "Configurez votre lave-linge ou autre appareil.\n\nUn capteur de puissance est requis.\n\nUne fois la configuration terminée, ouvrez le panneau WashData depuis la barre latérale (ou accédez à [/ha-washdata](/ha-washdata)) pour consulter les cycles, affiner la détection et gérer les profils.",
"data": { "data": {
"name": "Nom de l'appareil", "name": "Nom de l'appareil",
"device_type": "Type d'appareil", "device_type": "Type d'appareil",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigurer WashData", "title": "Reconfigurer WashData",
"description": "Mettez à jour le nom de l'appareil, le type d'appareil ou le capteur de puissance.", "description": "Mettez à jour le nom de l'appareil, le type d'appareil ou le capteur de puissance.\n\nLe panneau WashData (barre latérale ou [/ha-washdata](/ha-washdata)) permet de gérer la détection, les cycles, les profils et les notifications.",
"data": { "data": {
"name": "Nom de l'appareil", "name": "Nom de l'appareil",
"device_type": "Type d'appareil", "device_type": "Type d'appareil",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "Paramètres WashData", "title": "Paramètres WashData",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Renommez l'appareil ou modifiez ses paramètres matériels de base. Tous les paramètres de détection, de correspondance et de notification se trouvent dans le [panneau WashData](/ha-washdata) (également accessible depuis la barre latérale).",
"data": { "data": {
"name": "Nom du périphérique", "name": "Nom du périphérique",
"device_type": "Type d'appareil", "device_type": "Type d'appareil",
@@ -56,6 +56,7 @@
"timer_default_message": "{device} : minuterie de {minutes} min", "timer_default_message": "{device} : minuterie de {minutes} min",
"timer_pause_action_title": "Reprendre le cycle", "timer_pause_action_title": "Reprendre le cycle",
"timer_pause_body_suffix": "Le cycle est en pause. Ouvrez le panneau WashData pour reprendre.", "timer_pause_body_suffix": "Le cycle est en pause. Ouvrez le panneau WashData pour reprendre.",
"unload_dismiss_action_title": "Arrêter les rappels",
"notify_live_waiting_message": "{device} : aucun profil reconnu pour le moment.", "notify_live_waiting_message": "{device} : aucun profil reconnu pour le moment.",
"vs_typical_longer": "{pct}% plus long que d'habitude", "vs_typical_longer": "{pct}% plus long que d'habitude",
"vs_typical_shorter": "{pct}% plus court que d'habitude", "vs_typical_shorter": "{pct}% plus court que d'habitude",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Postavljanje WashData", "title": "Postavljanje WashData",
"description": "Konfigurirajte svoju perilicu rublja ili neki drugi uređaj.\n\nPotreban je senzor snage.\n\n**Potom ćete biti upitani želite li izraditi svoj prvi profil.**", "description": "Konfigurirajte svoju perilicu rublja ili neki drugi uređaj.\n\nSenzor snage je obavezan.\n\nNakon postavljanja otvorite WashData panel s bočne trake (ili idite na [/ha-washdata](/ha-washdata)) za pregled ciklusa, podešavanje otkrivanja i upravljanje profilima.",
"data": { "data": {
"name": "Naziv uređaja", "name": "Naziv uređaja",
"device_type": "Vrsta uređaja", "device_type": "Vrsta uređaja",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Ažurirajte naziv uređaja, vrstu uređaja ili senzor snage.\n\nWashData panel (bočna traka ili [/ha-washdata](/ha-washdata)) služi za upravljanje otkrivanjem, ciklusima, profilima i obavijestima.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Preimenujte uređaj ili promijenite njegove osnovne postavke hardvera. Sve postavke otkrivanja, podudaranja i obavijesti nalaze se na [WashData panelu](/ha-washdata) (dostupan i s bočne trake).",
"data": { "data": {
"name": "Naziv uređaja", "name": "Naziv uređaja",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min tajmer", "timer_default_message": "{device}: {minutes} min tajmer",
"timer_pause_action_title": "Nastavi ciklus", "timer_pause_action_title": "Nastavi ciklus",
"timer_pause_body_suffix": "Ciklus je pauziran. Otvorite WashData panel za nastavak.", "timer_pause_body_suffix": "Ciklus je pauziran. Otvorite WashData panel za nastavak.",
"unload_dismiss_action_title": "Prestani podsjećati",
"notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.", "notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.",
"vs_typical_longer": "{pct}% dulje nego obično", "vs_typical_longer": "{pct}% dulje nego obično",
"vs_typical_shorter": "{pct}% kraće nego obično", "vs_typical_shorter": "{pct}% kraće nego obično",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData beállítása", "title": "WashData beállítása",
"description": "Állítsa be a mosógépet vagy más készüléket.\n\nTeljesítményérzékelő szükséges.\n\n**Ezután a rendszer megkérdezi, hogy szeretné-e létrehozni első profilját.**", "description": "Állítsa be a mosógépet vagy más készüléket.\n\nTeljesítményérzékelő szükséges.\n\nA beállítás után nyissa meg a WashData panelt az oldalsávból (vagy lépjen ide: [/ha-washdata](/ha-washdata)), ahol megtekintheti a ciklusokat, finomhangolhatja a felismerést és kezelheti a profilokat.",
"data": { "data": {
"name": "Eszköz neve", "name": "Eszköz neve",
"device_type": "Eszköz típusa", "device_type": "Eszköz típusa",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Frissítse az eszköz nevét, a készülék típusát vagy a teljesítményérzékelőt.\n\nA WashData panel (oldalsáv vagy [/ha-washdata](/ha-washdata)) a felismerés, ciklusok, profilok és értesítések kezelésére szolgál.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Nevezze át az eszközt, vagy módosítsa az alap hardverbeállításait. Az összes felismerési, egyeztetési és értesítési beállítás a [WashData panelen](/ha-washdata) található (az oldalsávból is elérhető).",
"data": { "data": {
"name": "Eszköz neve", "name": "Eszköz neve",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} perces időzítő", "timer_default_message": "{device}: {minutes} perces időzítő",
"timer_pause_action_title": "Ciklus folytatása", "timer_pause_action_title": "Ciklus folytatása",
"timer_pause_body_suffix": "A ciklus szünetel. A folytatáshoz nyissa meg a WashData-panelt.", "timer_pause_body_suffix": "A ciklus szünetel. A folytatáshoz nyissa meg a WashData-panelt.",
"unload_dismiss_action_title": "Emlékeztetés leállítása",
"notify_live_waiting_message": "{device}: Még nincs illeszkedő profil.", "notify_live_waiting_message": "{device}: Még nincs illeszkedő profil.",
"vs_typical_longer": "{pct}%-kal hosszabb a szokásosnál", "vs_typical_longer": "{pct}%-kal hosszabb a szokásosnál",
"vs_typical_shorter": "{pct}%-kal rövidebb a szokásosnál", "vs_typical_shorter": "{pct}%-kal rövidebb a szokásosnál",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData uppsetning", "title": "WashData uppsetning",
"description": "Stilltu þvottavélina þína eða annað tæki.\n\nKraftur skynjari er nauðsynlegur.\n\n**Þá verður þú spurður hvort þú viljir búa til fyrsta prófílinn þinn.**", "description": "Stilltu þvottavélina þína eða annað tæki.\n\nKraftskynjari er nauðsynlegur.\n\nEftir uppsetningu skaltu opna WashData-spjaldið frá hliðarstikunni (eða fara á [/ha-washdata](/ha-washdata)) til að skoða hringrás, stilla skynjun og stjórna sniðum.",
"data": { "data": {
"name": "Nafn tækis", "name": "Nafn tækis",
"device_type": "Tegund tækis", "device_type": "Tegund tækis",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Uppfærðu heiti tækisins, tegund tækis eða kraftskynjara.\n\nWashData-spjaldið (hliðarstikan eða [/ha-washdata](/ha-washdata)) er þar sem skynjun, hringrás, sniðmát og tilkynningar eru stjórnað.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Endurnefndu tækið eða breyttu grunnstillingum vélbúnaðar. Allar stillingar fyrir skynjun, samsvörun og tilkynningar eru í [WashData-spjaldinu](/ha-washdata) (einnig aðgengilegt frá hliðarstikunni).",
"data": { "data": {
"name": "Nafn tækis", "name": "Nafn tækis",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} mín tímataki", "timer_default_message": "{device}: {minutes} mín tímataki",
"timer_pause_action_title": "Halda áfram hringrás", "timer_pause_action_title": "Halda áfram hringrás",
"timer_pause_body_suffix": "Hringrásin er í bið. Opnaðu WashData-gluggann til að halda áfram.", "timer_pause_body_suffix": "Hringrásin er í bið. Opnaðu WashData-gluggann til að halda áfram.",
"unload_dismiss_action_title": "Hætta að minna",
"notify_live_waiting_message": "{device}: Ekkert snið hefur enn verið greint.", "notify_live_waiting_message": "{device}: Ekkert snið hefur enn verið greint.",
"vs_typical_longer": "{pct}% lengri en venjulega", "vs_typical_longer": "{pct}% lengri en venjulega",
"vs_typical_shorter": "{pct}% styttri en venjulega", "vs_typical_shorter": "{pct}% styttri en venjulega",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Configurazione WashData", "title": "Configurazione WashData",
"description": "Configura la tua lavatrice o altro elettrodomestico.\n\nÈ richiesto il sensore di potenza.\n\n**Successivamente ti verrà chiesto se desideri creare il tuo primo profilo.**", "description": "Configura la tua lavatrice o altro elettrodomestico.\n\nÈ richiesto il sensore di potenza.\n\nDopo la configurazione, apri il pannello WashData dalla barra laterale (o vai su [/ha-washdata](/ha-washdata)) per visualizzare i cicli, regolare il rilevamento e gestire i profili.",
"data": { "data": {
"name": "Nome dispositivo", "name": "Nome dispositivo",
"device_type": "Tipo di dispositivo", "device_type": "Tipo di dispositivo",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Aggiorna il nome del dispositivo, il tipo di elettrodomestico o il sensore di potenza.\n\nIl pannello WashData (barra laterale, o [/ha-washdata](/ha-washdata)) è dove vengono gestiti rilevamento, cicli, profili e notifiche.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Rinomina il dispositivo o modifica le sue impostazioni hardware principali. Tutte le impostazioni di rilevamento, corrispondenza e notifica si trovano nel [pannello WashData](/ha-washdata) (accessibile anche dalla barra laterale).",
"data": { "data": {
"name": "Nome del dispositivo", "name": "Nome del dispositivo",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: timer di {minutes} min", "timer_default_message": "{device}: timer di {minutes} min",
"timer_pause_action_title": "Riprendi ciclo", "timer_pause_action_title": "Riprendi ciclo",
"timer_pause_body_suffix": "Il ciclo è in pausa. Apri il pannello WashData per riprendere.", "timer_pause_body_suffix": "Il ciclo è in pausa. Apri il pannello WashData per riprendere.",
"unload_dismiss_action_title": "Interrompi promemoria",
"notify_live_waiting_message": "{device}: nessun profilo ancora riconosciuto.", "notify_live_waiting_message": "{device}: nessun profilo ancora riconosciuto.",
"vs_typical_longer": "{pct}% più lungo del solito", "vs_typical_longer": "{pct}% più lungo del solito",
"vs_typical_shorter": "{pct}% più corto del solito", "vs_typical_shorter": "{pct}% più corto del solito",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData セットアップ", "title": "WashData セットアップ",
"description": "洗濯機またはその他の家電製品を設定します。\n\n電力センサーが必要です。\n\n**次に、最初のプロファイルを作成するかどうか確認されます。**", "description": "洗濯機またはその他の家電製品を設定します。\n\n電力センサーが必要です。\n\nセットアップ後、サイドバーの WashData パネルを開くか(または [/ha-washdata](/ha-washdata) にアクセスして)、サイクルの確認、検出の調整、プロファイルの管理を行ってください。",
"data": { "data": {
"name": "デバイス名", "name": "デバイス名",
"device_type": "デバイスの種類", "device_type": "デバイスの種類",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "デバイス名、アプライアンスのタイプ、または電力センサーを更新します。", "description": "デバイス名、家電の種類、または電力センサーを更新します。\n\nWashData パネル(サイドバー、または [/ha-washdata](/ha-washdata))で、検出、サイクル、プロファイル、通知を管理できます。",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "すべての設定 (検出、マッチング、タイミング、通知、プロファイル、サイクル) は、WashData パネルで利用できます。このフォームは、パワー センサー、デバイス タイプ、またはスタンバイしきい値を変更する場合にのみ使用してください。", "description": "デバイス名を変更するか、主要なハードウェア設定を変更します。すべての検出・照合・通知の設定は [WashData パネル](/ha-washdata) で確認できます(サイドバーからもアクセス可能)。",
"data": { "data": {
"name": "デバイス名", "name": "デバイス名",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} 分タイマー", "timer_default_message": "{device}: {minutes} 分タイマー",
"timer_pause_action_title": "サイクルを再開する", "timer_pause_action_title": "サイクルを再開する",
"timer_pause_body_suffix": "サイクルが一時停止中です。再開するには WashData パネルを開いてください。", "timer_pause_body_suffix": "サイクルが一時停止中です。再開するには WashData パネルを開いてください。",
"unload_dismiss_action_title": "リマインダーを停止",
"notify_live_waiting_message": "{device}: まだ一致するプロファイルがありません。", "notify_live_waiting_message": "{device}: まだ一致するプロファイルがありません。",
"vs_typical_longer": "通常より {pct}% 長い", "vs_typical_longer": "通常より {pct}% 長い",
"vs_typical_shorter": "通常より {pct}% 短い", "vs_typical_shorter": "通常より {pct}% 短い",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData 설정", "title": "WashData 설정",
"description": "세탁기 또는 기타 가전제품을 구성하세요.\n\n전력 센서가 필요합니다.\n\n**다음으로 첫 번째 프로필을 만들지 여부를 묻는 메시지가 표시됩니다.**", "description": "세탁기 또는 기타 가전제품을 구성하세요.\n\n전력 센서가 필요합니다.\n\n설정 후, 사이드바에서 WashData 패널을 열거나 [/ha-washdata](/ha-washdata)로 이동하여 사이클 확인, 검출 조정 및 프로파일 관리를 하세요.",
"data": { "data": {
"name": "장치 이름", "name": "장치 이름",
"device_type": "장치 유형", "device_type": "장치 유형",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "장치 이름, 기기 유형 또는 전 센서를 업데이트합니다.", "description": "장치 이름, 가전 유형 또는 전 센서를 업데이트합니다.\n\nWashData 패널(사이드바 또는 [/ha-washdata](/ha-washdata))에서 검출, 사이클, 프로파일 및 알림을 관리합니다.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "감지, 매칭, 타이밍, 알림, 프로필, 주기 등 모든 설정을 WashData 패널에서 사용할 수 있습니다. 전원 센서, 장치 유형 또는 대기 임계값을 변경하는 경우에만 이 양식을 사용하십시오.", "description": "장치 이름을 변경하거나 핵심 하드웨어 설정을 변경합니다. 모든 검출, 매칭 및 알림 설정은 [WashData 패널](/ha-washdata)에서 확인할 수 있습니다(사이드바에서도 접근 가능).",
"data": { "data": {
"name": "장치 이름", "name": "장치 이름",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes}분 타이머", "timer_default_message": "{device}: {minutes}분 타이머",
"timer_pause_action_title": "사이클 재개", "timer_pause_action_title": "사이클 재개",
"timer_pause_body_suffix": "사이클이 일시 정지되었습니다. 재개하려면 WashData 패널을 여세요.", "timer_pause_body_suffix": "사이클이 일시 정지되었습니다. 재개하려면 WashData 패널을 여세요.",
"unload_dismiss_action_title": "알림 중지",
"notify_live_waiting_message": "{device}: 아직 일치하는 프로필이 없습니다.", "notify_live_waiting_message": "{device}: 아직 일치하는 프로필이 없습니다.",
"vs_typical_longer": "평소보다 {pct}% 더 김", "vs_typical_longer": "평소보다 {pct}% 더 김",
"vs_typical_shorter": "평소보다 {pct}% 더 짧음", "vs_typical_shorter": "평소보다 {pct}% 더 짧음",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData sąranka", "title": "WashData sąranka",
"description": "Sukonfigūruokite skalbimo mašiną ar kitą prietaisą.\n\nReikalingas galios jutiklis.\n\n**Toliau jūsų paklaus, ar norite susikurti pirmąjį profilį.**", "description": "Sukonfigūruokite skalbimo mašiną ar kitą prietaisą.\n\nReikalingas galios jutiklis.\n\nBaigę sąranką, atidarykite WashData skydelį iš šoninės juostos (arba eikite į [/ha-washdata](/ha-washdata)), kad peržiūrėtumėte ciklus, sureguliuotumėte aptikimą ir tvarkytumėte profilius.",
"data": { "data": {
"name": "Įrenginio pavadinimas", "name": "Įrenginio pavadinimas",
"device_type": "Įrenginio tipas", "device_type": "Įrenginio tipas",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "WashData rekonfigūracija", "title": "WashData rekonfigūracija",
"description": "Atnaujinkite įrenginio pavadinimą, prietaiso tipą arba galios jutiklį.", "description": "Atnaujinkite įrenginio pavadinimą, prietaiso tipą arba galios jutiklį.\n\nWashData skydelyje (šoninė juosta arba [/ha-washdata](/ha-washdata)) tvarkomas aptikimas, ciklai, profiliai ir pranešimai.",
"data": { "data": {
"name": "Įrenginio pavadinimas", "name": "Įrenginio pavadinimas",
"device_type": "Įrenginio tipas", "device_type": "Įrenginio tipas",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData nustatymai", "title": "WashData nustatymai",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Pervadinkite įrenginį arba pakeiskite pagrindinius aparatinės įrangos nustatymus. Visi aptikimo, atitikimo ir pranešimų nustatymai yra [WashData skydelyje](/ha-washdata) (taip pat pasiekiami iš šoninės juostos).",
"data": { "data": {
"name": "Įrenginio pavadinimas", "name": "Įrenginio pavadinimas",
"device_type": "Įrenginio tipas", "device_type": "Įrenginio tipas",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min. laikmatis", "timer_default_message": "{device}: {minutes} min. laikmatis",
"timer_pause_action_title": "Tęsti ciklą", "timer_pause_action_title": "Tęsti ciklą",
"timer_pause_body_suffix": "Ciklas pristabdytas. Atidarykite WashData skydelį, kad tęstumėte.", "timer_pause_body_suffix": "Ciklas pristabdytas. Atidarykite WashData skydelį, kad tęstumėte.",
"unload_dismiss_action_title": "Nustoti priminti",
"notify_live_waiting_message": "{device}: Kol kas neatpažintas joks profilis.", "notify_live_waiting_message": "{device}: Kol kas neatpažintas joks profilis.",
"vs_typical_longer": "{pct}% ilgiau nei įprastai", "vs_typical_longer": "{pct}% ilgiau nei įprastai",
"vs_typical_shorter": "{pct}% trumpiau nei įprastai", "vs_typical_shorter": "{pct}% trumpiau nei įprastai",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData iestatīšana", "title": "WashData iestatīšana",
"description": "Konfigurējiet veļas mašīnu vai citu ierīci.\n\nNepieciešams jaudas sensors.\n\n**Pēc tam jums tiks jautāts, vai vēlaties izveidot savu pirmo profilu.**", "description": "Konfigurējiet veļas mašīnu vai citu ierīci.\n\nNepieciešams jaudas sensors.\n\nPēc iestatīšanas atveriet WashData paneli no sānjoslas (vai dodieties uz [/ha-washdata](/ha-washdata)), lai skatītu ciklus, pielāgotu noteikšanu un pārvaldītu profilus.",
"data": { "data": {
"name": "Ierīces nosaukums", "name": "Ierīces nosaukums",
"device_type": "Ierīces veids", "device_type": "Ierīces veids",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "WashData pārkonfigurēšana", "title": "WashData pārkonfigurēšana",
"description": "Atjauniniet ierīces nosaukumu, ierīces veidu vai jaudas sensoru.", "description": "Atjauniniet ierīces nosaukumu, ierīces veidu vai jaudas sensoru.\n\nWashData panelī (sānjosla vai [/ha-washdata](/ha-washdata)) tiek pārvaldīta noteikšana, cikli, profili un paziņojumi.",
"data": { "data": {
"name": "Ierīces nosaukums", "name": "Ierīces nosaukums",
"device_type": "Ierīces veids", "device_type": "Ierīces veids",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData iestatījumi", "title": "WashData iestatījumi",
"description": "Visi iestatījumi -- noteikšana, saskaņošana, laiks, paziņojumi, profili un cikli -- ir pieejami WashData panelī. Izmantojiet šo veidlapu tikai, lai mainītu jaudas sensoru, ierīces veidu vai gaidstāves slieksni.", "description": "Pārdēvējiet ierīci vai mainiet tās galvenos aparatūras iestatījumus. Visi noteikšanas, saskaņošanas un paziņojumu iestatījumi atrodas [WashData panelī](/ha-washdata) (pieejams arī no sānjoslas).",
"data": { "data": {
"name": "Ierīces nosaukums", "name": "Ierīces nosaukums",
"device_type": "Ierīces veids", "device_type": "Ierīces veids",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min. taimeris", "timer_default_message": "{device}: {minutes} min. taimeris",
"timer_pause_action_title": "Atsākt ciklu", "timer_pause_action_title": "Atsākt ciklu",
"timer_pause_body_suffix": "Cikls ir apturēts. Atveriet WashData paneli, lai atsāktu.", "timer_pause_body_suffix": "Cikls ir apturēts. Atveriet WashData paneli, lai atsāktu.",
"unload_dismiss_action_title": "Pārtraukt atgādināšanu",
"notify_live_waiting_message": "{device}: Vēl nav atpazīts neviens profils.", "notify_live_waiting_message": "{device}: Vēl nav atpazīts neviens profils.",
"vs_typical_longer": "{pct}% ilgāk nekā parasti", "vs_typical_longer": "{pct}% ilgāk nekā parasti",
"vs_typical_shorter": "{pct}% īsāk nekā parasti", "vs_typical_shorter": "{pct}% īsāk nekā parasti",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Поставување податоци за перење", "title": "Поставување податоци за перење",
"description": "Конфигурирајте ја вашата машина за перење или друг уред.\n\nПотребен е сензор за напојување.\n\n**Следно, ќе бидете прашани дали сакате да го креирате вашиот прв профил.**", "description": "Конфигурирајте ја вашата машина за перење или друг уред.\n\nПотребен е сензор за напојување.\n\nПо поставувањето, отворете го панелот на WashData од страничната лента (или одете на [/ha-washdata](/ha-washdata)) за преглед на циклусите, подесување на откривањето и управување со профили.",
"data": { "data": {
"name": "Име на уред", "name": "Име на уред",
"device_type": "Тип на уред", "device_type": "Тип на уред",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Реконфигурирај WashData", "title": "Реконфигурирај WashData",
"description": "Ажурирајте го името на уредот, типот на апаратот или сензорот за напојување.", "description": "Ажурирајте го името на уредот, типот на апаратот или сензорот за напојување.\n\nПанелот на WashData (странична лента или [/ha-washdata](/ha-washdata)) е местото каде се управуваат откривањето, циклусите, профилите и известувањата.",
"data": { "data": {
"name": "Име на уред", "name": "Име на уред",
"device_type": "Тип на уред", "device_type": "Тип на уред",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "Сите поставки -- откривање, совпаѓање, време, известувања, профили и циклуси -- се достапни во панелот WashData. Користете го овој формулар само за да го промените сензорот за напојување, типот на уредот или прагот на подготвеност.", "description": "Преименувајте го уредот или сменете ги неговите основни хардверски поставки. Сите поставки за откривање, совпаѓање и известување се во [панелот на WashData](/ha-washdata) (достапен и од страничната лента).",
"data": { "data": {
"name": "Име на уред", "name": "Име на уред",
"device_type": "Тип на уред", "device_type": "Тип на уред",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: тајмер од {minutes} мин.", "timer_default_message": "{device}: тајмер од {minutes} мин.",
"timer_pause_action_title": "Продолжи со циклусот", "timer_pause_action_title": "Продолжи со циклусот",
"timer_pause_body_suffix": "Циклусот е паузиран. Отворете го WashData панелот за да продолжите.", "timer_pause_body_suffix": "Циклусот е паузиран. Отворете го WashData панелот за да продолжите.",
"unload_dismiss_action_title": "Престани да потсетуваш",
"notify_live_waiting_message": "{device}: Сè уште нема совпаднат профил.", "notify_live_waiting_message": "{device}: Сè уште нема совпаднат профил.",
"vs_typical_longer": "{pct}% подолго од вообичаено", "vs_typical_longer": "{pct}% подолго од вообичаено",
"vs_typical_shorter": "{pct}% пократко од вообичаено", "vs_typical_shorter": "{pct}% пократко од вообичаено",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData-oppsett", "title": "WashData-oppsett",
"description": "Konfigurer vaskemaskinen eller annet apparat.\n\nStrømsensor er nødvendig.\n\n**Deretter vil du bli spurt om du vil opprette din første profil.**", "description": "Konfigurer vaskemaskinen din eller et annet apparat.\n\nStrømsensor er nødvendig.\n\nEtter oppsett åpner du WashData-panelet fra sidefeltet (eller gå til [/ha-washdata](/ha-washdata)) for å se sykluser, justere registrering og administrere profiler.",
"data": { "data": {
"name": "Enhetsnavn", "name": "Enhetsnavn",
"device_type": "Enhetstype", "device_type": "Enhetstype",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Rekonfigurer WashData", "title": "Rekonfigurer WashData",
"description": "Oppdater enhetsnavnet, apparattype eller strømsensor.", "description": "Oppdater enhetsnavnet, apparattypen eller strømsensoren.\n\nWashData-panelet (sidefeltet eller [/ha-washdata](/ha-washdata)) er der registrering, sykluser, profiler og varsler administreres.",
"data": { "data": {
"name": "Enhetsnavn", "name": "Enhetsnavn",
"device_type": "Enhetstype", "device_type": "Enhetstype",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData-innstillinger", "title": "WashData-innstillinger",
"description": "Alle innstillinger -- deteksjon, samsvar, timing, varsler, profiler og sykluser -- er tilgjengelige i WashData-panelet. Bruk dette skjemaet kun til å endre strømsensoren, enhetstype eller standbyterskelen.", "description": "Gi enheten nytt navn eller endre de grunnleggende maskinvareinnstillingene. Alle innstillinger for registrering, matching og varsler finnes i [WashData-panelet](/ha-washdata) (også tilgjengelig fra sidefeltet).",
"data": { "data": {
"name": "Enhetsnavn", "name": "Enhetsnavn",
"device_type": "Enhetstype", "device_type": "Enhetstype",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} min. timer", "timer_default_message": "{device}: {minutes} min. timer",
"timer_pause_action_title": "Fortsett syklus", "timer_pause_action_title": "Fortsett syklus",
"timer_pause_body_suffix": "Syklusen er satt på pause. Åpne WashData-panelet for å fortsette.", "timer_pause_body_suffix": "Syklusen er satt på pause. Åpne WashData-panelet for å fortsette.",
"unload_dismiss_action_title": "Stopp påminnelser",
"notify_live_waiting_message": "{device}: Ingen profil gjenkjent ennå.", "notify_live_waiting_message": "{device}: Ingen profil gjenkjent ennå.",
"vs_typical_longer": "{pct}% lengre enn vanlig", "vs_typical_longer": "{pct}% lengre enn vanlig",
"vs_typical_shorter": "{pct}% kortere enn vanlig", "vs_typical_shorter": "{pct}% kortere enn vanlig",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData-instellingen", "title": "WashData-instellingen",
"description": "Configureer uw wasmachine of ander apparaat.\n\nVermogenssensor is vereist.\n\n**Vervolgens wordt u gevraagd of u uw eerste profiel wilt aanmaken.**", "description": "Configureer uw wasmachine of ander apparaat.\n\nVermogenssensor is vereist.\n\nNa de installatie opent u het WashData-paneel via de zijbalk (of ga naar [/ha-washdata](/ha-washdata)) om cycli te bekijken, detectie af te stellen en profielen te beheren.",
"data": { "data": {
"name": "Apparaatnaam", "name": "Apparaatnaam",
"device_type": "Apparaattype", "device_type": "Apparaattype",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "WashData opnieuw configureren", "title": "WashData opnieuw configureren",
"description": "Werk de apparaatnaam, het type apparaat of de vermogenssensor bij.", "description": "Werk de apparaatnaam, het type apparaat of de vermogenssensor bij.\n\nHet WashData-paneel (zijbalk of [/ha-washdata](/ha-washdata)) is waar detectie, cycli, profielen en meldingen worden beheerd.",
"data": { "data": {
"name": "Apparaatnaam", "name": "Apparaatnaam",
"device_type": "Apparaattype", "device_type": "Apparaattype",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData-instellingen", "title": "WashData-instellingen",
"description": "Alle instellingen -- detectie, overeenkomst, timing, meldingen, profielen en cycli -- zijn beschikbaar in het WashData-paneel. Gebruik dit formulier alleen om de vermogenssensor, het apparaattype of de standbydrempel te wijzigen.", "description": "Geef het apparaat een nieuwe naam of wijzig de basishardware-instellingen. Alle instellingen voor detectie, matching en meldingen bevinden zich in het [WashData-paneel](/ha-washdata) (ook bereikbaar via de zijbalk).",
"data": { "data": {
"name": "Apparaatnaam", "name": "Apparaatnaam",
"device_type": "Apparaattype", "device_type": "Apparaattype",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: timer van {minutes} min.", "timer_default_message": "{device}: timer van {minutes} min.",
"timer_pause_action_title": "Hervat cyclus", "timer_pause_action_title": "Hervat cyclus",
"timer_pause_body_suffix": "De cyclus is gepauzeerd. Open het WashData-paneel om te hervatten.", "timer_pause_body_suffix": "De cyclus is gepauzeerd. Open het WashData-paneel om te hervatten.",
"unload_dismiss_action_title": "Stop met herinneren",
"notify_live_waiting_message": "{device}: nog geen profiel herkend.", "notify_live_waiting_message": "{device}: nog geen profiel herkend.",
"vs_typical_longer": "{pct}% langer dan gebruikelijk", "vs_typical_longer": "{pct}% langer dan gebruikelijk",
"vs_typical_shorter": "{pct}% korter dan gebruikelijk", "vs_typical_shorter": "{pct}% korter dan gebruikelijk",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "мин",
"entity_not_found": "Обектът не е намерен",
"running_long": "Работи дълго",
"remaining": "остават",
"progress": "напредък",
"show_time_remaining": "Показване на оставащото време",
"show_percentage": "Показване на процент",
"layout": {
"tile": "Плочка (компактна)",
"detail": "Подробно (разширено)",
"glance": "Преглед (няколко устройства)"
},
"btn": {
"pause": "Пауза",
"resume": "Възобновяване",
"terminate": "Край на цикъла",
"record_start": "Стартиране на запис",
"record_stop": "Спиране на запис",
"program": "Програма",
"open_panel": "Отваряне на WashData"
},
"editor": {
"layout": "Оформление",
"entity": "Обект на уреда",
"entities": "Уреди",
"title": "Заглавие",
"icon": "Икона",
"show_state": "Показване на състоянието",
"show_program": "Показване на програмата",
"show_progress_bar": "Показване на лента за напредък",
"spin_icon": "Въртене на иконата по време на работа",
"display_mode": "Ред с подробности",
"active_color": "Замяна на активния цвят",
"show_phase": "Показване на фазата",
"show_energy": "Показване на енергия и разходи",
"show_anomaly": "Показване на предупреждение за превишаване",
"show_sparkline": "Показване на графика на мощността на живо",
"buttons": "Бутони за действие",
"program_entity": "Обект на програмата (замяна)",
"time_entity": "Обект на времето (замяна)",
"pct_entity": "Обект на напредъка (замяна)",
"power_entity": "Обект на мощността (замяна)",
"tap_action": "Действие при докосване",
"hold_action": "Действие при задържане",
"double_tap_action": "Действие при двойно докосване"
}
},
"badge": { "badge": {
"artifact_tip": "{n} открити аномалии (напр. отворена врата по средата на цикъла) – отворете, за да ги видите на графиката", "artifact_tip": "{n} открити аномалии (напр. отворена врата по средата на цикъла) – отворете, за да ги видите на графиката",
"auto": "(автоматично разпознато)", "auto": "(автоматично разпознато)",
@@ -64,6 +112,21 @@
"discard": "Изхвърлете", "discard": "Изхвърлете",
"discard_tip": "Изхвърли записаната следа без запазване", "discard_tip": "Изхвърли записаната следа без запазване",
"dismiss": "Отхвърляне", "dismiss": "Отхвърляне",
"mute_suggestion": "Спрете да предлагате тази настройка",
"pg_load_calibrated": "Зареди калибрирани (ML) ({n})",
"pg_load_calibrated_tip": "Зареди ML-калибрираните настройки като замени в тестовата среда",
"pg_load_live": "Зареди активните настройки",
"pg_load_live_tip": "Повторно прочитане на текущите настройки на интеграцията и отхвърляне на всички промени в тестовата среда",
"pg_load_suggested": "Зареди предложени ({n})",
"pg_load_suggested_tip": "Зареди текущите предложения на автоматичния настройчик като замени в тестовата среда",
"pg_preset_delete": "Изтриване на конфигурация",
"pg_preset_load": "Зареди конфигурация",
"pg_preset_load_tip": "Заменяне на стойностите в тестовата среда с тази конфигурация (активните настройки остават непроменени)",
"pg_preset_save": "Запазване като конфигурация",
"pg_preset_save_tip": "Запазване на всички стойности по-долу като именувана конфигурация за това устройство",
"pg_publish_all": "Приложи {n} към интеграцията",
"pg_publish_one": "Приложи {label} към интеграцията",
"reset_muted": "Нулиране на заглушените",
"done": "Готово", "done": "Готово",
"edit": "Редактиране", "edit": "Редактиране",
"export": "Експортиране", "export": "Експортиране",
@@ -275,6 +338,7 @@
"no_automations": "Все още няма автоматизации, които да споменават това устройство.", "no_automations": "Все още няма автоматизации, които да споменават това устройство.",
"panel_settings": "Настройки на панела", "panel_settings": "Настройки на панела",
"param_sweep": "Обхождане на параметър", "param_sweep": "Обхождане на параметър",
"pg_settings_source": "Източник на настройките",
"phase_catalog": "Фазов каталог", "phase_catalog": "Фазов каталог",
"playground": "Тестова среда", "playground": "Тестова среда",
"process_history": "История на процеса", "process_history": "История на процеса",
@@ -348,6 +412,7 @@
"default_access_level": "Ниво по подразбиране за потребители, които не са изброени по-долу", "default_access_level": "Ниво по подразбиране за потребители, които не са изброени по-долу",
"default_other": "По подразбиране (други устройства)", "default_other": "По подразбиране (други устройства)",
"default_tab": "Раздел по подразбиране при отваряне на панела", "default_tab": "Раздел по подразбиране при отваряне на панела",
"font_size": "Размер на шрифта на панела",
"delta": "Δ", "delta": "Δ",
"description": "Описание", "description": "Описание",
"dtw_blend_w": "Тегло на смесване", "dtw_blend_w": "Тегло на смесване",
@@ -415,6 +480,9 @@
"pg_match_score": "Оценка на съвпадение", "pg_match_score": "Оценка на съвпадение",
"pg_pct_of": "{p}% от {total}", "pg_pct_of": "{p}% от {total}",
"pg_poor_match": "Лошо съвпадение", "pg_poor_match": "Лошо съвпадение",
"pg_preset": "Конфигурация на тестовата среда",
"pg_preset_name": "Име на новата конфигурация",
"pg_preset_none": "Изберете конфигурация…",
"pg_strong_match": "Силно съвпадение", "pg_strong_match": "Силно съвпадение",
"pg_tile_ambiguous": "Двусмислени", "pg_tile_ambiguous": "Двусмислени",
"pg_tile_ambiguous_tip": "Цикли с почти равно съвпадение между две програми", "pg_tile_ambiguous_tip": "Цикли с почти равно съвпадение между две програми",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Прилагане на най-добрата стойност: {label} = {value}?", "pg_apply_confirm": "Прилагане на най-добрата стойност: {label} = {value}?",
"pg_canvas_empty": "Изберете цикъл по-горе, след което натиснете „Зареди“, за да видите неговата крива на мощността.", "pg_canvas_empty": "Изберете цикъл по-горе, след което натиснете „Зареди“, за да видите неговата крива на мощността.",
"pg_chart_caption": "Дял на откриване/съвпадение по стойности на {param}", "pg_chart_caption": "Дял на откриване/съвпадение по стойности на {param}",
"pg_ctrl_intro": "Стойностите тръгват от активните настройки на интеграцията за това устройство. Промените остават в тестовата среда, докато не ги приложите.",
"pg_live_unavailable": "Активните настройки не са налични, показани са стойностите по подразбиране.",
"pg_load_live_confirm": "Да се отхвърлят ли промените в тестовата среда ({n}) и да се заредят текущите настройки на интеграцията?",
"pg_match_rate": "{pct}% съвпадения върху {total} цикъла", "pg_match_rate": "{pct}% съвпадения върху {total} цикъла",
"pg_matches_live": "Съвпада с активните настройки",
"pg_n_changed": "Промени спрямо активните настройки: {n}",
"pg_sugg_none": "Всички предложения вече съответстват на текущите настройки",
"pg_preset_delete_confirm": "Да се изтрие ли конфигурацията „{name}“?",
"pg_preset_limit": "Достигнат е лимитът на конфигурации ({n})",
"pg_preset_overwrite": "Да се презапише ли конфигурацията „{name}“?",
"pg_publish_one_confirm": "Да се запази ли {label} = {value} в настройките на това устройство?",
"pg_restart_note": "Рестартирайте Home Assistant, за да активирате инструментите за симулация.", "pg_restart_note": "Рестартирайте Home Assistant, за да активирате инструментите за симулация.",
"pg_sim_progress": "{done} / {total} цикъла", "pg_sim_progress": "{done} / {total} цикъла",
"pg_starting": "Стартиране…", "pg_starting": "Стартиране…",
@@ -789,6 +867,7 @@
"preferences_admin": "Предпочитания, панел и контрол на достъпа", "preferences_admin": "Предпочитания, панел и контрол на достъпа",
"preferences_adv": "Предпочитания", "preferences_adv": "Предпочитания",
"prefs_personal": "Те се отнасят само за вашия акаунт в Home Assistant.", "prefs_personal": "Те се отнасят само за вашия акаунт в Home Assistant.",
"font_size_hint": "Направете всичко в този панел по-голямо или по-малко. Прилага се за вашия акаунт на това устройство.",
"process_history_hint": "Повторно стартирайте съпоставяне за всички съхранени цикли, обновете предложенията за настройка, обучете отново ML моделите (ако е активирано) и преизчислете качеството на цикъла. Стартирайте след пакетни прегледи.", "process_history_hint": "Повторно стартирайте съпоставяне за всички съхранени цикли, обновете предложенията за настройка, обучете отново ML моделите (ако е активирано) и преизчислете качеството на цикъла. Стартирайте след пакетни прегледи.",
"profile_deleted": "Профилът е изтрит", "profile_deleted": "Профилът е изтрит",
"profile_poor_health_detail": "Циклите, присвоени на този профил, имат непоследователни форми или ниска степен на доверие. Помислете за повторно изграждане на обвивката или преглед на циклите с етикети.", "profile_poor_health_detail": "Циклите, присвоени на този профил, имат непоследователни форми или ниска степен на доверие. Помислете за повторно изграждане на обвивката или преглед на циклите с етикети.",
@@ -821,6 +900,10 @@
"split_intro": "Щракнете върху графиката, за да добавите или премахнете точка на разделяне или автоматично откриване по неактивни празнини. Всеки получен сегмент може да получи свой собствен профил.", "split_intro": "Щракнете върху графиката, за да добавите или премахнете точка на разделяне или автоматично откриване по неактивни празнини. Всеки получен сегмент може да получи свой собствен профил.",
"storage_diagnostics": "Статистика за съхранение, поддръжка, експорт/импорт", "storage_diagnostics": "Статистика за съхранение, поддръжка, експорт/импорт",
"sug_staged": "Зададено {key} = {val}. Запазете, за да приложите.", "sug_staged": "Зададено {key} = {val}. Запазете, за да приложите.",
"sug_muted": "Тази настройка няма да се предлага повече",
"sug_mute_failed": "Настройката не можа да бъде заглушена",
"sug_unmuted_all": "Заглушените предложения са нулирани",
"n_suggestions_muted": "{count} заглушени; авто-настройката няма да предлага тези.",
"toast_auto_detect_enabled": "Автоматичното разпознаване е активирано", "toast_auto_detect_enabled": "Автоматичното разпознаване е активирано",
"toast_auto_label_complete": "Автоматичното етикетиране е завършено", "toast_auto_label_complete": "Автоматичното етикетиране е завършено",
"toast_auto_label_failed": "Автоматичното етикетиране е неуспешно: {error}", "toast_auto_label_failed": "Автоматичното етикетиране е неуспешно: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Продължителността се понижава ({pct}%/цикъл) – скорошно средно {avg}", "trend_duration_shorter": "Продължителността се понижава ({pct}%/цикъл) – скорошно средно {avg}",
"trend_energy_down": "Енергията намалява ({pct}%/цикъл)", "trend_energy_down": "Енергията намалява ({pct}%/цикъл)",
"trend_energy_up": "Тенденция към нарастване на енергията ({pct}%/цикъл) – скорошно средно {avg}", "trend_energy_up": "Тенденция към нарастване на енергията ({pct}%/цикъл) – скорошно средно {avg}",
"trim_destructive_confirm": "Това запазва само {pct}% от цикъла и не може да бъде отменено. Да се продължи ли?",
"trim_intro": "Плъзнете червените манипулатори или въведете стойности. Всичко извън прозореца се премахва.", "trim_intro": "Плъзнете червените манипулатори или въведете стойности. Всичко извън прозореца се премахва.",
"tuning_suggestions_available": "{count} предложение за настройка налично от наблюдавани цикли. Те се появяват до съответните полета.", "tuning_suggestions_available": "{count} предложение за настройка налично от наблюдавани цикли. Те се появяват до съответните полета.",
"unsure_detected_prefix": "WashData не е сигурен, че е открит", "unsure_detected_prefix": "WashData не е сигурен, че е открит",
@@ -970,6 +1054,10 @@
"unusable": "Неизползваем" "unusable": "Неизползваем"
}, },
"section": { "section": {
"dishwasher": {
"intro": "Обработка на края на цикъла за съдомиялни машини, които обикновено завършват с дълга фаза на сушене почти без консумация на енергия преди кратко финално източване.",
"label": "Съдомиялна машина"
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Режимът против бръчки/против набръчкване открива импулси на ниска мощност след основната фаза и ги прикрепя към завършения цикъл.", "intro": "Режимът против бръчки/против набръчкване открива импулси на ниска мощност след основната фаза и ги прикрепя към завършения цикъл.",
"label": "Против бръчки" "label": "Против бръчки"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"doc": "След като цикълът надхвърли очакваната си продължителност, колко дълго съдомиялната машина трябва да остане неактивна (под «Праг на спиране»), преди WashData да спре да чака финално източване и да завърши цикъла. Увеличете го, ако вашата машина има дълга тиха фаза на сушене преди късно финално източване, което се пропуска - по-широк прозорец позволява на научената продължителност да следва сезонните промени (по-студена входяща вода = по-дълги цикли), вместо да се фиксира към старата средна стойност. То само съкращава изчакването спрямо вътрешния 30-минутен лимит за изчакване на финалния пик (източване на вода), но никога не го удължава.",
"label": "Тихо завършване на пасивното сушене"
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Разпознайте кратките импулси на сушене с ниска мощност, които сушилнята излъчва след основната топлинна фаза, и ги запазете прикрепени към завършения цикъл, вместо да ги четете като нови цикли.", "doc": "Разпознайте кратките импулси на сушене с ниска мощност, които сушилнята излъчва след основната топлинна фаза, и ги запазете прикрепени към завършения цикъл, вместо да ги четете като нови цикли.",
"label": "Активиране на антибръчково засичане" "label": "Активиране на антибръчково засичане"
@@ -1232,6 +1324,10 @@
"doc": "Минути след края на цикъла преди изпращане на все още чакащото напомняне за „разтоварване на машината“. Задайте 0, за да деактивирате напомнянето.", "doc": "Минути след края на цикъла преди изпращане на все още чакащото напомняне за „разтоварване на машината“. Задайте 0, за да деактивирате напомнянето.",
"label": "Закъснение на напомнянето за разтоварване" "label": "Закъснение на напомнянето за разтоварване"
}, },
"notify_unload_repeat": {
"doc": "Продължава да изпраща напомнянето за разтоварване на всеки \"Закъснение на напомнянето за разтоварване\" минути, докато не отворите вратата или не докоснете \"Спри напомнянията\" в известието. Изисква Обект на сензор за врата (както и самото напомняне). Бутонът за отхвърляне работи в известията на мобилното приложение на Home Assistant (companion).",
"label": "Повтаряне до отваряне на вратата"
},
"off_delay": { "off_delay": {
"doc": "Време за изчакване след падане на захранването, преди да се обяви цикълът за завършен. Ако захранването се възобнови в рамките на този прозорец, цикълът продължава безпроблемно - това свързва паузите между етапите на пране. Съдомиялните машини имат дълги фази на сушене (изключени за 20-60 минути), така че времето за изключване трябва да надвишава това, за да поддържа цялото измиване+сушене като един цикъл.", "doc": "Време за изчакване след падане на захранването, преди да се обяви цикълът за завършен. Ако захранването се възобнови в рамките на този прозорец, цикълът продължава безпроблемно - това свързва паузите между етапите на пране. Съдомиялните машини имат дълги фази на сушене (изключени за 20-60 минути), така че времето за изключване трябва да надвишава това, за да поддържа цялото измиване+сушене като един цикъл.",
"label": "Закъснение при изключване" "label": "Закъснение при изключване"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Острота на енергия", "label": "Острота на енергия",
"doc": "Острота на санкцията за несъответствие на енергията в Етап 4. По-малко = по-строго: несъответствието на енергията снижава резултата повече. Стойността по подразбиране 0,25 е умишлено по-щедра от Остротата на продължителността, тъй като енергията варира с натоварването. Комбинирайте с Тежестта на енергията." "doc": "Острота на санкцията за несъответствие на енергията в Етап 4. По-малко = по-строго: несъответствието на енергията снижава резултата повече. Стойността по подразбиране 0,25 е умишлено по-щедра от Остротата на продължителността, тъй като енергията варира с натоварването. Комбинирайте с Тежестта на енергията."
},
"power_profile_interval_min": {
"label": "Интервал на профила на мощността",
"doc": "Размер на кофата за атрибута на сензора power_profile за всеки профил (плоски средни стойности в Вт за слот, използвани от външни планировчици като EMHASS и tibber_prices). По-малките кофи запазват кратките пикове на мощността остри; по-голямата кофа изглажда формата. По подразбиране 15 мин. Само за четене; не засяга откриването."
},
"notify_live_sticky": {
"label": "Запазване на живото известие при докосване",
"doc": "Само за Android. Направете известието за ход на живо постоянно (закачено), за да не го откажете при докосване. Изключено запазва поведението по подразбиране, при което докосването го откажва."
},
"notify_live_click_action": {
"label": "Цел при докосване на живото известие",
"doc": "Само за Android. Накъде отваря докосването на известието за ход на живо (напр. /lovelace/laundry или пълен URL адрес), вместо началната страница на приложението. Оставете празно за поведението по подразбиране."
},
"door_opens_at_end": {
"label": "Вратата се отваря автоматично в края",
"doc": "За съдомиялни, при които вратата се отваря в края на цикъла за сушене (AirDry и подобни). При включено, отварянето на вратата по време на работещ цикъл вече не го поставя на пауза завинаги; вместо това, ако вратата остане отворена за времето за изчакване по-долу, WashData третира цикъла като завършен. Краткото отваряне (добавяне на артикул) се игнорира. Изисква се обект на сензор за врата."
},
"door_end_dwell_seconds": {
"label": "Изчакване при отворена врата",
"doc": "Колко дълго трябва вратата да остане отворена, преди WashData да приключи цикъла, когато \"Вратата се отваря автоматично в края\" е включено. Достатъчно дълго, за да игнорира бързото добавяне на съд (по подразбиране 60 с), достатъчно кратко, за да приключи бързо, когато машината отвори вратата."
} }
}, },
"setting_group": { "setting_group": {
@@ -1576,6 +1692,10 @@
"name_required": "Изисква се име", "name_required": "Изисква се име",
"no_split_found": "Няма открити празни места, на които да се разцепи", "no_split_found": "Няма открити празни места, на които да се разцепи",
"panel_settings_saved": "Настройките на панела са запазени", "panel_settings_saved": "Настройките на панела са запазени",
"pg_preset_loaded": "Конфигурацията „{name}“ е заредена",
"pg_preset_saved": "Конфигурацията „{name}“ е запазена",
"pg_sugg_loaded": "Заредени {n} предложени стойности - стартирайте тестовата среда за сравнение",
"pg_sugg_ml_loaded": "Заредени {n} ML-калибрирани стойности - стартирайте тестовата среда за сравнение",
"phase_name_required": "Изисква се име на фаза", "phase_name_required": "Изисква се име на фаза",
"phase_updated": "Фазата е актуализирана", "phase_updated": "Фазата е актуализирана",
"phases_saved": "Фазите са запазени", "phases_saved": "Фазите са запазени",
@@ -1723,6 +1843,7 @@
"min_active": "Въз основа на минималната работна мощност ({min}W), наблюдавана в последния цикъл.", "min_active": "Въз основа на минималната работна мощност ({min}W), наблюдавана в последния цикъл.",
"min_duration_ratio": "Задържано възможно най-ниско, за да се разпознае програмата рано в цикъла; праговете на достоверност и нееднозначност предотвратяват преждевременни потвърждения.", "min_duration_ratio": "Задържано възможно най-ниско, за да се разпознае програмата рано в цикъла; праговете на достоверност и нееднозначност предотвратяват преждевременни потвърждения.",
"min_off_gap": "Въз основа на {gaps} наблюдавани интервала между циклите (p05={p05}s). Долна граница на уреда: {floor}s.", "min_off_gap": "Въз основа на {gaps} наблюдавани интервала между циклите (p05={p05}s). Долна граница на уреда: {floor}s.",
"min_off_gap_bridge": "Оразмерено да покрие най-дългия тих участък в рамките на цикъла: {span}s + 60s буфер, от {spans} покрити интервала за {cycles} чисти цикъла (остава под вашия най-кратък интервал между две последователни стартирания, който е {ceiling}s).",
"min_power": "40 % от най-ниската работна мощност p05 ({p05}W) за {cycles} чисти цикъла, за да остане прагът на изключване под реалната консумация.{excl}", "min_power": "40 % от най-ниската работна мощност p05 ({p05}W) за {cycles} чисти цикъла, за да остане прагът на изключване под реалната консумация.{excl}",
"ml_auto_label": "Най-ниската достоверност, която моделът за качество все още е оценил като чиста (p10 от {cycles} чисти цикъла = {p10}).", "ml_auto_label": "Най-ниската достоверност, която моделът за качество все още е оценил като чиста (p10 от {cycles} чисти цикъла = {p10}).",
"ml_end_repeat": "{false}/{total} цикъла ({pct}%) са имали пауза, оценена от детектора за край над 50 %; изисквай {val} потвърждение(я) за край.", "ml_end_repeat": "{false}/{total} цикъла ({pct}%) са имали пауза, оценена от детектора за край над 50 %; изисквай {val} потвърждение(я) за край.",
@@ -1739,7 +1860,7 @@
"thr_batch": "Задържано точно над най-ниската работна мощност p05 за {cycles} цикъла ({p05}W), за да се улови стартът възможно най-рано и прагът на спиране да остане под най-ниската работна мощност на машината.", "thr_batch": "Задържано точно над най-ниската работна мощност p05 за {cycles} цикъла ({p05}W), за да се улови стартът възможно най-рано и прагът на спиране да остане под най-ниската работна мощност на машината.",
"tol_per_profile": "p75 на дисперсията на продължителността по профил за {profiles} профила ({cycles} цикъла); стриктните профили не се санкционират.", "tol_per_profile": "p75 на дисперсията на продължителността по профил за {profiles} профила ({cycles} цикъла); стриктните профили не се санкционират.",
"tol_pooled": "Въз основа на обединената дисперсия на продължителността на {cycles} скорошни етикетирани цикъла (p95 отклонение={dev}).", "tol_pooled": "Въз основа на обединената дисперсия на продължителността на {cycles} скорошни етикетирани цикъла (p95 отклонение={dev}).",
"watchdog": "Задържано възможно най-ниско при запазена безопасност (3x интервала на обновяване p95 от {p95}s, мин. 30s), за да се улавят бързо блокиранията без фалшиви спирания." "watchdog": "Задържано възможно най-ниско при запазена безопасност (малко над интервала на обновяване p95 от {p95}s, мин. 30s), за да се улавят бързо блокиранията без фалшиви спирания."
}, },
"exclusions": { "exclusions": {
"summary": "Изключени са {total} грешно открити цикъла: {parts}.", "summary": "Изключени са {total} грешно открити цикъла: {parts}.",
@@ -1770,6 +1891,7 @@
"other": "Друго" "other": "Друго"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Съдомиялна машина: секунди неактивност след очакваната продължителност, преди да се освободи изчакването за източване в края на цикъла",
"completion_min_seconds": "Най-краткото изпълнение, което се счита за истински цикъл", "completion_min_seconds": "Най-краткото изпълнение, което се счита за истински цикъл",
"end_repeat_count": "Ниски отчитания поред преди приключване", "end_repeat_count": "Ниски отчитания поред преди приключване",
"interrupted_min_seconds": "Кратки цикли се отбелязват като прекъснати", "interrupted_min_seconds": "Кратки цикли се отбелязват като прекъснати",
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entita nenalezena",
"running_long": "Běží dlouho",
"remaining": "zbývá",
"progress": "postup",
"show_time_remaining": "Zobrazit zbývající čas",
"show_percentage": "Zobrazit procenta",
"layout": {
"tile": "Dlaždice (kompaktní)",
"detail": "Detail (podrobný)",
"glance": "Přehled (více zařízení)"
},
"btn": {
"pause": "Pozastavit",
"resume": "Pokračovat",
"terminate": "Ukončit cyklus",
"record_start": "Spustit záznam",
"record_stop": "Zastavit záznam",
"program": "Program",
"open_panel": "Otevřít WashData"
},
"editor": {
"layout": "Rozvržení",
"entity": "Entita spotřebiče",
"entities": "Spotřebiče",
"title": "Název",
"icon": "Ikona",
"show_state": "Zobrazit stav",
"show_program": "Zobrazit program",
"show_progress_bar": "Zobrazit ukazatel průběhu",
"spin_icon": "Otáčet ikonu během běhu",
"display_mode": "Řádek s detaily",
"active_color": "Přepsání aktivní barvy",
"show_phase": "Zobrazit fázi",
"show_energy": "Zobrazit energii a náklady",
"show_anomaly": "Zobrazit varování o překročení",
"show_sparkline": "Zobrazit živý graf výkonu",
"buttons": "Akční tlačítka",
"program_entity": "Entita programu (přepsání)",
"time_entity": "Entita času (přepsání)",
"pct_entity": "Entita postupu (přepsání)",
"power_entity": "Entita výkonu (přepsání)",
"tap_action": "Akce klepnutí",
"hold_action": "Akce podržení",
"double_tap_action": "Akce dvojitého klepnutí"
}
},
"badge": { "badge": {
"artifact_tip": "Zjištěno {n} anomálií (např. dveře otevřené uprostřed cyklu) otevřete, abyste je viděli na grafu", "artifact_tip": "Zjištěno {n} anomálií (např. dveře otevřené uprostřed cyklu) otevřete, abyste je viděli na grafu",
"auto": "(automaticky zjištěno)", "auto": "(automaticky zjištěno)",
@@ -64,6 +112,21 @@
"discard": "Vyřadit", "discard": "Vyřadit",
"discard_tip": "Vyřadit zaznamenaný průběh bez uložení", "discard_tip": "Vyřadit zaznamenaný průběh bez uložení",
"dismiss": "Propustit", "dismiss": "Propustit",
"mute_suggestion": "Přestat navrhovat toto nastavení",
"pg_load_calibrated": "Načíst kalibrované (ML) ({n})",
"pg_load_calibrated_tip": "Načíst nastavení kalibrovaná ML jako přepsání v testovacím prostředí",
"pg_load_live": "Načíst aktivní nastavení",
"pg_load_live_tip": "Znovu načíst aktuální nastavení integrace a zahodit všechny úpravy v testovacím prostředí",
"pg_load_suggested": "Načíst navrhované ({n})",
"pg_load_suggested_tip": "Načíst aktuální návrhy automatického ladění jako přepsání v testovacím prostředí",
"pg_preset_delete": "Smazat přednastavení",
"pg_preset_load": "Načíst přednastavení",
"pg_preset_load_tip": "Nahradit hodnoty v testovacím prostředí tímto přednastavením (aktivní nastavení zůstane beze změny)",
"pg_preset_save": "Uložit jako přednastavení",
"pg_preset_save_tip": "Uložit všechny hodnoty níže jako pojmenované přednastavení pro toto zařízení",
"pg_publish_all": "Uložit do integrace ({n})",
"pg_publish_one": "Uložit {label} do integrace",
"reset_muted": "Obnovit skryté",
"done": "Hotovo", "done": "Hotovo",
"edit": "Upravit", "edit": "Upravit",
"export": "Exportovat", "export": "Exportovat",
@@ -275,6 +338,7 @@
"no_automations": "Na toto zařízení zatím neodkazuje žádná automatizace.", "no_automations": "Na toto zařízení zatím neodkazuje žádná automatizace.",
"panel_settings": "Nastavení panelu", "panel_settings": "Nastavení panelu",
"param_sweep": "Prohledávání parametru", "param_sweep": "Prohledávání parametru",
"pg_settings_source": "Zdroj nastavení",
"phase_catalog": "Katalog fází", "phase_catalog": "Katalog fází",
"playground": "Testovací prostředí", "playground": "Testovací prostředí",
"process_history": "Historie procesu", "process_history": "Historie procesu",
@@ -348,6 +412,7 @@
"default_access_level": "Výchozí úroveň pro uživatele, kteří nejsou uvedeni níže", "default_access_level": "Výchozí úroveň pro uživatele, kteří nejsou uvedeni níže",
"default_other": "Výchozí (ostatní zařízení)", "default_other": "Výchozí (ostatní zařízení)",
"default_tab": "Výchozí karta při otevření panelu", "default_tab": "Výchozí karta při otevření panelu",
"font_size": "Velikost písma panelu",
"delta": "Δ", "delta": "Δ",
"description": "Popis", "description": "Popis",
"dtw_blend_w": "Váha směsi", "dtw_blend_w": "Váha směsi",
@@ -415,6 +480,9 @@
"pg_match_score": "Skóre shody", "pg_match_score": "Skóre shody",
"pg_pct_of": "{p}% z {total}", "pg_pct_of": "{p}% z {total}",
"pg_poor_match": "Špatná shoda", "pg_poor_match": "Špatná shoda",
"pg_preset": "Přednastavení testovacího prostředí",
"pg_preset_name": "Název nového přednastavení",
"pg_preset_none": "Vyberte přednastavení…",
"pg_strong_match": "Silná shoda", "pg_strong_match": "Silná shoda",
"pg_tile_ambiguous": "Nejednoznačné", "pg_tile_ambiguous": "Nejednoznačné",
"pg_tile_ambiguous_tip": "Cykly s téměř shodným výsledkem mezi dvěma programy", "pg_tile_ambiguous_tip": "Cykly s téměř shodným výsledkem mezi dvěma programy",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Použít nejlepší hodnotu: {label} = {value}?", "pg_apply_confirm": "Použít nejlepší hodnotu: {label} = {value}?",
"pg_canvas_empty": "Vyberte cyklus výše a poté stiskněte Načíst pro zobrazení jeho průběhu výkonu.", "pg_canvas_empty": "Vyberte cyklus výše a poté stiskněte Načíst pro zobrazení jeho průběhu výkonu.",
"pg_chart_caption": "Míra detekce/shody v závislosti na hodnotách {param}", "pg_chart_caption": "Míra detekce/shody v závislosti na hodnotách {param}",
"pg_ctrl_intro": "Hodnoty vycházejí z aktivního nastavení integrace pro toto zařízení. Úpravy zůstávají v testovacím prostředí, dokud je neuložíte do integrace.",
"pg_live_unavailable": "Aktivní nastavení není k dispozici, zobrazují se výchozí hodnoty.",
"pg_load_live_confirm": "Zahodit úpravy v testovacím prostředí ({n}) a znovu načíst aktuální nastavení integrace?",
"pg_match_rate": "{pct}% míra shody na {total} cyklech", "pg_match_rate": "{pct}% míra shody na {total} cyklech",
"pg_matches_live": "Odpovídá aktivnímu nastavení",
"pg_n_changed": "Změněno oproti aktivnímu nastavení: {n}",
"pg_sugg_none": "Všechny návrhy již odpovídají aktuálnímu nastavení",
"pg_preset_delete_confirm": "Smazat přednastavení \"{name}\"?",
"pg_preset_limit": "Dosažen limit přednastavení ({n})",
"pg_preset_overwrite": "Přepsat přednastavení \"{name}\"?",
"pg_publish_one_confirm": "Uložit {label} = {value} do nastavení tohoto zařízení?",
"pg_restart_note": "Restartujte Home Assistant, abyste povolili nástroje simulace.", "pg_restart_note": "Restartujte Home Assistant, abyste povolili nástroje simulace.",
"pg_sim_progress": "{done} / {total} cyklů", "pg_sim_progress": "{done} / {total} cyklů",
"pg_starting": "Spouštění…", "pg_starting": "Spouštění…",
@@ -789,6 +867,7 @@
"preferences_admin": "Předvolby, panel a řízení přístupu", "preferences_admin": "Předvolby, panel a řízení přístupu",
"preferences_adv": "Předvolby", "preferences_adv": "Předvolby",
"prefs_personal": "Platí pouze pro váš účet Home Assistant.", "prefs_personal": "Platí pouze pro váš účet Home Assistant.",
"font_size_hint": "Zvětšete nebo zmenšete vše v tomto panelu. Platí pro váš účet na tomto zařízení.",
"process_history_hint": "Znovu spustí párování na všech uložených cyklech, obnoví návrhy ladění, přetrénuje modely ML (je-li povoleno) a přepočítá zdraví cyklů. Spusťte po skupině revizí.", "process_history_hint": "Znovu spustí párování na všech uložených cyklech, obnoví návrhy ladění, přetrénuje modely ML (je-li povoleno) a přepočítá zdraví cyklů. Spusťte po skupině revizí.",
"profile_deleted": "Profil smazán", "profile_deleted": "Profil smazán",
"profile_poor_health_detail": "Cykly přiřazené k tomuto profilu mají nekonzistentní tvary nebo nízkou spolehlivost. Zvažte přestavbu obálky nebo revizi označených cyklů.", "profile_poor_health_detail": "Cykly přiřazené k tomuto profilu mají nekonzistentní tvary nebo nízkou spolehlivost. Zvažte přestavbu obálky nebo revizi označených cyklů.",
@@ -821,6 +900,10 @@
"split_intro": "Kliknutím na graf přidáte nebo odstraníte dělicí bod nebo automaticky rozpoznáte mezery v nečinnosti. Každý výsledný segment může získat svůj vlastní profil.", "split_intro": "Kliknutím na graf přidáte nebo odstraníte dělicí bod nebo automaticky rozpoznáte mezery v nečinnosti. Každý výsledný segment může získat svůj vlastní profil.",
"storage_diagnostics": "Statistiky úložiště, údržba, export/import", "storage_diagnostics": "Statistiky úložiště, údržba, export/import",
"sug_staged": "Nastaveno {key} = {val}. Uložte pro použití.", "sug_staged": "Nastaveno {key} = {val}. Uložte pro použití.",
"sug_muted": "Toto nastavení již nebude navrhováno",
"sug_mute_failed": "Skrytí návrhu se nezdařilo",
"sug_unmuted_all": "Skryté návrhy obnoveny",
"n_suggestions_muted": "{count} skrytých; automatický ladicí nástroj tato nastavení nebude navrhovat.",
"toast_auto_detect_enabled": "Automatické rozpoznávání povoleno", "toast_auto_detect_enabled": "Automatické rozpoznávání povoleno",
"toast_auto_label_complete": "Automatické označování dokončeno", "toast_auto_label_complete": "Automatické označování dokončeno",
"toast_auto_label_failed": "Automatické označování selhalo: {error}", "toast_auto_label_failed": "Automatické označování selhalo: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Trendy kratší ({pct} %/cyklus) poslední průměr {avg}", "trend_duration_shorter": "Trendy kratší ({pct} %/cyklus) poslední průměr {avg}",
"trend_energy_down": "Energetický trend klesá ({pct} %/cyklus)", "trend_energy_down": "Energetický trend klesá ({pct} %/cyklus)",
"trend_energy_up": "Trend energie stoupá ({pct} %/cyklus) poslední průměr {avg}", "trend_energy_up": "Trend energie stoupá ({pct} %/cyklus) poslední průměr {avg}",
"trim_destructive_confirm": "Tímto zůstane jen {pct}% cyklu a akci nelze vrátit zpět. Pokračovat?",
"trim_intro": "Přetáhněte červené úchyty nebo zadejte hodnoty. Vše mimo okno je odstraněno.", "trim_intro": "Přetáhněte červené úchyty nebo zadejte hodnoty. Vše mimo okno je odstraněno.",
"tuning_suggestions_available": "{count} návrh ladění dostupný z pozorovaných cyklů. Zobrazují se vedle příslušných polí.", "tuning_suggestions_available": "{count} návrh ladění dostupný z pozorovaných cyklů. Zobrazují se vedle příslušných polí.",
"unsure_detected_prefix": "WashData si není jistý, zda jej detekoval", "unsure_detected_prefix": "WashData si není jistý, zda jej detekoval",
@@ -970,6 +1054,10 @@
"unusable": "Nepoužitelný" "unusable": "Nepoužitelný"
}, },
"section": { "section": {
"dishwasher": {
"label": "Myčka nádobí",
"intro": "Zpracování konce cyklu u myček nádobí, které obvykle končí dlouhou téměř tichou fází sušení před krátkým závěrečným odčerpáním vody."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Režim ochrany před zmačkáním detekuje krátké pulzy nízkého výkonu po hlavní fázi a připojuje je k dokončenému cyklu.", "intro": "Režim ochrany před zmačkáním detekuje krátké pulzy nízkého výkonu po hlavní fázi a připojuje je k dokončenému cyklu.",
"label": "Ochrana před zmačkáním" "label": "Ochrana před zmačkáním"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Uvolnění po tiché fázi sušení",
"doc": "Jakmile cyklus překročí svou očekávanou dobu trvání, jak dlouho musí myčka zůstat v klidu (pod Prahem zastavení), než WashData přestane čekat na závěrečné odčerpání vody a ukončí cyklus. Zvyšte hodnotu, pokud má váš spotřebič dlouhou tichou fázi sušení před pozdním závěrečným odčerpáním, které uniká detekci - širší okno umožňuje, aby naučená doba trvání sledovala sezonní posun (studenější přiváděná voda = delší cykly) místo toho, aby zůstala uzamčená na starém průměru. Čekání pouze zkracuje vzhledem k internímu 30minutovému limitu čekání na závěrečné odčerpání, nikdy jej neprodlužuje."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Rozpoznejte krátké impulzy s nízkým příkonem, které sušič emituje po hlavní tepelné fázi, a udržte je připojené k dokončenému cyklu místo čtení jako nové cykly.", "doc": "Rozpoznejte krátké impulzy s nízkým příkonem, které sušič emituje po hlavní tepelné fázi, a udržte je připojené k dokončenému cyklu místo čtení jako nové cykly.",
"label": "Povolit detekci ochrany před zmačkáním" "label": "Povolit detekci ochrany před zmačkáním"
@@ -1232,6 +1324,10 @@
"doc": "Minuty po ukončení cyklu před odesláním stále čekající připomínky \"vyloučit stroj\". Nastavte 0 pro vypnutí připomínky.", "doc": "Minuty po ukončení cyklu před odesláním stále čekající připomínky \"vyloučit stroj\". Nastavte 0 pro vypnutí připomínky.",
"label": "Zpoždění připomínky vyložení" "label": "Zpoždění připomínky vyložení"
}, },
"notify_unload_repeat": {
"doc": "Znovu odesílá připomínku vyložení každých \"Zpoždění připomínky vyložení\" minut, dokud neotevřete dveře nebo v oznámení neklepnete na \"Přestat připomínat\". Vyžaduje Entitu senzoru dveří (stejně jako samotná připomínka). Tlačítko pro zrušení funguje u oznámení mobilní aplikace Home Assistant (companion app).",
"label": "Opakovat, dokud se neotevřou dveře"
},
"off_delay": { "off_delay": {
"doc": "Čas čekání po poklesu příkonu před vyhlášením ukončení cyklu. Pokud se příkon obnoví v tomto okně, cyklus plynule pokračuje to přemostí pauzy mezi fázemi praní. Myčky nádobí mají dlouhé fáze sušení (příkon vypnut po dobu 2060 minut), takže zpozdění vypnutí musí tuto dobu překročit, aby byl celkový cyklus mytí+sušení zachován jako jeden.", "doc": "Čas čekání po poklesu příkonu před vyhlášením ukončení cyklu. Pokud se příkon obnoví v tomto okně, cyklus plynule pokračuje to přemostí pauzy mezi fázemi praní. Myčky nádobí mají dlouhé fáze sušení (příkon vypnut po dobu 2060 minut), takže zpozdění vypnutí musí tuto dobu překročit, aby byl celkový cyklus mytí+sušení zachován jako jeden.",
"label": "Zpoždění vypnutí" "label": "Zpoždění vypnutí"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Ostrost energie", "label": "Ostrost energie",
"doc": "Ostrost penalizace za neshodu energie ve Fázi 4. Menší = přísnější: neshoda energie více snižuje skóre. Výchozí hodnota 0,25 je záměrně benevolentnější než Ostrost délky trvání, protože energie se liší podle zátěže. Kombinujte s Váhou energie." "doc": "Ostrost penalizace za neshodu energie ve Fázi 4. Menší = přísnější: neshoda energie více snižuje skóre. Výchozí hodnota 0,25 je záměrně benevolentnější než Ostrost délky trvání, protože energie se liší podle zátěže. Kombinujte s Váhou energie."
},
"power_profile_interval_min": {
"label": "Interval výkonového profilu",
"doc": "Velikost segmentu pro atribut senzoru power_profile pro daný profil (plochá sada průměrných wattů za slot spotřebovaná externími plánovači jako EMHASS a tibber_prices). Menší segmenty zachovávají krátké výkonové špičky ostré; větší segmenty vyhlazují tvar. Výchozí 15 min. Pouze při načítání; neovlivňuje detekci."
},
"notify_live_sticky": {
"label": "Zachovat živé oznámení po klepnutí",
"doc": "Pouze Android. Živé oznámení průběhu nastavte jako trvalé (přilepené), aby jeho klepnutím nedošlo k zavření průběžného vlákna. Vypnuto zachovává výchozí chování, kdy klepnutí oznámení zavře."
},
"notify_live_click_action": {
"label": "Cíl klepnutí na živé oznámení",
"doc": "Pouze Android. Kam klepnutí na živé oznámení průběhu otevře (např. /lovelace/laundry nebo celá URL) namísto vstupní stránky aplikace. Ponechte prázdné pro výchozí nastavení."
},
"door_opens_at_end": {
"label": "Dveře se na konci automaticky otevřou",
"doc": "Pro myčky nádobí, které na konci cyklu otevřou dveře za účelem sušení (AirDry a podobné). Při zapnuté funkci otevření dveří za běhu cyklu již nezastaví cyklus natrvalo; pokud dveře zůstanou otevřené po dobu čekání níže, WashData cyklus ukončí. Krátké otevření (přidání předmětu) je ignorováno. Vyžaduje entitu senzoru dveří."
},
"door_end_dwell_seconds": {
"label": "Čekání na otevření dveří pro ukončení",
"doc": "Jak dlouho musí dveře zůstat otevřené, než WashData ukončí cyklus, pokud je zapnuta funkce \"Dveře se na konci automaticky otevřou\". Dostatečně dlouhé k ignorování rychlého přidání nádobí (výchozí 60 s), dostatečně krátké pro rychlé ukončení po otevření dveří spotřebičem."
} }
}, },
"setting_group": { "setting_group": {
@@ -1592,6 +1708,7 @@
"min_active": "Na základě minimálního činného výkonu ({min}W) zaznamenaného v posledním cyklu.", "min_active": "Na základě minimálního činného výkonu ({min}W) zaznamenaného v posledním cyklu.",
"min_duration_ratio": "Ponecháno co nejnižší, aby byl program rozpoznán brzy v cyklu; prahy jistoty a nejednoznačnosti brání předčasnému potvrzení.", "min_duration_ratio": "Ponecháno co nejnižší, aby byl program rozpoznán brzy v cyklu; prahy jistoty a nejednoznačnosti brání předčasnému potvrzení.",
"min_off_gap": "Na základě {gaps} pozorovaných mezer mezi cykly (p05={p05}s). Minimum zařízení: {floor}s.", "min_off_gap": "Na základě {gaps} pozorovaných mezer mezi cykly (p05={p05}s). Minimum zařízení: {floor}s.",
"min_off_gap_bridge": "Nastaveno tak, aby překlenulo nejdelší tichý úsek uvnitř cyklu: {span}s + rezerva 60s, z {spans} překlenutých mezer napříč {cycles} čistými cykly (zůstává pod {ceiling}s, nejkratší mezerou, kterou necháváte mezi dvěma dávkami).",
"min_power": "40% nejnižšího činného výkonu p05 ({p05}W) napříč {cycles} čistými cykly, aby práh vypnutí zůstal pod skutečným odběrem.{excl}", "min_power": "40% nejnižšího činného výkonu p05 ({p05}W) napříč {cycles} čistými cykly, aby práh vypnutí zůstal pod skutečným odběrem.{excl}",
"ml_auto_label": "Nejnižší jistota, při které model kvality stále hodnotil cyklus jako čistý (p10 z {cycles} čistých cyklů = {p10}).", "ml_auto_label": "Nejnižší jistota, při které model kvality stále hodnotil cyklus jako čistý (p10 z {cycles} čistých cyklů = {p10}).",
"ml_end_repeat": "{false}/{total} cyklů ({pct}%) mělo pauzu, kterou detektor konce ohodnotil nad 50%; vyžadovat {val} potvrzení konce.", "ml_end_repeat": "{false}/{total} cyklů ({pct}%) mělo pauzu, kterou detektor konce ohodnotil nad 50%; vyžadovat {val} potvrzení konce.",
@@ -1608,7 +1725,7 @@
"thr_batch": "Ponecháno těsně nad nejnižším činným výkonem p05 napříč {cycles} cykly ({p05}W), aby byl start zachycen co nejdříve a práh zastavení zůstal pod nejnižším provozním výkonem stroje.", "thr_batch": "Ponecháno těsně nad nejnižším činným výkonem p05 napříč {cycles} cykly ({p05}W), aby byl start zachycen co nejdříve a práh zastavení zůstal pod nejnižším provozním výkonem stroje.",
"tol_per_profile": "p75 rozptylu délky podle profilu napříč {profiles} profily ({cycles} cyklů); konzistentní profily nejsou penalizovány.", "tol_per_profile": "p75 rozptylu délky podle profilu napříč {profiles} profily ({cycles} cyklů); konzistentní profily nejsou penalizovány.",
"tol_pooled": "Na základě sloučeného rozptylu délky {cycles} nedávných označených cyklů (odchylka p95={dev}).", "tol_pooled": "Na základě sloučeného rozptylu délky {cycles} nedávných označených cyklů (odchylka p95={dev}).",
"watchdog": "Ponecháno co nejnižší při zachování bezpečnosti (3x interval aktualizace p95 ve výši {p95}s, min. 30s), aby byla zaseknutí rychle odhalena bez falešných zastavení." "watchdog": "Ponecháno co nejnižší při zachování bezpečnosti (těsně nad intervalem aktualizace p95 ve výši {p95}s, min. 30s), aby byla zaseknutí rychle odhalena bez falešných zastavení."
}, },
"exclusions": { "exclusions": {
"summary": "Vyloučeno {total} chybně detekovaných cyklů: {parts}.", "summary": "Vyloučeno {total} chybně detekovaných cyklů: {parts}.",
@@ -1688,6 +1805,10 @@
"name_required": "Jméno je povinné", "name_required": "Jméno je povinné",
"no_split_found": "Nebyly nalezeny žádné volné mezery, které by se daly rozdělit", "no_split_found": "Nebyly nalezeny žádné volné mezery, které by se daly rozdělit",
"panel_settings_saved": "Nastavení panelu uloženo", "panel_settings_saved": "Nastavení panelu uloženo",
"pg_preset_loaded": "Přednastavení \"{name}\" načteno",
"pg_preset_saved": "Přednastavení \"{name}\" uloženo",
"pg_sugg_loaded": "Načteno {n} navrhovaných hodnot - spusťte testovací prostředí pro porovnání",
"pg_sugg_ml_loaded": "Načteno {n} hodnot kalibrovaných ML - spusťte testovací prostředí pro porovnání",
"phase_name_required": "Název fáze je povinný", "phase_name_required": "Název fáze je povinný",
"phase_updated": "Fáze aktualizována", "phase_updated": "Fáze aktualizována",
"phases_saved": "Fáze uloženy", "phases_saved": "Fáze uloženy",
@@ -1770,6 +1891,7 @@
"other": "Jiné" "other": "Jiné"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Myčka: tiché sekundy po očekávané době trvání, než se uvolní čekání na závěrečné odčerpání vody",
"anti_wrinkle_enabled": "Pohltit impulzy bubnu po hlavní fázi místo čtení jako nové cykly", "anti_wrinkle_enabled": "Pohltit impulzy bubnu po hlavní fázi místo čtení jako nové cykly",
"anti_wrinkle_exit_power": "Výkon musí mezi impulzy klesnout pod tuto hodnotu, aby ochrana před zmačkáním zůstala aktivní", "anti_wrinkle_exit_power": "Výkon musí mezi impulzy klesnout pod tuto hodnotu, aby ochrana před zmačkáním zůstala aktivní",
"anti_wrinkle_idle_timeout": "Povolený klid mezi dvěma impulzy bubnu, než ochrana před zmačkáním skončí", "anti_wrinkle_idle_timeout": "Povolený klid mezi dvěma impulzy bubnu, než ochrana před zmačkáním skončí",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entitet ikke fundet",
"running_long": "Kører længere",
"remaining": "tilbage",
"progress": "fremgang",
"show_time_remaining": "Vis resterende tid",
"show_percentage": "Vis procent",
"layout": {
"tile": "Felt (kompakt)",
"detail": "Detalje (detaljeret)",
"glance": "Overblik (flere enheder)"
},
"btn": {
"pause": "Pause",
"resume": "Genoptag",
"terminate": "Afslut cyklus",
"record_start": "Start optagelse",
"record_stop": "Stop optagelse",
"program": "Program",
"open_panel": "Åbn WashData"
},
"editor": {
"layout": "Layout",
"entity": "Apparatentitet",
"entities": "Apparater",
"title": "Titel",
"icon": "Ikon",
"show_state": "Vis tilstand",
"show_program": "Vis program",
"show_progress_bar": "Vis fremgangslinje",
"spin_icon": "Roter ikon under kørsel",
"display_mode": "Detaljelinje",
"active_color": "Tilsidesæt aktiv farve",
"show_phase": "Vis fase",
"show_energy": "Vis energi og omkostninger",
"show_anomaly": "Vis advarsel om lang kørsel",
"show_sparkline": "Vis live effektgraf",
"buttons": "Handlingsknapper",
"program_entity": "Programentitet (tilsidesæt)",
"time_entity": "Tidsentitet (tilsidesæt)",
"pct_entity": "Fremgangsentitet (tilsidesæt)",
"power_entity": "Effektentitet (tilsidesæt)",
"tap_action": "Tryk-handling",
"hold_action": "Hold-handling",
"double_tap_action": "Dobbelttryk-handling"
}
},
"badge": { "badge": {
"artifact_tip": "{n} registrerede anomalier (f.eks. dør åbnet midt i cyklus) åben for at se dem på grafen", "artifact_tip": "{n} registrerede anomalier (f.eks. dør åbnet midt i cyklus) åben for at se dem på grafen",
"auto": "(auto-detekteret)", "auto": "(auto-detekteret)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Sæt den kørende cyklus på pause apparatet genoptager, hvor det slap", "pause_cycle_tip": "Sæt den kørende cyklus på pause apparatet genoptager, hvor det slap",
"pg_apply_device": "Anvend på enhed", "pg_apply_device": "Anvend på enhed",
"pg_autofill": "Autoudfyld", "pg_autofill": "Autoudfyld",
"pg_load_calibrated": "Indlæs kalibrerede (ML) ({n})",
"pg_load_calibrated_tip": "Indlæser ML-kalibrerede indstillinger som legeplads-tilsidesættelser",
"pg_load_live": "Indlæs aktive indstillinger",
"pg_load_live_tip": "Genindlæs integrationens aktuelle indstillinger, og kassér alle ændringer i legepladsen",
"pg_load_suggested": "Indlæs forslag ({n})",
"pg_load_suggested_tip": "Indlæser auto-tunerens aktuelle forslag som legeplads-tilsidesættelser",
"pg_preset_delete": "Slet forudindstilling",
"pg_preset_load": "Indlæs forudindstilling",
"pg_preset_load_tip": "Erstat værdierne i legepladsen med denne forudindstilling (de aktive indstillinger røres ikke)",
"pg_preset_save": "Gem som forudindstilling",
"pg_preset_save_tip": "Gem alle værdier nedenfor som en navngiven forudindstilling for denne enhed",
"pg_publish_all": "Gem {n} i integrationen",
"pg_publish_one": "Gem {label} i integrationen",
"play": "Afspil", "play": "Afspil",
"process": "Behandl", "process": "Behandl",
"process_history": "Behandl nu", "process_history": "Behandl nu",
@@ -178,7 +239,9 @@
"download_export": "Download eksport", "download_export": "Download eksport",
"analyze_import": "Analysér fil", "analyze_import": "Analysér fil",
"import_selected": "Importér valgte", "import_selected": "Importér valgte",
"back": "Tilbage" "back": "Tilbage",
"mute_suggestion": "Stop med at foreslå denne indstilling",
"reset_muted": "Nulstil undertrykte forslag"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +338,7 @@
"no_automations": "Ingen automatiseringer refererer til denne enhed endnu.", "no_automations": "Ingen automatiseringer refererer til denne enhed endnu.",
"panel_settings": "Panelindstillinger", "panel_settings": "Panelindstillinger",
"param_sweep": "Parametersweep", "param_sweep": "Parametersweep",
"pg_settings_source": "Indstillingernes kilde",
"phase_catalog": "Fasekatalog", "phase_catalog": "Fasekatalog",
"playground": "Legeplads", "playground": "Legeplads",
"process_history": "Proceshistorie", "process_history": "Proceshistorie",
@@ -410,6 +474,9 @@
"pg_group_detection": "Registreringsudløsere", "pg_group_detection": "Registreringsudløsere",
"pg_group_timing": "Tidsregler", "pg_group_timing": "Tidsregler",
"pg_idle": "Inaktiv", "pg_idle": "Inaktiv",
"pg_preset": "Forudindstilling til legepladsen",
"pg_preset_name": "Navn på ny forudindstilling",
"pg_preset_none": "Vælg en forudindstilling…",
"pg_stress_group": "Test af inaktiv afslutning", "pg_stress_group": "Test af inaktiv afslutning",
"pg_stress_idle_auto": "Auto", "pg_stress_idle_auto": "Auto",
"pg_stress_idle_w": "Inaktivt niveau (W)", "pg_stress_idle_w": "Inaktivt niveau (W)",
@@ -609,7 +676,8 @@
"conflict_import_copy": "Importér som kopi", "conflict_import_copy": "Importér som kopi",
"conflict_keep_mine": "Behold mine", "conflict_keep_mine": "Behold mine",
"conflict_overwrite": "Overskriv", "conflict_overwrite": "Overskriv",
"pg_anti_wrinkle": "Anti-rynke" "pg_anti_wrinkle": "Anti-rynke",
"font_size": "Panel-skriftstørrelse"
}, },
"log": { "log": {
"all_levels": "Alle niveauer", "all_levels": "Alle niveauer",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Anvend bedste værdi: {label} = {value}?", "pg_apply_confirm": "Anvend bedste værdi: {label} = {value}?",
"pg_canvas_empty": "Vælg en cyklus ovenfor, og tryk derefter på Indlæs for at se dens effektkurve.", "pg_canvas_empty": "Vælg en cyklus ovenfor, og tryk derefter på Indlæs for at se dens effektkurve.",
"pg_chart_caption": "Registrerings-/matchrate på tværs af værdier for {param}", "pg_chart_caption": "Registrerings-/matchrate på tværs af værdier for {param}",
"pg_ctrl_intro": "Værdierne tager udgangspunkt i denne enheds aktive indstillinger i integrationen. Ændringer bliver i legepladsen, indtil du gemmer dem i integrationen.",
"pg_live_unavailable": "Aktive indstillinger er ikke tilgængelige, viser standardværdier.",
"pg_load_live_confirm": "Kassér {n} ændring(er) i legepladsen, og genindlæs integrationens aktuelle indstillinger?",
"pg_match_rate": "{pct}% matchrate på {total} cyklusser", "pg_match_rate": "{pct}% matchrate på {total} cyklusser",
"pg_matches_live": "Svarer til de aktive indstillinger",
"pg_n_changed": "{n} ændret i forhold til de aktive indstillinger",
"pg_sugg_none": "Alle forslag stemmer allerede overens med de aktive indstillinger",
"pg_preset_delete_confirm": "Slet forudindstillingen \"{name}\"?",
"pg_preset_limit": "Grænsen for forudindstillinger er nået ({n})",
"pg_preset_overwrite": "Overskriv forudindstillingen \"{name}\"?",
"pg_publish_one_confirm": "Gem {label} = {value} i denne enheds indstillinger?",
"pg_restart_note": "Genstart Home Assistant for at aktivere simuleringsværktøjerne.", "pg_restart_note": "Genstart Home Assistant for at aktivere simuleringsværktøjerne.",
"pg_sim_progress": "{done} / {total} cyklusser", "pg_sim_progress": "{done} / {total} cyklusser",
"pg_starting": "Starter…", "pg_starting": "Starter…",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Varighed, der trender kortere ({pct}%/cyklus) seneste gennemsnit {avg}", "trend_duration_shorter": "Varighed, der trender kortere ({pct}%/cyklus) seneste gennemsnit {avg}",
"trend_energy_down": "Energi på vej ned ({pct} %/cyklus)", "trend_energy_down": "Energi på vej ned ({pct} %/cyklus)",
"trend_energy_up": "Energitrends op ({pct} %/cyklus) seneste gennemsnit {avg}", "trend_energy_up": "Energitrends op ({pct} %/cyklus) seneste gennemsnit {avg}",
"trim_destructive_confirm": "Dermed bevares kun {pct}% af cyklussen. Dette kan ikke fortrydes. Fortsæt?",
"trim_intro": "Træk i de røde håndtag, eller indtast værdier. Alt uden for vinduet fjernes.", "trim_intro": "Træk i de røde håndtag, eller indtast værdier. Alt uden for vinduet fjernes.",
"tuning_suggestions_available": "{count} indstillingsforslag tilgængeligt fra observerede cyklusser. De vises ved siden af de relevante felter.", "tuning_suggestions_available": "{count} indstillingsforslag tilgængeligt fra observerede cyklusser. De vises ved siden af de relevante felter.",
"unsure_detected_prefix": "WashData er usikker på, om det er registreret", "unsure_detected_prefix": "WashData er usikker på, om det er registreret",
@@ -922,9 +1001,15 @@
"merge_hint": "Importerede elementer tilføjes; intet lokalt går tabt. Navnekonflikter løses nedenfor.", "merge_hint": "Importerede elementer tilføjes; intet lokalt går tabt. Navnekonflikter løses nedenfor.",
"replace_warn": "Hver markeret kategori slettes og erstattes fra filen. Ikke-markerede kategorier forbliver uændrede.", "replace_warn": "Hver markeret kategori slettes og erstattes fra filen. Ikke-markerede kategorier forbliver uændrede.",
"dest_reference_hint": "Importerede cyklusser forbedrer kun programgenkendelse og påvirker aldrig forbrugs-/energistatistik.", "dest_reference_hint": "Importerede cyklusser forbedrer kun programgenkendelse og påvirker aldrig forbrugs-/energistatistik.",
"dest_real_history_hint": "Importerede cyklusser tæller som dette apparats egen historik og indgår i energi-/forbrugsstatistik. Brug dette til at flytte ét apparat til en ny installation." "dest_real_history_hint": "Importerede cyklusser tæller som dette apparats egen historik og indgår i energi-/forbrugsstatistik. Brug dette til at flytte ét apparat til en ny installation.",
"sug_muted": "Vil ikke foreslå denne indstilling igen",
"sug_mute_failed": "Kunne ikke undertrykke forslaget",
"sug_unmuted_all": "Undertrykte forslag nulstillet",
"n_suggestions_muted": "{count} undertrykt; autotuner vil ikke foreslå disse.",
"font_size_hint": "Gør alt i dette panel større eller mindre. Gælder for din konto på denne enhed."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Opvaskemaskine: stille sekunder efter den forventede varighed, før ventetiden på udpumpning ved cyklusslut frigives",
"completion_min_seconds": "Korteste kørsel, der tæller som en rigtig cyklus", "completion_min_seconds": "Korteste kørsel, der tæller som en rigtig cyklus",
"end_repeat_count": "Lave målinger i træk før afslutning", "end_repeat_count": "Lave målinger i træk før afslutning",
"interrupted_min_seconds": "Korte cyklusser markeres som afbrudt", "interrupted_min_seconds": "Korte cyklusser markeres som afbrudt",
@@ -998,6 +1083,10 @@
"unusable": "Ubrugelig" "unusable": "Ubrugelig"
}, },
"section": { "section": {
"dishwasher": {
"label": "Opvaskemaskine",
"intro": "Håndtering af cyklusafslutning for opvaskemaskiner, der typisk slutter med en lang, næsten lydløs tørrefase før en kort sidste udpumpning."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Anti-rynke-tilstand registrerer tumble-pulser med lav effekt efter den vigtigste fase og holder dem tilknyttet den afsluttede cyklus.", "intro": "Anti-rynke-tilstand registrerer tumble-pulser med lav effekt efter den vigtigste fase og holder dem tilknyttet den afsluttede cyklus.",
"label": "Anti-rynke" "label": "Anti-rynke"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Frigivelse efter stille tørrefase",
"doc": "Når cyklussen overskrider sin forventede varighed: hvor længe opvaskemaskinen skal forblive stille (under Stoptærskel), før WashData holder op med at vente på en sidste udpumpning og afslutter cyklussen. Hæv den, hvis din maskine har en lang stille tørrefase før en sen sidste udpumpning, der bliver overset - et bredere vindue lader den indlærte varighed følge sæsonudsving (koldere indløbsvand = længere cyklusser) i stedet for at låse sig til det gamle gennemsnit. Den forkorter kun ventetiden i forhold til den interne grænse på 30 minutter for slutspidsen, aldrig forlænger den."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Genkend de korte tørretumblerimpulser med lav effekt, som en tørretumbler udsender efter hovedvarmefasen, og hold dem fastgjort til den færdige cyklus i stedet for at læse dem som nye cyklusser.", "doc": "Genkend de korte tørretumblerimpulser med lav effekt, som en tørretumbler udsender efter hovedvarmefasen, og hold dem fastgjort til den færdige cyklus i stedet for at læse dem som nye cyklusser.",
"label": "Aktivér anti-rynke registrering" "label": "Aktivér anti-rynke registrering"
@@ -1260,6 +1353,10 @@
"doc": "Minutter efter en cyklus er afsluttet, før du sender den stadig ventende påmindelse om \"aflæs maskinen\". Indstil 0 for at deaktivere påmindelsen.", "doc": "Minutter efter en cyklus er afsluttet, før du sender den stadig ventende påmindelse om \"aflæs maskinen\". Indstil 0 for at deaktivere påmindelsen.",
"label": "Forsinkelse for aflæsningspåmindelse" "label": "Forsinkelse for aflæsningspåmindelse"
}, },
"notify_unload_repeat": {
"doc": "Bliv ved med at gensende aflæsningspåmindelsen hvert \"Forsinkelse for aflæsningspåmindelse\" minutter, indtil du åbner døren eller trykker på \"Stop påmindelser\" i notifikationen. Kræver en Dørsensorenhed (det gør selve påmindelsen). Knappen til at afvise virker på notifikationer fra Home Assistant companion-appen (mobil).",
"label": "Gentag indtil døren åbnes"
},
"off_delay": { "off_delay": {
"doc": "Tid til at vente efter strømfald, før cyklussen erklæres afsluttet. Hvis strømmen genoptages inden for dette vindue, fortsætter cyklussen problemfrit - dette slår bro mellem pauser mellem vasketrinene. Opvaskemaskiner har lange tørrefaser (strøm fra i 20-60 min), så slukningsforsinkelsen skal overstige det for at holde hele vask+tør som én cyklus.", "doc": "Tid til at vente efter strømfald, før cyklussen erklæres afsluttet. Hvis strømmen genoptages inden for dette vindue, fortsætter cyklussen problemfrit - dette slår bro mellem pauser mellem vasketrinene. Opvaskemaskiner har lange tørrefaser (strøm fra i 20-60 min), så slukningsforsinkelsen skal overstige det for at holde hele vask+tør som én cyklus.",
"label": "Slukkeforsinkelse" "label": "Slukkeforsinkelse"
@@ -1434,6 +1531,26 @@
"energy_scale": { "energy_scale": {
"label": "Energiskarphed", "label": "Energiskarphed",
"doc": "Skarphed i Trin 4's straf for energioverensstemmelse. Lavere = strengere: et energiafvigelse skader mere. Standard 0,25 er bevidst mere tillåtende end varighedsskarphed fordi energi varierer med belastning. Par med Energivægt." "doc": "Skarphed i Trin 4's straf for energioverensstemmelse. Lavere = strengere: et energiafvigelse skader mere. Standard 0,25 er bevidst mere tillåtende end varighedsskarphed fordi energi varierer med belastning. Par med Energivægt."
},
"power_profile_interval_min": {
"label": "Effektprofil-interval",
"doc": "Bucket-størrelse for effektprofilsensorens attribut power_profile (det flade array af gennemsnitlige watt-værdier pr. slot, der bruges af eksterne planlæggere som EMHASS og tibber_prices). Mindre buckets holder korte effektspidser skarpe; større buckets glatter kurven. Standard 15 min. Kun til visning; påvirker ikke detektering."
},
"notify_live_sticky": {
"label": "Behold live-notifikation ved tryk",
"doc": "Kun Android. Gør live-forløbsnotifikationen vedvarende (sticky), så et tryk ikke afviser den. Slukket: standardadfærd, hvor et tryk afviser notifikationen."
},
"notify_live_click_action": {
"label": "Trykdestination for live-notifikation",
"doc": "Kun Android. Hvor et tryk på live-forløbsnotifikationen åbner (f.eks. /lovelace/laundry eller en fuld URL) i stedet for app-startsiden. Lad stå blank for standard."
},
"door_opens_at_end": {
"label": "Dør åbner automatisk ved afslutning",
"doc": "Til opvaskemaskiner, der springer døren op ved afslutningen af cyklussen for at tørre (AirDry og lignende). Når dette er aktiveret, sætter en døråbning under en aktiv cyklus den ikke på pause for evigt; hvis døren forbliver åben i den konfigurerede opholdsperiode, betragter WashData cyklussen som afsluttet. En kort åbning (tilføjelse af en tallerken) ignoreres. Kræver en dørsensorenhed."
},
"door_end_dwell_seconds": {
"label": "Dørens åbningstid ved afslutning",
"doc": "Hvor længe døren skal forblive åben, før WashData afslutter cyklussen, når \"Dør åbner automatisk ved afslutning\" er aktiveret. Lang nok til at ignorere hurtig tilføjelse af en tallerken (standard 60 s), kort nok til at afslutte hurtigt, når maskinen springer døren op."
} }
}, },
"setting_group": { "setting_group": {
@@ -1620,6 +1737,7 @@
"min_active": "Baseret på laveste aktive effekt ({min}W) observeret i sidste cyklus.", "min_active": "Baseret på laveste aktive effekt ({min}W) observeret i sidste cyklus.",
"min_duration_ratio": "Holdt så lav som muligt, så et program genkendes tidligt i cyklussen; konfidens- og tvetydighedsgrænserne forhindrer forhastede beslutninger.", "min_duration_ratio": "Holdt så lav som muligt, så et program genkendes tidligt i cyklussen; konfidens- og tvetydighedsgrænserne forhindrer forhastede beslutninger.",
"min_off_gap": "Baseret på {gaps} observerede mellemrum mellem cyklusser (p05={p05}s). Enhedsgulv: {floor}s.", "min_off_gap": "Baseret på {gaps} observerede mellemrum mellem cyklusser (p05={p05}s). Enhedsgulv: {floor}s.",
"min_off_gap_bridge": "Dimensioneret til at bygge bro over den længste stille periode i en cyklus: {span}s + 60s buffer, fra {spans} dækkede mellemrum på tværs af {cycles} rene cyklusser (holder sig under dit korteste mellemrum på {ceiling}s mellem to kørsler).",
"min_power": "40% af den laveste aktive effekt ved p05 ({p05}W) på tværs af {cycles} rene cyklusser, hvilket holder sluk-tærsklen under reelt forbrug.{excl}", "min_power": "40% af den laveste aktive effekt ved p05 ({p05}W) på tværs af {cycles} rene cyklusser, hvilket holder sluk-tærsklen under reelt forbrug.{excl}",
"ml_auto_label": "Laveste konfidens, som kvalitetsmodellen stadig vurderede som ren (p10 af {cycles} rene cyklusser = {p10}).", "ml_auto_label": "Laveste konfidens, som kvalitetsmodellen stadig vurderede som ren (p10 af {cycles} rene cyklusser = {p10}).",
"ml_end_repeat": "{false}/{total} cyklusser ({pct}%) havde en pause, som slutdetektoren vurderede til >50%; kræver {val} slutbekræftelse(r).", "ml_end_repeat": "{false}/{total} cyklusser ({pct}%) havde en pause, som slutdetektoren vurderede til >50%; kræver {val} slutbekræftelse(r).",
@@ -1636,7 +1754,7 @@
"thr_batch": "Holdt lige over den laveste aktive effekt ved p05 på tværs af {cycles} cyklusser ({p05}W), så en start fanges så tidligt som muligt, og stoptærsklen forbliver under maskinens laveste driftseffekt.", "thr_batch": "Holdt lige over den laveste aktive effekt ved p05 på tværs af {cycles} cyklusser ({p05}W), så en start fanges så tidligt som muligt, og stoptærsklen forbliver under maskinens laveste driftseffekt.",
"tol_per_profile": "p75 for varighedsvariansen pr. profil på tværs af {profiles} profiler ({cycles} cyklusser); stramme profiler straffes ikke.", "tol_per_profile": "p75 for varighedsvariansen pr. profil på tværs af {profiles} profiler ({cycles} cyklusser); stramme profiler straffes ikke.",
"tol_pooled": "Baseret på samlet varighedsvarians for {cycles} seneste mærkede cyklusser (p95 afvigelse={dev}).", "tol_pooled": "Baseret på samlet varighedsvarians for {cycles} seneste mærkede cyklusser (p95 afvigelse={dev}).",
"watchdog": "Holdt så lavt som forsvarligt (3x p95-opdateringsmellemrummet på {p95}s, min 30s), så stilstande fanges hurtigt uden falske stop." "watchdog": "Holdt så lavt som forsvarligt (lige over p95-opdateringsmellemrummet på {p95}s, min 30s), så stilstande fanges hurtigt uden falske stop."
}, },
"exclusions": { "exclusions": {
"summary": "{total} fejldetekterede cyklus(ser) udelukket: {parts}.", "summary": "{total} fejldetekterede cyklus(ser) udelukket: {parts}.",
@@ -1716,6 +1834,10 @@
"name_required": "Navn påkrævet", "name_required": "Navn påkrævet",
"no_split_found": "Ingen ledige mellemrum fundet at dele på", "no_split_found": "Ingen ledige mellemrum fundet at dele på",
"panel_settings_saved": "Panelindstillinger gemt", "panel_settings_saved": "Panelindstillinger gemt",
"pg_preset_loaded": "Forudindstillingen \"{name}\" er indlæst",
"pg_preset_saved": "Forudindstillingen \"{name}\" er gemt",
"pg_sugg_loaded": "{n} foreslåede(t) værdi(er) indlæst - kør legepladsen for at sammenligne",
"pg_sugg_ml_loaded": "{n} ML-kalibrerede(t) værdi(er) indlæst - kør legepladsen for at sammenligne",
"phase_name_required": "Fasenavn er påkrævet", "phase_name_required": "Fasenavn er påkrævet",
"phase_updated": "Fase opdateret", "phase_updated": "Fase opdateret",
"phases_saved": "Faser gemt", "phases_saved": "Faser gemt",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "Min.",
"entity_not_found": "Entität nicht gefunden",
"running_long": "Läuft länger",
"remaining": "verbleibend",
"progress": "Fortschritt",
"show_time_remaining": "Verbleibende Zeit anzeigen",
"show_percentage": "Prozentsatz anzeigen",
"layout": {
"tile": "Kachel (kompakt)",
"detail": "Detail (ausführlich)",
"glance": "Überblick (mehrere Geräte)"
},
"btn": {
"pause": "Pausieren",
"resume": "Fortsetzen",
"terminate": "Zyklus beenden",
"record_start": "Aufnahme starten",
"record_stop": "Aufnahme stoppen",
"program": "Programm",
"open_panel": "WashData öffnen"
},
"editor": {
"layout": "Layout",
"entity": "Geräteentität",
"entities": "Geräte",
"title": "Titel",
"icon": "Symbol",
"show_state": "Status anzeigen",
"show_program": "Programm anzeigen",
"show_progress_bar": "Fortschrittsbalken anzeigen",
"spin_icon": "Symbol während des Betriebs drehen",
"display_mode": "Detailzeile",
"active_color": "Aktivfarbe überschreiben",
"show_phase": "Phase anzeigen",
"show_energy": "Energie und Kosten anzeigen",
"show_anomaly": "Warnung bei Überlänge anzeigen",
"show_sparkline": "Live-Leistungsdiagramm anzeigen",
"buttons": "Aktionsschaltflächen",
"program_entity": "Programmentität (überschreiben)",
"time_entity": "Zeitentität (überschreiben)",
"pct_entity": "Fortschrittsentität (überschreiben)",
"power_entity": "Leistungsentität (überschreiben)",
"tap_action": "Tippen-Aktion",
"hold_action": "Halten-Aktion",
"double_tap_action": "Doppeltippen-Aktion"
}
},
"badge": { "badge": {
"artifact_tip": "{n} Anomalien erkannt (z. B. Tür mitten im Zyklus geöffnet) öffnen Sie sie, um sie in der Grafik anzuzeigen", "artifact_tip": "{n} Anomalien erkannt (z. B. Tür mitten im Zyklus geöffnet) öffnen Sie sie, um sie in der Grafik anzuzeigen",
"auto": "(automatisch erkannt)", "auto": "(automatisch erkannt)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Laufenden Zyklus anhalten das Gerät setzt dort fort, wo es aufgehört hat", "pause_cycle_tip": "Laufenden Zyklus anhalten das Gerät setzt dort fort, wo es aufgehört hat",
"pg_apply_device": "Auf Gerät anwenden", "pg_apply_device": "Auf Gerät anwenden",
"pg_autofill": "Automatisch ausfüllen", "pg_autofill": "Automatisch ausfüllen",
"pg_load_calibrated": "Kalibrierte (ML) laden ({n})",
"pg_load_calibrated_tip": "Lädt ML-kalibrierte Einstellungen als Testbereich-Überschreibungen",
"pg_load_live": "Aktive Einstellungen laden",
"pg_load_live_tip": "Die aktuellen Einstellungen der Integration neu einlesen und alle Änderungen im Testbereich verwerfen",
"pg_load_suggested": "Vorschläge laden ({n})",
"pg_load_suggested_tip": "Lädt die aktuellen Vorschläge des Auto-Tuners als Testbereich-Überschreibungen",
"pg_preset_delete": "Voreinstellung löschen",
"pg_preset_load": "Voreinstellung laden",
"pg_preset_load_tip": "Die Werte im Testbereich durch diese Voreinstellung ersetzen (die aktiven Einstellungen bleiben unverändert)",
"pg_preset_save": "Als Voreinstellung speichern",
"pg_preset_save_tip": "Alle Werte unten als benannte Voreinstellung für dieses Gerät speichern",
"pg_publish_all": "{n} in Integration übernehmen",
"pg_publish_one": "{label} in die Integration übernehmen",
"play": "Abspielen", "play": "Abspielen",
"process": "Verarbeiten", "process": "Verarbeiten",
"process_history": "Jetzt verarbeiten", "process_history": "Jetzt verarbeiten",
@@ -178,7 +239,9 @@
"download_export": "Export herunterladen", "download_export": "Export herunterladen",
"analyze_import": "Datei analysieren", "analyze_import": "Datei analysieren",
"import_selected": "Auswahl importieren", "import_selected": "Auswahl importieren",
"back": "Zurück" "back": "Zurück",
"mute_suggestion": "Diese Einstellung nicht mehr vorschlagen",
"reset_muted": "Stummschaltungen zurücksetzen"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +338,7 @@
"no_automations": "Noch keine Automatisierungen verweisen auf dieses Gerät.", "no_automations": "Noch keine Automatisierungen verweisen auf dieses Gerät.",
"panel_settings": "Panel-Einstellungen", "panel_settings": "Panel-Einstellungen",
"param_sweep": "Parameter-Sweep", "param_sweep": "Parameter-Sweep",
"pg_settings_source": "Herkunft der Einstellungen",
"phase_catalog": "Phasenkatalog", "phase_catalog": "Phasenkatalog",
"playground": "Testbereich", "playground": "Testbereich",
"process_history": "Prozesshistorie", "process_history": "Prozesshistorie",
@@ -410,6 +474,9 @@
"pg_group_detection": "Erkennungsauslöser", "pg_group_detection": "Erkennungsauslöser",
"pg_group_timing": "Zeitregeln", "pg_group_timing": "Zeitregeln",
"pg_idle": "Leerlauf", "pg_idle": "Leerlauf",
"pg_preset": "Testbereich-Voreinstellung",
"pg_preset_name": "Name der neuen Voreinstellung",
"pg_preset_none": "Voreinstellung auswählen…",
"pg_stress_group": "Leerlauferkennungstest", "pg_stress_group": "Leerlauferkennungstest",
"pg_stress_idle_auto": "Auto", "pg_stress_idle_auto": "Auto",
"pg_stress_idle_w": "Leerlaufpegel (W)", "pg_stress_idle_w": "Leerlaufpegel (W)",
@@ -609,7 +676,8 @@
"conflict_import_copy": "Als Kopie importieren", "conflict_import_copy": "Als Kopie importieren",
"conflict_keep_mine": "Meine behalten", "conflict_keep_mine": "Meine behalten",
"conflict_overwrite": "Überschreiben", "conflict_overwrite": "Überschreiben",
"pg_anti_wrinkle": "Knitterschutz" "pg_anti_wrinkle": "Knitterschutz",
"font_size": "Panel-Schriftgröße"
}, },
"log": { "log": {
"all_levels": "Alle Ebenen", "all_levels": "Alle Ebenen",
@@ -711,7 +779,7 @@
"cycles_deleted": "{count} Zyklen gelöscht", "cycles_deleted": "{count} Zyklen gelöscht",
"enough_data": "Genügend Daten zum Lernen ({current}/{min} Zyklen).", "enough_data": "Genügend Daten zum Lernen ({current}/{min} Zyklen).",
"export_description": "Wählen Sie genau aus, welche Profile, Zyklen, Einstellungen und mehr nach JSON exportiert werden sollen, oder analysieren Sie eine Datei und importieren Sie nur die gewünschten Teile.", "export_description": "Wählen Sie genau aus, welche Profile, Zyklen, Einstellungen und mehr nach JSON exportiert werden sollen, oder analysieren Sie eine Datei und importieren Sie nur die gewünschten Teile.",
"feedback_cycles_pending": "{n} Zyklus{s} zur Überprüfung", "feedback_cycles_pending": "Zu überprüfen: {n}",
"feedback_prompt": "Bestätigen Sie, dass es richtig war, korrigieren Sie das Programm oder ignorieren Sie es.", "feedback_prompt": "Bestätigen Sie, dass es richtig war, korrigieren Sie das Programm oder ignorieren Sie es.",
"feedback_relabel_hint": "Das erneute Beschriften dieses Zyklus erledigt die Überprüfung ebenfalls.", "feedback_relabel_hint": "Das erneute Beschriften dieses Zyklus erledigt die Überprüfung ebenfalls.",
"filter_by_profile": "Nach Profil filtern…", "filter_by_profile": "Nach Profil filtern…",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Besten Wert anwenden: {label} = {value}?", "pg_apply_confirm": "Besten Wert anwenden: {label} = {value}?",
"pg_canvas_empty": "Wählen Sie oben einen Zyklus aus und drücken Sie dann auf Laden, um seine Leistungskurve anzuzeigen.", "pg_canvas_empty": "Wählen Sie oben einen Zyklus aus und drücken Sie dann auf Laden, um seine Leistungskurve anzuzeigen.",
"pg_chart_caption": "Erkennungs-/Zuordnungsrate über die Werte von {param}", "pg_chart_caption": "Erkennungs-/Zuordnungsrate über die Werte von {param}",
"pg_ctrl_intro": "Die Werte stammen zunächst aus den aktiven Einstellungen dieses Geräts in der Integration. Änderungen bleiben im Testbereich, bis sie in die Integration übernommen werden.",
"pg_live_unavailable": "Aktive Einstellungen nicht verfügbar, es werden Standardwerte angezeigt.",
"pg_load_live_confirm": "{n} Änderung(en) im Testbereich verwerfen und die aktuellen Einstellungen der Integration neu laden?",
"pg_match_rate": "{pct}% Zuordnungsrate bei {total} Zyklen", "pg_match_rate": "{pct}% Zuordnungsrate bei {total} Zyklen",
"pg_matches_live": "Stimmt mit den aktiven Einstellungen überein",
"pg_n_changed": "{n} gegenüber den aktiven Einstellungen geändert",
"pg_sugg_none": "Alle Vorschläge stimmen bereits mit den aktuellen Einstellungen überein",
"pg_preset_delete_confirm": "Die Voreinstellung \"{name}\" löschen?",
"pg_preset_limit": "Maximale Anzahl an Voreinstellungen erreicht ({n})",
"pg_preset_overwrite": "Die Voreinstellung \"{name}\" überschreiben?",
"pg_publish_one_confirm": "{label} = {value} in den Einstellungen dieses Geräts speichern?",
"pg_restart_note": "Starten Sie Home Assistant neu, um die Simulationstools zu aktivieren.", "pg_restart_note": "Starten Sie Home Assistant neu, um die Simulationstools zu aktivieren.",
"pg_sim_progress": "{done} / {total} Zyklen", "pg_sim_progress": "{done} / {total} Zyklen",
"pg_starting": "Wird gestartet…", "pg_starting": "Wird gestartet…",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Dauer tendenziell kürzer ({pct} %/Zyklus) aktueller Durchschnitt {avg}", "trend_duration_shorter": "Dauer tendenziell kürzer ({pct} %/Zyklus) aktueller Durchschnitt {avg}",
"trend_energy_down": "Energie tendiert nach unten ({pct} %/Zyklus)", "trend_energy_down": "Energie tendiert nach unten ({pct} %/Zyklus)",
"trend_energy_up": "Energietrend steigt ({pct} %/Zyklus) aktueller Durchschnitt {avg}", "trend_energy_up": "Energietrend steigt ({pct} %/Zyklus) aktueller Durchschnitt {avg}",
"trim_destructive_confirm": "Dadurch werden nur {pct}% des Zyklus behalten. Dies kann nicht rückgängig gemacht werden. Fortfahren?",
"trim_intro": "Ziehen Sie die roten Ziehpunkte oder geben Sie Werte ein. Alles außerhalb des Fensters wird entfernt.", "trim_intro": "Ziehen Sie die roten Ziehpunkte oder geben Sie Werte ein. Alles außerhalb des Fensters wird entfernt.",
"tuning_suggestions_available": "{count} Optimierungsvorschlag aus beobachteten Zyklen verfügbar. Sie erscheinen neben den relevanten Feldern.", "tuning_suggestions_available": "{count} Optimierungsvorschlag aus beobachteten Zyklen verfügbar. Sie erscheinen neben den relevanten Feldern.",
"unsure_detected_prefix": "WashData ist sich nicht sicher, ob es erkannt wurde", "unsure_detected_prefix": "WashData ist sich nicht sicher, ob es erkannt wurde",
@@ -922,9 +1001,15 @@
"merge_hint": "Importierte Elemente werden hinzugefügt; nichts Lokales geht verloren. Namenskonflikte werden unten aufgelöst.", "merge_hint": "Importierte Elemente werden hinzugefügt; nichts Lokales geht verloren. Namenskonflikte werden unten aufgelöst.",
"replace_warn": "Jede angekreuzte Kategorie wird gelöscht und aus der Datei ersetzt. Nicht angekreuzte Kategorien bleiben unverändert.", "replace_warn": "Jede angekreuzte Kategorie wird gelöscht und aus der Datei ersetzt. Nicht angekreuzte Kategorien bleiben unverändert.",
"dest_reference_hint": "Importierte Zyklen verbessern nur die Programmerkennung und beeinflussen niemals die Nutzungs-/Energiestatistik.", "dest_reference_hint": "Importierte Zyklen verbessern nur die Programmerkennung und beeinflussen niemals die Nutzungs-/Energiestatistik.",
"dest_real_history_hint": "Importierte Zyklen zählen als eigener Verlauf dieses Geräts und fließen in die Energie-/Nutzungsstatistik ein. Verwenden Sie dies, um ein Gerät in eine neue Installation zu übertragen." "dest_real_history_hint": "Importierte Zyklen zählen als eigener Verlauf dieses Geräts und fließen in die Energie-/Nutzungsstatistik ein. Verwenden Sie dies, um ein Gerät in eine neue Installation zu übertragen.",
"sug_muted": "Diese Einstellung wird nicht mehr vorgeschlagen",
"sug_mute_failed": "Einstellung konnte nicht stummgeschaltet werden",
"sug_unmuted_all": "Stummgeschaltete Vorschläge zurückgesetzt",
"n_suggestions_muted": "{count} stummgeschaltet; der Autotuner schlägt diese nicht mehr vor.",
"font_size_hint": "Alles in diesem Panel vergrößern oder verkleinern. Gilt für Ihr Konto auf diesem Gerät."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Geschirrspüler: Ruhesekunden nach der erwarteten Dauer, bevor die Wartezeit auf das Abpumpen am Zyklusende freigegeben wird",
"completion_min_seconds": "Kürzester Lauf, der als echter Zyklus zählt", "completion_min_seconds": "Kürzester Lauf, der als echter Zyklus zählt",
"end_repeat_count": "Aufeinanderfolgende niedrige Messwerte vor dem Ende", "end_repeat_count": "Aufeinanderfolgende niedrige Messwerte vor dem Ende",
"interrupted_min_seconds": "Kurze Zyklen werden als unterbrochen markiert", "interrupted_min_seconds": "Kurze Zyklen werden als unterbrochen markiert",
@@ -998,6 +1083,10 @@
"unusable": "Unbrauchbar" "unusable": "Unbrauchbar"
}, },
"section": { "section": {
"dishwasher": {
"label": "Geschirrspüler",
"intro": "Behandlung des Zyklusendes für Geschirrspüler, die typischerweise mit einer langen, nahezu stillen Trocknungsphase vor einem kurzen letzten Abpumpen enden."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Knitterschutz-Modus erkennt Tumble-Impulse mit geringer Leistung nach der Hauptphase und hält sie dem abgeschlossenen Zyklus zugeordnet.", "intro": "Knitterschutz-Modus erkennt Tumble-Impulse mit geringer Leistung nach der Hauptphase und hält sie dem abgeschlossenen Zyklus zugeordnet.",
"label": "Knitterschutz" "label": "Knitterschutz"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Ruhefreigabe nach Passivtrocknung",
"doc": "Sobald der Zyklus seine erwartete Dauer überschreitet: wie lange der Geschirrspüler ruhig bleiben muss (unter dem Stoppschwellenwert), bevor WashData nicht mehr auf ein letztes Abpumpen wartet und den Zyklus beendet. Erhöhen Sie den Wert, wenn Ihre Maschine eine lange, stille Trocknungsphase vor einem späten letzten Abpumpen hat, das übersehen wird - ein größeres Fenster lässt die erlernte Dauer der saisonalen Drift folgen (kälteres Zulaufwasser = längere Zyklen), statt sich auf den alten Mittelwert festzulegen. Er verkürzt die Wartezeit gegenüber der internen 30-minütigen Obergrenze für die Endspitze nur, verlängert sie aber nie."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Erkennen Sie die kurzen, stromsparenden Wäscheimpulse, die ein Trockner nach der Hauptheizphase abgibt, und behalten Sie im Zusammenhang mit dem abgeschlossenen Zyklus bei, anstatt sie als neue Zyklen zu lesen.", "doc": "Erkennen Sie die kurzen, stromsparenden Wäscheimpulse, die ein Trockner nach der Hauptheizphase abgibt, und behalten Sie im Zusammenhang mit dem abgeschlossenen Zyklus bei, anstatt sie als neue Zyklen zu lesen.",
"label": "Knitterschutzerkennung aktivieren" "label": "Knitterschutzerkennung aktivieren"
@@ -1256,6 +1349,10 @@
"doc": "Minuten nach dem Ende eines Zyklus, bevor die noch wartende Erinnerung „Maschine entladen“ gesendet wird. Stellen Sie 0 ein, um die Erinnerung zu deaktivieren.", "doc": "Minuten nach dem Ende eines Zyklus, bevor die noch wartende Erinnerung „Maschine entladen“ gesendet wird. Stellen Sie 0 ein, um die Erinnerung zu deaktivieren.",
"label": "Verzögerung der Entladeerinnerung" "label": "Verzögerung der Entladeerinnerung"
}, },
"notify_unload_repeat": {
"doc": "Die Entladeerinnerung wird alle \"Verzögerung der Entladeerinnerung\" Minuten erneut gesendet, bis Sie die Tür öffnen oder in der Benachrichtigung auf \"Nicht mehr erinnern\" tippen. Erfordert eine Türsensor-Entität (die Erinnerung selbst benötigt sie ohnehin). Die Schaltfläche zum Verwerfen funktioniert bei Benachrichtigungen der Home Assistant Companion-App (mobil).",
"label": "Wiederholen, bis die Tür geöffnet wird"
},
"off_delay": { "off_delay": {
"doc": "Zeit, die nach einem Stromausfall gewartet werden muss, bevor der Zyklus als beendet erklärt wird. Wenn die Stromversorgung innerhalb dieses Fensters wiederhergestellt wird, läuft der Zyklus nahtlos weiter dies überbrückt Pausen zwischen den Waschphasen. Geschirrspüler haben lange Trocknungsphasen (Ausschalten für 2060 Minuten), daher muss die Ausschaltverzögerung länger sein, damit der gesamte Spül- und Trockenvorgang als ein Zyklus erfolgt.", "doc": "Zeit, die nach einem Stromausfall gewartet werden muss, bevor der Zyklus als beendet erklärt wird. Wenn die Stromversorgung innerhalb dieses Fensters wiederhergestellt wird, läuft der Zyklus nahtlos weiter dies überbrückt Pausen zwischen den Waschphasen. Geschirrspüler haben lange Trocknungsphasen (Ausschalten für 2060 Minuten), daher muss die Ausschaltverzögerung länger sein, damit der gesamte Spül- und Trockenvorgang als ein Zyklus erfolgt.",
"label": "Abschaltverzögerung" "label": "Abschaltverzögerung"
@@ -1434,6 +1531,26 @@
"anti_wrinkle_idle_timeout": { "anti_wrinkle_idle_timeout": {
"label": "Maximale Impulspause", "label": "Maximale Impulspause",
"doc": "Wie lange das Gerät zwischen zwei Trommelimpulsen still bleiben darf, bevor der Knitterschutz-Modus endet. Höher setzen als die längste Pause, die Ihr Trockner zwischen zwei Impulsen lässt sonst wird jeder weitere Impuls als Fehlstart gewertet." "doc": "Wie lange das Gerät zwischen zwei Trommelimpulsen still bleiben darf, bevor der Knitterschutz-Modus endet. Höher setzen als die längste Pause, die Ihr Trockner zwischen zwei Impulsen lässt sonst wird jeder weitere Impuls als Fehlstart gewertet."
},
"power_profile_interval_min": {
"label": "Leistungsprofil-Intervall",
"doc": "Bucket-Größe für das Attribut power_profile des profilbezogenen Sensors (ein flaches Array der durchschnittlichen Wattzahl pro Slot, das von externen Planern wie EMHASS und tibber_prices verwendet wird). Kleinere Buckets halten kurze Leistungsspitzen scharf; größere Buckets glätten die Kurve. Standard 15 Min. Nur zur Darstellung; hat keinen Einfluss auf die Erkennung."
},
"notify_live_sticky": {
"label": "Live-Benachrichtigung beim Antippen behalten",
"doc": "Nur Android. Die Live-Fortschrittsbenachrichtigung dauerhaft (sticky) anzeigen, sodass sie beim Antippen nicht ausgeblendet wird. Ausgeschaltet: Standardverhalten, bei dem ein Antippen die Benachrichtigung schließt."
},
"notify_live_click_action": {
"label": "Ziel beim Antippen der Live-Benachrichtigung",
"doc": "Nur Android. Wohin das Antippen der Live-Fortschrittsbenachrichtigung führt (z. B. /lovelace/laundry oder eine vollständige URL), statt zur Standard-App-Startseite. Leer lassen für Standard."
},
"door_opens_at_end": {
"label": "Tür öffnet sich am Ende automatisch",
"doc": "Für Geschirrspüler, die die Tür am Ende des Zyklus zum Trocknen aufspringen lassen (AirDry und ähnliche). Wenn aktiviert, unterbricht ein Türöffnen bei einem laufenden Zyklus diesen nicht dauerhaft; wenn die Tür für die eingestellte Verweildauer geöffnet bleibt, wertet WashData den Zyklus als abgeschlossen. Ein kurzes Öffnen (z. B. zum Nachlegen eines Geschirrstücks) wird ignoriert. Erfordert einen Türsensor."
},
"door_end_dwell_seconds": {
"label": "Türöffnungs-Endverweildauer",
"doc": "Wie lange die Tür geöffnet bleiben muss, bevor WashData den Zyklus beendet, wenn \"Tür öffnet sich am Ende automatisch\" aktiv ist. Lang genug, um ein kurzes Öffnen zum Nachlegen eines Geschirrteils zu ignorieren (Standard 60 s), kurz genug, um den Zyklus zügig zu beenden, sobald die Maschine die Tür aufspringt."
} }
}, },
"setting_group": { "setting_group": {
@@ -1620,6 +1737,7 @@
"min_active": "Basierend auf der minimalen aktiven Leistung ({min}W), die im letzten Zyklus beobachtet wurde.", "min_active": "Basierend auf der minimalen aktiven Leistung ({min}W), die im letzten Zyklus beobachtet wurde.",
"min_duration_ratio": "So niedrig wie möglich gehalten, damit ein Programm früh im Zyklus erkannt wird; die Konfidenz- und Mehrdeutigkeitsschranken verhindern vorzeitige Festlegungen.", "min_duration_ratio": "So niedrig wie möglich gehalten, damit ein Programm früh im Zyklus erkannt wird; die Konfidenz- und Mehrdeutigkeitsschranken verhindern vorzeitige Festlegungen.",
"min_off_gap": "Basierend auf {gaps} beobachteten Pausen zwischen Zyklen (p05={p05}s). Geräte-Untergrenze: {floor}s.", "min_off_gap": "Basierend auf {gaps} beobachteten Pausen zwischen Zyklen (p05={p05}s). Geräte-Untergrenze: {floor}s.",
"min_off_gap_bridge": "So bemessen, dass die längste Ruhephase innerhalb eines Zyklus überbrückt wird: {span}s + 60s Puffer, aus {spans} überbrückten Lücken über {cycles} saubere Zyklen (bleibt unter Ihrem kürzesten Abstand von {ceiling}s zwischen zwei Ladungen).",
"min_power": "40% der p05-niedrigsten aktiven Leistung ({p05}W) über {cycles} saubere Zyklen, sodass die Aus-Schwelle unter der tatsächlichen Leistungsaufnahme bleibt.{excl}", "min_power": "40% der p05-niedrigsten aktiven Leistung ({p05}W) über {cycles} saubere Zyklen, sodass die Aus-Schwelle unter der tatsächlichen Leistungsaufnahme bleibt.{excl}",
"ml_auto_label": "Niedrigste Konfidenz, die das Qualitätsmodell noch als sauber bewertet hat (p10 von {cycles} sauberen Zyklen = {p10}).", "ml_auto_label": "Niedrigste Konfidenz, die das Qualitätsmodell noch als sauber bewertet hat (p10 von {cycles} sauberen Zyklen = {p10}).",
"ml_end_repeat": "{false}/{total} Zyklen ({pct}%) hatten eine Pause, die der Endedetektor mit >50% bewertete; {val} Endbestätigung(en) erforderlich.", "ml_end_repeat": "{false}/{total} Zyklen ({pct}%) hatten eine Pause, die der Endedetektor mit >50% bewertete; {val} Endbestätigung(en) erforderlich.",
@@ -1636,7 +1754,7 @@
"thr_batch": "Knapp über der p05-niedrigsten aktiven Leistung über {cycles} Zyklen ({p05}W) gehalten, damit ein Start so früh wie möglich erkannt wird und die Stopp-Schwelle unter der niedrigsten Betriebsleistung der Maschine bleibt.", "thr_batch": "Knapp über der p05-niedrigsten aktiven Leistung über {cycles} Zyklen ({p05}W) gehalten, damit ein Start so früh wie möglich erkannt wird und die Stopp-Schwelle unter der niedrigsten Betriebsleistung der Maschine bleibt.",
"tol_per_profile": "p75 der Dauervarianz pro Profil über {profiles} Profile ({cycles} Zyklen); enge Profile werden nicht benachteiligt.", "tol_per_profile": "p75 der Dauervarianz pro Profil über {profiles} Profile ({cycles} Zyklen); enge Profile werden nicht benachteiligt.",
"tol_pooled": "Basierend auf der zusammengefassten Dauervarianz von {cycles} kürzlich gelabelten Zyklen (p95-Abweichung={dev}).", "tol_pooled": "Basierend auf der zusammengefassten Dauervarianz von {cycles} kürzlich gelabelten Zyklen (p95-Abweichung={dev}).",
"watchdog": "So niedrig wie sicher gehalten (3x die p95-Aktualisierungslücke von {p95}s, min 30s), damit Hänger schnell erkannt werden, ohne Fehl-Stopps auszulösen." "watchdog": "So niedrig wie sicher gehalten (knapp über der p95-Aktualisierungslücke von {p95}s, min 30s), damit Hänger schnell erkannt werden, ohne Fehl-Stopps auszulösen."
}, },
"exclusions": { "exclusions": {
"summary": "{total} falsch erkannte Zyklen ausgeschlossen: {parts}.", "summary": "{total} falsch erkannte Zyklen ausgeschlossen: {parts}.",
@@ -1716,6 +1834,10 @@
"name_required": "Name erforderlich", "name_required": "Name erforderlich",
"no_split_found": "Es wurden keine Leerlauflücken zum Aufspalten gefunden", "no_split_found": "Es wurden keine Leerlauflücken zum Aufspalten gefunden",
"panel_settings_saved": "Panel-Einstellungen gespeichert", "panel_settings_saved": "Panel-Einstellungen gespeichert",
"pg_preset_loaded": "Voreinstellung \"{name}\" geladen",
"pg_preset_saved": "Voreinstellung \"{name}\" gespeichert",
"pg_sugg_loaded": "{n} Vorschlagswert(e) in den Testbereich geladen - Testbereich ausführen, um zu vergleichen",
"pg_sugg_ml_loaded": "{n} ML-kalibrierten Wert(e) in den Testbereich geladen - Testbereich ausführen, um zu vergleichen",
"phase_name_required": "Phasenname ist erforderlich", "phase_name_required": "Phasenname ist erforderlich",
"phase_updated": "Phase aktualisiert", "phase_updated": "Phase aktualisiert",
"phases_saved": "Phasen gespeichert", "phases_saved": "Phasen gespeichert",
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entity not found",
"running_long": "Running long",
"remaining": "remaining",
"progress": "progress",
"show_time_remaining": "Show time remaining",
"show_percentage": "Show percentage",
"layout": {
"tile": "Tile (compact)",
"detail": "Detail (rich)",
"glance": "Glance (multiple devices)"
},
"btn": {
"pause": "Pause",
"resume": "Resume",
"terminate": "End cycle",
"record_start": "Start recording",
"record_stop": "Stop recording",
"program": "Program",
"open_panel": "Open WashData"
},
"editor": {
"layout": "Layout",
"entity": "Appliance entity",
"entities": "Appliances",
"title": "Title",
"icon": "Icon",
"show_state": "Show state",
"show_program": "Show program",
"show_progress_bar": "Show progress bar",
"spin_icon": "Spin icon while running",
"display_mode": "Detail line",
"active_color": "Active color override",
"show_phase": "Show phase",
"show_energy": "Show energy and cost",
"show_anomaly": "Show overrun warning",
"show_sparkline": "Show live power graph",
"buttons": "Action buttons",
"program_entity": "Program entity (override)",
"time_entity": "Time entity (override)",
"pct_entity": "Progress entity (override)",
"power_entity": "Power entity (override)",
"tap_action": "Tap action",
"hold_action": "Hold action",
"double_tap_action": "Double tap action"
}
},
"badge": { "badge": {
"approved": "Approved", "approved": "Approved",
"artifact_tip": "{n} anomalies detected (e.g. door opened mid-cycle) open to see them on the graph", "artifact_tip": "{n} anomalies detected (e.g. door opened mid-cycle) open to see them on the graph",
@@ -72,6 +120,21 @@
"discard_tip": "Discard the recorded trace without saving", "discard_tip": "Discard the recorded trace without saving",
"disconnect": "Disconnect", "disconnect": "Disconnect",
"dismiss": "Dismiss", "dismiss": "Dismiss",
"mute_suggestion": "Stop suggesting this setting",
"pg_load_calibrated": "Load Calibrated (ML) ({n})",
"pg_load_calibrated_tip": "Stage ML-calibrated settings as Playground overrides",
"pg_load_live": "Load live settings",
"pg_load_live_tip": "Re-read the integration's current settings and drop every Playground edit",
"pg_load_suggested": "Load suggested ({n})",
"pg_load_suggested_tip": "Stage the auto-tuner's current suggestions as Playground overrides",
"pg_preset_delete": "Delete preset",
"pg_preset_load": "Load preset",
"pg_preset_load_tip": "Replace the Playground values with this preset (live settings are untouched)",
"pg_preset_save": "Save as preset",
"pg_preset_save_tip": "Save every value below as a named preset for this device",
"pg_publish_all": "Publish {n} to integration",
"pg_publish_one": "Publish {label} to the integration",
"reset_muted": "Reset muted",
"done": "Done", "done": "Done",
"download_device": "Download this setup", "download_device": "Download this setup",
"download_export": "Download export", "download_export": "Download export",
@@ -274,6 +337,7 @@
"no_automations": "No automations reference this device yet.", "no_automations": "No automations reference this device yet.",
"panel_settings": "Panel Settings", "panel_settings": "Panel Settings",
"param_sweep": "Parameter sweep", "param_sweep": "Parameter sweep",
"pg_settings_source": "Settings source",
"phase_catalog": "Phase Catalog", "phase_catalog": "Phase Catalog",
"playground": "Playground", "playground": "Playground",
"process_history": "Process History", "process_history": "Process History",
@@ -370,6 +434,7 @@
"default_access_level": "Default level for users not listed below", "default_access_level": "Default level for users not listed below",
"default_other": "Default (other devices)", "default_other": "Default (other devices)",
"default_tab": "Default tab when opening the panel", "default_tab": "Default tab when opening the panel",
"font_size": "Panel font size",
"delta": "Δ", "delta": "Δ",
"description": "Description", "description": "Description",
"dest_real_history": "Real history (counts in stats)", "dest_real_history": "Real history (counts in stats)",
@@ -466,6 +531,9 @@
"pg_group_matching": "Program matching", "pg_group_matching": "Program matching",
"pg_group_timing": "Timing rules", "pg_group_timing": "Timing rules",
"pg_idle": "Idle", "pg_idle": "Idle",
"pg_preset": "Playground preset",
"pg_preset_name": "New preset name",
"pg_preset_none": "Select a preset…",
"pg_stress_group": "Idle termination test", "pg_stress_group": "Idle termination test",
"pg_stress_idle_auto": "Auto", "pg_stress_idle_auto": "Auto",
"pg_stress_idle_w": "Idle level (W)", "pg_stress_idle_w": "Idle level (W)",
@@ -768,6 +836,16 @@
"pg_analysis_hint2": "Pick a cycle and press Run to load match analysis.", "pg_analysis_hint2": "Pick a cycle and press Run to load match analysis.",
"pg_apply_confirm": "Apply best value: {label} = {value}?", "pg_apply_confirm": "Apply best value: {label} = {value}?",
"pg_apply_settings_confirm": "Save these {n} setting(s) to this device? {list}", "pg_apply_settings_confirm": "Save these {n} setting(s) to this device? {list}",
"pg_ctrl_intro": "Values start from this device's live integration settings. Edits stay in the Playground until you publish them.",
"pg_live_unavailable": "Live settings unavailable, showing defaults.",
"pg_load_live_confirm": "Discard {n} Playground edit(s) and reload the integration's current settings?",
"pg_matches_live": "Matches live settings",
"pg_n_changed": "{n} changed vs live settings",
"pg_sugg_none": "All suggestions already match the current settings",
"pg_preset_delete_confirm": "Delete the preset \"{name}\"?",
"pg_preset_limit": "Preset limit reached ({n})",
"pg_preset_overwrite": "Overwrite the preset \"{name}\"?",
"pg_publish_one_confirm": "Save {label} = {value} to this device's settings?",
"pg_stress_terminated_detail": "Settled to ~{idle}W idle -- cycle ended {h}h {m}m later via {reason}.", "pg_stress_terminated_detail": "Settled to ~{idle}W idle -- cycle ended {h}h {m}m later via {reason}.",
"pg_stress_above_threshold_detail": "Idle draw ~{idle}W is at or above the effective stop threshold ({stop}W) -- the cycle never registered as quiet. Raise stop_threshold_w to fix.", "pg_stress_above_threshold_detail": "Idle draw ~{idle}W is at or above the effective stop threshold ({stop}W) -- the cycle never registered as quiet. Raise stop_threshold_w to fix.",
"pg_stress_hit_cap_detail": "Cycle ran {h}h {m}m without stopping -- force-stopped by the safety cap. Idle draw {idle}W vs stop threshold {stop}W.", "pg_stress_hit_cap_detail": "Cycle ran {h}h {m}m without stopping -- force-stopped by the safety cap. Idle draw {idle}W vs stop threshold {stop}W.",
@@ -800,6 +878,7 @@
"preferences_admin": "Preferences, panel & access control", "preferences_admin": "Preferences, panel & access control",
"preferences_adv": "Preferences", "preferences_adv": "Preferences",
"prefs_personal": "These apply to your Home Assistant account only.", "prefs_personal": "These apply to your Home Assistant account only.",
"font_size_hint": "Make everything in this panel larger or smaller. Applies to your account on this device.",
"process_history_hint": "Re-run matching on all stored cycles, refresh tuning suggestions, retrain the ML models (if enabled), and recompute cycle health. Run this after a batch of reviews.", "process_history_hint": "Re-run matching on all stored cycles, refresh tuning suggestions, retrain the ML models (if enabled), and recompute cycle health. Run this after a batch of reviews.",
"profile_deleted": "Profile deleted", "profile_deleted": "Profile deleted",
"profile_poor_health_detail": "Cycles assigned to this profile have inconsistent shapes or low confidence. Consider rebuilding the envelope or reviewing labelled cycles.", "profile_poor_health_detail": "Cycles assigned to this profile have inconsistent shapes or low confidence. Consider rebuilding the envelope or reviewing labelled cycles.",
@@ -845,6 +924,10 @@
"store_share_device_intro": "Upload {brand} {model} with the reference cycles you select. Others with the same appliance can adopt your programs. Entries are reviewed before appearing publicly.", "store_share_device_intro": "Upload {brand} {model} with the reference cycles you select. Others with the same appliance can adopt your programs. Entries are reviewed before appearing publicly.",
"store_share_intro": "Upload this reference cycle so others with the same appliance can use it. It is reviewed before appearing publicly.", "store_share_intro": "Upload this reference cycle so others with the same appliance can use it. It is reviewed before appearing publicly.",
"sug_staged": "Set {key} = {val}. Save to apply.", "sug_staged": "Set {key} = {val}. Save to apply.",
"sug_muted": "Won't suggest this setting again",
"sug_mute_failed": "Could not mute suggestion",
"sug_unmuted_all": "Muted suggestions reset",
"n_suggestions_muted": "{count} muted; the auto-tuner will not propose these.",
"tail_trim_hint": "Remove this many seconds from the end", "tail_trim_hint": "Remove this many seconds from the end",
"toast_auto_detect_enabled": "Auto-detect enabled", "toast_auto_detect_enabled": "Auto-detect enabled",
"toast_auto_label_complete": "Auto-label complete", "toast_auto_label_complete": "Auto-label complete",
@@ -872,6 +955,7 @@
"trend_duration_shorter": "Duration trending shorter ({pct}%/cycle) recent avg {avg}", "trend_duration_shorter": "Duration trending shorter ({pct}%/cycle) recent avg {avg}",
"trend_energy_down": "Energy trending down ({pct}%/cycle)", "trend_energy_down": "Energy trending down ({pct}%/cycle)",
"trend_energy_up": "Energy trending up ({pct}%/cycle) recent avg {avg}", "trend_energy_up": "Energy trending up ({pct}%/cycle) recent avg {avg}",
"trim_destructive_confirm": "This keeps only {pct}% of the cycle and cannot be undone. Continue?",
"trim_intro": "Drag the red handles, or enter values. Everything outside the window is removed.", "trim_intro": "Drag the red handles, or enter values. Everything outside the window is removed.",
"tuning_suggestions_available": "{count} tuning suggestion available from observed cycles. They appear beside the relevant fields.", "tuning_suggestions_available": "{count} tuning suggestion available from observed cycles. They appear beside the relevant fields.",
"unsure_detected_prefix": "WashData is unsure it detected", "unsure_detected_prefix": "WashData is unsure it detected",
@@ -903,6 +987,7 @@
"duration_scale": "Stage 4: log-ratio where duration agreement halves; smaller = stricter penalty (default 0.175)", "duration_scale": "Stage 4: log-ratio where duration agreement halves; smaller = stricter penalty (default 0.175)",
"energy_scale": "Stage 4: log-ratio where energy agreement halves; smaller = stricter penalty (default 0.25)", "energy_scale": "Stage 4: log-ratio where energy agreement halves; smaller = stricter penalty (default 0.25)",
"anti_wrinkle_idle_timeout": "Quiet time allowed between two tumble pulses before anti-wrinkle ends", "anti_wrinkle_idle_timeout": "Quiet time allowed between two tumble pulses before anti-wrinkle ends",
"dishwasher_end_spike_quiet_release": "Dishwasher: quiet seconds after expected duration before the end-of-cycle drain wait is released",
"anti_wrinkle_max_power": "A pulse above this ends anti-wrinkle and opens a new cycle", "anti_wrinkle_max_power": "A pulse above this ends anti-wrinkle and opens a new cycle",
"anti_wrinkle_enabled": "Absorb the tumble pulses after the main phase instead of reading them as new cycles", "anti_wrinkle_enabled": "Absorb the tumble pulses after the main phase instead of reading them as new cycles",
"anti_wrinkle_max_duration": "A pulse longer than this ends anti-wrinkle and opens a new cycle", "anti_wrinkle_max_duration": "A pulse longer than this ends anti-wrinkle and opens a new cycle",
@@ -970,6 +1055,10 @@
"intro": "How a cycle is detected as starting, running and finishing.", "intro": "How a cycle is detected as starting, running and finishing.",
"label": "Detection" "label": "Detection"
}, },
"dishwasher": {
"intro": "End-of-cycle handling for dishwashers, which typically finish with a long near-silent drying phase before a short final drain.",
"label": "Dishwasher"
},
"matching": { "matching": {
"intro": "How finished cycles are matched to learned profiles and labelled.", "intro": "How finished cycles are matched to learned profiles and labelled.",
"label": "Matching" "label": "Matching"
@@ -1040,6 +1129,10 @@
"doc": "Appliance class. Sets sensible detection defaults (thresholds, off-delay, end handling) tuned for that appliance type; change it only if the device was originally set up as the wrong type.", "doc": "Appliance class. Sets sensible detection defaults (thresholds, off-delay, end handling) tuned for that appliance type; change it only if the device was originally set up as the wrong type.",
"label": "Device Type" "label": "Device Type"
}, },
"dishwasher_end_spike_quiet_release": {
"doc": "Once the cycle passes its expected duration, how long the dishwasher must stay quiet (below the Stop Threshold) before WashData stops waiting for a final drain and ends the cycle. Raise it if your machine has a long silent drying phase before a late final drain that is being missed - a wider window lets the learned duration follow seasonal drift (colder inlet water = longer cycles) instead of locking to the old average. It only ever shortens the wait relative to the internal 30-minute end-spike cap, never extends it.",
"label": "Passive-Dry Quiet Release"
},
"door_sensor_entity": { "door_sensor_entity": {
"doc": "Optional door binary sensor. Used to detect when the appliance has been opened/unloaded after a cycle.", "doc": "Optional door binary sensor. Used to detect when the appliance has been opened/unloaded after a cycle.",
"label": "Door Sensor Entity" "label": "Door Sensor Entity"
@@ -1228,6 +1321,10 @@
"doc": "Minutes after a cycle ends before sending the still-waiting \"unload the machine\" reminder. Set 0 to disable the reminder.", "doc": "Minutes after a cycle ends before sending the still-waiting \"unload the machine\" reminder. Set 0 to disable the reminder.",
"label": "Unload Nag Delay" "label": "Unload Nag Delay"
}, },
"notify_unload_repeat": {
"doc": "Keep re-sending the unload reminder every \"Unload Nag Delay\" minutes until you open the door or tap \"Stop reminding\" on the notification. Requires a Door Sensor Entity (the reminder itself does). The dismiss button works on Home Assistant companion-app (mobile) notifications.",
"label": "Repeat Until Door Opens"
},
"off_delay": { "off_delay": {
"doc": "Time to wait after power drops before declaring the cycle finished. If power resumes within this window the cycle continues seamlessly - this bridges pauses between wash stages. Dishwashers have long drying phases (power off for 20-60 min) so the off-delay must exceed that to keep the whole wash+dry as one cycle.", "doc": "Time to wait after power drops before declaring the cycle finished. If power resumes within this window the cycle continues seamlessly - this bridges pauses between wash stages. Dishwashers have long drying phases (power off for 20-60 min) so the off-delay must exceed that to keep the whole wash+dry as one cycle.",
"label": "Off Delay" "label": "Off Delay"
@@ -1386,6 +1483,26 @@
"anti_wrinkle_idle_timeout": { "anti_wrinkle_idle_timeout": {
"label": "Max Pulse Gap", "label": "Max Pulse Gap",
"doc": "How long the machine may stay quiet between two tumble pulses before anti-wrinkle mode ends. Set it above the longest gap your dryer leaves between pulses, otherwise every later pulse is read as a false start." "doc": "How long the machine may stay quiet between two tumble pulses before anti-wrinkle mode ends. Set it above the longest gap your dryer leaves between pulses, otherwise every later pulse is read as a false start."
},
"power_profile_interval_min": {
"label": "Power Profile Interval",
"doc": "Bucket size for the per-profile power_profile sensor attribute (the flat per-slot average-watts array consumed by external planners such as EMHASS and tibber_prices). Smaller buckets keep short power spikes sharp; larger buckets smooth the shape. Default 15 min. Read-time only; does not affect detection."
},
"notify_live_sticky": {
"label": "Keep Live Notification On Tap",
"doc": "Android only. Make the live-progress notification persistent (sticky) so tapping it does not dismiss the ongoing thread. Off keeps the default behaviour where a tap dismisses it."
},
"notify_live_click_action": {
"label": "Live Notification Tap Target",
"doc": "Android only. Where a tap on the live-progress notification opens (e.g. /lovelace/laundry, or a full URL) instead of the app landing page. Leave blank for the default."
},
"door_opens_at_end": {
"label": "Door Opens Automatically At End",
"doc": "For dishwashers that pop the door open at the end of the cycle to dry (AirDry and similar). With this on, a door-open on a running cycle no longer pauses it forever; instead, if the door stays open for the dwell below, WashData treats the cycle as finished. A brief open (adding an item) is ignored. Requires a Door Sensor Entity."
},
"door_end_dwell_seconds": {
"label": "Door-Open End Dwell",
"doc": "How long the door must stay open before WashData ends the cycle, when \"Door Opens Automatically At End\" is on. Long enough to ignore quickly adding a dish (default 60 s), short enough to end promptly once the machine pops the door."
} }
}, },
"setting_group": { "setting_group": {
@@ -1554,7 +1671,7 @@
} }
}, },
"reason": { "reason": {
"watchdog": "Kept as low as safe (3x the p95 update gap of {p95}s, min 30s) so stalls are caught quickly without false stops.", "watchdog": "Kept as low as safe (just above the p95 update gap of {p95}s and at least 2x the sampling interval of {median}s, min 30s) so stalls are caught quickly without false stops.",
"no_update_timeout": "Based on observed update cadence (p95={p95}s) * 20 (min 60s).", "no_update_timeout": "Based on observed update cadence (p95={p95}s) * 20 (min 60s).",
"off_delay_cadence": "Based on observed update cadence (p95={p95}s) * 5", "off_delay_cadence": "Based on observed update cadence (p95={p95}s) * 5",
"off_delay_device_floor": "Used device-specific safe minimum for {device} ({floor}s).", "off_delay_device_floor": "Used device-specific safe minimum for {device} ({floor}s).",
@@ -1575,6 +1692,7 @@
"profile_match_threshold": "p10 confidence of {cycles} correct auto-labels ({p10}); safe live-commit floor.", "profile_match_threshold": "p10 confidence of {cycles} correct auto-labels ({p10}); safe live-commit floor.",
"end_repeat_count": "{false}/{total} clean cycles ({pct}%) had a >60s internal pause that resumed; require {val} end confirmation(s).", "end_repeat_count": "{false}/{total} clean cycles ({pct}%) had a >60s internal pause that resumed; require {val} end confirmation(s).",
"min_off_gap": "Based on {gaps} observed inter-cycle gaps (p05={p05}s). Device floor: {floor}s.", "min_off_gap": "Based on {gaps} observed inter-cycle gaps (p05={p05}s). Device floor: {floor}s.",
"min_off_gap_bridge": "Sized to bridge the longest quiet stretch inside a cycle: {span}s + 60s buffer, from {spans} bridged gaps across {cycles} clean cycles (stays under your {ceiling}s back-to-back headroom).",
"min_active": "Based on minimum active power ({min}W) observed in last cycle.", "min_active": "Based on minimum active power ({min}W) observed in last cycle.",
"end_energy_default": "Default recommended baseline for end-of-cycle noise gate.", "end_energy_default": "Default recommended baseline for end-of-cycle noise gate.",
"dead_zone_from_dip": "Based on early power dip detected at {s}s.", "dead_zone_from_dip": "Based on early power dip detected at {s}s.",
@@ -1678,6 +1796,10 @@
"no_split_found": "No idle gaps found to split on", "no_split_found": "No idle gaps found to split on",
"panel_settings_saved": "Panel settings saved", "panel_settings_saved": "Panel settings saved",
"pause_no_cycle": "No active cycle to pause", "pause_no_cycle": "No active cycle to pause",
"pg_preset_loaded": "Preset \"{name}\" loaded",
"pg_preset_saved": "Preset \"{name}\" saved",
"pg_sugg_loaded": "Staged {n} suggested value(s) - run the Playground to compare",
"pg_sugg_ml_loaded": "Staged {n} ML-calibrated value(s) - run the Playground to compare",
"pg_run_gone": "That run is no longer available.", "pg_run_gone": "That run is no longer available.",
"phase_name_required": "Phase name is required", "phase_name_required": "Phase name is required",
"phase_updated": "Phase updated", "phase_updated": "Phase updated",
@@ -92,6 +92,19 @@
"pause_cycle_tip": "Pausar el ciclo en curso el electrodoméstico reanudará donde lo dejó", "pause_cycle_tip": "Pausar el ciclo en curso el electrodoméstico reanudará donde lo dejó",
"pg_apply_device": "Aplicar al dispositivo", "pg_apply_device": "Aplicar al dispositivo",
"pg_autofill": "Autocompletar", "pg_autofill": "Autocompletar",
"pg_load_calibrated": "Cargar Calibrado (ML) ({n})",
"pg_load_calibrated_tip": "Cargar los ajustes calibrados por ML como anulaciones en la Zona de pruebas",
"pg_load_live": "Cargar los ajustes activos",
"pg_load_live_tip": "Volver a leer los ajustes actuales de la integración y descartar todas las ediciones de la Zona de pruebas",
"pg_load_suggested": "Cargar sugerencias ({n})",
"pg_load_suggested_tip": "Cargar las sugerencias actuales del ajustador automático como anulaciones en la Zona de pruebas",
"pg_preset_delete": "Eliminar preajuste",
"pg_preset_load": "Cargar preajuste",
"pg_preset_load_tip": "Sustituir los valores de la Zona de pruebas por este preajuste (los ajustes activos no se modifican)",
"pg_preset_save": "Guardar como preajuste",
"pg_preset_save_tip": "Guardar todos los valores de abajo como un preajuste con nombre para este dispositivo",
"pg_publish_all": "Guardar {n} ajuste(s) en la integración",
"pg_publish_one": "Guardar {label} en la integración",
"play": "Reproducir", "play": "Reproducir",
"process": "Proceso", "process": "Proceso",
"process_history": "Procesar ahora", "process_history": "Procesar ahora",
@@ -178,7 +191,9 @@
"download_export": "Descargar exportación", "download_export": "Descargar exportación",
"analyze_import": "Analizar archivo", "analyze_import": "Analizar archivo",
"import_selected": "Importar lo seleccionado", "import_selected": "Importar lo seleccionado",
"back": "Atrás" "back": "Atrás",
"mute_suggestion": "Dejar de sugerir este ajuste",
"reset_muted": "Restablecer silenciados"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +290,7 @@
"no_automations": "Ninguna automatización hace referencia a este dispositivo todavía.", "no_automations": "Ninguna automatización hace referencia a este dispositivo todavía.",
"panel_settings": "Configuración del panel", "panel_settings": "Configuración del panel",
"param_sweep": "Barrido de parámetros", "param_sweep": "Barrido de parámetros",
"pg_settings_source": "Origen de los ajustes",
"phase_catalog": "Catálogo de fases", "phase_catalog": "Catálogo de fases",
"playground": "Zona de pruebas", "playground": "Zona de pruebas",
"process_history": "Historia del proceso", "process_history": "Historia del proceso",
@@ -415,6 +431,9 @@
"pg_match_score": "Puntuación de coincidencia", "pg_match_score": "Puntuación de coincidencia",
"pg_pct_of": "{p}% de {total}", "pg_pct_of": "{p}% de {total}",
"pg_poor_match": "Coincidencia deficiente", "pg_poor_match": "Coincidencia deficiente",
"pg_preset": "Preajuste de la Zona de pruebas",
"pg_preset_name": "Nombre del nuevo preajuste",
"pg_preset_none": "Seleccione un preajuste…",
"pg_strong_match": "Coincidencia fuerte", "pg_strong_match": "Coincidencia fuerte",
"pg_tile_ambiguous": "Ambiguo", "pg_tile_ambiguous": "Ambiguo",
"pg_tile_ambiguous_tip": "Ciclos con un empate ajustado entre dos programas", "pg_tile_ambiguous_tip": "Ciclos con un empate ajustado entre dos programas",
@@ -609,7 +628,8 @@
"conflict_resolution": "Conflictos de nombres", "conflict_resolution": "Conflictos de nombres",
"conflict_import_copy": "Importar como copia", "conflict_import_copy": "Importar como copia",
"conflict_keep_mine": "Conservar el mío", "conflict_keep_mine": "Conservar el mío",
"conflict_overwrite": "Sobrescribir" "conflict_overwrite": "Sobrescribir",
"font_size": "Tamaño de fuente del panel"
}, },
"log": { "log": {
"all_levels": "Todos los niveles", "all_levels": "Todos los niveles",
@@ -771,7 +791,17 @@
"pg_apply_confirm": "¿Aplicar el mejor valor: {label} = {value}?", "pg_apply_confirm": "¿Aplicar el mejor valor: {label} = {value}?",
"pg_canvas_empty": "Seleccione un ciclo arriba y luego pulse Cargar para ver su curva de potencia.", "pg_canvas_empty": "Seleccione un ciclo arriba y luego pulse Cargar para ver su curva de potencia.",
"pg_chart_caption": "Tasa de detección/coincidencia según los valores de {param}", "pg_chart_caption": "Tasa de detección/coincidencia según los valores de {param}",
"pg_ctrl_intro": "Los valores parten de los ajustes activos de este dispositivo en la integración. Las ediciones permanecen en la Zona de pruebas hasta que las guarde en la integración.",
"pg_live_unavailable": "Ajustes activos no disponibles, se muestran los valores predeterminados.",
"pg_load_live_confirm": "¿Descartar {n} edición(es) de la Zona de pruebas y volver a cargar los ajustes actuales de la integración?",
"pg_match_rate": "{pct}% de tasa de coincidencia en {total} ciclos", "pg_match_rate": "{pct}% de tasa de coincidencia en {total} ciclos",
"pg_matches_live": "Coincide con los ajustes activos",
"pg_n_changed": "{n} valor(es) distinto(s) de los ajustes activos",
"pg_sugg_none": "Todas las sugerencias ya coinciden con los ajustes actuales",
"pg_preset_delete_confirm": "¿Eliminar el preajuste \"{name}\"?",
"pg_preset_limit": "Límite de preajustes alcanzado ({n})",
"pg_preset_overwrite": "¿Sobrescribir el preajuste \"{name}\"?",
"pg_publish_one_confirm": "¿Guardar {label} = {value} en los ajustes de este dispositivo?",
"pg_restart_note": "Reinicie Home Assistant para habilitar las herramientas de simulación.", "pg_restart_note": "Reinicie Home Assistant para habilitar las herramientas de simulación.",
"pg_sim_progress": "{done} / {total} ciclos", "pg_sim_progress": "{done} / {total} ciclos",
"pg_starting": "Iniciando…", "pg_starting": "Iniciando…",
@@ -845,6 +875,7 @@
"trend_duration_shorter": "Tendencia de duración más corta ({pct} %/ciclo): promedio reciente {avg}", "trend_duration_shorter": "Tendencia de duración más corta ({pct} %/ciclo): promedio reciente {avg}",
"trend_energy_down": "Energía con tendencia a la baja ({pct}%/ciclo)", "trend_energy_down": "Energía con tendencia a la baja ({pct}%/ciclo)",
"trend_energy_up": "Tendencia de energía al alza ({pct}%/ciclo): promedio reciente {avg}", "trend_energy_up": "Tendencia de energía al alza ({pct}%/ciclo): promedio reciente {avg}",
"trim_destructive_confirm": "Esto conserva solo el {pct}% del ciclo y no se puede deshacer. ¿Continuar?",
"trim_intro": "Arrastre los controles rojos o ingrese valores. Se elimina todo lo que está fuera de la ventana.", "trim_intro": "Arrastre los controles rojos o ingrese valores. Se elimina todo lo que está fuera de la ventana.",
"tuning_suggestions_available": "{count} sugerencia de ajuste disponible de los ciclos observados. Aparecen al lado de los campos relevantes.", "tuning_suggestions_available": "{count} sugerencia de ajuste disponible de los ciclos observados. Aparecen al lado de los campos relevantes.",
"unsure_detected_prefix": "WashData no está seguro de haber detectado", "unsure_detected_prefix": "WashData no está seguro de haber detectado",
@@ -922,9 +953,15 @@
"merge_hint": "Los elementos importados se añaden; no se pierde nada local. Los conflictos de nombres se resuelven abajo.", "merge_hint": "Los elementos importados se añaden; no se pierde nada local. Los conflictos de nombres se resuelven abajo.",
"replace_warn": "Cada categoría marcada se borra y se reemplaza con el contenido del archivo. Las categorías sin marcar quedan intactas.", "replace_warn": "Cada categoría marcada se borra y se reemplaza con el contenido del archivo. Las categorías sin marcar quedan intactas.",
"dest_reference_hint": "Los ciclos importados solo mejoran el reconocimiento de programas y nunca afectan a las estadísticas de uso/energía.", "dest_reference_hint": "Los ciclos importados solo mejoran el reconocimiento de programas y nunca afectan a las estadísticas de uso/energía.",
"dest_real_history_hint": "Los ciclos importados cuentan como el historial propio de este dispositivo y alimentan las estadísticas de energía/uso. Úsalo para mover un electrodoméstico a una instalación nueva." "dest_real_history_hint": "Los ciclos importados cuentan como el historial propio de este dispositivo y alimentan las estadísticas de energía/uso. Úsalo para mover un electrodoméstico a una instalación nueva.",
"sug_muted": "Este ajuste no volverá a sugerirse",
"sug_mute_failed": "No se pudo silenciar la sugerencia",
"sug_unmuted_all": "Sugerencias silenciadas restablecidas",
"n_suggestions_muted": "{count} silenciadas; el ajustador automático no propondrá estas.",
"font_size_hint": "Aumenta o reduce el tamaño de todo en este panel. Se aplica a tu cuenta en este dispositivo."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Lavavajillas: segundos de silencio tras la duración esperada antes de liberar la espera del vaciado de fin de ciclo",
"anti_wrinkle_enabled": "Absorber los pulsos de volteo tras la fase principal en lugar de leerlos como nuevos ciclos", "anti_wrinkle_enabled": "Absorber los pulsos de volteo tras la fase principal en lugar de leerlos como nuevos ciclos",
"anti_wrinkle_exit_power": "La potencia debe caer por debajo de este valor entre pulsos para que el modo antiarrugas siga activo", "anti_wrinkle_exit_power": "La potencia debe caer por debajo de este valor entre pulsos para que el modo antiarrugas siga activo",
"anti_wrinkle_idle_timeout": "Tiempo de silencio permitido entre dos pulsos de volteo antes de que finalice el modo antiarrugas", "anti_wrinkle_idle_timeout": "Tiempo de silencio permitido entre dos pulsos de volteo antes de que finalice el modo antiarrugas",
@@ -998,6 +1035,10 @@
"unusable": "Inutilizable" "unusable": "Inutilizable"
}, },
"section": { "section": {
"dishwasher": {
"label": "Lavavajillas",
"intro": "Gestión del final del ciclo para lavavajillas, que suelen terminar con una larga fase de secado casi silenciosa antes de un breve vaciado final."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "El modo antiarrugas/antipliegues detecta pulsos de volteo de baja potencia después de la fase principal y los mantiene unidos al ciclo terminado.", "intro": "El modo antiarrugas/antipliegues detecta pulsos de volteo de baja potencia después de la fase principal y los mantiene unidos al ciclo terminado.",
"label": "Antiarrugas" "label": "Antiarrugas"
@@ -1040,6 +1081,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Liberación en silencio del secado pasivo",
"doc": "Una vez que el ciclo supera su duración esperada, cuánto tiempo debe permanecer en silencio el lavavajillas (por debajo del Umbral de parada) antes de que WashData deje de esperar un vaciado final y finalice el ciclo. Auméntelo si su máquina tiene una larga fase de secado silenciosa antes de un vaciado final tardío que no se detecta - una ventana más amplia permite que la duración aprendida siga la deriva estacional (agua de entrada más fría = ciclos más largos) en lugar de fijarse en la media anterior. Solo acorta la espera respecto al tope interno de 30 minutos para el pico de fin, nunca la prolonga."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Reconozca los impulsos cortos de baja potencia que emite una secadora después de la fase de calentamiento principal y manténgalos adjuntos al ciclo finalizado en lugar de leerlos como ciclos nuevos.", "doc": "Reconozca los impulsos cortos de baja potencia que emite una secadora después de la fase de calentamiento principal y manténgalos adjuntos al ciclo finalizado en lugar de leerlos como ciclos nuevos.",
"label": "Habilitar detección antiarrugas" "label": "Habilitar detección antiarrugas"
@@ -1260,6 +1305,10 @@
"doc": "Minutos después de que finaliza un ciclo antes de enviar el recordatorio de \"descargar la máquina\" que aún está en espera. Establezca 0 para desactivar el recordatorio.", "doc": "Minutos después de que finaliza un ciclo antes de enviar el recordatorio de \"descargar la máquina\" que aún está en espera. Establezca 0 para desactivar el recordatorio.",
"label": "Retardo del recordatorio de descarga" "label": "Retardo del recordatorio de descarga"
}, },
"notify_unload_repeat": {
"doc": "Sigue reenviando el recordatorio de descarga cada \"Retardo del recordatorio de descarga\" minutos hasta que abras la puerta o toques \"Dejar de recordar\" en la notificación. Requiere una Entidad de sensor de puerta (el propio recordatorio la necesita). El botón de descarte funciona en las notificaciones de la aplicación complementaria (móvil) de Home Assistant.",
"label": "Repetir hasta que se abra la puerta"
},
"off_delay": { "off_delay": {
"doc": "Es tiempo de esperar después de que se corte la energía antes de declarar finalizado el ciclo. Si la energía se reanuda dentro de esta ventana, el ciclo continúa sin problemas; esto salva las pausas entre las etapas de lavado. Los lavavajillas tienen fases de secado largas (apagado durante 20 a 60 minutos), por lo que el retraso de apagado debe exceder eso para mantener todo el lavado y secado como un solo ciclo.", "doc": "Es tiempo de esperar después de que se corte la energía antes de declarar finalizado el ciclo. Si la energía se reanuda dentro de esta ventana, el ciclo continúa sin problemas; esto salva las pausas entre las etapas de lavado. Los lavavajillas tienen fases de secado largas (apagado durante 20 a 60 minutos), por lo que el retraso de apagado debe exceder eso para mantener todo el lavado y secado como un solo ciclo.",
"label": "Retardo de apagado" "label": "Retardo de apagado"
@@ -1434,6 +1483,26 @@
"energy_scale": { "energy_scale": {
"label": "Nitidez de energía", "label": "Nitidez de energía",
"doc": "Precisión de la penalización por concordancia de energía. Menor = más estricto: una discordancia de energía penaliza más. El predeterminado 0,25 es intencionalmente más indulgente que la Precisión de duración, porque la energía varía con la carga. Combinar con Peso de energía." "doc": "Precisión de la penalización por concordancia de energía. Menor = más estricto: una discordancia de energía penaliza más. El predeterminado 0,25 es intencionalmente más indulgente que la Precisión de duración, porque la energía varía con la carga. Combinar con Peso de energía."
},
"power_profile_interval_min": {
"label": "Intervalo del perfil de potencia",
"doc": "Tamaño del intervalo para el atributo del sensor power_profile por perfil (la matriz plana de vatios medios por franja, consumida por planificadores externos como EMHASS y tibber_prices). Intervalos más pequeños mantienen nítidos los picos de potencia breves; intervalos más grandes suavizan la forma. Predeterminado 15 min. Solo de lectura; no afecta a la detección."
},
"notify_live_sticky": {
"label": "Mantener la notificación activa al pulsar",
"doc": "Solo Android. Hace que la notificación de progreso en vivo sea persistente (fija), de modo que pulsarla no la cierre. Desactivado mantiene el comportamiento predeterminado en el que un toque la cierra."
},
"notify_live_click_action": {
"label": "Destino al pulsar la notificación en vivo",
"doc": "Solo Android. Destino que se abre al pulsar la notificación de progreso en vivo (por ejemplo, /lovelace/lavandería, o una URL completa), en lugar de la página de inicio de la aplicación. Dejar en blanco para el valor predeterminado."
},
"door_opens_at_end": {
"label": "La puerta se abre automáticamente al final",
"doc": "Para lavavajillas que abren la puerta al final del ciclo para secar (AirDry y similares). Con esta opción activada, abrir la puerta durante un ciclo en marcha ya no lo pausa indefinidamente; en cambio, si la puerta permanece abierta el tiempo mínimo indicado abajo, WashData considera el ciclo finalizado. Una apertura breve (para añadir un elemento) se ignora. Requiere una entidad de sensor de puerta."
},
"door_end_dwell_seconds": {
"label": "Tiempo mínimo de puerta abierta para finalizar",
"doc": "Cuánto tiempo debe permanecer abierta la puerta antes de que WashData finalice el ciclo, cuando «La puerta se abre automáticamente al final» está activada. Lo suficientemente largo como para ignorar añadir un elemento rápidamente (predeterminado 60 s), y lo suficientemente corto como para terminar pronto una vez que la máquina abra la puerta."
} }
}, },
"setting_group": { "setting_group": {
@@ -1604,6 +1673,10 @@
"name_required": "Nombre requerido", "name_required": "Nombre requerido",
"no_split_found": "No se encontraron espacios inactivos para dividir", "no_split_found": "No se encontraron espacios inactivos para dividir",
"panel_settings_saved": "Configuración del panel guardada", "panel_settings_saved": "Configuración del panel guardada",
"pg_preset_loaded": "Preajuste \"{name}\" cargado",
"pg_preset_saved": "Preajuste \"{name}\" guardado",
"pg_sugg_loaded": "{n} valor(es) sugerido(s) cargado(s) - ejecute la Zona de pruebas para comparar",
"pg_sugg_ml_loaded": "{n} valor(es) calibrado(s) por ML cargado(s) - ejecute la Zona de pruebas para comparar",
"phase_name_required": "Se requiere el nombre de la fase", "phase_name_required": "Se requiere el nombre de la fase",
"phase_updated": "Fase actualizada", "phase_updated": "Fase actualizada",
"phases_saved": "Fases guardadas", "phases_saved": "Fases guardadas",
@@ -1751,6 +1824,7 @@
"min_active": "Según la potencia activa mínima ({min}W) observada en el último ciclo.", "min_active": "Según la potencia activa mínima ({min}W) observada en el último ciclo.",
"min_duration_ratio": "Se mantiene lo más bajo posible para que un programa se reconozca pronto en el ciclo; los umbrales de confianza y ambigüedad evitan decisiones prematuras.", "min_duration_ratio": "Se mantiene lo más bajo posible para que un programa se reconozca pronto en el ciclo; los umbrales de confianza y ambigüedad evitan decisiones prematuras.",
"min_off_gap": "Según {gaps} intervalos entre ciclos observados (p05={p05}s). Mínimo del dispositivo: {floor}s.", "min_off_gap": "Según {gaps} intervalos entre ciclos observados (p05={p05}s). Mínimo del dispositivo: {floor}s.",
"min_off_gap_bridge": "Dimensionado para cubrir el periodo de silencio más largo dentro de un ciclo: {span}s + 60s de margen, a partir de {spans} intervalos cubiertos en {cycles} ciclos limpios (se mantiene por debajo de su intervalo mínimo de {ceiling}s entre cargas consecutivas).",
"min_power": "40% de la potencia activa más baja en el p05 ({p05}W) en {cycles} ciclos limpios, manteniendo el umbral de apagado por debajo del consumo real.{excl}", "min_power": "40% de la potencia activa más baja en el p05 ({p05}W) en {cycles} ciclos limpios, manteniendo el umbral de apagado por debajo del consumo real.{excl}",
"ml_auto_label": "Confianza más baja que el modelo de calidad aún consideró limpia (p10 de {cycles} ciclos limpios = {p10}).", "ml_auto_label": "Confianza más baja que el modelo de calidad aún consideró limpia (p10 de {cycles} ciclos limpios = {p10}).",
"ml_end_repeat": "{false}/{total} ciclos ({pct}%) tuvieron una pausa que el detector de fin puntuó >50%; se requieren {val} confirmación(es) de fin.", "ml_end_repeat": "{false}/{total} ciclos ({pct}%) tuvieron una pausa que el detector de fin puntuó >50%; se requieren {val} confirmación(es) de fin.",
@@ -1767,7 +1841,7 @@
"thr_batch": "Se mantiene justo por encima de la potencia activa más baja en el p05 en {cycles} ciclos ({p05}W) para captar un arranque lo antes posible y que el umbral de parada quede por debajo de la potencia de funcionamiento más baja de la máquina.", "thr_batch": "Se mantiene justo por encima de la potencia activa más baja en el p05 en {cycles} ciclos ({p05}W) para captar un arranque lo antes posible y que el umbral de parada quede por debajo de la potencia de funcionamiento más baja de la máquina.",
"tol_per_profile": "p75 de la varianza de duración por perfil en {profiles} perfiles ({cycles} ciclos); los perfiles ajustados no se penalizan.", "tol_per_profile": "p75 de la varianza de duración por perfil en {profiles} perfiles ({cycles} ciclos); los perfiles ajustados no se penalizan.",
"tol_pooled": "Según la varianza de duración agrupada de {cycles} ciclos etiquetados recientes (desviación p95={dev}).", "tol_pooled": "Según la varianza de duración agrupada de {cycles} ciclos etiquetados recientes (desviación p95={dev}).",
"watchdog": "Se mantiene lo más bajo que resulta seguro (3x el intervalo de actualización p95 de {p95}s, mín. 30s) para detectar rápido los bloqueos sin paradas falsas." "watchdog": "Se mantiene lo más bajo que resulta seguro (justo por encima del intervalo de actualización p95 de {p95}s, mín. 30s) para detectar rápido los bloqueos sin paradas falsas."
}, },
"exclusions": { "exclusions": {
"summary": "Excluido(s) {total} ciclo(s) mal detectado(s): {parts}.", "summary": "Excluido(s) {total} ciclo(s) mal detectado(s): {parts}.",
@@ -1944,5 +2018,53 @@
"hide_guidance": "Ocultar guía", "hide_guidance": "Ocultar guía",
"show_guidance": "Mostrar guía" "show_guidance": "Mostrar guía"
} }
},
"card": {
"min": "min",
"entity_not_found": "Entidad no encontrada",
"running_long": "Con retraso",
"remaining": "restante",
"progress": "progreso",
"show_time_remaining": "Mostrar tiempo restante",
"show_percentage": "Mostrar porcentaje",
"layout": {
"tile": "Mosaico (compacto)",
"detail": "Detalle (completo)",
"glance": "Vistazo (varios dispositivos)"
},
"btn": {
"pause": "Pausa",
"resume": "Reanudar",
"terminate": "Finalizar ciclo",
"record_start": "Iniciar grabación",
"record_stop": "Detener grabación",
"program": "Programa",
"open_panel": "Abrir WashData"
},
"editor": {
"layout": "Diseño",
"entity": "Entidad del electrodoméstico",
"entities": "Electrodomésticos",
"title": "Título",
"icon": "Icono",
"show_state": "Mostrar estado",
"show_program": "Mostrar programa",
"show_progress_bar": "Mostrar barra de progreso",
"spin_icon": "Girar el icono mientras funciona",
"display_mode": "Línea de detalle",
"active_color": "Color activo personalizado",
"show_phase": "Mostrar fase",
"show_energy": "Mostrar energía y costo",
"show_anomaly": "Mostrar aviso de retraso",
"show_sparkline": "Mostrar gráfico de potencia en directo",
"buttons": "Botones de acción",
"program_entity": "Entidad de programa (personalizada)",
"time_entity": "Entidad de tiempo (personalizada)",
"pct_entity": "Entidad de progreso (personalizada)",
"power_entity": "Entidad de potencia (personalizada)",
"tap_action": "Acción al tocar",
"hold_action": "Acción al mantener pulsado",
"double_tap_action": "Acción al tocar dos veces"
}
} }
} }
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Olemit ei leitud",
"running_long": "Töötab kaua",
"remaining": "jäänud",
"progress": "edenemine",
"show_time_remaining": "Näita järelejäänud aega",
"show_percentage": "Näita protsenti",
"layout": {
"tile": "Paan (kompaktne)",
"detail": "Detailne (rikkalik)",
"glance": "Pilguheit (mitu seadet)"
},
"btn": {
"pause": "Peata",
"resume": "Jätka",
"terminate": "Lõpeta tsükkel",
"record_start": "Alusta salvestamist",
"record_stop": "Lõpeta salvestamine",
"program": "Programm",
"open_panel": "Ava WashData"
},
"editor": {
"layout": "Paigutus",
"entity": "Seadme olem",
"entities": "Seadmed",
"title": "Pealkiri",
"icon": "Ikoon",
"show_state": "Näita olekut",
"show_program": "Näita programmi",
"show_progress_bar": "Näita edenemisriba",
"spin_icon": "Pööra ikooni töötamise ajal",
"display_mode": "Detailirida",
"active_color": "Aktiivse värvi alistamine",
"show_phase": "Näita faasi",
"show_energy": "Näita energiat ja maksumust",
"show_anomaly": "Näita ületusaja hoiatust",
"show_sparkline": "Näita reaalajas võimsuse graafikut",
"buttons": "Tegevusnupud",
"program_entity": "Programmi olem (alistamine)",
"time_entity": "Aja olem (alistamine)",
"pct_entity": "Edenemise olem (alistamine)",
"power_entity": "Võimsuse olem (alistamine)",
"tap_action": "Puudutuse tegevus",
"hold_action": "Hoidmise tegevus",
"double_tap_action": "Topeltpuudutuse tegevus"
}
},
"badge": { "badge": {
"artifact_tip": "Tuvastati {n} anomaaliat (nt uks avati tsükli keskel) avage, et näha neid graafikul", "artifact_tip": "Tuvastati {n} anomaaliat (nt uks avati tsükli keskel) avage, et näha neid graafikul",
"auto": "(tuvastatud automaatselt)", "auto": "(tuvastatud automaatselt)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Peata käimasolev tsükkel seade jätkab sealt, kus pooleli jäi", "pause_cycle_tip": "Peata käimasolev tsükkel seade jätkab sealt, kus pooleli jäi",
"pg_apply_device": "Rakenda seadmele", "pg_apply_device": "Rakenda seadmele",
"pg_autofill": "Täida automaatselt", "pg_autofill": "Täida automaatselt",
"pg_load_calibrated": "Laadi kalibreeritud (ML) ({n})",
"pg_load_calibrated_tip": "Laeb ML-kalibreeritud seaded katseala alistustena",
"pg_load_live": "Laadi aktiivsed seaded",
"pg_load_live_tip": "Loe integratsiooni praegused seaded uuesti ja tühista kõik katseala muudatused",
"pg_load_suggested": "Laadi soovitused ({n})",
"pg_load_suggested_tip": "Laeb automaatse häälestaja praegused soovitused katseala alistustena",
"pg_preset_delete": "Kustuta eelseadistus",
"pg_preset_load": "Laadi eelseadistus",
"pg_preset_load_tip": "Asenda katseala väärtused selle eelseadistusega (aktiivseid seadeid ei muudeta)",
"pg_preset_save": "Salvesta eelseadistusena",
"pg_preset_save_tip": "Salvesta kõik allolevad väärtused selle seadme nimelise eelseadistusena",
"pg_publish_all": "Salvesta seadetesse ({n})",
"pg_publish_one": "Salvesta \"{label}\" integratsiooni seadetesse",
"play": "Esita", "play": "Esita",
"process": "Töötle", "process": "Töötle",
"process_history": "Töötle kohe", "process_history": "Töötle kohe",
@@ -178,7 +239,9 @@
"download_export": "Laadi eksport alla", "download_export": "Laadi eksport alla",
"analyze_import": "Analüüsi faili", "analyze_import": "Analüüsi faili",
"import_selected": "Impordi valitud", "import_selected": "Impordi valitud",
"back": "Tagasi" "back": "Tagasi",
"mute_suggestion": "Lõpeta selle seade soovitamine",
"reset_muted": "Lähtesta vaigistatud"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,8 +338,9 @@
"no_automations": "Sellele seadmele ei viita veel ükski automaatika.", "no_automations": "Sellele seadmele ei viita veel ükski automaatika.",
"panel_settings": "Paneeli sätted", "panel_settings": "Paneeli sätted",
"param_sweep": "Parameetri pühkimine", "param_sweep": "Parameetri pühkimine",
"pg_settings_source": "Seadete allikas",
"phase_catalog": "Faaside kataloog", "phase_catalog": "Faaside kataloog",
"playground": "Mänguväljak", "playground": "Katseala",
"process_history": "Protsessi ajalugu", "process_history": "Protsessi ajalugu",
"settings_history": "Seadete ajalugu", "settings_history": "Seadete ajalugu",
"status": "Olek", "status": "Olek",
@@ -415,6 +479,9 @@
"pg_match_score": "Vaste skoor", "pg_match_score": "Vaste skoor",
"pg_pct_of": "{p}% {total}-st", "pg_pct_of": "{p}% {total}-st",
"pg_poor_match": "Halb vaste", "pg_poor_match": "Halb vaste",
"pg_preset": "Katseala eelseadistus",
"pg_preset_name": "Uue eelseadistuse nimi",
"pg_preset_none": "Vali eelseadistus…",
"pg_strong_match": "Tugev vaste", "pg_strong_match": "Tugev vaste",
"pg_tile_ambiguous": "Ebaselge", "pg_tile_ambiguous": "Ebaselge",
"pg_tile_ambiguous_tip": "Tsüklid, kus kaks programmi on peaaegu võrdsed", "pg_tile_ambiguous_tip": "Tsüklid, kus kaks programmi on peaaegu võrdsed",
@@ -609,7 +676,8 @@
"conflict_resolution": "Nimekonfliktid", "conflict_resolution": "Nimekonfliktid",
"conflict_import_copy": "Impordi koopiana", "conflict_import_copy": "Impordi koopiana",
"conflict_keep_mine": "Säilita minu omad", "conflict_keep_mine": "Säilita minu omad",
"conflict_overwrite": "Kirjuta üle" "conflict_overwrite": "Kirjuta üle",
"font_size": "Paneeli fondi suurus"
}, },
"log": { "log": {
"all_levels": "Kõik tasemed", "all_levels": "Kõik tasemed",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Kas rakendada parim väärtus: {label} = {value}?", "pg_apply_confirm": "Kas rakendada parim väärtus: {label} = {value}?",
"pg_canvas_empty": "Vali ülalt tsükkel ja vajuta seejärel Laadi, et näha selle võimsuskõverat.", "pg_canvas_empty": "Vali ülalt tsükkel ja vajuta seejärel Laadi, et näha selle võimsuskõverat.",
"pg_chart_caption": "Tuvastus-/vastemäär {param} väärtuste lõikes", "pg_chart_caption": "Tuvastus-/vastemäär {param} väärtuste lõikes",
"pg_ctrl_intro": "Väärtused lähtuvad selle seadme aktiivsetest integratsiooni seadetest. Muudatused jäävad katsealale, kuni salvestad need seadetesse.",
"pg_live_unavailable": "Aktiivsed seaded pole saadaval, kuvatakse vaikeväärtused.",
"pg_load_live_confirm": "Kas tühistada katseala muudatused ({n}) ja laadida integratsiooni praegused seaded uuesti?",
"pg_match_rate": "{pct}% vastemäär {total} tsükli puhul", "pg_match_rate": "{pct}% vastemäär {total} tsükli puhul",
"pg_matches_live": "Vastab aktiivsetele seadetele",
"pg_n_changed": "Erineb aktiivsetest seadetest: {n}",
"pg_sugg_none": "Kõik soovitused vastavad juba praegustele seadetele",
"pg_preset_delete_confirm": "Kas kustutada eelseadistus \"{name}\"?",
"pg_preset_limit": "Eelseadistuste piir on täis ({n})",
"pg_preset_overwrite": "Kas kirjutada eelseadistus \"{name}\" üle?",
"pg_publish_one_confirm": "Kas salvestada {label} = {value} selle seadme seadetesse?",
"pg_restart_note": "Simulatsioonitööriistade lubamiseks taaskäivita Home Assistant.", "pg_restart_note": "Simulatsioonitööriistade lubamiseks taaskäivita Home Assistant.",
"pg_sim_progress": "{done} / {total} tsüklit", "pg_sim_progress": "{done} / {total} tsüklit",
"pg_starting": "Alustamine…", "pg_starting": "Alustamine…",
@@ -784,7 +862,7 @@
"pg_verdict_ok": "Vastuvõetav: mõned tsüklid jäid vahele. Proovi käivitusläve alandada.", "pg_verdict_ok": "Vastuvõetav: mõned tsüklid jäid vahele. Proovi käivitusläve alandada.",
"phase_catalog_intro": "Nimetatud tsükli segmendid (eelpesu, kuumutamine, tsentrifuugimine…). Määrake need juhtpaneelilt profiilile.", "phase_catalog_intro": "Nimetatud tsükli segmendid (eelpesu, kuumutamine, tsentrifuugimine…). Määrake need juhtpaneelilt profiilile.",
"phase_ranges_intro": "Faasivahemikud (minutid alates tsükli algusest) kattuvad keskmise kõveraga. Reaalajas eelvaate kuvamiseks muutke väärtusi.", "phase_ranges_intro": "Faasivahemikud (minutid alates tsükli algusest) kattuvad keskmise kõveraga. Reaalajas eelvaate kuvamiseks muutke väärtusi.",
"playground_intro": "Turvaline katsekeskkond varasemate tsüklite uuesti esitamiseks erinevate seadetega, kahe seadistuse kõrvuti võrdlemiseks ja selle uurimiseks, kuidas tsükkel profiiliga joondub. Miski siin ei muuda su otseandmeid enne, kui sa selle sõnaselgelt rakendad.", "playground_intro": "Turvaline katseala varasemate tsüklite uuesti esitamiseks erinevate seadetega, kahe seadistuse kõrvuti võrdlemiseks ja selle uurimiseks, kuidas tsükkel profiiliga joondub. Miski siin ei muuda su otseandmeid enne, kui sa selle sõnaselgelt rakendad.",
"playground_needs_restart": "Katseala tööriistade lubamiseks taaskäivita Home Assistant.", "playground_needs_restart": "Katseala tööriistade lubamiseks taaskäivita Home Assistant.",
"preferences_admin": "Eelistused, paneel ja juurdepääsu kontroll", "preferences_admin": "Eelistused, paneel ja juurdepääsu kontroll",
"preferences_adv": "Eelistused", "preferences_adv": "Eelistused",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Kestus on lühem ({pct}%/tsükkel) hiljutine keskmine {avg}", "trend_duration_shorter": "Kestus on lühem ({pct}%/tsükkel) hiljutine keskmine {avg}",
"trend_energy_down": "Energiatrend langeb ({pct}% tsükli kohta)", "trend_energy_down": "Energiatrend langeb ({pct}% tsükli kohta)",
"trend_energy_up": "Energiatrend tõuseb ({pct}%/tsükkel) hiljutine keskmine {avg}", "trend_energy_up": "Energiatrend tõuseb ({pct}%/tsükkel) hiljutine keskmine {avg}",
"trim_destructive_confirm": "See säilitab tsüklist ainult {pct}% ja seda ei saa tagasi võtta. Kas jätkata?",
"trim_intro": "Lohistage punaseid käepidemeid või sisestage väärtused. Kõik väljaspool akent eemaldatakse.", "trim_intro": "Lohistage punaseid käepidemeid või sisestage väärtused. Kõik väljaspool akent eemaldatakse.",
"tuning_suggestions_available": "Vaadeldud tsüklitest on saadaval {count} häälestamise soovitus. Need kuvatakse asjakohaste väljade kõrval.", "tuning_suggestions_available": "Vaadeldud tsüklitest on saadaval {count} häälestamise soovitus. Need kuvatakse asjakohaste väljade kõrval.",
"unsure_detected_prefix": "WashData pole kindel, et see tuvastas", "unsure_detected_prefix": "WashData pole kindel, et see tuvastas",
@@ -922,9 +1001,15 @@
"merge_hint": "Imporditud üksused lisatakse; kohalikest andmetest ei lähe midagi kaotsi. Nimekonfliktid lahendatakse allpool.", "merge_hint": "Imporditud üksused lisatakse; kohalikest andmetest ei lähe midagi kaotsi. Nimekonfliktid lahendatakse allpool.",
"replace_warn": "Iga märgitud kategooria kustutatakse ja asendatakse failist. Märkimata kategooriaid ei puudutata.", "replace_warn": "Iga märgitud kategooria kustutatakse ja asendatakse failist. Märkimata kategooriaid ei puudutata.",
"dest_reference_hint": "Imporditud tsüklid ainult parandavad programmide tuvastamist ega mõjuta kunagi kasutus- ega energiastatistikat.", "dest_reference_hint": "Imporditud tsüklid ainult parandavad programmide tuvastamist ega mõjuta kunagi kasutus- ega energiastatistikat.",
"dest_real_history_hint": "Imporditud tsüklid arvestatakse selle seadme enda ajalooks ja need toidavad energia- ja kasutusstatistikat. Kasuta ühe seadme uude paigaldusse teisaldamiseks." "dest_real_history_hint": "Imporditud tsüklid arvestatakse selle seadme enda ajalooks ja need toidavad energia- ja kasutusstatistikat. Kasuta ühe seadme uude paigaldusse teisaldamiseks.",
"sug_muted": "Seda seadet enam ei soovitata",
"sug_mute_failed": "Soovituse vaigistamine ebaõnnestus",
"sug_unmuted_all": "Vaigistatud soovitused lähtestatud",
"n_suggestions_muted": "{count} vaigistatud; automaatne häälestaja ei paku neid enam.",
"font_size_hint": "Muuda kõik selles paneelil suuremaks või väiksemaks. Kehtib sinu kontole sellel seadmel."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Nõudepesumasin: vaiksed sekundid pärast eeldatavat kestust, enne kui tsükli lõpu tühjenduse ootamine vabastatakse",
"anti_wrinkle_enabled": "Neelab pärast põhifaasi trummelimpulsid, selle asemel et lugeda neid uute tsüklitena", "anti_wrinkle_enabled": "Neelab pärast põhifaasi trummelimpulsid, selle asemel et lugeda neid uute tsüklitena",
"anti_wrinkle_exit_power": "Kortsudevastase režiimi aktiivsena püsimiseks peab võimsus impulsside vahel sellest allapoole langema", "anti_wrinkle_exit_power": "Kortsudevastase režiimi aktiivsena püsimiseks peab võimsus impulsside vahel sellest allapoole langema",
"anti_wrinkle_idle_timeout": "Kahe trummelimpulsi vahel lubatud vaikuseaeg enne kortsudevastase režiimi lõppu", "anti_wrinkle_idle_timeout": "Kahe trummelimpulsi vahel lubatud vaikuseaeg enne kortsudevastase režiimi lõppu",
@@ -998,6 +1083,10 @@
"unusable": "Kasutuskõlbmatu" "unusable": "Kasutuskõlbmatu"
}, },
"section": { "section": {
"dishwasher": {
"label": "Nõudepesumasin",
"intro": "Tsükli lõpu käsitlemine nõudepesumasinate jaoks, mis tavaliselt lõpevad pika, peaaegu hääletu kuivatusfaasiga enne lühikest lõplikku tühjendust."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Kortsudevastane/kroomievastane režiim tuvastab madalvõimsusega trummelpulsid pärast põhifaasi ja hoiab need lõppenud tsükliga seotud.", "intro": "Kortsudevastane/kroomievastane režiim tuvastab madalvõimsusega trummelpulsid pärast põhifaasi ja hoiab need lõppenud tsükliga seotud.",
"label": "Kortsudevastane" "label": "Kortsudevastane"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Passiivkuivatuse vaikne vabastamine",
"doc": "Kui tsükkel ületab oma eeldatava kestuse, siis kui kaua peab nõudepesumasin püsima vaikne (allpool Peatumise Lävi), enne kui WashData lõpetab lõpliku tühjenduse ootamise ja lõpetab tsükli. Suurendage seda, kui teie masinal on pikk vaikne kuivatusfaas enne hilist lõplikku tühjendust, mis jääb märkamata - laiem aken laseb õpitud kestusel järgida hooajalist triivi (külmem sissevoolav vesi = pikemad tsüklid), selle asemel et lukustuda vana keskmise külge. See saab ooteaega üksnes lühendada võrreldes sisemise 30-minutilise lõpupiigi ülempiiriga, mitte kunagi seda pikendada."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Tuvastage lühikesed väikese võimsusega trummelimpulsid, mida kuivati pärast peamist kuumutusfaasi kiirgab, ja hoidke need valmis tsükliga ühendatud, selle asemel, et lugeda neid uute tsüklitena.", "doc": "Tuvastage lühikesed väikese võimsusega trummelimpulsid, mida kuivati pärast peamist kuumutusfaasi kiirgab, ja hoidke need valmis tsükliga ühendatud, selle asemel, et lugeda neid uute tsüklitena.",
"label": "Luba Kortsudevastane Tuvastamine" "label": "Luba Kortsudevastane Tuvastamine"
@@ -1260,6 +1353,10 @@
"doc": "Minutid pärast tsükli lõppu enne veel ootava \"masina mahalaadimise\" meeldetuletuse saatmist. Meeldetuletuse keelamiseks määrake 0.", "doc": "Minutid pärast tsükli lõppu enne veel ootava \"masina mahalaadimise\" meeldetuletuse saatmist. Meeldetuletuse keelamiseks määrake 0.",
"label": "Mahalaadimise Meeldetuletuse Viivitus" "label": "Mahalaadimise Meeldetuletuse Viivitus"
}, },
"notify_unload_repeat": {
"doc": "Saadab mahalaadimise meeldetuletuse iga \"Mahalaadimise Meeldetuletuse Viivitus\" minuti järel uuesti, kuni avate ukse või puudutate teavituses nuppu \"Lõpeta meeldetuletused\". Nõuab ukse anduri olemit (nagu ka meeldetuletus ise). Loobumisnupp toimib Home Assistant kaaslasrakenduse (mobiili) teavitustes.",
"label": "Korda, kuni uks avaneb"
},
"off_delay": { "off_delay": {
"doc": "Aeg oodata pärast võimsuse langemist, enne kui tsükkel lõppenuks kuulutatakse. Kui toide taastub selles aknas, jätkub tsükkel sujuvalt see sillutab pause pesuetappide vahel. Nõudepesumasinal on pikad kuivatusfaasid (väljalülitamine 20-60 min), seega peab väljalülitamise viivitus ületama seda, et hoida kogu pesu+kuiv ühe tsüklina.", "doc": "Aeg oodata pärast võimsuse langemist, enne kui tsükkel lõppenuks kuulutatakse. Kui toide taastub selles aknas, jätkub tsükkel sujuvalt see sillutab pause pesuetappide vahel. Nõudepesumasinal on pikad kuivatusfaasid (väljalülitamine 20-60 min), seega peab väljalülitamise viivitus ületama seda, et hoida kogu pesu+kuiv ühe tsüklina.",
"label": "Väljalülitumise Viivitus" "label": "Väljalülitumise Viivitus"
@@ -1434,6 +1531,26 @@
"energy_scale": { "energy_scale": {
"label": "Energia teravus", "label": "Energia teravus",
"doc": "4. etapi energia vastavuse karistuse teravus. Väiksem = rangem: energia mittevastavus teeb rohkem kahju. Vaikimisi 0,25 on tahtlikult andelikum kui kestuse teravus, kuna energia varieerub koormuse järgi. Kasutage koos Energia kaaluga." "doc": "4. etapi energia vastavuse karistuse teravus. Väiksem = rangem: energia mittevastavus teeb rohkem kahju. Vaikimisi 0,25 on tahtlikult andelikum kui kestuse teravus, kuna energia varieerub koormuse järgi. Kasutage koos Energia kaaluga."
},
"power_profile_interval_min": {
"label": "Võimsusprofiilivahemik",
"doc": "Ämbri suurus profiili power_profile sensori atribuudile (tasane pesa kohta keskmiste vattide massiiv, mida kasutavad välised planeerijad nagu EMHASS ja tibber_prices). Väiksemad ämbrid hoiavad lühikesi võimsushüppeid teravana; suuremad ämbrid siluvad kuju. Vaikimisi 15 min. Ainult lugemisaeg; ei mõjuta tuvastust."
},
"notify_live_sticky": {
"label": "Hoia reaalajas teavitus puudutuse järel",
"doc": "Ainult Android. Tee reaalajas edenemise teavitus püsivaks (kleepuvaks), nii et selle puudutamine ei sulge käimasolevat lõime. Väljas hoiab vaikekäitumist, kus puudutamine teavituse sulgeb."
},
"notify_live_click_action": {
"label": "Reaalajas teavituse puudutamise sihtkoht",
"doc": "Ainult Android. Kuhu reaalajas edenemise teavituse puudutamine avab (nt /lovelace/laundry või täielik URL) rakenduse avalehe asemel. Vaikimisi jaoks jätke tühjaks."
},
"door_opens_at_end": {
"label": "Uks avaneb automaatselt lõpus",
"doc": "Nõudepesumasinatele, mis avavad tsükli lõpus ukse kuivatamiseks (AirDry ja sarnased). Selle sisselülitamisel ei peata ukse avamine käimasoleva tsükli ajal enam seda igaveseks; selle asemel, kui uks jääb alla sätestatud viibimisaja jooksul avatuks, loeb WashData tsükli lõppenuks. Lühike avamine (eseme lisamine) ignoreeritakse. Nõuab ukse anduri olendit."
},
"door_end_dwell_seconds": {
"label": "Ukse avamise lõppviibimisaeg",
"doc": "Kui kaua uks peab jääma avatuks, enne kui WashData tsükli lõpetab, kui \"Uks avaneb automaatselt lõpus\" on sisse lülitatud. Piisavalt pikk, et kiire taldrikute lisamine ignoreeritaks (vaikimisi 60 s), piisavalt lühike, et lõpetada kiiresti, kui masin ukse avab."
} }
}, },
"setting_group": { "setting_group": {
@@ -1604,6 +1721,10 @@
"name_required": "Nimi nõutav", "name_required": "Nimi nõutav",
"no_split_found": "Tühikäigulünki ei leitud, mille pealt poolitada", "no_split_found": "Tühikäigulünki ei leitud, mille pealt poolitada",
"panel_settings_saved": "Paneeli sätted salvestatud", "panel_settings_saved": "Paneeli sätted salvestatud",
"pg_preset_loaded": "Eelseadistus \"{name}\" laaditud",
"pg_preset_saved": "Eelseadistus \"{name}\" salvestatud",
"pg_sugg_loaded": "{n} soovitatud väärtus laaditud - võrdlemiseks käivita katseala",
"pg_sugg_ml_loaded": "{n} ML-kalibreeritud väärtus laaditud - võrdlemiseks käivita katseala",
"phase_name_required": "Etapi nimi on nõutav", "phase_name_required": "Etapi nimi on nõutav",
"phase_updated": "Faas värskendatud", "phase_updated": "Faas värskendatud",
"phases_saved": "Faasid salvestatud", "phases_saved": "Faasid salvestatud",
@@ -1751,6 +1872,7 @@
"min_active": "Põhineb viimases tsüklis täheldatud madalaimal aktiivvõimsusel ({min}W).", "min_active": "Põhineb viimases tsüklis täheldatud madalaimal aktiivvõimsusel ({min}W).",
"min_duration_ratio": "Hoitakse võimalikult madal, et programm tuvastataks tsükli alguses varakult; usaldus- ja mitmetimõistetavuse lävid hoiavad ära enneaegsed otsused.", "min_duration_ratio": "Hoitakse võimalikult madal, et programm tuvastataks tsükli alguses varakult; usaldus- ja mitmetimõistetavuse lävid hoiavad ära enneaegsed otsused.",
"min_off_gap": "Põhineb {gaps} täheldatud tsüklitevahelisel pausil (p05={p05}s). Seadme alampiir: {floor}s.", "min_off_gap": "Põhineb {gaps} täheldatud tsüklitevahelisel pausil (p05={p05}s). Seadme alampiir: {floor}s.",
"min_off_gap_bridge": "Mõõdetud nii, et katab tsükli pikima vaikse lõigu: {span}s + 60s puhver, {spans} sillatud vahest {cycles} puhta tsükli lõikes (jääb alla teie lühima järjestikuste käivituste vahelise pausi, mis on {ceiling}s).",
"min_power": "40% madalaimast aktiivvõimsusest p05 juures ({p05}W) {cycles} puhta tsükli lõikes, hoides väljalülituse läve alla tegeliku tarbimise.{excl}", "min_power": "40% madalaimast aktiivvõimsusest p05 juures ({p05}W) {cycles} puhta tsükli lõikes, hoides väljalülituse läve alla tegeliku tarbimise.{excl}",
"ml_auto_label": "Madalaim usaldusväärsus, mida kvaliteedimudel hindas veel puhtaks (p10 {cycles} puhtast tsüklist = {p10}).", "ml_auto_label": "Madalaim usaldusväärsus, mida kvaliteedimudel hindas veel puhtaks (p10 {cycles} puhtast tsüklist = {p10}).",
"ml_end_repeat": "{false}/{total} tsüklist ({pct}%) sisaldas pausi, millele lõputuvastaja andis >50%; nõuab {val} lõpukinnitust.", "ml_end_repeat": "{false}/{total} tsüklist ({pct}%) sisaldas pausi, millele lõputuvastaja andis >50%; nõuab {val} lõpukinnitust.",
@@ -1767,7 +1889,7 @@
"thr_batch": "Hoitakse veidi üle madalaima aktiivvõimsuse p05 juures {cycles} tsükli lõikes ({p05}W), et käivitus tuvastataks võimalikult vara ja seiskamislävi jääks alla masina madalaima töövõimsuse.", "thr_batch": "Hoitakse veidi üle madalaima aktiivvõimsuse p05 juures {cycles} tsükli lõikes ({p05}W), et käivitus tuvastataks võimalikult vara ja seiskamislävi jääks alla masina madalaima töövõimsuse.",
"tol_per_profile": "p75 profiilipõhisest kestuse dispersioonist {profiles} profiili lõikes ({cycles} tsüklit); kitsaid profiile ei karistata.", "tol_per_profile": "p75 profiilipõhisest kestuse dispersioonist {profiles} profiili lõikes ({cycles} tsüklit); kitsaid profiile ei karistata.",
"tol_pooled": "Põhineb {cycles} viimase märgistatud tsükli koondkestuse dispersioonil (p95 hälve={dev}).", "tol_pooled": "Põhineb {cycles} viimase märgistatud tsükli koondkestuse dispersioonil (p95 hälve={dev}).",
"watchdog": "Hoitakse nii madal kui ohutu (3x p95 uuendusintervall {p95}s, min 30s), et seiskumised tuvastataks kiiresti ilma valeseisakuteta." "watchdog": "Hoitakse nii madal kui ohutu (veidi üle p95 uuendusintervalli {p95}s, min 30s), et seiskumised tuvastataks kiiresti ilma valeseisakuteta."
}, },
"exclusions": { "exclusions": {
"summary": "Välja jäetud {total} valesti tuvastatud tsüklit: {parts}.", "summary": "Välja jäetud {total} valesti tuvastatud tsüklit: {parts}.",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entiteettiä ei löytynyt",
"running_long": "Käy pitkään",
"remaining": "jäljellä",
"progress": "edistyminen",
"show_time_remaining": "Näytä jäljellä oleva aika",
"show_percentage": "Näytä prosentti",
"layout": {
"tile": "Ruutu (kompakti)",
"detail": "Yksityiskohtainen (rikas)",
"glance": "Silmäys (useita laitteita)"
},
"btn": {
"pause": "Keskeytä",
"resume": "Jatka",
"terminate": "Lopeta jakso",
"record_start": "Aloita tallennus",
"record_stop": "Lopeta tallennus",
"program": "Ohjelma",
"open_panel": "Avaa WashData"
},
"editor": {
"layout": "Asettelu",
"entity": "Laitteen entiteetti",
"entities": "Laitteet",
"title": "Otsikko",
"icon": "Kuvake",
"show_state": "Näytä tila",
"show_program": "Näytä ohjelma",
"show_progress_bar": "Näytä edistymispalkki",
"spin_icon": "Pyöritä kuvaketta käynnissä ollessa",
"display_mode": "Yksityiskohtarivi",
"active_color": "Aktiivisen värin ohitus",
"show_phase": "Näytä vaihe",
"show_energy": "Näytä energia ja kustannukset",
"show_anomaly": "Näytä ylityksen varoitus",
"show_sparkline": "Näytä reaaliaikainen tehokaavio",
"buttons": "Toimintopainikkeet",
"program_entity": "Ohjelmaentiteetti (ohitus)",
"time_entity": "Aikaentiteetti (ohitus)",
"pct_entity": "Edistymisentiteetti (ohitus)",
"power_entity": "Tehoentiteetti (ohitus)",
"tap_action": "Napautustoiminto",
"hold_action": "Pitotoiminto",
"double_tap_action": "Kaksoisnapautustoiminto"
}
},
"badge": { "badge": {
"artifact_tip": "{n} poikkeavaa havaittu (esim. oven avautuminen kesken syklin) avaa nähdäksesi ne kaaviossa", "artifact_tip": "{n} poikkeavaa havaittu (esim. oven avautuminen kesken syklin) avaa nähdäksesi ne kaaviossa",
"auto": "(tunnistettu automaattisesti)", "auto": "(tunnistettu automaattisesti)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Keskeytä käynnissä oleva sykli laite jatkaa siitä, mihin se jäi", "pause_cycle_tip": "Keskeytä käynnissä oleva sykli laite jatkaa siitä, mihin se jäi",
"pg_apply_device": "Käytä laitteeseen", "pg_apply_device": "Käytä laitteeseen",
"pg_autofill": "Autotäyttö", "pg_autofill": "Autotäyttö",
"pg_load_calibrated": "Lataa kalibroidut (ML) ({n})",
"pg_load_calibrated_tip": "Lataa ML-kalibroidut asetukset testialueen ohituksina",
"pg_load_live": "Lataa aktiiviset asetukset",
"pg_load_live_tip": "Lue integraation nykyiset asetukset uudelleen ja hylkää kaikki testialueen muokkaukset",
"pg_load_suggested": "Lataa ehdotetut ({n})",
"pg_load_suggested_tip": "Lataa autovirittimen nykyiset ehdotukset testialueen ohituksina",
"pg_preset_delete": "Poista esiasetus",
"pg_preset_load": "Lataa esiasetus",
"pg_preset_load_tip": "Korvaa testialueen arvot tällä esiasetuksella (aktiivisiin asetuksiin ei kosketa)",
"pg_preset_save": "Tallenna esiasetuksena",
"pg_preset_save_tip": "Tallenna kaikki alla olevat arvot nimettynä esiasetuksena tälle laitteelle",
"pg_publish_all": "Tallenna asetuksiin ({n})",
"pg_publish_one": "Tallenna \"{label}\" integraation asetuksiin",
"play": "Toista", "play": "Toista",
"process": "Käsittele", "process": "Käsittele",
"process_history": "Käsittele nyt", "process_history": "Käsittele nyt",
@@ -178,7 +239,9 @@
"download_export": "Lataa vienti", "download_export": "Lataa vienti",
"analyze_import": "Analysoi tiedosto", "analyze_import": "Analysoi tiedosto",
"import_selected": "Tuo valitut", "import_selected": "Tuo valitut",
"back": "Takaisin" "back": "Takaisin",
"mute_suggestion": "Lopeta tämän asetuksen ehdottaminen",
"reset_muted": "Palauta vaiennetut"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,8 +338,9 @@
"no_automations": "Mikään automaatio ei viittaa tähän laitteeseen vielä.", "no_automations": "Mikään automaatio ei viittaa tähän laitteeseen vielä.",
"panel_settings": "Paneelin asetukset", "panel_settings": "Paneelin asetukset",
"param_sweep": "Parametripyyhkäisy", "param_sweep": "Parametripyyhkäisy",
"pg_settings_source": "Asetusten lähde",
"phase_catalog": "Vaiheen katalogi", "phase_catalog": "Vaiheen katalogi",
"playground": "Leikkikenttä", "playground": "Testialue",
"process_history": "Prosessihistoria", "process_history": "Prosessihistoria",
"settings_history": "Asetusten historia", "settings_history": "Asetusten historia",
"status": "Tila", "status": "Tila",
@@ -415,6 +479,9 @@
"pg_match_score": "Osumapisteet", "pg_match_score": "Osumapisteet",
"pg_pct_of": "{p} % / {total}", "pg_pct_of": "{p} % / {total}",
"pg_poor_match": "Huono osuma", "pg_poor_match": "Huono osuma",
"pg_preset": "Testialueen esiasetus",
"pg_preset_name": "Uuden esiasetuksen nimi",
"pg_preset_none": "Valitse esiasetus…",
"pg_strong_match": "Vahva osuma", "pg_strong_match": "Vahva osuma",
"pg_tile_ambiguous": "Epäselvä", "pg_tile_ambiguous": "Epäselvä",
"pg_tile_ambiguous_tip": "Syklit, joissa kaksi ohjelmaa ovat lähes tasoissa", "pg_tile_ambiguous_tip": "Syklit, joissa kaksi ohjelmaa ovat lähes tasoissa",
@@ -609,7 +676,8 @@
"conflict_resolution": "Nimien törmäykset", "conflict_resolution": "Nimien törmäykset",
"conflict_import_copy": "Tuo kopiona", "conflict_import_copy": "Tuo kopiona",
"conflict_keep_mine": "Säilytä omat", "conflict_keep_mine": "Säilytä omat",
"conflict_overwrite": "Korvaa" "conflict_overwrite": "Korvaa",
"font_size": "Paneelin fonttikoko"
}, },
"log": { "log": {
"all_levels": "Kaikki tasot", "all_levels": "Kaikki tasot",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Otetaanko paras arvo käyttöön: {label} = {value}?", "pg_apply_confirm": "Otetaanko paras arvo käyttöön: {label} = {value}?",
"pg_canvas_empty": "Valitse sykli yltä ja paina sitten Lataa nähdäksesi sen tehokäyrän.", "pg_canvas_empty": "Valitse sykli yltä ja paina sitten Lataa nähdäksesi sen tehokäyrän.",
"pg_chart_caption": "Tunnistus-/osumaprosentti {param}-arvojen mukaan", "pg_chart_caption": "Tunnistus-/osumaprosentti {param}-arvojen mukaan",
"pg_ctrl_intro": "Arvot pohjautuvat tämän laitteen aktiivisiin integraation asetuksiin. Muokkaukset jäävät testialueelle, kunnes tallennat ne asetuksiin.",
"pg_live_unavailable": "Aktiiviset asetukset eivät ole käytettävissä, näytetään oletusarvot.",
"pg_load_live_confirm": "Hylätäänkö testialueen muokkaukset ({n}) ja ladataanko integraation nykyiset asetukset uudelleen?",
"pg_match_rate": "{pct}% osumaprosentti {total} syklillä", "pg_match_rate": "{pct}% osumaprosentti {total} syklillä",
"pg_matches_live": "Vastaa aktiivisia asetuksia",
"pg_n_changed": "Poikkeaa aktiivisista asetuksista: {n}",
"pg_sugg_none": "Kaikki ehdotukset vastaavat jo nykyisiä asetuksia",
"pg_preset_delete_confirm": "Poistetaanko esiasetus \"{name}\"?",
"pg_preset_limit": "Esiasetusten enimmäismäärä täynnä ({n})",
"pg_preset_overwrite": "Korvataanko esiasetus \"{name}\"?",
"pg_publish_one_confirm": "Tallennetaanko {label} = {value} tämän laitteen asetuksiin?",
"pg_restart_note": "Käynnistä Home Assistant uudelleen ottaaksesi simulointityökalut käyttöön.", "pg_restart_note": "Käynnistä Home Assistant uudelleen ottaaksesi simulointityökalut käyttöön.",
"pg_sim_progress": "{done} / {total} sykliä", "pg_sim_progress": "{done} / {total} sykliä",
"pg_starting": "Aloitetaan…", "pg_starting": "Aloitetaan…",
@@ -784,8 +862,8 @@
"pg_verdict_ok": "Hyväksyttävä: osa sykleistä jäi huomaamatta. Kokeile laskea aloituskynnystä.", "pg_verdict_ok": "Hyväksyttävä: osa sykleistä jäi huomaamatta. Kokeile laskea aloituskynnystä.",
"phase_catalog_intro": "Jakson nimetyt osat (esipesu, lämmitys, linkous…). Määritä ne profiiliin sen ohjauspaneelista.", "phase_catalog_intro": "Jakson nimetyt osat (esipesu, lämmitys, linkous…). Määritä ne profiiliin sen ohjauspaneelista.",
"phase_ranges_intro": "Vaihealueet (minuutit syklin alusta) peittyvät keskiarvokäyrällä. Muokkaa arvoja esikatsellaksesi livenä.", "phase_ranges_intro": "Vaihealueet (minuutit syklin alusta) peittyvät keskiarvokäyrällä. Muokkaa arvoja esikatsellaksesi livenä.",
"playground_intro": "Turvallinen hiekkalaatikko aiempien syklien toistamiseen eri asetuksilla, kahden kokoonpanon vertailuun rinnakkain ja sen tarkasteluun, miten sykli kohdistuu profiiliin. Mikään tässä ei muuta live-tietojasi ennen kuin otat sen nimenomaisesti käyttöön.", "playground_intro": "Turvallinen testialue aiempien syklien toistamiseen eri asetuksilla, kahden kokoonpanon vertailuun rinnakkain ja sen tarkasteluun, miten sykli kohdistuu profiiliin. Mikään tässä ei muuta live-tietojasi ennen kuin otat sen nimenomaisesti käyttöön.",
"playground_needs_restart": "Käynnistä Home Assistant uudelleen ottaaksesi Hiekkalaatikko-työkalut käyttöön.", "playground_needs_restart": "Käynnistä Home Assistant uudelleen ottaaksesi Testialueen työkalut käyttöön.",
"preferences_admin": "Asetukset, paneeli ja kulunvalvonta", "preferences_admin": "Asetukset, paneeli ja kulunvalvonta",
"preferences_adv": "Asetukset", "preferences_adv": "Asetukset",
"prefs_personal": "Nämä koskevat vain Home Assistant -tiliäsi.", "prefs_personal": "Nämä koskevat vain Home Assistant -tiliäsi.",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Kesto trendi lyhyempi ({pct}%/sykli) viimeaikainen keskim. {avg}", "trend_duration_shorter": "Kesto trendi lyhyempi ({pct}%/sykli) viimeaikainen keskim. {avg}",
"trend_energy_down": "Energia laskee ({pct} %/sykli)", "trend_energy_down": "Energia laskee ({pct} %/sykli)",
"trend_energy_up": "Energiatrendi nousussa ({pct} %/sykli) viimeaikainen keskiarvo {avg}", "trend_energy_up": "Energiatrendi nousussa ({pct} %/sykli) viimeaikainen keskiarvo {avg}",
"trim_destructive_confirm": "Tämä säilyttää vain {pct}% syklistä. Tätä ei voi kumota. Jatketaanko?",
"trim_intro": "Vedä punaisia kahvoja tai syötä arvot. Kaikki ikkunan ulkopuolella poistetaan.", "trim_intro": "Vedä punaisia kahvoja tai syötä arvot. Kaikki ikkunan ulkopuolella poistetaan.",
"tuning_suggestions_available": "{count} viritysehdotus saatavilla havaituista sykleistä. Ne näkyvät asianmukaisten kenttien vieressä.", "tuning_suggestions_available": "{count} viritysehdotus saatavilla havaituista sykleistä. Ne näkyvät asianmukaisten kenttien vieressä.",
"unsure_detected_prefix": "WashData ei ole varma, onko se havaittu", "unsure_detected_prefix": "WashData ei ole varma, onko se havaittu",
@@ -922,9 +1001,15 @@
"merge_hint": "Tuodut kohteet lisätään; mitään paikallista ei menetetä. Nimien törmäykset ratkaistaan alla.", "merge_hint": "Tuodut kohteet lisätään; mitään paikallista ei menetetä. Nimien törmäykset ratkaistaan alla.",
"replace_warn": "Jokainen rastitettu luokka tyhjennetään ja korvataan tiedostosta. Rastittamattomia luokkia ei kosketa.", "replace_warn": "Jokainen rastitettu luokka tyhjennetään ja korvataan tiedostosta. Rastittamattomia luokkia ei kosketa.",
"dest_reference_hint": "Tuodut jaksot vain parantavat ohjelmien tunnistusta eivätkä koskaan vaikuta käyttö- tai energiatilastoihin.", "dest_reference_hint": "Tuodut jaksot vain parantavat ohjelmien tunnistusta eivätkä koskaan vaikuta käyttö- tai energiatilastoihin.",
"dest_real_history_hint": "Tuodut jaksot lasketaan tämän laitteen omaksi historiaksi ja syöttävät energia- ja käyttötilastoja. Käytä tätä, kun siirrät yhden laitteen uuteen asennukseen." "dest_real_history_hint": "Tuodut jaksot lasketaan tämän laitteen omaksi historiaksi ja syöttävät energia- ja käyttötilastoja. Käytä tätä, kun siirrät yhden laitteen uuteen asennukseen.",
"sug_muted": "Tätä asetusta ei enää ehdoteta",
"sug_mute_failed": "Ehdotuksen vaimennus epäonnistui",
"sug_unmuted_all": "Vaiennetut ehdotukset palautettu",
"n_suggestions_muted": "{count} vaimennettu; automaattinen virittäjä ei ehdota näitä.",
"font_size_hint": "Suurenna tai pienennä kaikkea tässä paneelissa. Koskee tiliäsi tällä laitteella."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Astianpesukone: hiljaiset sekunnit odotetun keston jälkeen ennen kuin syklin lopun vedenpoiston odotus vapautetaan",
"anti_wrinkle_enabled": "Sulauta päävaiheen jälkeiset rumpupulssit sen sijaan, että lukisit ne uusina sykleinä", "anti_wrinkle_enabled": "Sulauta päävaiheen jälkeiset rumpupulssit sen sijaan, että lukisit ne uusina sykleinä",
"anti_wrinkle_exit_power": "Tehon on laskettava tämän alle pulssien välillä, jotta ryppyjenesto pysyy aktiivisena", "anti_wrinkle_exit_power": "Tehon on laskettava tämän alle pulssien välillä, jotta ryppyjenesto pysyy aktiivisena",
"anti_wrinkle_idle_timeout": "Kahden rumpupulssin välillä sallittu hiljainen aika ennen kuin ryppyjenesto päättyy", "anti_wrinkle_idle_timeout": "Kahden rumpupulssin välillä sallittu hiljainen aika ennen kuin ryppyjenesto päättyy",
@@ -998,6 +1083,10 @@
"unusable": "Käyttämätön" "unusable": "Käyttämätön"
}, },
"section": { "section": {
"dishwasher": {
"label": "Astianpesukone",
"intro": "Syklin lopun käsittely astianpesukoneille, jotka tyypillisesti päättyvät pitkään, lähes hiljaiseen kuivausvaiheeseen ennen lyhyttä lopullista vedenpoistoa."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Ryppyjenestotila tunnistaa lyhyet pienet pyörimisjaksot päävaiheen jälkeen ja pitää ne kiinnitettynä valmiiseen sykliin.", "intro": "Ryppyjenestotila tunnistaa lyhyet pienet pyörimisjaksot päävaiheen jälkeen ja pitää ne kiinnitettynä valmiiseen sykliin.",
"label": "Ryppyjenesto" "label": "Ryppyjenesto"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Passiivikuivauksen hiljainen vapautus",
"doc": "Kun sykli ylittää odotetun kestonsa, kuinka kauan astianpesukoneen on pysyttävä hiljaisena (Pysäytyskynnys-arvon alapuolella) ennen kuin WashData lopettaa lopullisen vedenpoiston odottamisen ja päättää syklin. Nosta arvoa, jos koneessasi on pitkä hiljainen kuivausvaihe ennen myöhäistä lopullista vedenpoistoa, joka jää huomaamatta - laajempi ikkuna antaa opitun keston seurata kausivaihtelua (kylmempi tulovesi = pidemmät syklit) sen sijaan, että se lukittuisi vanhaan keskiarvoon. Se voi vain lyhentää odotusta suhteessa sisäiseen 30 minuutin loppupiikkirajaan, ei koskaan pidentää sitä."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Tunnista lyhyet vähätehoiset rumpupulssit, joita kuivausrumpu lähettää päälämpövaiheen jälkeen, ja pidä ne kiinni valmiissa jaksossa sen sijaan, että luet ne uusina jaksoina.", "doc": "Tunnista lyhyet vähätehoiset rumpupulssit, joita kuivausrumpu lähettää päälämpövaiheen jälkeen, ja pidä ne kiinni valmiissa jaksossa sen sijaan, että luet ne uusina jaksoina.",
"label": "Ota ryppyjenesto käyttöön" "label": "Ota ryppyjenesto käyttöön"
@@ -1260,6 +1353,10 @@
"doc": "Minuutit syklin päättymisen jälkeen ennen edelleen odottavan koneen purkamisen muistutuksen lähettämistä. Aseta 0 poistaaksesi muistutuksen käytöstä.", "doc": "Minuutit syklin päättymisen jälkeen ennen edelleen odottavan koneen purkamisen muistutuksen lähettämistä. Aseta 0 poistaaksesi muistutuksen käytöstä.",
"label": "Purkamismuistutuksen viive" "label": "Purkamismuistutuksen viive"
}, },
"notify_unload_repeat": {
"doc": "Lähettää purkamismuistutuksen uudelleen \"Purkamismuistutuksen viive\" minuutin välein, kunnes avaat oven tai napautat ilmoituksen \"Lopeta muistuttaminen\" -painiketta. Vaatii ovianturin entiteetin (kuten itse muistutuskin). Hylkäyspainike toimii Home Assistant -kumppanisovelluksen (mobiili) ilmoituksissa.",
"label": "Toista kunnes ovi avautuu"
},
"off_delay": { "off_delay": {
"doc": "Aika odottaa tehon putoamisen jälkeen ennen kuin sykli julistetaan päättyneeksi. Jos virta palaa tämän ikkunan sisällä, jakso jatkuu saumattomasti - tämä siltaa taukoja pesuvaiheiden välillä. Astianpesukoneissa on pitkät kuivausvaiheet (virta pois päältä 20-60 min), joten sammutusviiveen on oltava tätä suurempi, jotta koko pesu+kuivaus pysyy yhtenä jaksona.", "doc": "Aika odottaa tehon putoamisen jälkeen ennen kuin sykli julistetaan päättyneeksi. Jos virta palaa tämän ikkunan sisällä, jakso jatkuu saumattomasti - tämä siltaa taukoja pesuvaiheiden välillä. Astianpesukoneissa on pitkät kuivausvaiheet (virta pois päältä 20-60 min), joten sammutusviiveen on oltava tätä suurempi, jotta koko pesu+kuivaus pysyy yhtenä jaksona.",
"label": "Sammutusviive" "label": "Sammutusviive"
@@ -1434,6 +1531,26 @@
"energy_scale": { "energy_scale": {
"label": "Energian tarkkuus", "label": "Energian tarkkuus",
"doc": "Vaiheen 4 energian yhdenmukaisuusrangaistuksen tarkkuus. Pienempi = tiukempi: energian poikkeama haittaa enemmän. Oletus 0,25 on tarkoituksellisesti sallivampi kuin kestotarkkuus koska energia vaihtelee kuorman mukaan. Yhdistä Energiapaino-asetukseen." "doc": "Vaiheen 4 energian yhdenmukaisuusrangaistuksen tarkkuus. Pienempi = tiukempi: energian poikkeama haittaa enemmän. Oletus 0,25 on tarkoituksellisesti sallivampi kuin kestotarkkuus koska energia vaihtelee kuorman mukaan. Yhdistä Energiapaino-asetukseen."
},
"power_profile_interval_min": {
"label": "Tehoprofiilin aikaväli",
"doc": "Säilön koko profiilin power_profile-sensorin attribuutille (tasainen kohtakohtainen keskivattimäärän matriisi, jota käyttävät ulkoiset suunnittelijat kuten EMHASS ja tibber_prices). Pienemmät säiliöt pitävät lyhyet tehopiikit terävinä; suuremmat säiliöt tasoittavat muodon. Oletus 15 min. Vain lukuaika; ei vaikuta tunnistukseen."
},
"notify_live_sticky": {
"label": "Pidä reaaliaikailmoitus napauttamisen jälkeen",
"doc": "Vain Android. Tee reaaliaikaisesta edistymisilmoituksesta pysyvä (sticky), jotta sen napauttaminen ei sulje käynnissä olevaa viestiketjua. Pois päältä säilyttää oletustoiminnan, jossa napautus sulkee ilmoituksen."
},
"notify_live_click_action": {
"label": "Reaaliaikailmoituksen napauttamiskohde",
"doc": "Vain Android. Mihin reaaliaikaisen edistymisilmoituksen napauttaminen avaa (esim. /lovelace/laundry tai koko URL) sovellusaloitussivun sijaan. Jätä tyhjäksi oletusmääränpäätä varten."
},
"door_opens_at_end": {
"label": "Ovi avautuu automaattisesti lopussa",
"doc": "Astianpesukoneille, jotka avaavat oven syklin lopussa kuivauksen ajaksi (AirDry ja vastaavat). Tämän ollessa päällä oven avautuminen käynnissä olevan syklin aikana ei enää pysäytä sitä pysyvästi; sen sijaan, jos ovi pysyy auki alla olevan odotusajan verran, WashData pitää syklin valmiina. Lyhyt avaus (tavaran lisääminen) ohitetaan. Vaatii ovisensorientiteetin."
},
"door_end_dwell_seconds": {
"label": "Oven avauksen loppuviive",
"doc": "Kuinka kauan oven on pysyttävä auki ennen kuin WashData päättää syklin, kun \"Ovi avautuu automaattisesti lopussa\" on käytössä. Tarpeeksi kauan ohittamaan lautasen lisäämisen (oletus 60 s), tarpeeksi lyhyt päättämään nopeasti kun kone avaa oven."
} }
}, },
"setting_group": { "setting_group": {
@@ -1620,6 +1737,7 @@
"min_active": "Perustuu pienimpään aktiiviseen tehoon ({min}W), joka havaittiin viime jaksossa.", "min_active": "Perustuu pienimpään aktiiviseen tehoon ({min}W), joka havaittiin viime jaksossa.",
"min_duration_ratio": "Pidetään mahdollisimman matalana, jotta ohjelma tunnistetaan jakson alkuvaiheessa; luottamus- ja epäselvyysrajat estävät ennenaikaiset päätökset.", "min_duration_ratio": "Pidetään mahdollisimman matalana, jotta ohjelma tunnistetaan jakson alkuvaiheessa; luottamus- ja epäselvyysrajat estävät ennenaikaiset päätökset.",
"min_off_gap": "Perustuu {gaps} havaittuun jaksojen väliseen taukoon (p05={p05}s). Laitteen alaraja: {floor}s.", "min_off_gap": "Perustuu {gaps} havaittuun jaksojen väliseen taukoon (p05={p05}s). Laitteen alaraja: {floor}s.",
"min_off_gap_bridge": "Mitoitettu siltaamaan jakson pisin hiljainen vaihe: {span}s + 60s puskuri, {spans} sillatusta katkosta {cycles} puhtaan jakson joukossa (pysyy alle {ceiling}s, joka on lyhin peräkkäisten käynnistysten välinen taukosi).",
"min_power": "40% pienimmästä aktiivisesta tehosta p05:ssä ({p05}W) {cycles} puhtaan jakson joukossa, mikä pitää sammutuskynnyksen todellisen kulutuksen alapuolella.{excl}", "min_power": "40% pienimmästä aktiivisesta tehosta p05:ssä ({p05}W) {cycles} puhtaan jakson joukossa, mikä pitää sammutuskynnyksen todellisen kulutuksen alapuolella.{excl}",
"ml_auto_label": "Pienin luottamus, jonka laatumalli arvioi vielä puhtaaksi (p10 {cycles} puhtaasta jaksosta = {p10}).", "ml_auto_label": "Pienin luottamus, jonka laatumalli arvioi vielä puhtaaksi (p10 {cycles} puhtaasta jaksosta = {p10}).",
"ml_end_repeat": "{false}/{total} jaksosta ({pct}%) sisälsi tauon, jolle loppudetektori antoi >50%; vaatii {val} loppuvahvistusta.", "ml_end_repeat": "{false}/{total} jaksosta ({pct}%) sisälsi tauon, jolle loppudetektori antoi >50%; vaatii {val} loppuvahvistusta.",
@@ -1636,7 +1754,7 @@
"thr_batch": "Pidetään juuri pienimmän aktiivisen tehon yläpuolella p05:ssä {cycles} jakson joukossa ({p05}W), jotta käynnistys havaitaan mahdollisimman aikaisin ja pysäytyskynnys pysyy koneen pienimmän käyntitehon alapuolella.", "thr_batch": "Pidetään juuri pienimmän aktiivisen tehon yläpuolella p05:ssä {cycles} jakson joukossa ({p05}W), jotta käynnistys havaitaan mahdollisimman aikaisin ja pysäytyskynnys pysyy koneen pienimmän käyntitehon alapuolella.",
"tol_per_profile": "p75 profiilikohtaisesta keston varianssista {profiles} profiilin joukossa ({cycles} jaksoa); tiiviitä profiileja ei rangaista.", "tol_per_profile": "p75 profiilikohtaisesta keston varianssista {profiles} profiilin joukossa ({cycles} jaksoa); tiiviitä profiileja ei rangaista.",
"tol_pooled": "Perustuu {cycles} viimeisimmän merkityn jakson yhdistettyyn keston varianssiin (p95 poikkeama={dev}).", "tol_pooled": "Perustuu {cycles} viimeisimmän merkityn jakson yhdistettyyn keston varianssiin (p95 poikkeama={dev}).",
"watchdog": "Pidetään niin matalana kuin on turvallista (3x p95-päivitysväli {p95}s, väh. 30s), jotta pysähdykset havaitaan nopeasti ilman vääriä pysäytyksiä." "watchdog": "Pidetään niin matalana kuin on turvallista (hieman yli p95-päivitysvälin {p95}s, väh. 30s), jotta pysähdykset havaitaan nopeasti ilman vääriä pysäytyksiä."
}, },
"exclusions": { "exclusions": {
"summary": "Suljettu pois {total} väärin tunnistettua sykliä: {parts}.", "summary": "Suljettu pois {total} väärin tunnistettua sykliä: {parts}.",
@@ -1670,7 +1788,7 @@
"subtab_phase_catalog": "Vaiheen katalogi", "subtab_phase_catalog": "Vaiheen katalogi",
"subtab_profiles": "Profiilit", "subtab_profiles": "Profiilit",
"maintenance": "Huolto", "maintenance": "Huolto",
"playground": "Hiekkalaatikko", "playground": "Testialue",
"store": "Kauppa" "store": "Kauppa"
}, },
"tag": { "tag": {
@@ -1716,6 +1834,10 @@
"name_required": "Nimi vaaditaan", "name_required": "Nimi vaaditaan",
"no_split_found": "Tyhjäkäyntiä ei löytynyt halkeamista varten", "no_split_found": "Tyhjäkäyntiä ei löytynyt halkeamista varten",
"panel_settings_saved": "Paneelin asetukset tallennettu", "panel_settings_saved": "Paneelin asetukset tallennettu",
"pg_preset_loaded": "Esiasetus \"{name}\" ladattu",
"pg_preset_saved": "Esiasetus \"{name}\" tallennettu",
"pg_sugg_loaded": "{n} ehdotettu arvo ladattu testialueelle - aja testialue vertailua varten",
"pg_sugg_ml_loaded": "{n} ML-kalibroitua arvoa ladattu testialueelle - aja testialue vertailua varten",
"phase_name_required": "Vaiheen nimi vaaditaan", "phase_name_required": "Vaiheen nimi vaaditaan",
"phase_updated": "Vaihe päivitetty", "phase_updated": "Vaihe päivitetty",
"phases_saved": "Vaiheet tallennettu", "phases_saved": "Vaiheet tallennettu",
@@ -92,6 +92,19 @@
"pause_cycle_tip": "Mettre en pause le cycle en cours l'appareil reprendra là où il s'est arrêté", "pause_cycle_tip": "Mettre en pause le cycle en cours l'appareil reprendra là où il s'est arrêté",
"pg_apply_device": "Appliquer à l'appareil", "pg_apply_device": "Appliquer à l'appareil",
"pg_autofill": "Remplissage automatique", "pg_autofill": "Remplissage automatique",
"pg_load_calibrated": "Charger Calibré (ML) ({n})",
"pg_load_calibrated_tip": "Charger les paramètres calibrés par ML comme valeurs de remplacement dans le Bac à sable",
"pg_load_live": "Charger les réglages actifs",
"pg_load_live_tip": "Relire les réglages actuels de l'intégration et abandonner toutes les modifications faites dans le Bac à sable",
"pg_load_suggested": "Charger les suggestions ({n})",
"pg_load_suggested_tip": "Charger les suggestions actuelles du réglage automatique comme valeurs de remplacement dans le Bac à sable",
"pg_preset_delete": "Supprimer le préréglage",
"pg_preset_load": "Charger le préréglage",
"pg_preset_load_tip": "Remplacer les valeurs du Bac à sable par ce préréglage (les réglages actifs ne sont pas modifiés)",
"pg_preset_save": "Enregistrer comme préréglage",
"pg_preset_save_tip": "Enregistrer toutes les valeurs ci-dessous comme préréglage nommé pour cet appareil",
"pg_publish_all": "Enregistrer {n} réglage(s) dans l'intégration",
"pg_publish_one": "Enregistrer {label} dans l'intégration",
"play": "Lire", "play": "Lire",
"process": "Processus", "process": "Processus",
"process_history": "Traiter maintenant", "process_history": "Traiter maintenant",
@@ -178,7 +191,9 @@
"download_export": "Télécharger l'export", "download_export": "Télécharger l'export",
"analyze_import": "Analyser le fichier", "analyze_import": "Analyser le fichier",
"import_selected": "Importer la sélection", "import_selected": "Importer la sélection",
"back": "Retour" "back": "Retour",
"mute_suggestion": "Ne plus suggérer ce paramètre",
"reset_muted": "Réinitialiser les suggestions masquées"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +290,7 @@
"no_automations": "Aucun automatisme ne fait encore référence à cet appareil.", "no_automations": "Aucun automatisme ne fait encore référence à cet appareil.",
"panel_settings": "Paramètres du panneau", "panel_settings": "Paramètres du panneau",
"param_sweep": "Balayage de paramètre", "param_sweep": "Balayage de paramètre",
"pg_settings_source": "Origine des réglages",
"phase_catalog": "Catalogue de phases", "phase_catalog": "Catalogue de phases",
"playground": "Bac à sable", "playground": "Bac à sable",
"process_history": "Historique du processus", "process_history": "Historique du processus",
@@ -415,6 +431,9 @@
"pg_match_score": "Score de correspondance", "pg_match_score": "Score de correspondance",
"pg_pct_of": "{p}% sur {total}", "pg_pct_of": "{p}% sur {total}",
"pg_poor_match": "Correspondance médiocre", "pg_poor_match": "Correspondance médiocre",
"pg_preset": "Préréglage du Bac à sable",
"pg_preset_name": "Nom du nouveau préréglage",
"pg_preset_none": "Sélectionner un préréglage…",
"pg_strong_match": "Correspondance forte", "pg_strong_match": "Correspondance forte",
"pg_tile_ambiguous": "Ambigu", "pg_tile_ambiguous": "Ambigu",
"pg_tile_ambiguous_tip": "Cycles avec une quasi-égalité entre deux programmes", "pg_tile_ambiguous_tip": "Cycles avec une quasi-égalité entre deux programmes",
@@ -609,7 +628,8 @@
"conflict_resolution": "Conflits de noms", "conflict_resolution": "Conflits de noms",
"conflict_import_copy": "Importer comme copie", "conflict_import_copy": "Importer comme copie",
"conflict_keep_mine": "Garder le mien", "conflict_keep_mine": "Garder le mien",
"conflict_overwrite": "Écraser" "conflict_overwrite": "Écraser",
"font_size": "Taille de police du panneau"
}, },
"log": { "log": {
"all_levels": "Tous niveaux", "all_levels": "Tous niveaux",
@@ -771,7 +791,17 @@
"pg_apply_confirm": "Appliquer la meilleure valeur : {label} = {value} ?", "pg_apply_confirm": "Appliquer la meilleure valeur : {label} = {value} ?",
"pg_canvas_empty": "Sélectionnez un cycle ci-dessus, puis appuyez sur Charger pour voir sa courbe de puissance.", "pg_canvas_empty": "Sélectionnez un cycle ci-dessus, puis appuyez sur Charger pour voir sa courbe de puissance.",
"pg_chart_caption": "Taux de détection/correspondance selon les valeurs de {param}", "pg_chart_caption": "Taux de détection/correspondance selon les valeurs de {param}",
"pg_ctrl_intro": "Les valeurs partent des réglages actifs de cet appareil dans l'intégration. Les modifications restent dans le Bac à sable tant que vous ne les enregistrez pas dans l'intégration.",
"pg_live_unavailable": "Réglages actifs indisponibles, affichage des valeurs par défaut.",
"pg_load_live_confirm": "Abandonner {n} modification(s) du Bac à sable et recharger les réglages actuels de l'intégration ?",
"pg_match_rate": "{pct}% de taux de correspondance sur {total} cycles", "pg_match_rate": "{pct}% de taux de correspondance sur {total} cycles",
"pg_matches_live": "Identique aux réglages actifs",
"pg_n_changed": "{n} valeur(s) modifiée(s) par rapport aux réglages actifs",
"pg_sugg_none": "Toutes les suggestions correspondent déjà aux réglages actuels",
"pg_preset_delete_confirm": "Supprimer le préréglage « {name} » ?",
"pg_preset_limit": "Limite de préréglages atteinte ({n})",
"pg_preset_overwrite": "Écraser le préréglage « {name} » ?",
"pg_publish_one_confirm": "Enregistrer {label} = {value} dans les réglages de cet appareil ?",
"pg_restart_note": "Redémarrez Home Assistant pour activer les outils de simulation.", "pg_restart_note": "Redémarrez Home Assistant pour activer les outils de simulation.",
"pg_sim_progress": "{done} / {total} cycles", "pg_sim_progress": "{done} / {total} cycles",
"pg_starting": "Démarrage…", "pg_starting": "Démarrage…",
@@ -845,6 +875,7 @@
"trend_duration_shorter": "Tendance de durée plus courte ({pct} %/cycle) moyenne récente {avg}", "trend_duration_shorter": "Tendance de durée plus courte ({pct} %/cycle) moyenne récente {avg}",
"trend_energy_down": "Tendance à la baisse de l'énergie ({pct} %/cycle)", "trend_energy_down": "Tendance à la baisse de l'énergie ({pct} %/cycle)",
"trend_energy_up": "Tendance énergétique à la hausse ({pct} %/cycle) moyenne récente {avg}", "trend_energy_up": "Tendance énergétique à la hausse ({pct} %/cycle) moyenne récente {avg}",
"trim_destructive_confirm": "Cela ne conserve que {pct} % du cycle et est irréversible. Continuer ?",
"trim_intro": "Faites glisser les poignées rouges ou entrez des valeurs. Tout ce qui se trouve à l'extérieur de la fenêtre est supprimé.", "trim_intro": "Faites glisser les poignées rouges ou entrez des valeurs. Tout ce qui se trouve à l'extérieur de la fenêtre est supprimé.",
"tuning_suggestions_available": "{count} suggestion de réglage disponible à partir des cycles observés. Ils apparaissent à côté des champs concernés.", "tuning_suggestions_available": "{count} suggestion de réglage disponible à partir des cycles observés. Ils apparaissent à côté des champs concernés.",
"unsure_detected_prefix": "WashData n'est pas sûr d'avoir été détecté", "unsure_detected_prefix": "WashData n'est pas sûr d'avoir été détecté",
@@ -922,9 +953,15 @@
"merge_hint": "Les éléments importés sont ajoutés ; rien de local n'est perdu. Les conflits de noms sont résolus ci-dessous.", "merge_hint": "Les éléments importés sont ajoutés ; rien de local n'est perdu. Les conflits de noms sont résolus ci-dessous.",
"replace_warn": "Chaque catégorie cochée est effacée et remplacée par le contenu du fichier. Les catégories non cochées restent intactes.", "replace_warn": "Chaque catégorie cochée est effacée et remplacée par le contenu du fichier. Les catégories non cochées restent intactes.",
"dest_reference_hint": "Les cycles importés améliorent uniquement la reconnaissance des programmes et n'affectent jamais les statistiques d'utilisation/d'énergie.", "dest_reference_hint": "Les cycles importés améliorent uniquement la reconnaissance des programmes et n'affectent jamais les statistiques d'utilisation/d'énergie.",
"dest_real_history_hint": "Les cycles importés comptent comme l'historique propre de cet appareil et alimentent les statistiques d'énergie/d'utilisation. À utiliser pour déplacer un appareil vers une nouvelle installation." "dest_real_history_hint": "Les cycles importés comptent comme l'historique propre de cet appareil et alimentent les statistiques d'énergie/d'utilisation. À utiliser pour déplacer un appareil vers une nouvelle installation.",
"sug_muted": "Ce paramètre ne sera plus suggéré",
"sug_mute_failed": "Impossible de masquer la suggestion",
"sug_unmuted_all": "Les suggestions masquées ont été réinitialisées",
"n_suggestions_muted": "{count} masquée(s) ; le réglage automatique ne proposera plus ces suggestions.",
"font_size_hint": "Agrandir ou réduire tout le contenu de ce panneau. S'applique à votre compte sur cet appareil."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Lave-vaisselle : secondes de silence après la durée prévue avant de libérer l'attente de vidange de fin de cycle",
"anti_wrinkle_enabled": "Absorber les impulsions de culbutage après la phase principale au lieu de les lire comme de nouveaux cycles", "anti_wrinkle_enabled": "Absorber les impulsions de culbutage après la phase principale au lieu de les lire comme de nouveaux cycles",
"anti_wrinkle_exit_power": "La puissance doit tomber sous ce seuil entre les impulsions pour que l'anti-froissement reste actif", "anti_wrinkle_exit_power": "La puissance doit tomber sous ce seuil entre les impulsions pour que l'anti-froissement reste actif",
"anti_wrinkle_idle_timeout": "Temps de silence autorisé entre deux impulsions de culbutage avant la fin de l'anti-froissement", "anti_wrinkle_idle_timeout": "Temps de silence autorisé entre deux impulsions de culbutage avant la fin de l'anti-froissement",
@@ -998,6 +1035,10 @@
"unusable": "Inutilisable" "unusable": "Inutilisable"
}, },
"section": { "section": {
"dishwasher": {
"label": "Lave-vaisselle",
"intro": "Gestion de fin de cycle pour les lave-vaisselle, qui se terminent généralement par une longue phase de séchage quasi silencieuse avant une brève vidange finale."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Le mode anti-froissement détecte les courtes impulsions de culbutage à faible puissance après la phase principale et les maintient rattachées au cycle terminé.", "intro": "Le mode anti-froissement détecte les courtes impulsions de culbutage à faible puissance après la phase principale et les maintient rattachées au cycle terminé.",
"label": "Anti-froissement" "label": "Anti-froissement"
@@ -1040,6 +1081,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Libération au silence du séchage passif",
"doc": "Une fois que le cycle dépasse sa durée prévue, combien de temps le lave-vaisselle doit rester silencieux (sous le Seuil d'arrêt) avant que WashData cesse d'attendre une vidange finale et termine le cycle. Augmentez cette valeur si votre machine a une longue phase de séchage silencieuse avant une vidange finale tardive qui n'est pas détectée - une fenêtre plus large permet à la durée apprise de suivre la dérive saisonnière (eau d'arrivée plus froide = cycles plus longs) au lieu de se figer sur l'ancienne moyenne. Elle ne fait que raccourcir l'attente par rapport au plafond interne de 30 minutes pour le pic de fin, jamais la prolonger."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Reconnaissez les courtes impulsions de culbutage de faible puissance qu'un sèche-linge émet après la phase de chauffage principale et conservez-les attachées au cycle terminé au lieu de les lire comme de nouveaux cycles.", "doc": "Reconnaissez les courtes impulsions de culbutage de faible puissance qu'un sèche-linge émet après la phase de chauffage principale et conservez-les attachées au cycle terminé au lieu de les lire comme de nouveaux cycles.",
"label": "Activer la détection anti-froissement" "label": "Activer la détection anti-froissement"
@@ -1260,6 +1305,10 @@
"doc": "Quelques minutes après la fin d'un cycle avant d'envoyer le rappel \"décharger la machine\" toujours en attente. Définissez 0 pour désactiver le rappel.", "doc": "Quelques minutes après la fin d'un cycle avant d'envoyer le rappel \"décharger la machine\" toujours en attente. Définissez 0 pour désactiver le rappel.",
"label": "Délai de rappel de déchargement" "label": "Délai de rappel de déchargement"
}, },
"notify_unload_repeat": {
"doc": "Continue de renvoyer le rappel de déchargement toutes les \"Délai de rappel de déchargement\" minutes jusqu'à ce que vous ouvriez la porte ou appuyiez sur \"Arrêter les rappels\" dans la notification. Nécessite une Entité capteur de porte (le rappel lui-même en a besoin). Le bouton de rejet fonctionne sur les notifications de l'application compagnon (mobile) de Home Assistant.",
"label": "Répéter jusqu'à l'ouverture de la porte"
},
"off_delay": { "off_delay": {
"doc": "Temps d'attente après la coupure de courant avant de déclarer le cycle terminé. Si le courant revient dans cette fenêtre, le cycle continue de manière transparente cela comble les pauses entre les étapes de lavage. Les lave-vaisselle ont de longues phases de séchage (mise hors tension pendant 20 à 60 minutes), le délai d'arrêt doit donc être supérieur à ce délai pour que l'ensemble du lavage et du séchage se déroule en un seul cycle.", "doc": "Temps d'attente après la coupure de courant avant de déclarer le cycle terminé. Si le courant revient dans cette fenêtre, le cycle continue de manière transparente cela comble les pauses entre les étapes de lavage. Les lave-vaisselle ont de longues phases de séchage (mise hors tension pendant 20 à 60 minutes), le délai d'arrêt doit donc être supérieur à ce délai pour que l'ensemble du lavage et du séchage se déroule en un seul cycle.",
"label": "Délai d'arrêt" "label": "Délai d'arrêt"
@@ -1435,6 +1484,26 @@
"energy_scale": { "energy_scale": {
"label": "Précision énergie", "label": "Précision énergie",
"doc": "Précision de la pénalité de concordance d'énergie. Plus petit = plus strict : un écart d'énergie pénalise davantage. Le défaut 0,25 est intentionnellement plus indulgent que la Précision de durée, car l'énergie varie avec la charge. À combiner avec la Pondération d'énergie." "doc": "Précision de la pénalité de concordance d'énergie. Plus petit = plus strict : un écart d'énergie pénalise davantage. Le défaut 0,25 est intentionnellement plus indulgent que la Précision de durée, car l'énergie varie avec la charge. À combiner avec la Pondération d'énergie."
},
"power_profile_interval_min": {
"label": "Intervalle du profil de puissance",
"doc": "Taille des créneaux pour l'attribut de capteur power_profile par profil (le tableau plat de watts moyens par créneau consommé par des planificateurs externes tels que EMHASS et tibber_prices). Des créneaux plus petits conservent les pics de puissance courts et nets ; des créneaux plus grands lissent la forme. Par défaut 15 min. Lecture seule ; n'affecte pas la détection."
},
"notify_live_sticky": {
"label": "Conserver la notification en direct au toucher",
"doc": "Android uniquement. Rend la notification de progression en direct persistante (épinglée) afin que la toucher ne la ferme pas. Désactivé conserve le comportement par défaut où un toucher la ferme."
},
"notify_live_click_action": {
"label": "Destination au toucher de la notification en direct",
"doc": "Android uniquement. Où s'ouvre un toucher sur la notification de progression en direct (par exemple /lovelace/laundry, ou une URL complète) au lieu de la page d'accueil de l'application. Laissez vide pour la valeur par défaut."
},
"door_opens_at_end": {
"label": "La porte s'ouvre automatiquement en fin de cycle",
"doc": "Pour les lave-vaisselle qui ouvrent la porte en fin de cycle pour le séchage (AirDry et fonctions similaires). Avec cette option activée, une ouverture de porte sur un cycle en cours ne le met plus en pause indéfiniment ; si la porte reste ouverte pendant la durée d'attente ci-dessous, WashData considère le cycle comme terminé. Une ouverture brève (pour ajouter un article) est ignorée. Nécessite une entité capteur de porte."
},
"door_end_dwell_seconds": {
"label": "Durée d'attente porte ouverte",
"doc": "Durée pendant laquelle la porte doit rester ouverte avant que WashData ne termine le cycle, lorsque « La porte s'ouvre automatiquement en fin de cycle » est activé. Assez longue pour ignorer l'ajout rapide d'un article (par défaut 60 s), assez courte pour terminer rapidement une fois que la machine ouvre la porte."
} }
}, },
"setting_group": { "setting_group": {
@@ -1605,6 +1674,10 @@
"name_required": "Nom requis", "name_required": "Nom requis",
"no_split_found": "Aucun espace vide trouvé sur lequel se diviser", "no_split_found": "Aucun espace vide trouvé sur lequel se diviser",
"panel_settings_saved": "Paramètres du panneau enregistrés", "panel_settings_saved": "Paramètres du panneau enregistrés",
"pg_preset_loaded": "Préréglage « {name} » chargé",
"pg_preset_saved": "Préréglage « {name} » enregistré",
"pg_sugg_loaded": "{n} valeur(s) suggérée(s) chargée(s) - lancez le Bac à sable pour comparer",
"pg_sugg_ml_loaded": "{n} valeur(s) calibrée(s) ML chargée(s) - lancez le Bac à sable pour comparer",
"phase_name_required": "Le nom de la phase est obligatoire", "phase_name_required": "Le nom de la phase est obligatoire",
"phase_updated": "Phase mise à jour", "phase_updated": "Phase mise à jour",
"phases_saved": "Phases enregistrées", "phases_saved": "Phases enregistrées",
@@ -1752,6 +1825,7 @@
"min_active": "D'après la puissance active minimale ({min}W) observée lors du dernier cycle.", "min_active": "D'après la puissance active minimale ({min}W) observée lors du dernier cycle.",
"min_duration_ratio": "Maintenu aussi bas que possible pour qu'un programme soit reconnu tôt dans le cycle ; les seuils de confiance et d'ambiguïté empêchent les décisions prématurées.", "min_duration_ratio": "Maintenu aussi bas que possible pour qu'un programme soit reconnu tôt dans le cycle ; les seuils de confiance et d'ambiguïté empêchent les décisions prématurées.",
"min_off_gap": "D'après {gaps} intervalles entre cycles observés (p05={p05}s). Plancher de l'appareil : {floor}s.", "min_off_gap": "D'après {gaps} intervalles entre cycles observés (p05={p05}s). Plancher de l'appareil : {floor}s.",
"min_off_gap_bridge": "Dimensionné pour couvrir la plus longue période calme au sein d'un cycle : {span}s + 60s de marge, à partir de {spans} intervalles couverts sur {cycles} cycles propres (reste sous votre intervalle minimal de {ceiling}s entre deux charges consécutives).",
"min_power": "40% de la puissance active la plus basse au p05 ({p05}W) sur {cycles} cycles propres, pour garder le seuil d'arrêt sous la consommation réelle.{excl}", "min_power": "40% de la puissance active la plus basse au p05 ({p05}W) sur {cycles} cycles propres, pour garder le seuil d'arrêt sous la consommation réelle.{excl}",
"ml_auto_label": "Confiance la plus basse encore jugée propre par le modèle de qualité (p10 de {cycles} cycles propres = {p10}).", "ml_auto_label": "Confiance la plus basse encore jugée propre par le modèle de qualité (p10 de {cycles} cycles propres = {p10}).",
"ml_end_repeat": "{false}/{total} cycles ({pct}%) ont eu une pause que le détecteur de fin a notée >50% ; exiger {val} confirmation(s) de fin.", "ml_end_repeat": "{false}/{total} cycles ({pct}%) ont eu une pause que le détecteur de fin a notée >50% ; exiger {val} confirmation(s) de fin.",
@@ -1768,7 +1842,7 @@
"thr_batch": "Maintenu juste au-dessus de la puissance active la plus basse au p05 sur {cycles} cycles ({p05}W) pour qu'un démarrage soit détecté le plus tôt possible et que le seuil d'arrêt reste sous la puissance de fonctionnement la plus basse de la machine.", "thr_batch": "Maintenu juste au-dessus de la puissance active la plus basse au p05 sur {cycles} cycles ({p05}W) pour qu'un démarrage soit détecté le plus tôt possible et que le seuil d'arrêt reste sous la puissance de fonctionnement la plus basse de la machine.",
"tol_per_profile": "p75 de la variance de durée par profil sur {profiles} profils ({cycles} cycles) ; les profils resserrés ne sont pas pénalisés.", "tol_per_profile": "p75 de la variance de durée par profil sur {profiles} profils ({cycles} cycles) ; les profils resserrés ne sont pas pénalisés.",
"tol_pooled": "D'après la variance de durée regroupée de {cycles} cycles récemment étiquetés (écart p95={dev}).", "tol_pooled": "D'après la variance de durée regroupée de {cycles} cycles récemment étiquetés (écart p95={dev}).",
"watchdog": "Maintenu aussi bas que possible en toute sécurité (3x l'écart de mise à jour p95 de {p95}s, min 30s) pour détecter rapidement les blocages sans faux arrêts." "watchdog": "Maintenu aussi bas que possible en toute sécurité (juste au-dessus de l'écart de mise à jour p95 de {p95}s, min 30s) pour détecter rapidement les blocages sans faux arrêts."
}, },
"exclusions": { "exclusions": {
"summary": "{total} cycle(s) mal détecté(s) exclu(s) : {parts}.", "summary": "{total} cycle(s) mal détecté(s) exclu(s) : {parts}.",
@@ -1945,5 +2019,53 @@
"hide_guidance": "Masquer le guide", "hide_guidance": "Masquer le guide",
"show_guidance": "Afficher le guide" "show_guidance": "Afficher le guide"
} }
},
"card": {
"min": "min",
"entity_not_found": "Entité introuvable",
"running_long": "Dépassement",
"remaining": "restant",
"progress": "progression",
"show_time_remaining": "Afficher le temps restant",
"show_percentage": "Afficher le pourcentage",
"layout": {
"tile": "Tuile (compact)",
"detail": "Détail (complet)",
"glance": "Aperçu (plusieurs appareils)"
},
"btn": {
"pause": "Pause",
"resume": "Reprendre",
"terminate": "Terminer le cycle",
"record_start": "Commencer l'enregistrement",
"record_stop": "Arrêter l'enregistrement",
"program": "Programme",
"open_panel": "Ouvrir WashData"
},
"editor": {
"layout": "Disposition",
"entity": "Entité de l'appareil",
"entities": "Appareils",
"title": "Titre",
"icon": "Icône",
"show_state": "Afficher l'état",
"show_program": "Afficher le programme",
"show_progress_bar": "Afficher la barre de progression",
"spin_icon": "Faire tourner l'icône pendant le fonctionnement",
"display_mode": "Ligne de détail",
"active_color": "Couleur active personnalisée",
"show_phase": "Afficher la phase",
"show_energy": "Afficher l'énergie et le coût",
"show_anomaly": "Afficher l'avertissement de dépassement",
"show_sparkline": "Afficher le graphique de puissance en direct",
"buttons": "Boutons d'action",
"program_entity": "Entité de programme (personnalisée)",
"time_entity": "Entité de temps (personnalisée)",
"pct_entity": "Entité de progression (personnalisée)",
"power_entity": "Entité de puissance (personnalisée)",
"tap_action": "Action au toucher",
"hold_action": "Action au maintien",
"double_tap_action": "Action au double toucher"
}
} }
} }
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entitet nije pronađen",
"running_long": "Traje predugo",
"remaining": "preostalo",
"progress": "napredak",
"show_time_remaining": "Prikaži preostalo vrijeme",
"show_percentage": "Prikaži postotak",
"layout": {
"tile": "Pločica (kompaktno)",
"detail": "Detaljno (bogato)",
"glance": "Pregled (više uređaja)"
},
"btn": {
"pause": "Pauziraj",
"resume": "Nastavi",
"terminate": "Završi ciklus",
"record_start": "Započni snimanje",
"record_stop": "Zaustavi snimanje",
"program": "Program",
"open_panel": "Otvori WashData"
},
"editor": {
"layout": "Izgled",
"entity": "Entitet uređaja",
"entities": "Uređaji",
"title": "Naslov",
"icon": "Ikona",
"show_state": "Prikaži stanje",
"show_program": "Prikaži program",
"show_progress_bar": "Prikaži traku napretka",
"spin_icon": "Vrti ikonu tijekom rada",
"display_mode": "Redak s detaljima",
"active_color": "Zamjena aktivne boje",
"show_phase": "Prikaži fazu",
"show_energy": "Prikaži energiju i trošak",
"show_anomaly": "Prikaži upozorenje o produljenju",
"show_sparkline": "Prikaži grafikon snage uživo",
"buttons": "Gumbi radnji",
"program_entity": "Entitet programa (zamjena)",
"time_entity": "Entitet vremena (zamjena)",
"pct_entity": "Entitet napretka (zamjena)",
"power_entity": "Entitet snage (zamjena)",
"tap_action": "Radnja dodira",
"hold_action": "Radnja držanja",
"double_tap_action": "Radnja dvostrukog dodira"
}
},
"badge": { "badge": {
"artifact_tip": "Otkrivene su {n} anomalije (npr. vrata otvorena usred ciklusa) otvorite da ih vidite na grafikonu", "artifact_tip": "Otkrivene su {n} anomalije (npr. vrata otvorena usred ciklusa) otvorite da ih vidite na grafikonu",
"auto": "(automatski otkriveno)", "auto": "(automatski otkriveno)",
@@ -64,6 +112,21 @@
"discard": "Odbaci", "discard": "Odbaci",
"discard_tip": "Odbaci snimljeni trag bez pohrane", "discard_tip": "Odbaci snimljeni trag bez pohrane",
"dismiss": "Odbaci", "dismiss": "Odbaci",
"mute_suggestion": "Prestani predlagati ovu postavku",
"pg_load_calibrated": "Učitaj kalibrirano (ML) ({n})",
"pg_load_calibrated_tip": "Učitaj ML-kalibrirane postavke kao zamjene u pješčaniku",
"pg_load_live": "Učitaj aktivne postavke",
"pg_load_live_tip": "Ponovno učitaj trenutne postavke integracije i odbaci sve izmjene u pješčaniku",
"pg_load_suggested": "Učitaj predloženo ({n})",
"pg_load_suggested_tip": "Učitaj aktualne prijedloge automatskog podešavanja kao zamjene u pješčaniku",
"pg_preset_delete": "Izbriši preset",
"pg_preset_load": "Učitaj preset",
"pg_preset_load_tip": "Zamijeni vrijednosti u pješčaniku ovim presetom (aktivne postavke ostaju nepromijenjene)",
"pg_preset_save": "Spremi kao preset",
"pg_preset_save_tip": "Spremi sve vrijednosti ispod kao imenovani preset za ovaj uređaj",
"pg_publish_all": "Spremi u integraciju ({n})",
"pg_publish_one": "Spremi {label} u integraciju",
"reset_muted": "Poništi utišane",
"done": "Gotovo", "done": "Gotovo",
"edit": "Uredi", "edit": "Uredi",
"export": "Izvezi", "export": "Izvezi",
@@ -275,6 +338,7 @@
"no_automations": "Još nijedna automatizacija ne spominje ovaj uređaj.", "no_automations": "Još nijedna automatizacija ne spominje ovaj uređaj.",
"panel_settings": "Postavke ploče", "panel_settings": "Postavke ploče",
"param_sweep": "Pretraživanje parametra", "param_sweep": "Pretraživanje parametra",
"pg_settings_source": "Izvor postavki",
"phase_catalog": "Katalog faza", "phase_catalog": "Katalog faza",
"playground": "Pješčanik", "playground": "Pješčanik",
"process_history": "Povijest procesa", "process_history": "Povijest procesa",
@@ -348,6 +412,7 @@
"default_access_level": "Zadana razina za korisnike koji nisu dolje navedeni", "default_access_level": "Zadana razina za korisnike koji nisu dolje navedeni",
"default_other": "Zadano (ostali uređaji)", "default_other": "Zadano (ostali uređaji)",
"default_tab": "Zadana kartica pri otvaranju ploče", "default_tab": "Zadana kartica pri otvaranju ploče",
"font_size": "Veličina fonta ploče",
"delta": "Δ", "delta": "Δ",
"description": "Opis", "description": "Opis",
"dtw_blend_w": "Težina miješanja", "dtw_blend_w": "Težina miješanja",
@@ -415,6 +480,9 @@
"pg_match_score": "Rezultat podudaranja", "pg_match_score": "Rezultat podudaranja",
"pg_pct_of": "{p}% od {total}", "pg_pct_of": "{p}% od {total}",
"pg_poor_match": "Loše podudaranje", "pg_poor_match": "Loše podudaranje",
"pg_preset": "Preset pješčanika",
"pg_preset_name": "Ime novog preseta",
"pg_preset_none": "Odaberite preset…",
"pg_strong_match": "Snažno podudaranje", "pg_strong_match": "Snažno podudaranje",
"pg_tile_ambiguous": "Nejasno", "pg_tile_ambiguous": "Nejasno",
"pg_tile_ambiguous_tip": "Ciklusi s gotovo izjednačenim rezultatom između dva programa", "pg_tile_ambiguous_tip": "Ciklusi s gotovo izjednačenim rezultatom između dva programa",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Primijeniti najbolju vrijednost: {label} = {value}?", "pg_apply_confirm": "Primijeniti najbolju vrijednost: {label} = {value}?",
"pg_canvas_empty": "Odaberite ciklus iznad, zatim pritisnite Učitaj za prikaz njegovog tijeka snage.", "pg_canvas_empty": "Odaberite ciklus iznad, zatim pritisnite Učitaj za prikaz njegovog tijeka snage.",
"pg_chart_caption": "Stopa otkrivanja/podudaranja po vrijednostima {param}", "pg_chart_caption": "Stopa otkrivanja/podudaranja po vrijednostima {param}",
"pg_ctrl_intro": "Vrijednosti polaze od aktivnih postavki integracije za ovaj uređaj. Izmjene ostaju u pješčaniku dok ih ne spremite u integraciju.",
"pg_live_unavailable": "Aktivne postavke nisu dostupne, prikazane su zadane vrijednosti.",
"pg_load_live_confirm": "Odbaciti izmjene u pješčaniku ({n}) i ponovno učitati trenutne postavke integracije?",
"pg_match_rate": "{pct}% stopa podudaranja na {total} ciklusa", "pg_match_rate": "{pct}% stopa podudaranja na {total} ciklusa",
"pg_matches_live": "Podudara se s aktivnim postavkama",
"pg_n_changed": "Promijenjeno u odnosu na aktivne postavke: {n}",
"pg_sugg_none": "Svi prijedlozi već odgovaraju trenutnim postavkama",
"pg_preset_delete_confirm": "Izbrisati preset \"{name}\"?",
"pg_preset_limit": "Dosegnut limit preseta ({n})",
"pg_preset_overwrite": "Prepisati preset \"{name}\"?",
"pg_publish_one_confirm": "Spremiti {label} = {value} u postavke ovog uređaja?",
"pg_restart_note": "Ponovno pokrenite Home Assistant kako biste omogućili alate za simulaciju.", "pg_restart_note": "Ponovno pokrenite Home Assistant kako biste omogućili alate za simulaciju.",
"pg_sim_progress": "{done} / {total} ciklusa", "pg_sim_progress": "{done} / {total} ciklusa",
"pg_starting": "Pokretanje…", "pg_starting": "Pokretanje…",
@@ -789,6 +867,7 @@
"preferences_admin": "Postavke, panel i kontrola pristupa", "preferences_admin": "Postavke, panel i kontrola pristupa",
"preferences_adv": "Postavke", "preferences_adv": "Postavke",
"prefs_personal": "Ovo se odnosi samo na vaš račun Home Assistant.", "prefs_personal": "Ovo se odnosi samo na vaš račun Home Assistant.",
"font_size_hint": "Povećajte ili smanjite sve u ovoj ploči. Primjenjuje se na vaš račun na ovom uređaju.",
"process_history_hint": "Ponovo pokrenite uparivanje na svim pohranjenim ciklusima, osvježite prijedloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i preračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.", "process_history_hint": "Ponovo pokrenite uparivanje na svim pohranjenim ciklusima, osvježite prijedloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i preračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.",
"profile_deleted": "Profil izbrisan", "profile_deleted": "Profil izbrisan",
"profile_poor_health_detail": "Ciklusi dodijeljeni ovom profilu imaju nedosljedne oblike ili nisku pouzdanost. Razmislite o ponovnoj izradi omotnice ili pregledu označenih ciklusa.", "profile_poor_health_detail": "Ciklusi dodijeljeni ovom profilu imaju nedosljedne oblike ili nisku pouzdanost. Razmislite o ponovnoj izradi omotnice ili pregledu označenih ciklusa.",
@@ -821,6 +900,10 @@
"split_intro": "Pritisnite grafikon da biste dodali ili uklonili točku razdvajanja ili automatsko otkrivanje praznina u mirovanju. Svaki rezultirajući segment može dobiti svoj profil.", "split_intro": "Pritisnite grafikon da biste dodali ili uklonili točku razdvajanja ili automatsko otkrivanje praznina u mirovanju. Svaki rezultirajući segment može dobiti svoj profil.",
"storage_diagnostics": "Statistika pohrane, održavanje, izvoz/uvoz", "storage_diagnostics": "Statistika pohrane, održavanje, izvoz/uvoz",
"sug_staged": "Postavljeno {key} = {val}. Spremi za primjenu.", "sug_staged": "Postavljeno {key} = {val}. Spremi za primjenu.",
"sug_muted": "Ova postavka više neće biti predlagana",
"sug_mute_failed": "Nije moguće utišati prijedlog",
"sug_unmuted_all": "Utišani prijedlozi poništeni",
"n_suggestions_muted": "{count} utišano; automatski podešavač neće predlagati ove postavke.",
"toast_auto_detect_enabled": "Automatsko otkrivanje omogućeno", "toast_auto_detect_enabled": "Automatsko otkrivanje omogućeno",
"toast_auto_label_complete": "Automatsko označavanje dovršeno", "toast_auto_label_complete": "Automatsko označavanje dovršeno",
"toast_auto_label_failed": "Automatsko označavanje neuspješno: {error}", "toast_auto_label_failed": "Automatsko označavanje neuspješno: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Trajanje je sve kraće ({pct}%/ciklus) nedavni prosjek {avg}", "trend_duration_shorter": "Trajanje je sve kraće ({pct}%/ciklus) nedavni prosjek {avg}",
"trend_energy_down": "Energija opada ({pct}%/ciklus)", "trend_energy_down": "Energija opada ({pct}%/ciklus)",
"trend_energy_up": "Energija raste ({pct}%/ciklus) nedavni prosjek {avg}", "trend_energy_up": "Energija raste ({pct}%/ciklus) nedavni prosjek {avg}",
"trim_destructive_confirm": "Ovo zadržava samo {pct}% ciklusa i ne može se poništiti. Nastaviti?",
"trim_intro": "Povucite crvene ručice ili unesite vrijednosti. Sve izvan prozora je uklonjeno.", "trim_intro": "Povucite crvene ručice ili unesite vrijednosti. Sve izvan prozora je uklonjeno.",
"tuning_suggestions_available": "{count} prijedlog podešavanja dostupan iz promatranih ciklusa. Pojavljuju se pored relevantnih polja.", "tuning_suggestions_available": "{count} prijedlog podešavanja dostupan iz promatranih ciklusa. Pojavljuju se pored relevantnih polja.",
"unsure_detected_prefix": "WashData nije siguran da je otkriven", "unsure_detected_prefix": "WashData nije siguran da je otkriven",
@@ -970,6 +1054,10 @@
"unusable": "Neupotrebljiv" "unusable": "Neupotrebljiv"
}, },
"section": { "section": {
"dishwasher": {
"label": "Perilica posuđa",
"intro": "Obrada kraja ciklusa za perilice posuđa, koje obično završavaju dugom, gotovo tihom fazom sušenja prije kratkog završnog ispumpavanja vode."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Način anti-bore/anti-gužve otkriva impulse prevrtanja male snage nakon glavne faze i zadržava ih priključene na završeni ciklus.", "intro": "Način anti-bore/anti-gužve otkriva impulse prevrtanja male snage nakon glavne faze i zadržava ih priključene na završeni ciklus.",
"label": "Anti-bore" "label": "Anti-bore"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Otpuštanje nakon tihe faze sušenja",
"doc": "Kada ciklus prijeđe svoje očekivano trajanje, koliko dugo perilica mora ostati tiha (ispod Praga zaustavljanja) prije nego što WashData prestane čekati na završno ispumpavanje vode i završi ciklus. Povećajte ako vaš uređaj ima dugu tihu fazu sušenja prije kasnog završnog ispumpavanja koje se propušta - šire okno omogućuje da naučeno trajanje prati sezonske promjene (hladnija dovodna voda = dulji ciklusi) umjesto da ostane zaključano na staroj prosječnoj vrijednosti. Čekanje samo skraćuje u odnosu na interno ograničenje završnog ispumpavanja od 30 minuta, nikada ga ne produljuje."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Prepoznajte kratke impulse male snage koje sušilica emitira nakon glavne faze zagrijavanja i držite ih vezanima uz završeni ciklus umjesto da ih čitate kao nove cikluse.", "doc": "Prepoznajte kratke impulse male snage koje sušilica emitira nakon glavne faze zagrijavanja i držite ih vezanima uz završeni ciklus umjesto da ih čitate kao nove cikluse.",
"label": "Omogući otkrivanje anti-bora" "label": "Omogući otkrivanje anti-bora"
@@ -1232,6 +1324,10 @@
"doc": "Nekoliko minuta nakon završetka ciklusa prije slanja podsjetnika za \"istovar stroja\" koji još uvijek čeka. Postavite 0 da biste onemogućili podsjetnik.", "doc": "Nekoliko minuta nakon završetka ciklusa prije slanja podsjetnika za \"istovar stroja\" koji još uvijek čeka. Postavite 0 da biste onemogućili podsjetnik.",
"label": "Odgoda podsjetnika za istovar" "label": "Odgoda podsjetnika za istovar"
}, },
"notify_unload_repeat": {
"doc": "Ponovno šalje podsjetnik za istovar svakih \"Odgoda podsjetnika za istovar\" minuta dok ne otvorite vrata ili ne dodirnete \"Prestani podsjećati\" na obavijesti. Zahtijeva Entitet senzora vrata (kao i sam podsjetnik). Gumb za odbacivanje radi na obavijestima mobilne aplikacije Home Assistant (companion app).",
"label": "Ponavljaj dok se vrata ne otvore"
},
"off_delay": { "off_delay": {
"doc": "Vrijeme čekanja nakon pada struje prije nego što se proglasi da je ciklus završen. Ako se struja nastavi unutar ovog prozora, ciklus se nastavlja neprimjetno - ovo premošćuje pauze između faza pranja. Perilice posuđa imaju duge faze sušenja (isključivanje na 20-60 min) tako da odgoda isključivanja mora biti veća od te kako bi cijeli ciklus pranja+sušenja bio jedan ciklus.", "doc": "Vrijeme čekanja nakon pada struje prije nego što se proglasi da je ciklus završen. Ako se struja nastavi unutar ovog prozora, ciklus se nastavlja neprimjetno - ovo premošćuje pauze između faza pranja. Perilice posuđa imaju duge faze sušenja (isključivanje na 20-60 min) tako da odgoda isključivanja mora biti veća od te kako bi cijeli ciklus pranja+sušenja bio jedan ciklus.",
"label": "Odgoda isključivanja" "label": "Odgoda isključivanja"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Oštrina energije", "label": "Oštrina energije",
"doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava ocjenu. Zadana vrijednost 0,25 je namjerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije." "doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava ocjenu. Zadana vrijednost 0,25 je namjerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije."
},
"power_profile_interval_min": {
"label": "Interval profila snage",
"doc": "Veličina segmenta za atribut senzora power_profile po profilu (polje prosječnih vata po slotu koje koriste vanjski planeri poput EMHASS i tibber_prices). Manji segmenti zadržavaju kratke skokove snage oštrima; veći segmenti zaglađuju oblik. Zadano 15 min. Samo za čitanje; ne utječe na otkrivanje."
},
"notify_live_sticky": {
"label": "Zadrži živu obavijest pri dodiru",
"doc": "Samo Android. Živu obavijest o napretku postavite kao trajnu (prikvačenu) kako dodir ne bi odbacio aktivnu nit. Isključeno zadržava zadano ponašanje gdje dodir odbacuje obavijest."
},
"notify_live_click_action": {
"label": "Odredište dodira na živoj obavijesti",
"doc": "Samo Android. Gdje dodir na živu obavijest o napretku otvara (npr. /lovelace/laundry ili cijeli URL) umjesto početne stranice aplikacije. Ostavite prazno za zadano."
},
"door_opens_at_end": {
"label": "Vrata se automatski otvaraju na kraju",
"doc": "Za perilice posuđa koje na kraju ciklusa otvaraju vrata radi sušenja (AirDry i slično). Kada je uključeno, otvaranje vrata za vrijeme pokrenuta ciklusa više ne zaustavlja ciklus zauvijek; umjesto toga, ako vrata ostanu otvorena koliko je navedeno ispod, WashData smatra ciklus završenim. Kratko otvaranje (dodavanje predmeta) se zanemaruje. Zahtijeva entitet senzora vrata."
},
"door_end_dwell_seconds": {
"label": "Zadržavanje otvorenih vrata za završetak",
"doc": "Koliko dugo vrata moraju ostati otvorena prije nego WashData završi ciklus, kada je uključena postavka \"Vrata se automatski otvaraju na kraju\". Dovoljno dugo da se ignorira brzo dodavanje posuđa (zadano 60 s), dovoljno kratko za brz završetak kad perilica otvori vrata."
} }
}, },
"setting_group": { "setting_group": {
@@ -1592,6 +1708,7 @@
"min_active": "Na temelju najmanje radne snage ({min}W) uočene u posljednjem ciklusu.", "min_active": "Na temelju najmanje radne snage ({min}W) uočene u posljednjem ciklusu.",
"min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprječavaju prijevremene potvrde.", "min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprječavaju prijevremene potvrde.",
"min_off_gap": "Na temelju {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.", "min_off_gap": "Na temelju {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.",
"min_off_gap_bridge": "Postavljeno tako da premosti najdulji tihi odsječak unutar ciklusa: {span}s + 60s rezerve, iz {spans} premoštenih razmaka kroz {cycles} čistih ciklusa (ostaje ispod vašeg najkraćeg razmaka između dva uzastopna pokretanja, koji iznosi {ceiling}s).",
"min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}", "min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}",
"ml_auto_label": "Najniža pouzdanost koju je model kvalitete još ocijenio čistom (p10 od {cycles} čistih ciklusa = {p10}).", "ml_auto_label": "Najniža pouzdanost koju je model kvalitete još ocijenio čistom (p10 od {cycles} čistih ciklusa = {p10}).",
"ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocijenio s >50 %; zatraži {val} potvrdu/potvrde kraja.", "ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocijenio s >50 %; zatraži {val} potvrdu/potvrde kraja.",
@@ -1608,7 +1725,7 @@
"thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage stroja.", "thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage stroja.",
"tol_per_profile": "p75 varijance trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosljedni profili nisu kažnjeni.", "tol_per_profile": "p75 varijance trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosljedni profili nisu kažnjeni.",
"tol_pooled": "Na temelju objedinjene varijance trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).", "tol_pooled": "Na temelju objedinjene varijance trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).",
"watchdog": "Zadržano što nižim uz sigurnost (3x razmak ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." "watchdog": "Zadržano što nižim uz sigurnost (tik iznad razmaka ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja."
}, },
"exclusions": { "exclusions": {
"summary": "Isključeno {total} pogrešno otkrivenih ciklusa: {parts}.", "summary": "Isključeno {total} pogrešno otkrivenih ciklusa: {parts}.",
@@ -1688,6 +1805,10 @@
"name_required": "Ime je potrebno", "name_required": "Ime je potrebno",
"no_split_found": "Nisu pronađeni razmaci u praznom hodu za cijepanje", "no_split_found": "Nisu pronađeni razmaci u praznom hodu za cijepanje",
"panel_settings_saved": "Postavke ploče su spremljene", "panel_settings_saved": "Postavke ploče su spremljene",
"pg_preset_loaded": "Preset \"{name}\" učitan",
"pg_preset_saved": "Preset \"{name}\" spremljen",
"pg_sugg_loaded": "Učitano {n} predloženih vrijednosti - pokrenite pješčanik za usporedbu",
"pg_sugg_ml_loaded": "Učitano {n} ML-kalibriranih vrijednosti - pokrenite pješčanik za usporedbu",
"phase_name_required": "Potreban je naziv faze", "phase_name_required": "Potreban je naziv faze",
"phase_updated": "Faza ažurirana", "phase_updated": "Faza ažurirana",
"phases_saved": "Faze spremljene", "phases_saved": "Faze spremljene",
@@ -1770,6 +1891,7 @@
"other": "Ostalo" "other": "Ostalo"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Perilica posuđa: sekunde tišine nakon očekivanog trajanja prije nego što se otpusti čekanje na završno ispumpavanje vode",
"anti_wrinkle_enabled": "Upij impulse bubnja nakon glavne faze, a ne čitaj ih kao nove cikluse", "anti_wrinkle_enabled": "Upij impulse bubnja nakon glavne faze, a ne čitaj ih kao nove cikluse",
"anti_wrinkle_exit_power": "Snaga mora pasti ispod ove vrijednosti između impulsa da bi anti-bora ostala aktivna", "anti_wrinkle_exit_power": "Snaga mora pasti ispod ove vrijednosti između impulsa da bi anti-bora ostala aktivna",
"anti_wrinkle_idle_timeout": "Dopušteno vrijeme mirovanja između dva impulsa bubnja prije nego što anti-bora završi", "anti_wrinkle_idle_timeout": "Dopušteno vrijeme mirovanja između dva impulsa bubnja prije nego što anti-bora završi",
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "mín.",
"entity_not_found": "Eining fannst ekki",
"running_long": "Keyrir lengur",
"remaining": "eftir",
"progress": "framvinda",
"show_time_remaining": "Sýna tíma sem eftir er",
"show_percentage": "Sýna prósentu",
"layout": {
"tile": "Reitur (þjappað)",
"detail": "Nánar (ítarlegt)",
"glance": "Yfirlit (mörg tæki)"
},
"btn": {
"pause": "Gera hlé",
"resume": "Halda áfram",
"terminate": "Ljúka lotu",
"record_start": "Hefja upptöku",
"record_stop": "Stöðva upptöku",
"program": "Prógramm",
"open_panel": "Opna WashData"
},
"editor": {
"layout": "Útlit",
"entity": "Tækjaeining",
"entities": "Tæki",
"title": "Titill",
"icon": "Tákn",
"show_state": "Sýna stöðu",
"show_program": "Sýna prógramm",
"show_progress_bar": "Sýna framvindustiku",
"spin_icon": "Snúa tákni meðan á keyrslu stendur",
"display_mode": "Upplýsingalína",
"active_color": "Hnekkja virkum lit",
"show_phase": "Sýna fasa",
"show_energy": "Sýna orku og kostnað",
"show_anomaly": "Sýna viðvörun um langa keyrslu",
"show_sparkline": "Sýna rauntíma aflgraf",
"buttons": "Aðgerðahnappar",
"program_entity": "Prógramm-eining (hnekkja)",
"time_entity": "Tímaeining (hnekkja)",
"pct_entity": "Framvindueining (hnekkja)",
"power_entity": "Afleining (hnekkja)",
"tap_action": "Bankaðgerð",
"hold_action": "Haldaðgerð",
"double_tap_action": "Tvíbankaaðgerð"
}
},
"badge": { "badge": {
"artifact_tip": "{n} frávik fundust (t.d. hurð opnuð í miðjum lotu) opnaðu til að sjá þau á línuritinu", "artifact_tip": "{n} frávik fundust (t.d. hurð opnuð í miðjum lotu) opnaðu til að sjá þau á línuritinu",
"auto": "(sjálfvirkt greint)", "auto": "(sjálfvirkt greint)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Gerðu hlé á gengandi lotu tækið mun halda áfram þar sem það stoppaði", "pause_cycle_tip": "Gerðu hlé á gengandi lotu tækið mun halda áfram þar sem það stoppaði",
"pg_apply_device": "Beita á tæki", "pg_apply_device": "Beita á tæki",
"pg_autofill": "Fylla sjálfkrafa", "pg_autofill": "Fylla sjálfkrafa",
"pg_load_calibrated": "Hlaða kvarðaðar (ML) ({n})",
"pg_load_calibrated_tip": "Flytur ML-kvarðaðar stillingar sem hnekki á tilraunasvæðið",
"pg_load_live": "Sækja virkar stillingar",
"pg_load_live_tip": "Lesa núverandi stillingar samþættingarinnar aftur og henda öllum breytingum á tilraunasvæðinu",
"pg_load_suggested": "Hlaða tillögur ({n})",
"pg_load_suggested_tip": "Flytur núverandi tillögur sjálfvirkrar stillingar sem hnekki á tilraunasvæðið",
"pg_preset_delete": "Eyða forstillingu",
"pg_preset_load": "Hlaða forstillingu",
"pg_preset_load_tip": "Skipta gildunum á tilraunasvæðinu út fyrir þessa forstillingu (virku stillingarnar haldast óbreyttar)",
"pg_preset_save": "Vista sem forstillingu",
"pg_preset_save_tip": "Vista öll gildin hér að neðan sem nefnda forstillingu fyrir þetta tæki",
"pg_publish_all": "Vista {n} í samþættinguna",
"pg_publish_one": "Vista {label} í samþættinguna",
"play": "Spila", "play": "Spila",
"process": "Vinna", "process": "Vinna",
"process_history": "Vinnið núna", "process_history": "Vinnið núna",
@@ -178,7 +239,9 @@
"download_export": "Sækja útflutning", "download_export": "Sækja útflutning",
"analyze_import": "Greina skrá", "analyze_import": "Greina skrá",
"import_selected": "Flytja inn valið", "import_selected": "Flytja inn valið",
"back": "Til baka" "back": "Til baka",
"mute_suggestion": "Hætta að stinga upp á þessari stillingu",
"reset_muted": "Endurstilla þaggaðar tillögur"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,8 +338,9 @@
"no_automations": "Engar sjálfvirkni vísar til þessa tækis ennþá.", "no_automations": "Engar sjálfvirkni vísar til þessa tækis ennþá.",
"panel_settings": "Pallborðsstillingar", "panel_settings": "Pallborðsstillingar",
"param_sweep": "Færibreytuyfirferð", "param_sweep": "Færibreytuyfirferð",
"pg_settings_source": "Uppruni stillinga",
"phase_catalog": "Áfangaskrá", "phase_catalog": "Áfangaskrá",
"playground": "Leikvöllur", "playground": "Tilraunasvæði",
"process_history": "Ferlissaga", "process_history": "Ferlissaga",
"settings_history": "Stillingasaga", "settings_history": "Stillingasaga",
"status": "Staða", "status": "Staða",
@@ -410,6 +474,9 @@
"pg_group_detection": "Skynjunarkveikjur", "pg_group_detection": "Skynjunarkveikjur",
"pg_group_timing": "Tímasetningarreglur", "pg_group_timing": "Tímasetningarreglur",
"pg_idle": "Aðgerðalaus", "pg_idle": "Aðgerðalaus",
"pg_preset": "Forstilling tilraunasvæðis",
"pg_preset_name": "Nafn á nýrri forstillingu",
"pg_preset_none": "Veldu forstillingu…",
"pg_stress_group": "Próf á aðgerðalausum lokum", "pg_stress_group": "Próf á aðgerðalausum lokum",
"pg_stress_idle_auto": "Auto", "pg_stress_idle_auto": "Auto",
"pg_stress_idle_w": "Aðgerðalaust stig (W)", "pg_stress_idle_w": "Aðgerðalaust stig (W)",
@@ -609,7 +676,8 @@
"conflict_import_copy": "Flytja inn sem afrit", "conflict_import_copy": "Flytja inn sem afrit",
"conflict_keep_mine": "Halda mínum", "conflict_keep_mine": "Halda mínum",
"conflict_overwrite": "Skrifa yfir", "conflict_overwrite": "Skrifa yfir",
"pg_anti_wrinkle": "Hrukkuleysi" "pg_anti_wrinkle": "Hrukkuleysi",
"font_size": "Leturstærð glugga"
}, },
"log": { "log": {
"all_levels": "Öll stig", "all_levels": "Öll stig",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Beita besta gildi: {label} = {value}?", "pg_apply_confirm": "Beita besta gildi: {label} = {value}?",
"pg_canvas_empty": "Veldu lotu að ofan og ýttu svo á Hlaða til að sjá aflferil hennar.", "pg_canvas_empty": "Veldu lotu að ofan og ýttu svo á Hlaða til að sjá aflferil hennar.",
"pg_chart_caption": "Greiningar-/samsvörunarhlutfall eftir gildum {param}", "pg_chart_caption": "Greiningar-/samsvörunarhlutfall eftir gildum {param}",
"pg_ctrl_intro": "Gildin byrja á virkum stillingum þessa tækis í samþættingunni. Breytingar haldast á tilraunasvæðinu þar til þú vistar þær í samþættinguna.",
"pg_live_unavailable": "Virkar stillingar eru ekki tiltækar, sjálfgefin gildi eru sýnd.",
"pg_load_live_confirm": "Henda {n} breytingu(m) á tilraunasvæðinu og hlaða núverandi stillingum samþættingarinnar aftur?",
"pg_match_rate": "{pct}% samsvörunarhlutfall á {total} lotum", "pg_match_rate": "{pct}% samsvörunarhlutfall á {total} lotum",
"pg_matches_live": "Samsvarar virkum stillingum",
"pg_n_changed": "{n} breytt miðað við virkar stillingar",
"pg_sugg_none": "Allar tillögur stemma nú þegar við virkar stillingar",
"pg_preset_delete_confirm": "Eyða forstillingunni \"{name}\"?",
"pg_preset_limit": "Hámarksfjölda forstillinga náð ({n})",
"pg_preset_overwrite": "Skrifa yfir forstillinguna \"{name}\"?",
"pg_publish_one_confirm": "Vista {label} = {value} í stillingar þessa tækis?",
"pg_restart_note": "Endurræstu Home Assistant til að virkja hermitólin.", "pg_restart_note": "Endurræstu Home Assistant til að virkja hermitólin.",
"pg_sim_progress": "{done} / {total} lotur", "pg_sim_progress": "{done} / {total} lotur",
"pg_starting": "Ræsir…", "pg_starting": "Ræsir…",
@@ -784,8 +862,8 @@
"pg_verdict_ok": "Ásættanlegt: sumar lotur misstust. Prófaðu að lækka upphafsþröskuldinn.", "pg_verdict_ok": "Ásættanlegt: sumar lotur misstust. Prófaðu að lækka upphafsþröskuldinn.",
"phase_catalog_intro": "Nafngreindir hlutar hringrásar (Forþvottur, Upphitun, Snúning…). Úthlutaðu þeim á prófíl frá stjórnborði þess.", "phase_catalog_intro": "Nafngreindir hlutar hringrásar (Forþvottur, Upphitun, Snúning…). Úthlutaðu þeim á prófíl frá stjórnborði þess.",
"phase_ranges_intro": "Áfangasvið (mínútur frá upphafi lotu) lögð yfir meðalferilinn. Breyttu gildum til að forskoða í beinni.", "phase_ranges_intro": "Áfangasvið (mínútur frá upphafi lotu) lögð yfir meðalferilinn. Breyttu gildum til að forskoða í beinni.",
"playground_intro": "Öruggt leiksvæði til að spila fyrri lotur aftur með mismunandi stillingum, bera saman tvær uppsetningar hlið við hlið og skoða hvernig lota samræmist sniði. Ekkert hér breytir raungögnunum þínum fyrr en þú beitir því sérstaklega.", "playground_intro": "Öruggt tilraunasvæði til að spila fyrri lotur aftur með mismunandi stillingum, bera saman tvær uppsetningar hlið við hlið og skoða hvernig lota samræmist sniði. Ekkert hér breytir raungögnunum þínum fyrr en þú beitir því sérstaklega.",
"playground_needs_restart": "Endurræstu Home Assistant til að virkja Leiksvæðistólin.", "playground_needs_restart": "Endurræstu Home Assistant til að virkja tólin á Tilraunasvæðinu.",
"preferences_admin": "Óskir, pallborð og aðgangsstýring", "preferences_admin": "Óskir, pallborð og aðgangsstýring",
"preferences_adv": "Óskir", "preferences_adv": "Óskir",
"prefs_personal": "Þetta á aðeins við um Home Assistant reikninginn þinn.", "prefs_personal": "Þetta á aðeins við um Home Assistant reikninginn þinn.",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Tímalengd styttist ({pct}%/lotu) nýleg meðaltal {avg}", "trend_duration_shorter": "Tímalengd styttist ({pct}%/lotu) nýleg meðaltal {avg}",
"trend_energy_down": "Orka á niðurleið ({pct}%/lotu)", "trend_energy_down": "Orka á niðurleið ({pct}%/lotu)",
"trend_energy_up": "Orka hækkar ({pct}%/lotu) nýleg meðaltal {avg}", "trend_energy_up": "Orka hækkar ({pct}%/lotu) nýleg meðaltal {avg}",
"trim_destructive_confirm": "Aðeins {pct}% af lotunni verður eftir. Þetta er ekki hægt að afturkalla. Halda áfram?",
"trim_intro": "Dragðu rauðu handföngin eða sláðu inn gildi. Allt fyrir utan gluggann er fjarlægt.", "trim_intro": "Dragðu rauðu handföngin eða sláðu inn gildi. Allt fyrir utan gluggann er fjarlægt.",
"tuning_suggestions_available": "{count} uppástunga að stilla í boði frá athuguðum lotum. Þau birtast við hlið viðkomandi reita.", "tuning_suggestions_available": "{count} uppástunga að stilla í boði frá athuguðum lotum. Þau birtast við hlið viðkomandi reita.",
"unsure_detected_prefix": "WashData er ekki viss um að það hafi fundist", "unsure_detected_prefix": "WashData er ekki viss um að það hafi fundist",
@@ -922,9 +1001,15 @@
"merge_hint": "Innfluttum atriðum er bætt við; ekkert staðbundið tapast. Nafnaárekstrar eru leystir hér að neðan.", "merge_hint": "Innfluttum atriðum er bætt við; ekkert staðbundið tapast. Nafnaárekstrar eru leystir hér að neðan.",
"replace_warn": "Hver valinn flokkur er hreinsaður og settur í staðinn úr skránni. Óvaldir flokkar haldast óbreyttir.", "replace_warn": "Hver valinn flokkur er hreinsaður og settur í staðinn úr skránni. Óvaldir flokkar haldast óbreyttir.",
"dest_reference_hint": "Innfluttar lotur bæta aðeins forritasamsvörun og hafa aldrei áhrif á notkunar-/orkutölfræði.", "dest_reference_hint": "Innfluttar lotur bæta aðeins forritasamsvörun og hafa aldrei áhrif á notkunar-/orkutölfræði.",
"dest_real_history_hint": "Innfluttar lotur teljast sem eigin saga þessa tækis og fæða orku-/notkunartölfræði. Notaðu þetta til að flytja eitt tæki yfir í nýja uppsetningu." "dest_real_history_hint": "Innfluttar lotur teljast sem eigin saga þessa tækis og fæða orku-/notkunartölfræði. Notaðu þetta til að flytja eitt tæki yfir í nýja uppsetningu.",
"sug_muted": "Mun ekki stinga upp á þessari stillingu aftur",
"sug_mute_failed": "Gat ekki þaggað tillögu",
"sug_unmuted_all": "Þaggaðar tillögur endurstilltar",
"n_suggestions_muted": "{count} þaggaðar; sjálfvirki stillirinn leggur ekki til þessar.",
"font_size_hint": "Gerðu allt á þessum glugga stærra eða minna. Gildir fyrir reikning þinn á þessum tæki."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Uppþvottavél: hljóðlátar sekúndur eftir áætlaða lengd áður en biðin eftir útdælingu í lok lotu er losuð",
"completion_min_seconds": "Stysta keyrsla sem telst raunveruleg lota", "completion_min_seconds": "Stysta keyrsla sem telst raunveruleg lota",
"end_repeat_count": "Lágir álestrar í röð áður en lýkur", "end_repeat_count": "Lágir álestrar í röð áður en lýkur",
"interrupted_min_seconds": "Stuttar lotur merktar sem truflaðar", "interrupted_min_seconds": "Stuttar lotur merktar sem truflaðar",
@@ -998,6 +1083,10 @@
"unusable": "Ónothæft" "unusable": "Ónothæft"
}, },
"section": { "section": {
"dishwasher": {
"label": "Uppþvottavél",
"intro": "Meðhöndlun loka lotu fyrir uppþvottavélar, sem ljúka yfirleitt með löngum, næstum hljóðlátum þurrkfasa á undan stuttri lokaútdælingu."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Hrukkuleysi-/krumpluleys-stilling greinir lágtaktsveltiboð eftir aðalfasann og heldur þeim tengdum við lokinni lotu.", "intro": "Hrukkuleysi-/krumpluleys-stilling greinir lágtaktsveltiboð eftir aðalfasann og heldur þeim tengdum við lokinni lotu.",
"label": "Hrukkuleysi" "label": "Hrukkuleysi"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Losun eftir hljóðláta þurrkun",
"doc": "Þegar lotan fer fram úr áætlaðri lengd sinni: hversu lengi uppþvottavélin þarf að vera hljóðlát (undir Stöðvunarþröskuldi) áður en WashData hættir að bíða eftir lokaútdælingu og lýkur lotunni. Hækkaðu gildið ef vélin þín er með langan hljóðlátan þurrkfasa á undan seinni lokaútdælingu sem sleppur fram hjá - breiðari gluggi leyfir lærðu lengdinni að fylgja árstíðabundnum breytingum (kaldara innrennslisvatn = lengri lotur) í stað þess að festast við gamla meðaltalið. Það styttir aðeins biðtímann miðað við innra 30 mínútna hámark fyrir lokatoppinn, lengir hann aldrei."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Viðurkenndu stuttu lág-afls þurrkarapúlsana sem þurrkari gefur frá sér eftir aðalhitafasann og haltu þeim tengdum við lokið lotu í stað þess að lesa þá sem nýjar lotur.", "doc": "Viðurkenndu stuttu lág-afls þurrkarapúlsana sem þurrkari gefur frá sér eftir aðalhitafasann og haltu þeim tengdum við lokið lotu í stað þess að lesa þá sem nýjar lotur.",
"label": "Virkja hrukkuleysi-greiningu" "label": "Virkja hrukkuleysi-greiningu"
@@ -1260,6 +1353,10 @@
"doc": "Mínútum eftir að lotu lýkur áður en þú sendir áminninguna um „afferma vélina“ sem enn bíður. Stilltu 0 til að slökkva á áminningunni.", "doc": "Mínútum eftir að lotu lýkur áður en þú sendir áminninguna um „afferma vélina“ sem enn bíður. Stilltu 0 til að slökkva á áminningunni.",
"label": "Losunarminni-seinkun" "label": "Losunarminni-seinkun"
}, },
"notify_unload_repeat": {
"doc": "Heldur áfram að senda losunaráminninguna aftur á \"Losunarminni-seinkun\" mínútna fresti þar til þú opnar hurðina eða ýtir á \"Hætta að minna\" í tilkynningunni. Krefst Dyraskynjareiningar (áminningin sjálf gerir það). Hunsa-hnappurinn virkar á tilkynningum úr Home Assistant fylgiforritinu (farsíma).",
"label": "Endurtaka þar til hurðin opnast"
},
"off_delay": { "off_delay": {
"doc": "Tími til að bíða eftir að kraftur minnkar áður en hringrásinni er lokið. Ef straumur fer aftur innan þessa glugga heldur hringrásin óaðfinnanlega áfram - þetta brúar hlé á milli þvottastiga. Uppþvottavélar eru með langa þurrkunarfasa (slökkt á slökkt í 20-60 mín) þannig að slökkvunartöfin verður að fara yfir það til að halda öllum þvotti+þurrkum sem einni lotu.", "doc": "Tími til að bíða eftir að kraftur minnkar áður en hringrásinni er lokið. Ef straumur fer aftur innan þessa glugga heldur hringrásin óaðfinnanlega áfram - þetta brúar hlé á milli þvottastiga. Uppþvottavélar eru með langa þurrkunarfasa (slökkt á slökkt í 20-60 mín) þannig að slökkvunartöfin verður að fara yfir það til að halda öllum þvotti+þurrkum sem einni lotu.",
"label": "Slökkviðráð" "label": "Slökkviðráð"
@@ -1434,6 +1531,26 @@
"energy_scale": { "energy_scale": {
"label": "Orkuskerpa", "label": "Orkuskerpa",
"doc": "Skerpa í viðurlögum Þreps 4 vegna samræmis í orkunotkun. Minna = strangara: frávik í orkunotkun skemmir meira. Sjálfgefið 0,25 er vísvitandi rýmra en keyrslulengdarskerpan vegna þess að orka breytist með álagi. Notaðu með Orkuþyngd." "doc": "Skerpa í viðurlögum Þreps 4 vegna samræmis í orkunotkun. Minna = strangara: frávik í orkunotkun skemmir meira. Sjálfgefið 0,25 er vísvitandi rýmra en keyrslulengdarskerpan vegna þess að orka breytist með álagi. Notaðu með Orkuþyngd."
},
"power_profile_interval_min": {
"label": "Aflaprófíl-bil",
"doc": "Fötustærð fyrir eigindið power_profile á prófílskynjaraskynjara (flatt fylki meðalwattsgilda á hólf sem notast af ytri skipuleggjendum eins og EMHASS og tibber_prices). Minni fötur halda stuttum aflgöllum skörpum; stærri fötur jafna út ferilinn. Sjálfgefið 15 mín. Eingöngu til birtingar; hefur engin áhrif á greiningu."
},
"notify_live_sticky": {
"label": "Halda lifandi tilkynningu við snertingu",
"doc": "Eingöngu Android. Gerir lifandi framvindutilkynningu viðvarandi (sticky) þannig að snertingar lokar henni ekki. Slökkt: sjálfgefin hegðun þar sem snertingar lokar tilkynningu."
},
"notify_live_click_action": {
"label": "Snertimarkmið lifandi tilkynningar",
"doc": "Eingöngu Android. Hvert snertingar á lifandi framvindutilkynningu opnar (t.d. /lovelace/laundry eða fulla vefslóð) í stað sjálfgefinna ræsiglugga forritsins. Skildu eftir autt fyrir sjálfgefið."
},
"door_opens_at_end": {
"label": "Hurð opnast sjálfkrafa í lok",
"doc": "Fyrir uppþvottavélar sem spretta hurðinni upp í lok hringsins til þurrkunar (AirDry og svipað). Þegar þetta er virkt setur hurðaropnun á yfirstandandi hring hann ekki í bið að eilífu; ef hurðin helst opin í stillt dvaltími meðhöndlar WashData hringinn sem lokinn. Stutt opnun (að bæta við fat) er hundsuð. Krefst hurðarskynjaraeiningar."
},
"door_end_dwell_seconds": {
"label": "Dvaltími hurðar við lok",
"doc": "Hversu lengi hurðin þarf að vera opin áður en WashData lýkur hringnum, þegar \"Hurð opnast sjálfkrafa í lok\" er virkt. Nógu lengi til að hunsa hraða tilbúningu fats (sjálfgefið 60 s), nógu stutt til að ljúka fljótt þegar vél spretter hurðinni upp."
} }
}, },
"setting_group": { "setting_group": {
@@ -1620,6 +1737,7 @@
"min_active": "Byggt á lægsta virka afli ({min}W) sem mældist í síðustu lotu.", "min_active": "Byggt á lægsta virka afli ({min}W) sem mældist í síðustu lotu.",
"min_duration_ratio": "Haldið eins lágu og hægt er svo að kerfi greinist snemma í lotunni; vissu- og tvíræðnimörkin koma í veg fyrir ótímabærar ákvarðanir.", "min_duration_ratio": "Haldið eins lágu og hægt er svo að kerfi greinist snemma í lotunni; vissu- og tvíræðnimörkin koma í veg fyrir ótímabærar ákvarðanir.",
"min_off_gap": "Byggt á {gaps} mældum millibilum milli lota (p05={p05}s). Lágmark tækis: {floor}s.", "min_off_gap": "Byggt á {gaps} mældum millibilum milli lota (p05={p05}s). Lágmark tækis: {floor}s.",
"min_off_gap_bridge": "Stærðin valin til að brúa lengsta kyrrðartímabilið innan lotu: {span}s + 60s biðminni, úr {spans} brúuðum bilum yfir {cycles} hreinar lotur (helst undir stysta bilinu þínu, {ceiling}s, milli tveggja keyrslna).",
"min_power": "40% af lægsta virka afli við p05 ({p05}W) yfir {cycles} hreinar lotur, sem heldur slökkviþröskuldinum undir raunverulegri notkun.{excl}", "min_power": "40% af lægsta virka afli við p05 ({p05}W) yfir {cycles} hreinar lotur, sem heldur slökkviþröskuldinum undir raunverulegri notkun.{excl}",
"ml_auto_label": "Lægsta vissa sem gæðalíkanið mat samt sem hreint (p10 af {cycles} hreinum lotum = {p10}).", "ml_auto_label": "Lægsta vissa sem gæðalíkanið mat samt sem hreint (p10 af {cycles} hreinum lotum = {p10}).",
"ml_end_repeat": "{false}/{total} lotur ({pct}%) höfðu hlé sem lokagreinirinn gaf einkunnina >50%; krefst {val} staðfestinga á lokum.", "ml_end_repeat": "{false}/{total} lotur ({pct}%) höfðu hlé sem lokagreinirinn gaf einkunnina >50%; krefst {val} staðfestinga á lokum.",
@@ -1636,7 +1754,7 @@
"thr_batch": "Haldið rétt yfir lægsta virka afli við p05 yfir {cycles} lotur ({p05}W) svo að ræsing náist eins snemma og hægt er og stöðvunarþröskuldurinn haldist undir lægsta gangafli vélarinnar.", "thr_batch": "Haldið rétt yfir lægsta virka afli við p05 yfir {cycles} lotur ({p05}W) svo að ræsing náist eins snemma og hægt er og stöðvunarþröskuldurinn haldist undir lægsta gangafli vélarinnar.",
"tol_per_profile": "p75 af dreifni lengdar á hvert snið yfir {profiles} snið ({cycles} lotur); þröngum sniðum er ekki refsað.", "tol_per_profile": "p75 af dreifni lengdar á hvert snið yfir {profiles} snið ({cycles} lotur); þröngum sniðum er ekki refsað.",
"tol_pooled": "Byggt á sameinaðri dreifni lengdar {cycles} nýjustu merktu lota (p95 frávik={dev}).", "tol_pooled": "Byggt á sameinaðri dreifni lengdar {cycles} nýjustu merktu lota (p95 frávik={dev}).",
"watchdog": "Haldið eins lágu og óhætt er (3x p95-uppfærslubilið {p95}s, lágm. 30s) svo að stöðnun greinist fljótt án falskra stöðvana." "watchdog": "Haldið eins lágu og óhætt er (rétt yfir p95-uppfærslubilinu {p95}s, lágm. 30s) svo að stöðnun greinist fljótt án falskra stöðvana."
}, },
"exclusions": { "exclusions": {
"summary": "Útilokaði {total} ranggreindar lotur: {parts}.", "summary": "Útilokaði {total} ranggreindar lotur: {parts}.",
@@ -1670,7 +1788,7 @@
"subtab_phase_catalog": "Áfangaskrá", "subtab_phase_catalog": "Áfangaskrá",
"subtab_profiles": "Snið", "subtab_profiles": "Snið",
"maintenance": "Viðhald", "maintenance": "Viðhald",
"playground": "Leiksvæði", "playground": "Tilraunasvæði",
"store": "Verslun" "store": "Verslun"
}, },
"tag": { "tag": {
@@ -1716,6 +1834,10 @@
"name_required": "Nafn krafist", "name_required": "Nafn krafist",
"no_split_found": "Engar aðgerðalausar eyður fundust til að skipta á", "no_split_found": "Engar aðgerðalausar eyður fundust til að skipta á",
"panel_settings_saved": "Pallborðsstillingar vistaðar", "panel_settings_saved": "Pallborðsstillingar vistaðar",
"pg_preset_loaded": "Forstillingin \"{name}\" var hlaðin",
"pg_preset_saved": "Forstillingin \"{name}\" var vistuð",
"pg_sugg_loaded": "{n} tillögugildi flutt yfir - keyrðu tilraunasvæðið til að bera saman",
"pg_sugg_ml_loaded": "{n} ML-kvarðað gildi flutt yfir - keyrðu tilraunasvæðið til að bera saman",
"phase_name_required": "Fasaheiti er áskilið", "phase_name_required": "Fasaheiti er áskilið",
"phase_updated": "Áfangi uppfærður", "phase_updated": "Áfangi uppfærður",
"phases_saved": "Áfangar vistaðir", "phases_saved": "Áfangar vistaðir",
@@ -92,6 +92,19 @@
"pause_cycle_tip": "Metti in pausa il ciclo in corso l'elettrodomestico riprenderà da dove si era fermato", "pause_cycle_tip": "Metti in pausa il ciclo in corso l'elettrodomestico riprenderà da dove si era fermato",
"pg_apply_device": "Applica al dispositivo", "pg_apply_device": "Applica al dispositivo",
"pg_autofill": "Compilazione automatica", "pg_autofill": "Compilazione automatica",
"pg_load_calibrated": "Carica Calibrato (ML) ({n})",
"pg_load_calibrated_tip": "Carica le impostazioni calibrate da ML come sostituzioni nel Playground",
"pg_load_live": "Carica le impostazioni attive",
"pg_load_live_tip": "Rileggi le impostazioni attuali dell'integrazione e scarta tutte le modifiche fatte nel Playground",
"pg_load_suggested": "Carica suggerimenti ({n})",
"pg_load_suggested_tip": "Carica i suggerimenti attuali dell'ottimizzatore automatico come sostituzioni nel Playground",
"pg_preset_delete": "Elimina preimpostazione",
"pg_preset_load": "Carica preimpostazione",
"pg_preset_load_tip": "Sostituisci i valori del Playground con questa preimpostazione (le impostazioni attive non vengono toccate)",
"pg_preset_save": "Salva come preimpostazione",
"pg_preset_save_tip": "Salva tutti i valori qui sotto come preimpostazione con nome per questo dispositivo",
"pg_publish_all": "Salva {n} impostazioni nell'integrazione",
"pg_publish_one": "Salva {label} nell'integrazione",
"play": "Riproduci", "play": "Riproduci",
"process": "Processo", "process": "Processo",
"process_history": "Elabora ora", "process_history": "Elabora ora",
@@ -178,7 +191,9 @@
"download_export": "Scarica l'esportazione", "download_export": "Scarica l'esportazione",
"analyze_import": "Analizza il file", "analyze_import": "Analizza il file",
"import_selected": "Importa la selezione", "import_selected": "Importa la selezione",
"back": "Indietro" "back": "Indietro",
"mute_suggestion": "Non suggerire più questa impostazione",
"reset_muted": "Ripristina i silenziati"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +290,7 @@
"no_automations": "Nessuna automazione fa ancora riferimento a questo dispositivo.", "no_automations": "Nessuna automazione fa ancora riferimento a questo dispositivo.",
"panel_settings": "Impostazioni del pannello", "panel_settings": "Impostazioni del pannello",
"param_sweep": "Scansione parametri", "param_sweep": "Scansione parametri",
"pg_settings_source": "Origine delle impostazioni",
"phase_catalog": "Catalogo delle fasi", "phase_catalog": "Catalogo delle fasi",
"playground": "Playground", "playground": "Playground",
"process_history": "Storia del processo", "process_history": "Storia del processo",
@@ -415,6 +431,9 @@
"pg_match_score": "Punteggio di abbinamento", "pg_match_score": "Punteggio di abbinamento",
"pg_pct_of": "{p}% di {total}", "pg_pct_of": "{p}% di {total}",
"pg_poor_match": "Abbinamento scarso", "pg_poor_match": "Abbinamento scarso",
"pg_preset": "Preimpostazione del Playground",
"pg_preset_name": "Nome della nuova preimpostazione",
"pg_preset_none": "Seleziona una preimpostazione…",
"pg_strong_match": "Abbinamento forte", "pg_strong_match": "Abbinamento forte",
"pg_tile_ambiguous": "Ambiguo", "pg_tile_ambiguous": "Ambiguo",
"pg_tile_ambiguous_tip": "Cicli con un quasi pareggio tra due programmi", "pg_tile_ambiguous_tip": "Cicli con un quasi pareggio tra due programmi",
@@ -609,7 +628,8 @@
"conflict_resolution": "Conflitti di nome", "conflict_resolution": "Conflitti di nome",
"conflict_import_copy": "Importa come copia", "conflict_import_copy": "Importa come copia",
"conflict_keep_mine": "Mantieni il mio", "conflict_keep_mine": "Mantieni il mio",
"conflict_overwrite": "Sovrascrivi" "conflict_overwrite": "Sovrascrivi",
"font_size": "Dimensione testo del pannello"
}, },
"log": { "log": {
"all_levels": "Tutti i livelli", "all_levels": "Tutti i livelli",
@@ -771,7 +791,17 @@
"pg_apply_confirm": "Applicare il valore migliore: {label} = {value}?", "pg_apply_confirm": "Applicare il valore migliore: {label} = {value}?",
"pg_canvas_empty": "Seleziona un ciclo qui sopra, quindi premi Carica per vederne la curva di potenza.", "pg_canvas_empty": "Seleziona un ciclo qui sopra, quindi premi Carica per vederne la curva di potenza.",
"pg_chart_caption": "Tasso di rilevamento/abbinamento sui valori di {param}", "pg_chart_caption": "Tasso di rilevamento/abbinamento sui valori di {param}",
"pg_ctrl_intro": "I valori partono dalle impostazioni attive di questo dispositivo nell'integrazione. Le modifiche restano nel Playground finché non le salvi nell'integrazione.",
"pg_live_unavailable": "Impostazioni attive non disponibili, vengono mostrati i valori predefiniti.",
"pg_load_live_confirm": "Scartare {n} modifiche del Playground e ricaricare le impostazioni attuali dell'integrazione?",
"pg_match_rate": "{pct}% di tasso di abbinamento su {total} cicli", "pg_match_rate": "{pct}% di tasso di abbinamento su {total} cicli",
"pg_matches_live": "Corrisponde alle impostazioni attive",
"pg_n_changed": "{n} valori diversi dalle impostazioni attive",
"pg_sugg_none": "Tutti i suggerimenti corrispondono già alle impostazioni attuali",
"pg_preset_delete_confirm": "Eliminare la preimpostazione \"{name}\"?",
"pg_preset_limit": "Limite di preimpostazioni raggiunto ({n})",
"pg_preset_overwrite": "Sovrascrivere la preimpostazione \"{name}\"?",
"pg_publish_one_confirm": "Salvare {label} = {value} nelle impostazioni di questo dispositivo?",
"pg_restart_note": "Riavvia Home Assistant per abilitare gli strumenti di simulazione.", "pg_restart_note": "Riavvia Home Assistant per abilitare gli strumenti di simulazione.",
"pg_sim_progress": "{done} / {total} cicli", "pg_sim_progress": "{done} / {total} cicli",
"pg_starting": "Avvio…", "pg_starting": "Avvio…",
@@ -845,6 +875,7 @@
"trend_duration_shorter": "La durata tendenzialmente è più breve ({pct}%/ciclo) media recente {avg}", "trend_duration_shorter": "La durata tendenzialmente è più breve ({pct}%/ciclo) media recente {avg}",
"trend_energy_down": "Energia in diminuzione ({pct}%/ciclo)", "trend_energy_down": "Energia in diminuzione ({pct}%/ciclo)",
"trend_energy_up": "Energia in aumento ({pct}%/ciclo) media recente {avg}", "trend_energy_up": "Energia in aumento ({pct}%/ciclo) media recente {avg}",
"trim_destructive_confirm": "Questo mantiene solo il {pct}% del ciclo e l'operazione non può essere annullata. Continuare?",
"trim_intro": "Trascina le maniglie rosse o inserisci i valori. Tutto fuori dalla finestra viene rimosso.", "trim_intro": "Trascina le maniglie rosse o inserisci i valori. Tutto fuori dalla finestra viene rimosso.",
"tuning_suggestions_available": "{count} suggerimento di ottimizzazione disponibile dai cicli osservati. Appaiono accanto ai campi pertinenti.", "tuning_suggestions_available": "{count} suggerimento di ottimizzazione disponibile dai cicli osservati. Appaiono accanto ai campi pertinenti.",
"unsure_detected_prefix": "WashData non è sicuro di averlo rilevato", "unsure_detected_prefix": "WashData non è sicuro di averlo rilevato",
@@ -922,9 +953,15 @@
"merge_hint": "Gli elementi importati vengono aggiunti; nulla di locale va perso. I conflitti di nome si risolvono qui sotto.", "merge_hint": "Gli elementi importati vengono aggiunti; nulla di locale va perso. I conflitti di nome si risolvono qui sotto.",
"replace_warn": "Ogni categoria spuntata viene cancellata e sostituita dal contenuto del file. Le categorie non spuntate restano invariate.", "replace_warn": "Ogni categoria spuntata viene cancellata e sostituita dal contenuto del file. Le categorie non spuntate restano invariate.",
"dest_reference_hint": "I cicli importati migliorano solo il riconoscimento dei programmi e non influiscono mai sulle statistiche di utilizzo/energia.", "dest_reference_hint": "I cicli importati migliorano solo il riconoscimento dei programmi e non influiscono mai sulle statistiche di utilizzo/energia.",
"dest_real_history_hint": "I cicli importati contano come cronologia propria di questo dispositivo e alimentano le statistiche di energia/utilizzo. Da usare per spostare un elettrodomestico su una nuova installazione." "dest_real_history_hint": "I cicli importati contano come cronologia propria di questo dispositivo e alimentano le statistiche di energia/utilizzo. Da usare per spostare un elettrodomestico su una nuova installazione.",
"sug_muted": "Non verrà più suggerita questa impostazione",
"sug_mute_failed": "Impossibile silenziare il suggerimento",
"sug_unmuted_all": "Suggerimenti silenziati ripristinati",
"n_suggestions_muted": "{count} silenziati; il sistema di ottimizzazione automatica non proporrà questi.",
"font_size_hint": "Rendi tutto in questo pannello più grande o più piccolo. Si applica al tuo account su questo dispositivo."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Lavastoviglie: secondi di silenzio dopo la durata prevista prima che venga rilasciata l'attesa dello scarico di fine ciclo",
"anti_wrinkle_enabled": "Assorbire gli impulsi di rotazione dopo la fase principale invece di leggerli come nuovi cicli", "anti_wrinkle_enabled": "Assorbire gli impulsi di rotazione dopo la fase principale invece di leggerli come nuovi cicli",
"anti_wrinkle_exit_power": "La potenza deve scendere sotto questo valore tra gli impulsi affinché la modalità antirughe resti attiva", "anti_wrinkle_exit_power": "La potenza deve scendere sotto questo valore tra gli impulsi affinché la modalità antirughe resti attiva",
"anti_wrinkle_idle_timeout": "Tempo di silenzio consentito tra due impulsi di rotazione prima che la modalità antirughe termini", "anti_wrinkle_idle_timeout": "Tempo di silenzio consentito tra due impulsi di rotazione prima che la modalità antirughe termini",
@@ -998,6 +1035,10 @@
"unusable": "Inutilizzabile" "unusable": "Inutilizzabile"
}, },
"section": { "section": {
"dishwasher": {
"label": "Lavastoviglie",
"intro": "Gestione del fine ciclo per le lavastoviglie, che di solito terminano con una lunga fase di asciugatura quasi silenziosa prima di un breve scarico finale."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "La modalità antirughe/antistropicciamento rileva gli impulsi di tumbling a bassa potenza dopo la fase principale e li mantiene collegati al ciclo completato.", "intro": "La modalità antirughe/antistropicciamento rileva gli impulsi di tumbling a bassa potenza dopo la fase principale e li mantiene collegati al ciclo completato.",
"label": "Antirughe" "label": "Antirughe"
@@ -1040,6 +1081,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Rilascio al silenzio dell'asciugatura passiva",
"doc": "Una volta che il ciclo supera la sua durata prevista, per quanto tempo la lavastoviglie deve restare silenziosa (sotto la Soglia di arresto) prima che WashData smetta di attendere uno scarico finale e termini il ciclo. Aumentalo se la tua macchina ha una lunga fase di asciugatura silenziosa prima di uno scarico finale tardivo che non viene rilevato - una finestra più ampia consente alla durata appresa di seguire la deriva stagionale (acqua in ingresso più fredda = cicli più lunghi) invece di bloccarsi sulla vecchia media. Riduce soltanto l'attesa rispetto al limite interno di 30 minuti per il picco di fine, senza mai prolungarla."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Riconosci i brevi impulsi di asciugatrice a bassa potenza emessi da un'asciugatrice dopo la fase di riscaldamento principale e mantienili collegati al ciclo finito invece di leggerli come nuovi cicli.", "doc": "Riconosci i brevi impulsi di asciugatrice a bassa potenza emessi da un'asciugatrice dopo la fase di riscaldamento principale e mantienili collegati al ciclo finito invece di leggerli come nuovi cicli.",
"label": "Abilita rilevamento antirughe" "label": "Abilita rilevamento antirughe"
@@ -1260,6 +1305,10 @@
"doc": "Minuti dopo la fine di un ciclo prima dell'invio del promemoria \"scaricare la macchina\" ancora in attesa. Impostare 0 per disabilitare il promemoria.", "doc": "Minuti dopo la fine di un ciclo prima dell'invio del promemoria \"scaricare la macchina\" ancora in attesa. Impostare 0 per disabilitare il promemoria.",
"label": "Ritardo promemoria scarico" "label": "Ritardo promemoria scarico"
}, },
"notify_unload_repeat": {
"doc": "Continua a inviare il promemoria di scarico ogni \"Ritardo promemoria scarico\" minuti finché non apri la porta o tocchi \"Interrompi promemoria\" nella notifica. Richiede un'Entità sensore porta (il promemoria stesso la richiede). Il pulsante di chiusura funziona sulle notifiche dell'app complementare (mobile) di Home Assistant.",
"label": "Ripeti finché la porta non si apre"
},
"off_delay": { "off_delay": {
"doc": "È tempo di attendere dopo l'interruzione della corrente prima di dichiarare terminato il ciclo. Se l'alimentazione viene ripristinata entro questo intervallo, il ciclo continua senza interruzioni, consentendo di colmare le pause tra le fasi di lavaggio. Le lavastoviglie hanno fasi di asciugatura lunghe (spegnimento per 20-60 minuti), quindi il ritardo di spegnimento deve superare quello per mantenere l'intero ciclo di lavaggio+asciugatura come un ciclo.", "doc": "È tempo di attendere dopo l'interruzione della corrente prima di dichiarare terminato il ciclo. Se l'alimentazione viene ripristinata entro questo intervallo, il ciclo continua senza interruzioni, consentendo di colmare le pause tra le fasi di lavaggio. Le lavastoviglie hanno fasi di asciugatura lunghe (spegnimento per 20-60 minuti), quindi il ritardo di spegnimento deve superare quello per mantenere l'intero ciclo di lavaggio+asciugatura come un ciclo.",
"label": "Ritardo spegnimento" "label": "Ritardo spegnimento"
@@ -1434,6 +1483,26 @@
"energy_scale": { "energy_scale": {
"label": "Nitidezza energia", "label": "Nitidezza energia",
"doc": "Precisione della penalità di concordanza di energia. Minore = più severo: una discordanza di energia penalizza di più. Il predefinito 0,25 è intenzionalmente più indulgente della Precisione di durata, perché l'energia varia con il carico. Combinare con Peso energia." "doc": "Precisione della penalità di concordanza di energia. Minore = più severo: una discordanza di energia penalizza di più. Il predefinito 0,25 è intenzionalmente più indulgente della Precisione di durata, perché l'energia varia con il carico. Combinare con Peso energia."
},
"power_profile_interval_min": {
"label": "Intervallo profilo di potenza",
"doc": "Dimensione del bucket per l'attributo sensore power_profile per profilo (l'array piatto di watt medi per slot consumato dai pianificatori esterni come EMHASS e tibber_prices). Bucket più piccoli mantengono nitidi i picchi di potenza brevi; bucket più grandi smussano la forma. Predefinito 15 min. Solo in lettura; non influisce sul rilevamento."
},
"notify_live_sticky": {
"label": "Mantieni notifica live al tocco",
"doc": "Solo Android. Rende persistente (sticky) la notifica di avanzamento in tempo reale, in modo che toccandola non venga chiusa. Disattivato mantiene il comportamento predefinito in cui il tocco la chiude."
},
"notify_live_click_action": {
"label": "Destinazione tocco notifica live",
"doc": "Solo Android. Dove si apre un tocco sulla notifica di avanzamento in tempo reale (ad es. /lovelace/laundry o un URL completo) invece della pagina iniziale dell'app. Lascia vuoto per il valore predefinito."
},
"door_opens_at_end": {
"label": "Porta si apre automaticamente al termine",
"doc": "Per le lavastoviglie che aprono automaticamente lo sportello al termine del ciclo per asciugare (AirDry e simili). Con questa opzione attiva, un'apertura dello sportello durante un ciclo non lo mette più in pausa per sempre; invece, se lo sportello rimane aperto per il tempo di attesa indicato sotto, WashData considera il ciclo terminato. Un'apertura breve (per aggiungere un oggetto) viene ignorata. Richiede un'entità sensore della porta."
},
"door_end_dwell_seconds": {
"label": "Attesa apertura porta al termine",
"doc": "Per quanto tempo lo sportello deve restare aperto prima che WashData termini il ciclo, quando \"Porta si apre automaticamente al termine\" è attiva. Abbastanza lungo da ignorare l'aggiunta rapida di un piatto (predefinito 60 s), abbastanza breve da terminare prontamente quando la macchina apre lo sportello."
} }
}, },
"setting_group": { "setting_group": {
@@ -1604,6 +1673,10 @@
"name_required": "Nome richiesto", "name_required": "Nome richiesto",
"no_split_found": "Non è stato trovato alcun intervallo inattivo su cui dividere", "no_split_found": "Non è stato trovato alcun intervallo inattivo su cui dividere",
"panel_settings_saved": "Impostazioni del pannello salvate", "panel_settings_saved": "Impostazioni del pannello salvate",
"pg_preset_loaded": "Preimpostazione \"{name}\" caricata",
"pg_preset_saved": "Preimpostazione \"{name}\" salvata",
"pg_sugg_loaded": "{n} valore/i suggerito/i caricato/i - avvia il Playground per confrontare",
"pg_sugg_ml_loaded": "{n} valore/i calibrato/i ML caricato/i - avvia il Playground per confrontare",
"phase_name_required": "Il nome della fase è obbligatorio", "phase_name_required": "Il nome della fase è obbligatorio",
"phase_updated": "Fase aggiornata", "phase_updated": "Fase aggiornata",
"phases_saved": "Fasi salvate", "phases_saved": "Fasi salvate",
@@ -1751,6 +1824,7 @@
"min_active": "In base alla potenza attiva minima ({min}W) osservata nell'ultimo ciclo.", "min_active": "In base alla potenza attiva minima ({min}W) osservata nell'ultimo ciclo.",
"min_duration_ratio": "Mantenuto il più basso possibile affinché un programma venga riconosciuto presto nel ciclo; i limiti di confidenza e ambiguità impediscono decisioni premature.", "min_duration_ratio": "Mantenuto il più basso possibile affinché un programma venga riconosciuto presto nel ciclo; i limiti di confidenza e ambiguità impediscono decisioni premature.",
"min_off_gap": "In base a {gaps} intervalli tra cicli osservati (p05={p05}s). Minimo del dispositivo: {floor}s.", "min_off_gap": "In base a {gaps} intervalli tra cicli osservati (p05={p05}s). Minimo del dispositivo: {floor}s.",
"min_off_gap_bridge": "Dimensionato per coprire il periodo di silenzio più lungo all'interno di un ciclo: {span}s + 60s di margine, da {spans} intervalli coperti su {cycles} cicli puliti (resta sotto il tuo intervallo minimo di {ceiling}s tra due carichi consecutivi).",
"min_power": "40% della potenza attiva più bassa al p05 ({p05}W) su {cycles} cicli puliti, mantenendo la soglia di spegnimento sotto il consumo reale.{excl}", "min_power": "40% della potenza attiva più bassa al p05 ({p05}W) su {cycles} cicli puliti, mantenendo la soglia di spegnimento sotto il consumo reale.{excl}",
"ml_auto_label": "Confidenza più bassa che il modello di qualità ha comunque valutato come pulita (p10 di {cycles} cicli puliti = {p10}).", "ml_auto_label": "Confidenza più bassa che il modello di qualità ha comunque valutato come pulita (p10 di {cycles} cicli puliti = {p10}).",
"ml_end_repeat": "{false}/{total} cicli ({pct}%) hanno avuto una pausa che il rilevatore di fine ha valutato >50%; richiedere {val} conferma/e di fine.", "ml_end_repeat": "{false}/{total} cicli ({pct}%) hanno avuto una pausa che il rilevatore di fine ha valutato >50%; richiedere {val} conferma/e di fine.",
@@ -1767,7 +1841,7 @@
"thr_batch": "Mantenuto appena sopra la potenza attiva più bassa al p05 su {cycles} cicli ({p05}W) affinché un avvio venga rilevato il prima possibile e la soglia di arresto resti sotto la potenza di funzionamento più bassa della macchina.", "thr_batch": "Mantenuto appena sopra la potenza attiva più bassa al p05 su {cycles} cicli ({p05}W) affinché un avvio venga rilevato il prima possibile e la soglia di arresto resti sotto la potenza di funzionamento più bassa della macchina.",
"tol_per_profile": "p75 della varianza di durata per profilo su {profiles} profili ({cycles} cicli); i profili stretti non vengono penalizzati.", "tol_per_profile": "p75 della varianza di durata per profilo su {profiles} profili ({cycles} cicli); i profili stretti non vengono penalizzati.",
"tol_pooled": "In base alla varianza di durata aggregata di {cycles} cicli etichettati di recente (deviazione p95={dev}).", "tol_pooled": "In base alla varianza di durata aggregata di {cycles} cicli etichettati di recente (deviazione p95={dev}).",
"watchdog": "Mantenuto il più basso possibile in sicurezza (3x l'intervallo di aggiornamento p95 di {p95}s, min 30s) per rilevare rapidamente i blocchi senza arresti falsi." "watchdog": "Mantenuto il più basso possibile in sicurezza (poco sopra l'intervallo di aggiornamento p95 di {p95}s, min 30s) per rilevare rapidamente i blocchi senza arresti falsi."
}, },
"exclusions": { "exclusions": {
"summary": "Esclusi {total} cicli rilevati male: {parts}.", "summary": "Esclusi {total} cicli rilevati male: {parts}.",
@@ -1944,5 +2018,53 @@
"hide_guidance": "Nascondi guida", "hide_guidance": "Nascondi guida",
"show_guidance": "Mostra guida" "show_guidance": "Mostra guida"
} }
},
"card": {
"min": "min",
"entity_not_found": "Entità non trovata",
"running_long": "In ritardo",
"remaining": "rimanente",
"progress": "avanzamento",
"show_time_remaining": "Mostra tempo rimanente",
"show_percentage": "Mostra percentuale",
"layout": {
"tile": "Riquadro (compatto)",
"detail": "Dettaglio (completo)",
"glance": "Panoramica (più dispositivi)"
},
"btn": {
"pause": "Pausa",
"resume": "Riprendi",
"terminate": "Termina ciclo",
"record_start": "Avvia registrazione",
"record_stop": "Interrompi registrazione",
"program": "Programma",
"open_panel": "Apri WashData"
},
"editor": {
"layout": "Layout",
"entity": "Entità dell'elettrodomestico",
"entities": "Elettrodomestici",
"title": "Titolo",
"icon": "Icona",
"show_state": "Mostra stato",
"show_program": "Mostra programma",
"show_progress_bar": "Mostra barra di avanzamento",
"spin_icon": "Ruota l'icona durante il funzionamento",
"display_mode": "Riga di dettaglio",
"active_color": "Colore attivo personalizzato",
"show_phase": "Mostra fase",
"show_energy": "Mostra energia e costo",
"show_anomaly": "Mostra avviso di ritardo",
"show_sparkline": "Mostra grafico di potenza in tempo reale",
"buttons": "Pulsanti di azione",
"program_entity": "Entità programma (personalizzata)",
"time_entity": "Entità tempo (personalizzata)",
"pct_entity": "Entità avanzamento (personalizzata)",
"power_entity": "Entità potenza (personalizzata)",
"tap_action": "Azione al tocco",
"hold_action": "Azione alla pressione prolungata",
"double_tap_action": "Azione al doppio tocco"
}
} }
} }
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Objektas nerastas",
"running_long": "Veikia ilgai",
"remaining": "liko",
"progress": "eiga",
"show_time_remaining": "Rodyti likusį laiką",
"show_percentage": "Rodyti procentus",
"layout": {
"tile": "Plytelė (kompaktiška)",
"detail": "Detali (išsami)",
"glance": "Apžvalga (keli įrenginiai)"
},
"btn": {
"pause": "Pristabdyti",
"resume": "Tęsti",
"terminate": "Baigti ciklą",
"record_start": "Pradėti įrašymą",
"record_stop": "Sustabdyti įrašymą",
"program": "Programa",
"open_panel": "Atidaryti WashData"
},
"editor": {
"layout": "Išdėstymas",
"entity": "Prietaiso objektas",
"entities": "Prietaisai",
"title": "Pavadinimas",
"icon": "Piktograma",
"show_state": "Rodyti būseną",
"show_program": "Rodyti programą",
"show_progress_bar": "Rodyti eigos juostą",
"spin_icon": "Sukti piktogramą veikiant",
"display_mode": "Detalių eilutė",
"active_color": "Aktyvios spalvos pakeitimas",
"show_phase": "Rodyti fazę",
"show_energy": "Rodyti energiją ir kainą",
"show_anomaly": "Rodyti užsitęsimo įspėjimą",
"show_sparkline": "Rodyti tiesioginį galios grafiką",
"buttons": "Veiksmų mygtukai",
"program_entity": "Programos objektas (pakeitimas)",
"time_entity": "Laiko objektas (pakeitimas)",
"pct_entity": "Eigos objektas (pakeitimas)",
"power_entity": "Galios objektas (pakeitimas)",
"tap_action": "Palietimo veiksmas",
"hold_action": "Palaikymo veiksmas",
"double_tap_action": "Dvigubo palietimo veiksmas"
}
},
"badge": { "badge": {
"artifact_tip": "Aptikta {n} anomalijų (pvz., durys atidarytos ciklo viduryje) atidarykite, kad pamatytumėte juos diagramoje", "artifact_tip": "Aptikta {n} anomalijų (pvz., durys atidarytos ciklo viduryje) atidarykite, kad pamatytumėte juos diagramoje",
"auto": "(aptikta automatiškai)", "auto": "(aptikta automatiškai)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Pristabdyti veikiantį ciklą prietaisas tęsis nuo tos vietos, kur sustojo", "pause_cycle_tip": "Pristabdyti veikiantį ciklą prietaisas tęsis nuo tos vietos, kur sustojo",
"pg_apply_device": "Taikyti įrenginiui", "pg_apply_device": "Taikyti įrenginiui",
"pg_autofill": "Automatinis užpildymas", "pg_autofill": "Automatinis užpildymas",
"pg_load_calibrated": "Įkelti kalibruotus (ML) ({n})",
"pg_load_calibrated_tip": "Įkelti ML kalibruotus nustatymus kaip bandymų aikštelės perrašymus",
"pg_load_live": "Įkelti aktyvius nustatymus",
"pg_load_live_tip": "Iš naujo nuskaityti dabartinius integracijos nustatymus ir atmesti visus bandymų aikštelės pakeitimus",
"pg_load_suggested": "Įkelti siūlomus ({n})",
"pg_load_suggested_tip": "Įkelti dabartines automatinio derintuvo rekomendacijas kaip bandymų aikštelės perrašymus",
"pg_preset_delete": "Ištrinti rinkinį",
"pg_preset_load": "Įkelti rinkinį",
"pg_preset_load_tip": "Pakeisti bandymų aikštelės reikšmes šiuo rinkiniu (aktyvūs nustatymai nekeičiami)",
"pg_preset_save": "Išsaugoti kaip rinkinį",
"pg_preset_save_tip": "Išsaugoti visas toliau esančias reikšmes kaip pavadintą šio įrenginio nustatymų rinkinį",
"pg_publish_all": "Įrašyti į nustatymus ({n})",
"pg_publish_one": "Įrašyti „{label}“ į integracijos nustatymus",
"play": "Leisti", "play": "Leisti",
"process": "Apdoroti", "process": "Apdoroti",
"process_history": "Apdorokite dabar", "process_history": "Apdorokite dabar",
@@ -178,7 +239,9 @@
"download_export": "Atsisiųsti eksportą", "download_export": "Atsisiųsti eksportą",
"analyze_import": "Analizuoti failą", "analyze_import": "Analizuoti failą",
"import_selected": "Importuoti pasirinktus", "import_selected": "Importuoti pasirinktus",
"back": "Atgal" "back": "Atgal",
"mute_suggestion": "Nebesiūlyti šio nustatymo",
"reset_muted": "Atstatyti nutildytus"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +338,7 @@
"no_automations": "Dar jokia automatika nenurodo šio įrenginio.", "no_automations": "Dar jokia automatika nenurodo šio įrenginio.",
"panel_settings": "Skydelio nustatymai", "panel_settings": "Skydelio nustatymai",
"param_sweep": "Parametrų skenavimas", "param_sweep": "Parametrų skenavimas",
"pg_settings_source": "Nustatymų šaltinis",
"phase_catalog": "Fazių katalogas", "phase_catalog": "Fazių katalogas",
"playground": "Bandymų aikštelė", "playground": "Bandymų aikštelė",
"process_history": "Proceso istorija", "process_history": "Proceso istorija",
@@ -415,6 +479,9 @@
"pg_match_score": "Atitikties balas", "pg_match_score": "Atitikties balas",
"pg_pct_of": "{p}% iš {total}", "pg_pct_of": "{p}% iš {total}",
"pg_poor_match": "Prasta atitiktis", "pg_poor_match": "Prasta atitiktis",
"pg_preset": "Bandymų aikštelės rinkinys",
"pg_preset_name": "Naujo rinkinio pavadinimas",
"pg_preset_none": "Pasirinkite rinkinį…",
"pg_strong_match": "Stipri atitiktis", "pg_strong_match": "Stipri atitiktis",
"pg_tile_ambiguous": "Dviprasmiška", "pg_tile_ambiguous": "Dviprasmiška",
"pg_tile_ambiguous_tip": "Ciklai, kuriuose dvi programos beveik lygios", "pg_tile_ambiguous_tip": "Ciklai, kuriuose dvi programos beveik lygios",
@@ -609,7 +676,8 @@
"conflict_resolution": "Pavadinimų konfliktai", "conflict_resolution": "Pavadinimų konfliktai",
"conflict_import_copy": "Importuoti kaip kopiją", "conflict_import_copy": "Importuoti kaip kopiją",
"conflict_keep_mine": "Išlaikyti manuosius", "conflict_keep_mine": "Išlaikyti manuosius",
"conflict_overwrite": "Perrašyti" "conflict_overwrite": "Perrašyti",
"font_size": "Skydelio šrifto dydis"
}, },
"log": { "log": {
"all_levels": "Visi lygiai", "all_levels": "Visi lygiai",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Taikyti geriausią reikšmę: {label} = {value}?", "pg_apply_confirm": "Taikyti geriausią reikšmę: {label} = {value}?",
"pg_canvas_empty": "Pasirinkite ciklą aukščiau, tada paspauskite „Įkelti“, kad pamatytumėte jo galios kreivę.", "pg_canvas_empty": "Pasirinkite ciklą aukščiau, tada paspauskite „Įkelti“, kad pamatytumėte jo galios kreivę.",
"pg_chart_caption": "Aptikimo / atitikties rodiklis pagal {param} reikšmes", "pg_chart_caption": "Aptikimo / atitikties rodiklis pagal {param} reikšmes",
"pg_ctrl_intro": "Reikšmės imamos iš aktyvių šio įrenginio integracijos nustatymų. Pakeitimai lieka bandymų aikštelėje, kol jų neįrašysite į nustatymus.",
"pg_live_unavailable": "Aktyvūs nustatymai nepasiekiami, rodomos numatytosios reikšmės.",
"pg_load_live_confirm": "Atmesti bandymų aikštelės pakeitimus ({n}) ir iš naujo įkelti dabartinius integracijos nustatymus?",
"pg_match_rate": "{pct}% atitikties rodiklis iš {total} ciklų", "pg_match_rate": "{pct}% atitikties rodiklis iš {total} ciklų",
"pg_matches_live": "Sutampa su aktyviais nustatymais",
"pg_n_changed": "Skirtumų nuo aktyvių nustatymų: {n}",
"pg_sugg_none": "Visi pasiūlymai jau atitinka dabartinius nustatymus",
"pg_preset_delete_confirm": "Ištrinti rinkinį „{name}“?",
"pg_preset_limit": "Pasiekta rinkinių riba ({n})",
"pg_preset_overwrite": "Perrašyti rinkinį „{name}“?",
"pg_publish_one_confirm": "Įrašyti {label} = {value} į šio įrenginio nustatymus?",
"pg_restart_note": "Iš naujo paleiskite „Home Assistant“, kad įjungtumėte simuliavimo įrankius.", "pg_restart_note": "Iš naujo paleiskite „Home Assistant“, kad įjungtumėte simuliavimo įrankius.",
"pg_sim_progress": "{done} / {total} ciklai", "pg_sim_progress": "{done} / {total} ciklai",
"pg_starting": "Pradedama…", "pg_starting": "Pradedama…",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Trukmė mažėja ({pct} %/ciklas) pastaruoju metu vid. {avg}", "trend_duration_shorter": "Trukmė mažėja ({pct} %/ciklas) pastaruoju metu vid. {avg}",
"trend_energy_down": "Energijos mažėjimas ({pct} % per ciklą)", "trend_energy_down": "Energijos mažėjimas ({pct} % per ciklą)",
"trend_energy_up": "Energijos augimas ({pct} % per ciklą) pastaruoju metu vid. {avg}", "trend_energy_up": "Energijos augimas ({pct} % per ciklą) pastaruoju metu vid. {avg}",
"trim_destructive_confirm": "Bus išsaugota tik {pct}% ciklo ir to nebus galima atšaukti. Tęsti?",
"trim_intro": "Vilkite raudonas rankenas arba įveskite vertes. Viskas, kas yra už lango, pašalinama.", "trim_intro": "Vilkite raudonas rankenas arba įveskite vertes. Viskas, kas yra už lango, pašalinama.",
"tuning_suggestions_available": "Galimas {count} derinimo pasiūlymas iš stebimų ciklų. Jie rodomi šalia atitinkamų laukų.", "tuning_suggestions_available": "Galimas {count} derinimo pasiūlymas iš stebimų ciklų. Jie rodomi šalia atitinkamų laukų.",
"unsure_detected_prefix": "„WashData“ nėra tikras, kad aptiko", "unsure_detected_prefix": "„WashData“ nėra tikras, kad aptiko",
@@ -922,7 +1001,12 @@
"merge_hint": "Importuoti elementai pridedami; jokie vietiniai duomenys neprarandami. Pavadinimų konfliktai sprendžiami toliau.", "merge_hint": "Importuoti elementai pridedami; jokie vietiniai duomenys neprarandami. Pavadinimų konfliktai sprendžiami toliau.",
"replace_warn": "Kiekviena pažymėta kategorija ištrinama ir pakeičiama iš failo. Nepažymėtos kategorijos lieka nepaliestos.", "replace_warn": "Kiekviena pažymėta kategorija ištrinama ir pakeičiama iš failo. Nepažymėtos kategorijos lieka nepaliestos.",
"dest_reference_hint": "Importuoti ciklai tik pagerina programų atpažinimą ir niekada neveikia naudojimo/energijos statistikos.", "dest_reference_hint": "Importuoti ciklai tik pagerina programų atpažinimą ir niekada neveikia naudojimo/energijos statistikos.",
"dest_real_history_hint": "Importuoti ciklai laikomi šio prietaiso paties istorija ir papildo energijos/naudojimo statistiką. Naudokite perkeliant vieną prietaisą į naują įdiegimą." "dest_real_history_hint": "Importuoti ciklai laikomi šio prietaiso paties istorija ir papildo energijos/naudojimo statistiką. Naudokite perkeliant vieną prietaisą į naują įdiegimą.",
"sug_muted": "Šio nustatymo daugiau nebesiūlys",
"sug_mute_failed": "Nepavyko nutildyti pasiūlymo",
"sug_unmuted_all": "Nutildyti pasiūlymai atstatyti",
"n_suggestions_muted": "{count} nutildyti; automatinis derintuvas jų nebesiūlys.",
"font_size_hint": "Padidinkite arba sumažinkite visą tekstą šiame skydelyje. Galioja jūsų paskyrai šiame įrenginyje."
}, },
"phase_desc": { "phase_desc": {
"anti_crease": "Po pagrindinio ciklo būgnas intermitiškai sukasi, kad išvengtų audinių raukšlių.", "anti_crease": "Po pagrindinio ciklo būgnas intermitiškai sukasi, kad išvengtų audinių raukšlių.",
@@ -970,6 +1054,10 @@
"unusable": "Netinkamas naudoti" "unusable": "Netinkamas naudoti"
}, },
"section": { "section": {
"dishwasher": {
"label": "Indaplovė",
"intro": "Ciklo pabaigos apdorojimas indaplovėms, kurios paprastai baigiasi ilga, beveik tylia džiovinimo faze prieš trumpą galutinį vandens išleidimą."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Apsaugos nuo raukšlių režimas aptinka mažos galios sukimosi impulsus po pagrindinės fazės ir prideda juos prie baigto ciklo.", "intro": "Apsaugos nuo raukšlių režimas aptinka mažos galios sukimosi impulsus po pagrindinės fazės ir prideda juos prie baigto ciklo.",
"label": "Apsauga nuo raukšlių" "label": "Apsauga nuo raukšlių"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Pasyvaus džiovinimo tylusis atleidimas",
"doc": "Kai ciklas viršija numatytą trukmę, kiek laiko indaplovė turi išlikti tyli (žemiau Sustabdymo slenkstis) prieš tai, kai WashData nustoja laukti galutinio vandens išleidimo ir užbaigia ciklą. Padidinkite, jei jūsų aparatas turi ilgą tylią džiovinimo fazę prieš vėlyvą galutinį vandens išleidimą, kuris praleidžiamas - platesnis langas leidžia išmoktai trukmei sekti sezoninį poslinkį (šaltesnis įleidžiamas vanduo = ilgesni ciklai), užuot užsifiksavus ties senuoju vidurkiu. Jis gali tik sutrumpinti laukimą, palyginti su vidiniu 30 minučių pabaigos smailės ribojimu, bet niekada jo nepailgina."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Atpažinkite trumpus mažos galios būgninius impulsus, kuriuos džiovyklė skleidžia po pagrindinės šildymo fazės, ir laikykite juos prijungtus prie baigto ciklo, o ne skaitykite juos kaip naujus ciklus.", "doc": "Atpažinkite trumpus mažos galios būgninius impulsus, kuriuos džiovyklė skleidžia po pagrindinės šildymo fazės, ir laikykite juos prijungtus prie baigto ciklo, o ne skaitykite juos kaip naujus ciklus.",
"label": "Įjungti apsaugą nuo raukšlių" "label": "Įjungti apsaugą nuo raukšlių"
@@ -1232,6 +1324,10 @@
"doc": "Minutės po ciklo pabaigos prieš siunčiant vis dar laukiantį priminimą „iškrauti mašiną“. Norėdami išjungti priminimą, nustatykite 0.", "doc": "Minutės po ciklo pabaigos prieš siunčiant vis dar laukiantį priminimą „iškrauti mašiną“. Norėdami išjungti priminimą, nustatykite 0.",
"label": "Iškrovimo priminimo delsimas" "label": "Iškrovimo priminimo delsimas"
}, },
"notify_unload_repeat": {
"doc": "Iškrovimo priminimas pakartotinai siunčiamas kas \"Iškrovimo priminimo delsimas\" minučių, kol neatidarysite durų arba pranešime nepaliesite \"Nustoti priminti\". Reikalingas Durų jutiklio objektas (kaip ir pačiam priminimui). Atmetimo mygtukas veikia Home Assistant mobiliosios (companion) programėlės pranešimuose.",
"label": "Kartoti, kol atsidarys durys"
},
"off_delay": { "off_delay": {
"doc": "Laikas palaukti, kai nukrenta galia, prieš paskelbiant, kad ciklas baigtas. Jei maitinimas atnaujinamas šiame lange, ciklas tęsiasi sklandžiai tai sujungia pauzes tarp plovimo etapų. Indaplovės turi ilgas džiovinimo fazes (maitinimas išjungiamas 2060 min.), todėl išjungimo delsa turi būti didesnė už tą, kad visas plovimas+džiovinimas išliktų kaip vienas ciklas.", "doc": "Laikas palaukti, kai nukrenta galia, prieš paskelbiant, kad ciklas baigtas. Jei maitinimas atnaujinamas šiame lange, ciklas tęsiasi sklandžiai tai sujungia pauzes tarp plovimo etapų. Indaplovės turi ilgas džiovinimo fazes (maitinimas išjungiamas 2060 min.), todėl išjungimo delsa turi būti didesnė už tą, kad visas plovimas+džiovinimas išliktų kaip vienas ciklas.",
"label": "Išjungimo delsimas" "label": "Išjungimo delsimas"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Energijos ryškumas", "label": "Energijos ryškumas",
"doc": "4 etapo energijos atitikimo bausmės ryškumas. Mažesnis = griežtesnis: energijos neatitikimas kenkia labiau. Numatytoji 0,25 sąmoningai atlaidesnė nei trukmės ryškumas, nes energija kinta priklausomai nuo apkrovos. Naudokite su Energijos svoriu." "doc": "4 etapo energijos atitikimo bausmės ryškumas. Mažesnis = griežtesnis: energijos neatitikimas kenkia labiau. Numatytoji 0,25 sąmoningai atlaidesnė nei trukmės ryškumas, nes energija kinta priklausomai nuo apkrovos. Naudokite su Energijos svoriu."
},
"power_profile_interval_min": {
"label": "Galios profilio intervalas",
"doc": "Kibirio dydis profilio power_profile jutiklio atributui (plokščias per laiko atkarpas vidutinių vatų masyvas, naudojamas išorinių planavimo sistemų, pvz., EMHASS ir tibber_prices). Mažesni kibirai išlaiko trumpus galios šuolius aštresniais; didesni kibirai lygina formą. Numatytasis 15 min. Tik skaitymo metu; neturi įtakos aptikimui."
},
"notify_live_sticky": {
"label": "Išlaikyti tiesioginį pranešimą po paspaudimo",
"doc": "Tik Android. Padaryti tiesioginį pažangos pranešimą patvariu (klijuojamu), kad paspaudus nebus atsisakyta vykstančios gijos. Išjungus paliekama numatytoji elgsena, kai paspaudus pranešimas atsisakomas."
},
"notify_live_click_action": {
"label": "Tiesioginio pranešimo paspaudimo tikslas",
"doc": "Tik Android. Kur atidaroma paspaudus tiesioginės pažangos pranešimą (pvz., /lovelace/laundry arba visas URL), o ne programos pradžios puslapis. Palikite tuščią, kad naudotumėte numatytąjį."
},
"door_opens_at_end": {
"label": "Durys automatiškai atsidaromos pabaigoje",
"doc": "Indaplovėms, kurios ciklo pabaigoje atidaro duris džiovinimui (AirDry ir panašūs). Įjungus, durų atidarymas veikiančio ciklo metu nebepristabdo jo amžinai; vietoj to, jei durys lieka atviros toliau nurodytą laikotarpį, WashData traktuoja ciklą kaip baigtą. Trumpas atidarymas (dedant indą) ignoruojamas. Reikalingas durų jutiklio objektas."
},
"door_end_dwell_seconds": {
"label": "Durų atidarymo pabaigos laukimas",
"doc": "Kiek laiko durys turi likti atviros, kad WashData užbaigtų ciklą, kai įjungta parinktis \"Durys automatiškai atsidaromos pabaigoje\". Pakankamai ilgai, kad ignoruotų greitai dedamą indą (numatytasis 60 s), pakankamai trumpai, kad greitai užbaigtų, kai prietaisas atidaro duris."
} }
}, },
"setting_group": { "setting_group": {
@@ -1576,6 +1692,10 @@
"name_required": "Reikalingas vardas", "name_required": "Reikalingas vardas",
"no_split_found": "Nerasta tuščiosios eigos spragų, dėl kurių būtų galima suskaidyti", "no_split_found": "Nerasta tuščiosios eigos spragų, dėl kurių būtų galima suskaidyti",
"panel_settings_saved": "Skydelio nustatymai išsaugoti", "panel_settings_saved": "Skydelio nustatymai išsaugoti",
"pg_preset_loaded": "Rinkinys „{name}“ įkeltas",
"pg_preset_saved": "Rinkinys „{name}” išsaugotas",
"pg_sugg_loaded": "Įkelta {n} siūlomų reikšmių - paleiskite bandymų aikštelę palyginti",
"pg_sugg_ml_loaded": "Įkelta {n} ML kalibruotų reikšmių - paleiskite bandymų aikštelę palyginti",
"phase_name_required": "Būtinas fazės pavadinimas", "phase_name_required": "Būtinas fazės pavadinimas",
"phase_updated": "Atnaujintas etapas", "phase_updated": "Atnaujintas etapas",
"phases_saved": "Fazės išsaugotos", "phases_saved": "Fazės išsaugotos",
@@ -1723,6 +1843,7 @@
"min_active": "Pagrįsta mažiausia aktyvia galia ({min}W), stebėta paskutiniame cikle.", "min_active": "Pagrįsta mažiausia aktyvia galia ({min}W), stebėta paskutiniame cikle.",
"min_duration_ratio": "Paliktas kuo mažesnis, kad programa būtų atpažinta ciklo pradžioje; patikimumo ir dviprasmiškumo slenksčiai neleidžia patvirtinti per anksti.", "min_duration_ratio": "Paliktas kuo mažesnis, kad programa būtų atpažinta ciklo pradžioje; patikimumo ir dviprasmiškumo slenksčiai neleidžia patvirtinti per anksti.",
"min_off_gap": "Pagrįsta {gaps} stebimais tarpcikliniais tarpais (p05={p05}s). Prietaiso apatinė riba: {floor}s.", "min_off_gap": "Pagrįsta {gaps} stebimais tarpcikliniais tarpais (p05={p05}s). Prietaiso apatinė riba: {floor}s.",
"min_off_gap_bridge": "Nustatyta taip, kad perdengtų ilgiausią tylos tarpsnį ciklo viduje: {span}s + 60s buferis, iš {spans} perdengtų tarpų per {cycles} švarius ciklus (lieka žemiau trumpiausio jūsų tarpo tarp dviejų paleidimų iš eilės, kuris yra {ceiling}s).",
"min_power": "40% p05 mažiausios aktyvios galios ({p05}W) per {cycles} švarius ciklus, išlaikant išjungimo slenkstį žemiau realaus suvartojimo.{excl}", "min_power": "40% p05 mažiausios aktyvios galios ({p05}W) per {cycles} švarius ciklus, išlaikant išjungimo slenkstį žemiau realaus suvartojimo.{excl}",
"ml_auto_label": "Mažiausias patikimumas, kurį kokybės modelis vis dar įvertino kaip švarų (p10 iš {cycles} švarių ciklų = {p10}).", "ml_auto_label": "Mažiausias patikimumas, kurį kokybės modelis vis dar įvertino kaip švarų (p10 iš {cycles} švarių ciklų = {p10}).",
"ml_end_repeat": "{false}/{total} ciklų ({pct}%) turėjo pauzę, kurią pabaigos detektorius įvertino >50%; reikalauti {val} pabaigos patvirtinimo(-ų).", "ml_end_repeat": "{false}/{total} ciklų ({pct}%) turėjo pauzę, kurią pabaigos detektorius įvertino >50%; reikalauti {val} pabaigos patvirtinimo(-ų).",
@@ -1739,7 +1860,7 @@
"thr_batch": "Paliktas šiek tiek virš p05 mažiausios aktyvios galios per {cycles} ciklus ({p05}W), kad pradžia būtų aptikta kuo anksčiau, o sustabdymo slenkstis liktų žemiau mažiausios veikiančios mašinos galios.", "thr_batch": "Paliktas šiek tiek virš p05 mažiausios aktyvios galios per {cycles} ciklus ({p05}W), kad pradžia būtų aptikta kuo anksčiau, o sustabdymo slenkstis liktų žemiau mažiausios veikiančios mašinos galios.",
"tol_per_profile": "p75 kiekvieno profilio trukmės dispersijos per {profiles} profilius ({cycles} ciklai); stabilūs profiliai nebaudžiami.", "tol_per_profile": "p75 kiekvieno profilio trukmės dispersijos per {profiles} profilius ({cycles} ciklai); stabilūs profiliai nebaudžiami.",
"tol_pooled": "Pagrįsta sujungta {cycles} naujausių pažymėtų ciklų trukmės dispersija (p95 nuokrypis={dev}).", "tol_pooled": "Pagrįsta sujungta {cycles} naujausių pažymėtų ciklų trukmės dispersija (p95 nuokrypis={dev}).",
"watchdog": "Paliktas kuo mažesnis, kiek saugu (3x p95 atnaujinimo tarpas {p95}s, min. 30s), kad strigtys būtų aptiktos greitai be klaidingų sustabdymų." "watchdog": "Paliktas kuo mažesnis, kiek saugu (vos didesnis nei p95 atnaujinimo tarpas {p95}s, min. 30s), kad strigtys būtų aptiktos greitai be klaidingų sustabdymų."
}, },
"exclusions": { "exclusions": {
"summary": "Neįtraukta {total} klaidingai aptiktų ciklų: {parts}.", "summary": "Neįtraukta {total} klaidingai aptiktų ciklų: {parts}.",
@@ -1770,6 +1891,7 @@
"other": "Kita" "other": "Kita"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Indaplovė: tylos sekundės po numatytos trukmės, kol atleidžiamas ciklo pabaigos vandens išleidimo laukimas",
"anti_wrinkle_enabled": "Sugerkite būgninius impulsus po pagrindinės fazės, o ne skaitykite juos kaip naujus ciklus", "anti_wrinkle_enabled": "Sugerkite būgninius impulsus po pagrindinės fazės, o ne skaitykite juos kaip naujus ciklus",
"anti_wrinkle_exit_power": "Kad apsauga nuo raukšlių išliktų aktyvi, galia tarp impulsų turi nukristi žemiau šios ribos", "anti_wrinkle_exit_power": "Kad apsauga nuo raukšlių išliktų aktyvi, galia tarp impulsų turi nukristi žemiau šios ribos",
"anti_wrinkle_idle_timeout": "Tylos laikas, leidžiamas tarp dviejų būgninių impulsų prieš pasibaigiant apsaugai nuo raukšlių", "anti_wrinkle_idle_timeout": "Tylos laikas, leidžiamas tarp dviejų būgninių impulsų prieš pasibaigiant apsaugai nuo raukšlių",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entītija nav atrasta",
"running_long": "Darbojas ilgi",
"remaining": "atlicis",
"progress": "progress",
"show_time_remaining": "Rādīt atlikušo laiku",
"show_percentage": "Rādīt procentus",
"layout": {
"tile": "Elements (kompakts)",
"detail": "Detalizēts (bagātīgs)",
"glance": "Pārskats (vairākas ierīces)"
},
"btn": {
"pause": "Pauzēt",
"resume": "Turpināt",
"terminate": "Beigt ciklu",
"record_start": "Sākt ierakstīšanu",
"record_stop": "Apturēt ierakstīšanu",
"program": "Programma",
"open_panel": "Atvērt WashData"
},
"editor": {
"layout": "Izkārtojums",
"entity": "Ierīces entītija",
"entities": "Ierīces",
"title": "Nosaukums",
"icon": "Ikona",
"show_state": "Rādīt stāvokli",
"show_program": "Rādīt programmu",
"show_progress_bar": "Rādīt progresa joslu",
"spin_icon": "Griezt ikonu darbības laikā",
"display_mode": "Detaļu rinda",
"active_color": "Aktīvās krāsas aizstāšana",
"show_phase": "Rādīt fāzi",
"show_energy": "Rādīt enerģiju un izmaksas",
"show_anomaly": "Rādīt pārsnieguma brīdinājumu",
"show_sparkline": "Rādīt tiešo jaudas grafiku",
"buttons": "Darbību pogas",
"program_entity": "Programmas entītija (aizstāšana)",
"time_entity": "Laika entītija (aizstāšana)",
"pct_entity": "Progresa entītija (aizstāšana)",
"power_entity": "Jaudas entītija (aizstāšana)",
"tap_action": "Pieskāriena darbība",
"hold_action": "Turēšanas darbība",
"double_tap_action": "Dubultā pieskāriena darbība"
}
},
"badge": { "badge": {
"artifact_tip": "Konstatētas {n} anomālijas (piemēram, durvis atvērtas cikla vidū) atveriet, lai tās skatītu diagrammā", "artifact_tip": "Konstatētas {n} anomālijas (piemēram, durvis atvērtas cikla vidū) atveriet, lai tās skatītu diagrammā",
"auto": "(noteikts automātiski)", "auto": "(noteikts automātiski)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Pauzēt pašreizējo ciklu ierīce turpinās no pārtraukuma vietas", "pause_cycle_tip": "Pauzēt pašreizējo ciklu ierīce turpinās no pārtraukuma vietas",
"pg_apply_device": "Lietot ierīcei", "pg_apply_device": "Lietot ierīcei",
"pg_autofill": "Automātiskā aizpilde", "pg_autofill": "Automātiskā aizpilde",
"pg_load_calibrated": "Ielādēt kalibrētos (ML) ({n})",
"pg_load_calibrated_tip": "Ielādēt ML kalibrētos iestatījumus kā izmēģinājumu laukuma aizstājumus",
"pg_load_live": "Ielādēt aktīvos iestatījumus",
"pg_load_live_tip": "No jauna nolasīt pašreizējos integrācijas iestatījumus un atmest visas izmēģinājumu laukuma izmaiņas",
"pg_load_suggested": "Ielādēt ieteiktos ({n})",
"pg_load_suggested_tip": "Ielādēt automātiskā pielāgotāja pašreizējos ieteikumus kā izmēģinājumu laukuma aizstājumus",
"pg_preset_delete": "Dzēst priekšiestatījumu",
"pg_preset_load": "Ielādēt priekšiestatījumu",
"pg_preset_load_tip": "Aizstāt izmēģinājumu laukuma vērtības ar šo priekšiestatījumu (aktīvie iestatījumi netiek mainīti)",
"pg_preset_save": "Saglabāt kā priekšiestatījumu",
"pg_preset_save_tip": "Saglabāt visas tālāk norādītās vērtības kā nosauktu šīs ierīces priekšiestatījumu",
"pg_publish_all": "Saglabāt iestatījumos ({n})",
"pg_publish_one": "Saglabāt \"{label}\" integrācijas iestatījumos",
"play": "Atskaņot", "play": "Atskaņot",
"process": "Apstrādāt", "process": "Apstrādāt",
"process_history": "Apstrādāt tūlīt", "process_history": "Apstrādāt tūlīt",
@@ -178,7 +239,9 @@
"download_export": "Lejupielādēt eksportu", "download_export": "Lejupielādēt eksportu",
"analyze_import": "Analizēt failu", "analyze_import": "Analizēt failu",
"import_selected": "Importēt atlasītos", "import_selected": "Importēt atlasītos",
"back": "Atpakaļ" "back": "Atpakaļ",
"mute_suggestion": "Pārtraukt ieteikt šo iestatījumu",
"reset_muted": "Atiestatīt klusinātos"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +338,7 @@
"no_automations": "Vēl neviena automatizācija neatsaucas uz šo ierīci.", "no_automations": "Vēl neviena automatizācija neatsaucas uz šo ierīci.",
"panel_settings": "Paneļa iestatījumi", "panel_settings": "Paneļa iestatījumi",
"param_sweep": "Parametru skenēšana", "param_sweep": "Parametru skenēšana",
"pg_settings_source": "Iestatījumu avots",
"phase_catalog": "Fāzes katalogs", "phase_catalog": "Fāzes katalogs",
"playground": "Izmēģinājumu laukums", "playground": "Izmēģinājumu laukums",
"process_history": "Procesa vēsture", "process_history": "Procesa vēsture",
@@ -415,6 +479,9 @@
"pg_match_score": "Atbilstības rezultāts", "pg_match_score": "Atbilstības rezultāts",
"pg_pct_of": "{p}% no {total}", "pg_pct_of": "{p}% no {total}",
"pg_poor_match": "Slikta atbilstība", "pg_poor_match": "Slikta atbilstība",
"pg_preset": "Izmēģinājumu laukuma priekšiestatījums",
"pg_preset_name": "Jauna priekšiestatījuma nosaukums",
"pg_preset_none": "Atlasiet priekšiestatījumu…",
"pg_strong_match": "Spēcīga atbilstība", "pg_strong_match": "Spēcīga atbilstība",
"pg_tile_ambiguous": "Neviennozīmīgi", "pg_tile_ambiguous": "Neviennozīmīgi",
"pg_tile_ambiguous_tip": "Cikli, kuros divas programmas ir gandrīz vienādas", "pg_tile_ambiguous_tip": "Cikli, kuros divas programmas ir gandrīz vienādas",
@@ -609,7 +676,8 @@
"conflict_resolution": "Nosaukumu konflikti", "conflict_resolution": "Nosaukumu konflikti",
"conflict_import_copy": "Importēt kā kopiju", "conflict_import_copy": "Importēt kā kopiju",
"conflict_keep_mine": "Paturēt manējos", "conflict_keep_mine": "Paturēt manējos",
"conflict_overwrite": "Pārrakstīt" "conflict_overwrite": "Pārrakstīt",
"font_size": "Paneļa fonta lielums"
}, },
"log": { "log": {
"all_levels": "Visi līmeņi", "all_levels": "Visi līmeņi",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Lietot labāko vērtību: {label} = {value}?", "pg_apply_confirm": "Lietot labāko vērtību: {label} = {value}?",
"pg_canvas_empty": "Atlasiet ciklu augšpusē, pēc tam nospiediet Ielādēt, lai redzētu tā jaudas līkni.", "pg_canvas_empty": "Atlasiet ciklu augšpusē, pēc tam nospiediet Ielādēt, lai redzētu tā jaudas līkni.",
"pg_chart_caption": "Noteikšanas/atbilstības rādītājs pēc {param} vērtībām", "pg_chart_caption": "Noteikšanas/atbilstības rādītājs pēc {param} vērtībām",
"pg_ctrl_intro": "Vērtības tiek ņemtas no šīs ierīces aktīvajiem integrācijas iestatījumiem. Izmaiņas paliek izmēģinājumu laukumā, līdz tās saglabājat iestatījumos.",
"pg_live_unavailable": "Aktīvie iestatījumi nav pieejami, tiek rādītas noklusējuma vērtības.",
"pg_load_live_confirm": "Vai atmest izmēģinājumu laukuma izmaiņas ({n}) un no jauna ielādēt pašreizējos integrācijas iestatījumus?",
"pg_match_rate": "{pct}% atbilstības rādītājs {total} ciklos", "pg_match_rate": "{pct}% atbilstības rādītājs {total} ciklos",
"pg_matches_live": "Atbilst aktīvajiem iestatījumiem",
"pg_n_changed": "Atšķirību no aktīvajiem iestatījumiem: {n}",
"pg_sugg_none": "Visi ieteikumi jau atbilst pašreizējiem iestatījumiem",
"pg_preset_delete_confirm": "Vai dzēst priekšiestatījumu \"{name}\"?",
"pg_preset_limit": "Sasniegts priekšiestatījumu ierobežojums ({n})",
"pg_preset_overwrite": "Vai pārrakstīt priekšiestatījumu \"{name}\"?",
"pg_publish_one_confirm": "Vai saglabāt {label} = {value} šīs ierīces iestatījumos?",
"pg_restart_note": "Restartējiet Home Assistant, lai iespējotu simulācijas rīkus.", "pg_restart_note": "Restartējiet Home Assistant, lai iespējotu simulācijas rīkus.",
"pg_sim_progress": "{done} / {total} cikli", "pg_sim_progress": "{done} / {total} cikli",
"pg_starting": "Sākas…", "pg_starting": "Sākas…",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Ilguma tendence ir īsāka ({pct}%/cikls) nesenā vidējā {avg}", "trend_duration_shorter": "Ilguma tendence ir īsāka ({pct}%/cikls) nesenā vidējā {avg}",
"trend_energy_down": "Enerģijas tendence samazinās ({pct}%/cikls)", "trend_energy_down": "Enerģijas tendence samazinās ({pct}%/cikls)",
"trend_energy_up": "Enerģijas tendence pieaug ({pct}%/ciklā) nesenā vidējā {avg}", "trend_energy_up": "Enerģijas tendence pieaug ({pct}%/ciklā) nesenā vidējā {avg}",
"trim_destructive_confirm": "Tas saglabā tikai {pct}% no cikla, un šo nevar atsaukt. Turpināt?",
"trim_intro": "Velciet sarkanos rokturus vai ievadiet vērtības. Viss, kas atrodas ārpus loga, tiek noņemts.", "trim_intro": "Velciet sarkanos rokturus vai ievadiet vērtības. Viss, kas atrodas ārpus loga, tiek noņemts.",
"tuning_suggestions_available": "No novērotajiem cikliem pieejams {count} regulēšanas ieteikums. Tie parādās blakus attiecīgajiem laukiem.", "tuning_suggestions_available": "No novērotajiem cikliem pieejams {count} regulēšanas ieteikums. Tie parādās blakus attiecīgajiem laukiem.",
"unsure_detected_prefix": "WashData nav pārliecināts, ka tas ir atklāts", "unsure_detected_prefix": "WashData nav pārliecināts, ka tas ir atklāts",
@@ -922,7 +1001,12 @@
"merge_hint": "Importētie vienumi tiek pievienoti; nekas no vietējiem datiem netiek zaudēts. Nosaukumu konflikti tiek risināti tālāk.", "merge_hint": "Importētie vienumi tiek pievienoti; nekas no vietējiem datiem netiek zaudēts. Nosaukumu konflikti tiek risināti tālāk.",
"replace_warn": "Katra atzīmētā kategorija tiek dzēsta un aizstāta no faila. Neatzīmētās kategorijas paliek neskartas.", "replace_warn": "Katra atzīmētā kategorija tiek dzēsta un aizstāta no faila. Neatzīmētās kategorijas paliek neskartas.",
"dest_reference_hint": "Importētie cikli tikai uzlabo programmu atpazīšanu un nekad neietekmē lietojuma/enerģijas statistiku.", "dest_reference_hint": "Importētie cikli tikai uzlabo programmu atpazīšanu un nekad neietekmē lietojuma/enerģijas statistiku.",
"dest_real_history_hint": "Importētie cikli tiek uzskaitīti kā šīs ierīces pašas vēsture un papildina enerģijas/lietojuma statistiku. Izmantojiet, pārvietojot vienu ierīci uz jaunu instalāciju." "dest_real_history_hint": "Importētie cikli tiek uzskaitīti kā šīs ierīces pašas vēsture un papildina enerģijas/lietojuma statistiku. Izmantojiet, pārvietojot vienu ierīci uz jaunu instalāciju.",
"sug_muted": "Šis iestatījums vairs netiks ieteikts",
"sug_mute_failed": "Neizdevās klusināt ieteikumu",
"sug_unmuted_all": "Klusināto ieteikumu atiestatīšana pabeigta",
"n_suggestions_muted": "{count} klusināti; automātiskais regulētājs tos vairs nepiedāvās.",
"font_size_hint": "Palieliniet vai samaziniet visu šajā panelī. Attiecas uz jūsu kontu šajā ierīcē."
}, },
"phase_desc": { "phase_desc": {
"anti_crease": "Laiku pa laikam pēc pabeigšanas veiciet īsus gājienus, lai samazinātu grumbiņas.", "anti_crease": "Laiku pa laikam pēc pabeigšanas veiciet īsus gājienus, lai samazinātu grumbiņas.",
@@ -970,6 +1054,10 @@
"unusable": "Nelietojama" "unusable": "Nelietojama"
}, },
"section": { "section": {
"dishwasher": {
"label": "Trauku mazgājamā mašīna",
"intro": "Cikla beigu apstrāde trauku mazgājamām mašīnām, kuras parasti beidzas ar ilgu, gandrīz klusu žāvēšanas fāzi pirms īsas galīgās ūdens izvadīšanas."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Pretgrumbu/pretlocīšanas režīms atpazīst zemas jaudas kratīšanas impulsus pēc galvenās fāzes un pievieno tos pabeigtajam ciklam.", "intro": "Pretgrumbu/pretlocīšanas režīms atpazīst zemas jaudas kratīšanas impulsus pēc galvenās fāzes un pievieno tos pabeigtajam ciklam.",
"label": "Pretgrumbu" "label": "Pretgrumbu"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Pasīvās žāvēšanas klusā atbrīvošana",
"doc": "Kad cikls pārsniedz paredzēto ilgumu, cik ilgi trauku mazgājamai mašīnai jāpaliek klusai (zem Apstāšanās slieksnis), pirms WashData pārtrauc gaidīt galīgo ūdens izvadīšanu un pabeidz ciklu. Palieliniet to, ja jūsu mašīnai ir ilga klusa žāvēšanas fāze pirms vēlas galīgās ūdens izvadīšanas, kas tiek palaista garām - plašāks logs ļauj apgūtajam ilgumam sekot sezonālajai novirzei (aukstāks ieplūstošais ūdens = garāki cikli), nevis fiksēties pie vecā vidējā. Tas var tikai saīsināt gaidīšanu attiecībā pret iekšējo 30 minūšu beigu smailes ierobežojumu, nekad to nepagarina."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Atpazīstiet īsos mazjaudas veļas impulsus, ko žāvētājs izstaro pēc galvenās karsēšanas fāzes, un turiet tos pievienotus gatavajam ciklam, nevis nolasiet tos kā jaunus ciklus.", "doc": "Atpazīstiet īsos mazjaudas veļas impulsus, ko žāvētājs izstaro pēc galvenās karsēšanas fāzes, un turiet tos pievienotus gatavajam ciklam, nevis nolasiet tos kā jaunus ciklus.",
"label": "Iespējot pretgrumbu noteikšanu" "label": "Iespējot pretgrumbu noteikšanu"
@@ -1232,6 +1324,10 @@
"doc": "Dažas minūtes pēc cikla beigām, pirms tiek nosūtīts joprojām gaidošais atgādinājums \"izlādēt iekārtu\". Iestatiet 0, lai atspējotu atgādinājumu.", "doc": "Dažas minūtes pēc cikla beigām, pirms tiek nosūtīts joprojām gaidošais atgādinājums \"izlādēt iekārtu\". Iestatiet 0, lai atspējotu atgādinājumu.",
"label": "Izkraušanas atgādinājuma aizkave" "label": "Izkraušanas atgādinājuma aizkave"
}, },
"notify_unload_repeat": {
"doc": "Atkārtoti nosūta izkraušanas atgādinājumu ik pēc \"Izkraušanas atgādinājuma aizkave\" minūtēm, līdz atverat durvis vai paziņojumā pieskaraties \"Pārtraukt atgādināšanu\". Nepieciešama Durvju sensora entītija (tāpat kā pašam atgādinājumam). Atmešanas poga darbojas Home Assistant mobilās (companion) lietotnes paziņojumos.",
"label": "Atkārtot, līdz atveras durvis"
},
"off_delay": { "off_delay": {
"doc": "Laiks gaidīt, kad jauda samazinās, pirms tiek paziņots, ka cikls ir pabeigts. Ja šajā logā tiek atsākta barošana, cikls turpinās nemanāmi tas pārslēdz pauzes starp mazgāšanas posmiem. Trauku mazgājamām mašīnām ir garas žāvēšanas fāzes (izslēdziet strāvu uz 2060 minūtēm), tāpēc izslēgšanas aizkavei ir jābūt lielākai par to, lai visa mazgāšana un žāvēšana būtu viens cikls.", "doc": "Laiks gaidīt, kad jauda samazinās, pirms tiek paziņots, ka cikls ir pabeigts. Ja šajā logā tiek atsākta barošana, cikls turpinās nemanāmi tas pārslēdz pauzes starp mazgāšanas posmiem. Trauku mazgājamām mašīnām ir garas žāvēšanas fāzes (izslēdziet strāvu uz 2060 minūtēm), tāpēc izslēgšanas aizkavei ir jābūt lielākai par to, lai visa mazgāšana un žāvēšana būtu viens cikls.",
"label": "Izslēgšanas aizkave" "label": "Izslēgšanas aizkave"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Enerģijas asums", "label": "Enerģijas asums",
"doc": "4. posma enerģijas atbilstības soda asums. Mazāks = bargāks: enerģijas neatbilstība kaitē vairāk. Noklusējums 0,25 ir apzināti piedodošāks nekā ilguma asums, jo enerģija mainās atkarībā no slodzes. Izmantojiet kopā ar Enerģijas svaru." "doc": "4. posma enerģijas atbilstības soda asums. Mazāks = bargāks: enerģijas neatbilstība kaitē vairāk. Noklusējums 0,25 ir apzināti piedodošāks nekā ilguma asums, jo enerģija mainās atkarībā no slodzes. Izmantojiet kopā ar Enerģijas svaru."
},
"power_profile_interval_min": {
"label": "Jaudas profila intervāls",
"doc": "Spaiņa lielums profilam power_profile sensora atribūtam (vienots vidējo vatu masīvs pa laika nišām, ko izmanto ārējie plānotāji, piemēram, EMHASS un tibber_prices). Mazāki spaini saglabā īsas jaudas pikas asas; lielāki spaini izlīdzina formu. Noklusējums 15 min. Tikai lasīšanas laikā; neietekmē noteikšanu."
},
"notify_live_sticky": {
"label": "Saglabāt tiešraides paziņojumu pēc pieskāriena",
"doc": "Tikai Android. Padarīt tiešraides progresa paziņojumu pastāvīgu (lipīgu), lai pieskāriens tam neatceltu notiekošo pavedienu. Izslēgts saglabā noklusēto uzvedību, kad pieskāriens paziņojumu noraida."
},
"notify_live_click_action": {
"label": "Tiešraides paziņojuma pieskāriena mērķis",
"doc": "Tikai Android. Kur atveras tiešraides progresa paziņojuma pieskāriens (piemēram, /lovelace/laundry vai pilns URL), nevis lietotnes sākumlapa. Atstājiet tukšu noklusējumam."
},
"door_opens_at_end": {
"label": "Durvis automātiski atveras beigās",
"doc": "Trauku mazgājamajām mašīnām, kuras cikla beigās atver durvis žāvēšanai (AirDry un līdzīgas). Ieslēgts, durvju atvēršana darbojošā ciklā vairs nepārtrauc to uz visiem laikiem; tā vietā, ja durvis paliek atvērtas norādīto uzturēšanās laiku zemāk, WashData uzskata ciklu par pabeigtu. Īsa atvēršana (pievienojot trauku) tiek ignorēta. Nepieciešams durvju sensora objekts."
},
"door_end_dwell_seconds": {
"label": "Durvju atvēršanas beigu uzturēšanās laiks",
"doc": "Cik ilgi durvis jāpaliek atvērtām, lai WashData beigtu ciklu, kad ir ieslēgts iestatījums \"Durvis automātiski atveras beigās\". Pietiekami ilgi, lai ignorētu ātru trauka pievienošanu (noklusējums 60 s), pietiekami īsi, lai ātri beigtu, kad mašīna atver durvis."
} }
}, },
"setting_group": { "setting_group": {
@@ -1576,6 +1692,10 @@
"name_required": "Nepieciešams vārds", "name_required": "Nepieciešams vārds",
"no_split_found": "Nav atrastas tukšgaitas spraugas, uz kurām varētu sadalīties", "no_split_found": "Nav atrastas tukšgaitas spraugas, uz kurām varētu sadalīties",
"panel_settings_saved": "Paneļa iestatījumi ir saglabāti", "panel_settings_saved": "Paneļa iestatījumi ir saglabāti",
"pg_preset_loaded": "Priekšiestatījums \"{name}\" ielādēts",
"pg_preset_saved": "Priekšiestatījums \"{name}\" saglabāts",
"pg_sugg_loaded": "Ielādētas {n} ieteiktās vērtības - palaidiet izmēģinājumu laukumu salīdzināšanai",
"pg_sugg_ml_loaded": "Ielādētas {n} ML kalibrētas vērtības - palaidiet izmēģinājumu laukumu salīdzināšanai",
"phase_name_required": "Nepieciešams fāzes nosaukums", "phase_name_required": "Nepieciešams fāzes nosaukums",
"phase_updated": "Fāze atjaunināta", "phase_updated": "Fāze atjaunināta",
"phases_saved": "Fāzes saglabātas", "phases_saved": "Fāzes saglabātas",
@@ -1723,6 +1843,7 @@
"min_active": "Pamatots ar minimālo aktīvo jaudu ({min}W), kas novērota pēdējā ciklā.", "min_active": "Pamatots ar minimālo aktīvo jaudu ({min}W), kas novērota pēdējā ciklā.",
"min_duration_ratio": "Saglabāts pēc iespējas zemāks, lai programma tiktu atpazīta cikla sākumā; ticamības un neskaidrības sliekšņi novērš pāragru apstiprināšanu.", "min_duration_ratio": "Saglabāts pēc iespējas zemāks, lai programma tiktu atpazīta cikla sākumā; ticamības un neskaidrības sliekšņi novērš pāragru apstiprināšanu.",
"min_off_gap": "Pamatots ar {gaps} novērotiem starpciklu intervāliem (p05={p05}s). Ierīces apakšējā robeža: {floor}s.", "min_off_gap": "Pamatots ar {gaps} novērotiem starpciklu intervāliem (p05={p05}s). Ierīces apakšējā robeža: {floor}s.",
"min_off_gap_bridge": "Aprēķināts, lai pārsegtu garāko kluso posmu cikla iekšienē: {span}s + 60s buferis, no {spans} pārsegtiem intervāliem {cycles} tīros ciklos (paliek zem jūsu īsākā intervāla starp divām secīgām palaišanas reizēm, kas ir {ceiling}s).",
"min_power": "40% no p05 zemākās aktīvās jaudas ({p05}W) {cycles} tīros ciklos, saglabājot izslēgšanas slieksni zem reālā patēriņa.{excl}", "min_power": "40% no p05 zemākās aktīvās jaudas ({p05}W) {cycles} tīros ciklos, saglabājot izslēgšanas slieksni zem reālā patēriņa.{excl}",
"ml_auto_label": "Zemākā ticamība, ko kvalitātes modelis vēl novērtēja kā tīru (p10 no {cycles} tīriem cikliem = {p10}).", "ml_auto_label": "Zemākā ticamība, ko kvalitātes modelis vēl novērtēja kā tīru (p10 no {cycles} tīriem cikliem = {p10}).",
"ml_end_repeat": "{false}/{total} ciklu ({pct}%) bija pauze, ko beigu detektors novērtēja >50%; pieprasīt {val} beigu apstiprinājumu(s).", "ml_end_repeat": "{false}/{total} ciklu ({pct}%) bija pauze, ko beigu detektors novērtēja >50%; pieprasīt {val} beigu apstiprinājumu(s).",
@@ -1739,7 +1860,7 @@
"thr_batch": "Saglabāts nedaudz virs p05 zemākās aktīvās jaudas {cycles} ciklos ({p05}W), lai sākums tiktu uztverts pēc iespējas agrāk un apturēšanas slieksnis paliktu zem mašīnas zemākās darbības jaudas.", "thr_batch": "Saglabāts nedaudz virs p05 zemākās aktīvās jaudas {cycles} ciklos ({p05}W), lai sākums tiktu uztverts pēc iespējas agrāk un apturēšanas slieksnis paliktu zem mašīnas zemākās darbības jaudas.",
"tol_per_profile": "p75 no katra profila ilguma dispersijas {profiles} profilos ({cycles} cikli); stabili profili netiek sodīti.", "tol_per_profile": "p75 no katra profila ilguma dispersijas {profiles} profilos ({cycles} cikli); stabili profili netiek sodīti.",
"tol_pooled": "Pamatots ar apvienoto ilguma dispersiju {cycles} nesen marķētiem cikliem (p95 novirze={dev}).", "tol_pooled": "Pamatots ar apvienoto ilguma dispersiju {cycles} nesen marķētiem cikliem (p95 novirze={dev}).",
"watchdog": "Saglabāts pēc iespējas zemāks, cik droši (3x p95 atjaunināšanas intervāls {p95}s, min. 30s), lai apstāšanās tiktu atklāta ātri bez viltus apturēšanas." "watchdog": "Saglabāts pēc iespējas zemāks, cik droši (tikai nedaudz virs p95 atjaunināšanas intervāla {p95}s, min. 30s), lai apstāšanās tiktu atklāta ātri bez viltus apturēšanas."
}, },
"exclusions": { "exclusions": {
"summary": "Izslēgti {total} kļūdaini atpazīti cikli: {parts}.", "summary": "Izslēgti {total} kļūdaini atpazīti cikli: {parts}.",
@@ -1770,6 +1891,7 @@
"other": "Cits" "other": "Cits"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Trauku mazgājamā mašīna: klusās sekundes pēc paredzētā ilguma, pirms tiek atbrīvota cikla beigu ūdens izvadīšanas gaidīšana",
"anti_wrinkle_enabled": "Absorbējiet griešanās impulsus pēc galvenās fāzes, nevis nolasiet tos kā jaunus ciklus", "anti_wrinkle_enabled": "Absorbējiet griešanās impulsus pēc galvenās fāzes, nevis nolasiet tos kā jaunus ciklus",
"anti_wrinkle_exit_power": "Lai pretgrumbu režīms paliktu aktīvs, jaudai starp impulsiem jānokrītas zem šīs vērtības", "anti_wrinkle_exit_power": "Lai pretgrumbu režīms paliktu aktīvs, jaudai starp impulsiem jānokrītas zem šīs vērtības",
"anti_wrinkle_idle_timeout": "Atļautais klusuma laiks starp diviem griešanās impulsiem, pirms pretgrumbu režīms beidzas", "anti_wrinkle_idle_timeout": "Atļautais klusuma laiks starp diviem griešanās impulsiem, pirms pretgrumbu režīms beidzas",
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entitet ikke funnet",
"running_long": "Kjører lenger",
"remaining": "gjenstår",
"progress": "fremdrift",
"show_time_remaining": "Vis gjenstående tid",
"show_percentage": "Vis prosent",
"layout": {
"tile": "Flis (kompakt)",
"detail": "Detalj (fyldig)",
"glance": "Oversikt (flere enheter)"
},
"btn": {
"pause": "Pause",
"resume": "Fortsett",
"terminate": "Avslutt syklus",
"record_start": "Start opptak",
"record_stop": "Stopp opptak",
"program": "Program",
"open_panel": "Åpne WashData"
},
"editor": {
"layout": "Oppsett",
"entity": "Apparatentitet",
"entities": "Apparater",
"title": "Tittel",
"icon": "Ikon",
"show_state": "Vis tilstand",
"show_program": "Vis program",
"show_progress_bar": "Vis fremdriftslinje",
"spin_icon": "Roter ikon under kjøring",
"display_mode": "Detaljlinje",
"active_color": "Overstyr aktiv farge",
"show_phase": "Vis fase",
"show_energy": "Vis energi og kostnad",
"show_anomaly": "Vis varsel om lang kjøring",
"show_sparkline": "Vis sanntids effektgraf",
"buttons": "Handlingsknapper",
"program_entity": "Programentitet (overstyr)",
"time_entity": "Tidsentitet (overstyr)",
"pct_entity": "Fremdriftsentitet (overstyr)",
"power_entity": "Effektentitet (overstyr)",
"tap_action": "Trykkhandling",
"hold_action": "Holdhandling",
"double_tap_action": "Dobbelttrykkhandling"
}
},
"badge": { "badge": {
"artifact_tip": "{n} avvik oppdaget (f.eks. dør åpnet midt i syklusen) åpne for å se dem på grafen", "artifact_tip": "{n} avvik oppdaget (f.eks. dør åpnet midt i syklusen) åpne for å se dem på grafen",
"auto": "(automatisk oppdaget)", "auto": "(automatisk oppdaget)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Sett den kjørende syklusen på pause apparatet fortsetter der det slapp", "pause_cycle_tip": "Sett den kjørende syklusen på pause apparatet fortsetter der det slapp",
"pg_apply_device": "Bruk på enhet", "pg_apply_device": "Bruk på enhet",
"pg_autofill": "Autofyll", "pg_autofill": "Autofyll",
"pg_load_calibrated": "Last inn kalibrerte (ML) ({n})",
"pg_load_calibrated_tip": "Laster inn ML-kalibrerte innstillinger som sandkasse-overstyringer",
"pg_load_live": "Last inn aktive innstillinger",
"pg_load_live_tip": "Les inn integrasjonens gjeldende innstillinger på nytt og forkast alle endringer i sandkassen",
"pg_load_suggested": "Last inn forslag ({n})",
"pg_load_suggested_tip": "Laster inn auto-tunerens gjeldende forslag som sandkasse-overstyringer",
"pg_preset_delete": "Slett forhåndsinnstilling",
"pg_preset_load": "Last inn forhåndsinnstilling",
"pg_preset_load_tip": "Erstatt verdiene i sandkassen med denne forhåndsinnstillingen (de aktive innstillingene berøres ikke)",
"pg_preset_save": "Lagre som forhåndsinnstilling",
"pg_preset_save_tip": "Lagre alle verdiene nedenfor som en navngitt forhåndsinnstilling for denne enheten",
"pg_publish_all": "Lagre {n} i integrasjonen",
"pg_publish_one": "Lagre {label} i integrasjonen",
"play": "Spill av", "play": "Spill av",
"process": "Behandl", "process": "Behandl",
"process_history": "Behandl nå", "process_history": "Behandl nå",
@@ -178,7 +239,9 @@
"download_export": "Last ned eksport", "download_export": "Last ned eksport",
"analyze_import": "Analyser fil", "analyze_import": "Analyser fil",
"import_selected": "Importer valgte", "import_selected": "Importer valgte",
"back": "Tilbake" "back": "Tilbake",
"mute_suggestion": "Slutt å foreslå denne innstillingen",
"reset_muted": "Tilbakestill dempede forslag"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +338,7 @@
"no_automations": "Ingen automatiseringer refererer til denne enheten ennå.", "no_automations": "Ingen automatiseringer refererer til denne enheten ennå.",
"panel_settings": "Panelinnstillinger", "panel_settings": "Panelinnstillinger",
"param_sweep": "Parametersveip", "param_sweep": "Parametersveip",
"pg_settings_source": "Kilde for innstillingene",
"phase_catalog": "Fasekatalog", "phase_catalog": "Fasekatalog",
"playground": "Sandkasse", "playground": "Sandkasse",
"process_history": "Prosesshistorie", "process_history": "Prosesshistorie",
@@ -410,6 +474,9 @@
"pg_group_detection": "Deteksjonsutløsere", "pg_group_detection": "Deteksjonsutløsere",
"pg_group_timing": "Tidsregler", "pg_group_timing": "Tidsregler",
"pg_idle": "Inaktiv", "pg_idle": "Inaktiv",
"pg_preset": "Forhåndsinnstilling for sandkassen",
"pg_preset_name": "Navn på ny forhåndsinnstilling",
"pg_preset_none": "Velg en forhåndsinnstilling…",
"pg_stress_group": "Test av inaktiv avslutning", "pg_stress_group": "Test av inaktiv avslutning",
"pg_stress_idle_auto": "Auto", "pg_stress_idle_auto": "Auto",
"pg_stress_idle_w": "Inaktivt nivå (W)", "pg_stress_idle_w": "Inaktivt nivå (W)",
@@ -609,7 +676,8 @@
"conflict_import_copy": "Importer som kopi", "conflict_import_copy": "Importer som kopi",
"conflict_keep_mine": "Behold mine", "conflict_keep_mine": "Behold mine",
"conflict_overwrite": "Overskriv", "conflict_overwrite": "Overskriv",
"pg_anti_wrinkle": "Anti-rynke" "pg_anti_wrinkle": "Anti-rynke",
"font_size": "Panelets skriftstørrelse"
}, },
"log": { "log": {
"all_levels": "Alle nivåer", "all_levels": "Alle nivåer",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Bruke beste verdi: {label} = {value}?", "pg_apply_confirm": "Bruke beste verdi: {label} = {value}?",
"pg_canvas_empty": "Velg en syklus ovenfor, og trykk deretter Last inn for å se effektkurven.", "pg_canvas_empty": "Velg en syklus ovenfor, og trykk deretter Last inn for å se effektkurven.",
"pg_chart_caption": "Deteksjons-/treffrate på tvers av verdier for {param}", "pg_chart_caption": "Deteksjons-/treffrate på tvers av verdier for {param}",
"pg_ctrl_intro": "Verdiene tar utgangspunkt i denne enhetens aktive innstillinger i integrasjonen. Endringer blir værende i sandkassen til du lagrer dem i integrasjonen.",
"pg_live_unavailable": "Aktive innstillinger er ikke tilgjengelige, viser standardverdier.",
"pg_load_live_confirm": "Forkaste {n} endring(er) i sandkassen og laste inn integrasjonens gjeldende innstillinger på nytt?",
"pg_match_rate": "{pct}% treffrate på {total} sykluser", "pg_match_rate": "{pct}% treffrate på {total} sykluser",
"pg_matches_live": "Samsvarer med de aktive innstillingene",
"pg_n_changed": "{n} endret sammenlignet med de aktive innstillingene",
"pg_sugg_none": "Alle forslag samsvarer allerede med de aktive innstillingene",
"pg_preset_delete_confirm": "Slette forhåndsinnstillingen \"{name}\"?",
"pg_preset_limit": "Grensen for forhåndsinnstillinger er nådd ({n})",
"pg_preset_overwrite": "Overskrive forhåndsinnstillingen \"{name}\"?",
"pg_publish_one_confirm": "Lagre {label} = {value} i innstillingene for denne enheten?",
"pg_restart_note": "Start Home Assistant på nytt for å aktivere simuleringsverktøyene.", "pg_restart_note": "Start Home Assistant på nytt for å aktivere simuleringsverktøyene.",
"pg_sim_progress": "{done} / {total} sykluser", "pg_sim_progress": "{done} / {total} sykluser",
"pg_starting": "Starter…", "pg_starting": "Starter…",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Varighet trender kortere ({pct} %/syklus) nylig snitt {avg}", "trend_duration_shorter": "Varighet trender kortere ({pct} %/syklus) nylig snitt {avg}",
"trend_energy_down": "Energi på vei ned ({pct} %/syklus)", "trend_energy_down": "Energi på vei ned ({pct} %/syklus)",
"trend_energy_up": "Energi på vei opp ({pct} %/syklus) nylig gjennomsnittlig {avg}", "trend_energy_up": "Energi på vei opp ({pct} %/syklus) nylig gjennomsnittlig {avg}",
"trim_destructive_confirm": "Kun {pct}% av syklusen beholdes. Dette kan ikke angres. Fortsette?",
"trim_intro": "Dra de røde håndtakene, eller skriv inn verdier. Alt utenfor vinduet fjernes.", "trim_intro": "Dra de røde håndtakene, eller skriv inn verdier. Alt utenfor vinduet fjernes.",
"tuning_suggestions_available": "{count} justeringsforslag tilgjengelig fra observerte sykluser. De vises ved siden av de relevante feltene.", "tuning_suggestions_available": "{count} justeringsforslag tilgjengelig fra observerte sykluser. De vises ved siden av de relevante feltene.",
"unsure_detected_prefix": "WashData er usikker på om det er oppdaget", "unsure_detected_prefix": "WashData er usikker på om det er oppdaget",
@@ -922,9 +1001,15 @@
"merge_hint": "Importerte elementer legges til; ingenting lokalt går tapt. Navnekonflikter løses nedenfor.", "merge_hint": "Importerte elementer legges til; ingenting lokalt går tapt. Navnekonflikter løses nedenfor.",
"replace_warn": "Hver avkrysset kategori slettes og erstattes fra filen. Ikke-avkryssede kategorier forblir uendret.", "replace_warn": "Hver avkrysset kategori slettes og erstattes fra filen. Ikke-avkryssede kategorier forblir uendret.",
"dest_reference_hint": "Importerte sykluser forbedrer bare programgjenkjenning og påvirker aldri bruks-/energistatistikk.", "dest_reference_hint": "Importerte sykluser forbedrer bare programgjenkjenning og påvirker aldri bruks-/energistatistikk.",
"dest_real_history_hint": "Importerte sykluser teller som dette apparatets egen historikk og mater energi-/bruksstatistikk. Bruk dette til å flytte ett apparat til en ny installasjon." "dest_real_history_hint": "Importerte sykluser teller som dette apparatets egen historikk og mater energi-/bruksstatistikk. Bruk dette til å flytte ett apparat til en ny installasjon.",
"sug_muted": "Vil ikke foreslå denne innstillingen igjen",
"sug_mute_failed": "Kunne ikke dempe forslaget",
"sug_unmuted_all": "Dempede forslag tilbakestilt",
"n_suggestions_muted": "{count} dempet; autotuner vil ikke foreslå disse.",
"font_size_hint": "Gjør alt i dette panelet større eller mindre. Gjelder for kontoen din på denne enheten."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Oppvaskmaskin: stille sekunder etter forventet varighet før ventingen på tømming ved slutten av syklusen frigjøres",
"completion_min_seconds": "Korteste kjøring som teller som en ekte syklus", "completion_min_seconds": "Korteste kjøring som teller som en ekte syklus",
"end_repeat_count": "Lave avlesninger på rad før avslutning", "end_repeat_count": "Lave avlesninger på rad før avslutning",
"interrupted_min_seconds": "Korte sykluser merkes som avbrutt", "interrupted_min_seconds": "Korte sykluser merkes som avbrutt",
@@ -998,6 +1083,10 @@
"unusable": "Ubrukelig" "unusable": "Ubrukelig"
}, },
"section": { "section": {
"dishwasher": {
"label": "Oppvaskmaskin",
"intro": "Håndtering av syklusslutt for oppvaskmaskiner, som vanligvis avsluttes med en lang, nesten lydløs tørkefase før en kort siste tømming."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Anti-rynke-/anti-krøll-modus oppdager lavomsatt tumle-pulser etter hoveddelen og holder dem festet til den ferdige syklusen.", "intro": "Anti-rynke-/anti-krøll-modus oppdager lavomsatt tumle-pulser etter hoveddelen og holder dem festet til den ferdige syklusen.",
"label": "Anti-rynke" "label": "Anti-rynke"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Frigjøring etter stille tørkefase",
"doc": "Når syklusen passerer forventet varighet: hvor lenge oppvaskmaskinen må holde seg stille (under Stoppterskel) før WashData slutter å vente på en siste tømming og avslutter syklusen. Øk den hvis maskinen din har en lang stille tørkefase før en sen siste tømming som blir oversett - et bredere vindu lar den innlærte varigheten følge sesongvariasjoner (kaldere tilførselsvann = lengre sykluser) i stedet for å låse seg til det gamle gjennomsnittet. Den forkorter bare ventetiden i forhold til den interne grensen på 30 minutter for sluttoppen, aldri forlenger den."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Gjenkjenn de korte laveffekttrommelpulsene en tørketrommel sender ut etter hovedvarmefasen, og hold dem festet til den ferdige syklusen i stedet for å lese dem som nye sykluser.", "doc": "Gjenkjenn de korte laveffekttrommelpulsene en tørketrommel sender ut etter hovedvarmefasen, og hold dem festet til den ferdige syklusen i stedet for å lese dem som nye sykluser.",
"label": "Aktiver anti-rynke-deteksjon" "label": "Aktiver anti-rynke-deteksjon"
@@ -1260,6 +1353,10 @@
"doc": "Minutter etter at en syklus avsluttes før du sender den fortsatt ventende påminnelsen om \"last av maskinen\". Sett 0 for å deaktivere påminnelsen.", "doc": "Minutter etter at en syklus avsluttes før du sender den fortsatt ventende påminnelsen om \"last av maskinen\". Sett 0 for å deaktivere påminnelsen.",
"label": "Utlastingspåminnelsesforsinkelse" "label": "Utlastingspåminnelsesforsinkelse"
}, },
"notify_unload_repeat": {
"doc": "Fortsetter å sende utlastingspåminnelsen på nytt hvert \"Utlastingspåminnelsesforsinkelse\" minutt til du åpner døren eller trykker på \"Stopp påminnelser\" i varselet. Krever en Dørensorenhet (det gjør selve påminnelsen). Avvis-knappen fungerer på varsler fra Home Assistant companion-appen (mobil).",
"label": "Gjenta til døren åpnes"
},
"off_delay": { "off_delay": {
"doc": "På tide å vente etter at strømmen faller før du erklærer at syklusen er fullført. Hvis strømmen gjenopptas innenfor dette vinduet, fortsetter syklusen sømløst - dette slår bro mellom pauser mellom vasketrinn. Oppvaskmaskiner har lange tørkefaser (strøm av i 20-60 min) så avslåingsforsinkelsen må overstige det for å holde hele vask+tørr som én syklus.", "doc": "På tide å vente etter at strømmen faller før du erklærer at syklusen er fullført. Hvis strømmen gjenopptas innenfor dette vinduet, fortsetter syklusen sømløst - dette slår bro mellom pauser mellom vasketrinn. Oppvaskmaskiner har lange tørkefaser (strøm av i 20-60 min) så avslåingsforsinkelsen må overstige det for å holde hele vask+tørr som én syklus.",
"label": "Av-forsinkelse" "label": "Av-forsinkelse"
@@ -1434,6 +1531,26 @@
"energy_scale": { "energy_scale": {
"label": "Energiskarphet", "label": "Energiskarphet",
"doc": "Skarphet i Trinn 4 sitt straff for energioverensstemmelse. Lavere = strengere: et energiavvik straffes mer. Standard 0,25 er bevisst mer tillåtende enn varighetsskarphet fordi energi varierer med last. Par med Energivekt." "doc": "Skarphet i Trinn 4 sitt straff for energioverensstemmelse. Lavere = strengere: et energiavvik straffes mer. Standard 0,25 er bevisst mer tillåtende enn varighetsskarphet fordi energi varierer med last. Par med Energivekt."
},
"power_profile_interval_min": {
"label": "Effektprofil-intervall",
"doc": "Bucket-størrelse for effektprofilsensorens attributt power_profile (det flate arrayet med gjennomsnittlige wattverdier per slot som brukes av eksterne planleggere som EMHASS og tibber_prices). Mindre buckets holder korte effekttopper skarpe; større buckets glatter kurven. Standard 15 min. Kun for visning; påvirker ikke deteksjon."
},
"notify_live_sticky": {
"label": "Behold live-varsel ved trykk",
"doc": "Kun Android. Gjør live-fremdriftsvarselet vedvarende (sticky) slik at et trykk ikke avviser det. Av: standardadferd der et trykk avviser varselet."
},
"notify_live_click_action": {
"label": "Trykkdestinasjon for live-varsel",
"doc": "Kun Android. Hvor et trykk på live-fremdriftsvarselet åpner (f.eks. /lovelace/laundry eller en full URL) i stedet for appens startside. La stå tomt for standard."
},
"door_opens_at_end": {
"label": "Dør åpnes automatisk ved avslutning",
"doc": "For oppvaskmaskiner som spretter opp døren på slutten av syklusen for tørking (AirDry og lignende). Med dette aktivert vil en døråpning under en aktiv syklus ikke sette den på pause for alltid; hvis døren forblir åpen i den konfigurerte oppholdstiden, behandler WashData syklusen som ferdig. En kort åpning (legge til et element) ignoreres. Krever en dørsensorenhet."
},
"door_end_dwell_seconds": {
"label": "Dørens åpningstid ved avslutning",
"doc": "Hvor lenge døren må forbli åpen før WashData avslutter syklusen, når \"Dør åpnes automatisk ved avslutning\" er aktivert. Lang nok til å ignorere rask tillegging av et fat (standard 60 s), kort nok til å avslutte raskt når maskinen spretter opp døren."
} }
}, },
"setting_group": { "setting_group": {
@@ -1620,6 +1737,7 @@
"min_active": "Basert på laveste aktive effekt ({min}W) observert i siste syklus.", "min_active": "Basert på laveste aktive effekt ({min}W) observert i siste syklus.",
"min_duration_ratio": "Holdt så lav som mulig slik at et program gjenkjennes tidlig i syklusen; konfidens- og tvetydighetsgrensene hindrer forhastede beslutninger.", "min_duration_ratio": "Holdt så lav som mulig slik at et program gjenkjennes tidlig i syklusen; konfidens- og tvetydighetsgrensene hindrer forhastede beslutninger.",
"min_off_gap": "Basert på {gaps} observerte mellomrom mellom sykluser (p05={p05}s). Enhetsgulv: {floor}s.", "min_off_gap": "Basert på {gaps} observerte mellomrom mellom sykluser (p05={p05}s). Enhetsgulv: {floor}s.",
"min_off_gap_bridge": "Dimensjonert for å bygge bro over den lengste stille perioden i en syklus: {span}s + 60s buffer, fra {spans} dekkede mellomrom på tvers av {cycles} rene sykluser (holder seg under ditt korteste mellomrom på {ceiling}s mellom to kjøringer).",
"min_power": "40% av den laveste aktive effekten ved p05 ({p05}W) på tvers av {cycles} rene sykluser, noe som holder av-terskelen under reelt forbruk.{excl}", "min_power": "40% av den laveste aktive effekten ved p05 ({p05}W) på tvers av {cycles} rene sykluser, noe som holder av-terskelen under reelt forbruk.{excl}",
"ml_auto_label": "Laveste konfidens som kvalitetsmodellen fortsatt vurderte som ren (p10 av {cycles} rene sykluser = {p10}).", "ml_auto_label": "Laveste konfidens som kvalitetsmodellen fortsatt vurderte som ren (p10 av {cycles} rene sykluser = {p10}).",
"ml_end_repeat": "{false}/{total} sykluser ({pct}%) hadde en pause som sluttdetektoren vurderte til >50%; krever {val} sluttbekreftelse(r).", "ml_end_repeat": "{false}/{total} sykluser ({pct}%) hadde en pause som sluttdetektoren vurderte til >50%; krever {val} sluttbekreftelse(r).",
@@ -1636,7 +1754,7 @@
"thr_batch": "Holdt like over den laveste aktive effekten ved p05 på tvers av {cycles} sykluser ({p05}W) slik at en start fanges så tidlig som mulig og stoppterskelen holder seg under maskinens laveste driftseffekt.", "thr_batch": "Holdt like over den laveste aktive effekten ved p05 på tvers av {cycles} sykluser ({p05}W) slik at en start fanges så tidlig som mulig og stoppterskelen holder seg under maskinens laveste driftseffekt.",
"tol_per_profile": "p75 for varighetsvariansen per profil på tvers av {profiles} profiler ({cycles} sykluser); stramme profiler straffes ikke.", "tol_per_profile": "p75 for varighetsvariansen per profil på tvers av {profiles} profiler ({cycles} sykluser); stramme profiler straffes ikke.",
"tol_pooled": "Basert på samlet varighetsvarians for {cycles} nyeste merkede sykluser (p95 avvik={dev}).", "tol_pooled": "Basert på samlet varighetsvarians for {cycles} nyeste merkede sykluser (p95 avvik={dev}).",
"watchdog": "Holdt så lavt som forsvarlig (3x p95-oppdateringsmellomrommet på {p95}s, min 30s) slik at stans fanges raskt uten falske stopp." "watchdog": "Holdt så lavt som forsvarlig (like over p95-oppdateringsmellomrommet på {p95}s, min 30s) slik at stans fanges raskt uten falske stopp."
}, },
"exclusions": { "exclusions": {
"summary": "Ekskluderte {total} feildetekterte syklus(er): {parts}.", "summary": "Ekskluderte {total} feildetekterte syklus(er): {parts}.",
@@ -1716,6 +1834,10 @@
"name_required": "Navn kreves", "name_required": "Navn kreves",
"no_split_found": "Ingen ledige mellomrom funnet å dele seg på", "no_split_found": "Ingen ledige mellomrom funnet å dele seg på",
"panel_settings_saved": "Panelinnstillinger lagret", "panel_settings_saved": "Panelinnstillinger lagret",
"pg_preset_loaded": "Forhåndsinnstillingen \"{name}\" er lastet inn",
"pg_preset_saved": "Forhåndsinnstillingen \"{name}\" er lagret",
"pg_sugg_loaded": "{n} foreslåtte verdi(er) lest inn - kjør sandkassen for å sammenligne",
"pg_sugg_ml_loaded": "{n} ML-kalibrerte verdi(er) lest inn - kjør sandkassen for å sammenligne",
"phase_name_required": "Fasenavn er påkrevd", "phase_name_required": "Fasenavn er påkrevd",
"phase_updated": "Fase oppdatert", "phase_updated": "Fase oppdatert",
"phases_saved": "Faser lagret", "phases_saved": "Faser lagret",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entiteit niet gevonden",
"running_long": "Loopt langer",
"remaining": "resterend",
"progress": "voortgang",
"show_time_remaining": "Resterende tijd tonen",
"show_percentage": "Percentage tonen",
"layout": {
"tile": "Tegel (compact)",
"detail": "Detail (uitgebreid)",
"glance": "Overzicht (meerdere apparaten)"
},
"btn": {
"pause": "Pauzeren",
"resume": "Hervatten",
"terminate": "Cyclus beëindigen",
"record_start": "Opname starten",
"record_stop": "Opname stoppen",
"program": "Programma",
"open_panel": "WashData openen"
},
"editor": {
"layout": "Lay-out",
"entity": "Apparaatentiteit",
"entities": "Apparaten",
"title": "Titel",
"icon": "Pictogram",
"show_state": "Status tonen",
"show_program": "Programma tonen",
"show_progress_bar": "Voortgangsbalk tonen",
"spin_icon": "Pictogram laten draaien tijdens uitvoering",
"display_mode": "Detailregel",
"active_color": "Actieve kleur overschrijven",
"show_phase": "Fase tonen",
"show_energy": "Energie en kosten tonen",
"show_anomaly": "Waarschuwing voor uitloop tonen",
"show_sparkline": "Live vermogensgrafiek tonen",
"buttons": "Actieknoppen",
"program_entity": "Programma-entiteit (overschrijven)",
"time_entity": "Tijdentiteit (overschrijven)",
"pct_entity": "Voortgangsentiteit (overschrijven)",
"power_entity": "Vermogensentiteit (overschrijven)",
"tap_action": "Tikactie",
"hold_action": "Vasthoudactie",
"double_tap_action": "Dubbeltikactie"
}
},
"badge": { "badge": {
"artifact_tip": "{n} afwijkingen gedetecteerd (bijvoorbeeld de deur werd halverwege de cyclus geopend) open om ze in de grafiek te zien", "artifact_tip": "{n} afwijkingen gedetecteerd (bijvoorbeeld de deur werd halverwege de cyclus geopend) open om ze in de grafiek te zien",
"auto": "(automatisch gedetecteerd)", "auto": "(automatisch gedetecteerd)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "De actieve cyclus pauzeren het apparaat hervat waar het was gestopt", "pause_cycle_tip": "De actieve cyclus pauzeren het apparaat hervat waar het was gestopt",
"pg_apply_device": "Toepassen op apparaat", "pg_apply_device": "Toepassen op apparaat",
"pg_autofill": "Automatisch invullen", "pg_autofill": "Automatisch invullen",
"pg_load_calibrated": "Gekalibreerde (ML) laden ({n})",
"pg_load_calibrated_tip": "Laadt ML-gekalibreerde instellingen als speeltuin-overschrijvingen",
"pg_load_live": "Actieve instellingen laden",
"pg_load_live_tip": "De huidige instellingen van de integratie opnieuw inlezen en alle wijzigingen in de speeltuin weggooien",
"pg_load_suggested": "Suggesties laden ({n})",
"pg_load_suggested_tip": "Laadt de huidige suggesties van de auto-tuner als speeltuin-overschrijvingen",
"pg_preset_delete": "Voorinstelling verwijderen",
"pg_preset_load": "Voorinstelling laden",
"pg_preset_load_tip": "De waarden in de speeltuin vervangen door deze voorinstelling (de actieve instellingen blijven ongewijzigd)",
"pg_preset_save": "Opslaan als voorinstelling",
"pg_preset_save_tip": "Alle onderstaande waarden opslaan als voorinstelling met een naam voor dit apparaat",
"pg_publish_all": "{n} opslaan in integratie",
"pg_publish_one": "{label} opslaan in de integratie",
"play": "Afspelen", "play": "Afspelen",
"process": "Verwerken", "process": "Verwerken",
"process_history": "Verwerk nu", "process_history": "Verwerk nu",
@@ -178,7 +239,9 @@
"download_export": "Export downloaden", "download_export": "Export downloaden",
"analyze_import": "Bestand analyseren", "analyze_import": "Bestand analyseren",
"import_selected": "Selectie importeren", "import_selected": "Selectie importeren",
"back": "Terug" "back": "Terug",
"mute_suggestion": "Deze instelling niet meer voorstellen",
"reset_muted": "Gedempte suggesties herstellen"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +338,7 @@
"no_automations": "Er zijn nog geen automatiseringen die naar dit apparaat verwijzen.", "no_automations": "Er zijn nog geen automatiseringen die naar dit apparaat verwijzen.",
"panel_settings": "Paneelinstellingen", "panel_settings": "Paneelinstellingen",
"param_sweep": "Parameterscan", "param_sweep": "Parameterscan",
"pg_settings_source": "Herkomst van de instellingen",
"phase_catalog": "Fasecatalogus", "phase_catalog": "Fasecatalogus",
"playground": "Speeltuin", "playground": "Speeltuin",
"process_history": "Procesgeschiedenis", "process_history": "Procesgeschiedenis",
@@ -410,6 +474,9 @@
"pg_group_detection": "Detectietriggers", "pg_group_detection": "Detectietriggers",
"pg_group_timing": "Timingregels", "pg_group_timing": "Timingregels",
"pg_idle": "Inactief", "pg_idle": "Inactief",
"pg_preset": "Speeltuin-voorinstelling",
"pg_preset_name": "Naam van nieuwe voorinstelling",
"pg_preset_none": "Kies een voorinstelling…",
"pg_stress_group": "Test voor inactieve beëindiging", "pg_stress_group": "Test voor inactieve beëindiging",
"pg_stress_idle_auto": "Auto", "pg_stress_idle_auto": "Auto",
"pg_stress_idle_w": "Inactief vermogen (W)", "pg_stress_idle_w": "Inactief vermogen (W)",
@@ -609,7 +676,8 @@
"conflict_import_copy": "Importeren als kopie", "conflict_import_copy": "Importeren als kopie",
"conflict_keep_mine": "Die van mij behouden", "conflict_keep_mine": "Die van mij behouden",
"conflict_overwrite": "Overschrijven", "conflict_overwrite": "Overschrijven",
"pg_anti_wrinkle": "Anti-kreuk" "pg_anti_wrinkle": "Anti-kreuk",
"font_size": "Paneel lettergrootte"
}, },
"log": { "log": {
"all_levels": "Alle niveaus", "all_levels": "Alle niveaus",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Beste waarde toepassen: {label} = {value}?", "pg_apply_confirm": "Beste waarde toepassen: {label} = {value}?",
"pg_canvas_empty": "Selecteer hierboven een cyclus en druk vervolgens op Laden om de vermogenscurve te bekijken.", "pg_canvas_empty": "Selecteer hierboven een cyclus en druk vervolgens op Laden om de vermogenscurve te bekijken.",
"pg_chart_caption": "Detectie-/matchpercentage over de waarden van {param}", "pg_chart_caption": "Detectie-/matchpercentage over de waarden van {param}",
"pg_ctrl_intro": "De waarden beginnen bij de actieve instellingen van dit apparaat in de integratie. Wijzigingen blijven in de speeltuin totdat je ze opslaat in de integratie.",
"pg_live_unavailable": "Actieve instellingen niet beschikbaar, standaardwaarden worden getoond.",
"pg_load_live_confirm": "{n} wijziging(en) in de speeltuin weggooien en de huidige instellingen van de integratie opnieuw laden?",
"pg_match_rate": "{pct}% matchpercentage op {total} cycli", "pg_match_rate": "{pct}% matchpercentage op {total} cycli",
"pg_matches_live": "Gelijk aan de actieve instellingen",
"pg_n_changed": "{n} gewijzigd t.o.v. de actieve instellingen",
"pg_sugg_none": "Alle suggesties komen al overeen met de huidige instellingen",
"pg_preset_delete_confirm": "De voorinstelling \"{name}\" verwijderen?",
"pg_preset_limit": "Maximum aantal voorinstellingen bereikt ({n})",
"pg_preset_overwrite": "De voorinstelling \"{name}\" overschrijven?",
"pg_publish_one_confirm": "{label} = {value} opslaan in de instellingen van dit apparaat?",
"pg_restart_note": "Start Home Assistant opnieuw op om de simulatiehulpmiddelen in te schakelen.", "pg_restart_note": "Start Home Assistant opnieuw op om de simulatiehulpmiddelen in te schakelen.",
"pg_sim_progress": "{done} / {total} cycli", "pg_sim_progress": "{done} / {total} cycli",
"pg_starting": "Bezig met starten…", "pg_starting": "Bezig met starten…",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Duur trending korter ({pct}%/cyclus) recent gemiddelde {avg}", "trend_duration_shorter": "Duur trending korter ({pct}%/cyclus) recent gemiddelde {avg}",
"trend_energy_down": "Energietrend omlaag ({pct}%/cyclus)", "trend_energy_down": "Energietrend omlaag ({pct}%/cyclus)",
"trend_energy_up": "Energie stijgt ({pct}%/cyclus) recent gemiddelde {avg}", "trend_energy_up": "Energie stijgt ({pct}%/cyclus) recent gemiddelde {avg}",
"trim_destructive_confirm": "Hiermee wordt slechts {pct}% van de cyclus behouden. Dit kan niet ongedaan worden gemaakt. Doorgaan?",
"trim_intro": "Versleep de rode grepen of voer waarden in. Alles buiten het raam wordt verwijderd.", "trim_intro": "Versleep de rode grepen of voer waarden in. Alles buiten het raam wordt verwijderd.",
"tuning_suggestions_available": "{count} afstemmingssuggestie beschikbaar op basis van waargenomen cycli. Ze verschijnen naast de relevante velden.", "tuning_suggestions_available": "{count} afstemmingssuggestie beschikbaar op basis van waargenomen cycli. Ze verschijnen naast de relevante velden.",
"unsure_detected_prefix": "WashData weet niet zeker of het is gedetecteerd", "unsure_detected_prefix": "WashData weet niet zeker of het is gedetecteerd",
@@ -922,9 +1001,15 @@
"merge_hint": "Geïmporteerde items worden toegevoegd; er gaat lokaal niets verloren. Naamconflicten worden hieronder opgelost.", "merge_hint": "Geïmporteerde items worden toegevoegd; er gaat lokaal niets verloren. Naamconflicten worden hieronder opgelost.",
"replace_warn": "Elke aangevinkte categorie wordt gewist en vervangen vanuit het bestand. Niet-aangevinkte categorieën blijven ongewijzigd.", "replace_warn": "Elke aangevinkte categorie wordt gewist en vervangen vanuit het bestand. Niet-aangevinkte categorieën blijven ongewijzigd.",
"dest_reference_hint": "Geïmporteerde cycli verbeteren alleen de programmaherkenning en hebben nooit invloed op de gebruiks-/energiestatistieken.", "dest_reference_hint": "Geïmporteerde cycli verbeteren alleen de programmaherkenning en hebben nooit invloed op de gebruiks-/energiestatistieken.",
"dest_real_history_hint": "Geïmporteerde cycli tellen als de eigen geschiedenis van dit apparaat en voeden de energie-/gebruiksstatistieken. Gebruik dit om één apparaat naar een nieuwe installatie te verplaatsen." "dest_real_history_hint": "Geïmporteerde cycli tellen als de eigen geschiedenis van dit apparaat en voeden de energie-/gebruiksstatistieken. Gebruik dit om één apparaat naar een nieuwe installatie te verplaatsen.",
"sug_muted": "Deze instelling wordt niet meer voorgesteld",
"sug_mute_failed": "Instelling kon niet worden gedempt",
"sug_unmuted_all": "Gedempte suggesties hersteld",
"n_suggestions_muted": "{count} gedempt; de autotuner stelt deze niet meer voor.",
"font_size_hint": "Maak alles in dit paneel groter of kleiner. Geldt voor uw account op dit apparaat."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Vaatwasser: stille seconden na de verwachte duur voordat de wachttijd op het wegpompen aan het einde van de cyclus wordt vrijgegeven",
"completion_min_seconds": "Kortste run die als een echte cyclus telt", "completion_min_seconds": "Kortste run die als een echte cyclus telt",
"end_repeat_count": "Opeenvolgende lage metingen voor het einde", "end_repeat_count": "Opeenvolgende lage metingen voor het einde",
"interrupted_min_seconds": "Korte cycli gemarkeerd als onderbroken", "interrupted_min_seconds": "Korte cycli gemarkeerd als onderbroken",
@@ -998,6 +1083,10 @@
"unusable": "Onbruikbaar" "unusable": "Onbruikbaar"
}, },
"section": { "section": {
"dishwasher": {
"label": "Vaatwasser",
"intro": "Afhandeling van het einde van de cyclus voor vaatwassers, die doorgaans eindigen met een lange, vrijwel stille droogfase vóór een kort laatste wegpompen."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "De anti-kreuk-/anti-vouw-modus detecteert lage-vermogen trommelimpulsen na de hoofdfase en houdt ze bevestigd aan de voltooide cyclus.", "intro": "De anti-kreuk-/anti-vouw-modus detecteert lage-vermogen trommelimpulsen na de hoofdfase en houdt ze bevestigd aan de voltooide cyclus.",
"label": "Anti-kreuk" "label": "Anti-kreuk"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Vrijgave na stille droogfase",
"doc": "Zodra de cyclus zijn verwachte duur voorbij is: hoe lang de vaatwasser stil moet blijven (onder de Stopdrempel) voordat WashData niet langer op een laatste wegpompen wacht en de cyclus beëindigt. Verhoog dit als uw machine een lange stille droogfase heeft vóór een laat laatste wegpompen dat wordt gemist - een breder venster laat de geleerde duur de seizoensdrift volgen (kouder toevoerwater = langere cycli) in plaats van vast te houden aan het oude gemiddelde. Het verkort de wachttijd alleen ten opzichte van de interne limiet van 30 minuten voor de eindpiek, en verlengt die nooit."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Herken de korte tuimelpulsen met laag vermogen die een droger afgeeft na de hoofdverwarmingsfase en houd ze vast aan het voltooide programma in plaats van ze als nieuwe cycli te lezen.", "doc": "Herken de korte tuimelpulsen met laag vermogen die een droger afgeeft na de hoofdverwarmingsfase en houd ze vast aan het voltooide programma in plaats van ze als nieuwe cycli te lezen.",
"label": "Anti-kreuk detectie inschakelen" "label": "Anti-kreuk detectie inschakelen"
@@ -1260,6 +1353,10 @@
"doc": "Minuten nadat een cyclus is geëindigd voordat de nog wachtende herinnering voor het leegmaken van de machine wordt verzonden. Stel 0 in om de herinnering uit te schakelen.", "doc": "Minuten nadat een cyclus is geëindigd voordat de nog wachtende herinnering voor het leegmaken van de machine wordt verzonden. Stel 0 in om de herinnering uit te schakelen.",
"label": "Vertraging uitlaadherinnering" "label": "Vertraging uitlaadherinnering"
}, },
"notify_unload_repeat": {
"doc": "Blijft de uitlaadherinnering elke \"Vertraging uitlaadherinnering\" minuten opnieuw verzenden totdat u de deur opent of in de melding op \"Stop met herinneren\" tikt. Vereist een Deursensorentiteit (de herinnering zelf ook). De sluitknop werkt bij meldingen van de Home Assistant companion-app (mobiel).",
"label": "Herhalen tot de deur opengaat"
},
"off_delay": { "off_delay": {
"doc": "Tijd om te wachten nadat de stroom is uitgevallen voordat de cyclus als voltooid wordt verklaard. Als de stroom binnen dit venster wordt hervat, gaat de cyclus naadloos verder - dit overbrugt pauzes tussen wasfasen. Vaatwassers hebben lange droogfasen (uitschakeling gedurende 20-60 minuten), dus de uitschakelvertraging moet groter zijn dan die om de hele was+droogcyclus als één cyclus te laten verlopen.", "doc": "Tijd om te wachten nadat de stroom is uitgevallen voordat de cyclus als voltooid wordt verklaard. Als de stroom binnen dit venster wordt hervat, gaat de cyclus naadloos verder - dit overbrugt pauzes tussen wasfasen. Vaatwassers hebben lange droogfasen (uitschakeling gedurende 20-60 minuten), dus de uitschakelvertraging moet groter zijn dan die om de hele was+droogcyclus als één cyclus te laten verlopen.",
"label": "Uitschakelvertraging" "label": "Uitschakelvertraging"
@@ -1434,6 +1531,26 @@
"energy_scale": { "energy_scale": {
"label": "Energie-scherpte", "label": "Energie-scherpte",
"doc": "Scherpte van de energieovereenkomststraf. Kleiner = strenger: een energiemismatch kost meer punten. Standaard 0,25 is bewust meer vergevingsgezind dan Duurscherpte, omdat energie varieert met de belasting. Combineer met Energiegewicht." "doc": "Scherpte van de energieovereenkomststraf. Kleiner = strenger: een energiemismatch kost meer punten. Standaard 0,25 is bewust meer vergevingsgezind dan Duurscherpte, omdat energie varieert met de belasting. Combineer met Energiegewicht."
},
"power_profile_interval_min": {
"label": "Vermogensprofiel-interval",
"doc": "Bucketgrootte voor het attribuut power_profile van de profielsensor (het platte array van gemiddelde wattwaarden per slot dat door externe planners zoals EMHASS en tibber_prices wordt gebruikt). Kleinere buckets houden korte vermogenspieken scherp; grotere buckets gladden de vorm. Standaard 15 min. Alleen voor weergave; heeft geen invloed op de detectie."
},
"notify_live_sticky": {
"label": "Live-melding bij aanraken behouden",
"doc": "Alleen Android. Maak de live-voortgangsmelding aanhoudend (sticky), zodat deze bij aanraken niet wordt gesloten. Uitgeschakeld: standaardgedrag waarbij een aanraking de melding sluit."
},
"notify_live_click_action": {
"label": "Aanraakdoel live-melding",
"doc": "Alleen Android. Waarheen een aanraking van de live-voortgangsmelding navigeert (bijv. /lovelace/laundry of een volledige URL) in plaats van de standaard startpagina van de app. Leeg laten voor standaard."
},
"door_opens_at_end": {
"label": "Deur opent automatisch aan het einde",
"doc": "Voor vaatwassers die aan het einde van de cyclus de deur openen om te drogen (AirDry en vergelijkbaar). Als dit is ingeschakeld, pauzeert een deur openen tijdens een actieve cyclus de cyclus niet permanent; als de deur de ingestelde verwijltijd lang open blijft, beschouwt WashData de cyclus als voltooid. Een korte opening (om een artikel toe te voegen) wordt genegeerd. Vereist een deursensorentiteit."
},
"door_end_dwell_seconds": {
"label": "Deuropen-eindverwijltijd",
"doc": "Hoe lang de deur open moet blijven voordat WashData de cyclus beëindigt, wanneer \"Deur opent automatisch aan het einde\" is ingeschakeld. Lang genoeg om het snel toevoegen van een bord te negeren (standaard 60 s), kort genoeg om de cyclus snel te beëindigen zodra de machine de deur opent."
} }
}, },
"setting_group": { "setting_group": {
@@ -1620,6 +1737,7 @@
"min_active": "Op basis van het minimale actieve vermogen ({min}W) dat in de laatste cyclus is waargenomen.", "min_active": "Op basis van het minimale actieve vermogen ({min}W) dat in de laatste cyclus is waargenomen.",
"min_duration_ratio": "Zo laag mogelijk gehouden zodat een programma vroeg in de cyclus wordt herkend; de betrouwbaarheids- en ambiguïteitsdrempels voorkomen voortijdige beslissingen.", "min_duration_ratio": "Zo laag mogelijk gehouden zodat een programma vroeg in de cyclus wordt herkend; de betrouwbaarheids- en ambiguïteitsdrempels voorkomen voortijdige beslissingen.",
"min_off_gap": "Op basis van {gaps} waargenomen tussenpozen tussen cycli (p05={p05}s). Ondergrens van het apparaat: {floor}s.", "min_off_gap": "Op basis van {gaps} waargenomen tussenpozen tussen cycli (p05={p05}s). Ondergrens van het apparaat: {floor}s.",
"min_off_gap_bridge": "Zo gedimensioneerd dat de langste stille periode binnen een cyclus wordt overbrugd: {span}s + 60s buffer, uit {spans} overbrugde tussenpozen over {cycles} schone cycli (blijft onder uw kortste tussenpoos van {ceiling}s tussen twee opeenvolgende ladingen).",
"min_power": "40% van het laagste actieve vermogen op p05 ({p05}W) over {cycles} schone cycli, zodat de uitschakeldrempel onder het werkelijke verbruik blijft.{excl}", "min_power": "40% van het laagste actieve vermogen op p05 ({p05}W) over {cycles} schone cycli, zodat de uitschakeldrempel onder het werkelijke verbruik blijft.{excl}",
"ml_auto_label": "Laagste betrouwbaarheid die het kwaliteitsmodel nog als schoon beoordeelde (p10 van {cycles} schone cycli = {p10}).", "ml_auto_label": "Laagste betrouwbaarheid die het kwaliteitsmodel nog als schoon beoordeelde (p10 van {cycles} schone cycli = {p10}).",
"ml_end_repeat": "{false}/{total} cycli ({pct}%) hadden een pauze die de einddetector >50% scoorde; vereis {val} eindbevestiging(en).", "ml_end_repeat": "{false}/{total} cycli ({pct}%) hadden een pauze die de einddetector >50% scoorde; vereis {val} eindbevestiging(en).",
@@ -1636,7 +1754,7 @@
"thr_batch": "Net boven het laagste actieve vermogen op p05 over {cycles} cycli ({p05}W) gehouden zodat een start zo vroeg mogelijk wordt opgemerkt en de stopdrempel onder het laagste draaivermogen van de machine blijft.", "thr_batch": "Net boven het laagste actieve vermogen op p05 over {cycles} cycli ({p05}W) gehouden zodat een start zo vroeg mogelijk wordt opgemerkt en de stopdrempel onder het laagste draaivermogen van de machine blijft.",
"tol_per_profile": "p75 van de duurvariantie per profiel over {profiles} profielen ({cycles} cycli); strakke profielen worden niet benadeeld.", "tol_per_profile": "p75 van de duurvariantie per profiel over {profiles} profielen ({cycles} cycli); strakke profielen worden niet benadeeld.",
"tol_pooled": "Op basis van de gebundelde duurvariantie van {cycles} recent gelabelde cycli (p95-afwijking={dev}).", "tol_pooled": "Op basis van de gebundelde duurvariantie van {cycles} recent gelabelde cycli (p95-afwijking={dev}).",
"watchdog": "Zo laag als veilig gehouden (3x de p95-updatekloof van {p95}s, min. 30s) zodat vastlopers snel worden opgemerkt zonder valse stops." "watchdog": "Zo laag als veilig gehouden (net boven de p95-updatekloof van {p95}s, min. 30s) zodat vastlopers snel worden opgemerkt zonder valse stops."
}, },
"exclusions": { "exclusions": {
"summary": "{total} verkeerd gedetecteerde cyclus(sen) uitgesloten: {parts}.", "summary": "{total} verkeerd gedetecteerde cyclus(sen) uitgesloten: {parts}.",
@@ -1716,6 +1834,10 @@
"name_required": "Naam vereist", "name_required": "Naam vereist",
"no_split_found": "Er zijn geen lege gaten gevonden om op te splitsen", "no_split_found": "Er zijn geen lege gaten gevonden om op te splitsen",
"panel_settings_saved": "Paneelinstellingen opgeslagen", "panel_settings_saved": "Paneelinstellingen opgeslagen",
"pg_preset_loaded": "Voorinstelling \"{name}\" geladen",
"pg_preset_saved": "Voorinstelling \"{name}\" opgeslagen",
"pg_sugg_loaded": "{n} gesuggereerde waarde(n) geladen - voer de speeltuin uit om te vergelijken",
"pg_sugg_ml_loaded": "{n} ML-gekalibreerde waarde(n) geladen - voer de speeltuin uit om te vergelijken",
"phase_name_required": "Fasenaam is vereist", "phase_name_required": "Fasenaam is vereist",
"phase_updated": "Fase bijgewerkt", "phase_updated": "Fase bijgewerkt",
"phases_saved": "Fasen opgeslagen", "phases_saved": "Fasen opgeslagen",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Nie znaleziono encji",
"running_long": "Działa długo",
"remaining": "pozostało",
"progress": "postęp",
"show_time_remaining": "Pokaż pozostały czas",
"show_percentage": "Pokaż procenty",
"layout": {
"tile": "Kafelek (kompaktowy)",
"detail": "Szczegóły (rozbudowany)",
"glance": "Podgląd (wiele urządzeń)"
},
"btn": {
"pause": "Wstrzymaj",
"resume": "Wznów",
"terminate": "Zakończ cykl",
"record_start": "Rozpocznij nagrywanie",
"record_stop": "Zatrzymaj nagrywanie",
"program": "Program",
"open_panel": "Otwórz WashData"
},
"editor": {
"layout": "Układ",
"entity": "Encja urządzenia",
"entities": "Urządzenia",
"title": "Tytuł",
"icon": "Ikona",
"show_state": "Pokaż stan",
"show_program": "Pokaż program",
"show_progress_bar": "Pokaż pasek postępu",
"spin_icon": "Obracaj ikonę podczas działania",
"display_mode": "Wiersz szczegółów",
"active_color": "Zastąpienie koloru aktywnego",
"show_phase": "Pokaż fazę",
"show_energy": "Pokaż energię i koszt",
"show_anomaly": "Pokaż ostrzeżenie o przekroczeniu",
"show_sparkline": "Pokaż wykres mocy na żywo",
"buttons": "Przyciski akcji",
"program_entity": "Encja programu (zastąpienie)",
"time_entity": "Encja czasu (zastąpienie)",
"pct_entity": "Encja postępu (zastąpienie)",
"power_entity": "Encja mocy (zastąpienie)",
"tap_action": "Akcja dotknięcia",
"hold_action": "Akcja przytrzymania",
"double_tap_action": "Akcja podwójnego dotknięcia"
}
},
"badge": { "badge": {
"artifact_tip": "Wykryto {n} anomalii (np. drzwi otwarte w połowie cyklu) otwórz, aby zobaczyć je na wykresie", "artifact_tip": "Wykryto {n} anomalii (np. drzwi otwarte w połowie cyklu) otwórz, aby zobaczyć je na wykresie",
"auto": "(automatycznie wykryty)", "auto": "(automatycznie wykryty)",
@@ -64,6 +112,21 @@
"discard": "Odrzuć", "discard": "Odrzuć",
"discard_tip": "Odrzuć nagranie bez zapisywania", "discard_tip": "Odrzuć nagranie bez zapisywania",
"dismiss": "Odrzuć", "dismiss": "Odrzuć",
"mute_suggestion": "Przestań sugerować to ustawienie",
"pg_load_calibrated": "Wczytaj skalibrowane (ML) ({n})",
"pg_load_calibrated_tip": "Załaduj ustawienia skalibrowane przez ML jako nadpisania w piaskownicy",
"pg_load_live": "Wczytaj aktywne ustawienia",
"pg_load_live_tip": "Wczytaj ponownie bieżące ustawienia integracji i odrzuć wszystkie zmiany z piaskownicy",
"pg_load_suggested": "Wczytaj sugerowane ({n})",
"pg_load_suggested_tip": "Załaduj bieżące sugestie automatycznego dostrajania jako nadpisania w piaskownicy",
"pg_preset_delete": "Usuń preset",
"pg_preset_load": "Wczytaj preset",
"pg_preset_load_tip": "Zastąp wartości w piaskownicy tym presetem (aktywne ustawienia pozostają nietknięte)",
"pg_preset_save": "Zapisz jako preset",
"pg_preset_save_tip": "Zapisz wszystkie poniższe wartości jako nazwany preset dla tego urządzenia",
"pg_publish_all": "Zapisz w integracji ({n})",
"pg_publish_one": "Zapisz {label} w integracji",
"reset_muted": "Zresetuj wyciszone",
"done": "Zrobione", "done": "Zrobione",
"edit": "Edytuj", "edit": "Edytuj",
"export": "Eksportuj", "export": "Eksportuj",
@@ -275,6 +338,7 @@
"no_automations": "Żadna automatyzacja nie odwołuje się jeszcze do tego urządzenia.", "no_automations": "Żadna automatyzacja nie odwołuje się jeszcze do tego urządzenia.",
"panel_settings": "Ustawienia panelu", "panel_settings": "Ustawienia panelu",
"param_sweep": "Przemiatanie parametru", "param_sweep": "Przemiatanie parametru",
"pg_settings_source": "Źródło ustawień",
"phase_catalog": "Katalog faz", "phase_catalog": "Katalog faz",
"playground": "Piaskownica", "playground": "Piaskownica",
"process_history": "Historia procesu", "process_history": "Historia procesu",
@@ -348,6 +412,7 @@
"default_access_level": "Domyślny poziom dla użytkowników niewymienionych poniżej", "default_access_level": "Domyślny poziom dla użytkowników niewymienionych poniżej",
"default_other": "Domyślne (inne urządzenia)", "default_other": "Domyślne (inne urządzenia)",
"default_tab": "Domyślna zakładka podczas otwierania panelu", "default_tab": "Domyślna zakładka podczas otwierania panelu",
"font_size": "Rozmiar czcionki panelu",
"delta": "Δ", "delta": "Δ",
"description": "Opis", "description": "Opis",
"dtw_blend_w": "Waga mieszania", "dtw_blend_w": "Waga mieszania",
@@ -415,6 +480,9 @@
"pg_match_score": "Wynik dopasowania", "pg_match_score": "Wynik dopasowania",
"pg_pct_of": "{p}% z {total}", "pg_pct_of": "{p}% z {total}",
"pg_poor_match": "Kiepskie dopasowanie", "pg_poor_match": "Kiepskie dopasowanie",
"pg_preset": "Preset piaskownicy",
"pg_preset_name": "Nazwa nowego presetu",
"pg_preset_none": "Wybierz preset…",
"pg_strong_match": "Silne dopasowanie", "pg_strong_match": "Silne dopasowanie",
"pg_tile_ambiguous": "Niejednoznaczny", "pg_tile_ambiguous": "Niejednoznaczny",
"pg_tile_ambiguous_tip": "Cykle z niemal równym dopasowaniem do dwóch programów", "pg_tile_ambiguous_tip": "Cykle z niemal równym dopasowaniem do dwóch programów",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Zastosować najlepszą wartość: {label} = {value}?", "pg_apply_confirm": "Zastosować najlepszą wartość: {label} = {value}?",
"pg_canvas_empty": "Wybierz cykl powyżej, a następnie naciśnij Wczytaj, aby zobaczyć jego przebieg mocy.", "pg_canvas_empty": "Wybierz cykl powyżej, a następnie naciśnij Wczytaj, aby zobaczyć jego przebieg mocy.",
"pg_chart_caption": "Współczynnik wykrywania/dopasowania dla wartości {param}", "pg_chart_caption": "Współczynnik wykrywania/dopasowania dla wartości {param}",
"pg_ctrl_intro": "Wartości pochodzą z aktywnych ustawień integracji dla tego urządzenia. Zmiany pozostają w piaskownicy, dopóki nie zapiszesz ich w integracji.",
"pg_live_unavailable": "Aktywne ustawienia niedostępne, wyświetlane są wartości domyślne.",
"pg_load_live_confirm": "Odrzucić zmiany w piaskownicy ({n}) i wczytać ponownie bieżące ustawienia integracji?",
"pg_match_rate": "{pct}% skuteczności dopasowania na {total} cyklach", "pg_match_rate": "{pct}% skuteczności dopasowania na {total} cyklach",
"pg_matches_live": "Zgodne z aktywnymi ustawieniami",
"pg_n_changed": "Zmienione względem aktywnych ustawień: {n}",
"pg_sugg_none": "Wszystkie sugestie już odpowiadają bieżącym ustawieniom",
"pg_preset_delete_confirm": "Usunąć preset \"{name}\"?",
"pg_preset_limit": "Osiągnięto limit presetów ({n})",
"pg_preset_overwrite": "Nadpisać preset \"{name}\"?",
"pg_publish_one_confirm": "Zapisać {label} = {value} w ustawieniach tego urządzenia?",
"pg_restart_note": "Uruchom ponownie Home Assistant, aby włączyć narzędzia symulacji.", "pg_restart_note": "Uruchom ponownie Home Assistant, aby włączyć narzędzia symulacji.",
"pg_sim_progress": "{done} / {total} cykli", "pg_sim_progress": "{done} / {total} cykli",
"pg_starting": "Rozpoczynanie…", "pg_starting": "Rozpoczynanie…",
@@ -789,6 +867,7 @@
"preferences_admin": "Preferencje, panel i kontrola dostępu", "preferences_admin": "Preferencje, panel i kontrola dostępu",
"preferences_adv": "Preferencje", "preferences_adv": "Preferencje",
"prefs_personal": "Dotyczą one wyłącznie Twojego konta Home Assistant.", "prefs_personal": "Dotyczą one wyłącznie Twojego konta Home Assistant.",
"font_size_hint": "Powiększ lub pomniejsz wszystko w tym panelu. Dotyczy Twojego konta na tym urządzeniu.",
"process_history_hint": "Ponownie uruchom dopasowywanie na wszystkich zapisanych cyklach, odśwież sugestie dostrajania, ponownie wytrenuj modele ML (jeśli włączone) i przelicz kondycję cykli. Uruchom po serii przeglądów.", "process_history_hint": "Ponownie uruchom dopasowywanie na wszystkich zapisanych cyklach, odśwież sugestie dostrajania, ponownie wytrenuj modele ML (jeśli włączone) i przelicz kondycję cykli. Uruchom po serii przeglądów.",
"profile_deleted": "Profil usunięty", "profile_deleted": "Profil usunięty",
"profile_poor_health_detail": "Cykle przypisane do tego profilu mają niespójne kształty lub niską pewność. Rozważ przebudowę koperty lub przejrzenie oznakowanych cykli.", "profile_poor_health_detail": "Cykle przypisane do tego profilu mają niespójne kształty lub niską pewność. Rozważ przebudowę koperty lub przejrzenie oznakowanych cykli.",
@@ -821,6 +900,10 @@
"split_intro": "Kliknij wykres, aby dodać lub usunąć punkt podziału albo automatycznie wykryć na podstawie pustych przerw. Każdy powstały segment może otrzymać swój własny profil.", "split_intro": "Kliknij wykres, aby dodać lub usunąć punkt podziału albo automatycznie wykryć na podstawie pustych przerw. Każdy powstały segment może otrzymać swój własny profil.",
"storage_diagnostics": "Statystyki przechowywania, konserwacja, eksport/import", "storage_diagnostics": "Statystyki przechowywania, konserwacja, eksport/import",
"sug_staged": "Ustawiono {key} = {val}. Zapisz, aby zastosować.", "sug_staged": "Ustawiono {key} = {val}. Zapisz, aby zastosować.",
"sug_muted": "To ustawienie nie będzie więcej sugerowane",
"sug_mute_failed": "Nie udało się wyciszyć sugestii",
"sug_unmuted_all": "Wyciszone sugestie przywrócone",
"n_suggestions_muted": "{count} wyciszonych; automatyczny tuner nie będzie proponować tych ustawień.",
"toast_auto_detect_enabled": "Automatyczne wykrywanie włączone", "toast_auto_detect_enabled": "Automatyczne wykrywanie włączone",
"toast_auto_label_complete": "Automatyczne oznaczanie zakończone", "toast_auto_label_complete": "Automatyczne oznaczanie zakończone",
"toast_auto_label_failed": "Automatyczne oznaczanie nie powiodło się: {error}", "toast_auto_label_failed": "Automatyczne oznaczanie nie powiodło się: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Trwanie w trendzie krótszym ({pct}%/cykl) ostatnia średnia {avg}", "trend_duration_shorter": "Trwanie w trendzie krótszym ({pct}%/cykl) ostatnia średnia {avg}",
"trend_energy_down": "Energia wykazuje tendencję spadkową ({pct}%/cykl)", "trend_energy_down": "Energia wykazuje tendencję spadkową ({pct}%/cykl)",
"trend_energy_up": "Trend wzrostowy w zakresie energii ({pct}%/cykl) ostatnia średnia {avg}", "trend_energy_up": "Trend wzrostowy w zakresie energii ({pct}%/cykl) ostatnia średnia {avg}",
"trim_destructive_confirm": "To zachowa tylko {pct}% cyklu i tej operacji nie można cofnąć. Kontynuować?",
"trim_intro": "Przeciągnij czerwone uchwyty lub wprowadź wartości. Wszystko za oknem jest usuwane.", "trim_intro": "Przeciągnij czerwone uchwyty lub wprowadź wartości. Wszystko za oknem jest usuwane.",
"tuning_suggestions_available": "Sugestia dostrojenia {count} dostępna z obserwowanych cykli. Pojawiają się obok odpowiednich pól.", "tuning_suggestions_available": "Sugestia dostrojenia {count} dostępna z obserwowanych cykli. Pojawiają się obok odpowiednich pól.",
"unsure_detected_prefix": "WashData nie jest pewien, czy został wykryty", "unsure_detected_prefix": "WashData nie jest pewien, czy został wykryty",
@@ -970,6 +1054,10 @@
"unusable": "Nie nadaje się do użytku" "unusable": "Nie nadaje się do użytku"
}, },
"section": { "section": {
"dishwasher": {
"label": "Zmywarka",
"intro": "Obsługa końca cyklu w zmywarkach, które zazwyczaj kończą długą, niemal cichą fazą suszenia przed krótkim końcowym odpompowaniem wody."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Tryb antygniotowy wykrywa impulsy bębnowania przy niskiej mocy po fazie głównej i utrzymuje je przyłączone do zakończonego cyklu.", "intro": "Tryb antygniotowy wykrywa impulsy bębnowania przy niskiej mocy po fazie głównej i utrzymuje je przyłączone do zakończonego cyklu.",
"label": "Antygniotowy" "label": "Antygniotowy"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Zwolnienie po cichej fazie suszenia",
"doc": "Gdy cykl przekroczy oczekiwany czas trwania, jak długo zmywarka musi pozostać cicha (poniżej Progu Zatrzymania), zanim WashData przestanie czekać na końcowe odpompowanie wody i zakończy cykl. Zwiększ tę wartość, jeśli Twoje urządzenie ma długą cichą fazę suszenia przed późnym końcowym odpompowaniem, które jest pomijane - szersze okno pozwala, aby wyuczony czas trwania podążał za sezonowym dryfem (chłodniejsza woda na wlocie = dłuższe cykle), zamiast trzymać się starej średniej. Może jedynie skrócić oczekiwanie względem wewnętrznego 30-minutowego limitu końcowego odpompowania, nigdy go nie wydłuża."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Rozpoznawaj krótkie impulsy suszenia o małej mocy, które suszarka emituje po głównej fazie nagrzewania, i pamiętaj o ich dołączeniu do zakończonego cyklu, zamiast odczytywać je jako nowe cykle.", "doc": "Rozpoznawaj krótkie impulsy suszenia o małej mocy, które suszarka emituje po głównej fazie nagrzewania, i pamiętaj o ich dołączeniu do zakończonego cyklu, zamiast odczytywać je jako nowe cykle.",
"label": "Włącz Wykrywanie Antygniotowe" "label": "Włącz Wykrywanie Antygniotowe"
@@ -1232,6 +1324,10 @@
"doc": "Minuty po zakończeniu cyklu przed wysłaniem wciąż oczekującego przypomnienia o „rozładowaniu maszyny”. Ustaw 0, aby wyłączyć przypomnienie.", "doc": "Minuty po zakończeniu cyklu przed wysłaniem wciąż oczekującego przypomnienia o „rozładowaniu maszyny”. Ustaw 0, aby wyłączyć przypomnienie.",
"label": "Opóźnienie Przypomnienia o Rozładunku" "label": "Opóźnienie Przypomnienia o Rozładunku"
}, },
"notify_unload_repeat": {
"doc": "Ponownie wysyła przypomnienie o rozładunku co \"Opóźnienie Przypomnienia o Rozładunku\" minut, dopóki nie otworzysz drzwi lub nie dotkniesz \"Przestań przypominać\" w powiadomieniu. Wymaga Encji Czujnika Drzwi (tak jak samo przypomnienie). Przycisk odrzucenia działa w powiadomieniach aplikacji mobilnej Home Assistant (companion app).",
"label": "Powtarzaj, aż otworzą się drzwi"
},
"off_delay": { "off_delay": {
"doc": "Czas oczekiwania po spadku mocy przed ogłoszeniem zakończenia cyklu. Jeżeli w tym oknie zasilanie zostanie przywrócone, cykl będzie przebiegał płynnie eliminując przerwy pomiędzy etapami prania. Zmywarki mają długie fazy suszenia (wyłączenie zasilania na 2060 minut), więc opóźnienie wyłączenia musi być dłuższe, aby całe pranie+suszenie trwało w jednym cyklu.", "doc": "Czas oczekiwania po spadku mocy przed ogłoszeniem zakończenia cyklu. Jeżeli w tym oknie zasilanie zostanie przywrócone, cykl będzie przebiegał płynnie eliminując przerwy pomiędzy etapami prania. Zmywarki mają długie fazy suszenia (wyłączenie zasilania na 2060 minut), więc opóźnienie wyłączenia musi być dłuższe, aby całe pranie+suszenie trwało w jednym cyklu.",
"label": "Opóźnienie Wyłączenia" "label": "Opóźnienie Wyłączenia"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Ostrość energii", "label": "Ostrość energii",
"doc": "Ostrość kary za niezgodność energii w Etapie 4. Mniejszy = surowszy: niezgodność energii bardziej obniża wynik. Domyślna wartość 0,25 jest celowo bardziej łagodna niż Ostrość Czasu Trwania, ponieważ energia zmienia się z obciążeniem. Używaj razem z Wagą Energii." "doc": "Ostrość kary za niezgodność energii w Etapie 4. Mniejszy = surowszy: niezgodność energii bardziej obniża wynik. Domyślna wartość 0,25 jest celowo bardziej łagodna niż Ostrość Czasu Trwania, ponieważ energia zmienia się z obciążeniem. Używaj razem z Wagą Energii."
},
"power_profile_interval_min": {
"label": "Interwał profilu mocy",
"doc": "Rozmiar segmentu dla atrybutu senzora power_profile na profil (płaska tablica średnich watów na slot zużywana przez zewnętrzne planerzy jak EMHASS i tibber_prices). Mniejsze segmenty zachowują krótkie skoki mocy ostre; większe segmenty wygładzają kształt. Domyślnie 15 min. Tylko do odczytu; nie wpływa na wykrywanie."
},
"notify_live_sticky": {
"label": "Zachowaj powiadomienie na żywo po dotknięciu",
"doc": "Tylko Android. Ustaw powiadomienie o postępie na żywo jako trwałe (przypięte), aby dotknięcie nie odrzucało aktywnego wątku. Wyłączone zachowuje domyślne zachowanie, gdzie dotknięcie odrzuca powiadomienie."
},
"notify_live_click_action": {
"label": "Cel dotknięcia powiadomienia na żywo",
"doc": "Tylko Android. Gdzie dotknięcie powiadomienia o postępie na żywo otwiera (np. /lovelace/laundry lub pełny URL) zamiast strony startowej aplikacji. Pozostaw puste dla wartości domyślnej."
},
"door_opens_at_end": {
"label": "Drzwi otwierają się automatycznie na końcu",
"doc": "Dla zmywarek, które na końcu cyklu otwierają drzwi w celu suszenia (AirDry i podobne). Po włączeniu otwarcie drzwi podczas działającego cyklu nie zatrzymuje go na zawsze; jeśli drzwi pozostaną otwarte przez czas oczekiwania poniżej, WashData uznaje cykl za zakończony. Krótkie otwarcie (dodawanie naczynia) jest ignorowane. Wymaga encji czujnika drzwi."
},
"door_end_dwell_seconds": {
"label": "Czas otwarcia drzwi do zakończenia cyklu",
"doc": "Jak długo drzwi muszą pozostać otwarte, zanim WashData zakończy cykl, gdy włączone jest \"Drzwi otwierają się automatycznie na końcu\". Wystarczająco długo, aby zignorować szybkie dodawanie naczyń (domyślnie 60 s), wystarczająco krótko, aby szybko zakończyć, gdy maszyna otworzy drzwi."
} }
}, },
"setting_group": { "setting_group": {
@@ -1592,6 +1708,7 @@
"min_active": "Na podstawie minimalnej mocy czynnej ({min}W) zaobserwowanej w ostatnim cyklu.", "min_active": "Na podstawie minimalnej mocy czynnej ({min}W) zaobserwowanej w ostatnim cyklu.",
"min_duration_ratio": "Utrzymane jak najniżej, aby program był rozpoznawany na wczesnym etapie cyklu; progi pewności i niejednoznaczności zapobiegają przedwczesnym decyzjom.", "min_duration_ratio": "Utrzymane jak najniżej, aby program był rozpoznawany na wczesnym etapie cyklu; progi pewności i niejednoznaczności zapobiegają przedwczesnym decyzjom.",
"min_off_gap": "Na podstawie {gaps} zaobserwowanych przerw między cyklami (p05={p05}s). Minimum urządzenia: {floor}s.", "min_off_gap": "Na podstawie {gaps} zaobserwowanych przerw między cyklami (p05={p05}s). Minimum urządzenia: {floor}s.",
"min_off_gap_bridge": "Dobrane tak, aby pokryć najdłuższy cichy odcinek wewnątrz cyklu: {span}s + zapas 60s, z {spans} pokrytych przerw w {cycles} poprawnych cyklach (pozostaje poniżej {ceiling}s, czyli najkrótszej przerwy, jaką zostawiasz między kolejnymi uruchomieniami).",
"min_power": "40% najniższej mocy czynnej p05 ({p05}W) w {cycles} poprawnych cyklach, tak aby próg wyłączenia pozostał poniżej rzeczywistego poboru.{excl}", "min_power": "40% najniższej mocy czynnej p05 ({p05}W) w {cycles} poprawnych cyklach, tak aby próg wyłączenia pozostał poniżej rzeczywistego poboru.{excl}",
"ml_auto_label": "Najniższa pewność, przy której model jakości nadal uznawał cykl za poprawny (p10 z {cycles} poprawnych cykli = {p10}).", "ml_auto_label": "Najniższa pewność, przy której model jakości nadal uznawał cykl za poprawny (p10 z {cycles} poprawnych cykli = {p10}).",
"ml_end_repeat": "{false}/{total} cykli ({pct}%) miało pauzę, którą detektor końca ocenił powyżej 50%; wymagaj {val} potwierdzeń zakończenia.", "ml_end_repeat": "{false}/{total} cykli ({pct}%) miało pauzę, którą detektor końca ocenił powyżej 50%; wymagaj {val} potwierdzeń zakończenia.",
@@ -1608,7 +1725,7 @@
"thr_batch": "Utrzymane tuż powyżej najniższej mocy czynnej p05 w {cycles} cyklach ({p05}W), aby start był wykrywany jak najwcześniej, a próg zatrzymania pozostawał poniżej najniższej mocy pracy urządzenia.", "thr_batch": "Utrzymane tuż powyżej najniższej mocy czynnej p05 w {cycles} cyklach ({p05}W), aby start był wykrywany jak najwcześniej, a próg zatrzymania pozostawał poniżej najniższej mocy pracy urządzenia.",
"tol_per_profile": "p75 wariancji czasu trwania na profil w {profiles} profilach ({cycles} cykli); spójne profile nie są karane.", "tol_per_profile": "p75 wariancji czasu trwania na profil w {profiles} profilach ({cycles} cykli); spójne profile nie są karane.",
"tol_pooled": "Na podstawie łącznej wariancji czasu trwania {cycles} ostatnich oznaczonych cykli (odchylenie p95={dev}).", "tol_pooled": "Na podstawie łącznej wariancji czasu trwania {cycles} ostatnich oznaczonych cykli (odchylenie p95={dev}).",
"watchdog": "Utrzymane tak nisko, jak to bezpieczne (3x przerwa aktualizacji p95 wynosząca {p95}s, min. 30s), aby zawieszenia były szybko wykrywane bez fałszywych zatrzymań." "watchdog": "Utrzymane tak nisko, jak to bezpieczne (tuż powyżej przerwy aktualizacji p95 wynoszącej {p95}s, min. 30s), aby zawieszenia były szybko wykrywane bez fałszywych zatrzymań."
}, },
"exclusions": { "exclusions": {
"summary": "Wykluczono {total} błędnie wykrytych cykli: {parts}.", "summary": "Wykluczono {total} błędnie wykrytych cykli: {parts}.",
@@ -1688,6 +1805,10 @@
"name_required": "Wymagane imię i nazwisko", "name_required": "Wymagane imię i nazwisko",
"no_split_found": "Nie znaleziono żadnych wolnych luk, które można by podzielić", "no_split_found": "Nie znaleziono żadnych wolnych luk, które można by podzielić",
"panel_settings_saved": "Ustawienia panelu zostały zapisane", "panel_settings_saved": "Ustawienia panelu zostały zapisane",
"pg_preset_loaded": "Preset \"{name}\" wczytany",
"pg_preset_saved": "Preset \"{name}\" zapisany",
"pg_sugg_loaded": "Załadowano {n} sugerowanych wartości - uruchom piaskownicę, aby porównać",
"pg_sugg_ml_loaded": "Załadowano {n} wartości skalibrowanych przez ML - uruchom piaskownicę, aby porównać",
"phase_name_required": "Nazwa fazy jest wymagana", "phase_name_required": "Nazwa fazy jest wymagana",
"phase_updated": "Faza zaktualizowana", "phase_updated": "Faza zaktualizowana",
"phases_saved": "Fazy zapisane", "phases_saved": "Fazy zapisane",
@@ -1770,6 +1891,7 @@
"other": "Inne" "other": "Inne"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Zmywarka: sekundy ciszy po oczekiwanym czasie trwania, zanim zwolnione zostanie oczekiwanie na końcowe odpompowanie wody",
"anti_wrinkle_enabled": "Pochłaniaj impulsy bębna po głównej fazie, zamiast odczytywać je jako nowe cykle", "anti_wrinkle_enabled": "Pochłaniaj impulsy bębna po głównej fazie, zamiast odczytywać je jako nowe cykle",
"anti_wrinkle_exit_power": "Moc musi spaść poniżej tej wartości pomiędzy impulsami, aby tryb antygniotowy pozostał aktywny", "anti_wrinkle_exit_power": "Moc musi spaść poniżej tej wartości pomiędzy impulsami, aby tryb antygniotowy pozostał aktywny",
"anti_wrinkle_idle_timeout": "Dozwolony czas ciszy między dwoma impulsami bębna, zanim tryb antygniotowy się zakończy", "anti_wrinkle_idle_timeout": "Dozwolony czas ciszy między dwoma impulsami bębna, zanim tryb antygniotowy się zakończy",
@@ -92,6 +92,19 @@
"pause_cycle_tip": "Pausar o ciclo em andamento o eletrodoméstico retomará onde parou", "pause_cycle_tip": "Pausar o ciclo em andamento o eletrodoméstico retomará onde parou",
"pg_apply_device": "Aplicar ao dispositivo", "pg_apply_device": "Aplicar ao dispositivo",
"pg_autofill": "Preencher automaticamente", "pg_autofill": "Preencher automaticamente",
"pg_load_calibrated": "Carregar Calibrado (ML) ({n})",
"pg_load_calibrated_tip": "Carregar as configurações calibradas por ML como substituições na Área de testes",
"pg_load_live": "Carregar as configurações ativas",
"pg_load_live_tip": "Reler as configurações atuais da integração e descartar todas as edições feitas na Área de testes",
"pg_load_suggested": "Carregar sugestões ({n})",
"pg_load_suggested_tip": "Carregar as sugestões atuais do ajustador automático como substituições na Área de testes",
"pg_preset_delete": "Excluir predefinição",
"pg_preset_load": "Carregar predefinição",
"pg_preset_load_tip": "Substituir os valores da Área de testes por esta predefinição (as configurações ativas não são alteradas)",
"pg_preset_save": "Salvar como predefinição",
"pg_preset_save_tip": "Salvar todos os valores abaixo como uma predefinição nomeada para este dispositivo",
"pg_publish_all": "Salvar {n} configuração(ões) na integração",
"pg_publish_one": "Salvar {label} na integração",
"play": "Reproduzir", "play": "Reproduzir",
"process": "Processar", "process": "Processar",
"process_history": "Processar agora", "process_history": "Processar agora",
@@ -178,7 +191,9 @@
"download_export": "Baixar exportação", "download_export": "Baixar exportação",
"analyze_import": "Analisar arquivo", "analyze_import": "Analisar arquivo",
"import_selected": "Importar seleção", "import_selected": "Importar seleção",
"back": "Voltar" "back": "Voltar",
"mute_suggestion": "Parar de sugerir esta configuração",
"reset_muted": "Redefinir silenciados"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +290,7 @@
"no_automations": "Ainda não há automações que referenciem este dispositivo.", "no_automations": "Ainda não há automações que referenciem este dispositivo.",
"panel_settings": "Configurações do painel", "panel_settings": "Configurações do painel",
"param_sweep": "Varredura de parâmetros", "param_sweep": "Varredura de parâmetros",
"pg_settings_source": "Origem das configurações",
"phase_catalog": "Catálogo de fases", "phase_catalog": "Catálogo de fases",
"playground": "Área de testes", "playground": "Área de testes",
"process_history": "Histórico de processamento", "process_history": "Histórico de processamento",
@@ -415,6 +431,9 @@
"pg_match_score": "Pontuação de correspondência", "pg_match_score": "Pontuação de correspondência",
"pg_pct_of": "{p}% de {total}", "pg_pct_of": "{p}% de {total}",
"pg_poor_match": "Correspondência ruim", "pg_poor_match": "Correspondência ruim",
"pg_preset": "Predefinição da Área de testes",
"pg_preset_name": "Nome da nova predefinição",
"pg_preset_none": "Selecione uma predefinição…",
"pg_strong_match": "Correspondência forte", "pg_strong_match": "Correspondência forte",
"pg_tile_ambiguous": "Ambíguo", "pg_tile_ambiguous": "Ambíguo",
"pg_tile_ambiguous_tip": "Ciclos com empate quase perfeito entre dois programas", "pg_tile_ambiguous_tip": "Ciclos com empate quase perfeito entre dois programas",
@@ -609,7 +628,8 @@
"conflict_resolution": "Conflitos de nomes", "conflict_resolution": "Conflitos de nomes",
"conflict_import_copy": "Importar como cópia", "conflict_import_copy": "Importar como cópia",
"conflict_keep_mine": "Manter o meu", "conflict_keep_mine": "Manter o meu",
"conflict_overwrite": "Sobrescrever" "conflict_overwrite": "Sobrescrever",
"font_size": "Tamanho da fonte do painel"
}, },
"log": { "log": {
"all_levels": "Todos os níveis", "all_levels": "Todos os níveis",
@@ -771,7 +791,17 @@
"pg_apply_confirm": "Aplicar o melhor valor: {label} = {value}?", "pg_apply_confirm": "Aplicar o melhor valor: {label} = {value}?",
"pg_canvas_empty": "Selecione um ciclo acima e pressione Carregar para ver o rastro de potência.", "pg_canvas_empty": "Selecione um ciclo acima e pressione Carregar para ver o rastro de potência.",
"pg_chart_caption": "Taxa de detecção/correspondência ao longo dos valores de {param}", "pg_chart_caption": "Taxa de detecção/correspondência ao longo dos valores de {param}",
"pg_ctrl_intro": "Os valores partem das configurações ativas deste dispositivo na integração. As edições ficam na Área de testes até você salvá-las na integração.",
"pg_live_unavailable": "Configurações ativas indisponíveis, exibindo os valores padrão.",
"pg_load_live_confirm": "Descartar {n} edição(ões) da Área de testes e recarregar as configurações atuais da integração?",
"pg_match_rate": "{pct}% de taxa de correspondência em {total} ciclos", "pg_match_rate": "{pct}% de taxa de correspondência em {total} ciclos",
"pg_matches_live": "Corresponde às configurações ativas",
"pg_n_changed": "{n} valor(es) diferente(s) das configurações ativas",
"pg_sugg_none": "Todas as sugestões já correspondem às configurações atuais",
"pg_preset_delete_confirm": "Excluir a predefinição \"{name}\"?",
"pg_preset_limit": "Limite de predefinições atingido ({n})",
"pg_preset_overwrite": "Sobrescrever a predefinição \"{name}\"?",
"pg_publish_one_confirm": "Salvar {label} = {value} nas configurações deste dispositivo?",
"pg_restart_note": "Reinicie o Home Assistant para ativar as ferramentas de simulação.", "pg_restart_note": "Reinicie o Home Assistant para ativar as ferramentas de simulação.",
"pg_sim_progress": "{done} / {total} ciclos", "pg_sim_progress": "{done} / {total} ciclos",
"pg_starting": "Iniciando…", "pg_starting": "Iniciando…",
@@ -845,6 +875,7 @@
"trend_duration_shorter": "Duração com tendência decrescente ({pct}%/ciclo) média recente {avg}", "trend_duration_shorter": "Duração com tendência decrescente ({pct}%/ciclo) média recente {avg}",
"trend_energy_down": "Energia com tendência decrescente ({pct}%/ciclo)", "trend_energy_down": "Energia com tendência decrescente ({pct}%/ciclo)",
"trend_energy_up": "Energia com tendência crescente ({pct}%/ciclo) média recente {avg}", "trend_energy_up": "Energia com tendência crescente ({pct}%/ciclo) média recente {avg}",
"trim_destructive_confirm": "Isso mantém apenas {pct}% do ciclo e esta ação não pode ser desfeita. Continuar?",
"trim_intro": "Arraste as alças vermelhas ou insira valores. Tudo fora da janela é removido.", "trim_intro": "Arraste as alças vermelhas ou insira valores. Tudo fora da janela é removido.",
"tuning_suggestions_available": "{count} sugestão de ajuste disponível a partir dos ciclos observados. Aparecem ao lado dos campos relevantes.", "tuning_suggestions_available": "{count} sugestão de ajuste disponível a partir dos ciclos observados. Aparecem ao lado dos campos relevantes.",
"unsure_detected_prefix": "O WashData não tem certeza se detectou", "unsure_detected_prefix": "O WashData não tem certeza se detectou",
@@ -922,7 +953,12 @@
"merge_hint": "Os itens importados são adicionados; nada local é perdido. Os conflitos de nomes são resolvidos abaixo.", "merge_hint": "Os itens importados são adicionados; nada local é perdido. Os conflitos de nomes são resolvidos abaixo.",
"replace_warn": "Cada categoria marcada é apagada e substituída pelo conteúdo do arquivo. As categorias não marcadas ficam intactas.", "replace_warn": "Cada categoria marcada é apagada e substituída pelo conteúdo do arquivo. As categorias não marcadas ficam intactas.",
"dest_reference_hint": "Os ciclos importados só melhoram o reconhecimento de programas e nunca afetam as estatísticas de uso/energia.", "dest_reference_hint": "Os ciclos importados só melhoram o reconhecimento de programas e nunca afetam as estatísticas de uso/energia.",
"dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/uso. Use para mover um eletrodoméstico para uma nova instalação." "dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/uso. Use para mover um eletrodoméstico para uma nova instalação.",
"sug_muted": "Não vai sugerir esta configuração novamente",
"sug_mute_failed": "Não foi possível silenciar a sugestão",
"sug_unmuted_all": "Sugestões silenciadas redefinidas",
"n_suggestions_muted": "{count} silenciadas; o ajuste automático não irá propô-las.",
"font_size_hint": "Amplie ou reduza o texto neste painel. Aplica-se à sua conta neste dispositivo."
}, },
"phase_desc": { "phase_desc": {
"anti_crease": "Giros curtos ocasionais após a conclusão para reduzir amassados.", "anti_crease": "Giros curtos ocasionais após a conclusão para reduzir amassados.",
@@ -970,6 +1006,10 @@
"unusable": "Inutilizável" "unusable": "Inutilizável"
}, },
"section": { "section": {
"dishwasher": {
"label": "Lava-louças",
"intro": "Tratamento de fim de ciclo para lava-louças, que normalmente terminam com uma longa fase de secagem quase silenciosa antes de uma breve descarga final."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "O modo antiamasso detecta pulsos de giro de baixa potência após a fase principal e os mantém anexados ao ciclo terminado.", "intro": "O modo antiamasso detecta pulsos de giro de baixa potência após a fase principal e os mantém anexados ao ciclo terminado.",
"label": "Antiamasso" "label": "Antiamasso"
@@ -1012,6 +1052,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Liberação em silêncio da secagem passiva",
"doc": "Assim que o ciclo ultrapassa a duração esperada, por quanto tempo a lava-louças deve permanecer silenciosa (abaixo do Limite de Parada) antes de o WashData parar de aguardar uma descarga final e encerrar o ciclo. Aumente este valor se a sua máquina tiver uma longa fase de secagem silenciosa antes de uma descarga final tardia que está passando despercebida - uma janela mais ampla permite que a duração aprendida acompanhe a variação sazonal (água de entrada mais fria = ciclos mais longos) em vez de se fixar na média antiga. Ele apenas encurta a espera em relação ao limite interno de 30 minutos para o pico de fim, nunca a prolonga."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Reconheça os pulsos curtos de baixa potência que uma secadora emite após a fase de aquecimento principal e mantenha-os anexados ao ciclo finalizado, em vez de lê-los como novos ciclos.", "doc": "Reconheça os pulsos curtos de baixa potência que uma secadora emite após a fase de aquecimento principal e mantenha-os anexados ao ciclo finalizado, em vez de lê-los como novos ciclos.",
"label": "Ativar Detecção Antiamasso" "label": "Ativar Detecção Antiamasso"
@@ -1232,6 +1276,10 @@
"doc": "Minutos após o término de um ciclo, antes de enviar o lembrete de \"descarregar a máquina\" ainda em espera. Defina 0 para desativar o lembrete.", "doc": "Minutos após o término de um ciclo, antes de enviar o lembrete de \"descarregar a máquina\" ainda em espera. Defina 0 para desativar o lembrete.",
"label": "Atraso de Lembrete de Descarga" "label": "Atraso de Lembrete de Descarga"
}, },
"notify_unload_repeat": {
"doc": "Continua reenviando o lembrete de descarga a cada \"Atraso de Lembrete de Descarga\" minutos até você abrir a porta ou tocar em \"Parar de lembrar\" na notificação. Requer uma Entidade do Sensor de Porta (o próprio lembrete a exige). O botão de dispensar funciona nas notificações do aplicativo complementar (móvel) do Home Assistant.",
"label": "Repetir Até a Porta Abrir"
},
"off_delay": { "off_delay": {
"doc": "Tempo de espera após a queda de energia antes de declarar o término do ciclo. Se a energia for retomada dentro desta janela, o ciclo continua perfeitamente - isso faz a ponte entre as etapas de lavagem. As máquinas de lavar louça têm longas fases de secagem (desligadas por 20-60 minutos), portanto o atraso no desligamento deve exceder esse valor para manter toda a lavagem + secagem em um único ciclo.", "doc": "Tempo de espera após a queda de energia antes de declarar o término do ciclo. Se a energia for retomada dentro desta janela, o ciclo continua perfeitamente - isso faz a ponte entre as etapas de lavagem. As máquinas de lavar louça têm longas fases de secagem (desligadas por 20-60 minutos), portanto o atraso no desligamento deve exceder esse valor para manter toda a lavagem + secagem em um único ciclo.",
"label": "Atraso de Desligamento" "label": "Atraso de Desligamento"
@@ -1406,6 +1454,26 @@
"energy_scale": { "energy_scale": {
"label": "Nitidez de energia", "label": "Nitidez de energia",
"doc": "Precisão da penalidade de concordância de energia. Menor = mais rigoroso: uma discordância de energia penaliza mais. O padrão 0,25 é intencionalmente mais permissivo do que a Precisão de duração, porque a energia varia com a carga. Use em conjunto com o Peso de energia." "doc": "Precisão da penalidade de concordância de energia. Menor = mais rigoroso: uma discordância de energia penaliza mais. O padrão 0,25 é intencionalmente mais permissivo do que a Precisão de duração, porque a energia varia com a carga. Use em conjunto com o Peso de energia."
},
"power_profile_interval_min": {
"label": "Intervalo do Perfil de Potência",
"doc": "Tamanho do intervalo para o atributo de sensor power_profile por perfil (a matriz plana de watts médios por slot consumida por planejadores externos como EMHASS e tibber_prices). Intervalos menores preservam picos curtos de potência com mais nitidez; intervalos maiores suavizam o perfil. Padrão: 15 min. Apenas em tempo de leitura; não afeta a detecção."
},
"notify_live_sticky": {
"label": "Manter Notificação ao Vivo ao Toque",
"doc": "Apenas Android. Torna a notificação de progresso ao vivo persistente (fixada) para que tocá-la não dispense o encadeamento em andamento. Desativado mantém o comportamento padrão, em que um toque a dispensa."
},
"notify_live_click_action": {
"label": "Destino de Toque da Notificação ao Vivo",
"doc": "Apenas Android. Para onde um toque na notificação de progresso ao vivo abre (por exemplo, /lovelace/lavanderia, ou uma URL completa) em vez da página inicial do aplicativo. Deixe em branco para o padrão."
},
"door_opens_at_end": {
"label": "Porta Abre Automaticamente ao Final",
"doc": "Para máquinas de lavar louça que abrem a porta automaticamente ao final do ciclo para secar (AirDry e similares). Com esta opção ativa, a abertura de porta durante um ciclo em execução não o pausa indefinidamente; em vez disso, se a porta permanecer aberta pelo tempo de espera configurado abaixo, o WashData considera o ciclo como concluído. Uma abertura breve (para adicionar um item) é ignorada. Requer uma Entidade de Sensor de Porta."
},
"door_end_dwell_seconds": {
"label": "Tempo de Espera da Porta Aberta",
"doc": "Por quanto tempo a porta deve permanecer aberta antes de o WashData encerrar o ciclo, quando a opção \"Porta Abre Automaticamente ao Final\" está ativa. Longo o suficiente para ignorar a adição rápida de um prato (padrão 60 s), curto o suficiente para encerrar prontamente assim que a máquina abre a porta."
} }
}, },
"setting_group": { "setting_group": {
@@ -1576,6 +1644,10 @@
"name_required": "Nome obrigatório", "name_required": "Nome obrigatório",
"no_split_found": "Nenhum intervalo de inatividade encontrado para dividir", "no_split_found": "Nenhum intervalo de inatividade encontrado para dividir",
"panel_settings_saved": "Configurações do painel salvas", "panel_settings_saved": "Configurações do painel salvas",
"pg_preset_loaded": "Predefinição \"{name}\" carregada",
"pg_preset_saved": "Predefinição \"{name}\" salva",
"pg_sugg_loaded": "{n} valor(es) sugerido(s) carregado(s) - execute a Área de testes para comparar",
"pg_sugg_ml_loaded": "{n} valor(es) calibrado(s) por ML carregado(s) - execute a Área de testes para comparar",
"phase_name_required": "O nome da fase é obrigatório", "phase_name_required": "O nome da fase é obrigatório",
"phase_updated": "Fase atualizada", "phase_updated": "Fase atualizada",
"phases_saved": "Fases salvas", "phases_saved": "Fases salvas",
@@ -1723,6 +1795,7 @@
"min_active": "Com base na potência ativa mínima ({min}W) observada no último ciclo.", "min_active": "Com base na potência ativa mínima ({min}W) observada no último ciclo.",
"min_duration_ratio": "Mantido o mais baixo possível para que um programa seja reconhecido logo no início do ciclo; os limiares de confiança e de ambiguidade evitam confirmações prematuras.", "min_duration_ratio": "Mantido o mais baixo possível para que um programa seja reconhecido logo no início do ciclo; os limiares de confiança e de ambiguidade evitam confirmações prematuras.",
"min_off_gap": "Com base em {gaps} intervalos entre ciclos observados (p05={p05}s). Piso do dispositivo: {floor}s.", "min_off_gap": "Com base em {gaps} intervalos entre ciclos observados (p05={p05}s). Piso do dispositivo: {floor}s.",
"min_off_gap_bridge": "Dimensionado para cobrir o período de silêncio mais longo dentro de um ciclo: {span}s + margem de 60s, de {spans} intervalos cobertos em {cycles} ciclos limpos (fica abaixo do seu intervalo mínimo de {ceiling}s entre cargas consecutivas).",
"min_power": "40% da menor potência ativa p05 ({p05}W) em {cycles} ciclos limpos, mantendo o limiar de desligamento abaixo do consumo real.{excl}", "min_power": "40% da menor potência ativa p05 ({p05}W) em {cycles} ciclos limpos, mantendo o limiar de desligamento abaixo do consumo real.{excl}",
"ml_auto_label": "Menor confiança que o modelo de qualidade ainda classificou como limpa (p10 de {cycles} ciclos limpos = {p10}).", "ml_auto_label": "Menor confiança que o modelo de qualidade ainda classificou como limpa (p10 de {cycles} ciclos limpos = {p10}).",
"ml_end_repeat": "{false}/{total} ciclos ({pct}%) tiveram uma pausa que o detector de fim pontuou em >50%; exigir {val} confirmação(ões) de fim.", "ml_end_repeat": "{false}/{total} ciclos ({pct}%) tiveram uma pausa que o detector de fim pontuou em >50%; exigir {val} confirmação(ões) de fim.",
@@ -1739,7 +1812,7 @@
"thr_batch": "Mantido logo acima da menor potência ativa p05 em {cycles} ciclos ({p05}W) para que um início seja captado o mais cedo possível e o limiar de parada permaneça abaixo da menor potência de funcionamento da máquina.", "thr_batch": "Mantido logo acima da menor potência ativa p05 em {cycles} ciclos ({p05}W) para que um início seja captado o mais cedo possível e o limiar de parada permaneça abaixo da menor potência de funcionamento da máquina.",
"tol_per_profile": "p75 da variância de duração por perfil em {profiles} perfis ({cycles} ciclos); perfis consistentes não são penalizados.", "tol_per_profile": "p75 da variância de duração por perfil em {profiles} perfis ({cycles} ciclos); perfis consistentes não são penalizados.",
"tol_pooled": "Com base na variância de duração agregada de {cycles} ciclos rotulados recentes (desvio p95={dev}).", "tol_pooled": "Com base na variância de duração agregada de {cycles} ciclos rotulados recentes (desvio p95={dev}).",
"watchdog": "Mantido tão baixo quanto é seguro (3x o intervalo de atualização p95 de {p95}s, mín. 30s) para que travamentos sejam detectados rapidamente sem paradas falsas." "watchdog": "Mantido tão baixo quanto é seguro (logo acima do intervalo de atualização p95 de {p95}s, mín. 30s) para que travamentos sejam detectados rapidamente sem paradas falsas."
}, },
"exclusions": { "exclusions": {
"summary": "Excluído(s) {total} ciclo(s) mal detectado(s): {parts}.", "summary": "Excluído(s) {total} ciclo(s) mal detectado(s): {parts}.",
@@ -1770,6 +1843,7 @@
"other": "Outro" "other": "Outro"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Lava-louças: segundos de silêncio após a duração esperada antes de liberar a espera da descarga de fim de ciclo",
"anti_wrinkle_enabled": "Absorver os pulsos de giro após a fase principal em vez de lê-los como novos ciclos", "anti_wrinkle_enabled": "Absorver os pulsos de giro após a fase principal em vez de lê-los como novos ciclos",
"anti_wrinkle_exit_power": "A potência deve cair abaixo deste valor entre os pulsos para que o modo antiamasso permaneça ativo", "anti_wrinkle_exit_power": "A potência deve cair abaixo deste valor entre os pulsos para que o modo antiamasso permaneça ativo",
"anti_wrinkle_idle_timeout": "Tempo de silêncio permitido entre dois pulsos de giro antes de o modo antiamasso terminar", "anti_wrinkle_idle_timeout": "Tempo de silêncio permitido entre dois pulsos de giro antes de o modo antiamasso terminar",
@@ -1944,5 +2018,53 @@
"hide_guidance": "Ocultar guia", "hide_guidance": "Ocultar guia",
"show_guidance": "Exibir guia" "show_guidance": "Exibir guia"
} }
},
"card": {
"min": "min",
"entity_not_found": "Entidade não encontrada",
"running_long": "Em atraso",
"remaining": "restante",
"progress": "progresso",
"show_time_remaining": "Mostrar tempo restante",
"show_percentage": "Mostrar porcentagem",
"layout": {
"tile": "Bloco (compacto)",
"detail": "Detalhe (completo)",
"glance": "Visão geral (vários dispositivos)"
},
"btn": {
"pause": "Pausar",
"resume": "Retomar",
"terminate": "Encerrar ciclo",
"record_start": "Iniciar gravação",
"record_stop": "Parar gravação",
"program": "Programa",
"open_panel": "Abrir WashData"
},
"editor": {
"layout": "Layout",
"entity": "Entidade do eletrodoméstico",
"entities": "Eletrodomésticos",
"title": "Título",
"icon": "Ícone",
"show_state": "Mostrar estado",
"show_program": "Mostrar programa",
"show_progress_bar": "Mostrar barra de progresso",
"spin_icon": "Girar o ícone durante o funcionamento",
"display_mode": "Linha de detalhe",
"active_color": "Cor ativa personalizada",
"show_phase": "Mostrar fase",
"show_energy": "Mostrar energia e custo",
"show_anomaly": "Mostrar aviso de atraso",
"show_sparkline": "Mostrar gráfico de potência ao vivo",
"buttons": "Botões de ação",
"program_entity": "Entidade de programa (personalizada)",
"time_entity": "Entidade de tempo (personalizada)",
"pct_entity": "Entidade de progresso (personalizada)",
"power_entity": "Entidade de potência (personalizada)",
"tap_action": "Ação ao tocar",
"hold_action": "Ação ao manter pressionado",
"double_tap_action": "Ação ao tocar duas vezes"
}
} }
} }
@@ -92,6 +92,19 @@
"pause_cycle_tip": "Pausar o ciclo em curso o aparelho retomará onde parou", "pause_cycle_tip": "Pausar o ciclo em curso o aparelho retomará onde parou",
"pg_apply_device": "Aplicar ao dispositivo", "pg_apply_device": "Aplicar ao dispositivo",
"pg_autofill": "Preenchimento automático", "pg_autofill": "Preenchimento automático",
"pg_load_calibrated": "Carregar Calibrado (ML) ({n})",
"pg_load_calibrated_tip": "Carregar as definições calibradas por ML como substituições na Área de testes",
"pg_load_live": "Carregar as definições ativas",
"pg_load_live_tip": "Voltar a ler as definições atuais da integração e descartar todas as edições feitas na Área de testes",
"pg_load_suggested": "Carregar sugestões ({n})",
"pg_load_suggested_tip": "Carregar as sugestões atuais do ajustador automático como substituições na Área de testes",
"pg_preset_delete": "Eliminar preset",
"pg_preset_load": "Carregar preset",
"pg_preset_load_tip": "Substituir os valores da Área de testes por este preset (as definições ativas não são alteradas)",
"pg_preset_save": "Guardar como preset",
"pg_preset_save_tip": "Guardar todos os valores abaixo como um preset com nome para este dispositivo",
"pg_publish_all": "Guardar {n} definição(ões) na integração",
"pg_publish_one": "Guardar {label} na integração",
"play": "Reproduzir", "play": "Reproduzir",
"process": "Processar", "process": "Processar",
"process_history": "Processar agora", "process_history": "Processar agora",
@@ -178,7 +191,9 @@
"download_export": "Transferir exportação", "download_export": "Transferir exportação",
"analyze_import": "Analisar ficheiro", "analyze_import": "Analisar ficheiro",
"import_selected": "Importar seleção", "import_selected": "Importar seleção",
"back": "Voltar" "back": "Voltar",
"mute_suggestion": "Não sugerir mais esta definição",
"reset_muted": "Repor silenciados"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +290,7 @@
"no_automations": "Ainda não há automatizações que referenciem este dispositivo.", "no_automations": "Ainda não há automatizações que referenciem este dispositivo.",
"panel_settings": "Definições do painel", "panel_settings": "Definições do painel",
"param_sweep": "Varrimento de parâmetro", "param_sweep": "Varrimento de parâmetro",
"pg_settings_source": "Origem das definições",
"phase_catalog": "Catálogo de fases", "phase_catalog": "Catálogo de fases",
"playground": "Área de testes", "playground": "Área de testes",
"process_history": "Histórico de processamento", "process_history": "Histórico de processamento",
@@ -415,6 +431,9 @@
"pg_match_score": "Pontuação de correspondência", "pg_match_score": "Pontuação de correspondência",
"pg_pct_of": "{p}% de {total}", "pg_pct_of": "{p}% de {total}",
"pg_poor_match": "Correspondência má", "pg_poor_match": "Correspondência má",
"pg_preset": "Preset da Área de testes",
"pg_preset_name": "Nome do novo preset",
"pg_preset_none": "Selecione um preset…",
"pg_strong_match": "Correspondência forte", "pg_strong_match": "Correspondência forte",
"pg_tile_ambiguous": "Ambíguo", "pg_tile_ambiguous": "Ambíguo",
"pg_tile_ambiguous_tip": "Ciclos com um quase empate entre dois programas", "pg_tile_ambiguous_tip": "Ciclos com um quase empate entre dois programas",
@@ -609,7 +628,8 @@
"conflict_resolution": "Conflitos de nomes", "conflict_resolution": "Conflitos de nomes",
"conflict_import_copy": "Importar como cópia", "conflict_import_copy": "Importar como cópia",
"conflict_keep_mine": "Manter o meu", "conflict_keep_mine": "Manter o meu",
"conflict_overwrite": "Substituir" "conflict_overwrite": "Substituir",
"font_size": "Tamanho da letra do painel"
}, },
"log": { "log": {
"all_levels": "Todos os níveis", "all_levels": "Todos os níveis",
@@ -771,7 +791,17 @@
"pg_apply_confirm": "Aplicar o melhor valor: {label} = {value}?", "pg_apply_confirm": "Aplicar o melhor valor: {label} = {value}?",
"pg_canvas_empty": "Selecione um ciclo acima e, em seguida, prima Carregar para ver a sua curva de potência.", "pg_canvas_empty": "Selecione um ciclo acima e, em seguida, prima Carregar para ver a sua curva de potência.",
"pg_chart_caption": "Taxa de deteção/correspondência ao longo dos valores de {param}", "pg_chart_caption": "Taxa de deteção/correspondência ao longo dos valores de {param}",
"pg_ctrl_intro": "Os valores partem das definições ativas deste dispositivo na integração. As edições ficam na Área de testes até as guardar na integração.",
"pg_live_unavailable": "Definições ativas indisponíveis, a mostrar os valores predefinidos.",
"pg_load_live_confirm": "Descartar {n} edição(ões) da Área de testes e recarregar as definições atuais da integração?",
"pg_match_rate": "{pct}% de taxa de correspondência em {total} ciclos", "pg_match_rate": "{pct}% de taxa de correspondência em {total} ciclos",
"pg_matches_live": "Corresponde às definições ativas",
"pg_n_changed": "{n} valor(es) diferente(s) das definições ativas",
"pg_sugg_none": "Todas as sugestões já correspondem às definições atuais",
"pg_preset_delete_confirm": "Eliminar o preset \"{name}\"?",
"pg_preset_limit": "Limite de presets atingido ({n})",
"pg_preset_overwrite": "Substituir o preset \"{name}\"?",
"pg_publish_one_confirm": "Guardar {label} = {value} nas definições deste dispositivo?",
"pg_restart_note": "Reinicie o Home Assistant para ativar as ferramentas de simulação.", "pg_restart_note": "Reinicie o Home Assistant para ativar as ferramentas de simulação.",
"pg_sim_progress": "{done} / {total} ciclos", "pg_sim_progress": "{done} / {total} ciclos",
"pg_starting": "A iniciar…", "pg_starting": "A iniciar…",
@@ -845,6 +875,7 @@
"trend_duration_shorter": "Duração com tendência decrescente ({pct}%/ciclo) média recente {avg}", "trend_duration_shorter": "Duração com tendência decrescente ({pct}%/ciclo) média recente {avg}",
"trend_energy_down": "Energia com tendência decrescente ({pct}%/ciclo)", "trend_energy_down": "Energia com tendência decrescente ({pct}%/ciclo)",
"trend_energy_up": "Energia com tendência crescente ({pct}%/ciclo) média recente {avg}", "trend_energy_up": "Energia com tendência crescente ({pct}%/ciclo) média recente {avg}",
"trim_destructive_confirm": "Isto mantém apenas {pct}% do ciclo e esta ação não pode ser anulada. Continuar?",
"trim_intro": "Arraste os puxadores vermelhos ou introduza valores. Tudo o que estiver fora da janela é removido.", "trim_intro": "Arraste os puxadores vermelhos ou introduza valores. Tudo o que estiver fora da janela é removido.",
"tuning_suggestions_available": "{count} sugestão de ajuste disponível a partir dos ciclos observados. Aparecem junto dos campos relevantes.", "tuning_suggestions_available": "{count} sugestão de ajuste disponível a partir dos ciclos observados. Aparecem junto dos campos relevantes.",
"unsure_detected_prefix": "O WashData não tem a certeza de que detectou", "unsure_detected_prefix": "O WashData não tem a certeza de que detectou",
@@ -922,9 +953,15 @@
"merge_hint": "Os itens importados são adicionados; nada local é perdido. Os conflitos de nomes são resolvidos abaixo.", "merge_hint": "Os itens importados são adicionados; nada local é perdido. Os conflitos de nomes são resolvidos abaixo.",
"replace_warn": "Cada categoria marcada é apagada e substituída pelo conteúdo do ficheiro. As categorias não marcadas ficam intactas.", "replace_warn": "Cada categoria marcada é apagada e substituída pelo conteúdo do ficheiro. As categorias não marcadas ficam intactas.",
"dest_reference_hint": "Os ciclos importados só melhoram o reconhecimento de programas e nunca afetam as estatísticas de utilização/energia.", "dest_reference_hint": "Os ciclos importados só melhoram o reconhecimento de programas e nunca afetam as estatísticas de utilização/energia.",
"dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/utilização. Use para mover um eletrodoméstico para uma nova instalação." "dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/utilização. Use para mover um eletrodoméstico para uma nova instalação.",
"sug_muted": "Esta definição não será sugerida novamente",
"sug_mute_failed": "Não foi possível silenciar a sugestão",
"sug_unmuted_all": "Sugestões silenciadas repostas",
"n_suggestions_muted": "{count} silenciadas; o ajustador automático não proporá estas definições.",
"font_size_hint": "Torna tudo neste painel maior ou menor. Aplica-se à sua conta neste dispositivo."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Máquina de lavar louça: segundos de silêncio após a duração esperada antes de libertar a espera da descarga de fim de ciclo",
"anti_wrinkle_enabled": "Absorver os pulsos de rotação após a fase principal em vez de os ler como novos ciclos", "anti_wrinkle_enabled": "Absorver os pulsos de rotação após a fase principal em vez de os ler como novos ciclos",
"anti_wrinkle_exit_power": "A potência deve descer abaixo deste valor entre pulsos para que o modo anti-vincos permaneça ativo", "anti_wrinkle_exit_power": "A potência deve descer abaixo deste valor entre pulsos para que o modo anti-vincos permaneça ativo",
"anti_wrinkle_idle_timeout": "Tempo de silêncio permitido entre dois pulsos de rotação antes de o modo anti-vincos terminar", "anti_wrinkle_idle_timeout": "Tempo de silêncio permitido entre dois pulsos de rotação antes de o modo anti-vincos terminar",
@@ -998,6 +1035,10 @@
"unusable": "Inutilizável" "unusable": "Inutilizável"
}, },
"section": { "section": {
"dishwasher": {
"label": "Máquina de lavar louça",
"intro": "Gestão de fim de ciclo para máquinas de lavar louça, que normalmente terminam com uma longa fase de secagem quase silenciosa antes de uma breve descarga final."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "O modo anti-vincos detecta pulsos de rotação a baixa potência após a fase principal e mantém-nos ligados ao ciclo terminado.", "intro": "O modo anti-vincos detecta pulsos de rotação a baixa potência após a fase principal e mantém-nos ligados ao ciclo terminado.",
"label": "Anti-Vincos" "label": "Anti-Vincos"
@@ -1040,6 +1081,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Libertação em silêncio da secagem passiva",
"doc": "Assim que o ciclo ultrapassa a sua duração esperada, durante quanto tempo a máquina de lavar louça deve permanecer silenciosa (abaixo do Limiar de Paragem) antes de o WashData deixar de aguardar uma descarga final e terminar o ciclo. Aumente este valor se a sua máquina tiver uma longa fase de secagem silenciosa antes de uma descarga final tardia que está a ser ignorada - uma janela mais ampla permite que a duração aprendida acompanhe a variação sazonal (água de entrada mais fria = ciclos mais longos) em vez de se fixar na média antiga. Apenas encurta a espera face ao limite interno de 30 minutos para o pico de fim, nunca a prolonga."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Reconheça os pulsos curtos de baixa potência que uma secadora emite após a fase de aquecimento principal e mantenha-os anexados ao ciclo finalizado, em vez de lê-los como novos ciclos.", "doc": "Reconheça os pulsos curtos de baixa potência que uma secadora emite após a fase de aquecimento principal e mantenha-os anexados ao ciclo finalizado, em vez de lê-los como novos ciclos.",
"label": "Activar Detecção Anti-Vincos" "label": "Activar Detecção Anti-Vincos"
@@ -1260,6 +1305,10 @@
"doc": "Minutos após o término de um ciclo, antes de enviar o lembrete de \"descarregar a máquina\" ainda em espera. Defina 0 para desativar o lembrete.", "doc": "Minutos após o término de um ciclo, antes de enviar o lembrete de \"descarregar a máquina\" ainda em espera. Defina 0 para desativar o lembrete.",
"label": "Atraso de Lembrete de Descarga" "label": "Atraso de Lembrete de Descarga"
}, },
"notify_unload_repeat": {
"doc": "Continua a reenviar o lembrete de descarga a cada \"Atraso de Lembrete de Descarga\" minutos até abrir a porta ou tocar em \"Parar de lembrar\" na notificação. Requer uma Entidade do Sensor de Porta (o próprio lembrete a exige). O botão de dispensar funciona nas notificações do aplicativo complementar (móvel) do Home Assistant.",
"label": "Repetir Até a Porta Abrir"
},
"off_delay": { "off_delay": {
"doc": "Tempo de espera após a queda de energia antes de declarar o término do ciclo. Se a energia for retomada dentro desta janela, o ciclo continua perfeitamente - isso faz a ponte entre as etapas de lavagem. As máquinas de lavar louça têm longas fases de secagem (desligadas por 20-60 minutos), portanto o atraso no desligamento deve exceder esse valor para manter toda a lavagem + secagem em um único ciclo.", "doc": "Tempo de espera após a queda de energia antes de declarar o término do ciclo. Se a energia for retomada dentro desta janela, o ciclo continua perfeitamente - isso faz a ponte entre as etapas de lavagem. As máquinas de lavar louça têm longas fases de secagem (desligadas por 20-60 minutos), portanto o atraso no desligamento deve exceder esse valor para manter toda a lavagem + secagem em um único ciclo.",
"label": "Atraso de Desligamento" "label": "Atraso de Desligamento"
@@ -1434,6 +1483,26 @@
"energy_scale": { "energy_scale": {
"label": "Nitidez de energia", "label": "Nitidez de energia",
"doc": "Precisão da penalidade de concordância de energia. Menor = mais rigoroso: uma discordância de energia penaliza mais. A predefinição 0,25 é intencionalmente mais permissiva do que a Precisão de duração, porque a energia varia com a carga. Use em conjunto com o Peso de energia." "doc": "Precisão da penalidade de concordância de energia. Menor = mais rigoroso: uma discordância de energia penaliza mais. A predefinição 0,25 é intencionalmente mais permissiva do que a Precisão de duração, porque a energia varia com a carga. Use em conjunto com o Peso de energia."
},
"power_profile_interval_min": {
"label": "Intervalo do Perfil de Potência",
"doc": "Tamanho do intervalo para o atributo do sensor power_profile por perfil (o array plano de watts médios por slot consumido por planeadores externos como EMHASS e tibber_prices). Intervalos menores mantêm os picos de potência curtos nítidos; intervalos maiores suavizam a forma. Predefinição: 15 min. Apenas de leitura; não afeta a deteção."
},
"notify_live_sticky": {
"label": "Manter a Notificação em Tempo Real ao Tocar",
"doc": "Apenas Android. Torna a notificação de progresso em tempo real persistente (fixada) para que ao tocar nela não a dispense. Desativado mantém o comportamento padrão em que o toque a dispensa."
},
"notify_live_click_action": {
"label": "Destino ao Tocar na Notificação em Tempo Real",
"doc": "Apenas Android. Para onde abre o toque na notificação de progresso em tempo real (por exemplo, /lovelace/lavandaria, ou um URL completo) em vez da página inicial da aplicação. Deixe em branco para a predefinição."
},
"door_opens_at_end": {
"label": "Porta Abre Automaticamente no Fim",
"doc": "Para máquinas de lavar louça que abrem a porta automaticamente no fim do ciclo para secar (AirDry e similares). Com esta opção ativa, a abertura da porta durante um ciclo em execução deixa de o pausar indefinidamente; em vez disso, se a porta permanecer aberta durante o tempo de espera indicado abaixo, o WashData considera o ciclo concluído. Uma abertura breve (ao adicionar um item) é ignorada. Requer uma Entidade do Sensor de Porta."
},
"door_end_dwell_seconds": {
"label": "Tempo de Espera com Porta Aberta para Fim",
"doc": "Quanto tempo a porta tem de permanecer aberta antes de o WashData terminar o ciclo, quando a opção \"Porta Abre Automaticamente no Fim\" está ativa. Suficientemente longo para ignorar a adição rápida de um prato (predefinição: 60 s), suficientemente curto para terminar prontamente quando a máquina abre a porta."
} }
}, },
"setting_group": { "setting_group": {
@@ -1604,6 +1673,10 @@
"name_required": "Nome obrigatório", "name_required": "Nome obrigatório",
"no_split_found": "Nenhum intervalo de inactividade encontrado para dividir", "no_split_found": "Nenhum intervalo de inactividade encontrado para dividir",
"panel_settings_saved": "Definições do painel guardadas", "panel_settings_saved": "Definições do painel guardadas",
"pg_preset_loaded": "Preset \"{name}\" carregado",
"pg_preset_saved": "Preset \"{name}\" guardado",
"pg_sugg_loaded": "{n} valor(es) sugerido(s) carregado(s) - execute a Área de testes para comparar",
"pg_sugg_ml_loaded": "{n} valor(es) calibrado(s) por ML carregado(s) - execute a Área de testes para comparar",
"phase_name_required": "O nome da fase é obrigatório", "phase_name_required": "O nome da fase é obrigatório",
"phase_updated": "Fase actualizada", "phase_updated": "Fase actualizada",
"phases_saved": "Fases guardadas", "phases_saved": "Fases guardadas",
@@ -1751,6 +1824,7 @@
"min_active": "Com base na potência ativa mínima ({min}W) observada no último ciclo.", "min_active": "Com base na potência ativa mínima ({min}W) observada no último ciclo.",
"min_duration_ratio": "Mantido o mais baixo possível para que um programa seja reconhecido cedo no ciclo; os limiares de confiança e ambiguidade evitam decisões prematuras.", "min_duration_ratio": "Mantido o mais baixo possível para que um programa seja reconhecido cedo no ciclo; os limiares de confiança e ambiguidade evitam decisões prematuras.",
"min_off_gap": "Com base em {gaps} intervalos entre ciclos observados (p05={p05}s). Mínimo do dispositivo: {floor}s.", "min_off_gap": "Com base em {gaps} intervalos entre ciclos observados (p05={p05}s). Mínimo do dispositivo: {floor}s.",
"min_off_gap_bridge": "Dimensionado para cobrir o período de silêncio mais longo dentro de um ciclo: {span}s + 60s de margem, a partir de {spans} intervalos cobertos ao longo de {cycles} ciclos limpos (mantém-se abaixo do seu intervalo mínimo de {ceiling}s entre cargas consecutivas).",
"min_power": "40% da potência ativa mais baixa no p05 ({p05}W) ao longo de {cycles} ciclos limpos, mantendo o limiar de desligamento abaixo do consumo real.{excl}", "min_power": "40% da potência ativa mais baixa no p05 ({p05}W) ao longo de {cycles} ciclos limpos, mantendo o limiar de desligamento abaixo do consumo real.{excl}",
"ml_auto_label": "Confiança mais baixa que o modelo de qualidade ainda classificou como limpa (p10 de {cycles} ciclos limpos = {p10}).", "ml_auto_label": "Confiança mais baixa que o modelo de qualidade ainda classificou como limpa (p10 de {cycles} ciclos limpos = {p10}).",
"ml_end_repeat": "{false}/{total} ciclos ({pct}%) tiveram uma pausa que o detetor de fim pontuou >50%; exigir {val} confirmação(ões) de fim.", "ml_end_repeat": "{false}/{total} ciclos ({pct}%) tiveram uma pausa que o detetor de fim pontuou >50%; exigir {val} confirmação(ões) de fim.",
@@ -1767,7 +1841,7 @@
"thr_batch": "Mantido logo acima da potência ativa mais baixa no p05 ao longo de {cycles} ciclos ({p05}W) para que um arranque seja captado o mais cedo possível e o limiar de paragem se mantenha abaixo da potência de funcionamento mais baixa da máquina.", "thr_batch": "Mantido logo acima da potência ativa mais baixa no p05 ao longo de {cycles} ciclos ({p05}W) para que um arranque seja captado o mais cedo possível e o limiar de paragem se mantenha abaixo da potência de funcionamento mais baixa da máquina.",
"tol_per_profile": "p75 da variância de duração por perfil em {profiles} perfis ({cycles} ciclos); os perfis restritos não são penalizados.", "tol_per_profile": "p75 da variância de duração por perfil em {profiles} perfis ({cycles} ciclos); os perfis restritos não são penalizados.",
"tol_pooled": "Com base na variância de duração agrupada de {cycles} ciclos rotulados recentes (desvio p95={dev}).", "tol_pooled": "Com base na variância de duração agrupada de {cycles} ciclos rotulados recentes (desvio p95={dev}).",
"watchdog": "Mantido o mais baixo que é seguro (3x o intervalo de atualização p95 de {p95}s, mín. 30s) para detetar rapidamente os bloqueios sem paragens falsas." "watchdog": "Mantido o mais baixo que é seguro (ligeiramente acima do intervalo de atualização p95 de {p95}s, mín. 30s) para detetar rapidamente os bloqueios sem paragens falsas."
}, },
"exclusions": { "exclusions": {
"summary": "Excluído(s) {total} ciclo(s) mal detetado(s): {parts}.", "summary": "Excluído(s) {total} ciclo(s) mal detetado(s): {parts}.",
@@ -1944,5 +2018,53 @@
"hide_guidance": "Ocultar guia", "hide_guidance": "Ocultar guia",
"show_guidance": "Mostrar guia" "show_guidance": "Mostrar guia"
} }
},
"card": {
"min": "min",
"entity_not_found": "Entidade não encontrada",
"running_long": "Em atraso",
"remaining": "restante",
"progress": "progresso",
"show_time_remaining": "Mostrar tempo restante",
"show_percentage": "Mostrar percentagem",
"layout": {
"tile": "Mosaico (compacto)",
"detail": "Detalhe (completo)",
"glance": "Vista rápida (vários dispositivos)"
},
"btn": {
"pause": "Pausar",
"resume": "Retomar",
"terminate": "Terminar ciclo",
"record_start": "Iniciar gravação",
"record_stop": "Parar gravação",
"program": "Programa",
"open_panel": "Abrir WashData"
},
"editor": {
"layout": "Disposição",
"entity": "Entidade do eletrodoméstico",
"entities": "Eletrodomésticos",
"title": "Título",
"icon": "Ícone",
"show_state": "Mostrar estado",
"show_program": "Mostrar programa",
"show_progress_bar": "Mostrar barra de progresso",
"spin_icon": "Rodar o ícone durante o funcionamento",
"display_mode": "Linha de detalhe",
"active_color": "Cor ativa personalizada",
"show_phase": "Mostrar fase",
"show_energy": "Mostrar energia e custo",
"show_anomaly": "Mostrar aviso de atraso",
"show_sparkline": "Mostrar gráfico de potência em direto",
"buttons": "Botões de ação",
"program_entity": "Entidade de programa (personalizada)",
"time_entity": "Entidade de tempo (personalizada)",
"pct_entity": "Entidade de progresso (personalizada)",
"power_entity": "Entidade de potência (personalizada)",
"tap_action": "Ação ao tocar",
"hold_action": "Ação ao manter premido",
"double_tap_action": "Ação ao tocar duas vezes"
}
} }
} }
@@ -92,6 +92,19 @@
"pause_cycle_tip": "Puneți în pauză ciclul în curs aparatul va relua de unde a rămas", "pause_cycle_tip": "Puneți în pauză ciclul în curs aparatul va relua de unde a rămas",
"pg_apply_device": "Aplicați pe dispozitiv", "pg_apply_device": "Aplicați pe dispozitiv",
"pg_autofill": "Completare automată", "pg_autofill": "Completare automată",
"pg_load_calibrated": "Încarcă Calibrat (ML) ({n})",
"pg_load_calibrated_tip": "Încarcă setările calibrate de ML ca substituiri în Zona de test",
"pg_load_live": "Încarcă setările active",
"pg_load_live_tip": "Recitește setările actuale ale integrării și renunță la toate modificările făcute în Zona de test",
"pg_load_suggested": "Încarcă sugestii ({n})",
"pg_load_suggested_tip": "Încarcă sugestiile curente ale optimizatorului automat ca substituiri în Zona de test",
"pg_preset_delete": "Șterge presetarea",
"pg_preset_load": "Încarcă presetarea",
"pg_preset_load_tip": "Înlocuiește valorile din Zona de test cu această presetare (setările active rămân neatinse)",
"pg_preset_save": "Salvează ca presetare",
"pg_preset_save_tip": "Salvează toate valorile de mai jos ca presetare denumită pentru acest dispozitiv",
"pg_publish_all": "Salvează {n} setări în integrare",
"pg_publish_one": "Salvează {label} în integrare",
"play": "Redați", "play": "Redați",
"process": "Procesați", "process": "Procesați",
"process_history": "Procesați acum", "process_history": "Procesați acum",
@@ -178,7 +191,9 @@
"download_export": "Descarcă exportul", "download_export": "Descarcă exportul",
"analyze_import": "Analizează fișierul", "analyze_import": "Analizează fișierul",
"import_selected": "Importă selecția", "import_selected": "Importă selecția",
"back": "Înapoi" "back": "Înapoi",
"mute_suggestion": "Nu mai sugerați această setare",
"reset_muted": "Resetați cele ignorate"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,6 +290,7 @@
"no_automations": "Nicio automatizare nu face referire încă la acest dispozitiv.", "no_automations": "Nicio automatizare nu face referire încă la acest dispozitiv.",
"panel_settings": "Setări panou", "panel_settings": "Setări panou",
"param_sweep": "Scanare parametri", "param_sweep": "Scanare parametri",
"pg_settings_source": "Sursa setărilor",
"phase_catalog": "Catalog de faze", "phase_catalog": "Catalog de faze",
"playground": "Zonă de test", "playground": "Zonă de test",
"process_history": "Istoricul procesării", "process_history": "Istoricul procesării",
@@ -415,6 +431,9 @@
"pg_match_score": "Scor de potrivire", "pg_match_score": "Scor de potrivire",
"pg_pct_of": "{p}% din {total}", "pg_pct_of": "{p}% din {total}",
"pg_poor_match": "Potrivire proastă", "pg_poor_match": "Potrivire proastă",
"pg_preset": "Presetare din Zona de test",
"pg_preset_name": "Numele noii presetări",
"pg_preset_none": "Selectează o presetare…",
"pg_strong_match": "Potrivire puternică", "pg_strong_match": "Potrivire puternică",
"pg_tile_ambiguous": "Ambigue", "pg_tile_ambiguous": "Ambigue",
"pg_tile_ambiguous_tip": "Cicluri cu un rezultat aproape egal între două programe", "pg_tile_ambiguous_tip": "Cicluri cu un rezultat aproape egal între două programe",
@@ -609,7 +628,8 @@
"conflict_resolution": "Conflicte de nume", "conflict_resolution": "Conflicte de nume",
"conflict_import_copy": "Importă drept copie", "conflict_import_copy": "Importă drept copie",
"conflict_keep_mine": "Păstrează-l pe al meu", "conflict_keep_mine": "Păstrează-l pe al meu",
"conflict_overwrite": "Suprascrie" "conflict_overwrite": "Suprascrie",
"font_size": "Dimensiunea fontului panoului"
}, },
"log": { "log": {
"all_levels": "Toate nivelurile", "all_levels": "Toate nivelurile",
@@ -771,7 +791,17 @@
"pg_apply_confirm": "Aplicați cea mai bună valoare: {label} = {value}?", "pg_apply_confirm": "Aplicați cea mai bună valoare: {label} = {value}?",
"pg_canvas_empty": "Selectați un ciclu de mai sus, apoi apăsați Încărcați pentru a vedea curba sa de putere.", "pg_canvas_empty": "Selectați un ciclu de mai sus, apoi apăsați Încărcați pentru a vedea curba sa de putere.",
"pg_chart_caption": "Rata de detectare/potrivire în funcție de valorile {param}", "pg_chart_caption": "Rata de detectare/potrivire în funcție de valorile {param}",
"pg_ctrl_intro": "Valorile pornesc de la setările active ale acestui dispozitiv din integrare. Modificările rămân în Zona de test până când le salvezi în integrare.",
"pg_live_unavailable": "Setările active nu sunt disponibile, se afișează valorile implicite.",
"pg_load_live_confirm": "Renunți la {n} modificări din Zona de test și reîncarci setările actuale ale integrării?",
"pg_match_rate": "{pct}% rată de potrivire pe {total} cicluri", "pg_match_rate": "{pct}% rată de potrivire pe {total} cicluri",
"pg_matches_live": "Identice cu setările active",
"pg_n_changed": "{n} valori diferite față de setările active",
"pg_sugg_none": "Toate sugestiile corespund deja setărilor actuale",
"pg_preset_delete_confirm": "Ștergi presetarea \"{name}\"?",
"pg_preset_limit": "Limita de presetări a fost atinsă ({n})",
"pg_preset_overwrite": "Suprascrii presetarea \"{name}\"?",
"pg_publish_one_confirm": "Salvezi {label} = {value} în setările acestui dispozitiv?",
"pg_restart_note": "Reporniți Home Assistant pentru a activa instrumentele de simulare.", "pg_restart_note": "Reporniți Home Assistant pentru a activa instrumentele de simulare.",
"pg_sim_progress": "{done} / {total} cicluri", "pg_sim_progress": "{done} / {total} cicluri",
"pg_starting": "Se pornește…", "pg_starting": "Se pornește…",
@@ -845,6 +875,7 @@
"trend_duration_shorter": "Durata este în scădere ({pct}%/ciclu) medie recentă {avg}", "trend_duration_shorter": "Durata este în scădere ({pct}%/ciclu) medie recentă {avg}",
"trend_energy_down": "Energia este în scădere ({pct}%/ciclu)", "trend_energy_down": "Energia este în scădere ({pct}%/ciclu)",
"trend_energy_up": "Energia este în creștere ({pct}%/ciclu) medie recentă {avg}", "trend_energy_up": "Energia este în creștere ({pct}%/ciclu) medie recentă {avg}",
"trim_destructive_confirm": "Se păstrează doar {pct}% din ciclu, iar această acțiune nu poate fi anulată. Continuați?",
"trim_intro": "Trageți mânerele roșii sau introduceți valori. Tot ceea ce este în afara ferestrei este eliminat.", "trim_intro": "Trageți mânerele roșii sau introduceți valori. Tot ceea ce este în afara ferestrei este eliminat.",
"tuning_suggestions_available": "{count} sugestie de ajustare disponibilă din ciclurile observate. Acestea apar lângă câmpurile relevante.", "tuning_suggestions_available": "{count} sugestie de ajustare disponibilă din ciclurile observate. Acestea apar lângă câmpurile relevante.",
"unsure_detected_prefix": "WashData nu este sigur că a detectat", "unsure_detected_prefix": "WashData nu este sigur că a detectat",
@@ -922,7 +953,12 @@
"merge_hint": "Elementele importate sunt adăugate; nimic local nu se pierde. Conflictele de nume se rezolvă mai jos.", "merge_hint": "Elementele importate sunt adăugate; nimic local nu se pierde. Conflictele de nume se rezolvă mai jos.",
"replace_warn": "Fiecare categorie bifată este ștearsă și înlocuită cu conținutul fișierului. Categoriile nebifate rămân neatinse.", "replace_warn": "Fiecare categorie bifată este ștearsă și înlocuită cu conținutul fișierului. Categoriile nebifate rămân neatinse.",
"dest_reference_hint": "Ciclurile importate îmbunătățesc doar recunoașterea programelor și nu afectează niciodată statisticile de utilizare/energie.", "dest_reference_hint": "Ciclurile importate îmbunătățesc doar recunoașterea programelor și nu afectează niciodată statisticile de utilizare/energie.",
"dest_real_history_hint": "Ciclurile importate contează ca istoric propriu al acestui dispozitiv și alimentează statisticile de energie/utilizare. Folosește pentru a muta un electrocasnic pe o instalare nouă." "dest_real_history_hint": "Ciclurile importate contează ca istoric propriu al acestui dispozitiv și alimentează statisticile de energie/utilizare. Folosește pentru a muta un electrocasnic pe o instalare nouă.",
"sug_muted": "Această setare nu va mai fi sugerată",
"sug_mute_failed": "Nu s-a putut dezactiva sugestia",
"sug_unmuted_all": "Sugestiile dezactivate au fost resetate",
"n_suggestions_muted": "{count} dezactivate; reglajul automat nu le va propune.",
"font_size_hint": "Faceți tot din acest panou mai mare sau mai mic. Se aplică contului dvs. pe acest dispozitiv."
}, },
"phase_desc": { "phase_desc": {
"anti_crease": "Tumblări scurte ocazionale după finalizare pentru a reduce șifonarea.", "anti_crease": "Tumblări scurte ocazionale după finalizare pentru a reduce șifonarea.",
@@ -970,6 +1006,10 @@
"unusable": "Inutilizabil" "unusable": "Inutilizabil"
}, },
"section": { "section": {
"dishwasher": {
"label": "Mașină de spălat vase",
"intro": "Gestionarea sfârșitului de ciclu pentru mașinile de spălat vase, care de obicei se termină cu o fază lungă de uscare aproape silențioasă înainte de o scurtă evacuare finală."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Modul anti-șifonare detectează pulsuri de tumblare la putere redusă după faza principală și le menține atașate ciclului terminat.", "intro": "Modul anti-șifonare detectează pulsuri de tumblare la putere redusă după faza principală și le menține atașate ciclului terminat.",
"label": "Anti-Șifonare" "label": "Anti-Șifonare"
@@ -1012,6 +1052,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Eliberare la liniște în uscarea pasivă",
"doc": "După ce ciclul depășește durata așteptată, cât timp trebuie să rămână silențioasă mașina de spălat vase (sub Prag de Oprire) înainte ca WashData să nu mai aștepte o evacuare finală și să încheie ciclul. Măriți-l dacă mașina are o fază lungă de uscare silențioasă înainte de o evacuare finală întârziată care nu este detectată - o fereastră mai largă permite duratei învățate să urmeze variația sezonieră (apă de alimentare mai rece = cicluri mai lungi) în loc să se fixeze pe media veche. Doar scurtează așteptarea față de plafonul intern de 30 de minute pentru vârful de final, fără a o prelungi vreodată."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Recunoașteți impulsurile scurte de rufe de putere redusă pe care le emite un uscător după faza principală de căldură și mențineți-le atașate la ciclul terminat în loc să le citiți ca cicluri noi.", "doc": "Recunoașteți impulsurile scurte de rufe de putere redusă pe care le emite un uscător după faza principală de căldură și mențineți-le atașate la ciclul terminat în loc să le citiți ca cicluri noi.",
"label": "Activați Detectarea Anti-Șifonare" "label": "Activați Detectarea Anti-Șifonare"
@@ -1232,6 +1276,10 @@
"doc": "La câteva minute după încheierea unui ciclu, înainte de a trimite mementoul încă în așteptare „descărcați mașina”. Setați 0 pentru a dezactiva mementoul.", "doc": "La câteva minute după încheierea unui ciclu, înainte de a trimite mementoul încă în așteptare „descărcați mașina”. Setați 0 pentru a dezactiva mementoul.",
"label": "Întârziere Reamintire Descărcare" "label": "Întârziere Reamintire Descărcare"
}, },
"notify_unload_repeat": {
"doc": "Continuă să retrimită mementoul de descărcare la fiecare \"Întârziere Reamintire Descărcare\" minute până când deschizi ușa sau atingi \"Oprește mementourile\" în notificare. Necesită o Entitate Senzor Ușă (mementoul în sine o necesită). Butonul de respingere funcționează pe notificările aplicației complementare (mobile) Home Assistant.",
"label": "Repetă Până la Deschiderea Ușii"
},
"off_delay": { "off_delay": {
"doc": "Timp de așteptat după căderea energiei înainte de a declara ciclul încheiat. Dacă alimentarea se reia în această fereastră, ciclul continuă fără întreruperi - acest lucru face legătura între etapele de spălare. Mașinile de spălat vase au faze lungi de uscare (oprire pentru 20-60 de minute), așa că întârzierea de oprire trebuie să depășească aceasta pentru a menține întreaga spălare+uscare ca un singur ciclu.", "doc": "Timp de așteptat după căderea energiei înainte de a declara ciclul încheiat. Dacă alimentarea se reia în această fereastră, ciclul continuă fără întreruperi - acest lucru face legătura între etapele de spălare. Mașinile de spălat vase au faze lungi de uscare (oprire pentru 20-60 de minute), așa că întârzierea de oprire trebuie să depășească aceasta pentru a menține întreaga spălare+uscare ca un singur ciclu.",
"label": "Întârziere la Oprire" "label": "Întârziere la Oprire"
@@ -1406,6 +1454,26 @@
"energy_scale": { "energy_scale": {
"label": "Precizie Energie", "label": "Precizie Energie",
"doc": "Rigoarea penalizării acordului de energie a Etapei 4. Mai mic = mai strict: o nepotrivire de energie afectează mai mult. Implicit 0.25 este intenționat mai permisiv decât Rigoarea Duratei deoarece energia variază în funcție de sarcină. Utilizați împreună cu Ponderea Energiei." "doc": "Rigoarea penalizării acordului de energie a Etapei 4. Mai mic = mai strict: o nepotrivire de energie afectează mai mult. Implicit 0.25 este intenționat mai permisiv decât Rigoarea Duratei deoarece energia variază în funcție de sarcină. Utilizați împreună cu Ponderea Energiei."
},
"power_profile_interval_min": {
"label": "Interval Profil Putere",
"doc": "Dimensiunea intervalului pentru atributul senzorului power_profile per profil (tabloul plat de wați medii per slot consumat de planificatoare externe precum EMHASS și tibber_prices). Intervalele mai mici păstrează vârfurile scurte de putere clare; intervalele mai mari netezesc forma. Implicit 15 min. Doar la citire; nu afectează detectarea."
},
"notify_live_sticky": {
"label": "Păstrați notificarea în timp real la atingere",
"doc": "Numai Android. Faceți notificarea de progres în timp real persistentă (fixată) astfel încât atingerea ei să nu o respingă. Dezactivat păstrează comportamentul implicit în care o atingere o respinge."
},
"notify_live_click_action": {
"label": "Destinație la atingerea notificării în timp real",
"doc": "Numai Android. Unde deschide o atingere pe notificarea de progres în timp real (de ex. /lovelace/laundry, sau un URL complet) în loc de pagina principală a aplicației. Lăsați necompletat pentru valoarea implicită."
},
"door_opens_at_end": {
"label": "Ușa se deschide automat la final",
"doc": "Pentru mașinile de spălat vase care deschid ușa la sfârșitul ciclului pentru uscare (AirDry și similare). Cu această opțiune activată, deschiderea ușii în timpul unui ciclu activ nu îl mai pune în pauză indefinit; în schimb, dacă ușa rămâne deschisă pentru durata de așteptare de mai jos, WashData consideră ciclul terminat. O deschidere scurtă (pentru a adăuga un obiect) este ignorată. Necesită o entitate senzor de ușă."
},
"door_end_dwell_seconds": {
"label": "Durată de așteptare la deschiderea ușii",
"doc": "Cât timp trebuie să rămână ușa deschisă înainte ca WashData să termine ciclul, când opțiunea \"Ușa se deschide automat la final\" este activată. Destul de lungă pentru a ignora adăugarea rapidă a unui vas (implicit 60 s), destul de scurtă pentru a termina prompt odată ce mașina deschide ușa."
} }
}, },
"setting_group": { "setting_group": {
@@ -1576,6 +1644,10 @@
"name_required": "Numele este obligatoriu", "name_required": "Numele este obligatoriu",
"no_split_found": "Nu au fost găsite pauze de inactivitate pentru divizare", "no_split_found": "Nu au fost găsite pauze de inactivitate pentru divizare",
"panel_settings_saved": "Setările panoului au fost salvate", "panel_settings_saved": "Setările panoului au fost salvate",
"pg_preset_loaded": "Presetarea \"{name}\" a fost încărcată",
"pg_preset_saved": "Presetarea \"{name}\" a fost salvată",
"pg_sugg_loaded": "{n} valoare/valori sugerate incarcate - rulați Zona de test pentru comparație",
"pg_sugg_ml_loaded": "{n} valoare/valori calibrate ML incarcate - rulați Zona de test pentru comparație",
"phase_name_required": "Numele fazei este obligatoriu", "phase_name_required": "Numele fazei este obligatoriu",
"phase_updated": "Fază actualizată", "phase_updated": "Fază actualizată",
"phases_saved": "Faze salvate", "phases_saved": "Faze salvate",
@@ -1723,6 +1795,7 @@
"min_active": "Pe baza puterii active minime ({min}W) observate în ultimul ciclu.", "min_active": "Pe baza puterii active minime ({min}W) observate în ultimul ciclu.",
"min_duration_ratio": "Păstrat cât mai mic posibil, astfel încât un program să fie recunoscut devreme în ciclu; pragurile de încredere și de ambiguitate previn confirmările premature.", "min_duration_ratio": "Păstrat cât mai mic posibil, astfel încât un program să fie recunoscut devreme în ciclu; pragurile de încredere și de ambiguitate previn confirmările premature.",
"min_off_gap": "Pe baza a {gaps} intervale între cicluri observate (p05={p05}s). Limita inferioară a dispozitivului: {floor}s.", "min_off_gap": "Pe baza a {gaps} intervale între cicluri observate (p05={p05}s). Limita inferioară a dispozitivului: {floor}s.",
"min_off_gap_bridge": "Dimensionat pentru a acoperi cea mai lungă perioadă de liniște din interiorul unui ciclu: {span}s + 60s marjă, din {spans} intervale acoperite pe {cycles} cicluri curate (rămâne sub intervalul dvs. minim de {ceiling}s dintre două încărcături consecutive).",
"min_power": "40% din cea mai mică putere activă p05 ({p05}W) pe {cycles} cicluri curate, menținând pragul de oprire sub consumul real.{excl}", "min_power": "40% din cea mai mică putere activă p05 ({p05}W) pe {cycles} cicluri curate, menținând pragul de oprire sub consumul real.{excl}",
"ml_auto_label": "Cea mai mică încredere pe care modelul de calitate a considerat-o încă drept curată (p10 din {cycles} cicluri curate = {p10}).", "ml_auto_label": "Cea mai mică încredere pe care modelul de calitate a considerat-o încă drept curată (p10 din {cycles} cicluri curate = {p10}).",
"ml_end_repeat": "{false}/{total} cicluri ({pct}%) au avut o pauză pe care detectorul de sfârșit a evaluat-o la >50%; necesită {val} confirmare(i) de sfârșit.", "ml_end_repeat": "{false}/{total} cicluri ({pct}%) au avut o pauză pe care detectorul de sfârșit a evaluat-o la >50%; necesită {val} confirmare(i) de sfârșit.",
@@ -1739,7 +1812,7 @@
"thr_batch": "Păstrat chiar deasupra celei mai mici puteri active p05 pe {cycles} cicluri ({p05}W), astfel încât o pornire să fie surprinsă cât mai devreme posibil, iar pragul de oprire să rămână sub cea mai mică putere de funcționare a mașinii.", "thr_batch": "Păstrat chiar deasupra celei mai mici puteri active p05 pe {cycles} cicluri ({p05}W), astfel încât o pornire să fie surprinsă cât mai devreme posibil, iar pragul de oprire să rămână sub cea mai mică putere de funcționare a mașinii.",
"tol_per_profile": "p75 al varianței duratei per profil pe {profiles} profiluri ({cycles} cicluri); profilurile stabile nu sunt penalizate.", "tol_per_profile": "p75 al varianței duratei per profil pe {profiles} profiluri ({cycles} cicluri); profilurile stabile nu sunt penalizate.",
"tol_pooled": "Pe baza varianței combinate a duratei a {cycles} cicluri recente etichetate (deviație p95={dev}).", "tol_pooled": "Pe baza varianței combinate a duratei a {cycles} cicluri recente etichetate (deviație p95={dev}).",
"watchdog": "Păstrat cât mai mic în siguranță (de 3x intervalul de actualizare p95 de {p95}s, min. 30s), astfel încât blocajele să fie surprinse rapid fără opriri false." "watchdog": "Păstrat cât mai mic în siguranță (puțin peste intervalul de actualizare p95 de {p95}s, min. 30s), astfel încât blocajele să fie surprinse rapid fără opriri false."
}, },
"exclusions": { "exclusions": {
"summary": "Excluse {total} cicluri detectate greșit: {parts}.", "summary": "Excluse {total} cicluri detectate greșit: {parts}.",
@@ -1770,6 +1843,7 @@
"other": "Altele" "other": "Altele"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Mașină de spălat vase: secunde de liniște după durata așteptată înainte de a elibera așteptarea evacuării de la sfârșitul ciclului",
"anti_wrinkle_enabled": "Absoarbe impulsurile de rotire de după faza principală în loc să le trateze drept cicluri noi", "anti_wrinkle_enabled": "Absoarbe impulsurile de rotire de după faza principală în loc să le trateze drept cicluri noi",
"anti_wrinkle_exit_power": "Puterea trebuie să scadă sub această valoare între impulsuri pentru ca modul anti-șifonare să rămână activ", "anti_wrinkle_exit_power": "Puterea trebuie să scadă sub această valoare între impulsuri pentru ca modul anti-șifonare să rămână activ",
"anti_wrinkle_idle_timeout": "Timp de liniște permis între două impulsuri de rotire înainte ca modul anti-șifonare să se încheie", "anti_wrinkle_idle_timeout": "Timp de liniște permis între două impulsuri de rotire înainte ca modul anti-șifonare să se încheie",
@@ -1944,5 +2018,53 @@
"hide_guidance": "Ascundeți ghidul", "hide_guidance": "Ascundeți ghidul",
"show_guidance": "Afișați ghidul" "show_guidance": "Afișați ghidul"
} }
},
"card": {
"min": "min",
"entity_not_found": "Entitate negăsită",
"running_long": "Întârziere",
"remaining": "rămas",
"progress": "progres",
"show_time_remaining": "Afișează timpul rămas",
"show_percentage": "Afișează procentajul",
"layout": {
"tile": "Dală (compact)",
"detail": "Detaliat (complet)",
"glance": "Sumar (mai multe dispozitive)"
},
"btn": {
"pause": "Pauză",
"resume": "Reluare",
"terminate": "Încheie ciclul",
"record_start": "Porniți înregistrarea",
"record_stop": "Opriți înregistrarea",
"program": "Program",
"open_panel": "Deschide WashData"
},
"editor": {
"layout": "Aspect",
"entity": "Entitatea aparatului",
"entities": "Aparate",
"title": "Titlu",
"icon": "Pictogramă",
"show_state": "Afișează starea",
"show_program": "Afișează programul",
"show_progress_bar": "Afișează bara de progres",
"spin_icon": "Rotește pictograma în timpul funcționării",
"display_mode": "Linie de detaliu",
"active_color": "Culoare activă personalizată",
"show_phase": "Afișează faza",
"show_energy": "Afișează energia și costul",
"show_anomaly": "Afișează avertismentul de întârziere",
"show_sparkline": "Afișează graficul de putere în timp real",
"buttons": "Butoane de acțiune",
"program_entity": "Entitate de program (personalizată)",
"time_entity": "Entitate de timp (personalizată)",
"pct_entity": "Entitate de progres (personalizată)",
"power_entity": "Entitate de putere (personalizată)",
"tap_action": "Acțiune la atingere",
"hold_action": "Acțiune la apăsare lungă",
"double_tap_action": "Acțiune la atingere dublă"
}
} }
} }
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "мин",
"entity_not_found": "Объект не найден",
"running_long": "Работает долго",
"remaining": "осталось",
"progress": "прогресс",
"show_time_remaining": "Показывать оставшееся время",
"show_percentage": "Показывать проценты",
"layout": {
"tile": "Плитка (компактно)",
"detail": "Подробно (расширенный)",
"glance": "Обзор (несколько устройств)"
},
"btn": {
"pause": "Пауза",
"resume": "Продолжить",
"terminate": "Завершить цикл",
"record_start": "Начать запись",
"record_stop": "Остановить запись",
"program": "Программа",
"open_panel": "Открыть WashData"
},
"editor": {
"layout": "Макет",
"entity": "Объект прибора",
"entities": "Приборы",
"title": "Заголовок",
"icon": "Значок",
"show_state": "Показывать состояние",
"show_program": "Показывать программу",
"show_progress_bar": "Показывать индикатор прогресса",
"spin_icon": "Вращать значок во время работы",
"display_mode": "Строка деталей",
"active_color": "Переопределение активного цвета",
"show_phase": "Показывать фазу",
"show_energy": "Показывать энергию и стоимость",
"show_anomaly": "Показывать предупреждение о превышении",
"show_sparkline": "Показывать график мощности в реальном времени",
"buttons": "Кнопки действий",
"program_entity": "Объект программы (переопределение)",
"time_entity": "Объект времени (переопределение)",
"pct_entity": "Объект прогресса (переопределение)",
"power_entity": "Объект мощности (переопределение)",
"tap_action": "Действие по нажатию",
"hold_action": "Действие по удержанию",
"double_tap_action": "Действие по двойному нажатию"
}
},
"badge": { "badge": {
"artifact_tip": "Обнаружено {n} аномалий (например, дверь открылась в середине цикла) – откройте, чтобы увидеть их на графике", "artifact_tip": "Обнаружено {n} аномалий (например, дверь открылась в середине цикла) – откройте, чтобы увидеть их на графике",
"auto": "(авто-определение)", "auto": "(авто-определение)",
@@ -64,6 +112,21 @@
"discard": "Отменить", "discard": "Отменить",
"discard_tip": "Отменить запись без сохранения", "discard_tip": "Отменить запись без сохранения",
"dismiss": "Закрыть", "dismiss": "Закрыть",
"mute_suggestion": "Не предлагать эту настройку",
"pg_load_calibrated": "Загрузить откалиброванные (ML) ({n})",
"pg_load_calibrated_tip": "Загрузить откалиброванные ML настройки как переопределения в песочнице",
"pg_load_live": "Загрузить активные настройки",
"pg_load_live_tip": "Перечитать текущие настройки интеграции и отменить все изменения в песочнице",
"pg_load_suggested": "Загрузить рекомендуемые ({n})",
"pg_load_suggested_tip": "Загрузить текущие рекомендации автонастройщика как переопределения в песочнице",
"pg_preset_delete": "Удалить пресет",
"pg_preset_load": "Загрузить пресет",
"pg_preset_load_tip": "Заменить значения в песочнице этим пресетом (активные настройки не изменятся)",
"pg_preset_save": "Сохранить как пресет",
"pg_preset_save_tip": "Сохранить все значения ниже как именованный пресет для этого устройства",
"pg_publish_all": "Сохранить в настройки ({n})",
"pg_publish_one": "Сохранить «{label}» в настройки интеграции",
"reset_muted": "Сбросить заглушённые",
"done": "Готово", "done": "Готово",
"edit": "Редактировать", "edit": "Редактировать",
"export": "Экспортировать", "export": "Экспортировать",
@@ -275,6 +338,7 @@
"no_automations": "Пока нет автоматизаций, ссылающихся на это устройство.", "no_automations": "Пока нет автоматизаций, ссылающихся на это устройство.",
"panel_settings": "Настройки панели", "panel_settings": "Настройки панели",
"param_sweep": "Перебор параметра", "param_sweep": "Перебор параметра",
"pg_settings_source": "Источник настроек",
"phase_catalog": "Каталог фаз", "phase_catalog": "Каталог фаз",
"playground": "Песочница", "playground": "Песочница",
"process_history": "История процессов", "process_history": "История процессов",
@@ -348,6 +412,7 @@
"default_access_level": "Уровень доступа по умолчанию для пользователей, не указанных ниже", "default_access_level": "Уровень доступа по умолчанию для пользователей, не указанных ниже",
"default_other": "По умолчанию (другие устройства)", "default_other": "По умолчанию (другие устройства)",
"default_tab": "Вкладка по умолчанию при открытии панели", "default_tab": "Вкладка по умолчанию при открытии панели",
"font_size": "Размер шрифта панели",
"delta": "Δ", "delta": "Δ",
"description": "Описание", "description": "Описание",
"dtw_blend_w": "Вес смешивания", "dtw_blend_w": "Вес смешивания",
@@ -415,6 +480,9 @@
"pg_match_score": "Оценка совпадения", "pg_match_score": "Оценка совпадения",
"pg_pct_of": "{p}% из {total}", "pg_pct_of": "{p}% из {total}",
"pg_poor_match": "Плохое совпадение", "pg_poor_match": "Плохое совпадение",
"pg_preset": "Пресет песочницы",
"pg_preset_name": "Имя нового пресета",
"pg_preset_none": "Выберите пресет…",
"pg_strong_match": "Сильное совпадение", "pg_strong_match": "Сильное совпадение",
"pg_tile_ambiguous": "Неоднозначно", "pg_tile_ambiguous": "Неоднозначно",
"pg_tile_ambiguous_tip": "Циклы с почти равным совпадением двух программ", "pg_tile_ambiguous_tip": "Циклы с почти равным совпадением двух программ",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Применить лучшее значение: {label} = {value}?", "pg_apply_confirm": "Применить лучшее значение: {label} = {value}?",
"pg_canvas_empty": "Выберите цикл выше, затем нажмите «Загрузить», чтобы увидеть его график мощности.", "pg_canvas_empty": "Выберите цикл выше, затем нажмите «Загрузить», чтобы увидеть его график мощности.",
"pg_chart_caption": "Доля обнаружения/совпадения по значениям {param}", "pg_chart_caption": "Доля обнаружения/совпадения по значениям {param}",
"pg_ctrl_intro": "Значения берутся из активных настроек интеграции для этого устройства. Изменения остаются в песочнице, пока вы не сохраните их в настройки.",
"pg_live_unavailable": "Активные настройки недоступны, показаны значения по умолчанию.",
"pg_load_live_confirm": "Отменить изменения в песочнице ({n}) и загрузить текущие настройки интеграции?",
"pg_match_rate": "{pct}% совпадений на {total} циклах", "pg_match_rate": "{pct}% совпадений на {total} циклах",
"pg_matches_live": "Совпадает с активными настройками",
"pg_n_changed": "Отличий от активных настроек: {n}",
"pg_sugg_none": "Все рекомендации уже соответствуют текущим настройкам",
"pg_preset_delete_confirm": "Удалить пресет «{name}»?",
"pg_preset_limit": "Достигнут предел числа пресетов ({n})",
"pg_preset_overwrite": "Перезаписать пресет «{name}»?",
"pg_publish_one_confirm": "Сохранить {label} = {value} в настройки этого устройства?",
"pg_restart_note": "Перезапустите Home Assistant, чтобы включить инструменты симуляции.", "pg_restart_note": "Перезапустите Home Assistant, чтобы включить инструменты симуляции.",
"pg_sim_progress": "{done} / {total} циклов", "pg_sim_progress": "{done} / {total} циклов",
"pg_starting": "Запуск…", "pg_starting": "Запуск…",
@@ -789,6 +867,7 @@
"preferences_admin": "Настройки, панель и управление доступом", "preferences_admin": "Настройки, панель и управление доступом",
"preferences_adv": "Настройки", "preferences_adv": "Настройки",
"prefs_personal": "Применяются только к вашей учётной записи Home Assistant.", "prefs_personal": "Применяются только к вашей учётной записи Home Assistant.",
"font_size_hint": "Сделайте всё на этой панели крупнее или мельче. Применяется к вашей учётной записи на этом устройстве.",
"process_history_hint": "Повторно запустите сопоставление для всех сохранённых циклов, обновите предложения по настройке, переобучите модели ML (если включено) и пересчитайте качество циклов. Запускайте после пакетного просмотра.", "process_history_hint": "Повторно запустите сопоставление для всех сохранённых циклов, обновите предложения по настройке, переобучите модели ML (если включено) и пересчитайте качество циклов. Запускайте после пакетного просмотра.",
"profile_deleted": "Профиль удалён", "profile_deleted": "Профиль удалён",
"profile_poor_health_detail": "Циклы, назначенные этому профилю, имеют непоследовательную форму или низкую достоверность. Рассмотрите возможность восстановления конверта или пересмотра помеченных циклов.", "profile_poor_health_detail": "Циклы, назначенные этому профилю, имеют непоследовательную форму или низкую достоверность. Рассмотрите возможность восстановления конверта или пересмотра помеченных циклов.",
@@ -821,6 +900,10 @@
"split_intro": "Нажмите на график, чтобы добавить или удалить точку разбивки, или авто-определите по паузам. Каждый результирующий сегмент может получить свой профиль.", "split_intro": "Нажмите на график, чтобы добавить или удалить точку разбивки, или авто-определите по паузам. Каждый результирующий сегмент может получить свой профиль.",
"storage_diagnostics": "Статистика хранилища, обслуживание, экспорт/импорт", "storage_diagnostics": "Статистика хранилища, обслуживание, экспорт/импорт",
"sug_staged": "Установлено {key} = {val}. Сохраните для применения.", "sug_staged": "Установлено {key} = {val}. Сохраните для применения.",
"sug_muted": "Эта настройка больше не будет предлагаться",
"sug_mute_failed": "Не удалось заглушить предложение",
"sug_unmuted_all": "Заглушённые предложения сброшены",
"n_suggestions_muted": "{count} заглушено; авто-настройщик не будет предлагать их.",
"toast_auto_detect_enabled": "Автоопределение включено", "toast_auto_detect_enabled": "Автоопределение включено",
"toast_auto_label_complete": "Автоматическая маркировка завершена", "toast_auto_label_complete": "Автоматическая маркировка завершена",
"toast_auto_label_failed": "Автоматическая маркировка не выполнена: {error}", "toast_auto_label_failed": "Автоматическая маркировка не выполнена: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Тенденция к сокращению продолжительности ({pct}%/цикл) – среднее значение за последнее время {avg}", "trend_duration_shorter": "Тенденция к сокращению продолжительности ({pct}%/цикл) – среднее значение за последнее время {avg}",
"trend_energy_down": "Тенденция к снижению энергопотребления ({pct}%/цикл)", "trend_energy_down": "Тенденция к снижению энергопотребления ({pct}%/цикл)",
"trend_energy_up": "Тенденция роста энергопотребления ({pct}%/цикл) – последнее среднее значение {avg}", "trend_energy_up": "Тенденция роста энергопотребления ({pct}%/цикл) – последнее среднее значение {avg}",
"trim_destructive_confirm": "Останется только {pct}% цикла, и это действие нельзя отменить. Продолжить?",
"trim_intro": "Перетащите красные маркеры или введите значения. Всё за пределами окна удаляется.", "trim_intro": "Перетащите красные маркеры или введите значения. Всё за пределами окна удаляется.",
"tuning_suggestions_available": "{count} предложение по настройке, доступное из наблюдаемых циклов. Они появляются рядом с соответствующими полями.", "tuning_suggestions_available": "{count} предложение по настройке, доступное из наблюдаемых циклов. Они появляются рядом с соответствующими полями.",
"unsure_detected_prefix": "WashData не уверен, что обнаружил", "unsure_detected_prefix": "WashData не уверен, что обнаружил",
@@ -970,6 +1054,10 @@
"unusable": "Непригодный" "unusable": "Непригодный"
}, },
"section": { "section": {
"dishwasher": {
"intro": "Обработка завершения цикла для посудомоечных машин, которые обычно заканчиваются длительной фазой сушки почти без потребления энергии перед коротким финальным сливом.",
"label": "Посудомоечная машина"
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Режим защиты от морщин определяет короткие импульсы вращения барабана на малой мощности после основной фазы и сохраняет их привязанными к завершённому циклу.", "intro": "Режим защиты от морщин определяет короткие импульсы вращения барабана на малой мощности после основной фазы и сохраняет их привязанными к завершённому циклу.",
"label": "Защита от морщин" "label": "Защита от морщин"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"doc": "После того как цикл превышает ожидаемую продолжительность, сколько времени посудомоечная машина должна оставаться неактивной (ниже «Порог Остановки»), прежде чем WashData прекратит ждать финальный слив и завершит цикл. Увеличьте значение, если у вашей машины длительная тихая фаза сушки перед поздним финальным сливом, который пропускается - более широкое окно позволяет изученной продолжительности следовать за сезонными изменениями (более холодная входящая вода = более длинные циклы), а не фиксироваться на старом среднем значении. Оно только сокращает ожидание относительно внутреннего 30-минутного лимита ожидания завершающего всплеска (откачки воды), но никогда не увеличивает его.",
"label": "Тихое завершение пассивной сушки"
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Распознавайте короткие импульсы низкой мощности, которые сушильная машина излучает после основной фазы нагрева, и сохраняйте их привязанными к завершенному циклу, а не воспринимайте их как новые циклы.", "doc": "Распознавайте короткие импульсы низкой мощности, которые сушильная машина излучает после основной фазы нагрева, и сохраняйте их привязанными к завершенному циклу, а не воспринимайте их как новые циклы.",
"label": "Включить Защиту от Морщин" "label": "Включить Защиту от Морщин"
@@ -1232,6 +1324,10 @@
"doc": "Через несколько минут после окончания цикла перед отправкой все еще ожидающего напоминания «разгрузить машину». Установите 0, чтобы отключить напоминание.", "doc": "Через несколько минут после окончания цикла перед отправкой все еще ожидающего напоминания «разгрузить машину». Установите 0, чтобы отключить напоминание.",
"label": "Задержка Напоминания о Выгрузке" "label": "Задержка Напоминания о Выгрузке"
}, },
"notify_unload_repeat": {
"doc": "Продолжает отправлять напоминание о выгрузке каждые \"Задержка Напоминания о Выгрузке\" минут, пока вы не откроете дверцу или не нажмёте \"Не напоминать\" в уведомлении. Требуется Объект Датчика Дверцы (как и для самого напоминания). Кнопка отклонения работает в уведомлениях мобильного приложения Home Assistant (companion).",
"label": "Повторять, пока не откроется дверца"
},
"off_delay": { "off_delay": {
"doc": "Время ожидания после отключения питания, прежде чем объявить цикл завершенным. Если подача электроэнергии возобновится в пределах этого окна, цикл продолжится плавно – это устраняет паузы между этапами стирки. Посудомоечные машины имеют длительные фазы сушки (отключение питания на 20–60 минут), поэтому задержка выключения должна превышать это значение, чтобы вся стирка+сушка выполнялась как один цикл.", "doc": "Время ожидания после отключения питания, прежде чем объявить цикл завершенным. Если подача электроэнергии возобновится в пределах этого окна, цикл продолжится плавно – это устраняет паузы между этапами стирки. Посудомоечные машины имеют длительные фазы сушки (отключение питания на 20–60 минут), поэтому задержка выключения должна превышать это значение, чтобы вся стирка+сушка выполнялась как один цикл.",
"label": "Задержка Выключения" "label": "Задержка Выключения"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Резкость энергии", "label": "Резкость энергии",
"doc": "Резкость штрафа за несоответствие энергии на Этапе 4. Меньше = строже: несоответствие энергии сильнее снижает балл. Значение по умолчанию 0,25 намеренно мягче, чем Резкость длительности, поскольку энергия варьируется с нагрузкой. Используйте вместе с Весом энергии." "doc": "Резкость штрафа за несоответствие энергии на Этапе 4. Меньше = строже: несоответствие энергии сильнее снижает балл. Значение по умолчанию 0,25 намеренно мягче, чем Резкость длительности, поскольку энергия варьируется с нагрузкой. Используйте вместе с Весом энергии."
},
"power_profile_interval_min": {
"label": "Интервал профиля мощности",
"doc": "Размер ячейки для атрибута датчика power_profile на профиль (плоский массив средних ватт по слотам), используемого внешними планировщиками, такими как EMHASS и tibber_prices. Меньшие ячейки сохраняют чёткость коротких пиков мощности; большие ячейки сглаживают форму. По умолчанию 15 мин. Только при считывании; не влияет на обнаружение."
},
"notify_live_sticky": {
"label": "Сохранять живое уведомление при нажатии",
"doc": "Только для Android. Сделать уведомление о ходе выполнения постоянным (закреплённым), чтобы нажатие не скрывало его. Выключено сохраняет поведение по умолчанию, при котором нажатие скрывает уведомление."
},
"notify_live_click_action": {
"label": "Цель нажатия живого уведомления",
"doc": "Только для Android. Куда открывается нажатие на уведомление о ходе выполнения (например, /lovelace/laundry или полный URL) вместо стартовой страницы приложения. Оставьте пустым для поведения по умолчанию."
},
"door_opens_at_end": {
"label": "Дверца открывается автоматически в конце",
"doc": "Для посудомоечных машин, которые открывают дверцу в конце цикла для сушки (AirDry и аналогичные). При включении открытие дверцы во время работающего цикла больше не ставит его на паузу навсегда; вместо этого, если дверца остаётся открытой в течение времени выдержки ниже, WashData считает цикл завершённым. Кратковременное открытие (для загрузки посуды) игнорируется. Требуется объект датчика двери."
},
"door_end_dwell_seconds": {
"label": "Выдержка при открытой дверце",
"doc": "Как долго дверца должна оставаться открытой до завершения цикла, когда включено \"Дверца открывается автоматически в конце\". Достаточно долго, чтобы игнорировать быструю загрузку посуды (по умолчанию 60 с), достаточно коротко для быстрого завершения после открытия дверцы машиной."
} }
}, },
"setting_group": { "setting_group": {
@@ -1576,6 +1692,10 @@
"name_required": "Требуется имя", "name_required": "Требуется имя",
"no_split_found": "Пауз для разбивки не найдено", "no_split_found": "Пауз для разбивки не найдено",
"panel_settings_saved": "Настройки панели сохранены", "panel_settings_saved": "Настройки панели сохранены",
"pg_preset_loaded": "Пресет «{name}» загружен",
"pg_preset_saved": "Пресет «{name}» сохранён",
"pg_sugg_loaded": "Загружено {n} рекомендуемых значений - запустите песочницу для сравнения",
"pg_sugg_ml_loaded": "Загружено {n} откалиброванных ML значений - запустите песочницу для сравнения",
"phase_name_required": "Требуется имя фазы", "phase_name_required": "Требуется имя фазы",
"phase_updated": "Фаза обновлена", "phase_updated": "Фаза обновлена",
"phases_saved": "Фазы сохранены", "phases_saved": "Фазы сохранены",
@@ -1723,6 +1843,7 @@
"min_active": "На основе минимальной активной мощности ({min}W), зафиксированной в последнем цикле.", "min_active": "На основе минимальной активной мощности ({min}W), зафиксированной в последнем цикле.",
"min_duration_ratio": "Оставлено как можно ниже, чтобы программа распознавалась в начале цикла; пороги уверенности и неоднозначности предотвращают преждевременные подтверждения.", "min_duration_ratio": "Оставлено как можно ниже, чтобы программа распознавалась в начале цикла; пороги уверенности и неоднозначности предотвращают преждевременные подтверждения.",
"min_off_gap": "На основе {gaps} наблюдаемых промежутков между циклами (p05={p05}s). Минимум устройства: {floor}s.", "min_off_gap": "На основе {gaps} наблюдаемых промежутков между циклами (p05={p05}s). Минимум устройства: {floor}s.",
"min_off_gap_bridge": "Рассчитано так, чтобы перекрыть самый длинный тихий участок внутри цикла: {span}s + запас 60s, по {spans} перекрытым промежуткам за {cycles} корректных циклов (остаётся ниже вашего наименьшего промежутка между двумя запусками подряд, который составляет {ceiling}s).",
"min_power": "40% от наименьшей активной мощности p05 ({p05}W) по {cycles} корректным циклам, чтобы порог отключения оставался ниже реального потребления.{excl}", "min_power": "40% от наименьшей активной мощности p05 ({p05}W) по {cycles} корректным циклам, чтобы порог отключения оставался ниже реального потребления.{excl}",
"ml_auto_label": "Наименьшая уверенность, при которой модель качества всё ещё считала цикл корректным (p10 по {cycles} корректным циклам = {p10}).", "ml_auto_label": "Наименьшая уверенность, при которой модель качества всё ещё считала цикл корректным (p10 по {cycles} корректным циклам = {p10}).",
"ml_end_repeat": "{false}/{total} циклов ({pct}%) имели паузу, которую детектор завершения оценил выше 50%; требуется {val} подтверждение(й) завершения.", "ml_end_repeat": "{false}/{total} циклов ({pct}%) имели паузу, которую детектор завершения оценил выше 50%; требуется {val} подтверждение(й) завершения.",
@@ -1739,7 +1860,7 @@
"thr_batch": "Оставлено чуть выше наименьшей активной мощности p05 по {cycles} циклам ({p05}W), чтобы запуск фиксировался как можно раньше, а порог остановки оставался ниже минимальной рабочей мощности машины.", "thr_batch": "Оставлено чуть выше наименьшей активной мощности p05 по {cycles} циклам ({p05}W), чтобы запуск фиксировался как можно раньше, а порог остановки оставался ниже минимальной рабочей мощности машины.",
"tol_per_profile": "p75 разброса длительности по профилям среди {profiles} профилей ({cycles} циклов); стабильные профили не штрафуются.", "tol_per_profile": "p75 разброса длительности по профилям среди {profiles} профилей ({cycles} циклов); стабильные профили не штрафуются.",
"tol_pooled": "На основе объединённого разброса длительности {cycles} недавних размеченных циклов (отклонение p95={dev}).", "tol_pooled": "На основе объединённого разброса длительности {cycles} недавних размеченных циклов (отклонение p95={dev}).",
"watchdog": "Оставлено настолько низким, насколько это безопасно (3x интервал обновления p95, равный {p95}s, мин. 30s), чтобы зависания выявлялись быстро без ложных остановок." "watchdog": "Оставлено настолько низким, насколько это безопасно (чуть выше интервала обновления p95, равного {p95}s, мин. 30s), чтобы зависания выявлялись быстро без ложных остановок."
}, },
"exclusions": { "exclusions": {
"summary": "Исключено {total} ошибочно определённых циклов: {parts}.", "summary": "Исключено {total} ошибочно определённых циклов: {parts}.",
@@ -1770,6 +1891,7 @@
"other": "Другое" "other": "Другое"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Посудомоечная машина: секунды неактивности после ожидаемой длительности перед снятием ожидания финального слива в конце цикла",
"completion_min_seconds": "Кратчайший запуск, считающийся настоящим циклом", "completion_min_seconds": "Кратчайший запуск, считающийся настоящим циклом",
"end_repeat_count": "Сколько низких показаний подряд до завершения", "end_repeat_count": "Сколько низких показаний подряд до завершения",
"interrupted_min_seconds": "Короткие циклы помечаются как прерванные", "interrupted_min_seconds": "Короткие циклы помечаются как прерванные",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entita sa nenašla",
"running_long": "Beží dlho",
"remaining": "zostáva",
"progress": "postup",
"show_time_remaining": "Zobraziť zostávajúci čas",
"show_percentage": "Zobraziť percentá",
"layout": {
"tile": "Dlaždica (kompaktná)",
"detail": "Detail (podrobný)",
"glance": "Prehľad (viac zariadení)"
},
"btn": {
"pause": "Pozastaviť",
"resume": "Pokračovať",
"terminate": "Ukončiť cyklus",
"record_start": "Spustiť záznam",
"record_stop": "Zastaviť záznam",
"program": "Program",
"open_panel": "Otvoriť WashData"
},
"editor": {
"layout": "Rozloženie",
"entity": "Entita spotrebiča",
"entities": "Spotrebiče",
"title": "Názov",
"icon": "Ikona",
"show_state": "Zobraziť stav",
"show_program": "Zobraziť program",
"show_progress_bar": "Zobraziť ukazovateľ postupu",
"spin_icon": "Otáčať ikonu počas behu",
"display_mode": "Riadok s detailmi",
"active_color": "Prepísanie aktívnej farby",
"show_phase": "Zobraziť fázu",
"show_energy": "Zobraziť energiu a náklady",
"show_anomaly": "Zobraziť varovanie o prekročení",
"show_sparkline": "Zobraziť živý graf výkonu",
"buttons": "Akčné tlačidlá",
"program_entity": "Entita programu (prepísanie)",
"time_entity": "Entita času (prepísanie)",
"pct_entity": "Entita postupu (prepísanie)",
"power_entity": "Entita výkonu (prepísanie)",
"tap_action": "Akcia ťuknutia",
"hold_action": "Akcia podržania",
"double_tap_action": "Akcia dvojitého ťuknutia"
}
},
"badge": { "badge": {
"artifact_tip": "Zistilo sa {n} anomálií (napr. dvere otvorené uprostred cyklu) otvorte ich, aby ste ich videli na grafe", "artifact_tip": "Zistilo sa {n} anomálií (napr. dvere otvorené uprostred cyklu) otvorte ich, aby ste ich videli na grafe",
"auto": "(automaticky zistené)", "auto": "(automaticky zistené)",
@@ -64,6 +112,21 @@
"discard": "Zahodiť", "discard": "Zahodiť",
"discard_tip": "Zahodiť zaznamenaný priebeh bez uloženia", "discard_tip": "Zahodiť zaznamenaný priebeh bez uloženia",
"dismiss": "Zamietnuť", "dismiss": "Zamietnuť",
"mute_suggestion": "Prestať navrhovať toto nastavenie",
"pg_load_calibrated": "Načítať kalibrované (ML) ({n})",
"pg_load_calibrated_tip": "Načítať nastavenia kalibrované ML ako prepísania v testovacom prostredí",
"pg_load_live": "Načítať aktívne nastavenia",
"pg_load_live_tip": "Znovu načítať aktuálne nastavenia integrácie a zahodiť všetky úpravy v testovacom prostredí",
"pg_load_suggested": "Načítať navrhované ({n})",
"pg_load_suggested_tip": "Načítať aktuálne návrhy automatického ladenia ako prepísania v testovacom prostredí",
"pg_preset_delete": "Odstrániť prednastavenie",
"pg_preset_load": "Načítať prednastavenie",
"pg_preset_load_tip": "Nahradiť hodnoty v testovacom prostredí týmto prednastavením (aktívne nastavenia zostanú bez zmeny)",
"pg_preset_save": "Uložiť ako prednastavenie",
"pg_preset_save_tip": "Uložiť všetky hodnoty nižšie ako pomenované prednastavenie pre toto zariadenie",
"pg_publish_all": "Uložiť do integrácie ({n})",
"pg_publish_one": "Uložiť {label} do integrácie",
"reset_muted": "Obnoviť stíšené",
"done": "Hotovo", "done": "Hotovo",
"edit": "Upraviť", "edit": "Upraviť",
"export": "Exportovať", "export": "Exportovať",
@@ -275,6 +338,7 @@
"no_automations": "Žiadne automatizácie zatiaľ neodkazujú na toto zariadenie.", "no_automations": "Žiadne automatizácie zatiaľ neodkazujú na toto zariadenie.",
"panel_settings": "Nastavenia panela", "panel_settings": "Nastavenia panela",
"param_sweep": "Prehľadávanie parametra", "param_sweep": "Prehľadávanie parametra",
"pg_settings_source": "Zdroj nastavení",
"phase_catalog": "Katalóg fáz", "phase_catalog": "Katalóg fáz",
"playground": "Testovacie prostredie", "playground": "Testovacie prostredie",
"process_history": "História procesov", "process_history": "História procesov",
@@ -348,6 +412,7 @@
"default_access_level": "Predvolená úroveň pre používateľov, ktorí nie sú uvedení nižšie", "default_access_level": "Predvolená úroveň pre používateľov, ktorí nie sú uvedení nižšie",
"default_other": "Predvolené (iné zariadenia)", "default_other": "Predvolené (iné zariadenia)",
"default_tab": "Predvolená karta pri otváraní panela", "default_tab": "Predvolená karta pri otváraní panela",
"font_size": "Veľkosť písma panela",
"delta": "Δ", "delta": "Δ",
"description": "Popis", "description": "Popis",
"dtw_blend_w": "Váha zmiešania", "dtw_blend_w": "Váha zmiešania",
@@ -415,6 +480,9 @@
"pg_match_score": "Skóre zhody", "pg_match_score": "Skóre zhody",
"pg_pct_of": "{p}% z {total}", "pg_pct_of": "{p}% z {total}",
"pg_poor_match": "Zlá zhoda", "pg_poor_match": "Zlá zhoda",
"pg_preset": "Prednastavenie testovacieho prostredia",
"pg_preset_name": "Názov nového prednastavenia",
"pg_preset_none": "Vyberte prednastavenie…",
"pg_strong_match": "Silná zhoda", "pg_strong_match": "Silná zhoda",
"pg_tile_ambiguous": "Nejednoznačné", "pg_tile_ambiguous": "Nejednoznačné",
"pg_tile_ambiguous_tip": "Cykly s takmer rovnakým výsledkom medzi dvoma programami", "pg_tile_ambiguous_tip": "Cykly s takmer rovnakým výsledkom medzi dvoma programami",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Použiť najlepšiu hodnotu: {label} = {value}?", "pg_apply_confirm": "Použiť najlepšiu hodnotu: {label} = {value}?",
"pg_canvas_empty": "Vyberte cyklus vyššie a potom stlačte Načítať na zobrazenie jeho priebehu výkonu.", "pg_canvas_empty": "Vyberte cyklus vyššie a potom stlačte Načítať na zobrazenie jeho priebehu výkonu.",
"pg_chart_caption": "Miera detekcie/zhody v závislosti od hodnôt {param}", "pg_chart_caption": "Miera detekcie/zhody v závislosti od hodnôt {param}",
"pg_ctrl_intro": "Hodnoty vychádzajú z aktívnych nastavení integrácie pre toto zariadenie. Úpravy zostávajú v testovacom prostredí, kým ich neuložíte do integrácie.",
"pg_live_unavailable": "Aktívne nastavenia nie sú k dispozícii, zobrazujú sa predvolené hodnoty.",
"pg_load_live_confirm": "Zahodiť úpravy v testovacom prostredí ({n}) a znovu načítať aktuálne nastavenia integrácie?",
"pg_match_rate": "{pct}% miera zhody na {total} cykloch", "pg_match_rate": "{pct}% miera zhody na {total} cykloch",
"pg_matches_live": "Zhoduje sa s aktívnymi nastaveniami",
"pg_n_changed": "Zmenené oproti aktívnym nastaveniam: {n}",
"pg_sugg_none": "Všetky návrhy sa už zhodujú s aktuálnymi nastaveniami",
"pg_preset_delete_confirm": "Odstrániť prednastavenie \"{name}\"?",
"pg_preset_limit": "Dosiahnutý limit prednastavení ({n})",
"pg_preset_overwrite": "Prepísať prednastavenie \"{name}\"?",
"pg_publish_one_confirm": "Uložiť {label} = {value} do nastavení tohto zariadenia?",
"pg_restart_note": "Reštartujte Home Assistant, aby ste povolili nástroje simulácie.", "pg_restart_note": "Reštartujte Home Assistant, aby ste povolili nástroje simulácie.",
"pg_sim_progress": "{done} / {total} cyklov", "pg_sim_progress": "{done} / {total} cyklov",
"pg_starting": "Spúšťanie…", "pg_starting": "Spúšťanie…",
@@ -789,6 +867,7 @@
"preferences_admin": "Predvoľby, panel a kontrola prístupu", "preferences_admin": "Predvoľby, panel a kontrola prístupu",
"preferences_adv": "Predvoľby", "preferences_adv": "Predvoľby",
"prefs_personal": "Platí iba pre váš účet Home Assistant.", "prefs_personal": "Platí iba pre váš účet Home Assistant.",
"font_size_hint": "Zväčšite alebo zmenšite všetko v tomto paneli. Platí pre váš účet na tomto zariadení.",
"process_history_hint": "Znova spustite párovanie pre všetky uložené cykly, obnovte návrhy ladenia, preškolte modely ML (ak sú povolené) a prepočítajte zdravie cyklov. Spustite po sérii recenzií.", "process_history_hint": "Znova spustite párovanie pre všetky uložené cykly, obnovte návrhy ladenia, preškolte modely ML (ak sú povolené) a prepočítajte zdravie cyklov. Spustite po sérii recenzií.",
"profile_deleted": "Profil odstránený", "profile_deleted": "Profil odstránený",
"profile_poor_health_detail": "Cykly priradené k tomuto profilu majú nekonzistentný tvar alebo nízku spoľahlivosť. Zvážte prestavbu obálky alebo kontrolu cyklov s označením.", "profile_poor_health_detail": "Cykly priradené k tomuto profilu majú nekonzistentný tvar alebo nízku spoľahlivosť. Zvážte prestavbu obálky alebo kontrolu cyklov s označením.",
@@ -821,6 +900,10 @@
"split_intro": "Kliknite na graf a pridajte alebo odstráňte bod rozdelenia, alebo automaticky zistite nečinné medzery. Každý výsledný segment môže mať vlastný profil.", "split_intro": "Kliknite na graf a pridajte alebo odstráňte bod rozdelenia, alebo automaticky zistite nečinné medzery. Každý výsledný segment môže mať vlastný profil.",
"storage_diagnostics": "Štatistiky úložiska, údržba, export/import", "storage_diagnostics": "Štatistiky úložiska, údržba, export/import",
"sug_staged": "Nastavené {key} = {val}. Uložte pre použitie.", "sug_staged": "Nastavené {key} = {val}. Uložte pre použitie.",
"sug_muted": "Toto nastavenie sa už nebude navrhovať",
"sug_mute_failed": "Nastavenie sa nepodarilo stíšiť",
"sug_unmuted_all": "Stíšené návrhy obnovené",
"n_suggestions_muted": "{count} stíšených; automatický ladiaci nástroj tieto nastavenia nebude navrhovať.",
"toast_auto_detect_enabled": "Automatická detekcia zapnutá", "toast_auto_detect_enabled": "Automatická detekcia zapnutá",
"toast_auto_label_complete": "Automatické označovanie dokončené", "toast_auto_label_complete": "Automatické označovanie dokončené",
"toast_auto_label_failed": "Automatické označovanie zlyhalo: {error}", "toast_auto_label_failed": "Automatické označovanie zlyhalo: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Trvanie je kratšie ({pct} %/cyklus) posledný priemer {avg}", "trend_duration_shorter": "Trvanie je kratšie ({pct} %/cyklus) posledný priemer {avg}",
"trend_energy_down": "Energetický trend klesá ({pct} %/cyklus)", "trend_energy_down": "Energetický trend klesá ({pct} %/cyklus)",
"trend_energy_up": "Energetický trend stúpa ({pct} %/cyklus) posledný priemer {avg}", "trend_energy_up": "Energetický trend stúpa ({pct} %/cyklus) posledný priemer {avg}",
"trim_destructive_confirm": "Týmto zostane len {pct}% cyklu a túto akciu nie je možné vrátiť späť. Pokračovať?",
"trim_intro": "Potiahnite červené rukoväti alebo zadajte hodnoty. Všetko mimo okna sa odstráni.", "trim_intro": "Potiahnite červené rukoväti alebo zadajte hodnoty. Všetko mimo okna sa odstráni.",
"tuning_suggestions_available": "{count} návrh ladenia dostupný z pozorovaných cyklov. Zobrazujú sa vedľa príslušných polí.", "tuning_suggestions_available": "{count} návrh ladenia dostupný z pozorovaných cyklov. Zobrazujú sa vedľa príslušných polí.",
"unsure_detected_prefix": "WashData si nie je istý, či zistil", "unsure_detected_prefix": "WashData si nie je istý, či zistil",
@@ -970,6 +1054,10 @@
"unusable": "Nepoužiteľný" "unusable": "Nepoužiteľný"
}, },
"section": { "section": {
"dishwasher": {
"label": "Umývačka riadu",
"intro": "Spracovanie konca cyklu pre umývačky riadu, ktoré zvyčajne končia dlhou takmer tichou fázou sušenia pred krátkym záverečným odčerpaním vody."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Režim ochrany pred krčením tkaniny deteguje pulzy tumblingu pri nízkej spotrebe po hlavnej fáze a udržuje ich priradené k dokončenému cyklu.", "intro": "Režim ochrany pred krčením tkaniny deteguje pulzy tumblingu pri nízkej spotrebe po hlavnej fáze a udržuje ich priradené k dokončenému cyklu.",
"label": "Ochrana pred krčením" "label": "Ochrana pred krčením"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Uvoľnenie po tichej fáze sušenia",
"doc": "Keď cyklus prekročí svoje očakávané trvanie, ako dlho musí umývačka zostať v pokoji (pod Prahom zastavenia), než WashData prestane čakať na záverečné odčerpanie vody a ukončí cyklus. Zvýšte hodnotu, ak má váš spotrebič dlhú tichú fázu sušenia pred neskorým záverečným odčerpaním, ktoré uniká detekcii - širšie okno umožňuje, aby naučené trvanie sledovalo sezónny posun (studenšia privádzaná voda = dlhšie cykly) namiesto toho, aby zostalo uzamknuté na starom priemere. Čakanie iba skracuje vzhľadom na interný 30-minútový limit čakania na záverečné odčerpanie, nikdy ho nepredlžuje."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Rozpoznajte krátke pulzy bubna s nízkym výkonom, ktoré sušička vydáva po hlavnej fáze ohrevu, a nechajte ich pripojené k dokončenému cyklu namiesto toho, aby ste ich čítali ako nové cykly.", "doc": "Rozpoznajte krátke pulzy bubna s nízkym výkonom, ktoré sušička vydáva po hlavnej fáze ohrevu, a nechajte ich pripojené k dokončenému cyklu namiesto toho, aby ste ich čítali ako nové cykly.",
"label": "Povoliť detekciu ochrany pred krčením" "label": "Povoliť detekciu ochrany pred krčením"
@@ -1232,6 +1324,10 @@
"doc": "Minúty po skončení cyklu pred odoslaním stále čakajúcej pripomienky „vyložiť stroj“. Ak chcete pripomienku deaktivovať, nastavte 0.", "doc": "Minúty po skončení cyklu pred odoslaním stále čakajúcej pripomienky „vyložiť stroj“. Ak chcete pripomienku deaktivovať, nastavte 0.",
"label": "Oneskorenie pripomienky vyloženia" "label": "Oneskorenie pripomienky vyloženia"
}, },
"notify_unload_repeat": {
"doc": "Znova odosiela pripomienku vyloženia každých \"Oneskorenie pripomienky vyloženia\" minút, kým neotvoríte dvere alebo v oznámení neťuknete na \"Prestať pripomínať\". Vyžaduje Entitu senzora dverí (rovnako ako samotná pripomienka). Tlačidlo na zrušenie funguje pri oznámeniach mobilnej aplikácie Home Assistant (companion app).",
"label": "Opakovať, kým sa neotvoria dvere"
},
"off_delay": { "off_delay": {
"doc": "Čas čakania po poklese napájania pred vyhlásením cyklu za ukončený. Ak sa v rámci tohto okna obnoví napájanie, cyklus plynule pokračuje premosťuje to prestávky medzi fázami umývania. Umývačky riadu majú dlhé fázy sušenia (vypnutie na 20-60 minút), takže oneskorenie vypnutia musí prekročiť túto hodnotu, aby celé umývanie + suché zostalo ako jeden cyklus.", "doc": "Čas čakania po poklese napájania pred vyhlásením cyklu za ukončený. Ak sa v rámci tohto okna obnoví napájanie, cyklus plynule pokračuje premosťuje to prestávky medzi fázami umývania. Umývačky riadu majú dlhé fázy sušenia (vypnutie na 20-60 minút), takže oneskorenie vypnutia musí prekročiť túto hodnotu, aby celé umývanie + suché zostalo ako jeden cyklus.",
"label": "Oneskorenie vypnutia" "label": "Oneskorenie vypnutia"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Ostrost energie", "label": "Ostrost energie",
"doc": "Ostrosť penalizácie za nezhodu energie vo Fáze 4. Menší = prísnejší: nezhoda energie viac znižuje skóre. Predvolená hodnota 0,25 je zámerne benevolentnejšia ako Ostrosť dĺžky trvania, pretože energia sa líši podľa záťaže. Kombinujte s Váhou energie." "doc": "Ostrosť penalizácie za nezhodu energie vo Fáze 4. Menší = prísnejší: nezhoda energie viac znižuje skóre. Predvolená hodnota 0,25 je zámerne benevolentnejšia ako Ostrosť dĺžky trvania, pretože energia sa líši podľa záťaže. Kombinujte s Váhou energie."
},
"power_profile_interval_min": {
"label": "Interval výkonového profilu",
"doc": "Veľkosť segmentu pre atribút senzora power_profile pre daný profil (plochá sada priemerných wattov za slot spotrebovaná externými plánovačmi ako EMHASS a tibber_prices). Menšie segmenty zachovávajú krátke výkonové špičky ostré; väčšie segmenty vyhladzujú tvar. Predvolene 15 min. Iba pri načítaní; neovplyvňuje detekciu."
},
"notify_live_sticky": {
"label": "Zachovať živé oznámenie po klepnutí",
"doc": "Iba Android. Živé oznámenie priebehu nastavte ako trvalé (prilepené), aby jeho klepnutím nedošlo k zavretiu prebiehajúceho vlákna. Vypnuté zachováva predvolené správanie, kde klepnutie oznámenie zavrie."
},
"notify_live_click_action": {
"label": "Cieľ klepnutia na živé oznámenie",
"doc": "Iba Android. Kam klepnutie na živé oznámenie priebehu otvorí (napr. /lovelace/laundry alebo celá URL) namiesto vstupnej stránky aplikácie. Ponechajte prázdne pre predvolené nastavenie."
},
"door_opens_at_end": {
"label": "Dvere sa na konci automaticky otvoria",
"doc": "Pre umývačky riadu, ktoré na konci cyklu otvoria dvere za účelom sušenia (AirDry a podobné). Pri zapnutej funkcii otvorenie dverí počas bežiaceho cyklu už nezastaví cyklus natrvalo; ak dvere zostanú otvorené po dobu čakania nižšie, WashData cyklus ukončí. Krátke otvorenie (pridanie predmetu) sa ignoruje. Vyžaduje entitu senzora dverí."
},
"door_end_dwell_seconds": {
"label": "Čakanie na otvorenie dverí pre ukončenie",
"doc": "Ako dlho musia dvere zostať otvorené, kým WashData ukončí cyklus, keď je zapnutá funkcia \"Dvere sa na konci automaticky otvoria\". Dostatočne dlho na ignorovanie rýchleho pridania riadu (predvolene 60 s), dostatočne krátko pre rýchle ukončenie po otvorení dverí spotrebičom."
} }
}, },
"setting_group": { "setting_group": {
@@ -1592,6 +1708,7 @@
"min_active": "Na základe minimálneho činného výkonu ({min}W) zaznamenaného v poslednom cykle.", "min_active": "Na základe minimálneho činného výkonu ({min}W) zaznamenaného v poslednom cykle.",
"min_duration_ratio": "Ponechané čo najnižšie, aby sa program rozpoznal skoro v cykle; prahy istoty a nejednoznačnosti bránia predčasnému potvrdeniu.", "min_duration_ratio": "Ponechané čo najnižšie, aby sa program rozpoznal skoro v cykle; prahy istoty a nejednoznačnosti bránia predčasnému potvrdeniu.",
"min_off_gap": "Na základe {gaps} pozorovaných medzier medzi cyklami (p05={p05}s). Minimum zariadenia: {floor}s.", "min_off_gap": "Na základe {gaps} pozorovaných medzier medzi cyklami (p05={p05}s). Minimum zariadenia: {floor}s.",
"min_off_gap_bridge": "Nastavené tak, aby preklenulo najdlhší tichý úsek vnútri cyklu: {span}s + rezerva 60s, z {spans} preklenutých medzier naprieč {cycles} čistými cyklami (zostáva pod {ceiling}s, najkratšou medzerou, ktorú necháte medzi dvoma dávkami).",
"min_power": "40% najnižšieho činného výkonu p05 ({p05}W) naprieč {cycles} čistými cyklami, aby prah vypnutia zostal pod skutočným odberom.{excl}", "min_power": "40% najnižšieho činného výkonu p05 ({p05}W) naprieč {cycles} čistými cyklami, aby prah vypnutia zostal pod skutočným odberom.{excl}",
"ml_auto_label": "Najnižšia istota, pri ktorej model kvality stále hodnotil cyklus ako čistý (p10 z {cycles} čistých cyklov = {p10}).", "ml_auto_label": "Najnižšia istota, pri ktorej model kvality stále hodnotil cyklus ako čistý (p10 z {cycles} čistých cyklov = {p10}).",
"ml_end_repeat": "{false}/{total} cyklov ({pct}%) malo pauzu, ktorú detektor konca ohodnotil nad 50%; vyžadovať {val} potvrdení konca.", "ml_end_repeat": "{false}/{total} cyklov ({pct}%) malo pauzu, ktorú detektor konca ohodnotil nad 50%; vyžadovať {val} potvrdení konca.",
@@ -1608,7 +1725,7 @@
"thr_batch": "Ponechané tesne nad najnižším činným výkonom p05 naprieč {cycles} cyklami ({p05}W), aby sa štart zachytil čo najskôr a prah zastavenia zostal pod najnižším prevádzkovým výkonom stroja.", "thr_batch": "Ponechané tesne nad najnižším činným výkonom p05 naprieč {cycles} cyklami ({p05}W), aby sa štart zachytil čo najskôr a prah zastavenia zostal pod najnižším prevádzkovým výkonom stroja.",
"tol_per_profile": "p75 rozptylu dĺžky podľa profilu naprieč {profiles} profilmi ({cycles} cyklov); konzistentné profily nie sú penalizované.", "tol_per_profile": "p75 rozptylu dĺžky podľa profilu naprieč {profiles} profilmi ({cycles} cyklov); konzistentné profily nie sú penalizované.",
"tol_pooled": "Na základe zlúčeného rozptylu dĺžky {cycles} nedávnych označených cyklov (odchýlka p95={dev}).", "tol_pooled": "Na základe zlúčeného rozptylu dĺžky {cycles} nedávnych označených cyklov (odchýlka p95={dev}).",
"watchdog": "Ponechané čo najnižšie pri zachovaní bezpečnosti (3x interval aktualizácie p95 vo výške {p95}s, min. 30s), aby sa zaseknutia rýchlo odhalili bez falošných zastavení." "watchdog": "Ponechané čo najnižšie pri zachovaní bezpečnosti (tesne nad intervalom aktualizácie p95 vo výške {p95}s, min. 30s), aby sa zaseknutia rýchlo odhalili bez falošných zastavení."
}, },
"exclusions": { "exclusions": {
"summary": "Vylúčených {total} chybne zistených cyklov: {parts}.", "summary": "Vylúčených {total} chybne zistených cyklov: {parts}.",
@@ -1688,6 +1805,10 @@
"name_required": "Názov je povinný", "name_required": "Názov je povinný",
"no_split_found": "Nenašli sa žiadne nečinné medzery na rozdelenie", "no_split_found": "Nenašli sa žiadne nečinné medzery na rozdelenie",
"panel_settings_saved": "Nastavenia panela uložené", "panel_settings_saved": "Nastavenia panela uložené",
"pg_preset_loaded": "Prednastavenie \"{name}\" načítané",
"pg_preset_saved": "Prednastavenie \"{name}\" uložené",
"pg_sugg_loaded": "Načítaných {n} navrhovaných hodnôt - spustite testovacie prostredie na porovnanie",
"pg_sugg_ml_loaded": "Načítaných {n} hodnôt kalibrovaných ML - spustite testovacie prostredie na porovnanie",
"phase_name_required": "Názov fázy je povinný", "phase_name_required": "Názov fázy je povinný",
"phase_updated": "Fáza aktualizovaná", "phase_updated": "Fáza aktualizovaná",
"phases_saved": "Fázy uložené", "phases_saved": "Fázy uložené",
@@ -1770,6 +1891,7 @@
"other": "Iné" "other": "Iné"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Umývačka: tiché sekundy po očakávanom trvaní, než sa uvoľní čakanie na záverečné odčerpanie vody",
"anti_wrinkle_enabled": "Pohltiť impulzy bubna po hlavnej fáze namiesto ich čítania ako nové cykly", "anti_wrinkle_enabled": "Pohltiť impulzy bubna po hlavnej fáze namiesto ich čítania ako nové cykly",
"anti_wrinkle_exit_power": "Výkon musí medzi impulzmi klesnúť pod túto hodnotu, aby ochrana pred krčením zostala aktívna", "anti_wrinkle_exit_power": "Výkon musí medzi impulzmi klesnúť pod túto hodnotu, aby ochrana pred krčením zostala aktívna",
"anti_wrinkle_idle_timeout": "Povolený pokoj medzi dvoma impulzmi bubna, než sa ochrana pred krčením skončí", "anti_wrinkle_idle_timeout": "Povolený pokoj medzi dvoma impulzmi bubna, než sa ochrana pred krčením skončí",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entiteta ni najdena",
"running_long": "Traja predolgo",
"remaining": "preostalo",
"progress": "napredek",
"show_time_remaining": "Pokaži preostali čas",
"show_percentage": "Pokaži odstotek",
"layout": {
"tile": "Ploščica (kompaktno)",
"detail": "Podrobno (bogato)",
"glance": "Pregled (več naprav)"
},
"btn": {
"pause": "Premor",
"resume": "Nadaljuj",
"terminate": "Končaj cikel",
"record_start": "Začni snemanje",
"record_stop": "Ustavi snemanje",
"program": "Program",
"open_panel": "Odpri WashData"
},
"editor": {
"layout": "Postavitev",
"entity": "Entiteta naprave",
"entities": "Naprave",
"title": "Naslov",
"icon": "Ikona",
"show_state": "Pokaži stanje",
"show_program": "Pokaži program",
"show_progress_bar": "Pokaži vrstico napredka",
"spin_icon": "Vrti ikono med delovanjem",
"display_mode": "Vrstica s podrobnostmi",
"active_color": "Preglasitev aktivne barve",
"show_phase": "Pokaži fazo",
"show_energy": "Pokaži energijo in strošek",
"show_anomaly": "Pokaži opozorilo o prekoračitvi",
"show_sparkline": "Pokaži graf moči v živo",
"buttons": "Gumbi za dejanja",
"program_entity": "Entiteta programa (preglasitev)",
"time_entity": "Entiteta časa (preglasitev)",
"pct_entity": "Entiteta napredka (preglasitev)",
"power_entity": "Entiteta moči (preglasitev)",
"tap_action": "Dejanje ob dotiku",
"hold_action": "Dejanje ob zadržanju",
"double_tap_action": "Dejanje ob dvojnem dotiku"
}
},
"badge": { "badge": {
"artifact_tip": "{n} zaznanih nepravilnosti (npr. odprta vrata sredi cikla) odprite, da jih vidite na grafu", "artifact_tip": "{n} zaznanih nepravilnosti (npr. odprta vrata sredi cikla) odprite, da jih vidite na grafu",
"auto": "(samodejno zaznano)", "auto": "(samodejno zaznano)",
@@ -64,6 +112,21 @@
"discard": "Zavrzi", "discard": "Zavrzi",
"discard_tip": "Zavrzi posneto sled brez shranjevanja", "discard_tip": "Zavrzi posneto sled brez shranjevanja",
"dismiss": "Zapri", "dismiss": "Zapri",
"mute_suggestion": "Prenehaj predlagati to nastavitev",
"pg_load_calibrated": "Naloži umerjene (ML) ({n})",
"pg_load_calibrated_tip": "Naloži ML-umerjene nastavitve kot nadpisane vrednosti v peskovniku",
"pg_load_live": "Naloži aktivne nastavitve",
"pg_load_live_tip": "Znova preberi trenutne nastavitve integracije in zavrzi vsa urejanja v peskovniku",
"pg_load_suggested": "Naloži predlagane ({n})",
"pg_load_suggested_tip": "Naloži predloge samodejnega uglaševanja kot nadpisane vrednosti v peskovniku",
"pg_preset_delete": "Izbriši prednastavitev",
"pg_preset_load": "Naloži prednastavitev",
"pg_preset_load_tip": "Zamenjaj vrednosti v peskovniku s to prednastavitvijo (aktivne nastavitve ostanejo nespremenjene)",
"pg_preset_save": "Shrani kot prednastavitev",
"pg_preset_save_tip": "Shrani vse spodnje vrednosti kot poimenovano prednastavitev za to napravo",
"pg_publish_all": "Shrani v integracijo ({n})",
"pg_publish_one": "Shrani {label} v integracijo",
"reset_muted": "Ponastavi utišane",
"done": "Končano", "done": "Končano",
"edit": "Uredi", "edit": "Uredi",
"export": "Izvozi", "export": "Izvozi",
@@ -275,6 +338,7 @@
"no_automations": "Nobena avtomatizacija še ne sklicuje na to napravo.", "no_automations": "Nobena avtomatizacija še ne sklicuje na to napravo.",
"panel_settings": "Nastavitve plošče", "panel_settings": "Nastavitve plošče",
"param_sweep": "Preizkušanje parametra", "param_sweep": "Preizkušanje parametra",
"pg_settings_source": "Vir nastavitev",
"phase_catalog": "Katalog faz", "phase_catalog": "Katalog faz",
"playground": "Peskovnik", "playground": "Peskovnik",
"process_history": "Zgodovina procesov", "process_history": "Zgodovina procesov",
@@ -348,6 +412,7 @@
"default_access_level": "Privzeta raven za uporabnike, ki niso navedeni spodaj", "default_access_level": "Privzeta raven za uporabnike, ki niso navedeni spodaj",
"default_other": "Privzeto (druge naprave)", "default_other": "Privzeto (druge naprave)",
"default_tab": "Privzeti zavihek pri odpiranju plošče", "default_tab": "Privzeti zavihek pri odpiranju plošče",
"font_size": "Velikost pisave plošče",
"delta": "Δ", "delta": "Δ",
"description": "Opis", "description": "Opis",
"dtw_blend_w": "Utež mešanja", "dtw_blend_w": "Utež mešanja",
@@ -415,6 +480,9 @@
"pg_match_score": "Rezultat ujemanja", "pg_match_score": "Rezultat ujemanja",
"pg_pct_of": "{p}% od {total}", "pg_pct_of": "{p}% od {total}",
"pg_poor_match": "Slabo ujemanje", "pg_poor_match": "Slabo ujemanje",
"pg_preset": "Prednastavitev peskovnika",
"pg_preset_name": "Ime nove prednastavitve",
"pg_preset_none": "Izberite prednastavitev…",
"pg_strong_match": "Močno ujemanje", "pg_strong_match": "Močno ujemanje",
"pg_tile_ambiguous": "Dvoumno", "pg_tile_ambiguous": "Dvoumno",
"pg_tile_ambiguous_tip": "Cikli s skoraj izenačenim rezultatom med dvema programoma", "pg_tile_ambiguous_tip": "Cikli s skoraj izenačenim rezultatom med dvema programoma",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Uporabim najboljšo vrednost: {label} = {value}?", "pg_apply_confirm": "Uporabim najboljšo vrednost: {label} = {value}?",
"pg_canvas_empty": "Zgoraj izberite cikel in nato pritisnite Naloži, da vidite njegov potek moči.", "pg_canvas_empty": "Zgoraj izberite cikel in nato pritisnite Naloži, da vidite njegov potek moči.",
"pg_chart_caption": "Stopnja zaznavanja/ujemanja glede na vrednosti {param}", "pg_chart_caption": "Stopnja zaznavanja/ujemanja glede na vrednosti {param}",
"pg_ctrl_intro": "Vrednosti izhajajo iz aktivnih nastavitev integracije za to napravo. Urejanja ostanejo v peskovniku, dokler jih ne shranite v integracijo.",
"pg_live_unavailable": "Aktivne nastavitve niso na voljo, prikazane so privzete vrednosti.",
"pg_load_live_confirm": "Zavržem spremembe v peskovniku ({n}) in znova naložim trenutne nastavitve integracije?",
"pg_match_rate": "{pct}% stopnja ujemanja na {total} ciklih", "pg_match_rate": "{pct}% stopnja ujemanja na {total} ciklih",
"pg_matches_live": "Ujema se z aktivnimi nastavitvami",
"pg_n_changed": "Spremenjeno glede na aktivne nastavitve: {n}",
"pg_sugg_none": "Vsi predlogi se že ujemajo s trenutnimi nastavitvami",
"pg_preset_delete_confirm": "Izbrišem prednastavitev \"{name}\"?",
"pg_preset_limit": "Dosežena omejitev prednastavitev ({n})",
"pg_preset_overwrite": "Prepišem prednastavitev \"{name}\"?",
"pg_publish_one_confirm": "Shranim {label} = {value} v nastavitve te naprave?",
"pg_restart_note": "Znova zaženite Home Assistant, da omogočite orodja simulacije.", "pg_restart_note": "Znova zaženite Home Assistant, da omogočite orodja simulacije.",
"pg_sim_progress": "{done} / {total} ciklov", "pg_sim_progress": "{done} / {total} ciklov",
"pg_starting": "Zaganjanje…", "pg_starting": "Zaganjanje…",
@@ -789,6 +867,7 @@
"preferences_admin": "Nastavitve, plošča in nadzor dostopa", "preferences_admin": "Nastavitve, plošča in nadzor dostopa",
"preferences_adv": "Nastavitve", "preferences_adv": "Nastavitve",
"prefs_personal": "Veljajo samo za vaš račun Home Assistant.", "prefs_personal": "Veljajo samo za vaš račun Home Assistant.",
"font_size_hint": "Povečajte ali pomanjšajte vse v tej plošči. Velja za vaš račun na tej napravi.",
"process_history_hint": "Znova zaženite ujemanje za vse shranjene cikle, osvežite predloge nastavljanja, znova naučite modele ML (če so omogočeni) in znova izračunajte zdravje ciklov. Zaženite po seriji pregledov.", "process_history_hint": "Znova zaženite ujemanje za vse shranjene cikle, osvežite predloge nastavljanja, znova naučite modele ML (če so omogočeni) in znova izračunajte zdravje ciklov. Zaženite po seriji pregledov.",
"profile_deleted": "Profil izbrisan", "profile_deleted": "Profil izbrisan",
"profile_poor_health_detail": "Cikli, dodeljeni temu profilu, imajo nedosledne oblike ali nizko stopnjo zaupanja. Razmislite o ponovni izdelavi ovojnice ali pregledu označenih ciklov.", "profile_poor_health_detail": "Cikli, dodeljeni temu profilu, imajo nedosledne oblike ali nizko stopnjo zaupanja. Razmislite o ponovni izdelavi ovojnice ali pregledu označenih ciklov.",
@@ -821,6 +900,10 @@
"split_intro": "Kliknite na graf, da dodate ali odstranite točko razdelitve, ali samodejno zaznajte po nedejavnih vrzelih. Vsak rezultirajoči segment lahko dobi lasten profil.", "split_intro": "Kliknite na graf, da dodate ali odstranite točko razdelitve, ali samodejno zaznajte po nedejavnih vrzelih. Vsak rezultirajoči segment lahko dobi lasten profil.",
"storage_diagnostics": "Statistike shrambe, vzdrževanje, izvoz/uvoz", "storage_diagnostics": "Statistike shrambe, vzdrževanje, izvoz/uvoz",
"sug_staged": "Nastavljeno {key} = {val}. Shranite za uveljavitev.", "sug_staged": "Nastavljeno {key} = {val}. Shranite za uveljavitev.",
"sug_muted": "Te nastavitve ne bo več predlagalo",
"sug_mute_failed": "Utišanje predloga ni uspelo",
"sug_unmuted_all": "Utišani predlogi ponastavljeni",
"n_suggestions_muted": "{count} utišanih; samodejni nastavjalnik teh nastavitev ne bo predlagal.",
"toast_auto_detect_enabled": "Samodejno zaznavanje omogočeno", "toast_auto_detect_enabled": "Samodejno zaznavanje omogočeno",
"toast_auto_label_complete": "Samodejno označevanje dokončano", "toast_auto_label_complete": "Samodejno označevanje dokončano",
"toast_auto_label_failed": "Samodejno označevanje ni uspelo: {error}", "toast_auto_label_failed": "Samodejno označevanje ni uspelo: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Trajanje se skrajšuje ({pct}%/cikel) zadnje povprečje {avg}", "trend_duration_shorter": "Trajanje se skrajšuje ({pct}%/cikel) zadnje povprečje {avg}",
"trend_energy_down": "Energija pada ({pct}%/cikel)", "trend_energy_down": "Energija pada ({pct}%/cikel)",
"trend_energy_up": "Energija narašča ({pct}%/cikel) zadnje povprečje {avg}", "trend_energy_up": "Energija narašča ({pct}%/cikel) zadnje povprečje {avg}",
"trim_destructive_confirm": "S tem ostane samo {pct}% cikla in tega dejanja ni mogoče razveljaviti. Nadaljujem?",
"trim_intro": "Povlecite rdeče ročke ali vnesite vrednosti. Vse zunaj okna se odstrani.", "trim_intro": "Povlecite rdeče ročke ali vnesite vrednosti. Vse zunaj okna se odstrani.",
"tuning_suggestions_available": "{count} predlog za nastavitev je na voljo iz opazovanih ciklov. Pojavijo se poleg ustreznih polj.", "tuning_suggestions_available": "{count} predlog za nastavitev je na voljo iz opazovanih ciklov. Pojavijo se poleg ustreznih polj.",
"unsure_detected_prefix": "WashData ni prepričan, da je zaznal", "unsure_detected_prefix": "WashData ni prepričan, da je zaznal",
@@ -970,6 +1054,10 @@
"unusable": "Neuporabno" "unusable": "Neuporabno"
}, },
"section": { "section": {
"dishwasher": {
"label": "Pomivalni stroj",
"intro": "Obravnava konca cikla za pomivalne stroje, ki se običajno končajo z dolgo, skoraj tiho fazo sušenja pred kratkim končnim izčrpavanjem vode."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Način zaščite pred gubami na oblačilih zazna kratke pulze pri nizki moči po glavni fazi in jih obdrži pripisane končanemu ciklu.", "intro": "Način zaščite pred gubami na oblačilih zazna kratke pulze pri nizki moči po glavni fazi in jih obdrži pripisane končanemu ciklu.",
"label": "Zaščita pred gubami" "label": "Zaščita pred gubami"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Sprostitev po tihi fazi sušenja",
"doc": "Ko cikel preseže svoje pričakovano trajanje, kako dolgo mora pomivalni stroj ostati tih (pod Pragom zaustavitve), preden WashData preneha čakati na končno izčrpavanje vode in zaključi cikel. Povečajte, če ima vaša naprava dolgo tiho fazo sušenja pred poznim končnim izčrpavanjem, ki ga zaznavanje spregleda - širše okno omogoča, da naučeno trajanje sledi sezonskemu premiku (hladnejša dovodna voda = daljši cikli), namesto da ostane zaklenjeno na starem povprečju. Čakanje lahko le skrajša glede na notranjo 30-minutno omejitev čakanja na končno izčrpavanje, nikoli ga ne podaljša."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Prepoznajte kratke vrtilne impulze nizke moči, ki jih oddaja sušilni stroj po glavni fazi segrevanja, in jih ohranite povezane s končanim ciklom, namesto da jih berete kot nove cikle.", "doc": "Prepoznajte kratke vrtilne impulze nizke moči, ki jih oddaja sušilni stroj po glavni fazi segrevanja, in jih ohranite povezane s končanim ciklom, namesto da jih berete kot nove cikle.",
"label": "Omogoči zaznavanje zaščite pred gubami" "label": "Omogoči zaznavanje zaščite pred gubami"
@@ -1232,6 +1324,10 @@
"doc": "Minute po koncu cikla pred pošiljanjem še vedno čakajočega opomnika \"raztovarjanje stroja\". Nastavite 0, da onemogočite opomnik.", "doc": "Minute po koncu cikla pred pošiljanjem še vedno čakajočega opomnika \"raztovarjanje stroja\". Nastavite 0, da onemogočite opomnik.",
"label": "Zamuda opomnika za raztovarjanje" "label": "Zamuda opomnika za raztovarjanje"
}, },
"notify_unload_repeat": {
"doc": "Znova pošilja opomnik za raztovarjanje vsakih \"Zamuda opomnika za raztovarjanje\" minut, dokler ne odprete vrat ali v obvestilu ne tapnete \"Nehaj opominjati\". Zahteva Entiteto senzorja vrat (tako kot sam opomnik). Gumb za opustitev deluje pri obvestilih mobilne aplikacije Home Assistant (companion app).",
"label": "Ponavljaj, dokler se vrata ne odprejo"
},
"off_delay": { "off_delay": {
"doc": "Čas za čakanje po padcu moči, preden razglasite, da je cikel končan. Če se napajanje ponovno vzpostavi v tem oknu, se cikel nemoteno nadaljuje - to premosti premore med stopnjami pranja. Pomivalni stroji imajo dolge faze sušenja (izklop za 2060 min), zato mora biti zakasnitev izklopa daljša od te, da ostane celotno pranje+sušenje kot en cikel.", "doc": "Čas za čakanje po padcu moči, preden razglasite, da je cikel končan. Če se napajanje ponovno vzpostavi v tem oknu, se cikel nemoteno nadaljuje - to premosti premore med stopnjami pranja. Pomivalni stroji imajo dolge faze sušenja (izklop za 2060 min), zato mora biti zakasnitev izklopa daljša od te, da ostane celotno pranje+sušenje kot en cikel.",
"label": "Zamuda izklopa" "label": "Zamuda izklopa"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Ostrina energije", "label": "Ostrina energije",
"doc": "Ostrina kazni za neujemanje energije na Stopnji 4. Manjše = strožje: neujemanje energije bolj znižuje oceno. Privzeta vrednost 0,25 je namerno bolj dovoljna od Ostrine trajanja, ker energija niha z obremenitvijo. Kombinirajte z Utežjo energije." "doc": "Ostrina kazni za neujemanje energije na Stopnji 4. Manjše = strožje: neujemanje energije bolj znižuje oceno. Privzeta vrednost 0,25 je namerno bolj dovoljna od Ostrine trajanja, ker energija niha z obremenitvijo. Kombinirajte z Utežjo energije."
},
"power_profile_interval_min": {
"label": "Interval profila porabe",
"doc": "Velikost segmenta za atribut senzorja power_profile za posamezni profil (ploska matrika povprečnih vatov na režo, ki jo porabijo zunanji planerji, kot sta EMHASS in tibber_prices). Manjši segmenti ohranijo kratke skoke moči ostre; večji segmenti zgladijo obliko. Privzeto 15 min. Samo za branje; ne vpliva na zaznavanje."
},
"notify_live_sticky": {
"label": "Ohrani živo obvestilo ob dotiku",
"doc": "Samo Android. Živo obvestilo o napredku nastavite kot trajno (pritrjeno), da ga dotik ne zavrže. Izklopljeno ohranja privzeto vedenje, ko dotik zavrže obvestilo."
},
"notify_live_click_action": {
"label": "Cilj dotika na živo obvestilo",
"doc": "Samo Android. Kam dotik na živo obvestilo o napredku odpre (npr. /lovelace/laundry ali celoten URL) namesto vstopne strani aplikacije. Pustite prazno za privzeto."
},
"door_opens_at_end": {
"label": "Vrata se ob koncu samodejno odprejo",
"doc": "Za pomivalne stroje, ki ob koncu cikla odprejo vrata za sušenje (AirDry in podobni). Ko je vklopljeno, odprtje vrat med delujočim ciklom ne zaustavi cikla za vedno; namesto tega, ko vrata ostanejo odprta za čas čakanja spodaj, WashData zaključi cikel. Kratko odprtje (dodajanje predmeta) se prezre. Zahteva entiteto senzorja vrat."
},
"door_end_dwell_seconds": {
"label": "Čas odprtosti vrat za zaključek",
"doc": "Kako dolgo morajo vrata ostati odprta, preden WashData zaključi cikel, ko je vklopljeno \"Vrata se ob koncu samodejno odprejo\". Dovolj dolgo, da se prezre hitro dodajanje posode (privzeto 60 s), dovolj kratko za hiter zaključek, ko stroj odpre vrata."
} }
}, },
"setting_group": { "setting_group": {
@@ -1592,6 +1708,7 @@
"min_active": "Na podlagi najmanjše delovne moči ({min}W), opažene v zadnjem ciklu.", "min_active": "Na podlagi najmanjše delovne moči ({min}W), opažene v zadnjem ciklu.",
"min_duration_ratio": "Ohranjeno čim nižje, da se program prepozna zgodaj v ciklu; pragova zaupanja in dvoumnosti preprečujeta prezgodnje potrditve.", "min_duration_ratio": "Ohranjeno čim nižje, da se program prepozna zgodaj v ciklu; pragova zaupanja in dvoumnosti preprečujeta prezgodnje potrditve.",
"min_off_gap": "Na podlagi {gaps} opaženih vrzeli med cikli (p05={p05}s). Spodnja meja naprave: {floor}s.", "min_off_gap": "Na podlagi {gaps} opaženih vrzeli med cikli (p05={p05}s). Spodnja meja naprave: {floor}s.",
"min_off_gap_bridge": "Nastavljeno tako, da premosti najdaljši tihi odsek znotraj cikla: {span}s + 60s rezerve, iz {spans} premoščenih vrzeli čez {cycles} čistih ciklov (ostane pod vašo najkrajšo vrzeljo med zaporednima zagonoma, ki znaša {ceiling}s).",
"min_power": "40 % najnižje delovne moči p05 ({p05}W) čez {cycles} čistih ciklov, da prag izklopa ostane pod dejansko porabo.{excl}", "min_power": "40 % najnižje delovne moči p05 ({p05}W) čez {cycles} čistih ciklov, da prag izklopa ostane pod dejansko porabo.{excl}",
"ml_auto_label": "Najnižje zaupanje, ki ga je model kakovosti še ocenil kot čisto (p10 od {cycles} čistih ciklov = {p10}).", "ml_auto_label": "Najnižje zaupanje, ki ga je model kakovosti še ocenil kot čisto (p10 od {cycles} čistih ciklov = {p10}).",
"ml_end_repeat": "{false}/{total} ciklov ({pct}%) je imelo premor, ki ga je detektor konca ocenil z >50 %; zahtevaj {val} potrditev konca.", "ml_end_repeat": "{false}/{total} ciklov ({pct}%) je imelo premor, ki ga je detektor konca ocenil z >50 %; zahtevaj {val} potrditev konca.",
@@ -1608,7 +1725,7 @@
"thr_batch": "Ohranjeno tik nad najnižjo delovno močjo p05 čez {cycles} ciklov ({p05}W), da se začetek zazna čim prej in da prag ustavitve ostane pod najnižjo delovno močjo naprave.", "thr_batch": "Ohranjeno tik nad najnižjo delovno močjo p05 čez {cycles} ciklov ({p05}W), da se začetek zazna čim prej in da prag ustavitve ostane pod najnižjo delovno močjo naprave.",
"tol_per_profile": "p75 variance trajanja po posameznih profilih čez {profiles} profilov ({cycles} ciklov); dosledni profili niso kaznovani.", "tol_per_profile": "p75 variance trajanja po posameznih profilih čez {profiles} profilov ({cycles} ciklov); dosledni profili niso kaznovani.",
"tol_pooled": "Na podlagi združene variance trajanja {cycles} nedavnih označenih ciklov (p95 odklon={dev}).", "tol_pooled": "Na podlagi združene variance trajanja {cycles} nedavnih označenih ciklov (p95 odklon={dev}).",
"watchdog": "Ohranjeno tako nizko, kot je varno (3x vrzel posodobitve p95 {p95}s, najmanj 30s), da se zastoji hitro zaznajo brez lažnih ustavitev." "watchdog": "Ohranjeno tako nizko, kot je varno (tik nad vrzeljo posodobitve p95 {p95}s, najmanj 30s), da se zastoji hitro zaznajo brez lažnih ustavitev."
}, },
"exclusions": { "exclusions": {
"summary": "Izključeno {total} napačno zaznanih ciklov: {parts}.", "summary": "Izključeno {total} napačno zaznanih ciklov: {parts}.",
@@ -1688,6 +1805,10 @@
"name_required": "Ime je obvezno", "name_required": "Ime je obvezno",
"no_split_found": "Ni najdenih nedejavnih vrzeli za razdelitev", "no_split_found": "Ni najdenih nedejavnih vrzeli za razdelitev",
"panel_settings_saved": "Nastavitve plošče shranjene", "panel_settings_saved": "Nastavitve plošče shranjene",
"pg_preset_loaded": "Prednastavitev \"{name}\" naložena",
"pg_preset_saved": "Prednastavitev \"{name}\" shranjena",
"pg_sugg_loaded": "Naloženo {n} predlaganih vrednosti - zaženite peskovnik za primerjavo",
"pg_sugg_ml_loaded": "Naloženo {n} ML-umerjenih vrednosti - zaženite peskovnik za primerjavo",
"phase_name_required": "Ime faze je obvezno", "phase_name_required": "Ime faze je obvezno",
"phase_updated": "Faza posodobljena", "phase_updated": "Faza posodobljena",
"phases_saved": "Faze shranjene", "phases_saved": "Faze shranjene",
@@ -1770,6 +1891,7 @@
"other": "Drugo" "other": "Drugo"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Pomivalni stroj: sekunde tišine po pričakovanem trajanju, preden se sprosti čakanje na končno izčrpavanje vode",
"anti_wrinkle_enabled": "Vsrkaj vrtilne impulze po glavni fazi, namesto da jih obravnavaš kot nove cikle", "anti_wrinkle_enabled": "Vsrkaj vrtilne impulze po glavni fazi, namesto da jih obravnavaš kot nove cikle",
"anti_wrinkle_exit_power": "Moč mora med impulzi pasti pod to vrednost, da zaščita pred gubami ostane aktivna", "anti_wrinkle_exit_power": "Moč mora med impulzi pasti pod to vrednost, da zaščita pred gubami ostane aktivna",
"anti_wrinkle_idle_timeout": "Dovoljeni mir med dvema vrtilnima impulzoma, preden se zaščita pred gubami konča", "anti_wrinkle_idle_timeout": "Dovoljeni mir med dvema vrtilnima impulzoma, preden se zaščita pred gubami konča",
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entitet nije pronađen",
"running_long": "Traje predugo",
"remaining": "preostalo",
"progress": "napredak",
"show_time_remaining": "Prikaži preostalo vreme",
"show_percentage": "Prikaži procenat",
"layout": {
"tile": "Pločica (kompaktno)",
"detail": "Detaljno (bogato)",
"glance": "Pregled (više uređaja)"
},
"btn": {
"pause": "Pauziraj",
"resume": "Nastavi",
"terminate": "Završi ciklus",
"record_start": "Započni snimanje",
"record_stop": "Zaustavi snimanje",
"program": "Program",
"open_panel": "Otvori WashData"
},
"editor": {
"layout": "Izgled",
"entity": "Entitet uređaja",
"entities": "Uređaji",
"title": "Naslov",
"icon": "Ikona",
"show_state": "Prikaži stanje",
"show_program": "Prikaži program",
"show_progress_bar": "Prikaži traku napretka",
"spin_icon": "Rotiraj ikonu tokom rada",
"display_mode": "Red sa detaljima",
"active_color": "Zamena aktivne boje",
"show_phase": "Prikaži fazu",
"show_energy": "Prikaži energiju i trošak",
"show_anomaly": "Prikaži upozorenje o produženju",
"show_sparkline": "Prikaži grafikon snage uživo",
"buttons": "Dugmad za radnje",
"program_entity": "Entitet programa (zamena)",
"time_entity": "Entitet vremena (zamena)",
"pct_entity": "Entitet napretka (zamena)",
"power_entity": "Entitet snage (zamena)",
"tap_action": "Radnja dodira",
"hold_action": "Radnja držanja",
"double_tap_action": "Radnja dvostrukog dodira"
}
},
"badge": { "badge": {
"artifact_tip": "Otkriveno je {n} anomalija (npr. vrata otvorena usred ciklusa) otvorite da ih vidite na grafikonu", "artifact_tip": "Otkriveno je {n} anomalija (npr. vrata otvorena usred ciklusa) otvorite da ih vidite na grafikonu",
"auto": "(automatski otkriveno)", "auto": "(automatski otkriveno)",
@@ -64,6 +112,21 @@
"discard": "Odbaci", "discard": "Odbaci",
"discard_tip": "Odbaci snimljeni trag bez čuvanja", "discard_tip": "Odbaci snimljeni trag bez čuvanja",
"dismiss": "Odbij", "dismiss": "Odbij",
"mute_suggestion": "Prestani predlagati ovo podešavanje",
"pg_load_calibrated": "Učitaj kalibrisano (ML) ({n})",
"pg_load_calibrated_tip": "Učitaj ML-kalibrisana podešavanja kao zamene u testnom okruženju",
"pg_load_live": "Učitaj aktivna podešavanja",
"pg_load_live_tip": "Ponovo pročitaj trenutna podešavanja integracije i odbaci sve izmene u testnom okruženju",
"pg_load_suggested": "Učitaj predloženo ({n})",
"pg_load_suggested_tip": "Učitaj trenutne predloge automatskog podešavanja kao zamene u testnom okruženju",
"pg_preset_delete": "Izbriši konfiguraciju",
"pg_preset_load": "Učitaj konfiguraciju",
"pg_preset_load_tip": "Zameni vrednosti u testnom okruženju ovom konfiguracijom (aktivna podešavanja ostaju netaknuta)",
"pg_preset_save": "Sačuvaj kao konfiguraciju",
"pg_preset_save_tip": "Sačuvaj sve vrednosti ispod kao imenovanu konfiguraciju za ovaj uređaj",
"pg_publish_all": "Primeni {n} na integraciju",
"pg_publish_one": "Primeni {label} na integraciju",
"reset_muted": "Resetuj utišane",
"done": "Gotovo", "done": "Gotovo",
"edit": "Uredi", "edit": "Uredi",
"export": "Izvezi", "export": "Izvezi",
@@ -275,6 +338,7 @@
"no_automations": "Nijedna automatizacija ne referencira ovaj uređaj još.", "no_automations": "Nijedna automatizacija ne referencira ovaj uređaj još.",
"panel_settings": "Podešavanja panela", "panel_settings": "Podešavanja panela",
"param_sweep": "Ispitivanje parametra", "param_sweep": "Ispitivanje parametra",
"pg_settings_source": "Izvor podešavanja",
"phase_catalog": "Katalog faza", "phase_catalog": "Katalog faza",
"playground": "Testno okruženje", "playground": "Testno okruženje",
"process_history": "Istorija procesa", "process_history": "Istorija procesa",
@@ -348,6 +412,7 @@
"default_access_level": "Zadani nivo za korisnike koji nisu navedeni ispod", "default_access_level": "Zadani nivo za korisnike koji nisu navedeni ispod",
"default_other": "Podrazumevano (ostali uređaji)", "default_other": "Podrazumevano (ostali uređaji)",
"default_tab": "Podrazumevana kartica pri otvaranju panela", "default_tab": "Podrazumevana kartica pri otvaranju panela",
"font_size": "Veličina fonta panela",
"delta": "Δ", "delta": "Δ",
"description": "Opis", "description": "Opis",
"dtw_blend_w": "Težina mešanja", "dtw_blend_w": "Težina mešanja",
@@ -415,6 +480,9 @@
"pg_match_score": "Ocena poklapanja", "pg_match_score": "Ocena poklapanja",
"pg_pct_of": "{p}% od {total}", "pg_pct_of": "{p}% od {total}",
"pg_poor_match": "Loše poklapanje", "pg_poor_match": "Loše poklapanje",
"pg_preset": "Konfiguracija testnog okruženja",
"pg_preset_name": "Naziv nove konfiguracije",
"pg_preset_none": "Izaberite konfiguraciju…",
"pg_strong_match": "Snažno poklapanje", "pg_strong_match": "Snažno poklapanje",
"pg_tile_ambiguous": "Dvosmisleni", "pg_tile_ambiguous": "Dvosmisleni",
"pg_tile_ambiguous_tip": "Ciklusi sa gotovo izjednačenim poklapanjem između dva programa", "pg_tile_ambiguous_tip": "Ciklusi sa gotovo izjednačenim poklapanjem između dva programa",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Primeniti najbolju vrednost: {label} = {value}?", "pg_apply_confirm": "Primeniti najbolju vrednost: {label} = {value}?",
"pg_canvas_empty": "Izaberite ciklus iznad, zatim pritisnite „Učitaj“ da vidite njegovu krivu snage.", "pg_canvas_empty": "Izaberite ciklus iznad, zatim pritisnite „Učitaj“ da vidite njegovu krivu snage.",
"pg_chart_caption": "Stopa otkrivanja/poklapanja po vrednostima {param}", "pg_chart_caption": "Stopa otkrivanja/poklapanja po vrednostima {param}",
"pg_ctrl_intro": "Vrednosti polaze od aktivnih podešavanja integracije za ovaj uređaj. Izmene ostaju u testnom okruženju dok ih ne primenite.",
"pg_live_unavailable": "Aktivna podešavanja nisu dostupna, prikazane su zadane vrednosti.",
"pg_load_live_confirm": "Odbaciti izmene u testnom okruženju ({n}) i ponovo učitati trenutna podešavanja integracije?",
"pg_match_rate": "{pct}% poklapanja na {total} ciklusa", "pg_match_rate": "{pct}% poklapanja na {total} ciklusa",
"pg_matches_live": "Odgovara aktivnim podešavanjima",
"pg_n_changed": "Promene u odnosu na aktivna podešavanja: {n}",
"pg_sugg_none": "Svi predlozi već odgovaraju trenutnim podešavanjima",
"pg_preset_delete_confirm": "Izbrisati konfiguraciju \"{name}\"?",
"pg_preset_limit": "Dostignut limit konfiguracija ({n})",
"pg_preset_overwrite": "Prepisati konfiguraciju \"{name}\"?",
"pg_publish_one_confirm": "Sačuvati {label} = {value} u podešavanja ovog uređaja?",
"pg_restart_note": "Ponovo pokrenite Home Assistant da biste omogućili alatke za simulaciju.", "pg_restart_note": "Ponovo pokrenite Home Assistant da biste omogućili alatke za simulaciju.",
"pg_sim_progress": "{done} / {total} ciklusa", "pg_sim_progress": "{done} / {total} ciklusa",
"pg_starting": "Pokretanje…", "pg_starting": "Pokretanje…",
@@ -789,6 +867,7 @@
"preferences_admin": "Preference, panel i kontrola pristupa", "preferences_admin": "Preference, panel i kontrola pristupa",
"preferences_adv": "Preference", "preferences_adv": "Preference",
"prefs_personal": "Ovo se odnosi samo na vaš Home Assistant nalog.", "prefs_personal": "Ovo se odnosi samo na vaš Home Assistant nalog.",
"font_size_hint": "Povećajte ili smanjite sve u ovom panelu. Primenjuje se na vaš nalog na ovom uređaju.",
"process_history_hint": "Ponovo pokrenite uparivanje na svim sačuvanim ciklusima, osvežite predloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i ponovo izračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.", "process_history_hint": "Ponovo pokrenite uparivanje na svim sačuvanim ciklusima, osvežite predloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i ponovo izračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.",
"profile_deleted": "Profil obrisan", "profile_deleted": "Profil obrisan",
"profile_poor_health_detail": "Ciklusi koji su dodeljeni ovom profilu imaju nedosledne oblike ili nisku pouzdanost. Razmislite o ponovnoj izgradnji omotača ili pregledu označenih ciklusa.", "profile_poor_health_detail": "Ciklusi koji su dodeljeni ovom profilu imaju nedosledne oblike ili nisku pouzdanost. Razmislite o ponovnoj izgradnji omotača ili pregledu označenih ciklusa.",
@@ -821,6 +900,10 @@
"split_intro": "Klikni na grafikon za dodavanje ili uklanjanje tačke deljenja, ili automatski otkrij po prazninama. Svaki rezultujući segment može dobiti sopstveni profil.", "split_intro": "Klikni na grafikon za dodavanje ili uklanjanje tačke deljenja, ili automatski otkrij po prazninama. Svaki rezultujući segment može dobiti sopstveni profil.",
"storage_diagnostics": "Statistike skladištenja, održavanje, izvoz/uvoz", "storage_diagnostics": "Statistike skladištenja, održavanje, izvoz/uvoz",
"sug_staged": "Postavljeno {key} = {val}. Sačuvajte za primenu.", "sug_staged": "Postavljeno {key} = {val}. Sačuvajte za primenu.",
"sug_muted": "Ovo podešavanje neće biti predlagano ponovo",
"sug_mute_failed": "Predlog nije mogao biti utišan",
"sug_unmuted_all": "Utišani predlozi su resetovani",
"n_suggestions_muted": "{count} utišano; auto-podešivač neće predlagati ova podešavanja.",
"toast_auto_detect_enabled": "Automatsko otkrivanje omogućeno", "toast_auto_detect_enabled": "Automatsko otkrivanje omogućeno",
"toast_auto_label_complete": "Automatsko označavanje završeno", "toast_auto_label_complete": "Automatsko označavanje završeno",
"toast_auto_label_failed": "Automatsko označavanje nije uspelo: {error}", "toast_auto_label_failed": "Automatsko označavanje nije uspelo: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Trajanje u trendu kraće ({pct}%/ciklus) nedavno u proseku {avg}", "trend_duration_shorter": "Trajanje u trendu kraće ({pct}%/ciklus) nedavno u proseku {avg}",
"trend_energy_down": "Energija opada ({pct}%/ciklus)", "trend_energy_down": "Energija opada ({pct}%/ciklus)",
"trend_energy_up": "Energetski trend raste ({pct}%/ciklus) nedavni prosek {avg}", "trend_energy_up": "Energetski trend raste ({pct}%/ciklus) nedavni prosek {avg}",
"trim_destructive_confirm": "Ovo zadržava samo {pct}% ciklusa i ne može se poništiti. Nastaviti?",
"trim_intro": "Prevuci crvene ručice ili unesi vrednosti. Sve izvan prozora se uklanja.", "trim_intro": "Prevuci crvene ručice ili unesi vrednosti. Sve izvan prozora se uklanja.",
"tuning_suggestions_available": "{count} prijedlog podešavanja dostupan je iz posmatranih ciklusa. Pojavljuju se pored relevantnih polja.", "tuning_suggestions_available": "{count} prijedlog podešavanja dostupan je iz posmatranih ciklusa. Pojavljuju se pored relevantnih polja.",
"unsure_detected_prefix": "WashData nije siguran da je otkrio", "unsure_detected_prefix": "WashData nije siguran da je otkrio",
@@ -970,6 +1054,10 @@
"unusable": "Neupotrebljivo" "unusable": "Neupotrebljivo"
}, },
"section": { "section": {
"dishwasher": {
"label": "Mašina za pranje sudova",
"intro": "Obrada kraja ciklusa za mašine za pranje sudova, koje se obično završavaju dugom, gotovo tihom fazom sušenja pre kratkog završnog ispumpavanja vode."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Režim zaštite od gužvanja tkanine detektuje kratke pulseve tumblovanja pri niskoj snazi nakon glavne faze i drži ih pripisanim završenom ciklusu.", "intro": "Režim zaštite od gužvanja tkanine detektuje kratke pulseve tumblovanja pri niskoj snazi nakon glavne faze i drži ih pripisanim završenom ciklusu.",
"label": "Zaštita od gužvanja" "label": "Zaštita od gužvanja"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Otpuštanje nakon tihe faze sušenja",
"doc": "Kada ciklus pređe svoje očekivano trajanje, koliko dugo mašina mora ostati tiha (ispod Praga zaustavljanja) pre nego što WashData prestane da čeka na završno ispumpavanje vode i završi ciklus. Povećajte ako vaš uređaj ima dugu tihu fazu sušenja pre kasnog završnog ispumpavanja koje se propušta - šire okno omogućava da naučeno trajanje prati sezonske promene (hladnija dovodna voda = duži ciklusi) umesto da ostane zaključano na staroj prosečnoj vrednosti. Čekanje samo skraćuje u odnosu na interno ograničenje završnog ispumpavanja od 30 minuta, nikada ga ne produžava."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Prepoznajte kratke impulse male snage koje mašina za sušenje emituje nakon glavne faze grejanja i držite ih povezanim sa završenim ciklusom umesto da ih čitate kao nove cikluse.", "doc": "Prepoznajte kratke impulse male snage koje mašina za sušenje emituje nakon glavne faze grejanja i držite ih povezanim sa završenim ciklusom umesto da ih čitate kao nove cikluse.",
"label": "Omogući detekciju zaštite od gužvanja" "label": "Omogući detekciju zaštite od gužvanja"
@@ -1232,6 +1324,10 @@
"doc": "Nekoliko minuta nakon završetka ciklusa pre slanja podsetnika „istovarite mašinu“ koji još uvek čeka. Postavite 0 da biste onemogućili podsetnik.", "doc": "Nekoliko minuta nakon završetka ciklusa pre slanja podsetnika „istovarite mašinu“ koji još uvek čeka. Postavite 0 da biste onemogućili podsetnik.",
"label": "Kašnjenje podsetnika za istovar" "label": "Kašnjenje podsetnika za istovar"
}, },
"notify_unload_repeat": {
"doc": "Ponovo šalje podsetnik za istovar svakih \"Kašnjenje podsetnika za istovar\" minuta dok ne otvorite vrata ili ne dodirnete \"Prestani da podsećaš\" na obaveštenju. Zahteva Entitetu senzora vrata (kao i sam podsetnik). Dugme za odbacivanje radi na obaveštenjima mobilne aplikacije Home Assistant (companion app).",
"label": "Ponavljaj dok se vrata ne otvore"
},
"off_delay": { "off_delay": {
"doc": "Vreme za čekanje nakon pada struje pre nego što proglasimo ciklus završenim. Ako se napajanje nastavi unutar ovog prozora, ciklus se nastavlja bez problema - ovo premošćuje pauze između faza pranja. Mašine za pranje sudova imaju duge faze sušenja (isključenje na 20-60 min) tako da kašnjenje isključenja mora biti veće od toga da bi se celo pranje+suvo održalo kao jedan ciklus.", "doc": "Vreme za čekanje nakon pada struje pre nego što proglasimo ciklus završenim. Ako se napajanje nastavi unutar ovog prozora, ciklus se nastavlja bez problema - ovo premošćuje pauze između faza pranja. Mašine za pranje sudova imaju duge faze sušenja (isključenje na 20-60 min) tako da kašnjenje isključenja mora biti veće od toga da bi se celo pranje+suvo održalo kao jedan ciklus.",
"label": "Kašnjenje isklopa" "label": "Kašnjenje isklopa"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Ostrina energije", "label": "Ostrina energije",
"doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava rezultat. Podrazumevana vrednost 0,25 je namerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije." "doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava rezultat. Podrazumevana vrednost 0,25 je namerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije."
},
"power_profile_interval_min": {
"label": "Interval profila snage",
"doc": "Veličina segmenta za atribut senzora power_profile po profilu (ravni niz prosečnih vata po slotu koji koriste spoljni planeri kao EMHASS i tibber_prices). Manji segmenti čuvaju kratke skokove snage oštrim; veći segmenti izglađuju oblik. Podrazumevano 15 min. Samo za čitanje; ne utiče na detekciju."
},
"notify_live_sticky": {
"label": "Zadrži živo obaveštenje na dodir",
"doc": "Samo za Android. Neka obaveštenje o napretku u živo bude trajno (zakačeno) kako ga dodir ne bi odbacio. Isključeno zadržava podrazumevano ponašanje gde dodir odbacuje obaveštenje."
},
"notify_live_click_action": {
"label": "Cilj dodira živog obaveštenja",
"doc": "Samo za Android. Gde se otvara dodir na obaveštenje o napretku u živo (npr. /lovelace/laundry ili puni URL) umesto početne stranice aplikacije. Ostavite praznim za podrazumevano ponašanje."
},
"door_opens_at_end": {
"label": "Vrata se automatski otvaraju na kraju",
"doc": "Za mašine za suđe čija se vrata otvaraju na kraju ciklusa radi sušenja (AirDry i slično). Kada je uključeno, otvaranje vrata tokom aktivnog ciklusa više ga ne pauzira zauvek; umesto toga, ako vrata ostanu otvorena tokom vremena zadržavanja ispod, WashData smatra ciklus završenim. Kratko otvaranje (dodavanje posuđa) se zanemaruje. Zahteva entitet senzora vrata."
},
"door_end_dwell_seconds": {
"label": "Zadržavanje pri otvorenim vratima",
"doc": "Koliko dugo vrata moraju ostati otvorena pre nego WashData završi ciklus, kada je uključeno \"Vrata se automatski otvaraju na kraju\". Dovoljno dugo da se ignoriše brzo dodavanje posuđa (podrazumevano 60 s), dovoljno kratko za brzo završavanje kada mašina otvori vrata."
} }
}, },
"setting_group": { "setting_group": {
@@ -1592,6 +1708,7 @@
"min_active": "Na osnovu najmanje radne snage ({min}W) uočene u poslednjem ciklusu.", "min_active": "Na osnovu najmanje radne snage ({min}W) uočene u poslednjem ciklusu.",
"min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprečavaju prevremene potvrde.", "min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprečavaju prevremene potvrde.",
"min_off_gap": "Na osnovu {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.", "min_off_gap": "Na osnovu {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.",
"min_off_gap_bridge": "Postavljeno tako da premosti najduži tihi odsečak unutar ciklusa: {span}s + 60s rezerve, iz {spans} premošćenih razmaka kroz {cycles} čistih ciklusa (ostaje ispod vašeg najkraćeg razmaka između dva uzastopna pokretanja, koji iznosi {ceiling}s).",
"min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}", "min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}",
"ml_auto_label": "Najniža pouzdanost koju je model kvaliteta još ocenio čistom (p10 od {cycles} čistih ciklusa = {p10}).", "ml_auto_label": "Najniža pouzdanost koju je model kvaliteta još ocenio čistom (p10 od {cycles} čistih ciklusa = {p10}).",
"ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocenio sa >50 %; zahtevaj {val} potvrdu(e) kraja.", "ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocenio sa >50 %; zahtevaj {val} potvrdu(e) kraja.",
@@ -1608,7 +1725,7 @@
"thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage mašine.", "thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage mašine.",
"tol_per_profile": "p75 varijanse trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosledni profili nisu kažnjeni.", "tol_per_profile": "p75 varijanse trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosledni profili nisu kažnjeni.",
"tol_pooled": "Na osnovu objedinjene varijanse trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).", "tol_pooled": "Na osnovu objedinjene varijanse trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).",
"watchdog": "Zadržano što nižim uz bezbednost (3x razmak ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." "watchdog": "Zadržano što nižim uz bezbednost (tik iznad razmaka ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja."
}, },
"exclusions": { "exclusions": {
"summary": "Isključeno {total} pogrešno detektovanih ciklusa: {parts}.", "summary": "Isključeno {total} pogrešno detektovanih ciklusa: {parts}.",
@@ -1688,6 +1805,10 @@
"name_required": "Naziv je obavezan", "name_required": "Naziv je obavezan",
"no_split_found": "Nisu pronađene praznine za deljenje", "no_split_found": "Nisu pronađene praznine za deljenje",
"panel_settings_saved": "Podešavanja panela sačuvana", "panel_settings_saved": "Podešavanja panela sačuvana",
"pg_preset_loaded": "Konfiguracija \"{name}\" učitana",
"pg_preset_saved": "Konfiguracija \"{name}\" sačuvana",
"pg_sugg_loaded": "Učitano {n} predloženih vrednosti - pokrenite testno okruženje za poređenje",
"pg_sugg_ml_loaded": "Učitano {n} ML-kalibriranih vrednosti - pokrenite testno okruženje za poređenje",
"phase_name_required": "Naziv faze je obavezan", "phase_name_required": "Naziv faze je obavezan",
"phase_updated": "Faza ažurirana", "phase_updated": "Faza ažurirana",
"phases_saved": "Faze sačuvane", "phases_saved": "Faze sačuvane",
@@ -1770,6 +1891,7 @@
"other": "Ostalo" "other": "Ostalo"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Mašina za pranje sudova: sekunde tišine nakon očekivanog trajanja pre nego što se otpusti čekanje na završno ispumpavanje vode",
"completion_min_seconds": "Najkraće pokretanje koje se računa kao pravi ciklus", "completion_min_seconds": "Najkraće pokretanje koje se računa kao pravi ciklus",
"end_repeat_count": "Niska očitavanja zaredom pre završetka", "end_repeat_count": "Niska očitavanja zaredom pre završetka",
"interrupted_min_seconds": "Kratki ciklusi označeni kao prekinuti", "interrupted_min_seconds": "Kratki ciklusi označeni kao prekinuti",
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "min",
"entity_not_found": "Entitet hittades inte",
"running_long": "Kör längre",
"remaining": "återstår",
"progress": "förlopp",
"show_time_remaining": "Visa återstående tid",
"show_percentage": "Visa procent",
"layout": {
"tile": "Bricka (kompakt)",
"detail": "Detalj (utförlig)",
"glance": "Överblick (flera enheter)"
},
"btn": {
"pause": "Pausa",
"resume": "Återuppta",
"terminate": "Avsluta cykel",
"record_start": "Starta inspelning",
"record_stop": "Stoppa inspelning",
"program": "Program",
"open_panel": "Öppna WashData"
},
"editor": {
"layout": "Layout",
"entity": "Apparatentitet",
"entities": "Apparater",
"title": "Titel",
"icon": "Ikon",
"show_state": "Visa status",
"show_program": "Visa program",
"show_progress_bar": "Visa förloppsindikator",
"spin_icon": "Snurra ikon under körning",
"display_mode": "Detaljrad",
"active_color": "Åsidosätt aktiv färg",
"show_phase": "Visa fas",
"show_energy": "Visa energi och kostnad",
"show_anomaly": "Visa varning för lång körtid",
"show_sparkline": "Visa live-effektgraf",
"buttons": "Åtgärdsknappar",
"program_entity": "Programentitet (åsidosätt)",
"time_entity": "Tidsentitet (åsidosätt)",
"pct_entity": "Förloppsentitet (åsidosätt)",
"power_entity": "Effektentitet (åsidosätt)",
"tap_action": "Tryckåtgärd",
"hold_action": "Håll-åtgärd",
"double_tap_action": "Dubbeltryckningsåtgärd"
}
},
"badge": { "badge": {
"artifact_tip": "{n} anomalier upptäckta (t.ex. dörren öppnades mitt i cykeln) öppna för att se dem i diagrammet", "artifact_tip": "{n} anomalier upptäckta (t.ex. dörren öppnades mitt i cykeln) öppna för att se dem i diagrammet",
"auto": "(automatiskt identifierat)", "auto": "(automatiskt identifierat)",
@@ -92,6 +140,19 @@
"pause_cycle_tip": "Pausa den pågående cykeln apparaten återupptar där den slutade", "pause_cycle_tip": "Pausa den pågående cykeln apparaten återupptar där den slutade",
"pg_apply_device": "Tillämpa på enhet", "pg_apply_device": "Tillämpa på enhet",
"pg_autofill": "Autofyll", "pg_autofill": "Autofyll",
"pg_load_calibrated": "Ladda kalibrerade (ML) ({n})",
"pg_load_calibrated_tip": "Laddar ML-kalibrerade inställningar som testyteöverskridanden",
"pg_load_live": "Ladda aktiva inställningar",
"pg_load_live_tip": "Läs in integrationens aktuella inställningar på nytt och kasta alla ändringar i testytan",
"pg_load_suggested": "Ladda förslag ({n})",
"pg_load_suggested_tip": "Laddar auto-tunarens aktuella förslag som testyteöverskridanden",
"pg_preset_delete": "Ta bort förinställning",
"pg_preset_load": "Ladda förinställning",
"pg_preset_load_tip": "Ersätt värdena i testytan med den här förinställningen (de aktiva inställningarna påverkas inte)",
"pg_preset_save": "Spara som förinställning",
"pg_preset_save_tip": "Spara alla värden nedan som en namngiven förinställning för den här enheten",
"pg_publish_all": "Spara {n} till integrationen",
"pg_publish_one": "Spara {label} till integrationen",
"play": "Spela", "play": "Spela",
"process": "Bearbeta", "process": "Bearbeta",
"process_history": "Bearbeta nu", "process_history": "Bearbeta nu",
@@ -178,7 +239,9 @@
"download_export": "Ladda ner export", "download_export": "Ladda ner export",
"analyze_import": "Analysera fil", "analyze_import": "Analysera fil",
"import_selected": "Importera valda", "import_selected": "Importera valda",
"back": "Tillbaka" "back": "Tillbaka",
"mute_suggestion": "Sluta föreslå den här inställningen",
"reset_muted": "Återställ tysta förslag"
}, },
"conflict": { "conflict": {
"anti_wrinkle_exit": { "anti_wrinkle_exit": {
@@ -275,8 +338,9 @@
"no_automations": "Inga automatiseringar refererar till denna enhet ännu.", "no_automations": "Inga automatiseringar refererar till denna enhet ännu.",
"panel_settings": "Panelinställningar", "panel_settings": "Panelinställningar",
"param_sweep": "Parametersvep", "param_sweep": "Parametersvep",
"pg_settings_source": "Inställningarnas källa",
"phase_catalog": "Faskatalog", "phase_catalog": "Faskatalog",
"playground": "Lekplats", "playground": "Testyta",
"process_history": "Processhistorik", "process_history": "Processhistorik",
"settings_history": "Inställningshistorik", "settings_history": "Inställningshistorik",
"status": "Status", "status": "Status",
@@ -410,6 +474,9 @@
"pg_group_detection": "Detekteringsutlösare", "pg_group_detection": "Detekteringsutlösare",
"pg_group_timing": "Tidsregler", "pg_group_timing": "Tidsregler",
"pg_idle": "Inaktiv", "pg_idle": "Inaktiv",
"pg_preset": "Förinställning för testytan",
"pg_preset_name": "Namn på ny förinställning",
"pg_preset_none": "Välj en förinställning…",
"pg_stress_group": "Test av inaktiv avslutning", "pg_stress_group": "Test av inaktiv avslutning",
"pg_stress_idle_auto": "Auto", "pg_stress_idle_auto": "Auto",
"pg_stress_idle_w": "Inaktiv nivå (W)", "pg_stress_idle_w": "Inaktiv nivå (W)",
@@ -609,7 +676,8 @@
"conflict_import_copy": "Importera som kopia", "conflict_import_copy": "Importera som kopia",
"conflict_keep_mine": "Behåll mina", "conflict_keep_mine": "Behåll mina",
"conflict_overwrite": "Skriv över", "conflict_overwrite": "Skriv över",
"pg_anti_wrinkle": "Skrynkelskydd" "pg_anti_wrinkle": "Skrynkelskydd",
"font_size": "Panelens teckenstorlek"
}, },
"log": { "log": {
"all_levels": "Alla nivåer", "all_levels": "Alla nivåer",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Tillämpa bästa värdet: {label} = {value}?", "pg_apply_confirm": "Tillämpa bästa värdet: {label} = {value}?",
"pg_canvas_empty": "Välj en cykel ovan och tryck sedan på Ladda för att se dess effektkurva.", "pg_canvas_empty": "Välj en cykel ovan och tryck sedan på Ladda för att se dess effektkurva.",
"pg_chart_caption": "Detekterings-/matchningsgrad över värden på {param}", "pg_chart_caption": "Detekterings-/matchningsgrad över värden på {param}",
"pg_ctrl_intro": "Värdena utgår från den här enhetens aktiva inställningar i integrationen. Ändringar stannar i testytan tills du sparar dem till integrationen.",
"pg_live_unavailable": "Aktiva inställningar är inte tillgängliga, visar standardvärden.",
"pg_load_live_confirm": "Kasta {n} ändring(ar) i testytan och läsa in integrationens aktuella inställningar på nytt?",
"pg_match_rate": "{pct}% matchningsgrad på {total} cykler", "pg_match_rate": "{pct}% matchningsgrad på {total} cykler",
"pg_matches_live": "Stämmer med de aktiva inställningarna",
"pg_n_changed": "{n} ändrade jämfört med de aktiva inställningarna",
"pg_sugg_none": "Alla förslag matchar redan de aktiva inställningarna",
"pg_preset_delete_confirm": "Ta bort förinställningen \"{name}\"?",
"pg_preset_limit": "Gränsen för förinställningar är nådd ({n})",
"pg_preset_overwrite": "Skriva över förinställningen \"{name}\"?",
"pg_publish_one_confirm": "Spara {label} = {value} till den här enhetens inställningar?",
"pg_restart_note": "Starta om Home Assistant för att aktivera simuleringsverktygen.", "pg_restart_note": "Starta om Home Assistant för att aktivera simuleringsverktygen.",
"pg_sim_progress": "{done} / {total} cykler", "pg_sim_progress": "{done} / {total} cykler",
"pg_starting": "Startar…", "pg_starting": "Startar…",
@@ -845,6 +923,7 @@
"trend_duration_shorter": "Varaktighet trendar kortare ({pct}%/cykel) senaste medelvärde {avg}", "trend_duration_shorter": "Varaktighet trendar kortare ({pct}%/cykel) senaste medelvärde {avg}",
"trend_energy_down": "Energin går ned ({pct}%/cykel)", "trend_energy_down": "Energin går ned ({pct}%/cykel)",
"trend_energy_up": "Energitrend uppåt ({pct}%/cykel) senaste snitt {avg}", "trend_energy_up": "Energitrend uppåt ({pct}%/cykel) senaste snitt {avg}",
"trim_destructive_confirm": "Endast {pct}% av cykeln behålls. Detta kan inte ångras. Fortsätta?",
"trim_intro": "Dra de röda handtagen eller ange värden. Allt utanför fönstret tas bort.", "trim_intro": "Dra de röda handtagen eller ange värden. Allt utanför fönstret tas bort.",
"tuning_suggestions_available": "{count} inställningsförslag tillgängligt från observerade cykler. De visas bredvid de relevanta fälten.", "tuning_suggestions_available": "{count} inställningsförslag tillgängligt från observerade cykler. De visas bredvid de relevanta fälten.",
"unsure_detected_prefix": "WashData är osäker på att den identifierade", "unsure_detected_prefix": "WashData är osäker på att den identifierade",
@@ -922,9 +1001,15 @@
"merge_hint": "Importerade objekt läggs till; inget lokalt går förlorat. Namnkonflikter löses nedan.", "merge_hint": "Importerade objekt läggs till; inget lokalt går förlorat. Namnkonflikter löses nedan.",
"replace_warn": "Varje ikryssad kategori raderas och ersätts från filen. Icke ikryssade kategorier lämnas orörda.", "replace_warn": "Varje ikryssad kategori raderas och ersätts från filen. Icke ikryssade kategorier lämnas orörda.",
"dest_reference_hint": "Importerade cykler förbättrar bara programmatchning och påverkar aldrig användnings-/energistatistik.", "dest_reference_hint": "Importerade cykler förbättrar bara programmatchning och påverkar aldrig användnings-/energistatistik.",
"dest_real_history_hint": "Importerade cykler räknas som den här apparatens egen historik och matar energi-/användningsstatistik. Använd detta för att flytta en apparat till en ny installation." "dest_real_history_hint": "Importerade cykler räknas som den här apparatens egen historik och matar energi-/användningsstatistik. Använd detta för att flytta en apparat till en ny installation.",
"sug_muted": "Kommer inte att föreslå den här inställningen igen",
"sug_mute_failed": "Kunde inte tysta förslaget",
"sug_unmuted_all": "Tysta förslag återställda",
"n_suggestions_muted": "{count} tystade; auto-tunern föreslår inte dessa.",
"font_size_hint": "Gör allt i den här panelen större eller mindre. Gäller för ditt konto på den här enheten."
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Diskmaskin: tysta sekunder efter förväntad varaktighet innan väntan på tömning vid cykelslut frisläpps",
"completion_min_seconds": "Kortaste körning som räknas som en riktig cykel", "completion_min_seconds": "Kortaste körning som räknas som en riktig cykel",
"end_repeat_count": "Antal låga avläsningar i rad innan avslut", "end_repeat_count": "Antal låga avläsningar i rad innan avslut",
"interrupted_min_seconds": "Korta cykler markeras som avbrutna", "interrupted_min_seconds": "Korta cykler markeras som avbrutna",
@@ -998,6 +1083,10 @@
"unusable": "Oanvändbar" "unusable": "Oanvändbar"
}, },
"section": { "section": {
"dishwasher": {
"label": "Diskmaskin",
"intro": "Hantering av cykelslut för diskmaskiner, som vanligtvis avslutas med en lång, nästan ljudlös torkfas före en kort sista tömning."
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Skrynkelskyddsläget identifierar korta lågeffektstumlingspulser efter huvudfasen och håller dem kopplade till den avslutade cykeln för att förhindra skrynklor i tvätten.", "intro": "Skrynkelskyddsläget identifierar korta lågeffektstumlingspulser efter huvudfasen och håller dem kopplade till den avslutade cykeln för att förhindra skrynklor i tvätten.",
"label": "Skrynkelskydd" "label": "Skrynkelskydd"
@@ -1040,6 +1129,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"label": "Frisläpp efter tyst torkfas",
"doc": "När cykeln passerar sin förväntade varaktighet: hur länge diskmaskinen måste förbli tyst (under Stopptröskel) innan WashData slutar vänta på en sista tömning och avslutar cykeln. Höj värdet om din maskin har en lång tyst torkfas före en sen sista tömning som missas - ett bredare fönster låter den inlärda varaktigheten följa säsongsvariationer (kallare inloppsvatten = längre cykler) istället för att låsa sig vid det gamla medelvärdet. Det förkortar bara väntetiden i förhållande till den interna gränsen på 30 minuter för slutspiken, aldrig förlänger den."
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Känn igen de korta torktumlarpulser med låg effekt en torktumlare avger efter huvuduppvärmningsfasen och håll dem kopplade till den färdiga cykeln istället för att läsa dem som nya cykler.", "doc": "Känn igen de korta torktumlarpulser med låg effekt en torktumlare avger efter huvuduppvärmningsfasen och håll dem kopplade till den färdiga cykeln istället för att läsa dem som nya cykler.",
"label": "Aktivera skrynkelskyddsdetektering" "label": "Aktivera skrynkelskyddsdetektering"
@@ -1260,6 +1353,10 @@
"doc": "Minuter efter att en cykel har avslutats innan den fortfarande väntande påminnelsen om \"lasta av maskinen\" skickas. Ställ in 0 för att inaktivera påminnelsen.", "doc": "Minuter efter att en cykel har avslutats innan den fortfarande väntande påminnelsen om \"lasta av maskinen\" skickas. Ställ in 0 för att inaktivera påminnelsen.",
"label": "Lossningspåminnelsefördröjning" "label": "Lossningspåminnelsefördröjning"
}, },
"notify_unload_repeat": {
"doc": "Fortsätter att skicka lossningspåminnelsen igen var \"Lossningspåminnelsefördröjning\" minut tills du öppnar dörren eller trycker på \"Sluta påminna\" i aviseringen. Kräver en Dörrsensorentitet (det gör själva påminnelsen). Avfärda-knappen fungerar på aviseringar från Home Assistant companion-appen (mobil).",
"label": "Upprepa tills dörren öppnas"
},
"off_delay": { "off_delay": {
"doc": "Dags att vänta efter strömavbrott innan man förklarar att cykeln är avslutad. Om strömmen återupptas inom detta fönster fortsätter cykeln sömlöst - detta överbryggar pauser mellan tvättstegen. Diskmaskiner har långa torkningsfaser (ström av i 20-60 min) så avstängningsfördröjningen måste överstiga den för att hålla hela tvätten+torr som en cykel.", "doc": "Dags att vänta efter strömavbrott innan man förklarar att cykeln är avslutad. Om strömmen återupptas inom detta fönster fortsätter cykeln sömlöst - detta överbryggar pauser mellan tvättstegen. Diskmaskiner har långa torkningsfaser (ström av i 20-60 min) så avstängningsfördröjningen måste överstiga den för att hålla hela tvätten+torr som en cykel.",
"label": "Avfördröjning" "label": "Avfördröjning"
@@ -1434,6 +1531,26 @@
"energy_scale": { "energy_scale": {
"label": "Energiskärpa", "label": "Energiskärpa",
"doc": "Skärpan i Steg 4:s straff för energiöverensstämmelse. Lägre = striktare: en energiavvikelse straffas mer. Standard 0,25 är avsiktligt mer tillåtande än varaktighetsskärpan eftersom energiförbrukning varierar med last. Para ihop med Energivikt." "doc": "Skärpan i Steg 4:s straff för energiöverensstämmelse. Lägre = striktare: en energiavvikelse straffas mer. Standard 0,25 är avsiktligt mer tillåtande än varaktighetsskärpan eftersom energiförbrukning varierar med last. Para ihop med Energivikt."
},
"power_profile_interval_min": {
"label": "Effektprofil-intervall",
"doc": "Storlek på bucket för effektprofilsensorns attribut power_profile (det platta arrayen med genomsnittliga wattvärden per slot som används av externa planerare som EMHASS och tibber_prices). Mindre buckets håller korta effekttoppar skarpa; större buckets jämnar ut kurvan. Standard 15 min. Endast för visning; påverkar inte detektering."
},
"notify_live_sticky": {
"label": "Behåll live-avisering vid tryck",
"doc": "Endast Android. Gör live-förloppsaviseringen kvarstående (sticky) så att ett tryck inte stänger den. Av: standardbeteende där ett tryck stänger aviseringen."
},
"notify_live_click_action": {
"label": "Tryckmål för live-avisering",
"doc": "Endast Android. Vart ett tryck på live-förloppsaviseringen öppnar (t.ex. /lovelace/laundry eller en fullständig URL) i stället för appens startsida. Lämna tomt för standard."
},
"door_opens_at_end": {
"label": "Dörren öppnas automatiskt vid avslut",
"doc": "För diskmaskiner som poppar upp dörren vid cykelslutet för torkning (AirDry och liknande). Med detta aktiverat sätter en döröppning under en aktiv cykel inte den på paus för evigt; om dörren förblir öppen under den konfigurerade uppehållstiden behandlar WashData cykeln som avslutad. En kort öppning (lägga till ett föremål) ignoreras. Kräver en dörrsensorenhet."
},
"door_end_dwell_seconds": {
"label": "Dörröppningens uppehållstid vid avslut",
"doc": "Hur länge dörren måste förbli öppen innan WashData avslutar cykeln, när \"Dörren öppnas automatiskt vid avslut\" är aktiverat. Tillräckligt länge för att ignorera snabb tilläggning av ett fat (standard 60 s), tillräckligt kort för att avsluta snabbt när maskinen poppar upp dörren."
} }
}, },
"setting_group": { "setting_group": {
@@ -1620,6 +1737,7 @@
"min_active": "Baserat på lägsta aktiva effekt ({min}W) som observerades i senaste cykeln.", "min_active": "Baserat på lägsta aktiva effekt ({min}W) som observerades i senaste cykeln.",
"min_duration_ratio": "Hålls så låg som möjligt så att ett program känns igen tidigt i cykeln; konfidens- och tvetydighetsgränserna förhindrar förhastade beslut.", "min_duration_ratio": "Hålls så låg som möjligt så att ett program känns igen tidigt i cykeln; konfidens- och tvetydighetsgränserna förhindrar förhastade beslut.",
"min_off_gap": "Baserat på {gaps} observerade mellanrum mellan cykler (p05={p05}s). Enhetsgolv: {floor}s.", "min_off_gap": "Baserat på {gaps} observerade mellanrum mellan cykler (p05={p05}s). Enhetsgolv: {floor}s.",
"min_off_gap_bridge": "Dimensionerad för att överbrygga den längsta tysta perioden inom en cykel: {span}s + 60s buffert, från {spans} överbryggade mellanrum över {cycles} rena cykler (håller sig under ditt kortaste mellanrum på {ceiling}s mellan två körningar).",
"min_power": "40% av den lägsta aktiva effekten vid p05 ({p05}W) över {cycles} rena cykler, vilket håller av-tröskeln under verklig förbrukning.{excl}", "min_power": "40% av den lägsta aktiva effekten vid p05 ({p05}W) över {cycles} rena cykler, vilket håller av-tröskeln under verklig förbrukning.{excl}",
"ml_auto_label": "Lägsta konfidens som kvalitetsmodellen fortfarande bedömde som ren (p10 av {cycles} rena cykler = {p10}).", "ml_auto_label": "Lägsta konfidens som kvalitetsmodellen fortfarande bedömde som ren (p10 av {cycles} rena cykler = {p10}).",
"ml_end_repeat": "{false}/{total} cykler ({pct}%) hade en paus som slutdetektorn bedömde till >50%; kräver {val} slutbekräftelse(r).", "ml_end_repeat": "{false}/{total} cykler ({pct}%) hade en paus som slutdetektorn bedömde till >50%; kräver {val} slutbekräftelse(r).",
@@ -1636,7 +1754,7 @@
"thr_batch": "Hålls precis över den lägsta aktiva effekten vid p05 över {cycles} cykler ({p05}W) så att en start fångas så tidigt som möjligt och stopptröskeln stannar under maskinens lägsta driftseffekt.", "thr_batch": "Hålls precis över den lägsta aktiva effekten vid p05 över {cycles} cykler ({p05}W) så att en start fångas så tidigt som möjligt och stopptröskeln stannar under maskinens lägsta driftseffekt.",
"tol_per_profile": "p75 för varaktighetsvariansen per profil över {profiles} profiler ({cycles} cykler); snäva profiler bestraffas inte.", "tol_per_profile": "p75 för varaktighetsvariansen per profil över {profiles} profiler ({cycles} cykler); snäva profiler bestraffas inte.",
"tol_pooled": "Baserat på sammanslagen varaktighetsvarians för {cycles} senaste märkta cykler (p95 avvikelse={dev}).", "tol_pooled": "Baserat på sammanslagen varaktighetsvarians för {cycles} senaste märkta cykler (p95 avvikelse={dev}).",
"watchdog": "Hålls så lågt som är säkert (3x p95-uppdateringsmellanrummet på {p95}s, min 30s) så att stillestånd upptäcks snabbt utan falska stopp." "watchdog": "Hålls så lågt som är säkert (strax över p95-uppdateringsmellanrummet på {p95}s, min 30s) så att stillestånd upptäcks snabbt utan falska stopp."
}, },
"exclusions": { "exclusions": {
"summary": "Uteslöt {total} feldetekterade cykler: {parts}.", "summary": "Uteslöt {total} feldetekterade cykler: {parts}.",
@@ -1716,6 +1834,10 @@
"name_required": "Namn krävs", "name_required": "Namn krävs",
"no_split_found": "Inga tomma luckor hittades för delning", "no_split_found": "Inga tomma luckor hittades för delning",
"panel_settings_saved": "Panelinställningar sparade", "panel_settings_saved": "Panelinställningar sparade",
"pg_preset_loaded": "Förinställningen \"{name}\" har laddats",
"pg_preset_saved": "Förinställningen \"{name}\" har sparats",
"pg_sugg_loaded": "{n} föreslagna värde(n) inlästa - kör testytan för att jämföra",
"pg_sugg_ml_loaded": "{n} ML-kalibrerade värde(n) inlästa - kör testytan för att jämföra",
"phase_name_required": "Fasnamn krävs", "phase_name_required": "Fasnamn krävs",
"phase_updated": "Fas uppdaterad", "phase_updated": "Fas uppdaterad",
"phases_saved": "Faser sparade", "phases_saved": "Faser sparade",
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,52 @@
{ {
"card": {
"min": "хв",
"entity_not_found": "Сутність не знайдено",
"running_long": "Працює довго",
"remaining": "залишилось",
"progress": "прогрес",
"show_time_remaining": "Показувати час, що залишився",
"show_percentage": "Показувати відсотки",
"layout": {
"tile": "Плитка (компактна)",
"detail": "Детально (розширений)",
"glance": "Огляд (кілька пристроїв)"
},
"btn": {
"pause": "Пауза",
"resume": "Продовжити",
"terminate": "Завершити цикл",
"record_start": "Почати запис",
"record_stop": "Зупинити запис",
"program": "Програма",
"open_panel": "Відкрити WashData"
},
"editor": {
"layout": "Макет",
"entity": "Сутність приладу",
"entities": "Прилади",
"title": "Заголовок",
"icon": "Значок",
"show_state": "Показувати стан",
"show_program": "Показувати програму",
"show_progress_bar": "Показувати індикатор прогресу",
"spin_icon": "Обертати значок під час роботи",
"display_mode": "Рядок деталей",
"active_color": "Перевизначення активного кольору",
"show_phase": "Показувати фазу",
"show_energy": "Показувати енергію та вартість",
"show_anomaly": "Показувати попередження про перевищення",
"show_sparkline": "Показувати графік потужності в реальному часі",
"buttons": "Кнопки дій",
"program_entity": "Сутність програми (перевизначення)",
"time_entity": "Сутність часу (перевизначення)",
"pct_entity": "Сутність прогресу (перевизначення)",
"power_entity": "Сутність потужності (перевизначення)",
"tap_action": "Дія за дотиком",
"hold_action": "Дія за утриманням",
"double_tap_action": "Дія за подвійним дотиком"
}
},
"badge": { "badge": {
"artifact_tip": "Виявлено {n} аномалій (наприклад, двері відкриті посеред циклу) – відкрийте, щоб побачити їх на графіку", "artifact_tip": "Виявлено {n} аномалій (наприклад, двері відкриті посеред циклу) – відкрийте, щоб побачити їх на графіку",
"auto": "(виявлено автоматично)", "auto": "(виявлено автоматично)",
@@ -64,6 +112,21 @@
"discard": "Відхилити", "discard": "Відхилити",
"discard_tip": "Відхилити запис без збереження", "discard_tip": "Відхилити запис без збереження",
"dismiss": "Закрити", "dismiss": "Закрити",
"mute_suggestion": "Не пропонувати це налаштування",
"pg_load_calibrated": "Завантажити відкалібровані (ML) ({n})",
"pg_load_calibrated_tip": "Завантажити налаштування, відкалібровані ML, як перевизначення в пісочниці",
"pg_load_live": "Завантажити активні налаштування",
"pg_load_live_tip": "Перечитати поточні налаштування інтеграції та скасувати всі зміни в пісочниці",
"pg_load_suggested": "Завантажити рекомендовані ({n})",
"pg_load_suggested_tip": "Завантажити поточні рекомендації автоматичного налаштування як перевизначення в пісочниці",
"pg_preset_delete": "Видалити пресет",
"pg_preset_load": "Завантажити пресет",
"pg_preset_load_tip": "Замінити значення в пісочниці цим пресетом (активні налаштування не змінюються)",
"pg_preset_save": "Зберегти як пресет",
"pg_preset_save_tip": "Зберегти всі значення нижче як іменований пресет для цього пристрою",
"pg_publish_all": "Зберегти в налаштування ({n})",
"pg_publish_one": "Зберегти «{label}» в налаштування інтеграції",
"reset_muted": "Скинути заглушені",
"done": "Готово", "done": "Готово",
"edit": "Редагувати", "edit": "Редагувати",
"export": "Експортувати", "export": "Експортувати",
@@ -275,6 +338,7 @@
"no_automations": "Жодна автоматизація ще не посилається на цей пристрій.", "no_automations": "Жодна автоматизація ще не посилається на цей пристрій.",
"panel_settings": "Налаштування панелі", "panel_settings": "Налаштування панелі",
"param_sweep": "Перебір параметра", "param_sweep": "Перебір параметра",
"pg_settings_source": "Джерело налаштувань",
"phase_catalog": "Каталог фаз", "phase_catalog": "Каталог фаз",
"playground": "Пісочниця", "playground": "Пісочниця",
"process_history": "Обробка історії", "process_history": "Обробка історії",
@@ -348,6 +412,7 @@
"default_access_level": "Стандартний рівень для користувачів, яких немає в списку нижче", "default_access_level": "Стандартний рівень для користувачів, яких немає в списку нижче",
"default_other": "Стандартний (інші пристрої)", "default_other": "Стандартний (інші пристрої)",
"default_tab": "Стандартна вкладка при відкритті панелі", "default_tab": "Стандартна вкладка при відкритті панелі",
"font_size": "Розмір шрифту панелі",
"delta": "Δ", "delta": "Δ",
"description": "Опис", "description": "Опис",
"dtw_blend_w": "Вага змішування", "dtw_blend_w": "Вага змішування",
@@ -415,6 +480,9 @@
"pg_match_score": "Оцінка збігу", "pg_match_score": "Оцінка збігу",
"pg_pct_of": "{p}% з {total}", "pg_pct_of": "{p}% з {total}",
"pg_poor_match": "Поганий збіг", "pg_poor_match": "Поганий збіг",
"pg_preset": "Пресет пісочниці",
"pg_preset_name": "Назва нового пресета",
"pg_preset_none": "Виберіть пресет…",
"pg_strong_match": "Сильний збіг", "pg_strong_match": "Сильний збіг",
"pg_tile_ambiguous": "Неоднозначно", "pg_tile_ambiguous": "Неоднозначно",
"pg_tile_ambiguous_tip": "Цикли з майже однаковим збігом двох програм", "pg_tile_ambiguous_tip": "Цикли з майже однаковим збігом двох програм",
@@ -771,7 +839,17 @@
"pg_apply_confirm": "Застосувати найкраще значення: {label} = {value}?", "pg_apply_confirm": "Застосувати найкраще значення: {label} = {value}?",
"pg_canvas_empty": "Виберіть цикл вище, потім натисніть «Завантажити», щоб побачити його графік потужності.", "pg_canvas_empty": "Виберіть цикл вище, потім натисніть «Завантажити», щоб побачити його графік потужності.",
"pg_chart_caption": "Частка виявлення/збігу за значеннями {param}", "pg_chart_caption": "Частка виявлення/збігу за значеннями {param}",
"pg_ctrl_intro": "Значення беруться з активних налаштувань інтеграції для цього пристрою. Зміни залишаються в пісочниці, доки ви не збережете їх у налаштування.",
"pg_live_unavailable": "Активні налаштування недоступні, показано стандартні значення.",
"pg_load_live_confirm": "Скасувати зміни в пісочниці ({n}) і завантажити поточні налаштування інтеграції?",
"pg_match_rate": "{pct}% збігів на {total} циклах", "pg_match_rate": "{pct}% збігів на {total} циклах",
"pg_matches_live": "Збігається з активними налаштуваннями",
"pg_n_changed": "Відмінностей від активних налаштувань: {n}",
"pg_sugg_none": "Усі рекомендації вже відповідають поточним налаштуванням",
"pg_preset_delete_confirm": "Видалити пресет «{name}»?",
"pg_preset_limit": "Досягнуто ліміт пресетів ({n})",
"pg_preset_overwrite": "Перезаписати пресет «{name}»?",
"pg_publish_one_confirm": "Зберегти {label} = {value} у налаштування цього пристрою?",
"pg_restart_note": "Перезапустіть Home Assistant, щоб увімкнути інструменти симуляції.", "pg_restart_note": "Перезапустіть Home Assistant, щоб увімкнути інструменти симуляції.",
"pg_sim_progress": "{done} / {total} циклів", "pg_sim_progress": "{done} / {total} циклів",
"pg_starting": "Запуск…", "pg_starting": "Запуск…",
@@ -789,6 +867,7 @@
"preferences_admin": "Налаштування, панель і контроль доступу", "preferences_admin": "Налаштування, панель і контроль доступу",
"preferences_adv": "Налаштування", "preferences_adv": "Налаштування",
"prefs_personal": "Застосовується лише до вашого облікового запису Home Assistant.", "prefs_personal": "Застосовується лише до вашого облікового запису Home Assistant.",
"font_size_hint": "Зробіть усе на цій панелі більшим або меншим. Застосовується до вашого облікового запису на цьому пристрої.",
"process_history_hint": "Повторно запустіть зіставлення для всіх збережених циклів, оновіть пропозиції з налаштування, перенавчіть моделі ML (якщо увімкнено) та перерахуйте якість циклів. Запускайте після пакетного перегляду.", "process_history_hint": "Повторно запустіть зіставлення для всіх збережених циклів, оновіть пропозиції з налаштування, перенавчіть моделі ML (якщо увімкнено) та перерахуйте якість циклів. Запускайте після пакетного перегляду.",
"profile_deleted": "Профіль видалено", "profile_deleted": "Профіль видалено",
"profile_poor_health_detail": "Цикли, призначені цьому профілю, мають суперечливі форми або низьку надійність. Розгляньте можливість перебудови конверта або перегляду позначених циклів.", "profile_poor_health_detail": "Цикли, призначені цьому профілю, мають суперечливі форми або низьку надійність. Розгляньте можливість перебудови конверта або перегляду позначених циклів.",
@@ -821,6 +900,10 @@
"split_intro": "Натисніть на графік, щоб додати або видалити точку поділу, або автовизначення за паузами. Кожен отриманий сегмент може отримати власний профіль.", "split_intro": "Натисніть на графік, щоб додати або видалити точку поділу, або автовизначення за паузами. Кожен отриманий сегмент може отримати власний профіль.",
"storage_diagnostics": "Статистика сховища, обслуговування, експорт/імпорт", "storage_diagnostics": "Статистика сховища, обслуговування, експорт/імпорт",
"sug_staged": "Встановлено {key} = {val}. Збережіть для застосування.", "sug_staged": "Встановлено {key} = {val}. Збережіть для застосування.",
"sug_muted": "Це налаштування більше не пропонуватиметься",
"sug_mute_failed": "Не вдалося заглушити пропозицію",
"sug_unmuted_all": "Заглушені пропозиції скинуто",
"n_suggestions_muted": "{count} заглушено; авто-налаштувач не пропонуватиме їх.",
"toast_auto_detect_enabled": "Автовизначення увімкнено", "toast_auto_detect_enabled": "Автовизначення увімкнено",
"toast_auto_label_complete": "Автоматичне маркування завершено", "toast_auto_label_complete": "Автоматичне маркування завершено",
"toast_auto_label_failed": "Автоматичне маркування не виконано: {error}", "toast_auto_label_failed": "Автоматичне маркування не виконано: {error}",
@@ -845,6 +928,7 @@
"trend_duration_shorter": "Тривалість скорочується ({pct}%/цикл) – останній середній показник {avg}", "trend_duration_shorter": "Тривалість скорочується ({pct}%/цикл) – останній середній показник {avg}",
"trend_energy_down": "Енергія зменшується ({pct}%/цикл)", "trend_energy_down": "Енергія зменшується ({pct}%/цикл)",
"trend_energy_up": "Енергія зростає ({pct}%/цикл) – останній середній показник {avg}", "trend_energy_up": "Енергія зростає ({pct}%/цикл) – останній середній показник {avg}",
"trim_destructive_confirm": "Залишиться лише {pct}% циклу, і цю дію не можна скасувати. Продовжити?",
"trim_intro": "Перетягніть червоні маркери або введіть значення. Все за межами вікна видаляється.", "trim_intro": "Перетягніть червоні маркери або введіть значення. Все за межами вікна видаляється.",
"tuning_suggestions_available": "Доступна {count} пропозиція налаштування на основі спостережених циклів. Вони з'являються поряд із відповідними полями.", "tuning_suggestions_available": "Доступна {count} пропозиція налаштування на основі спостережених циклів. Вони з'являються поряд із відповідними полями.",
"unsure_detected_prefix": "WashData не впевнений, що виявив", "unsure_detected_prefix": "WashData не впевнений, що виявив",
@@ -970,6 +1054,10 @@
"unusable": "Непридатний" "unusable": "Непридатний"
}, },
"section": { "section": {
"dishwasher": {
"intro": "Обробка завершення циклу для посудомийних машин, які зазвичай закінчуються тривалою фазою сушіння майже без споживання енергії перед коротким фінальним зливом.",
"label": "Посудомийна машина"
},
"anti_wrinkle": { "anti_wrinkle": {
"intro": "Режим захисту від зминання виявляє короткі імпульси обертання барабана з малою потужністю після основного циклу та зберігає їх як частину завершеного циклу.", "intro": "Режим захисту від зминання виявляє короткі імпульси обертання барабана з малою потужністю після основного циклу та зберігає їх як частину завершеного циклу.",
"label": "Захист від зминання" "label": "Захист від зминання"
@@ -1012,6 +1100,10 @@
} }
}, },
"setting": { "setting": {
"dishwasher_end_spike_quiet_release": {
"doc": "Після того як цикл перевищує очікувану тривалість, скільки часу посудомийна машина має залишатися неактивною (нижче «Поріг зупинки»), перш ніж WashData припинить очікувати фінальний злив і завершить цикл. Збільште значення, якщо ваша машина має тривалу тиху фазу сушіння перед пізнім фінальним зливом, який пропускається - ширше вікно дозволяє вивченій тривалості слідувати за сезонними змінами (холодніша вхідна вода = довші цикли), а не фіксуватися на старому середньому значенні. Воно лише скорочує очікування відносно внутрішнього 30-хвилинного ліміту очікування завершального сплеску (відкачування води), але ніколи не збільшує його.",
"label": "Тихе завершення пасивного сушіння"
},
"anti_wrinkle_enabled": { "anti_wrinkle_enabled": {
"doc": "Розпізнавайте короткі малопотужні імпульси обертання, які видає сушильна машина після основної фази нагрівання, і зберігайте їх прив’язаними до завершеного циклу замість того, щоб зчитувати їх як нові цикли.", "doc": "Розпізнавайте короткі малопотужні імпульси обертання, які видає сушильна машина після основної фази нагрівання, і зберігайте їх прив’язаними до завершеного циклу замість того, щоб зчитувати їх як нові цикли.",
"label": "Увімкнути виявлення захисту від зминання" "label": "Увімкнути виявлення захисту від зминання"
@@ -1232,6 +1324,10 @@
"doc": "Через кілька хвилин після завершення циклу перед надсиланням нагадування «розвантажити машину», що все ще очікує. Встановіть 0, щоб вимкнути нагадування.", "doc": "Через кілька хвилин після завершення циклу перед надсиланням нагадування «розвантажити машину», що все ще очікує. Встановіть 0, щоб вимкнути нагадування.",
"label": "Затримка нагадування про вивантаження" "label": "Затримка нагадування про вивантаження"
}, },
"notify_unload_repeat": {
"doc": "Продовжує надсилати нагадування про вивантаження кожні \"Затримка нагадування про вивантаження\" хвилин, доки ви не відкриєте двері або не натиснете \"Не нагадувати\" у сповіщенні. Потрібна Сутність датчика дверей (як і для самого нагадування). Кнопка відхилення працює у сповіщеннях мобільного застосунку Home Assistant (companion).",
"label": "Повторювати, доки не відкриються двері"
},
"off_delay": { "off_delay": {
"doc": "Час очікування після падіння живлення, перш ніж оголосити цикл завершеним. Якщо живлення відновлюється протягом цього вікна, цикл продовжується безперебійно - це мости призупиняються між етапами прання. Посудомийні машини мають довгі фази сушіння (вимкнення на 20-60 хв), тому затримка вимкнення повинна перевищувати цю, щоб весь цикл миття+сушіння відбувався як один цикл.", "doc": "Час очікування після падіння живлення, перш ніж оголосити цикл завершеним. Якщо живлення відновлюється протягом цього вікна, цикл продовжується безперебійно - це мости призупиняються між етапами прання. Посудомийні машини мають довгі фази сушіння (вимкнення на 20-60 хв), тому затримка вимкнення повинна перевищувати цю, щоб весь цикл миття+сушіння відбувався як один цикл.",
"label": "Затримка вимкнення" "label": "Затримка вимкнення"
@@ -1406,6 +1502,26 @@
"energy_scale": { "energy_scale": {
"label": "Гострота енергії", "label": "Гострота енергії",
"doc": "Гострота штрафу за невідповідність енергії на Етапі 4. Менше = суворіше: невідповідність енергії більше знижує оцінку. Значення за замовчуванням 0,25 є навмисно більш м'яким, ніж Гострота тривалості, оскільки енергія варіюється з навантаженням. Використовуйте разом із Вагою енергії." "doc": "Гострота штрафу за невідповідність енергії на Етапі 4. Менше = суворіше: невідповідність енергії більше знижує оцінку. Значення за замовчуванням 0,25 є навмисно більш м'яким, ніж Гострота тривалості, оскільки енергія варіюється з навантаженням. Використовуйте разом із Вагою енергії."
},
"power_profile_interval_min": {
"label": "Інтервал профілю потужності",
"doc": "Розмір сегмента для атрибута датчика power_profile по профілю (плоский масив середніх ват по слотах), що використовується зовнішніми планувальниками, такими як EMHASS та tibber_prices. Менші сегменти зберігають короткі сплески потужності гострими; більші сегменти згладжують форму. За замовчуванням 15 хв. Лише для читання; не впливає на виявлення."
},
"notify_live_sticky": {
"label": "Зберігати живе сповіщення при натисканні",
"doc": "Лише для Android. Зробіть сповіщення про хід виконання постійним (закріпленим), щоб натискання не закривало його. Вимкнено зберігає поведінку за замовчуванням, де натискання закриває сповіщення."
},
"notify_live_click_action": {
"label": "Ціль натискання живого сповіщення",
"doc": "Лише для Android. Куди відкривається натискання на сповіщення про хід виконання (наприклад, /lovelace/laundry або повний URL), замість початкової сторінки застосунку. Залиште порожнім для поведінки за замовчуванням."
},
"door_opens_at_end": {
"label": "Дверцята відкриваються автоматично наприкінці",
"doc": "Для посудомийних машин, які відкривають дверцята наприкінці циклу для сушіння (AirDry та подібні). При увімкненні відкриття дверцят під час активного циклу більше не призупиняє його назавжди; натомість, якщо дверцята залишаються відкритими протягом часу витримки нижче, WashData вважає цикл завершеним. Коротке відкриття (додавання посуду) ігнорується. Потрібен об'єкт датчика дверей."
},
"door_end_dwell_seconds": {
"label": "Витримка при відкритих дверцятах",
"doc": "Як довго дверцята повинні залишатися відкритими до завершення циклу, коли увімкнено \"Дверцята відкриваються автоматично наприкінці\". Достатньо довго, щоб ігнорувати швидке додавання посуду (за замовчуванням 60 с), достатньо коротко для швидкого завершення після відкриття дверцят машиною."
} }
}, },
"setting_group": { "setting_group": {
@@ -1576,6 +1692,10 @@
"name_required": "Назва обов'язкова", "name_required": "Назва обов'язкова",
"no_split_found": "Не знайдено пауз для поділу", "no_split_found": "Не знайдено пауз для поділу",
"panel_settings_saved": "Налаштування панелі збережено", "panel_settings_saved": "Налаштування панелі збережено",
"pg_preset_loaded": "Пресет «{name}» завантажено",
"pg_preset_saved": "Пресет «{name}» збережено",
"pg_sugg_loaded": "Завантажено {n} рекомендованих значень - запустіть пісочницю для порівняння",
"pg_sugg_ml_loaded": "Завантажено {n} значень, відкаліброваних ML - запустіть пісочницю для порівняння",
"phase_name_required": "Назва фази обов'язкова", "phase_name_required": "Назва фази обов'язкова",
"phase_updated": "Фазу оновлено", "phase_updated": "Фазу оновлено",
"phases_saved": "Фази збережено", "phases_saved": "Фази збережено",
@@ -1723,6 +1843,7 @@
"min_active": "На основі мінімальної активної потужності ({min}W), зафіксованої в останньому циклі.", "min_active": "На основі мінімальної активної потужності ({min}W), зафіксованої в останньому циклі.",
"min_duration_ratio": "Залишено якомога нижчим, щоб програма розпізнавалася на початку циклу; пороги впевненості та неоднозначності запобігають передчасним підтвердженням.", "min_duration_ratio": "Залишено якомога нижчим, щоб програма розпізнавалася на початку циклу; пороги впевненості та неоднозначності запобігають передчасним підтвердженням.",
"min_off_gap": "На основі {gaps} спостережуваних проміжків між циклами (p05={p05}s). Мінімум пристрою: {floor}s.", "min_off_gap": "На основі {gaps} спостережуваних проміжків між циклами (p05={p05}s). Мінімум пристрою: {floor}s.",
"min_off_gap_bridge": "Розраховано так, щоб перекрити найдовшу тиху ділянку всередині циклу: {span}s + запас 60s, за {spans} перекритими проміжками за {cycles} коректних циклів (залишається нижче вашого найкоротшого проміжку між двома запусками поспіль, який становить {ceiling}s).",
"min_power": "40% від найменшої активної потужності p05 ({p05}W) за {cycles} коректними циклами, щоб поріг вимкнення залишався нижчим за реальне споживання.{excl}", "min_power": "40% від найменшої активної потужності p05 ({p05}W) за {cycles} коректними циклами, щоб поріг вимкнення залишався нижчим за реальне споживання.{excl}",
"ml_auto_label": "Найменша впевненість, за якої модель якості все ще вважала цикл коректним (p10 за {cycles} коректними циклами = {p10}).", "ml_auto_label": "Найменша впевненість, за якої модель якості все ще вважала цикл коректним (p10 за {cycles} коректними циклами = {p10}).",
"ml_end_repeat": "{false}/{total} циклів ({pct}%) мали паузу, яку детектор завершення оцінив вище 50%; потрібно {val} підтвердження завершення.", "ml_end_repeat": "{false}/{total} циклів ({pct}%) мали паузу, яку детектор завершення оцінив вище 50%; потрібно {val} підтвердження завершення.",
@@ -1739,7 +1860,7 @@
"thr_batch": "Залишено трохи вище найменшої активної потужності p05 за {cycles} циклами ({p05}W), щоб запуск фіксувався якомога раніше, а поріг зупинки залишався нижчим за мінімальну робочу потужність машини.", "thr_batch": "Залишено трохи вище найменшої активної потужності p05 за {cycles} циклами ({p05}W), щоб запуск фіксувався якомога раніше, а поріг зупинки залишався нижчим за мінімальну робочу потужність машини.",
"tol_per_profile": "p75 розкиду тривалості за профілями серед {profiles} профілів ({cycles} циклів); стабільні профілі не штрафуються.", "tol_per_profile": "p75 розкиду тривалості за профілями серед {profiles} профілів ({cycles} циклів); стабільні профілі не штрафуються.",
"tol_pooled": "На основі об'єднаного розкиду тривалості {cycles} нещодавніх розмічених циклів (відхилення p95={dev}).", "tol_pooled": "На основі об'єднаного розкиду тривалості {cycles} нещодавніх розмічених циклів (відхилення p95={dev}).",
"watchdog": "Залишено настільки низьким, наскільки це безпечно (3x інтервал оновлення p95, що дорівнює {p95}s, мін. 30s), щоб зависання виявлялися швидко без хибних зупинок." "watchdog": "Залишено настільки низьким, наскільки це безпечно (трохи вище інтервалу оновлення p95, що дорівнює {p95}s, мін. 30s), щоб зависання виявлялися швидко без хибних зупинок."
}, },
"exclusions": { "exclusions": {
"summary": "Виключено {total} помилково виявлених циклів: {parts}.", "summary": "Виключено {total} помилково виявлених циклів: {parts}.",
@@ -1770,6 +1891,7 @@
"other": "Інше" "other": "Інше"
}, },
"pg_desc": { "pg_desc": {
"dishwasher_end_spike_quiet_release": "Посудомийна машина: секунди неактивності після очікуваної тривалості перед зняттям очікування фінального зливу в кінці циклу",
"completion_min_seconds": "Найкоротший запуск, що вважається справжнім циклом", "completion_min_seconds": "Найкоротший запуск, що вважається справжнім циклом",
"end_repeat_count": "Скільки низьких показань поспіль до завершення", "end_repeat_count": "Скільки низьких показань поспіль до завершення",
"interrupted_min_seconds": "Короткі цикли позначаються як перервані", "interrupted_min_seconds": "Короткі цикли позначаються як перервані",
File diff suppressed because it is too large Load Diff
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Konfiguracja WashData", "title": "Konfiguracja WashData",
"description": "Skonfiguruj swoją pralkę lub inne urządzenie.\n\nWymagany jest czujnik mocy.\n\n**Następnie zostaniesz zapytany, czy chcesz utworzyć swój pierwszy profil.**", "description": "Skonfiguruj swoją pralkę lub inne urządzenie.\n\nCzujnik mocy jest wymagany.\n\nPo konfiguracji otwórz panel WashData z paska bocznego (lub przejdź do [/ha-washdata](/ha-washdata)), aby przeglądać cykle, dostosowywać wykrywanie i zarządzać profilami.",
"data": { "data": {
"name": "Nazwa urządzenia", "name": "Nazwa urządzenia",
"device_type": "Typ urządzenia", "device_type": "Typ urządzenia",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Rekonfiguracja WashData", "title": "Rekonfiguracja WashData",
"description": "Zaktualizuj nazwę urządzenia, typ urządzenia lub czujnik mocy.", "description": "Zaktualizuj nazwę urządzenia, typ urządzenia lub czujnik mocy.\n\nPanel WashData (pasek boczny lub [/ha-washdata](/ha-washdata)) służy do zarządzania wykrywaniem, cyklami, profilami i powiadomieniami.",
"data": { "data": {
"name": "Nazwa urządzenia", "name": "Nazwa urządzenia",
"device_type": "Typ urządzenia", "device_type": "Typ urządzenia",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "Ustawienia WashData", "title": "Ustawienia WashData",
"description": "Wszystkie ustawienia -- wykrywanie, dopasowanie, timing, powiadomienia, profile i cykle -- są dostępne w panelu WashData. Użyj tego formularza tylko do zmiany czujnika mocy, typu urządzenia lub progu trybu gotowości.", "description": "Zmień nazwę urządzenia lub zmień jego podstawowe ustawienia sprzętowe. Wszystkie ustawienia wykrywania, dopasowania i powiadomień znajdują się w [panelu WashData](/ha-washdata) (dostępny również z paska bocznego).",
"data": { "data": {
"name": "Nazwa urządzenia", "name": "Nazwa urządzenia",
"device_type": "Typ urządzenia", "device_type": "Typ urządzenia",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: timer {minutes} min", "timer_default_message": "{device}: timer {minutes} min",
"timer_pause_action_title": "Wznów cykl", "timer_pause_action_title": "Wznów cykl",
"timer_pause_body_suffix": "Cykl jest wstrzymany. Otwórz panel WashData, aby wznowić.", "timer_pause_body_suffix": "Cykl jest wstrzymany. Otwórz panel WashData, aby wznowić.",
"unload_dismiss_action_title": "Przestań przypominać",
"notify_live_waiting_message": "{device}: Nie rozpoznano jeszcze żadnego profilu.", "notify_live_waiting_message": "{device}: Nie rozpoznano jeszcze żadnego profilu.",
"vs_typical_longer": "o {pct}% dłużej niż zwykle", "vs_typical_longer": "o {pct}% dłużej niż zwykle",
"vs_typical_shorter": "o {pct}% krócej niż zwykle", "vs_typical_shorter": "o {pct}% krócej niż zwykle",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Configuração WashData", "title": "Configuração WashData",
"description": "Configure sua máquina de lavar ou outro eletrodoméstico.\n\nSensor de potência é necessário.\n\n**Em seguida, você será perguntado se deseja criar seu primeiro perfil.**", "description": "Configure sua máquina de lavar ou outro eletrodoméstico.\n\nSensor de potência é necessário.\n\nApós a configuração, abra o painel WashData pela barra lateral (ou acesse [/ha-washdata](/ha-washdata)) para visualizar ciclos, ajustar a detecção e gerenciar perfis.",
"data": { "data": {
"name": "Nome do dispositivo", "name": "Nome do dispositivo",
"device_type": "Tipo de dispositivo", "device_type": "Tipo de dispositivo",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Atualize o nome do dispositivo, o tipo de eletrodoméstico ou o sensor de potência.\n\nO painel WashData (barra lateral ou [/ha-washdata](/ha-washdata)) é onde detecção, ciclos, perfis e notificações são gerenciados.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Renomeie o dispositivo ou altere suas configurações principais de hardware. Todas as configurações de detecção, correspondência e notificação estão no [painel WashData](/ha-washdata) (também acessível pela barra lateral).",
"data": { "data": {
"name": "Nome do dispositivo", "name": "Nome do dispositivo",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: timer de {minutes} min", "timer_default_message": "{device}: timer de {minutes} min",
"timer_pause_action_title": "Retomar ciclo", "timer_pause_action_title": "Retomar ciclo",
"timer_pause_body_suffix": "O ciclo está pausado. Abra o painel WashData para retomar.", "timer_pause_body_suffix": "O ciclo está pausado. Abra o painel WashData para retomar.",
"unload_dismiss_action_title": "Parar de lembrar",
"notify_live_waiting_message": "{device}: Nenhum perfil identificado ainda.", "notify_live_waiting_message": "{device}: Nenhum perfil identificado ainda.",
"vs_typical_longer": "{pct}% mais longo que o normal", "vs_typical_longer": "{pct}% mais longo que o normal",
"vs_typical_shorter": "{pct}% mais curto que o normal", "vs_typical_shorter": "{pct}% mais curto que o normal",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Configuração WashData", "title": "Configuração WashData",
"description": "Configure a sua máquina de lavar ou outro electrodoméstico.\n\nÉ necessário um sensor de potência.\n\n**De seguida, ser-lhe-á perguntado se deseja criar o seu primeiro perfil.**", "description": "Configure a sua máquina de lavar ou outro electrodoméstico.\n\nÉ necessário um sensor de potência.\n\nApós a configuração, abra o painel WashData a partir da barra lateral (ou aceda a [/ha-washdata](/ha-washdata)) para ver os ciclos, ajustar a deteção e gerir perfis.",
"data": { "data": {
"name": "Nome do dispositivo", "name": "Nome do dispositivo",
"device_type": "Tipo de dispositivo", "device_type": "Tipo de dispositivo",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigurar WashData", "title": "Reconfigurar WashData",
"description": "Actualizar o nome do dispositivo, tipo de electrodoméstico ou sensor de potência.", "description": "Actualize o nome do dispositivo, o tipo de electrodoméstico ou o sensor de potência.\n\nO painel WashData (barra lateral, ou [/ha-washdata](/ha-washdata)) é onde a deteção, os ciclos, os perfis e as notificações são geridos.",
"data": { "data": {
"name": "Nome do dispositivo", "name": "Nome do dispositivo",
"device_type": "Tipo de dispositivo", "device_type": "Tipo de dispositivo",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "Definições WashData", "title": "Definições WashData",
"description": "Todas as definições -- detecção, correspondência, temporização, notificações, perfis e ciclos -- estão disponíveis no painel WashData. Utilize este formulário apenas para alterar o sensor de potência, tipo de dispositivo ou limiar de standby.", "description": "Mude o nome do dispositivo ou altere as suas definições de hardware principais. Todas as definições de deteção, correspondência e notificações estão no [painel WashData](/ha-washdata) (também acessível a partir da barra lateral).",
"data": { "data": {
"name": "Nome do dispositivo", "name": "Nome do dispositivo",
"device_type": "Tipo de dispositivo", "device_type": "Tipo de dispositivo",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: temporizador de {minutes} min", "timer_default_message": "{device}: temporizador de {minutes} min",
"timer_pause_action_title": "Retomar ciclo", "timer_pause_action_title": "Retomar ciclo",
"timer_pause_body_suffix": "O ciclo está em pausa. Abra o painel WashData para retomar.", "timer_pause_body_suffix": "O ciclo está em pausa. Abra o painel WashData para retomar.",
"unload_dismiss_action_title": "Parar de lembrar",
"notify_live_waiting_message": "{device}: ainda nenhum perfil reconhecido.", "notify_live_waiting_message": "{device}: ainda nenhum perfil reconhecido.",
"vs_typical_longer": "{pct}% mais longo do que o habitual", "vs_typical_longer": "{pct}% mais longo do que o habitual",
"vs_typical_shorter": "{pct}% mais curto do que o habitual", "vs_typical_shorter": "{pct}% mais curto do que o habitual",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Configurare WashData", "title": "Configurare WashData",
"description": "Configurați mașina de spălat sau alt aparat.\n\nEste necesar un senzor de putere.\n\n**În continuare, veți fi întrebat dacă doriți să vă creați primul profil.**", "description": "Configurați mașina de spălat sau alt aparat.\n\nEste necesar un senzor de putere.\n\nDupă configurare, deschideți panoul WashData din bara laterală (sau accesați [/ha-washdata](/ha-washdata)) pentru a vizualiza ciclurile, a ajusta detectarea și a gestiona profilurile.",
"data": { "data": {
"name": "Numele dispozitivului", "name": "Numele dispozitivului",
"device_type": "Tip de dispozitiv", "device_type": "Tip de dispozitiv",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Actualizați numele dispozitivului, tipul aparatului sau senzorul de putere.\n\nPanoul WashData (bara laterală sau [/ha-washdata](/ha-washdata)) este locul unde se gestionează detectarea, ciclurile, profilurile și notificările.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Redenumiți dispozitivul sau modificați setările hardware de bază. Toate setările de detectare, potrivire și notificare se află în [panoul WashData](/ha-washdata) (accesibil și din bara laterală).",
"data": { "data": {
"name": "Numele dispozitivului", "name": "Numele dispozitivului",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: cronometru de {minutes} min", "timer_default_message": "{device}: cronometru de {minutes} min",
"timer_pause_action_title": "Reluați ciclul", "timer_pause_action_title": "Reluați ciclul",
"timer_pause_body_suffix": "Ciclul este în pauză. Deschideți panoul WashData pentru a relua.", "timer_pause_body_suffix": "Ciclul este în pauză. Deschideți panoul WashData pentru a relua.",
"unload_dismiss_action_title": "Oprește mementourile",
"notify_live_waiting_message": "{device}: Niciun profil nu a fost recunoscut încă.", "notify_live_waiting_message": "{device}: Niciun profil nu a fost recunoscut încă.",
"vs_typical_longer": "cu {pct}% mai mult decât de obicei", "vs_typical_longer": "cu {pct}% mai mult decât de obicei",
"vs_typical_shorter": "cu {pct}% mai puțin decât de obicei", "vs_typical_shorter": "cu {pct}% mai puțin decât de obicei",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Настройка WashData", "title": "Настройка WashData",
"description": "Настройте стиральную машину или другой прибор.\n\nТребуется датчик мощности.\n\n**Далее вас спросят, хотите ли вы создать свой первый профиль.**", "description": "Настройте стиральную машину или другой прибор.\n\nТребуется датчик мощности.\n\nПосле настройки откройте панель WashData на боковой панели (или перейдите на [/ha-washdata](/ha-washdata)), чтобы просматривать циклы, настраивать обнаружение и управлять профилями.",
"data": { "data": {
"name": "Имя устройства", "name": "Имя устройства",
"device_type": "Тип устройства", "device_type": "Тип устройства",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Обновите имя устройства, тип устройства или датчик мощности.", "description": "Обновите имя устройства, тип прибора или датчик мощности.\n\nПанель WashData (боковая панель или [/ha-washdata](/ha-washdata)) — это место для управления обнаружением, циклами, профилями и уведомлениями.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "Все настройки обнаружение, сопоставление, время, уведомления, профили и циклы — доступны на панели WashData. Используйте эту форму только для изменения датчика мощности, типа устройства или порога режима ожидания.", "description": "Переименуйте устройство или измените его основные аппаратные настройки. Все настройки обнаружения, сопоставления и уведомлений находятся в [панели WashData](/ha-washdata) (также доступна из боковой панели).",
"data": { "data": {
"name": "Имя устройства", "name": "Имя устройства",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: таймер {minutes} мин", "timer_default_message": "{device}: таймер {minutes} мин",
"timer_pause_action_title": "Возобновить цикл", "timer_pause_action_title": "Возобновить цикл",
"timer_pause_body_suffix": "Цикл на паузе. Откройте панель WashData для возобновления.", "timer_pause_body_suffix": "Цикл на паузе. Откройте панель WashData для возобновления.",
"unload_dismiss_action_title": "Не напоминать",
"notify_live_waiting_message": "{device}: Профиль пока не распознан.", "notify_live_waiting_message": "{device}: Профиль пока не распознан.",
"vs_typical_longer": "на {pct}% дольше обычного", "vs_typical_longer": "на {pct}% дольше обычного",
"vs_typical_shorter": "на {pct}% короче обычного", "vs_typical_shorter": "на {pct}% короче обычного",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Nastavenie WashData", "title": "Nastavenie WashData",
"description": "Nakonfigurujte si práčku alebo iný spotrebič.\n\nVyžaduje sa snímač napájania.\n\n**Ďalej sa vás spýta, či si chcete vytvoriť svoj prvý profil.**", "description": "Nakonfigurujte si práčku alebo iný spotrebič.\n\nSnímač výkonu je povinný.\n\nPo nastavení otvorte panel WashData z bočného panelu (alebo prejdite na [/ha-washdata](/ha-washdata)) na zobrazenie cyklov, ladenie detekcie a správu profilov.",
"data": { "data": {
"name": "Názov zariadenia", "name": "Názov zariadenia",
"device_type": "Typ zariadenia", "device_type": "Typ zariadenia",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Aktualizujte názov zariadenia, typ spotrebiča alebo snímač výkonu.\n\nPanel WashData (bočný panel alebo [/ha-washdata](/ha-washdata)) slúži na správu detekcie, cyklov, profilov a oznámení.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Premenujte zariadenie alebo zmeňte jeho základné hardvérové nastavenia. Všetky nastavenia detekcie, párovania a oznámení sú na [paneli WashData](/ha-washdata) (dostupný aj z bočného panelu).",
"data": { "data": {
"name": "Názov zariadenia", "name": "Názov zariadenia",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: časovač {minutes} min", "timer_default_message": "{device}: časovač {minutes} min",
"timer_pause_action_title": "Obnoviť cyklus", "timer_pause_action_title": "Obnoviť cyklus",
"timer_pause_body_suffix": "Cyklus je pozastavený. Otvorte panel WashData na obnovenie.", "timer_pause_body_suffix": "Cyklus je pozastavený. Otvorte panel WashData na obnovenie.",
"unload_dismiss_action_title": "Prestať pripomínať",
"notify_live_waiting_message": "{device}: Zatiaľ nebol rozpoznaný žiadny profil.", "notify_live_waiting_message": "{device}: Zatiaľ nebol rozpoznaný žiadny profil.",
"vs_typical_longer": "o {pct}% dlhšie než zvyčajne", "vs_typical_longer": "o {pct}% dlhšie než zvyčajne",
"vs_typical_shorter": "o {pct}% kratšie než zvyčajne", "vs_typical_shorter": "o {pct}% kratšie než zvyčajne",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Nastavitev WashData", "title": "Nastavitev WashData",
"description": "Konfigurirajte svoj pralni stroj ali drugo napravo.\n\nPotreben je senzor moči.\n\n**Nato boste pozvani, ali želite ustvariti svoj prvi profil.**", "description": "Konfigurirajte svoj pralni stroj ali drugo napravo.\n\nSenzor moči je obvezen.\n\nPo nastavitvi odprite ploščo WashData s stranske vrstice (ali pojdite na [/ha-washdata](/ha-washdata)) za ogled ciklov, prilagoditev zaznavanja in upravljanje profilov.",
"data": { "data": {
"name": "Ime naprave", "name": "Ime naprave",
"device_type": "Vrsta naprave", "device_type": "Vrsta naprave",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Ponovno konfigurirajte WashData", "title": "Ponovno konfigurirajte WashData",
"description": "Posodobite ime naprave, vrsto naprave ali senzor moči.", "description": "Posodobite ime naprave, vrsto naprave ali senzor moči.\n\nPlosca WashData (stranska vrstica ali [/ha-washdata](/ha-washdata)) je namenjena upravljanju zaznavanja, ciklov, profilov in obvestil.",
"data": { "data": {
"name": "Ime naprave", "name": "Ime naprave",
"device_type": "Vrsta naprave", "device_type": "Vrsta naprave",
@@ -49,13 +49,14 @@
"min_power": "Najmanjši prag moči (W)" "min_power": "Najmanjši prag moči (W)"
}, },
"title": "Nastavitve WashData", "title": "Nastavitve WashData",
"description": "Preimenujte napravo ali spremenite njene osnovne nastavitve strojne opreme. Vse nastavitve zaznavanja, ujemanja in obveščanja so na plošči WashData." "description": "Preimenujte napravo ali spremenite njene osnovne nastavitve strojne opreme. Vse nastavitve zaznavanja, ujemanja in obveščanja so na [plošči WashData](/ha-washdata) (dostopna tudi s stranske vrstice)."
} }
}, },
"error": { "error": {
"timer_default_message": "{device}: časovnik {minutes} min", "timer_default_message": "{device}: časovnik {minutes} min",
"timer_pause_action_title": "Nadaljuj cikel", "timer_pause_action_title": "Nadaljuj cikel",
"timer_pause_body_suffix": "Cikel je zaustavljen. Odprite ploščo WashData za nadaljevanje.", "timer_pause_body_suffix": "Cikel je zaustavljen. Odprite ploščo WashData za nadaljevanje.",
"unload_dismiss_action_title": "Nehaj opominjati",
"notify_live_waiting_message": "{device}: Noben profil se še ne ujema.", "notify_live_waiting_message": "{device}: Noben profil se še ne ujema.",
"vs_typical_longer": "{pct}% dlje kot običajno", "vs_typical_longer": "{pct}% dlje kot običajno",
"vs_typical_shorter": "{pct}% krajše kot običajno", "vs_typical_shorter": "{pct}% krajše kot običajno",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Konfigurimi WashData", "title": "Konfigurimi WashData",
"description": "Konfiguro makinën larëse ose pajisje tjetër.\n\nKërkohet sensori i fuqisë.\n\n**Më pas, do të pyeteni nëse dëshironi të krijoni profilin tuaj të parë.**", "description": "Konfiguro makinën larëse ose pajisje tjetër.\n\nKërkohet sensori i fuqisë.\n\nPas konfigurimit, hap panelin WashData nga shiriti anësor (ose shko te [/ha-washdata](/ha-washdata)) për të parë ciklet, rregulluar zbulimin dhe menaxhuar profilet.",
"data": { "data": {
"name": "Emri i pajisjes", "name": "Emri i pajisjes",
"device_type": "Lloji i pajisjes", "device_type": "Lloji i pajisjes",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Rikonfiguro WashData", "title": "Rikonfiguro WashData",
"description": "Përditëso emrin e pajisjes, llojin e pajisjes ose sensorin e fuqisë.", "description": "Përditëso emrin e pajisjes, llojin e pajisjes ose sensorin e fuqisë.\n\nPaneli WashData (shiriti anësor, ose [/ha-washdata](/ha-washdata)) është ku menaxhohen zbulimi, ciklet, profilet dhe njoftimet.",
"data": { "data": {
"name": "Emri i pajisjes", "name": "Emri i pajisjes",
"device_type": "Lloji i pajisjes", "device_type": "Lloji i pajisjes",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "Cilësimet WashData", "title": "Cilësimet WashData",
"description": "Të gjitha cilësimet -- zbulimi, përputhja, koha, njoftimet, profilet dhe ciklet -- janë të disponueshme në panelin WashData. Përdorni këtë formular vetëm për të ndryshuar sensorin e fuqisë, llojin e pajisjes ose pragun e gatishmërisë.", "description": "Riemërtoni pajisjen ose ndryshoni cilësimet e saj bazë të harduerit. Të gjitha cilësimet e zbulimit, përputhjes dhe njoftimeve janë[panelin WashData](/ha-washdata) (i arritshëm edhe nga shiriti anësor).",
"data": { "data": {
"name": "Emri i pajisjes", "name": "Emri i pajisjes",
"device_type": "Lloji i pajisjes", "device_type": "Lloji i pajisjes",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: kohëmatës {minutes} min", "timer_default_message": "{device}: kohëmatës {minutes} min",
"timer_pause_action_title": "Rifillo ciklin", "timer_pause_action_title": "Rifillo ciklin",
"timer_pause_body_suffix": "Cikli është në pauzë. Hapni panelin WashData për të vazhduar.", "timer_pause_body_suffix": "Cikli është në pauzë. Hapni panelin WashData për të vazhduar.",
"unload_dismiss_action_title": "Ndalo kujtesat",
"notify_live_waiting_message": "{device}: Ende nuk është njohur asnjë profil.", "notify_live_waiting_message": "{device}: Ende nuk është njohur asnjë profil.",
"vs_typical_longer": "{pct}% më gjatë se zakonisht", "vs_typical_longer": "{pct}% më gjatë se zakonisht",
"vs_typical_shorter": "{pct}% më shkurt se zakonisht", "vs_typical_shorter": "{pct}% më shkurt se zakonisht",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData podešavanje", "title": "WashData podešavanje",
"description": "Konfiguriš svoju mašinu za pranje veša ili drugi uređaj.\n\nSenzor snage je obavezan.\n\n**Dalje, bićeš upitan da li želiš da napraviš prvi profil.**", "description": "Konfiguriši svoju mašinu za pranje veša ili drugi uređaj.\n\nSenzor snage je obavezan.\n\nNakon podešavanja, otvori WashData panel iz bočne trake (ili idi na [/ha-washdata](/ha-washdata)) za pregled ciklusa, podešavanje detekcije i upravljanje profilima.",
"data": { "data": {
"name": "Naziv uređaja", "name": "Naziv uređaja",
"device_type": "Tip uređaja", "device_type": "Tip uređaja",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Ponovo konfiguriši WashData", "title": "Ponovo konfiguriši WashData",
"description": "Ažuriraj naziv uređaja, tip uređaja ili senzor snage.", "description": "Ažuriraj naziv uređaja, tip uređaja ili senzor snage.\n\nWashData panel (bočna traka ili [/ha-washdata](/ha-washdata)) je mesto gde se upravljaju detekcija, ciklusi, profili i obaveštenja.",
"data": { "data": {
"name": "Naziv uređaja", "name": "Naziv uređaja",
"device_type": "Tip uređaja", "device_type": "Tip uređaja",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData podešavanja", "title": "WashData podešavanja",
"description": "Sva podešavanja -- detekcija, podudaranje, tajming, obaveštenja, profili i ciklusi -- dostupna su u WashData panelu. Koristi ovaj obrazac samo da promeniš senzor snage, tip uređaja ili prag mirovanja.", "description": "Preimenuj uređaj ili promeni njegova osnovna hardverska podešavanja. Sva podešavanja detekcije, podudaranja i obaveštenja nalaze se u [WashData panelu](/ha-washdata) (dostupan i iz bočne trake).",
"data": { "data": {
"name": "Naziv uređaja", "name": "Naziv uređaja",
"device_type": "Tip uređaja", "device_type": "Tip uređaja",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: tajmer {minutes} min", "timer_default_message": "{device}: tajmer {minutes} min",
"timer_pause_action_title": "Nastavi ciklus", "timer_pause_action_title": "Nastavi ciklus",
"timer_pause_body_suffix": "Ciklus je pauziran. Otvori WashData panel da nastaviš.", "timer_pause_body_suffix": "Ciklus je pauziran. Otvori WashData panel da nastaviš.",
"unload_dismiss_action_title": "Prestani da podsećaš",
"notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.", "notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.",
"vs_typical_longer": "{pct}% duže nego obično", "vs_typical_longer": "{pct}% duže nego obično",
"vs_typical_shorter": "{pct}% kraće nego obično", "vs_typical_shorter": "{pct}% kraće nego obično",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData Setup", "title": "WashData Setup",
"description": "Konfigurera din tvättmaskin eller annan apparat.\n\nEffektsensor krävs.\n\n**Närnäst kommer du att bli tillfrågad om du vill skapa din första profil.**", "description": "Konfigurera din tvättmaskin eller annan apparat.\n\nEffektsensor krävs.\n\nEfter installationen öppnar du WashData-panelen från sidofältet (eller gå till [/ha-washdata](/ha-washdata)) för att visa cykler, finjustera identifiering och hantera profiler.",
"data": { "data": {
"name": "Enhetens namn", "name": "Enhetens namn",
"device_type": "Enhetstyp", "device_type": "Enhetstyp",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Konfigurera om WashData", "title": "Konfigurera om WashData",
"description": "Uppdatera enhetens namn, apparattyp eller effektsensor.", "description": "Uppdatera enhetsnamnet, apparattypen eller effektsensorn.\n\nWashData-panelen (sidofältet eller [/ha-washdata](/ha-washdata)) är där identifiering, cykler, profiler och notiser hanteras.",
"data": { "data": {
"name": "Enhetens namn", "name": "Enhetens namn",
"device_type": "Enhetstyp", "device_type": "Enhetstyp",
@@ -49,13 +49,14 @@
"min_power": "Minsta effekttröskel (W)" "min_power": "Minsta effekttröskel (W)"
}, },
"title": "WashData-inställningar", "title": "WashData-inställningar",
"description": "Byt namn på enheten eller ändra dess kärninställningar för hårdvara. Alla detekterings-, matchnings- och meddelandeinställningar finns i WashData-panelen." "description": "Byt namn på enheten eller ändra dess grundläggande hårdvaruinställningar. Alla inställningar för identifiering, matchning och notiser finns i [WashData-panelen](/ha-washdata) (även nåbar från sidofältet)."
} }
}, },
"error": { "error": {
"timer_default_message": "{device}: timer {minutes} min", "timer_default_message": "{device}: timer {minutes} min",
"timer_pause_action_title": "Återuppta cykeln", "timer_pause_action_title": "Återuppta cykeln",
"timer_pause_body_suffix": "Cykeln är pausad. Öppna WashData-panelen för att fortsätta.", "timer_pause_body_suffix": "Cykeln är pausad. Öppna WashData-panelen för att fortsätta.",
"unload_dismiss_action_title": "Sluta påminna",
"notify_live_waiting_message": "{device}: Ingen profil matchad ännu.", "notify_live_waiting_message": "{device}: Ingen profil matchad ännu.",
"vs_typical_longer": "{pct}% längre än vanligt", "vs_typical_longer": "{pct}% längre än vanligt",
"vs_typical_shorter": "{pct}% kortare än vanligt", "vs_typical_shorter": "{pct}% kortare än vanligt",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData Kurulumu", "title": "WashData Kurulumu",
"description": "Çamaşır makinenizi veya diğer cihazınızı yapılandırın.\n\nGüç sensörü gereklidir.\n\n**Ardından, ilk profilinizi oluşturmak isteyip istemediğiniz sorulacaktır.**", "description": "Çamaşır makinenizi veya diğer cihazınızı yapılandırın.\n\nGüç sensörü gereklidir.\n\nKurulumdan sonra döngüleri görüntülemek, algılamayı ayarlamak ve profilleri yönetmek için kenar çubuğundan WashData panelini açın (veya [/ha-washdata](/ha-washdata) adresine gidin).",
"data": { "data": {
"name": "Cihaz Adı", "name": "Cihaz Adı",
"device_type": "Cihaz Türü", "device_type": "Cihaz Türü",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Update the device name, appliance type, or power sensor.", "description": "Cihaz adını, cihaz türünü veya güç sensörünü güncelleyin.\n\nAlgılama, döngüler, profiller ve bildirimler WashData panelinde (kenar çubuğu veya [/ha-washdata](/ha-washdata)) yönetilir.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", "description": "Cihazı yeniden adlandırın veya temel donanım ayarlarını değiştirin. Tüm algılama, eşleştirme ve bildirim ayarları [WashData panelinde](/ha-washdata) bulunur (kenar çubuğundan da erişilebilir).",
"data": { "data": {
"name": "Cihaz Adı", "name": "Cihaz Adı",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: {minutes} dk zamanlayıcı", "timer_default_message": "{device}: {minutes} dk zamanlayıcı",
"timer_pause_action_title": "Döngüyü Devam Ettir", "timer_pause_action_title": "Döngüyü Devam Ettir",
"timer_pause_body_suffix": "Döngü duraklatıldı. Devam ettirmek için WashData panelini açın.", "timer_pause_body_suffix": "Döngü duraklatıldı. Devam ettirmek için WashData panelini açın.",
"unload_dismiss_action_title": "Hatırlatmayı durdur",
"notify_live_waiting_message": "{device}: Henüz eşleşen profil yok.", "notify_live_waiting_message": "{device}: Henüz eşleşen profil yok.",
"vs_typical_longer": "olağandan %{pct} daha uzun", "vs_typical_longer": "olağandan %{pct} daha uzun",
"vs_typical_shorter": "olağandan %{pct} daha kısa", "vs_typical_shorter": "olağandan %{pct} daha kısa",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "Налаштування WashData", "title": "Налаштування WashData",
"description": "Налаштуйте пральну машину чи інший прилад.\n\nПотрібен датчик потужності.\n\n**Далі вас запитають, чи хочете ви створити свій перший профіль.**", "description": "Налаштуйте пральну машину чи інший прилад.\n\nПотрібен датчик потужності.\n\nПісля налаштування відкрийте панель WashData з бічної панелі (або перейдіть на [/ha-washdata](/ha-washdata)), щоб переглядати цикли, налаштувати виявлення та керувати профілями.",
"data": { "data": {
"name": "Назва пристрою", "name": "Назва пристрою",
"device_type": "Тип пристрою", "device_type": "Тип пристрою",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "Reconfigure WashData", "title": "Reconfigure WashData",
"description": "Оновіть назву пристрою, тип пристрою або датчик потужності.", "description": "Оновіть назву пристрою, тип приладу або датчик потужності.\n\nПанель WashData (бічна панель або [/ha-washdata](/ha-washdata)) — це місце для керування виявленням, циклами, профілями та сповіщеннями.",
"data": { "data": {
"name": "Device Name", "name": "Device Name",
"device_type": "Device Type", "device_type": "Device Type",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData Settings", "title": "WashData Settings",
"description": "Усі налаштування виявлення, зіставлення, час, сповіщення, профілі та цикли – доступні на панелі WashData. Використовуйте цю форму лише для зміни датчика потужності, типу пристрою або порогового значення в режимі очікування.", "description": "Перейменуйте пристрій або змініть його основні апаратні налаштування. Усі налаштування виявлення, зіставлення та сповіщень знаходяться в [панелі WashData](/ha-washdata) (також доступна з бічної панелі).",
"data": { "data": {
"name": "Назва пристрою", "name": "Назва пристрою",
"device_type": "Device Type", "device_type": "Device Type",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}: таймер {minutes} хв", "timer_default_message": "{device}: таймер {minutes} хв",
"timer_pause_action_title": "Відновити цикл", "timer_pause_action_title": "Відновити цикл",
"timer_pause_body_suffix": "Цикл призупинено. Відкрийте панель WashData для відновлення.", "timer_pause_body_suffix": "Цикл призупинено. Відкрийте панель WashData для відновлення.",
"unload_dismiss_action_title": "Не нагадувати",
"notify_live_waiting_message": "{device}: Профіль ще не розпізнано.", "notify_live_waiting_message": "{device}: Профіль ще не розпізнано.",
"vs_typical_longer": "на {pct}% довше, ніж зазвичай", "vs_typical_longer": "на {pct}% довше, ніж зазвичай",
"vs_typical_shorter": "на {pct}% коротше, ніж зазвичай", "vs_typical_shorter": "на {pct}% коротше, ніж зазвичай",
@@ -3,7 +3,7 @@
"step": { "step": {
"user": { "user": {
"title": "WashData 设置", "title": "WashData 设置",
"description": "配置您的洗衣机或其他设备。\n\n需要功率传感器。\n\n**接下来,系统会询问您是否要创建您的第一个个人资料。**", "description": "配置您的洗衣机或其他家电设备。\n\n需要功率传感器。\n\n设置完成后,请从侧边栏打开 WashData 面板(或访问 [/ha-washdata](/ha-washdata))来查看周期、调整检测参数和管理配置文件。",
"data": { "data": {
"name": "设备名称", "name": "设备名称",
"device_type": "设备类型", "device_type": "设备类型",
@@ -19,7 +19,7 @@
}, },
"reconfigure": { "reconfigure": {
"title": "重新配置 WashData", "title": "重新配置 WashData",
"description": "更新设备名称、设备类型或功率传感器。", "description": "更新设备名称、家电类型或功率传感器。\n\nWashData 面板(侧边栏或 [/ha-washdata](/ha-washdata))用于管理检测、周期、配置文件和通知。",
"data": { "data": {
"name": "设备名称", "name": "设备名称",
"device_type": "设备类型", "device_type": "设备类型",
@@ -43,7 +43,7 @@
"step": { "step": {
"init": { "init": {
"title": "WashData 设置", "title": "WashData 设置",
"description": "所有设置——检测、匹配、计时、通知、配置文件和周期——都可以在 WashData 面板中使用。仅使用此表单来更改功率传感器、设备类型或待机阈值。", "description": "重命名设备或更改其核心硬件设置。所有检测、匹配和通知设置均[WashData 面板](/ha-washdata) 中(也可从侧边栏访问)。",
"data": { "data": {
"name": "设备名称", "name": "设备名称",
"device_type": "设备类型", "device_type": "设备类型",
@@ -56,6 +56,7 @@
"timer_default_message": "{device}{minutes} 分钟定时器", "timer_default_message": "{device}{minutes} 分钟定时器",
"timer_pause_action_title": "恢复周期", "timer_pause_action_title": "恢复周期",
"timer_pause_body_suffix": "周期已暂停。打开 WashData 面板以恢复。", "timer_pause_body_suffix": "周期已暂停。打开 WashData 面板以恢复。",
"unload_dismiss_action_title": "停止提醒",
"notify_live_waiting_message": "{device}:尚未匹配到配置文件。", "notify_live_waiting_message": "{device}:尚未匹配到配置文件。",
"vs_typical_longer": "比平常长 {pct}%", "vs_typical_longer": "比平常长 {pct}%",
"vs_typical_shorter": "比平常短 {pct}%", "vs_typical_shorter": "比平常短 {pct}%",
+312 -51
View File
@@ -22,6 +22,7 @@ import collections
import functools import functools
import json import json
import logging import logging
import math
import os import os
import re import re
import time import time
@@ -39,6 +40,7 @@ from .const import (
CONF_NAME, CONF_NAME,
CONF_COMPLETION_MIN_SECONDS, CONF_COMPLETION_MIN_SECONDS,
CONF_DEVICE_TYPE, CONF_DEVICE_TYPE,
CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE,
CONF_DOOR_SENSOR_ENTITY, CONF_DOOR_SENSOR_ENTITY,
CONF_ANTI_WRINKLE_EXIT_POWER, CONF_ANTI_WRINKLE_EXIT_POWER,
CONF_ANTI_WRINKLE_MAX_POWER, CONF_ANTI_WRINKLE_MAX_POWER,
@@ -71,6 +73,7 @@ from .const import (
CONF_SWITCH_ENTITY, CONF_SWITCH_ENTITY,
CONF_WATCHDOG_INTERVAL, CONF_WATCHDOG_INTERVAL,
DEFAULT_DEVICE_TYPE, DEFAULT_DEVICE_TYPE,
DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS,
DEFAULT_MAINTENANCE_REMINDER_CYCLES, DEFAULT_MAINTENANCE_REMINDER_CYCLES,
DEFAULT_MIN_POWER, DEFAULT_MIN_POWER,
DEFAULT_OFF_DELAY, DEFAULT_OFF_DELAY,
@@ -81,6 +84,7 @@ from .const import (
DOMAIN, DOMAIN,
ENABLE_ML_SUGGESTIONS, ENABLE_ML_SUGGESTIONS,
ENABLE_ML_TRAINING, ENABLE_ML_TRAINING,
PLAYGROUND_PRESET_MAX,
SHOW_ML_LAB, SHOW_ML_LAB,
STATE_COLORS, STATE_COLORS,
) )
@@ -92,16 +96,11 @@ from .ws_schema import WS_OPEN_RESPONSES, WS_RESPONSE_TYPES
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
# Read once at import time (manifest.json is static) so ws_get_constants never does # Populated once during async_setup_entry (stored in hass.data["ha_washdata_version"])
# blocking I/O on the event loop. Falls back to "" if the file is absent. # so ws_get_constants never does blocking I/O on the event loop. A module-level
try: # read_text() here would run on the event loop the first time ws_api is imported
from pathlib import Path as _Path # inside async_setup_entry (#328/#335).
_INTEGRATION_VERSION: str = json.loads( _INTEGRATION_VERSION: str = ""
(_Path(__file__).parent / "manifest.json").read_text(encoding="utf-8")
).get("version", "")
del _Path
except Exception: # pragma: no cover # pylint: disable=broad-exception-caught
_INTEGRATION_VERSION = ""
# ─── WS response contract (Group H1) ──────────────────────────────────────────── # ─── WS response contract (Group H1) ────────────────────────────────────────────
# Debug-only validation of every send_result payload against the TypedDict # Debug-only validation of every send_result payload against the TypedDict
@@ -1091,6 +1090,7 @@ def async_register_commands(hass: HomeAssistant) -> None:
ws_get_constants, ws_get_constants,
# Suggestions # Suggestions
ws_get_suggestions, ws_apply_suggestions, ws_clear_suggestions, ws_run_suggestion_analysis, ws_get_suggestions, ws_apply_suggestions, ws_clear_suggestions, ws_run_suggestion_analysis,
ws_set_suggestion_lock,
# Cycle curve / interactive editing # Cycle curve / interactive editing
ws_get_cycle_power_data, ws_trim_cycle, ws_analyze_split, ws_apply_split, ws_apply_merge, ws_get_cycle_power_data, ws_trim_cycle, ws_analyze_split, ws_apply_split, ws_apply_merge,
# Profile envelope / member cycles # Profile envelope / member cycles
@@ -1116,6 +1116,8 @@ def async_register_commands(hass: HomeAssistant) -> None:
ws_pause_cycle, ws_resume_cycle, ws_terminate_cycle, ws_pause_cycle, ws_resume_cycle, ws_terminate_cycle,
# Playground (F3): DTW visualizer # Playground (F3): DTW visualizer
ws_get_dtw_debug, ws_get_dtw_debug,
# Playground settings control panel: live values + named presets
ws_get_playground_settings, ws_save_playground_preset, ws_delete_playground_preset,
# Playground redesign: faithful single-cycle sim + history table + sweep # Playground redesign: faithful single-cycle sim + history table + sweep
ws_run_playground_cycle_detail, ws_run_playground_history, ws_run_playground_cycle_detail, ws_run_playground_history,
ws_run_playground_sweep, ws_run_playground_sweep,
@@ -1215,7 +1217,13 @@ def ws_get_devices(
except Exception: # pylint: disable=broad-exception-caught except Exception: # pylint: disable=broad-exception-caught
pass pass
try: try:
info["feedback_count"] = len(store.get_pending_feedback() or {}) # Count only pending feedback whose cycle still exists, so the
# badge cannot outrun the review list after a cycle is deleted,
# merged or split (#362). Defense-in-depth on top of the prune in
# those mutation paths; also self-heals pre-existing orphans.
_pend = store.get_pending_feedback() or {}
_live = {c.get("id") for c in store.get_past_cycles()}
info["feedback_count"] = sum(1 for cid in _pend if cid in _live)
except Exception: # pylint: disable=broad-exception-caught except Exception: # pylint: disable=broad-exception-caught
pass pass
info["is_user_paused"] = bool(getattr(manager, "is_user_paused", False)) info["is_user_paused"] = bool(getattr(manager, "is_user_paused", False))
@@ -1372,6 +1380,19 @@ async def ws_set_options(
if effective_device_type != DEVICE_TYPE_PUMP: if effective_device_type != DEVICE_TYPE_PUMP:
new_options.pop(CONF_PUMP_STUCK_DURATION, None) new_options.pop(CONF_PUMP_STUCK_DURATION, None)
# Numeric-finite validation for fields that the cycle-detector float()-casts at
# build time; coerce bad submissions to the compiled default so storage stays clean.
if CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE in new_options:
try:
_qr = float(new_options[CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE])
if not math.isfinite(_qr):
raise ValueError("non-finite")
new_options[CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE] = _qr
except (TypeError, ValueError):
new_options[CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE] = (
DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS
)
# Partition identity out of options: the display name is carried by the # Partition identity out of options: the display name is carried by the
# entry title, never persisted in options (matches the config-flow invariant # entry title, never persisted in options (matches the config-flow invariant
# that CONF_NAME is absent from options). # that CONF_NAME is absent from options).
@@ -3013,9 +3034,12 @@ async def ws_get_export_inventory(
entry = _get_entry(hass, entry_id) entry = _get_entry(hass, entry_id)
try: try:
opts = dict(entry.options) if entry else {} opts = dict(entry.options) if entry else {}
manifest = await hass.async_add_executor_job( # Run the inventory scan synchronously on the event loop. It's a fast walk
manager.profile_store.get_export_inventory, opts # (counts + small per-cycle {id,date,duration} dicts) and staying on the loop
) # is inherently safe from concurrent mutation - offloading it to an executor
# would read the live, mutable store lists from another thread and could raise
# "list changed size during iteration" without a full (expensive) snapshot.
manifest = manager.profile_store.get_export_inventory(opts)
_send_result(connection, msg["id"], "get_export_inventory", {"manifest": manifest}) _send_result(connection, msg["id"], "get_export_inventory", {"manifest": manifest})
except Exception as exc: # pylint: disable=broad-exception-caught except Exception as exc: # pylint: disable=broad-exception-caught
connection.send_error(msg["id"], "unknown_error", str(exc)) connection.send_error(msg["id"], "unknown_error", str(exc))
@@ -3239,23 +3263,8 @@ def ws_get_constants(
from .frontend import BRAND_ICON_URL as _BRAND_ICON_URL, BRAND_ICON_REGISTERED_KEY as _BRAND_ICON_KEY # pylint: disable=import-outside-toplevel from .frontend import BRAND_ICON_URL as _BRAND_ICON_URL, BRAND_ICON_REGISTERED_KEY as _BRAND_ICON_KEY # pylint: disable=import-outside-toplevel
from .const import STORE_WEB_ORIGIN from .const import STORE_WEB_ORIGIN
from . import store_account from . import store_account
from .const import ( # pylint: disable=import-outside-toplevel
DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO,
DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO,
DEFAULT_DTW_BANDWIDTH,
MATCH_CORR_WEIGHT,
MATCH_KEEP_MIN_SCORE,
MATCH_DTW_BLEND,
MATCH_DTW_ENSEMBLE_W,
MATCH_DDTW_DIST_SCALE,
MATCH_DTW_REFINE_TOP_N,
MATCH_DURATION_WEIGHT,
MATCH_ENERGY_WEIGHT,
MATCH_DURATION_SCALE,
MATCH_ENERGY_SCALE,
)
_send_result(connection, msg["id"], "get_constants", { _send_result(connection, msg["id"], "get_constants", {
"version": _INTEGRATION_VERSION, "version": hass.data.get("ha_washdata_version", _INTEGRATION_VERSION),
"icon_url": _BRAND_ICON_URL if hass.data.get(_BRAND_ICON_KEY) else None, "icon_url": _BRAND_ICON_URL if hass.data.get(_BRAND_ICON_KEY) else None,
"device_types": device_types, "device_types": device_types,
"state_colors": dict(STATE_COLORS), "state_colors": dict(STATE_COLORS),
@@ -3265,22 +3274,9 @@ def ws_get_constants(
"PROFILE_MIN_WARMUP_CYCLES": CONF_PROFILE_MIN_WARMUP_CYCLES, "PROFILE_MIN_WARMUP_CYCLES": CONF_PROFILE_MIN_WARMUP_CYCLES,
# Canonical matcher defaults for the Playground's matcher-param fields, so # Canonical matcher defaults for the Playground's matcher-param fields, so
# the panel's _PG_MATCH_DEFAULTS table cannot silently drift from const.py. # the panel's _PG_MATCH_DEFAULTS table cannot silently drift from const.py.
# The panel keeps that table only as an offline fallback. # The panel keeps that table only as an offline fallback. Single source:
"pg_match_defaults": { # playground.MATCH_DEFAULTS_BY_OPTION (also used by effective_settings).
"profile_match_min_duration_ratio": DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO, "pg_match_defaults": dict(playground.MATCH_DEFAULTS_BY_OPTION),
"profile_match_max_duration_ratio": DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO,
"corr_weight": MATCH_CORR_WEIGHT,
"keep_min_score": MATCH_KEEP_MIN_SCORE,
"dtw_bandwidth": DEFAULT_DTW_BANDWIDTH,
"dtw_blend": MATCH_DTW_BLEND,
"dtw_ensemble_w": MATCH_DTW_ENSEMBLE_W,
"dtw_ddtw_scale": MATCH_DDTW_DIST_SCALE,
"dtw_refine_top_n": MATCH_DTW_REFINE_TOP_N,
"duration_weight": MATCH_DURATION_WEIGHT,
"energy_weight": MATCH_ENERGY_WEIGHT,
"duration_scale": MATCH_DURATION_SCALE,
"energy_scale": MATCH_ENERGY_SCALE,
},
# Community store: the panel opens <origin>/connect.html for the GitHub # Community store: the panel opens <origin>/connect.html for the GitHub
# handoff and validates postMessage against new URL(origin).origin. # handoff and validates postMessage against new URL(origin).origin.
"store_online_available": True, "store_online_available": True,
@@ -3349,7 +3345,14 @@ def ws_get_suggestions(
except Exception as exc: # pylint: disable=broad-exception-caught except Exception as exc: # pylint: disable=broad-exception-caught
_LOGGER.debug("Error reading suggestions for %s: %s", entry_id, exc) _LOGGER.debug("Error reading suggestions for %s: %s", entry_id, exc)
_send_result(connection, msg["id"], "get_suggestions", {"suggestions": out}) try:
locked = manager.profile_store.get_locked_suggestions()
except Exception: # pylint: disable=broad-exception-caught
locked = []
_send_result(
connection, msg["id"], "get_suggestions",
{"suggestions": out, "locked_suggestions": locked},
)
@websocket_api.websocket_command( @websocket_api.websocket_command(
@@ -3433,6 +3436,42 @@ async def ws_clear_suggestions(
connection.send_error(msg["id"], "unknown_error", str(exc)) connection.send_error(msg["id"], "unknown_error", str(exc))
@websocket_api.websocket_command(
{
vol.Required("type"): "ha_washdata/set_suggestion_lock",
vol.Required("entry_id"): str,
vol.Required("key"): str,
vol.Required("locked"): bool,
}
)
@websocket_api.async_response
async def ws_set_suggestion_lock(
hass: HomeAssistant,
connection: websocket_api.ActiveConnection,
msg: dict[str, Any],
) -> None:
"""Lock or unlock a tuning suggestion key so the auto-tuner stops (or resumes)
proposing it (#343)."""
entry_id: str = msg["entry_id"]
key: str = msg["key"]
if key not in _SUGGESTION_KEYS:
connection.send_error(msg["id"], "invalid_key", f"Unknown suggestion key: {key!r}")
return
manager = _get_manager(hass, entry_id)
if manager is None:
_err_not_found(connection, msg["id"], entry_id)
return
try:
await manager.profile_store.set_suggestion_locked(key, bool(msg["locked"]))
manager.notify_update()
_send_result(
connection, msg["id"], "set_suggestion_lock",
{"success": True, "locked_suggestions": manager.profile_store.get_locked_suggestions()},
)
except Exception as exc: # pylint: disable=broad-exception-caught
connection.send_error(msg["id"], "unknown_error", str(exc))
@websocket_api.websocket_command( @websocket_api.websocket_command(
{vol.Required("type"): "ha_washdata/run_suggestion_analysis", vol.Required("entry_id"): str} {vol.Required("type"): "ha_washdata/run_suggestion_analysis", vol.Required("entry_id"): str}
) )
@@ -4085,6 +4124,14 @@ async def ws_set_user_prefs(
# F2: per-user Basic/Advanced settings disclosure level. # F2: per-user Basic/Advanced settings disclosure level.
if p.get("settings_level") in ("basic", "advanced"): if p.get("settings_level") in ("basic", "advanced"):
cur["settings_level"] = p["settings_level"] cur["settings_level"] = p["settings_level"]
# Panel font-size multiplier (accessibility). Coerce + clamp to safe bounds so a
# bad value can never break rendering; without this it was silently dropped and
# the setting vanished on refresh.
if "font_scale" in p:
try:
cur["font_scale"] = max(0.7, min(2.0, float(p["font_scale"])))
except (TypeError, ValueError):
cur.pop("font_scale", None)
# Display prefs: cycle date format + panel language override (paired with the # Display prefs: cycle date format + panel language override (paired with the
# panel's save-prefs payload; without these they would be silently dropped). # panel's save-prefs payload; without these they would be silently dropped).
if p.get("date_format") in _PREF_DATE_FORMATS: if p.get("date_format") in _PREF_DATE_FORMATS:
@@ -4635,7 +4682,9 @@ def _compute_ml_comparison(
} }
def _build_settings_comparison(manager: Any, merged: dict[str, Any]) -> dict[str, Any]: def _build_settings_comparison(
manager: Any, merged: dict[str, Any], engine: Any = None
) -> dict[str, Any]:
"""Build the enriched Classic-vs-ML settings comparison (executor-safe). """Build the enriched Classic-vs-ML settings comparison (executor-safe).
Runs both the classic :class:`SuggestionEngine` and the Runs both the classic :class:`SuggestionEngine` and the
@@ -4651,8 +4700,13 @@ def _build_settings_comparison(manager: Any, merged: dict[str, Any]) -> dict[str
except Exception: # pylint: disable=broad-exception-caught except Exception: # pylint: disable=broad-exception-caught
return {} return {}
learning = getattr(manager, "learning_manager", None) # `engine` is a for_job() copy prepared on the event loop with the config
classic = getattr(learning, "suggestion_engine", None) # snapshot already bound; fall back to the shared engine only for callers that
# did not supply one (its _entry_options() then does a live read).
classic = engine
if classic is None:
learning = getattr(manager, "learning_manager", None)
classic = getattr(learning, "suggestion_engine", None)
if classic is None: if classic is None:
return {} return {}
@@ -4792,8 +4846,16 @@ async def ws_get_ml_comparison(
# Stage 3: replace the basic off_delay-only comparison with the full # Stage 3: replace the basic off_delay-only comparison with the full
# Classic-vs-ML settings table when ML suggestions are unlocked. # Classic-vs-ML settings table when ML suggestions are unlocked.
if ENABLE_ML_SUGGESTIONS: if ENABLE_ML_SUGGESTIONS:
# Bind this handler's already-merged view to a throwaway engine copy
# before the executor hop: reading the config entry is loop-affine, so
# the generators must not re-read it from the worker thread, and a
# copy keeps concurrent jobs from clobbering each other's snapshot.
shared = getattr(
getattr(manager, "learning_manager", None), "suggestion_engine", None
)
job_engine = shared.for_job(merged) if shared is not None else None
enriched = await hass.async_add_executor_job( enriched = await hass.async_add_executor_job(
_build_settings_comparison, manager, merged _build_settings_comparison, manager, merged, job_engine
) )
if enriched: if enriched:
result["settings_comparison"] = enriched result["settings_comparison"] = enriched
@@ -5167,6 +5229,16 @@ async def ws_terminate_cycle(
# ─── Playground (F3): headless what-if replay + DTW visualizer ────────────────── # ─── Playground (F3): headless what-if replay + DTW visualizer ──────────────────
def _safe_float_finite(value: Any, default: float) -> float:
"""Convert ``value`` to a finite float, falling back to ``default`` on failure."""
try:
v = float(value)
return v if math.isfinite(v) else default
except (TypeError, ValueError):
return default
def _playground_base_config(manager: Any, entry: Any) -> CycleDetectorConfig: def _playground_base_config(manager: Any, entry: Any) -> CycleDetectorConfig:
"""Resolve the device's live CycleDetectorConfig as the simulation base. """Resolve the device's live CycleDetectorConfig as the simulation base.
@@ -5193,6 +5265,10 @@ def _playground_base_config(manager: Any, entry: Any) -> CycleDetectorConfig:
stop_threshold_w=float( stop_threshold_w=float(
opts.get(CONF_STOP_THRESHOLD_W, min_power * 0.6 if min_power else 2.0) opts.get(CONF_STOP_THRESHOLD_W, min_power * 0.6 if min_power else 2.0)
), ),
dishwasher_end_spike_quiet_release=_safe_float_finite(
opts.get(CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE),
DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS,
),
) )
@@ -5405,6 +5481,191 @@ async def ws_get_dtw_debug(
connection.send_error(msg["id"], "unknown_error", str(exc)) connection.send_error(msg["id"], "unknown_error", str(exc))
# ─── Playground settings control panel (live values + presets) ─────────────────
def _playground_preset_list(store: Any) -> list[dict[str, Any]]:
"""Presets as a name-sorted list for the panel dropdown."""
presets = store.get_playground_presets()
out: list[dict[str, Any]] = []
for name, record in presets.items():
if not isinstance(record, dict):
continue
out.append({
"name": name,
"values": dict(record.get("values") or {}),
"created_at": record.get("created_at"),
"updated_at": record.get("updated_at"),
})
out.sort(key=lambda p: str(p["name"]).lower())
return out
@websocket_api.websocket_command(
{
vol.Required("type"): "ha_washdata/get_playground_settings",
vol.Required("entry_id"): str,
}
)
@websocket_api.async_response
async def ws_get_playground_settings(
hass: HomeAssistant,
connection: websocket_api.ActiveConnection,
msg: dict[str, Any],
) -> None:
"""Return the device's LIVE effective Playground settings plus saved presets.
``effective`` is read back off the same live detector/matcher config the
simulation uses, so the control panel always opens on what the integration is
really running - never on a stale schema default. ``publishable`` lists the
keys the panel may write back to the config entry.
"""
entry_id: str = msg["entry_id"]
ctx = _playground_context(hass, entry_id)
if ctx is None:
_err_not_found(connection, msg["id"], entry_id)
return
_manager, store, base_config, options, _price = ctx
try:
match_config = playground._matching_config(store) # noqa: SLF001
except Exception: # pylint: disable=broad-exception-caught
match_config = {}
# Classic suggestions from the store (periodic analysis results), filtered to
# keys the Playground actually exposes — cheap dict read, no executor needed.
raw_sugg: dict[str, Any] = {}
try:
raw_sugg = store.get_suggestions() or {}
except Exception as exc: # pylint: disable=broad-exception-caught
_LOGGER.debug(
"Could not read Playground classic suggestions for %s: %s", entry_id, exc
)
classic_sugg: dict[str, Any] = {}
for key in playground.SETTING_KEYS:
item = raw_sugg.get(key)
if isinstance(item, dict) and item.get("value") is not None:
val = item["value"]
try:
classic_sugg[key] = int(float(val)) if key in _SUGGESTION_INT_KEYS else round(float(val), 4)
except (TypeError, ValueError):
pass
# ML suggestions — computed on-demand; executor-offloaded because it runs
# statistics across all clean cycles. None when the feature is disabled.
ml_sugg: dict[str, Any] | None = None
if ENABLE_ML_SUGGESTIONS:
ml_sugg = {}
try:
learning = getattr(_manager, "learning_manager", None)
classic_engine = getattr(learning, "suggestion_engine", None)
if classic_engine is not None:
_pg_setting_keys = playground.SETTING_KEYS
_pg_int_keys = _SUGGESTION_INT_KEYS
job_engine = classic_engine.for_job(options)
def _run_ml_sugg() -> dict[str, Any]:
from .suggestion_engine import MLSuggestionEngine as _ML # pylint: disable=import-outside-toplevel
raw = _ML(job_engine).generate_ml_suggestions() or {}
out: dict[str, Any] = {}
for k in _pg_setting_keys:
entry = raw.get(k)
if isinstance(entry, dict) and entry.get("value") is not None:
v = entry["value"]
try:
out[k] = int(float(v)) if k in _pg_int_keys else round(float(v), 4)
except (TypeError, ValueError):
pass
return out
ml_sugg = await hass.async_add_executor_job(_run_ml_sugg)
except Exception as exc: # pylint: disable=broad-exception-caught
_LOGGER.debug(
"Could not generate Playground ML suggestions for %s: %s", entry_id, exc
)
_send_result(connection, msg["id"], "get_playground_settings", {
"effective": playground.effective_settings(base_config, match_config),
"presets": _playground_preset_list(store),
"publishable": sorted(playground.PUBLISHABLE_SETTING_KEYS),
"preset_limit": PLAYGROUND_PRESET_MAX,
"classic_suggestions": classic_sugg,
"ml_suggestions": ml_sugg,
"ml_suggestions_enabled": ENABLE_ML_SUGGESTIONS,
})
@websocket_api.websocket_command(
{
vol.Required("type"): "ha_washdata/save_playground_preset",
vol.Required("entry_id"): str,
vol.Required("name"): str,
vol.Required("values"): dict,
}
)
@websocket_api.async_response
async def ws_save_playground_preset(
hass: HomeAssistant,
connection: websocket_api.ActiveConnection,
msg: dict[str, Any],
) -> None:
"""Save (or overwrite) a named snapshot of the Playground's settings."""
entry_id: str = msg["entry_id"]
manager = _get_manager(hass, entry_id)
store = getattr(manager, "profile_store", None) if manager else None
if store is None:
_err_not_found(connection, msg["id"], entry_id)
return
values = playground.sanitize_setting_values(msg["values"])
try:
await store.async_save_playground_preset(msg["name"], values)
except ValueError as exc:
connection.send_error(msg["id"], "invalid_format", str(exc))
return
except Exception as exc: # pylint: disable=broad-exception-caught
# The store write can fail (disk full, permissions). Without this the
# exception escapes the handler and the client never gets a reply, so the
# panel's save button spins forever instead of reporting the failure.
_LOGGER.warning("Saving playground preset failed for %s: %s", entry_id, exc)
connection.send_error(msg["id"], "unknown_error", str(exc))
return
_send_result(connection, msg["id"], "save_playground_preset", {
"success": True,
"presets": _playground_preset_list(store),
})
@websocket_api.websocket_command(
{
vol.Required("type"): "ha_washdata/delete_playground_preset",
vol.Required("entry_id"): str,
vol.Required("name"): str,
}
)
@websocket_api.async_response
async def ws_delete_playground_preset(
hass: HomeAssistant,
connection: websocket_api.ActiveConnection,
msg: dict[str, Any],
) -> None:
"""Delete a saved Playground settings preset."""
entry_id: str = msg["entry_id"]
manager = _get_manager(hass, entry_id)
store = getattr(manager, "profile_store", None) if manager else None
if store is None:
_err_not_found(connection, msg["id"], entry_id)
return
try:
removed = await store.async_delete_playground_preset(msg["name"])
except Exception as exc: # pylint: disable=broad-exception-caught
_LOGGER.warning("Deleting playground preset failed for %s: %s", entry_id, exc)
connection.send_error(msg["id"], "unknown_error", str(exc))
return
_send_result(connection, msg["id"], "delete_playground_preset", {
"success": removed,
"presets": _playground_preset_list(store),
})
# ─── Background-task registry (progress / cancel / reconnect-safe results) ────── # ─── Background-task registry (progress / cancel / reconnect-safe results) ──────
@@ -216,6 +216,8 @@ class ImportConfigSelectiveResponse(TypedDict):
# ─── Shared constants ────────────────────────────────────────────────────────── # ─── Shared constants ──────────────────────────────────────────────────────────
class GetConstantsResponse(TypedDict): class GetConstantsResponse(TypedDict):
version: str
icon_url: str | None
device_types: list[dict[str, Any]] device_types: list[dict[str, Any]]
state_colors: dict[str, Any] state_colors: dict[str, Any]
ml_lab_enabled: bool ml_lab_enabled: bool
@@ -225,12 +227,15 @@ class GetConstantsResponse(TypedDict):
store_online_available: bool store_online_available: bool
store_online_enabled: bool store_online_enabled: bool
store_web_origin: str store_web_origin: str
store_prefs: dict[str, Any]
pg_match_defaults: dict[str, Any]
# ─── Suggestions ─────────────────────────────────────────────────────────────── # ─── Suggestions ───────────────────────────────────────────────────────────────
class GetSuggestionsResponse(TypedDict): class GetSuggestionsResponse(TypedDict):
suggestions: list[dict[str, Any]] suggestions: list[dict[str, Any]]
locked_suggestions: list[str]
class ApplySuggestionsResponse(TypedDict): class ApplySuggestionsResponse(TypedDict):
@@ -238,6 +243,11 @@ class ApplySuggestionsResponse(TypedDict):
applied: list[str] applied: list[str]
class SetSuggestionLockResponse(TypedDict):
success: bool
locked_suggestions: list[str]
class RunSuggestionAnalysisResponse(TypedDict, total=False): class RunSuggestionAnalysisResponse(TypedDict, total=False):
"""``success`` plus whatever the analysis pass reports (e.g. ``count``).""" """``success`` plus whatever the analysis pass reports (e.g. ``count``)."""
@@ -262,6 +272,7 @@ class GetCyclePowerDataResponse(TypedDict, total=False):
energy_kwh: float | None energy_kwh: float | None
artifacts: list[dict[str, Any]] artifacts: list[dict[str, Any]]
restart_gaps: list[Any] restart_gaps: list[Any]
is_reference: bool
class AnalyzeSplitResponse(TypedDict): class AnalyzeSplitResponse(TypedDict):
@@ -437,6 +448,41 @@ class GetDtwDebugResponse(TypedDict):
warp_path: list[list[int]] warp_path: list[list[int]]
class PlaygroundPreset(TypedDict):
"""One saved Playground settings snapshot."""
name: str
values: dict[str, Any]
created_at: Any
updated_at: Any
class GetPlaygroundSettingsResponse(TypedDict):
"""Live effective Playground settings + the device's saved presets.
``classic_suggestions`` and ``ml_suggestions`` are filtered to keys the
Playground exposes so the panel can stage them directly. ``ml_suggestions``
is ``None`` when ``ENABLE_ML_SUGGESTIONS`` is off - the key is still always
present, so every field here is required (total=True) and
``_validate_ws_contract()`` can catch a handler that drops one.
"""
effective: dict[str, Any]
presets: list[PlaygroundPreset]
publishable: list[str]
preset_limit: int
classic_suggestions: dict[str, Any]
ml_suggestions: dict[str, Any] | None
ml_suggestions_enabled: bool
class PlaygroundPresetsResponse(TypedDict):
"""Acknowledgement carrying the post-mutation preset list."""
success: bool
presets: list[PlaygroundPreset]
class TaskSnapshot(TypedDict, total=False): class TaskSnapshot(TypedDict, total=False):
id: str id: str
entry_id: str entry_id: str
@@ -585,6 +631,7 @@ class GetShareableCyclesResponse(TypedDict, total=False):
plus the programs that carry a local phase map.""" plus the programs that carry a local phase map."""
items: list items: list
phase_programs: list phase_programs: list
all_programs: list
class GetSetupStatusResponse(TypedDict, total=False): class GetSetupStatusResponse(TypedDict, total=False):
@@ -651,6 +698,7 @@ WS_RESPONSE_TYPES: dict[str, type] = {
"get_suggestions": GetSuggestionsResponse, "get_suggestions": GetSuggestionsResponse,
"apply_suggestions": ApplySuggestionsResponse, "apply_suggestions": ApplySuggestionsResponse,
"clear_suggestions": SuccessResponse, "clear_suggestions": SuccessResponse,
"set_suggestion_lock": SetSuggestionLockResponse,
"run_suggestion_analysis": RunSuggestionAnalysisResponse, "run_suggestion_analysis": RunSuggestionAnalysisResponse,
"get_cycle_power_data": GetCyclePowerDataResponse, "get_cycle_power_data": GetCyclePowerDataResponse,
"trim_cycle": StartTaskResponse, "trim_cycle": StartTaskResponse,
@@ -679,6 +727,9 @@ WS_RESPONSE_TYPES: dict[str, type] = {
"run_playground_history": RunPlaygroundHistoryResponse, "run_playground_history": RunPlaygroundHistoryResponse,
"run_playground_sweep": RunPlaygroundSweepResponse, "run_playground_sweep": RunPlaygroundSweepResponse,
"get_dtw_debug": GetDtwDebugResponse, "get_dtw_debug": GetDtwDebugResponse,
"get_playground_settings": GetPlaygroundSettingsResponse,
"save_playground_preset": PlaygroundPresetsResponse,
"delete_playground_preset": PlaygroundPresetsResponse,
"list_tasks": ListTasksResponse, "list_tasks": ListTasksResponse,
"subscribe_tasks": SubscribeTasksResponse, "subscribe_tasks": SubscribeTasksResponse,
"cancel_task": CancelTaskResponse, "cancel_task": CancelTaskResponse,
@@ -868,6 +919,7 @@ WS_COMMANDS: dict[str, dict] = {
"get_suggestions": {"params": [_entry()]}, "get_suggestions": {"params": [_entry()]},
"apply_suggestions": {"params": [_entry(), _p("keys", "list[str]")]}, "apply_suggestions": {"params": [_entry(), _p("keys", "list[str]")]},
"clear_suggestions": {"params": [_entry()]}, "clear_suggestions": {"params": [_entry()]},
"set_suggestion_lock": {"params": [_entry(), _p("key", "str"), _p("locked", "bool")]},
"run_suggestion_analysis": {"params": [_entry()]}, "run_suggestion_analysis": {"params": [_entry()]},
"get_cycle_power_data": {"params": [_entry(), _p("cycle_id", "str")]}, "get_cycle_power_data": {"params": [_entry(), _p("cycle_id", "str")]},
"trim_cycle": {"params": [ "trim_cycle": {"params": [
@@ -954,6 +1006,13 @@ WS_COMMANDS: dict[str, dict] = {
_p("cycle_id", "str"), _p("cycle_id", "str"),
_p("profile_name", "str|null", False), _p("profile_name", "str|null", False),
]}, ]},
"get_playground_settings": {"params": [_entry()]},
"save_playground_preset": {"params": [
_entry(),
_p("name", "str"),
_p("values", "dict"),
]},
"delete_playground_preset": {"params": [_entry(), _p("name", "str")]},
"list_tasks": {"params": [_p("entry_id", "str|null", False)]}, "list_tasks": {"params": [_p("entry_id", "str|null", False)]},
"subscribe_tasks": {"params": [_p("entry_id", "str|null", False)]}, "subscribe_tasks": {"params": [_p("entry_id", "str|null", False)]},
"cancel_task": {"params": [_p("task_id", "str")]}, "cancel_task": {"params": [_p("task_id", "str")]},
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+63
View File
@@ -91,6 +91,8 @@ export interface ExportConfigResponse {
} }
export interface GetConstantsResponse { export interface GetConstantsResponse {
version: string;
icon_url: string | null;
device_types: Record<string, unknown>[]; device_types: Record<string, unknown>[];
state_colors: Record<string, unknown>; state_colors: Record<string, unknown>;
ml_lab_enabled: boolean; ml_lab_enabled: boolean;
@@ -100,6 +102,8 @@ export interface GetConstantsResponse {
store_online_available: boolean; store_online_available: boolean;
store_online_enabled: boolean; store_online_enabled: boolean;
store_web_origin: string; store_web_origin: string;
store_prefs: Record<string, unknown>;
pg_match_defaults: Record<string, unknown>;
} }
export interface GetCyclePowerDataResponse { export interface GetCyclePowerDataResponse {
@@ -114,6 +118,7 @@ export interface GetCyclePowerDataResponse {
energy_kwh?: number | null; energy_kwh?: number | null;
artifacts?: Record<string, unknown>[]; artifacts?: Record<string, unknown>[];
restart_gaps?: unknown[]; restart_gaps?: unknown[];
is_reference?: boolean;
} }
export interface GetDeviceCyclesResponse { export interface GetDeviceCyclesResponse {
@@ -214,6 +219,16 @@ export interface GetPhaseCatalogResponse {
device_type: string | null; device_type: string | null;
} }
export interface GetPlaygroundSettingsResponse {
effective: Record<string, unknown>;
presets: PlaygroundPreset[];
publishable: string[];
preset_limit: number;
classic_suggestions: Record<string, unknown>;
ml_suggestions: Record<string, unknown> | null;
ml_suggestions_enabled: boolean;
}
export interface GetPowerHistoryResponse { export interface GetPowerHistoryResponse {
cycle_active?: boolean; cycle_active?: boolean;
cycle_elapsed_s?: number; cycle_elapsed_s?: number;
@@ -277,10 +292,12 @@ export interface GetSetupStatusResponse {
export interface GetShareableCyclesResponse { export interface GetShareableCyclesResponse {
items?: unknown[]; items?: unknown[];
phase_programs?: unknown[]; phase_programs?: unknown[];
all_programs?: unknown[];
} }
export interface GetSuggestionsResponse { export interface GetSuggestionsResponse {
suggestions: Record<string, unknown>[]; suggestions: Record<string, unknown>[];
locked_suggestions: string[];
} }
export interface ImportConfigSelectiveResponse { export interface ImportConfigSelectiveResponse {
@@ -296,6 +313,18 @@ export interface OkResponse {
ok: boolean; ok: boolean;
} }
export interface PlaygroundPreset {
name: string;
values: Record<string, unknown>;
created_at: unknown;
updated_at: unknown;
}
export interface PlaygroundPresetsResponse {
success: boolean;
presets: PlaygroundPreset[];
}
export interface ProfileEnvelope { export interface ProfileEnvelope {
avg: number[][]; avg: number[][];
min: number[][]; min: number[][];
@@ -355,6 +384,11 @@ export interface RunSuggestionAnalysisResponse {
count?: number; count?: number;
} }
export interface SetSuggestionLockResponse {
success: boolean;
locked_suggestions: string[];
}
export interface StartTaskResponse { export interface StartTaskResponse {
task_id: string; task_id: string;
} }
@@ -724,6 +758,12 @@ export interface ClearSuggestionsRequest {
entry_id: string; entry_id: string;
} }
export interface SetSuggestionLockRequest {
entry_id: string;
key: string;
locked: boolean;
}
export interface RunSuggestionAnalysisRequest { export interface RunSuggestionAnalysisRequest {
entry_id: string; entry_id: string;
} }
@@ -873,6 +913,21 @@ export interface GetDtwDebugRequest {
profile_name?: string | null; profile_name?: string | null;
} }
export interface GetPlaygroundSettingsRequest {
entry_id: string;
}
export interface SavePlaygroundPresetRequest {
entry_id: string;
name: string;
values: Record<string, unknown>;
}
export interface DeletePlaygroundPresetRequest {
entry_id: string;
name: string;
}
export interface ListTasksRequest { export interface ListTasksRequest {
entry_id?: string | null; entry_id?: string | null;
} }
@@ -1067,6 +1122,7 @@ export interface WashDataWsRequests {
"ha_washdata/get_suggestions": GetSuggestionsRequest; "ha_washdata/get_suggestions": GetSuggestionsRequest;
"ha_washdata/apply_suggestions": ApplySuggestionsRequest; "ha_washdata/apply_suggestions": ApplySuggestionsRequest;
"ha_washdata/clear_suggestions": ClearSuggestionsRequest; "ha_washdata/clear_suggestions": ClearSuggestionsRequest;
"ha_washdata/set_suggestion_lock": SetSuggestionLockRequest;
"ha_washdata/run_suggestion_analysis": RunSuggestionAnalysisRequest; "ha_washdata/run_suggestion_analysis": RunSuggestionAnalysisRequest;
"ha_washdata/get_cycle_power_data": GetCyclePowerDataRequest; "ha_washdata/get_cycle_power_data": GetCyclePowerDataRequest;
"ha_washdata/trim_cycle": TrimCycleRequest; "ha_washdata/trim_cycle": TrimCycleRequest;
@@ -1095,6 +1151,9 @@ export interface WashDataWsRequests {
"ha_washdata/run_playground_history": RunPlaygroundHistoryRequest; "ha_washdata/run_playground_history": RunPlaygroundHistoryRequest;
"ha_washdata/run_playground_sweep": RunPlaygroundSweepRequest; "ha_washdata/run_playground_sweep": RunPlaygroundSweepRequest;
"ha_washdata/get_dtw_debug": GetDtwDebugRequest; "ha_washdata/get_dtw_debug": GetDtwDebugRequest;
"ha_washdata/get_playground_settings": GetPlaygroundSettingsRequest;
"ha_washdata/save_playground_preset": SavePlaygroundPresetRequest;
"ha_washdata/delete_playground_preset": DeletePlaygroundPresetRequest;
"ha_washdata/list_tasks": ListTasksRequest; "ha_washdata/list_tasks": ListTasksRequest;
"ha_washdata/subscribe_tasks": SubscribeTasksRequest; "ha_washdata/subscribe_tasks": SubscribeTasksRequest;
"ha_washdata/cancel_task": CancelTaskRequest; "ha_washdata/cancel_task": CancelTaskRequest;
@@ -1172,6 +1231,7 @@ export interface WashDataWsResponses {
"ha_washdata/get_suggestions": GetSuggestionsResponse; "ha_washdata/get_suggestions": GetSuggestionsResponse;
"ha_washdata/apply_suggestions": ApplySuggestionsResponse; "ha_washdata/apply_suggestions": ApplySuggestionsResponse;
"ha_washdata/clear_suggestions": SuccessResponse; "ha_washdata/clear_suggestions": SuccessResponse;
"ha_washdata/set_suggestion_lock": SetSuggestionLockResponse;
"ha_washdata/run_suggestion_analysis": RunSuggestionAnalysisResponse; "ha_washdata/run_suggestion_analysis": RunSuggestionAnalysisResponse;
"ha_washdata/get_cycle_power_data": GetCyclePowerDataResponse; "ha_washdata/get_cycle_power_data": GetCyclePowerDataResponse;
"ha_washdata/trim_cycle": StartTaskResponse; "ha_washdata/trim_cycle": StartTaskResponse;
@@ -1200,6 +1260,9 @@ export interface WashDataWsResponses {
"ha_washdata/run_playground_history": RunPlaygroundHistoryResponse; "ha_washdata/run_playground_history": RunPlaygroundHistoryResponse;
"ha_washdata/run_playground_sweep": RunPlaygroundSweepResponse; "ha_washdata/run_playground_sweep": RunPlaygroundSweepResponse;
"ha_washdata/get_dtw_debug": GetDtwDebugResponse; "ha_washdata/get_dtw_debug": GetDtwDebugResponse;
"ha_washdata/get_playground_settings": GetPlaygroundSettingsResponse;
"ha_washdata/save_playground_preset": PlaygroundPresetsResponse;
"ha_washdata/delete_playground_preset": PlaygroundPresetsResponse;
"ha_washdata/list_tasks": ListTasksResponse; "ha_washdata/list_tasks": ListTasksResponse;
"ha_washdata/subscribe_tasks": SubscribeTasksResponse; "ha_washdata/subscribe_tasks": SubscribeTasksResponse;
"ha_washdata/cancel_task": CancelTaskResponse; "ha_washdata/cancel_task": CancelTaskResponse;
+21 -21
View File
@@ -7,7 +7,7 @@
"voltage": 120.8, "voltage": 120.8,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"ac_frequency": 60, "ac_frequency": 60,
"power_factor": 0.13, "power_factor": 0.11,
"update": { "update": {
"state": "idle", "state": "idle",
"installed_version": 268513381, "installed_version": 268513381,
@@ -27,10 +27,10 @@
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"power": 991.7, "power": 30,
"current": 9.83, "current": 3.27,
"energy": 29.91, "energy": 29.92,
"power_factor": 0.83, "power_factor": 0.16,
"update": { "update": {
"state": "idle", "state": "idle",
"installed_version": 268513381, "installed_version": 268513381,
@@ -45,9 +45,9 @@
"state": "ON", "state": "ON",
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"voltage": 120.1, "voltage": 120.2,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"energy": 60.07, "energy": 60.08,
"power_factor": 0.86, "power_factor": 0.86,
"ac_frequency": 60, "ac_frequency": 60,
"update": { "update": {
@@ -58,7 +58,7 @@
"latest_release_notes": null "latest_release_notes": null
}, },
"linkquality": 134, "linkquality": 134,
"power": 84.4, "power": 83.4,
"current": 0.81, "current": 0.81,
"power_on_behavior": "on" "power_on_behavior": "on"
}, },
@@ -77,8 +77,8 @@
"voltage": 119.8, "voltage": 119.8,
"state": "ON", "state": "ON",
"ac_frequency": 60, "ac_frequency": 60,
"energy": 122.36, "energy": 122.38,
"power": 102.4, "power": 102.2,
"current": 0.9, "current": 0.9,
"power_factor": 0.94, "power_factor": 0.94,
"update": { "update": {
@@ -95,13 +95,13 @@
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"voltage": 118.1, "voltage": 119.8,
"energy": 55.85, "energy": 55.86,
"state": "ON", "state": "ON",
"power": 81.3, "power": 74.7,
"current": 0.89, "current": 0.79,
"ac_frequency": 60, "ac_frequency": 60,
"power_factor": 0.8, "power_factor": 0.79,
"update": { "update": {
"state": "idle", "state": "idle",
"installed_version": 268513381, "installed_version": 268513381,
@@ -116,9 +116,9 @@
"state": "ON", "state": "ON",
"voltage": 120.7, "voltage": 120.7,
"ac_frequency": 60, "ac_frequency": 60,
"energy": 8.26, "energy": 8.28,
"current": 0.04, "current": 0.02,
"power": 1.4, "power": 1.1,
"power_factor": 0.11, "power_factor": 0.11,
"linkquality": 123, "linkquality": 123,
"update": { "update": {
@@ -136,7 +136,7 @@
"0xffffb40e0608864e": { "0xffffb40e0608864e": {
"led_brightness": 100, "led_brightness": 100,
"countdown_to_turn_off": 0, "countdown_to_turn_off": 0,
"voltage": 121.6, "voltage": 121.4,
"energy": 18.71, "energy": 18.71,
"countdown_to_turn_on": 0, "countdown_to_turn_on": 0,
"state": "ON", "state": "ON",
@@ -188,7 +188,7 @@
"latest_release_notes": null "latest_release_notes": null
}, },
"power_factor": 0.06, "power_factor": 0.06,
"power": 1.5 "power": 0.1
}, },
"0xa4c1380d0679ffff": { "0xa4c1380d0679ffff": {
"battery": 100, "battery": 100,
@@ -245,7 +245,7 @@
}, },
"0xb40e060fffe717c5": { "0xb40e060fffe717c5": {
"battery": 100, "battery": 100,
"occupancy": false, "occupancy": true,
"tamper": false, "tamper": false,
"battery_low": false, "battery_low": false,
"linkquality": 72, "linkquality": 72,