[NO LONGER MAINTAINED] MY GOD - Anyone attempted an LG ThinQ integration?

Ok- thanks, just wanted to confirm.

Not sure if you're able to modify this or not, but it might be nice to remove the displaying of the seconds units - it appears that they don't actually report anyway. I've never seen anything other than ":00"

FYI, my integration is working smoothly. Notifications on washer/dryer starting and ending it's cycles are being caught properly. Keep up the good work.

1 Like

Correct the devices only report hour and minute. We can change this. Iā€™m hoping to have time to work on this more this weekend. Had a crazy busy week at work so far!

1 Like

Sounds great- no problem... completely understand crazy busy.

Hi there,

I have an LG Washer Dryer, I've been able to get my Washer showing up (it uses the LG ThinQ Washer driver), however none of the states or statuses are updated during a wash or dry cycle.

This is what appears when the device is discovered:

ThinQ Integration getModelJson(https://eic.lgthinq.com:46030/api/webContents/modelJSON?modelName=WTHT3&countryCode=WW&contentsId=xxxxxxxxxxxxxxx&authKey=thinq) - [Info:[productType:WM, country:WW, modelType:FL, MP Project:TITAN2, ProjectName:TITAN2 C3 HYBRID, modelName:WTHT3, networkType:WIFI, version:3.0], Module:[WPM:[GWM_CEN01_Main:001, GWM_CRS01_Main:001, GWM_CRS02_CourseList:001, GWM_CRS03_CourseDetail:001, GWM_WCH01_Main:001, GWM_WCH01_UserGuide2:001, GWM_ENM01_Main:001, GCM_SDS01_SdsMain:001, GWM_SET01_Main:001, GWM_SET02_PushList:001, GWM_SET03_NickName:001], Menu:[GWM_CRS01_Main, GWM_WCH01_Main, GWM_ENM01_Main, GCM_SDS01_SdsMain, GWM_SET01_Main]], Config:[downloadPanelLabel:@WM_TERM_DOWNLOAD_CYCLE_EN_W, remoteStartLabel:@WM_TITAN2_OPTION_REMOTE_START_W, maxDownloadCourseNum:1, defaultCourseId:1, downloadCourseAPId:14, defaultSmartCourseId:100, tubCleanCourseId:18, standbyEnable:true, fota:true, expectedStartTime:false, SmartCourseCategory:[[label:@WM_COURSE_CATEGORY_HOME_FAMILY_W, courseIdList:[72, 73, 51, 100, 52, 53, 55, 62, 64, 110, 111, 101, 102, 105, 107, 108]], [label:@WM_COURSE_CATEGORY_SPORTS_LEISURE_W, courseIdList:[54, 56, 59, 60]], [label:@WM_COURSE_CATEGORY_FABRIC_CARE_W, courseIdList:[74, 75, 77, 57, 58, 63]], [label:@WM_COURSE_CATEGORY_DRY_W, courseIdList:[67, 68, 69, 70, 66]]]], Value:[State:[type:Enum, default:0, option:[0:@WM_STATE_POWER_OFF_W, 1:@WM_STATE_INITIAL_W, 2:@WM_STATE_PAUSE_W, 3:@WM_STATE_RESERVE_W, 4:@WM_STATE_DETECTING_W, 6:@WM_STATE_RUNNING_W, 7:@WM_STATE_RINSING_W, 8:@WM_STATE_SPINNING_W, 9:@WM_STATE_DRYING_W, 10:@WM_STATE_END_W, 11:@WM_STATE_COOLDOWN_W, 12:@WM_STATE_RINSEHOLD_W, 14:@WM_STATE_REFRESHING_W, 15:@WM_STATE_STEAMSOFTENING_W, 16:@WM_STATE_DEMO_W, 18:@WM_STATE_ERROR_W]], PreState:[type:Enum, default:0, option:[0:@WM_STATE_POWER_OFF_W, 1:@WM_STATE_INITIAL_W, 2:@WM_STATE_PAUSE_W, 3:@WM_STATE_RESERVE_W, 4:@WM_STATE_DETECTING_W, 6:@WM_STATE_RUNNING_W, 7:@WM_STATE_RINSING_W, 8:@WM_STATE_SPINNING_W, 9:@WM_STATE_DRYING_W, 10:@WM_STATE_END_W, 11:@WM_STATE_COOLDOWN_W, 12:@WM_STATE_RINSEHOLD_W, 14:@WM_STATE_REFRESHING_W, 15:@WM_STATE_STEAMSOFTENING_W, 16:@WM_STATE_DEMO_W, 18:@WM_STATE_ERROR_W]], RemoteStart:[type:Enum, default:0, label:@WM_OPTION_REMOTE_START_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], InitialBit:[type:Boolean, default:false], ChildLock:[type:Enum, default:0, label:@WM_OPTION_CHILDLOCK_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], TCLCount:[type:Range, default:0, option:[min:0, max:60]], Reserve_Time_H:[type:Range, default:0, label:@WM_TITAN2_OPTION_DELAY_END_W, option:[min:3, max:19]], Reserve_Time_M:[type:Range, default:0, option:[min:0, max:59]], Remain_Time_H:[type:Range, default:0, option:[min:0, max:30]], Remain_Time_M:[type:Range, default:0, option:[min:0, max:59]], Initial_Time_H:[type:Range, default:0, option:[min:0, max:30]], Initial_Time_M:[type:Range, default:0, option:[min:0, max:59]], Wash:[type:Enum, default:0, label:@WM_TITAN2_OPTION_WASH_W, option:[0:-, 1:@WM_TITAN2_OPTION_TURBO_WASH_W, 2:@WM_TITAN2_OPTION_WASH_TIMESAVE_W, 3:@WM_TITAN2_OPTION_WASH_NORMAL_W, 4:@WM_TITAN2_OPTION_WASH_INTENSIVE_W]], SpinSpeed:[type:Enum, default:0, label:@WM_TITAN2_OPTION_SPIN_SPEED_W, option:[0:-, 1:@WM_TITAN2_OPTION_SPIN_NO_SPIN_W, 2:@WM_TITAN2_OPTION_SPIN_400_W, 3:@WM_TITAN2_OPTION_SPIN_600_W, 4:@WM_TITAN2_OPTION_SPIN_700_W, 5:@WM_TITAN2_OPTION_SPIN_800_W, 6:@WM_TITAN2_OPTION_SPIN_900_W, 7:@WM_TITAN2_OPTION_SPIN_1000_W, 8:@WM_TITAN2_OPTION_SPIN_1100_W, 9:@WM_TITAN2_OPTION_SPIN_1200_W, 10:@WM_TITAN2_OPTION_SPIN_1400_W, 11:@WM_TITAN2_OPTION_SPIN_1600_W, 255:@WM_TITAN2_OPTION_SPIN_MAX_W]], WaterTemp:[type:Enum, default:0, label:@WM_TITAN2_OPTION_TEMP_W, option:[0:-, 1:@WM_TITAN2_OPTION_TEMP_COLD_W, 2:@WM_TITAN2_OPTION_TEMP_20_W, 3:@WM_TITAN2_OPTION_TEMP_30_W, 4:@WM_TITAN2_OPTION_TEMP_40_W, 5:@WM_TITAN2_OPTION_TEMP_50_W, 6:@WM_TITAN2_OPTION_TEMP_60_W, 7:@WM_TITAN2_OPTION_TEMP_95_W]], RinseOption:[type:Enum, default:0, label:@WM_TITAN2_OPTION_RINSE_W, option:[0:-, 1:@WM_TITAN2_OPTION_RINSE_NORMAL_W, 2:@WM_TITAN2_OPTION_RINSE_RINSE+_W, 3:@WM_TITAN2_OPTION_RINSE_RINSE++_W, 4:@WM_TITAN2_OPTION_RINSE_NORMALHOLD_W, 5:@WM_TITAN2_OPTION_RINSE_RINSE+HOLD_W]], DryLevel:[type:Enum, default:0, label:@WM_TITAN2_OPTION_DRY_W, option:[0:-, 1:-, 2:@WM_TITAN2_OPTION_DRY_NORMAL_W, 3:@WM_TITAN2_OPTION_DRY_30_W, 4:@WM_TITAN2_OPTION_DRY_60_W, 5:@WM_TITAN2_OPTION_DRY_90_W, 6:@WM_TITAN2_OPTION_DRY_120_W, 7:@WM_TITAN2_OPTION_DRY_150_W, 8:@WM_TITAN2_OPTION_DRY_ECO_W, 9:@WM_TITAN2_OPTION_DRY_VERY_W, 10:@WM_TITAN2_OPTION_DRY_IRON_W, 11:@WM_TITAN2_OPTION_DRY_LOW_W, 12:@WM_TITAN2_OPTION_DRY_ENERGY_W, 13:@WM_TITAN2_OPTION_DRY_SPEED_W, 14:@WM_TITAN2_OPTION_DRY_COOLING_W]], TurboWash:[type:Enum, default:0, label:@WM_TITAN2_OPTION_TURBO_WASH_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], Steam:[type:Enum, default:0, label:@WM_TITAN2_OPTION_STEAM_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], PreWash:[type:Enum, default:0, label:@WM_TITAN2_OPTION_PRE_WASH_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], MedicRinse:[type:Enum, default:0, label:@WM_TITAN2_OPTION_MEDIC_RINSE_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], SteamSoftener:[type:Enum, default:0, label:@WM_TITAN2_OPTION_STEAM_SOFTENER_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], LoadItem:[type:Enum, default:0, label:@WM_TITAN2_OPTION_LOAD_ITEM_W, option:[0:0, 1:1, 2:2, 3:3]], Standby:[type:Enum, default:0, label:@WM_TITAN2_OPTION_STANDBY_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], CreaseCare:[type:Enum, default:0, label:@WM_TITAN2_OPTION_CREASE_CARE_W, option:[0:@CP_OFF_EN_W, 1:@CP_ON_EN_W]], Option1:[type:Bit, default:0, option:[[startbit:0, length:1, default:0, value:TurboWash], [startbit:1, length:1, default:0, value:CreaseCare], [startbit:2, length:1, default:0, value:SteamSoftener], [startbit:3, length:1, default:0, value:EcoHybrid], [startbit:4, length:1, default:0, value:MedicRinse], [startbit:5, length:1, default:0, value:RinseSpin], [startbit:6, length:1, default:0, value:PreWash], [startbit:7, length:1, default:0, value:Steam]]], Option2:[type:Bit, default:0, option:[[startbit:0, length:1, default:0, value:InitialBit], [startbit:1, length:1, default:0, value:RemoteStart], [startbit:6, length:1, default:0, value:DoorLock], [startbit:7, length:1, default:0, value:ChildLock]]], Course:[type:Reference, option:[Course]], Error:[type:Reference, option:[Error]], SmartCourse:[type:Reference, option:[SmartCourse]]], Error:[0:[_comment:No Error, label:ERROR_NOERROR, title:ERROR_NOERROR_TITLE, content:ERROR_NOERROR_CONTENT], 1:[_comment:DE2 Error, label:@WM_WW_FL_ERROR_DE2_W, title:@WM_WW_FL_ERROR_DE2_TITLE_W, content:@WM_WW_FL_ERROR_DE2_CONTENT_S], 2:[_comment:DE1 Error, label:@WM_WW_FL_ERROR_DE1_W, title:@WM_WW_FL_ERROR_DE1_TITLE_W, content:@WM_WW_FL_ERROR_DE1_CONTENT_S], 3:[_comment:IE Error, label:@WM_WW_FL_ERROR_IE_W, title:@WM_WW_FL_ERROR_IE_TITLE_W, content:@WM_WW_FL_ERROR_IE_CONTENT_S], 4:[_comment:OE Error, label:@WM_WW_FL_ERROR_OE_W, title:@WM_WW_FL_ERROR_OE_TITLE_W, content:@WM_WW_FL_ERROR_OE_CONTENT_S], 5:[_comment:UE Error, label:@WM_WW_FL_ERROR_UE_W, title:@WM_WW_FL_ERROR_UE_TITLE_W, content:@WM_WW_FL_ERROR_UE_CONTENT_S], 6:[_comment:FE Error, label:@WM_WW_FL_ERROR_FE_W, title:@WM_WW_FL_ERROR_FE_TITLE_W, content:@WM_WW_FL_ERROR_FE_CONTENT_S], 7:[_comment:PE Error, label:@WM_WW_FL_ERROR_PE_W, title:@WM_WW_FL_ERROR_PE_TITLE_W, content:@WM_WW_FL_ERROR_PE_CONTENT_S], 8:[_comment:tE error, label:@WM_WW_FL_ERROR_TE_W, title:@WM_WW_FL_ERROR_TE_TITLE_W, content:@WM_WW_FL_ERROR_TE_CONTENT_S], 9:[_comment:LE error, label:@WM_WW_FL_ERROR_LE_W, title:@WM_WW_FL_ERROR_LE_TITLE_W, content:@WM_WW_FL_ERROR_LE_CONTENT_S], 11:[_comment:dHE error, label:@WM_WW_FL_ERROR_DHE_W, title:@WM_WW_FL_ERROR_DHE_TITLE_W, content:@WM_WW_FL_ERROR_DHE_CONTENT_S], 12:[_comment:PF error, label:@WM_WW_FL_ERROR_PF_W, title:@WM_WW_FL_ERROR_PF_TITLE_W, content:@WM_WW_FL_ERROR_PF_CONTENT_S], 13:[_comment:FF error, label:@WM_WW_FL_ERROR_FF_W, title:@WM_WW_FL_ERROR_FF_TITLE_W, content:@WM_WW_FL_ERROR_FF_CONTENT_S], 14:[_comment:dCE Error, label:@WM_WW_FL_ERROR_DCE_W, title:@WM_WW_FL_ERROR_DCE_TITLE_W, content:@WM_WW_FL_ERROR_DCE_CONTENT_S], 15:[_comment:AE Error (AquaLock), label:@WM_WW_FL_ERROR_AE_W, title:@WM_WW_FL_ERROR_AE_TITLE_W, content:@WM_WW_FL_ERROR_AE_CONTENT_S], 16:[_comment:EE error, label:@WM_WW_FL_ERROR_EE_W, title:@WM_WW_FL_ERROR_EE_TITLE_W, content:@WM_WW_FL_ERROR_EE_CONTENT_S], 17:[_comment:PS Error, label:@WM_WW_FL_ERROR_PS_W, title:@WM_WW_FL_ERROR_PS_TITLE_W, content:@WM_WW_FL_ERROR_PS_CONTENT_S], 18:[_comment:dE4 Error, label:@WM_WW_FL_ERROR_DE4_W, title:@WM_WW_FL_ERROR_DE4_TITLE_W, content:@WM_WW_FL_ERROR_DE4_CONTENT_S]], Monitoring:[type:BINARY(BYTE), protocol:[[_comment:State, startByte:0, length:1, value:State], [_comment:RemainTime - Hour, startByte:1, length:1, value:Remain_Time_H], [_comment:RemainTime - Min, startByte:2, length:1, value:Remain_Time_M], [_comment:InitialTime - Hour, startByte:3, length:1, value:Initial_Time_H], [_comment:InitialTime - Min, startByte:4, length:1, value:Initial_Time_M], [_comment:Course, startByte:5, length:1, value:Course], [_comment:Error, startByte:6, length:1, value:Error], [_comment:Wash Option, startByte:7, length:1, value:Wash], [_comment:Spin Option, startByte:8, length:1, value:SpinSpeed], [_comment:Water Temp Option, startByte:9, length:1, value:WaterTemp], [_comment:Rinse Option, startByte:10, length:1, value:RinseOption], [_comment:Dry Level Option, startByte:11, length:1, value:DryLevel], [_comment:ReserveTime - Hour, startByte:12, length:1, value:Reserve_Time_H], [_comment:ReserveTime - Min, startByte:13, length:1, value:Reserve_Time_M], [_comment:Option 1, startByte:14, length:1, value:Option1], [_comment:Option 2, startByte:15, length:1, value:Option2], [_comment:PreState, startByte:19, length:1, value:PreState], [_comment:Download Course Index, startByte:20, length:1, value:SmartCourse], [_comment:Tub Clean Count, startByte:21, length:1, value:TCLCount], [_comment:Load Item, startByte:22, length:1, value:LoadItem], [_comment:CourseType, startByte:24, length:1, value:CourseType], [_comment:Standby, startByte:27, length:1, value:Standby]]], Push:[[category:PUSH_WM_STATE, label:@CP_ALARM_PRODUCT_STATE_W, groupCode:20101, pushList:[[0000:PUSH_WM_COMPLETE], [0001:PUSH_WM_REMOTE_ANOTHER_ID], [0100:PUSH_WM_ERROR], [0200:PUSH_WM_REMOTE_START_OFF], [0201:PUSH_WM_REMOTE_START_ON]]]], EnergyMonitoring:[option:[WaterTemp, SpinSpeed, Wash, DryLevel], powertable:[1:1, 2:2, 3:3, 4:4, 5:5]], SmartMode:[MODE020:[_comment:MODE_HOME_IN, modeCase:0, actionName:@WM_MODE_COURSE_START_W, control:[[command:MODE020Start]]]], ControlWifi:[type:BINARY(BYTE), action:[CourseDownload:[tag:[COURSE, ID, NAME, DESCRIPTION, DATA], data:[{{Course}},{{Wash}},{{SpinSpeed}},{{WaterTemp}},{{RinseOption}},{{DryLevel}},{{Reserve_Time_H}},{{Reserve_Time_M}},{{LoadItem}},{{Option1}},{{Option2}},0,{{SmartCourse}},0]], PowerOff:[cmd:Control, cmdOpt:Power, value:Off], OperationStart:[cmd:Control, cmdOpt:Operation, value:Start, data:[{{Course}},{{Wash}},{{SpinSpeed}},{{WaterTemp}},{{RinseOption}},{{DryLevel}},{{Reserve_Time_H}},{{Reserve_Time_M}},{{LoadItem}},{{Option1}},{{Option2}},0,{{SmartCourse}},0], encode:true], OperationStop:[cmd:Control, cmdOpt:Operation, value:Stop], OperationWakeUp:[cmd:Control, cmdOpt:Operation, value:WakeUp], MODE020Start:[cmd:Control, cmdOpt:Operation, value:Start, data:[1,3,255,4,1,0,0,0,0,0,1,0,0,0], encode:true]]], Course:[1:[_comment:Cotton, courseType:Course, id:1, name:@WM_WW_FL_TITAN2_COURSE_COTTON_W, script:, controlEnable:true, imgIndex:141, function:[[value:Wash, default:3], [value:WaterTemp, default:4], [value:SpinSpeed, default:255], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 2:[_comment:Easy Care, courseType:Course, id:2, name:@WM_WW_FL_TITAN2_COURSE_EASY_CARE_W, script:, controlEnable:true, imgIndex:145, function:[[value:Wash, default:3], [value:WaterTemp, default:4], [value:SpinSpeed, default:7], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 4:[_comment:Cotton+, courseType:Course, id:4, name:@WM_WW_FL_TITAN2_COURSE_COTTON+_W, script:, controlEnable:true, imgIndex:148, function:[[value:Wash, default:3], [value:WaterTemp, default:6], [value:SpinSpeed, default:255], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 5:[_comment:Duvet, courseType:Course, id:5, name:@WM_WW_FL_TITAN2_COURSE_DUVET_W, script:, controlEnable:true, imgIndex:202, function:[[value:Wash, default:3], [value:WaterTemp, default:1], [value:SpinSpeed, default:7], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 7:[_comment:Mix, courseType:Course, id:7, name:@WM_WW_FL_TITAN2_COURSE_MIX_W, script:, controlEnable:true, imgIndex:142, function:[[value:Wash, default:3], [value:WaterTemp, default:4], [value:SpinSpeed, default:7], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 8:[_comment:Sports Wear, courseType:Course, id:8, name:@WM_WW_FL_TITAN2_COURSE_SPORTS_WEAR_W, script:, controlEnable:true, imgIndex:51, function:[[value:Wash, default:3], [value:WaterTemp, default:4], [value:SpinSpeed, default:5], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 10:[_comment:Allergy Care, courseType:Course, id:10, name:@WM_WW_FL_TITAN2_COURSE_ALLERGY_CARE_W, script:, controlEnable:true, imgIndex:147, function:[[value:Wash, default:3], [value:WaterTemp, default:6], [value:SpinSpeed, default:255], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:1], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 11:[_comment:Gentle Care, courseType:Course, id:11, name:@WM_WW_FL_TITAN2_COURSE_GENTLE_CARE_W, script:, controlEnable:true, imgIndex:150, function:[[value:Wash, default:3], [value:WaterTemp, default:2], [value:SpinSpeed, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 18:[_comment:Tub Clean, courseType:Course, id:18, name:@WM_WW_FL_TITAN2_COURSE_TUB_CLEAN_W, script:, controlEnable:true, imgIndex:152, function:[[value:Wash, default:3, showing:-], [value:WaterTemp, default:6, showing:-], [value:SpinSpeed, default:1, showing:-], [value:RinseOption, default:1, showing:-], [value:DryLevel, default:0, showing:-], [value:PreWash, default:0, showing:-], [value:TurboWash, default:0, showing:-], [value:Steam, default:0, showing:-], [value:MedicRinse, default:0, showing:-], [value:SteamSoftener, default:0, showing:-], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0, showing:-]]], 19:[_comment:Wash+Dry 5, courseType:Course, id:19, name:@WM_WW_FL_TITAN2_COURSE_WASH+DRY_5_W, script:, controlEnable:true, imgIndex:161, function:[[value:Wash, default:3], [value:WaterTemp, default:4], [value:SpinSpeed, default:255], [value:RinseOption, default:1], [value:DryLevel, default:2], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 32:[_comment:Delicate, courseType:Course, id:32, name:@WM_WW_FL_TITAN2_COURSE_DELICATE_W, script:, controlEnable:true, imgIndex:149, function:[[value:Wash, default:3], [value:WaterTemp, default:2], [value:SpinSpeed, default:5], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 34:[_comment:Quick 30, courseType:Course, id:34, name:@WM_WW_FL_TITAN2_COURSE_QUICK_30_W, script:, controlEnable:true, imgIndex:200, function:[[value:Wash, default:3], [value:WaterTemp, default:2], [value:SpinSpeed, default:5], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 35:[_comment:Steam Refresh, courseType:Course, id:35, name:@WM_WW_FL_TITAN2_COURSE_STEAM_REFRESH_W, script:, controlEnable:true, imgIndex:67, function:[[value:Wash, default:0], [value:WaterTemp, default:0], [value:SpinSpeed, default:0], [value:RinseOption, default:0], [value:DryLevel, default:0], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:1, showing:@CP_ON_EN_W], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:3, visibility:gone], [value:CreaseCare, default:0]]], 36:[_comment:Direct Wear, courseType:Course, id:36, name:@WM_WW_FL_TITAN2_COURSE_DIRECT_WEAR_W, script:, controlEnable:true, imgIndex:158, function:[[value:Wash, default:3], [value:WaterTemp, default:2], [value:SpinSpeed, default:7], [value:RinseOption, default:1], [value:DryLevel, default:3], [value:PreWash, default:0], [value:TurboWash, default:0], [value:Steam, default:0], [value:MedicRinse, default:0], [value:SteamSoftener, default:0], [value:LoadItem, default:0, visibility:gone], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]]], SmartCourse:[72:[_comment:Hygiene, courseType:SmartCourse, id:72, Course:16, name:@WM_WW_FL_SMARTCOURSE_HYGIENE_W, script:@WM_WW_FL_SMARTCOURSE_HYGIENE_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:36, function:[[value:Wash, default:3], [value:SpinSpeed, default:7], [value:WaterTemp, default:6], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 73:[_comment:Small Load, courseType:SmartCourse, id:73, Course:34, name:@WM_WW_FL_SMARTCOURSE_SMALL_LOAD_W, script:@WM_WW_FL_SMARTCOURSE_SMALL_LOAD_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:46, function:[[value:Wash, default:3], [value:SpinSpeed, default:5], [value:WaterTemp, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 74:[_comment:Lingerie, courseType:SmartCourse, id:74, Course:32, name:@WM_WW_FL_SMARTCOURSE_LINGERIE_W, script:@WM_WW_FL_SMARTCOURSE_LINGERIE_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:13, function:[[value:Wash, default:3], [value:SpinSpeed, default:5], [value:WaterTemp, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 75:[_comment:Wool, courseType:SmartCourse, id:75, Course:27, name:@WM_WW_FL_SMARTCOURSE_WOOL_W, script:@WM_WW_FL_SMARTCOURSE_WOOL_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:99, function:[[value:Wash, default:3], [value:SpinSpeed, default:5], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 77:[_comment:Cold Wash, courseType:SmartCourse, id:77, Course:29, name:@WM_WW_FL_SMARTCOURSE_COLD_WASH_W, script:@WM_WW_FL_SMARTCOURSE_COLD_WASH_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:22, function:[[value:Wash, default:3], [value:SpinSpeed, default:9], [value:WaterTemp, default:1], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 51:[_comment:Baby Wear, courseType:SmartCourse, id:51, Course:17, name:@WM_WW_FL_SMARTCOURSE_BABY_WEAR_W, script:@WM_WW_FL_SMARTCOURSE_BABY_WEAR_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:52, function:[[value:Wash, default:3], [value:SpinSpeed, default:7], [value:WaterTemp, default:6], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:1], [value:MedicRinse, default:1], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 100:[_comment:Rinse + Spin, courseType:SmartCourse, id:100, Course:14, name:@WM_WW_FL_SMARTCOURSE_RINSE_SPIN_W, script:@WM_WW_FL_SMARTCOURSE_RINSE_SPIN_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:60, function:[[value:Wash, default:3], [value:SpinSpeed, default:255], [value:WaterTemp, default:0], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 52:[_comment:Kids Wear, courseType:SmartCourse, id:52, Course:6, name:@WM_WW_FL_SMARTCOURSE_KIDS_WEAR_W, script:@WM_WW_FL_SMARTCOURSE_KIDS_WEAR_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:53, function:[[value:Wash, default:3], [value:SpinSpeed, default:9], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:1], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 53:[_comment:School Uniform, courseType:SmartCourse, id:53, Course:2, name:@WM_WW_FL_SMARTCOURSE_SCHOOL_UNIFORM_W, script:@WM_WW_FL_SMARTCOURSE_SCHOOL_UNIFORM_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:130, function:[[value:Wash, default:3], [value:SpinSpeed, default:9], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:1], [value:Reserve_Time_H, default:0]]], 54:[_comment:Swimming Wear, courseType:SmartCourse, id:54, Course:11, name:@WM_WW_FL_SMARTCOURSE_SWIMMING_WEAR_W, script:@WM_WW_FL_SMARTCOURSE_SWIMMING_WEAR_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:54, function:[[value:Wash, default:3], [value:SpinSpeed, default:2], [value:WaterTemp, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 55:[_comment:Rainy Season, courseType:SmartCourse, id:55, Course:1, name:@WM_WW_FL_SMARTCOURSE_RAINY_SEASON_W, script:@WM_WW_FL_SMARTCOURSE_RAINY_SEASON_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:55, function:[[value:Wash, default:3], [value:SpinSpeed, default:255], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 56:[_comment:Gym Clothes, courseType:SmartCourse, id:56, Course:8, name:@WM_WW_FL_SMARTCOURSE_GYM_CLOTHES_W, script:@WM_WW_FL_SMARTCOURSE_GYM_CLOTHES_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:56, function:[[value:Wash, default:3], [value:SpinSpeed, default:5], [value:WaterTemp, default:1], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 57:[_comment:Jeans, courseType:SmartCourse, id:57, Course:3, name:@WM_WW_FL_SMARTCOURSE_JEANS_W, script:@WM_WW_FL_SMARTCOURSE_JEANS_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:76, function:[[value:Wash, default:3], [value:SpinSpeed, default:255], [value:WaterTemp, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 58:[_comment:Blanket, courseType:SmartCourse, id:58, Course:5, name:@WM_WW_FL_SMARTCOURSE_BLANKET_W, script:@WM_WW_FL_SMARTCOURSE_BLANKET_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:57, function:[[value:Wash, default:3], [value:SpinSpeed, default:2], [value:WaterTemp, default:1], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 59:[_comment:Sweat Stain, courseType:SmartCourse, id:59, Course:1, name:@WM_WW_FL_SMARTCOURSE_SWEAT_STAIN_W, script:@WM_WW_FL_SMARTCOURSE_SWEAT_STAIN_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:58, function:[[value:Wash, default:3], [value:SpinSpeed, default:255], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 60:[_comment:Deodorization, courseType:SmartCourse, id:60, Course:35, name:@WM_WW_FL_SMARTCOURSE_DEODORIZATION_W, script:@WM_WW_FL_SMARTCOURSE_DEODORIZATION_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:85, function:[[value:SpinSpeed, default:0], [value:WaterTemp, default:0], [value:RinseOption, default:0], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:1], [value:LoadItem, default:3, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 62:[_comment:Single Garment, courseType:SmartCourse, id:62, Course:34, name:@WM_WW_FL_SMARTCOURSE_SINGLE_GARMENT_W, script:@WM_WW_FL_SMARTCOURSE_SINGLE_GARMENT_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:59, function:[[value:Wash, default:3], [value:SpinSpeed, default:5], [value:WaterTemp, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 63:[_comment:Color Protection, courseType:SmartCourse, id:63, Course:11, name:@WM_WW_FL_SMARTCOURSE_COLOR_PROTECTION_W, script:@WM_WW_FL_SMARTCOURSE_COLOR_PROTECTION_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:47, function:[[value:Wash, default:3], [value:SpinSpeed, default:2], [value:WaterTemp, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 64:[_comment:Noise Minimize, courseType:SmartCourse, id:64, Course:9, name:@WM_WW_FL_SMARTCOURSE_NOISE_MINIMIZE_W, script:@WM_WW_FL_SMARTCOURSE_NOISE_MINIMIZE_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:88, function:[[value:Wash, default:3], [value:SpinSpeed, default:7], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 67:[_comment:Dry 30, courseType:SmartCourse, id:67, Course:24, name:@WM_WW_FL_SMARTCOURSE_DRY_30_W, script:@WM_WW_FL_SMARTCOURSE_DRY_30_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:198, function:[[value:Wash, default:0], [value:SpinSpeed, default:0], [value:WaterTemp, default:0], [value:RinseOption, default:0], [value:DryLevel, default:3], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 68:[_comment:Dry 60, courseType:SmartCourse, id:68, Course:24, name:@WM_WW_FL_SMARTCOURSE_DRY_60_W, script:@WM_WW_FL_SMARTCOURSE_DRY_60_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:199, function:[[value:Wash, default:0], [value:SpinSpeed, default:0], [value:WaterTemp, default:0], [value:RinseOption, default:0], [value:DryLevel, default:4], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 69:[_comment:Turbo Dry, courseType:SmartCourse, id:69, Course:24, name:@WM_WW_FL_SMARTCOURSE_TURBO_DRY_W, script:@WM_WW_FL_SMARTCOURSE_TURBO_DRY_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:201, function:[[value:SpinSpeed, default:0], [value:WaterTemp, default:0], [value:RinseOption, default:0], [value:DryLevel, default:2], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 70:[_comment:Shirt Dry, courseType:SmartCourse, id:70, Course:24, name:@WM_WW_FL_SMARTCOURSE_SHIRT_DRY_W, script:@WM_WW_FL_SMARTCOURSE_SHIRT_DRY_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:197, function:[[value:SpinSpeed, default:0], [value:WaterTemp, default:0], [value:RinseOption, default:0], [value:DryLevel, default:10], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 66:[_comment:Quick Wash + Dry, courseType:SmartCourse, id:66, Course:36, name:@WM_WW_FL_SMARTCOURSE_QUICK_WASH_DRY_W, script:@WM_WW_FL_SMARTCOURSE_QUICK_WASH_DRY_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:158, function:[[value:Wash, default:3], [value:SpinSpeed, default:7], [value:WaterTemp, default:3], [value:RinseOption, default:1], [value:DryLevel, default:3], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 110:[_comment:Saving Time, courseType:SmartCourse, id:110, Course:1, name:@WM_WW_FL_SMARTCOURSE_SAVING_TIME_W, script:@WM_WW_FL_SMARTCOURSE_SAVING_TIME_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:15, function:[[value:Wash, default:2], [value:SpinSpeed, default:255], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 111:[_comment:Minimize Wrinkles, courseType:SmartCourse, id:111, Course:1, name:@WM_WW_FL_SMARTCOURSE_MINIMIZE_WRINKLES_W, script:@WM_WW_FL_SMARTCOURSE_MINIMIZE_WRINKLES_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:80, function:[[value:Wash, default:3], [value:SpinSpeed, default:255], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:1], [value:Reserve_Time_H, default:0]]], 101:[_comment:Lightly Soiled Items, courseType:SmartCourse, id:101, Course:11, name:@WM_WW_FL_SMARTCOURSE_LIGHTLY_SOILED_ITEMS_W, script:@WM_WW_FL_SMARTCOURSE_LIGHTLY_SOILED_ITEMS_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:43, function:[[value:Wash, default:3], [value:SpinSpeed, default:2], [value:WaterTemp, default:2], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 102:[_comment:Minimize Detergent Residue, courseType:SmartCourse, id:102, Course:1, name:@WM_WW_FL_SMARTCOURSE_MINIMIZE_DETERGENT_RESIDUE_W, script:@WM_WW_FL_SMARTCOURSE_MINIMIZE_DETERGENT_RESIDUE_1_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:30, function:[[value:Wash, default:3], [value:SpinSpeed, default:255], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:1], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 105:[_comment:Steam Care, courseType:SmartCourse, id:105, Course:1, name:@WM_WW_FL_SMARTCOURSE_STEAM_CARE_W, script:@WM_WW_FL_SMARTCOURSE_STEAM_CARE_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:8, function:[[value:Wash, default:3], [value:SpinSpeed, default:255], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:0], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:1], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 107:[_comment:Sleeve Hems and Collars, courseType:SmartCourse, id:107, Course:6, name:@WM_WW_FL_SMARTCOURSE_SLEEVE_HEMS_AND_COLLARS_W, script:@WM_WW_FL_SMARTCOURSE_SLEEVE_HEMS_AND_COLLARS_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:37, function:[[value:Wash, default:3], [value:SpinSpeed, default:7], [value:WaterTemp, default:6], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:1], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]], 108:[_comment:Juice and Food Stains, courseType:SmartCourse, id:108, Course:6, name:@WM_WW_FL_SMARTCOURSE_JUICE_AND_FOOD_STAINS_W, script:@WM_WW_FL_SMARTCOURSE_JUICE_AND_FOOD_STAINS_SCRIPT_S, downloadEnable:true, controlEnable:true, imgIndex:108, function:[[value:Wash, default:3], [value:SpinSpeed, default:7], [value:WaterTemp, default:4], [value:RinseOption, default:1], [value:DryLevel, default:0], [value:PreWash, default:1], [value:MedicRinse, default:0], [value:Steam, default:0], [value:LoadItem, default:0, visibility:gone], [value:SteamSoftener, default:0], [value:TurboWash, default:0], [value:CreaseCare, default:0], [value:Reserve_Time_H, default:0]]]]]

Do you know what might be causing the status to not refresh please (all I'm looking for is the ability for Echo Speaks to announce the washer dryer is complete when the remaining time drops below 1 minute)?

Thanks,
Guy

I've changed the driver to 'LG Dryer' and it seems to have sprung into life :smiley:

Thanks for this - it's great!

So you're saying you have one of their combo devices that is both a washer and dryer? According to what you pasted there it looks like it reports as a washer (WM is a washer) so I'm not sure why switching it to a Dryer driver would help

I've just changed it back to washer and it seems to report back, what I have found in the past (using the Fison67 Docker method) was that I had to add some of the Dryer attributes into the Driver (or back in ST days, DTH) otherwise when the device switched from 'Wash' to 'Dry' it would not update the time remaining (in-fact LG's own ThinQ app does this as when the dryer goes from wash to dry the time remaining merely shows 'Detecting', because its using a Washer device type).

I'll run a wash and dry cycle now and report back on what happens, but so far using the LG ThinQ Washer Driver and running a rinse/spin cycle the time remaining is reporting as it should.

Thanks,
Guy

Interesting, I'll try to think of a better way to handle that device... might need some help testing at some point.

Sounds like a proper nightmare, but would love to have my LG ThinQ enabled washing machine notify my hub - perhaps I could then set the value of a Virtual Contact Sensor to open and then have an Alexa Routine to announce the washing cycle has completed :wink:

1 Like

Have you tried the app yet? We (mostly) have washers and dryers working. There are some small things I hope to iron out later this weekend though.

After trying to amalgamate both Dryer and Washer into one Driver (see my below cobbled together code), it seems that unless I select 'Initialize' after a period of time the Device no longer polls for the status of the Washer Dryer.

I can probably overcome this by having a WebCoRE piston action 'Initialize' once every few minutes, but didn't know if it's anything you have come across.

Great work so far by the way!

Cheers,
Guy

/**

  • LG Washer
  • Copyright 2020 Dominick Meglio

*/

import groovy.transform.Field
import groovy.json.JsonSlurper

@Field List LOG_LEVELS = ["error", "warn", "info", "debug", "trace"]
@Field String DEFAULT_LOG_LEVEL = LOG_LEVELS[2]

metadata {
definition(name: "LG ThinQ Washer", namespace: "dcm.thinq", author: "dmeglio@gmail.com") {
capability "Sensor"
capability "Switch"
capability "Initialize"

    attribute "runTime", "number"
    attribute "runTimeDisplay", "string"
    attribute "remainingTime", "number"
    attribute "remainingTimeDisplay", "string"
    attribute "delayTime", "number"
    attribute "delayTimeDisplay", "string"
    attribute "finishTimeDisplay", "string"
    attribute "currentState", "string"
    attribute "error", "string"
    attribute "course", "string"
    attribute "smartCourse", "string"
    attribute "remoteStart", "string"
    attribute "soilLevel", "string"
    attribute "spinSpeed", "string"
    attribute "temperatureLevel", "string"
    attribute "temperatureTarget", "string"
    attribute "doorLock", "string"
    
    attribute "runTime", "number"
    attribute "runTimeDisplay", "string"
    attribute "currentState", "string"
    attribute "dryLevel", "string"
    attribute "temperatureLevel", "string"
    attribute "timeDry", "string"
}

preferences {
  section { // General
    input name: "logLevel", title: "Log Level", type: "enum", options: LOG_LEVELS, defaultValue: DEFAULT_LOG_LEVEL, required: false
    input name: "logDescText", title: "Log Description Text", type: "bool", defaultValue: false, required: false
  }
}

}

def uninstalled() {
logger("debug", "uninstalled()")
parent.stopRTIMonitoring(device)
}

def initialize() {
logger("debug", "initialize()")

if (getDataValue("master") == "true") {
    if (interfaces.mqtt.isConnected())
        interfaces.mqtt.disconnect()

    mqttConnectUntilSuccessful()
}

parent.registerRTIMonitoring(device)

}

def mqttConnectUntilSuccessful() {
logger("debug", "mqttConnectUntilSuccessful()")

try {
def mqtt = parent.retrieveMqttDetails()

interfaces.mqtt.connect(mqtt.server,
                        mqtt.clientId,
                        null,
                        null,
                        tlsVersion: "1.2",
                        privateKey: mqtt.privateKey,
                        caCertificate: mqtt.caCertificate,
                        clientCertificate: mqtt.certificate)
pauseExecution(3000)
for (sub in mqtt.subscriptions) {
    interfaces.mqtt.subscribe(sub, 0)
}
return true

}
catch (e)
{
logger("warn", "Lost connection to MQTT, retrying in 15 seconds ${e}")
runIn(15, "mqttConnectUntilSuccessful")
return false
}
}

def parse(message) {
def topic = interfaces.mqtt.parseMessage(message)
def payload = new JsonSlurper().parseText(topic.payload)
logger("trace", "parse(${payload})")

parent.processMqttMessage(this, payload)

}

def mqttClientStatus(String message) {
logger("debug", "mqttClientStatus(${message})")

if (message.startsWith("Error:")) {
    logger("error", "MQTT Error: ${message}")

    try {
        interfaces.mqtt.disconnect() // Guarantee we're disconnected
    }
    catch (e) {
    }
    mqttConnectUntilSuccessful()
}

}

def processStateData(data) {
logger("debug", "processStateData(${data})")

def runTime = 0
def runTimeDisplay = '00:00:00'
def remainingTime = 0
def remainingTimeDisplay = '00:00:00'
def delayTime = 0
def delayTimeDisplay = '00:00:00'
def error

if (parent.checkValue(data,'Initial_Time_H')) {
  runTime += (data["Initial_Time_H"]*60*60)
}
if (parent.checkValue(data,'Initial_Time_M')) {
  runTime += (data["Initial_Time_M"]*60)
}
runTimeDisplay = parent.convertSecondsToTime(runTime)

if (parent.checkValue(data,'Remain_Time_H')) {
  remainingTime += (data["Remain_Time_H"]*60*60)
}
if (parent.checkValue(data,'Remain_Time_M')) {
  remainingTime += (data["Remain_Time_M"]*60)
}
remainingTimeDisplay = parent.convertSecondsToTime(remainingTime)

Date currentTime = new Date()
use(groovy.time.TimeCategory) {
  currentTime = currentTime + (remainingTime as int).seconds
}
def finishTimeDisplay = currentTime.format("yyyy-MM-dd'T'HH:mm:ssZ", location.timeZone)

if (parent.checkValue(data,'Reserve_Time_H')) {
  delayTime += (data["Reserve_Time_H"]*60*60)
}
if (parent.checkValue(data,'Reserve_Time_M')) {
  delayTime += (data["Reserve_Time_M"]*60)
}
delayTimeDisplay = parent.convertSecondsToTime(delayTime)

if (parent.checkValue(data,'State')) {
  String currentStateName = parent.cleanEnumValue(data["State"], "@WM_STATE_")
  if (device.currentValue("currentState") != currentStateName) {
    if(logDescText) {
      log.info "${device.displayName} CurrentState: ${currentStateName}"
    } else {
      logger("info", "CurrentState: ${currentStateName}")
    }
  }
  sendEvent(name: "currentState", value: currentStateName)

  def currentStateSwitch = (currentStateName =~ /power off/ ? 'off' : 'on')
  if (device.currentValue("switch") != currentStateSwitch) {
    if(logDescText) {
        log.info "${device.displayName} Was turned ${currentStateSwitch}"
    } else {
      logger("info", "Was turned ${currentStateSwitch}")
    }
  }
  sendEvent(name: "switch", value: currentStateSwitch, descriptionText: "Was turned ${currentStateSwitch}")
}

sendEvent(name: "runTime", value: runTime, unit: "seconds")
sendEvent(name: "runTimeDisplay", value: runTimeDisplay, unit: "hh:mm:ss")
sendEvent(name: "remainingTime", value: remainingTime, unit: "seconds")
sendEvent(name: "remainingTimeDisplay", value: remainingTimeDisplay, unit: "hh:mm:ss")
sendEvent(name: "delayTime", value: delayTime, unit: "seconds")
sendEvent(name: "delayTimeDisplay", value: delayTimeDisplay, unit: "hh:mm:ss")
sendEvent(name: "finishTimeDisplay", value: finishTimeDisplay, unit: "hh:mm:ss")

if (parent.checkValue(data,'Error')) {
  sendEvent(name: "error", value: data["Error"].toLowerCase())
}

if (parent.checkValue(data,'Course'))
    sendEvent(name: "course", value: data["Course"] != 0 ? data["Course"]?.toLowerCase() : "none")
if (parent.checkValue(data,'SmartCourse'))
    sendEvent(name: "smartCourse", value: data["SmartCourse"] != 0 ? data["SmartCourse"]?.toLowerCase() : "none")
if (parent.checkValue(data,'remoteStart'))
    sendEvent(name: "remoteStart", value: parent.cleanEnumValue(data["remoteStart"], "@CP_"))
if (parent.checkValue(data,'Soil'))
    sendEvent(name: "soilLevel", value: parent.cleanEnumValue(data["Soil"], ["@WM_.*_OPTION_SOIL_","@WM_.*_OPTION_WASH_", "@WM_TERM_"]))
if (parent.checkValue(data,'SpinSpeed'))
    sendEvent(name: "spinSpeed", value: parent.cleanEnumValue(data["SpinSpeed"], ["@WM_.*_OPTION_SPIN_","@WM_TERM_"]))
if (parent.checkValue(data,'TempControl'))
    sendEvent(name: "dryLevel", value: parent.cleanEnumValue(data["DryLevel"], "@WM_DRY27_DRY_LEVEL_"))
if (parent.checkValue(data,'TempControl'))
    sendEvent(name: "temperatureLevel", value: parent.cleanEnumValue(data["TempControl"], "@WM_DRY27_TEMP_"))
if (parent.checkValue(data,'TimeDry'))
    sendEvent(name: "timeDry", value: data["TimeDry"])
    sendEvent(name: "doorLock", value: parent.cleanEnumValue(data["doorLock"], "@CP_"))
if (parent.checkValue(data,'temp'))
    sendEvent(name: "temperatureTarget", value: data["temp"]?.split("_")?.getAt(1))

}

/**

  • @param level Level to log at, see LOG_LEVELS for options
  • @param msg Message to log
    */
    private logger(level, msg) {
    if (level && msg) {
    Integer levelIdx = LOG_LEVELS.indexOf(level)
    Integer setLevelIdx = LOG_LEVELS.indexOf(logLevel)
    if (setLevelIdx < 0) {
    setLevelIdx = LOG_LEVELS.indexOf(DEFAULT_LOG_LEVEL)
    }
    if (levelIdx <= setLevelIdx) {
    log."${level}" "${device.displayName} ${msg}"
    }
    }
    }

Yeah I'm aware of this bug, I'm going to work on it this weekend. Unfortunately none of the decvices I own are "v1 API" so I can't reproduce it locally so I'll rely on you guys to help test. Might get to it later today or tomorrow.

1 Like

Yep- this is exactly my issue. Looking forward to testing a fix! :smiley:

Actually, just noticed something based on the logs you previously sent me and I spotted a bug and at least (I think) a partial fix (maybe a complete fix).

Try the app version at GitHub - dcmeglio/hubitat-thinq at rti-fixes

I am 99% sure it will work for the FIRST cycle without you having to do an initialize. What I am unsure of is, what will happen after a cycle completes, the device shuts off, and then you run another cycle later. Based on what I see, I am really unsure how their API will work in that situation so we'll have to figure it out! If it works, great, if not, I have a thought on how to fix that too.

@guy.mayhew

1 Like

Brill will give it a go and let you know (running out of stuff to wash without my partner noticing :laughing:)

Let me know if there any other diagnostics I can run for you - happy to help as this has helped free me from having an ST hub now!

Cheers
Guy

Has anything changed in this branch (GitHub - dcmeglio/hubitat-thinq at rti-fixes) since last week when I tried testing this code on my washer & dryer? It looks like the last change was 6 days ago.

Oops closed my laptop before the upload completed, try now

1 Like

Ok- got the update that time. Interestingly, after installing the updated code, the "remainingTimeDisplay" on the LG Washer tile now shows "00:14:00" (it usually shows 00:01:00) -- I haven't turned it on or run a load yet. The Dryer is still showing "00:01:00".