Add device support for Samsung Refrigerator TP1X_REF_21K auto-door variants (issue #328)

Three new dumps from one household's TP1X_REF_21K fleet (regular
single-door, kimchi, wine cellar) exposed the Auto Door Open feature's
timer and voice/sound feedback toggles, plus wine-cellar-specific
coverage: a deodorizing filter at its own href, a multi-compartment
pantry select, and a table-revision info resource.

- STATUS_LOCK gains auto_door_voice_control/auto_door_sound_control,
  gated on each field's own presence.
- New AUTO_DOOR_TIMER (a discrete-options select, same shape as the
  DEFINITE_TEMPERATURE_COOLER/FREEZER pattern) and three no-entity
  AUTO_DOOR_SINGLE/KIMCHI/WINECELLAR coverage hrefs -- every dump seen
  reports exactly one openOptions value with no paired current/desired
  field to choose against.
- New DEODOR_FILTER (reuses AIR_FILTER's entities at a different href),
  WINECELLAR_PANTRY_ZONE, and WINECELLAR_INFO.
- by_type: oic.d.krefrigerator and x.com.st.d.winecellar routed to the
  refrigerator registry via /oic/d, alongside the existing modelNum-based
  routing.
- kimchi_zone_mode's translation catalog gains three supportMode codes
  (bare storage_fridge/storage_freezer without the _normal suffix, and
  the apparently-placeholder newmode_kimchi_0000) surfaced by the kimchi
  fixture, across all seven languages.

Three new scrubbed fixtures + goldens + tests, one per variant.
This commit is contained in:
Marc Billow committed 2026-08-09 00:57:36 +00:00
1 parent 07c20e82aa
commit b6f0bc22cb
20 files changed
+1753 -7

No files matched your search

@@ -226,12 +226,14 @@ _OIC_TYPE_TO_KEY: dict[str, str] = {
"oic.d.dryer": "dryer",
"oic.d.oven": "oven",
"oic.d.refrigerator": "refrigerator",
"oic.d.krefrigerator": "refrigerator", # issue #328 -- kimchi refrigerator
"oic.d.washer": "washer",
"x.com.st.d.airqualitysensor": "air_monitor",
"x.com.st.d.dehumidifier": "dehumidifier",
"x.com.st.d.hood": "range_hood", # AHD-WW-TP1-22-COMMON
"x.com.st.d.stickcleaner": "vacuum_station",
"x.com.st.d.steamcloset": "air_dresser",
"x.com.st.d.winecellar": "refrigerator", # issue #328 -- same TP1X_REF_21K board
}
@@ -14,6 +14,13 @@ REGISTRY = DeviceRegistry(
fridge.DOOR_ALERT,
common.WATER_FILTER,
fridge.AIR_FILTER,
fridge.DEODOR_FILTER,
fridge.AUTO_DOOR_TIMER,
fridge.AUTO_DOOR_SINGLE,
fridge.AUTO_DOOR_KIMCHI,
fridge.AUTO_DOOR_WINECELLAR,
fridge.WINECELLAR_PANTRY_ZONE,
fridge.WINECELLAR_INFO,
dishwasher.DIAGNOSIS,
fridge.ICEMAKER_NIGHTTIME,
fridge.FLEX_ZONE,
@@ -326,9 +326,118 @@ STATUS_LOCK = Capability(
value_fn=lambda v: v == "On",
write_fn=_status_lock_write("x.com.samsung.da.device.sound"),
),
# Auto Door Open's own voice/sound feedback toggles (issue #328,
# TP1X_REF_21K family) -- siblings of auto_door_opener above, not
# duplicates of fridge_sound (device.sound is the general appliance
# beep, these two gate ado's own prompts). Only seen on the
# auto-door-equipped variants (single/kimchi/winecellar), not the
# earlier TP1X_REF_21K dumps that predate that feature -- gated on
# each field's own presence rather than assumed universal.
SwitchDesc(
key="auto_door_voice_control",
field="x.com.samsung.da.ado.voicecontrol",
icon="mdi:microphone",
entity_category="config",
value_fn=lambda v: v == "On",
write_fn=_status_lock_write("x.com.samsung.da.ado.voicecontrol"),
exists_fn=lambda rep, resources: "x.com.samsung.da.ado.voicecontrol" in rep,
),
SwitchDesc(
key="auto_door_sound_control",
field="x.com.samsung.da.ado.soundcontrol",
icon="mdi:volume-medium",
entity_category="config",
value_fn=lambda v: v == "On",
write_fn=_status_lock_write("x.com.samsung.da.ado.soundcontrol"),
exists_fn=lambda rep, resources: "x.com.samsung.da.ado.soundcontrol" in rep,
),
),
)
# Auto Door Open's paired delay setting (issue #328, TP1X_REF_21K family):
# how long the door stays held open before it re-closes, on/off itself is
# STATUS_LOCK.auto_door_opener above. Same discrete-options-select shape as
# DEFINITE_TEMPERATURE_COOLER/FREEZER. Unit unconfirmed -- no supportedList
# field states it and the report carried no app screenshot -- so this is a
# raw-code select rather than a guessed seconds/minutes NumberDesc.
def _auto_door_timer_write(p, rep, href=None):
return ["autodoor", "timer", "vs", "0"], {"x.com.samsung.da.time.desired": p}
AUTO_DOOR_TIMER = Capability(
href="/autodoor/timer/vs/0",
poll_tier="warm",
entities=(
SelectDesc(
key="auto_door_timer",
field="x.com.samsung.da.time.desired",
icon="mdi:timer-outline",
translation_key="auto_door_timer",
entity_category="config",
options_field="x.com.samsung.da.time.supportedOptions",
write_fn=_auto_door_timer_write,
),
),
)
# /autodoor/<variant>/vs/0 -- one per fridge sub-type sharing the Auto Door
# Open feature (single-door, kimchi, winecellar; issue #328). Each reports
# only x.com.samsung.da.ado.openOptions, declaring which open styles that
# variant supports -- every dump seen so far carries exactly one option
# ('Single') with no paired desired/current field to make a choice against,
# the same "no real choice to expose yet" shape as ignored.py's /mode/0.
# Bound with no entities to record the three hrefs as coverage; revisit if
# a device ever reports more than one option.
AUTO_DOOR_SINGLE = Capability(href="/autodoor/single/vs/0")
AUTO_DOOR_KIMCHI = Capability(href="/autodoor/kimchi/vs/0")
AUTO_DOOR_WINECELLAR = Capability(href="/autodoor/winecellar/vs/0")
# Wine-cellar variant (x.com.st.d.winecellar, issue #328) of the same
# deodorizing filter AIR_FILTER models -- filterUsage/filterStatus at a
# different href, same 0-100-percentage-already shape (see AIR_FILTER's own
# comment). filterUsage reads '-1' on the only dump seen (filterStatus
# 'normal'), relayed as-is rather than special-cased -- no second dump to
# confirm whether that's a real sentinel or this unit just not tracking it.
DEODOR_FILTER = Capability(
href="/filter/deodorfilter/vs/0",
poll_tier="cold",
entities=AIR_FILTER.entities,
)
# Wine-cellar multi-compartment pantry select (issue #328): same
# mode/supportedOptions shape as PANTRY_ZONE, at its own href with a 5-way
# option set (Processed_Meat/Cheese/Nuts/Fruit/Wine) instead of PANTRY_ZONE's.
# Only a "one" instance seen -- not generalized to a pattern cap, same
# discipline as PANTRY_ZONE itself.
def _winecellar_pantry_write(p, rep, href=None):
return ["status", "winecellar", "pantry", "one", "vs", "0"], {"x.com.samsung.da.mode": p}
WINECELLAR_PANTRY_ZONE = Capability(
href="/status/winecellar/pantry/one/vs/0",
poll_tier="warm",
entities=(
SelectDesc(
key="winecellar_pantry_zone_mode",
field="x.com.samsung.da.mode",
icon="mdi:glass-wine",
translation_key="winecellar_pantry_zone_mode",
entity_category="config",
options_field="x.com.samsung.da.supportedOptions",
write_fn=_winecellar_pantry_write,
),
),
)
# Wine-cellar internal table-revision marker (issue #328) -- versioning
# metadata, not appliance state. Same treatment as ignored.py's
# /wm/setinfo/vs/0.
WINECELLAR_INFO = Capability(href="/information/winecellar/vs/0")
# /defrost/delay/vs/0 is the writable toggle to postpone a scheduled
# defrost. /defrost/block/vs/0 is unrelated: despite the "block" naming,
# live dumps confirm DEFROST_BLOCK_ON means the defrost cycle is actively
@@ -225,6 +225,9 @@
"air_filter_threshold": {
"name": "Práh upozornění na filtr"
},
"auto_door_timer": {
"name": "Časovač automatického otevírání dvířek"
},
"beverage_zone_mode": {
"name": "Režim zóny nápojů",
"state": {
@@ -472,9 +475,11 @@
"kimchi_storage_crunfch": "Křupavé kimči",
"kimchi_storage_buy": "Kupované kimči",
"storage_fridge_normal": "Chlazení",
"storage_fridge": "Chlazení",
"storage_fridge_cold": "Chlazení, silné",
"storage_fridge_warm": "Chlazení, slabé",
"storage_freezer_normal": "Mražení",
"storage_freezer": "Mražení",
"storage_freezer_cold": "Mražení, silné",
"storage_freezer_warm": "Mražení, slabé",
"kimchi_ripe_low_temp": "Zrání kimči, nízká teplota",
@@ -487,7 +492,8 @@
"storage_fresh_cereal": "Obiloviny",
"storage_fridge_drink": "Nápoje",
"storage_fresh_wine": "Víno",
"storage_fresh_potato_banana": "Brambory a banány"
"storage_fresh_potato_banana": "Brambory a banány",
"newmode_kimchi_0000": "Nový režim"
}
},
"pantry_zone_mode": {
@@ -498,6 +504,16 @@
"fdr_drinks": "Nápoje"
}
},
"winecellar_pantry_zone_mode": {
"name": "Režim spíže",
"state": {
"processed_meat": "Zpracované maso",
"cheese": "Sýr",
"nuts": "Ořechy",
"fruit": "Ovoce",
"wine": "Víno"
}
},
"range_burner_power_level": {
"name": "Výkon hořáku {number}",
"state": {
@@ -1147,6 +1163,12 @@
"auto_door_opener": {
"name": "Automatické otevírání dvířek"
},
"auto_door_sound_control": {
"name": "Zvuk automatického otevírání dvířek"
},
"auto_door_voice_control": {
"name": "Hlasové ovládání automatického otevírání dvířek"
},
"auto_release_dry": {
"name": "Automatické uvolnění při sušení"
},
@@ -225,6 +225,9 @@
"air_filter_threshold": {
"name": "Filteralarm-Schwellenwert"
},
"auto_door_timer": {
"name": "Timer für automatischen Türöffner"
},
"beverage_zone_mode": {
"name": "Getränkezonen-Modus",
"state": {
@@ -467,6 +470,16 @@
"fdr_drinks": "Getränke"
}
},
"winecellar_pantry_zone_mode": {
"name": "Vorratszonen-Modus",
"state": {
"processed_meat": "Wurst/Aufschnitt",
"cheese": "Käse",
"nuts": "Nüsse",
"fruit": "Obst",
"wine": "Wein"
}
},
"range_burner_power_level": {
"name": "Brenner {number} Leistungsstufe",
"state": {
@@ -678,9 +691,11 @@
"kimchi_storage_crunfch": "Knackiges Kimchi",
"kimchi_storage_buy": "Gekauftes Kimchi",
"storage_fridge_normal": "Kühlen",
"storage_fridge": "Kühlen",
"storage_fridge_cold": "Kühlen, stark",
"storage_fridge_warm": "Kühlen, schwach",
"storage_freezer_normal": "Gefrieren",
"storage_freezer": "Gefrieren",
"storage_freezer_cold": "Gefrieren, stark",
"storage_freezer_warm": "Gefrieren, schwach",
"kimchi_ripe_low_temp": "Kimchi-Reifung, niedrige Temperatur",
@@ -693,7 +708,8 @@
"storage_fresh_cereal": "Getreide",
"storage_fridge_drink": "Getränke",
"storage_fresh_wine": "Wein",
"storage_fresh_potato_banana": "Kartoffeln und Bananen"
"storage_fresh_potato_banana": "Kartoffeln und Bananen",
"newmode_kimchi_0000": "Neuer Modus"
}
},
"energy_saving_mode": {
@@ -1144,6 +1160,12 @@
"auto_door_opener": {
"name": "Automatischer Türöffner"
},
"auto_door_sound_control": {
"name": "Ton des automatischen Türöffners"
},
"auto_door_voice_control": {
"name": "Sprachsteuerung des automatischen Türöffners"
},
"auto_release_dry": {
"name": "Automatische Trocknungsfreigabe"
},
@@ -225,6 +225,9 @@
"air_filter_threshold": {
"name": "Filter alarm threshold"
},
"auto_door_timer": {
"name": "Auto door open timer"
},
"beverage_zone_mode": {
"name": "Beverage zone mode",
"state": {
@@ -474,9 +477,11 @@
"storage_fridge_normal": "Fridge",
"storage_fridge_cold": "Fridge, strong",
"storage_fridge_warm": "Fridge, weak",
"storage_fridge": "Fridge",
"storage_freezer_normal": "Freezer",
"storage_freezer_cold": "Freezer, strong",
"storage_freezer_warm": "Freezer, weak",
"storage_freezer": "Freezer",
"kimchi_ripe_low_temp": "Kimchi ripening, low temperature",
"kimchi_ripe_normal_temp": "Kimchi ripening, room temperature",
"kimchi_ripe_kkakdugi": "Kkakdugi ripening",
@@ -487,7 +492,8 @@
"storage_fresh_cereal": "Grains",
"storage_fridge_drink": "Beverages",
"storage_fresh_wine": "Wine",
"storage_fresh_potato_banana": "Potato & banana"
"storage_fresh_potato_banana": "Potato & banana",
"newmode_kimchi_0000": "New mode"
}
},
"pantry_zone_mode": {
@@ -498,6 +504,16 @@
"fdr_drinks": "Drinks"
}
},
"winecellar_pantry_zone_mode": {
"name": "Pantry zone mode",
"state": {
"processed_meat": "Processed meat",
"cheese": "Cheese",
"nuts": "Nuts",
"fruit": "Fruit",
"wine": "Wine"
}
},
"range_burner_power_level": {
"name": "Burner {number} power level",
"state": {
@@ -1147,6 +1163,12 @@
"auto_door_opener": {
"name": "Auto door opener"
},
"auto_door_sound_control": {
"name": "Auto door sound"
},
"auto_door_voice_control": {
"name": "Auto door voice control"
},
"auto_release_dry": {
"name": "Auto release dry"
},
@@ -374,6 +374,9 @@
"air_filter_threshold": {
"name": "Umbral de alarma del filtro"
},
"auto_door_timer": {
"name": "Temporizador de apertura automática de puerta"
},
"beverage_zone_mode": {
"name": "Modo de zona de bebidas",
"state": {
@@ -621,9 +624,11 @@
"kimchi_storage_crunfch": "Kimchi crujiente",
"kimchi_storage_buy": "Kimchi comprado",
"storage_fridge_normal": "Frigorífico",
"storage_fridge": "Frigorífico",
"storage_fridge_cold": "Frigorífico, fuerte",
"storage_fridge_warm": "Frigorífico, suave",
"storage_freezer_normal": "Congelador",
"storage_freezer": "Congelador",
"storage_freezer_cold": "Congelador, fuerte",
"storage_freezer_warm": "Congelador, suave",
"kimchi_ripe_low_temp": "Maduración kimchi, baja temperatura",
@@ -636,7 +641,8 @@
"storage_fresh_cereal": "Cereales",
"storage_fridge_drink": "Bebidas",
"storage_fresh_wine": "Vino",
"storage_fresh_potato_banana": "Patata y plátano"
"storage_fresh_potato_banana": "Patata y plátano",
"newmode_kimchi_0000": "Modo nuevo"
}
},
"pantry_zone_mode": {
@@ -647,6 +653,16 @@
"fdr_drinks": "Bebidas"
}
},
"winecellar_pantry_zone_mode": {
"name": "Modo de zona de despensa",
"state": {
"processed_meat": "Embutidos",
"cheese": "Queso",
"nuts": "Frutos secos",
"fruit": "Fruta",
"wine": "Vino"
}
},
"range_burner_power_level": {
"name": "Nivel de potencia del fuego {number}",
"state": {
@@ -1296,6 +1312,12 @@
"auto_door_opener": {
"name": "Apertura automática de puerta"
},
"auto_door_sound_control": {
"name": "Sonido de apertura automática de puerta"
},
"auto_door_voice_control": {
"name": "Control por voz de apertura automática de puerta"
},
"auto_release_dry": {
"name": "Liberación automática de secado"
},
@@ -225,6 +225,9 @@
"air_filter_threshold": {
"name": "Soglia allarme filtro"
},
"auto_door_timer": {
"name": "Timer apertura automatica sportello"
},
"beverage_zone_mode": {
"name": "Modalità zona bevande",
"state": {
@@ -472,9 +475,11 @@
"kimchi_storage_crunfch": "Kimchi croccante",
"kimchi_storage_buy": "Kimchi acquistato",
"storage_fridge_normal": "Frigorifero",
"storage_fridge": "Frigorifero",
"storage_fridge_cold": "Frigorifero, forte",
"storage_fridge_warm": "Frigorifero, debole",
"storage_freezer_normal": "Congelatore",
"storage_freezer": "Congelatore",
"storage_freezer_cold": "Congelatore, forte",
"storage_freezer_warm": "Congelatore, debole",
"kimchi_ripe_low_temp": "Maturazione kimchi, bassa temperatura",
@@ -487,7 +492,8 @@
"storage_fresh_cereal": "Cereali",
"storage_fridge_drink": "Bevande",
"storage_fresh_wine": "Vino",
"storage_fresh_potato_banana": "Patate e banane"
"storage_fresh_potato_banana": "Patate e banane",
"newmode_kimchi_0000": "Nuova modalità"
}
},
"pantry_zone_mode": {
@@ -498,6 +504,16 @@
"fdr_drinks": "Bevande"
}
},
"winecellar_pantry_zone_mode": {
"name": "Modalità zona dispensa",
"state": {
"processed_meat": "Salumi",
"cheese": "Formaggio",
"nuts": "Frutta secca",
"fruit": "Frutta",
"wine": "Vino"
}
},
"range_burner_power_level": {
"name": "Livello potenza fornello {number}",
"state": {
@@ -1147,6 +1163,12 @@
"auto_door_opener": {
"name": "Apertura automatica sportello"
},
"auto_door_sound_control": {
"name": "Suono apertura automatica sportello"
},
"auto_door_voice_control": {
"name": "Controllo vocale apertura automatica sportello"
},
"auto_release_dry": {
"name": "Apertura automatica per asciugatura"
},
@@ -225,6 +225,9 @@
"air_filter_threshold": {
"name": "필터 알림 기준"
},
"auto_door_timer": {
"name": "오토 오픈 도어 타이머"
},
"beverage_zone_mode": {
"name": "음료 보관 모드",
"state": {
@@ -472,9 +475,11 @@
"kimchi_storage_crunfch": "아삭 김치",
"kimchi_storage_buy": "구입 김치",
"storage_fridge_normal": "냉장",
"storage_fridge": "냉장",
"storage_fridge_cold": "냉장 강",
"storage_fridge_warm": "냉장 약",
"storage_freezer_normal": "냉동",
"storage_freezer": "냉동",
"storage_freezer_cold": "냉동 강",
"storage_freezer_warm": "냉동 약",
"kimchi_ripe_low_temp": "김치 저온 숙성",
@@ -487,7 +492,8 @@
"storage_fresh_cereal": "곡류",
"storage_fridge_drink": "음료",
"storage_fresh_wine": "와인",
"storage_fresh_potato_banana": "감자 및 바나나"
"storage_fresh_potato_banana": "감자 및 바나나",
"newmode_kimchi_0000": "새 모드"
}
},
"pantry_zone_mode": {
@@ -498,6 +504,16 @@
"fdr_drinks": "음료"
}
},
"winecellar_pantry_zone_mode": {
"name": "팬트리실 모드",
"state": {
"processed_meat": "가공육",
"cheese": "치즈",
"nuts": "견과류",
"fruit": "과일",
"wine": "와인"
}
},
"range_burner_power_level": {
"name": "{number}번 화구 화력",
"state": {
@@ -1147,6 +1163,12 @@
"auto_door_opener": {
"name": "오토 오픈 도어"
},
"auto_door_sound_control": {
"name": "오토 오픈 도어 소리"
},
"auto_door_voice_control": {
"name": "오토 오픈 도어 음성 안내"
},
"auto_release_dry": {
"name": "자동 문 열림 건조"
},
@@ -225,6 +225,9 @@
"air_filter_threshold": {
"name": "Filteralarmdrempel"
},
"auto_door_timer": {
"name": "Timer automatische deuropener"
},
"beverage_zone_mode": {
"name": "Modus drankenzone",
"state": {
@@ -472,9 +475,11 @@
"kimchi_storage_crunfch": "Knapperige kimchi",
"kimchi_storage_buy": "Gekochte kimchi",
"storage_fridge_normal": "Koelkast",
"storage_fridge": "Koelkast",
"storage_fridge_cold": "Koelkast, sterk",
"storage_fridge_warm": "Koelkast, zwak",
"storage_freezer_normal": "Vriezer",
"storage_freezer": "Vriezer",
"storage_freezer_cold": "Vriezer, sterk",
"storage_freezer_warm": "Vriezer, zwak",
"kimchi_ripe_low_temp": "Kimchi rijpen, lage temperatuur",
@@ -487,7 +492,8 @@
"storage_fresh_cereal": "Granen",
"storage_fridge_drink": "Dranken",
"storage_fresh_wine": "Wijn",
"storage_fresh_potato_banana": "Aardappelen en bananen"
"storage_fresh_potato_banana": "Aardappelen en bananen",
"newmode_kimchi_0000": "Nieuwe modus"
}
},
"pantry_zone_mode": {
@@ -498,6 +504,16 @@
"fdr_drinks": "Dranken"
}
},
"winecellar_pantry_zone_mode": {
"name": "Modus voorraadzone",
"state": {
"processed_meat": "Vleeswaren",
"cheese": "Kaas",
"nuts": "Noten",
"fruit": "Fruit",
"wine": "Wijn"
}
},
"range_burner_power_level": {
"name": "Vermogensniveau brander {number}",
"state": {
@@ -1147,6 +1163,12 @@
"auto_door_opener": {
"name": "Automatische deuropener"
},
"auto_door_sound_control": {
"name": "Geluid automatische deuropener"
},
"auto_door_voice_control": {
"name": "Spraakbediening automatische deuropener"
},
"auto_release_dry": {
"name": "Auto Release Dry"
},