b8ef430ed4a72daa05bf052d087cfb11a0e9a7b8
10
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
5c275753d4 |
Report whether the auto-clean cycle is running, and how far through
`/option/autoclean/vs/0` carries three fields and only `settingStatus` was read.
That one says the feature is enabled, which it is whether or not the unit is
drying right now, so nothing reported an actual cycle.
settingStatus: On <- the existing auto_clean switch
status: Stop supportedStatus: [Start, Stop]
progress: 0
Adds a binary sensor for `status` and a percentage sensor for `progress`.
Measured on a TP1X_DA-AC-CAC-01001, sampling the resource every eight seconds
across a cycle: `Start` with progress 98 while it ran, then `Stop` with progress 0
the moment it finished. The percentage matches the figure the appliance shows on
its own display, checked against 55% mid-run.
Golden state keys updated for the 18 fixtures that bind AUTO_CLEAN. The change is
additive — no key was removed from any of them.
Full suite passes (1070 tests, Python 3.13 via requirements-dev.txt).
|
||
|
|
bbf3f3f833 |
Revert unsound air-quality gating from #170, cover remaining fan-speed icons
An Opus review of merged PR #170 found the cleanLevel-scalar existence gate on AIR_QUALITY doesn't hold up as a general rule: three fixtures in this repo (air_purifier_device.json, air_purifier_vtww_device.json, range_hood_device.json) carry genuinely populated Dust/FineDust/ SuperFineDust readings with no such scalar, so requiring it risks silently dropping real air-quality readings on AC hardware this repo hasn't seen yet. Reverted _has_sensor_type to item-type presence only (as before #170) and moved the #166 fix to enabled_default=False on all five entities instead -- same conservative, non-existence-gated treatment already used for tropical_night_mode and the fridge/cooktop precedents it was modeled on. Golden fixtures and tests updated to match; the five sensors are bound-but-disabled on windfree/#17-style boards again rather than unbound. Also added icons for the AC fan_mode values #170 missed -- the raw numeric labels ("1".."5") that TP1X_DA-AC-RAC-01001 and the window-AC board report instead of turbo/max -- and swapped the whole fan-speed icon family to mdi:fan-speed-1/2/3 for a more purpose-built look than the generic speedometer, applied consistently to both the AC climate card and the air purifier fan. Fixed motiondirect/motionindirect to match core's smartthings integration's arrow pairing (previously inverted). Known limitation, not fixed here: enabled_default only affects newly registered entities. Anyone who already has tropical_night_mode or the five air-quality sensors enabled from #164 (a narrow window before this fix, but real) won't see them auto-disable -- they'd need to disable them by hand in Settings > Devices > Entities. A real fix needs a one-time entity-registry migration, which this integration has no existing infrastructure or test coverage for; scoping that felt like its own follow-up rather than something to bolt on here. |
||
|
|
739881de16 |
Gate AC tropical night mode and air-quality sensors on real capability signals (#166)
Issue #166 (ARxxTXFCAWKNEU, board ARTIK051_PRAC_20K) reported tropical night mode, clean level, dust, fine dust, odor, and super fine dust entities showing up even though the reporter's units have no such physical features. All six were added in #164. The Sleep_<N> options token backing tropical_night_mode is present in every AC dump on record regardless of confirmed reality, so there's no usable signal at boot time -- it's now registered but disabled by default (matching the precedent already set by fridge.rack_count / cooktop.paired_hood_model), letting units that do have it opt in. /sensors/vs/0's item-type list has the same problem (all five types always listed, permanently zero on this board), but there turned out to be a real tell: a top-level x.com.samsung.da.cleanLevel scalar is present only alongside genuinely populated readings on every dump on record (tp1x_da_ac_rac_01011, the tp1x_da_ac_air air purifier fixture) and absent on every all-zero ARTIK051_PRAC_20K dump, including both #166 units and the original windfree/#17 fixtures this capability was first verified against -- which, per their /information/vs/0, turn out to be the same board revision as #166's units, so that "verification" never actually proved a real sensor either. AIR_QUALITY's exists_fn now requires that scalar, and the windfree/airconditioner golden fixtures are updated to match (those five entities no longer bind there). |
||
|
|
1bbecfa5c3 |
Drop /information/vs/0 version entities per review
mbillow's follow-up review: exposing read-only Software/Firmware (and
Outdoor/Touch IC) version strings is "data for the sake of exposing it" --
no user control, just clutter, and every other registry leaves
/information/vs/0 in the global ignore as identity plumbing. Conforming to
that stance rather than expanding the entity surface for no user story.
- by_type/airconditioner.py: revert to *ignored.IGNORED (no _IGNORED_LESS_INFO
filter); drop airconditioner.INFO from the registry.
- capabilities/airconditioner.py: remove the INFO capability, the _info_version
/_info_items_of_type /_has_info_version helpers, and HREF_INFORMATION.
- translations/{en,nl}.json: drop software_version, firmware_version,
firmware_version_2/3, outdoor_unit_version, touch_ic_version.
- tests: drop the six INFO tests; golden regenerated for 8 AC + dehumidifier.
625 tests pass.
|
||
|
|
51fa1c5ea8 |
Address review: per-item versions, writable threshold, unit_fn, gating
Per mbillow's review on PR #129 (CHANGES_REQUESTED). Items 1-7 + smaller. 1. INFO: expose each /information/vs/0 version item per (type, ordinal) instead of collapsing to a single first-Firmware value. Boards carry 1-3 Firmware items (separate MCUs) plus an Outdoor unit and (window AC) a Touch IC item; each is a distinct version string. _info_version(items, type_, ordinal) + _has_info_version exists_fn gate, so an item with no number (tp2x_rac_20k's second Firmware) suppresses the entity rather than binding unknown. 2. air_filter_threshold is locally writable, not cloud-only -- confirmed live on ARTIK051_PRAC: POST filterDesiredUsage=700 to /filter/airdustfilter/vs/0 -> 2.04, read-back 700, persists; restored to 500. Converted from a read-only sensor to a SelectDesc keyed to the device's supportedFilterDesiredUsage enum (options_field), with a write_fn that POSTs the scalar field. Only binds where the enum is advertised; boards without it leave this writable field unexposed rather than guess the valid set (don't-guess). 3. air_filter_usage_hours uses unit_fn reading filterCapacityUnit ('Hour'->'h') instead of a hardcoded unit, so a board advertising a different unit doesn't mislabel a duration statistic. 4. air_filter_usage_hours state_class is total_increasing, not measurement -- filterUsage is a lifetime hour counter that resets on filter replacement. 5. INFO and air_filter_threshold now carry exists_fn (AIR_QUALITY already did), so they don't bind a permanently-unknown entity when their item/field is absent. Also fixes the caww_tp2 golden nuance (filterDesiredUsage absent -> no threshold key, matching what HA would actually create). 6. AIR_QUALITY: CleanLevel is corroborated as numeric by a top-level x.com.samsung.da.cleanLevel scalar (tp1x_da_ac_rac_01011 reports both as '1'), so clean_level is now an int measurement; odor/dust/fine_dust stay string diagnostics. Reinstated the 2-element-array ambiguity note (Dust/ FineDust/SuperFineDust report ['0','0']; v[1] meaning unconfirmed, v[0] taken as the reading). SuperFineDust is now modeled for consistency with Dust/FineDust (same shape), rather than skipped without reason. 7. _beep_write restores the last non-Mute Volume level on 'On' instead of forcing Volume_100, so an intermediate setting (e.g. Volume_50 set via the cloud) survives an off/on cycle; falls back to 100 when no prior level. Smaller: test_air_quality now asserts the tp1x_da_ac_rac_01011 clean_level==1 non-zero reading (the one value_fn-regression catch in the corpus); renamed by_type's _AC_IGNORED -> _IGNORED_LESS_INFO to resolve the two-meaning collision with the capabilities module's _AC_IGNORED (href strings); golden regenerated for the 8 AC fixtures + dehumidifier. 612 tests pass. |
||
|
|
3da01f80d0 |
feat(airconditioner): add beep, tropical night, filter hours/threshold, air-quality, sw/fw version
Layer the ARTIK051_PRAC additive entities onto the upstream registry on a fresh branch (additive-only; the round-1 display-light/mute-once/WindFree work was independently shipped upstream and is not redone here). New entities, all driven by single-token option_write or item reads: - beep (switch): Volume_Mute/Volume_100 option token; single-token merge -- a full options RMW reverts on ARTIK051_PRAC. Cloud counterpart: samsungce.airConditionerAudioFeedback (on/off only; level is cloud-only). - tropical_night_mode (number 0-16): Sleep_<N> option token. Cloud: custom.airConditionerTropicalNightMode. - air_filter_usage_hours / air_filter_threshold (duration sensors, h): raw filterUsage count and filterDesiredUsage alarm threshold. Threshold SET is cloud-only (samsungce.dustFilterAlarm); local read-only. - clean_level / odor / dust / fine_dust (diagnostic sensors): /sensors/vs/0 items[]. No unit advertised on the resource, so no device_class until a populated reading + unit is observed (don't-guess rule). SuperFineDust intentionally not modeled. - software_version / firmware_version (diagnostic sensors): /information/vs/0 items[]. The href is globally ignored as identity plumbing; the AC registry drops that ignore so INFO is the sole cap on it. Translations: en.json + nl.json (every-language-mirrors-english invariant). Golden regression: regenerated the 8 AC fixtures + dehumidifier (reuses AIR_FILTER) for the new state keys. 608 tests pass. |
||
|
|
fa8f1b8675 |
Add cool-only global RAC support: WindFree, Auto mode, display light
Finishes PR #91's contribution (pedroperosin) with the requested review changes applied, on our own branch: - Preset resolution is now fully dynamic, read from each unit's own /mode/convenient/vs/0 supportedModes instead of a static per-model table -- any board's convenient modes (including WindFree's Nano/ NanoSleep) surface without code changes. Unlabelled codes across existing fixtures (longwind, motionindirect, motiondirect, drycomfort) plus the two new WindFree ones are added to en.json/nl.json. - 'Auto' now maps to HVACMode.AUTO instead of HEAT_COOL: these are single-setpoint "device decides" units, not two-setpoint heat+cool ones. 'Fan' is added alongside 'Wind' as a second FAN_ONLY spelling; a new _device_code_for_hvac() picks the code from the unit's own supportedModes since the flat map can't disambiguate two device codes mapping to one HA value. - Detection gains a hyphenated '-RAC-' modelNum fallback (alongside the existing '_RAC_') for cool-only global RAC variants whose /otninformation/vs/0 ships no swVersionInfo block. - Adds a display_light switch sourced from /mode/vs/0's opaque options blob (inverted Light_On/Light_Off token) for boards with no dedicated /light/vs/0 switch. Write-path behavioural change (touches the path iterated on across #9/#17/#27/#38/#54): power now targets the vendor /power/vs/0 instead of the OCF /power/0, and _is_on() reads vendor-first. /power/0 is absent on several known AC boards, so the previous OCF-first read/write pair could report and act on stale state -- consistent with #53's "can turn on but not off". Target temperature now picks its channel (OCF pair vs. vendor items[]) based on which the unit actually reports, reading and writing the same one. The vendor temperature write and the new display-light write both carry only the changed field(s), not the whole resource -- confirmed sufficient on the wire, the device merges the rest itself. That requires the coordinator's optimistic cache to do the same merge on the read side so a setpoint change doesn't blank out current/min/max/unit for the settle window: common.py gains merge_items_field() next to the existing merge_options_field(), and async_send_command wires it in for any write touching x.com.samsung.da.items. New fixture/golden for the cool-only global RAC variant (TP1X_DA-AC-RAC- 01001, AI_RAC_GLOBAL_COOLONLY_3.0); display_light added to the goldens for boards that gain the new options-based switch. Regenerated against current main rather than copied from the original PR, since those goldens had already shifted (current_temperature_c/humidity from issue #75). |
||
|
|
3afbe6c6c1 |
Add humidity/temperature sensors and horizontal swing for AC (issue #75)
Three gaps reported against an ARTIK051_PRAC_20K WindFree unit vs. the SmartThings integration: 1. Missing WindFree/motion convenient-mode presets -- left alone here. PR #91 replaces climate.py's static _DEVICE_TO_PRESET table with a generic resolver that reads any preset code straight off the unit's own supportedModes, which already covers this (and more generically than a per-model dict would) -- adding one here would just conflict. 2. No horizontal oscillation: /wind/direction/vs/0's supportedModes includes Left_And_Right, which _DEVICE_TO_SWING had no mapping for. Add it to HA's standard 'horizontal' swing constant. 3. No standalone humidity/current-temperature sensors: the climate card already reads both internally, but nothing exposed them as entities for history/automations. Add CURRENT_TEMPERATURE (OCF /temperature/current/0) with a CURRENT_TEMPERATURE_VS vendor fallback (same match_fn-gated pair shape as common.py's POWER_GENERIC/ POWER_VS_FALLBACK), and a HUMIDITY sensor reading /humidity/vs/0's fivepercentHumidity field -- the only one of the three humidity-shaped fields across /humidity/0 and /humidity/vs/0 that isn't permanently stuck at 0 on every dump seen. Regenerates the five existing AC goldens (all pick up current_temperature_c; most pick up humidity) and adds a dedicated fixture from the issue's WindFree dump, whose /humidity/vs/0 actually has live fivepercentHumidity data. |
||
|
|
9a899080fa |
fix: fridge/washer coverage gaps from the #19-#27 dump batch
Six new diagnostics dumps, six gaps closed: - refrigerator: bind /diagnosis/vs/0 (reuse dishwasher.DIAGNOSIS -- same shape) into the refrigerator registry; it was never wired up there, tripping the coverage repair on any fridge that reports it (#20, #26). - refrigerator: add PANTRY_ZONE for the Cool Select Zone pantry compartment (/status/pantry/one/vs/0, x.com.samsung.da.mode/supportedOptions) -- same shape as BEVERAGE_ZONE but a distinct resource/field set (#20). - refrigerator: generalize FLEX_ZONE to identify the current mode by list membership in supportedOptions instead of a hardcoded CV_TTYPE_RF9000A_ prefix check. TP1X/Bespoke-class fridges use a CV_FDR_ prefix instead, which the old code didn't recognize -- the select existed but always read as unknown, and writing to it would have appended a duplicate CV_FDR_ flag rather than replacing the existing one (#26, #27; also closes #32). - common: add energy_saved_kwh (x.com.samsung.da.cumulativeSavedPower) and power_energy_kwh (x.com.samsung.da.cumulativeConsumption) to the shared energy meter, plus fridge-only energy_last_month_kwh/energy_this_month_kwh (monthlyConsumption/thismonthlyConsumption) -- all self-gating on field presence (#26). - by_type: add the WV consumer-model prefix (FlexWash twin washers, e.g. WV55M9600AW) to the by-model fallback map. These report no oneUiVersion and previously matched no prefix at all, so they fell all the way through to the unrecognized-device registry with zero capabilities bound (#19). - washer: add a self-gating dry_level select to WASHER_SETTINGS for washer/dryer combo units, which carry a writable dryLevel field directly on /washer/vs/0 with no separate dryer resource or course (#22). The reset-water-filter button and "ice type vs. two named icemakers" requests from #26/#27 are left alone -- no write contract or exclusivity behavior is evidenced in either dump, and both icemakers report On simultaneously on the Bespoke unit, so synthesizing a single-select would be a guess rather than a fix. Adds scrubbed fixtures + goldens for FlexWash, a washer/dryer combo, ARTIK051_REF_17K, and TP2X_REF_20K, plus unit tests for the new/changed capabilities. |
||
|
|
296535d0f2 |
feat: air conditioner support with a composite climate entity (#17)
Add support for Samsung room air conditioners (ARTIK051_PRAC-class), the first device whose core controls map onto a single Home Assistant `climate` entity rather than a scatter of switches/selects/numbers. - New `climate` platform + `ClimateDesc`: one composite entity that reads power, HVAC mode, current/target temperature, fan (wind) strength, swing (wind direction) and the convenient-mode preset across several OCF resources and writes back to each. On/off folds into HVACMode.OFF / TURN_ON/OFF; convenient mode folds into preset_mode. The entity binds one primary resource (/mode/vs/0) and reads its siblings from the coordinator snapshot, reusing the cross-resource read pattern from number/select. - New `airconditioner` capability module + by_type registry, routed via the `_PRAC_` modelNum token. Reuses common ALARMS/ENERGY_METER, fridge.FIRMWARE_UPDATE and dishwasher.DIAGNOSIS; air purify and auto clean as config switches; air dust filter status/usage as diagnostics (usage normalized to a percentage of rated capacity). - Climate-consumed and all-zero/ambiguous resources (temperature/wind, /sensors, /humidity) are declared as AC-scoped coverage so every href in the dump binds or is covered -- no coverage-gap repair. - Fan/swing modes map onto HA standard constants (auto-localized); the custom fan `turbo`, presets `quiet/smart/speed`, and the filter-status enum get translations in strings.json + translations/en.json. - Scrubbed fixture, golden, and tests: registry routing, zero unbound hrefs, the climate write contract, and filter-% normalization. |