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

I'm really confused, you pasted me those MQTT messages which were fromt he device logs? So how can there be nothing?

Also, logs are much easier to read if you post them as screenshots. HE logs are terrible to try to follow when they're pasted as text on the forum.

Clarification. Nothing else in the device logs.

DISHWASHER - Only the "Lost connection to MQTT"
OVEN - doesn't show up in logs

Alright, let me do some cleanup here and we can try again. I'm going to try to make the logs a little easier to find what we need to find. Give me 30mins - an hour.

1 Like

FYI,

I had duplicate devices earlier (after I got it to install) but I removed everything and reran the install after updating the device code with the latest github versions.

Should I have parent/child devices or just the two devices (DW and Oven)?

P.S. I have two hubs so I can install/setup again on the other hub if needed. I put this one on my coordinating/server hub (hubconnect).

Just two devices, one for each device you check off. Right now I don't have any cleanup code so if you uncheck a device it won't auto delete it for you

1 Like

Dumb/rhetorical question?

I don't need the MQTT app installed locally? You're just talking to LG's MQTT Server right?

Correct. Technically it's connecting to AWS IOT Device Gateway which is a cloud based MQTT system.

1 Like

Ok, just made a bunch of updates to the app. This will clean up a bunch of (now) useless logging and added much better logging around errors.

If you could - update the code, delete the two devices that got created (your dishwasher and oven), rerun the app - this should recreate the Dishwasher and Oven devices.

If what I did works properly:

  1. We should see better logging of errors, if you get any please let me know
  2. I'd be really curious if you turn on your oven/stove if we see any MQTT messages (logged in the app)
  3. Every minute we should see a log entry that migth have some kind of data about your dishwasher (it's going to just be base64 data right now)

If you get MQTT messages or that b64 I'd love to get a copy, hoping I can decipher it and figure out what's going on. Ideally if you could tell me what you did when it happened (e.g. I turned my stove on and then this log message appeared) that'd be helpful.

Thanks again for the help. One day maybe Home Depot will deliver my appliances and I won't need your assistance :slight_smile:

OK, give me a few...

1 Like

Just pushed a fix a min ago so make sure you grab the newest code when you try

sorry, can't do it now, just popped a migraine and can barely see for a while...

No worries. I used to get migraines all the time, they're awful

The ThinQ app does that regularly...

With a lot of help from @jonathan.lorber getting really close to having the general framework together for v1 devices. Hopefully this week I can get v1 washer and dryers working. For anyone else trying this out, please try the latest code. Please post the foundDevices variable from the gear icon of the app (you can hide the ids if you like). That will tel me what device versions you have and how we can read the device state info.

1 Like

Deleted devices, updated the app code and reran and it throws an error.

Uh oh! What kind of devices do you have? Also if you could try the latest version that'd be great. I'll be playing with this for a few hours tonight. I'm getting REALLY close with support for v1 devices. I stand by my statement, LG overengineered this thing to the insane degree (been a few years since I had to remember binary math)!

FYI for everyone, there will be a log line like this

"MODEL JSON -- PLEASE POST IN THREAD a URL here"

If you could please post that URL (text, not a screenshot) that'd be great. There is nothing personal in that URL, LG publishes a JSON file per device that just describes the capabilities of that device and how to decode the status messages for that device.

I have no devices so I can't test, but I think I have initial support for pulling some basic info from v1 washer and dryers. @jonathan.lorber fyi since I know you have them. You don't get a lot of data (or none in some cases) when the devices aren't running so to really test you'd want to turn the device on and see if anything gets reported. I think by the end this will be the most complex integration I've built so far :slight_smile:

1 Like

Just so you see the timestamps. I now have the OVEN reporting "Lost connection to MQTT, retrying in 15 seconds" and nothing in the logs for the DW (was the opposite before.)

I do see the OVEN device showing master True, the DW showing false.

app:10692020-10-13 01:31:37.931 am errorError calling https://aic.lgthinq.com:46030/api/rti/rtiMon: NOT_CONNECTED_DEVICE

app:10692020-10-13 01:25:26.307 am errorError calling https://aic.lgthinq.com:46030/api/rti/rtiMon: NOT_CONNECTED_DEVICE

2020-10-13 01:25:14.235 am debugMODEL JSON -- PLEASE POST IN THREAD

https://objectstore.lgthinq.com/1defb0d9-bde7-418a-b1b9-a575da69f5e4?Expires=1653897610&Signature=ttN8cajTvgClPxcRpcE~zUYEE2eRN8PTuS~E6gvqAP8OAFA2cEibGBqX9veJmxPK8kIFrpvfNLdA0DWbRgXj8dbUIF4xje3J5CrkXk6sJ-qx5oe5ceZe273kYTzUBmqsaJ5Jnlh6MY0IIuTCGo2qf8vuxi05JUftJ1DPAekm5BL6JSZVF7cnaRolwUhK3fp4Q3k-tnHrviO3vHwCVnFvnR3wKZsltW2zGohMIaWoq972NqSlHCnH0CmgrrhbFS~XGFcw-aXKqX-c1uHnoMGo1Eloo4gSFWo2kqV-2mKJnWT1dYMNToyJW1J6lTvV~mCHMCecul9aJmnSoY3D8ObZKw__&Key-Pair-Id=APKAI74R6YENXPGRIWLQ

2020-10-13 01:25:13.845 am debugMODEL JSON -- PLEASE POST IN THREAD

https://aic.lgthinq.com:46030/api/webContents/modelJSON?modelName=D3210&countryCode=WW&contentsId=JS0719082250749334&authKey=thinq

Found devices looks like a trainwreck.

[{modelJson={Config={tubCleanCourseId=9, wifiDiagnosis=true, defaultCourseId=1, defaultSmartCourseId=1, fota=true, maxDownloadCourseNum=false, downloadPanelLabel=@DW_TERM_DOWNLOADED_W, TubCleanLabel=@WM_COURSE_TUB_CLEAN_W, changeCourseInPause=false, remoteStartLabel=@WM_OPTION_REMOTE_START_W}, Value={DelayStart={default=0, label=@DW_OPTION_RESERVE_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, Option4={default=0, type=Bit, option=[{default=0, startbit=0, length=1, value=AutoDoor}, {default=0, startbit=1, length=1, value=EnergySaver}, {default=0, startbit=2, length=1, value=ExtraDry}, {default=0, startbit=3, length=1, value=HighTemp}, {default=0, startbit=4, length=1, value=DualZone}, {default=0, startbit=5, length=2, value=HalfLoad}, {default=0, startbit=7, length=1, value=Steam}]}, Option3={default=0, type=Bit, option=[{default=0, startbit=0, length=1, value=AutoDoor}, {default=0, startbit=1, length=1, value=None}, {default=0, startbit=2, length=1, value=None}, {default=0, startbit=3, length=1, value=None}, {default=0, startbit=4, length=1, value=None}, {default=0, startbit=5, length=2, value=None}, {default=0, startbit=7, length=1, value=None}]}, Option2={default=0, type=Bit, option=[{default=0, startbit=0, length=1, value=DelayStart}, {default=0, startbit=1, length=1, value=EnergySaver}, {default=0, startbit=2, length=1, value=ExtraDry}, {default=0, startbit=3, length=1, value=HighTemp}, {default=0, startbit=4, length=1, value=DualZone}, {default=0, startbit=5, length=2, value=HalfLoad}, {default=0, startbit=7, length=1, value=Steam}]}, DualZone={default=0, label=@DW_OPTION_DUAL_ZONE_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, Option1={default=0, type=Bit, option=[{default=0, startbit=0, length=1, value=ChildLock}, {default=0, startbit=1, length=1, value=Door}, {default=0, startbit=2, length=1, value=RinseRefill}, {default=0, startbit=3, length=1, value=SaltRefill}, {default=0, startbit=4, length=1, value=SignalLevel}, {default=0, startbit=5, length=1, value=MCReminderSetting}, {default=0, startbit=6, length=1, value=CleanLReminder}, {default=0, startbit=7, length=1, value=NightDry}]}, ChildLock={default=0, label=@DW_OPTION_CHILD_LOCK_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, HalfloadUpper={default=0, label=@DW_OPTION_HALF_LOAD_UPPER_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, RinseLevel={default=2, label=@DW_TERM_SETTINGS_RINSE_LEVEL_W, type=Enum, option={0=0, 1=1, 2=2, 3=3, 4=4, 7=@DW_TERM_UNSET_W}}, HalfLoad={default=0, label=@DW_OPTION_HALF_LOAD_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@DW_OPTION_HALF_LOAD_LOWER_W, 2=@DW_OPTION_HALF_LOAD_UPPER_W}}, PreSteam={default=0, label=@DW_OPTION_PRE_STEAM_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, AutoDoor={default=0, label=@DW_OPTION_AUTO_DOOR_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, Process={default=0, type=Enum, option={0=-, 99=@DW_STATE_CANCEL_W, 1=@DW_STATE_RESERVE_W, 2=@DW_STATE_RUNNING_W, 3=@DW_STATE_RINSING_W, 4=@DW_STATE_DRYING_W, 5=@DW_STATE_COMPLETE_W, 6=@DW_STATE_NIGHTDRY_W}}, Spray={default=0, label=@DW_OPTION_SPRAY_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@DW_OPTION_SPRAY_STRONG_W, 2=@DW_OPTION_SPRAY_MEDIUM_W, 4=@DW_OPTION_SPRAY_SOFT_W}}, MCReminderSetting={default=0, label=@DW_TERM_SETTINGS_MACHINE_CLEAN_REMINDER_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W, 2=@DW_TERM_UNSET_W}}, HighTemp={default=0, label=@DW_OPTION_HIGH_TEMP_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, SofteningLevel={default=0, label=@DW_TERM_SETTINGS_SOFTENING_LEVEL_W, type=Enum, option={0=0, 1=1, 2=2, 3=3, 4=4, 5=@DW_TERM_UNSET_W}}, Remain_Time_M={default=0, type=Range, option={min=0, max=59}}, EnergySaver={default=0, label=@DW_OPTION_ENERGY_SAVER_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, ExtraDry={default=0, label=@DW_OPTION_EXTRA_DRY_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, Course={type=Reference, option=[Course]}, Remain_Time_H={default=0, type=Range, option={min=0, max=30}}, Initial_Time_M={default=0, type=Range, option={min=0, max=59}}, Reserve_Time_H={default=0, label=@WM_OPTION_RESERVE_W, type=Range, option={min=3, max=18}}, HalfloadLower={default=0, label=@DW_OPTION_HALF_LOAD_LOWER_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, Reserve_Time_M={default=0, type=Range, option={min=0, max=59}}, Initial_Time_H={default=0, type=Range, option={min=0, max=30}}, SignalLevel={default=0, label=@DM_GUG_CRS04_6, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W, 2=@DW_TERM_UNSET_W}}, Error={type=Reference, option=[Error]}, Door={default=0, label=Door, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, RinseRefill={default=0, label=Rinse Refill, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, NightDry={default=0, label=@DW_OPTION_NIGHT_DRY_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, SaltRefill={default=0, label=Salt Refill, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, CleanLReminder={default=0, label=@DW_TERM_SETTINGS_CLEAN_LIGHT_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W, 2=@DW_TERM_UNSET_W}}, State={default=0, type=Enum, option={0=@DW_STATE_POWER_OFF_W, 1=@DW_STATE_INITIAL_W, 2=@DW_STATE_RUNNING_W, 3=@DW_STATE_PAUSE_W, 4=@DW_STATE_POWER_OFF_W, 5=@DW_STATE_COMPLETE_W, 6=@DW_STATE_POWER_FAIL_W}}, Steam={default=0, label=@DW_OPTION_STEAM_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W}}, SignalLevelSetting={default=0, label=@DW_TERM_SETTINGS_BEEP_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@CP_ON_EN_W, 2=@DW_TERM_UNSET_W}}, Rinse={default=0, label=@DW_OPTION_RINSE_W, type=Enum, option={0=@CP_OFF_EN_W, 1=@DW_OPTION_RINSE_EXTRAHOT_W, 2=@DW_OPTION_RINSE_RINSE+_W, 3=@DW_OPTION_RINSE_RINSE+EXTRAHOT_W}}, SmartCourse={type=Reference, option=[SmartCourse]}, None={default=0, type=Range, option={min=0, max=59}}, Option5={default=0, type=Bit, option=[{default=0, startbit=0, length=2, value=MCReminderSetting}, {default=0, startbit=2, length=2, value=SignalLevel}, {default=0, startbit=4, length=2, value=CleanLReminder}]}}, Error={11={_comment=EE �� ���� �ȵ� (�ŷڼ� ��忡���� �߻�), label=EE, title=EE, content=EE}, 12={_comment=LE, �� ����, label=@DW_ERROR_LE_LABEL, title=@DW_ERROR_LE_TITLE, content=@DW_ERROR_HE_CONTENT}, 13={_comment=nE, �� ����, label=@DW_ERROR_NE_LABEL, title=@DW_ERROR_NE_TITLE, content=@DW_ERROR_HE_CONTENT}, 14={_comment=bE, �� ����, label=@DW_ERROR_BE_LABEL, title=@DW_ERROR_BE_TITLE, content=@DW_ERROR_BE_CONTENT}, 0={_comment=No Error, label=No Error, title=No_Error, content=No_Error}, 1={_comment=, label=, title=, content=}, 2={_comment=, label=, title=, content=}, 3={_comment=, label=, title=, content=}, 4={_comment=, label=, title=, content=}, 5={_comment=HE, �� ����, label=@DW_ERROR_HE_LABEL, title=@DW_ERROR_HE_TITLE, content=@DW_ERROR_HE_CONTENT}, 6={_comment=IE, �� ����, label=@DW_ERROR_IE_LABEL, title=@DW_ERROR_IE_TITLE, content=@DW_ERROR_IE_CONTENT}, 7={_comment=OE, �� ����, label=@DW_ERROR_OE_LABEL, title=@DW_ERROR_OE_TITLE, content=@DW_ERROR_OE_CONTENT}, 8={_comment=FE, �� ����(���ܾȵ�), label=@DW_ERROR_FE_LABEL, title=@DW_ERROR_FE_TITLE, content=@DW_ERROR_FE_CONTENT}, 9={_comment=tE, �� ����, label=@DW_ERROR_TE_LABEL, title=@DW_ERROR_TE_TITLE, content=@DW_ERROR_HE_CONTENT}, 10={_comment=AE, �� ����(���ܾȵ�), label=@DW_ERROR_AE_LABEL, title=@DW_ERROR_AE_TITLE, content=@DW_ERROR_AE_CONTENT}}, Info={country=WW, modelName=D3210, model=XD-Studio, modelType=DW, networkType=WIFI, version=1.2, productType=DW}, Module={WPM={GDM_FOT01_Main=003, GDM_CEN01_Main=003, GDM_CRS02_CourseList=003, GDM_CRS03_CourseDetail=003, GDM_WCH01_Main=003, GDM_WCH01_UserGuide=001, GDM_SET02_PushList=001, GDM_CRS01_Main=003, GCM_SDS01_SdsMain=001, GDM_SET01_Main=001, GDM_SET02_Settings=003}, Menu=[GDM_CRS02_CourseList, GDM_WCH01_Main, GCM_SDS01_SdsMain, GDM_SET01_Main]}, Push=[{label=@CP_ALARM_PRODUCT_STATE_W, category=PUSH_DW_STATE, groupCode=20401, pushList=[{0000=PUSH_DW_COMPLETE}, {0100=PUSH_DW_ERROR}, {0101=PUSH_DW_WATERLEAK}, {0102=PUSH_DW_ADD_RINSE}, {0103=PUSH_DW_ADD_SALT}]}], ControlWifi={action={CourseDownload={data=[{{Course}},{{SmartCourse}},0,0,{{Option1}},{{Option4}}], tag=[COURSE, ID, DATA]}, OperationStart={encode=true, data=[{{RinseLevel}},0,{{Option5}}], cmdOpt=Operation, cmd=Control, value=Start}}, type=BINARY(BYTE)}, Course={1={imgIndex=1, courseType=Course, _comment=Auto, function=[{default=0, value=DualZone}, {default=0, value=HalfLoad}, {default=0, value=EnergySaver}, {default=0, value=Steam}, {default=0, value=HighTemp}, {default=0, value=ExtraDry}, {default=0, value=NightDry}, {default=0, value=DelayStart}], name=@DW_COURSE_AUTO_W, id=1}, 2={imgIndex=1, courseType=Course, _comment=Haeavy, function=[{default=0, value=DualZone}, {default=0, value=HalfLoad}, {default=0, value=Steam}, {default=0, value=HighTemp}, {default=0, value=ExtraDry}, {default=0, value=NightDry}, {default=0, value=DelayStart}], name=@DW_COURSE_HEAVY_W, id=2}, 3={imgIndex=1, courseType=Course, _comment=Delicate, function=[{default=0, value=HalfLoad}, {default=0, value=EnergySaver}, {default=0, value=Steam}, {default=0, value=ExtraDry}, {default=0, value=NightDry}, {default=0, value=DelayStart}], name=@DW_COURSE_DELICATE_W, id=3}, 4={imgIndex=1, courseType=Course, _comment=Turbo, function=[{default=0, value=DualZone}, {default=0, value=HighTemp}, {default=0, value=ExtraDry}, {default=0, value=NightDry}, {default=0, value=DelayStart}], name=@DW_COURSE_TURBO_W, id=4}, 5={imgIndex=1, courseType=Course, _comment=Normal, function=[{default=0, value=DualZone}, {default=0, value=HalfLoad}, {default=0, value=EnergySaver}, {default=0, value=Steam}, {default=0, value=HighTemp}, {default=0, value=ExtraDry}, {default=0, value=NightDry}, {default=0, value=DelayStart}], name=@DW_COURSE_NORMAL_W, id=5}, 6={imgIndex=1, courseType=Course, _comment=Rinse, function=[{default=0, value=DelayStart}], name=@DW_COURSE_RINSE_W, id=6}, 7={imgIndex=1, courseType=Course, _comment=Refresh, function=[{default=0, value=Steam}, {default=0, value=ExtraDry}, {default=0, value=NightDry}, {default=0, value=DelayStart}], name=@DW_COURSE_REFRESH_W, id=7}, 8={imgIndex=1, courseType=Course, _comment=Express, function=[{default=0, value=DualZone}, {default=0, value=HighTemp}, {default=0, value=ExtraDry}, {default=0, value=NightDry}, {default=0, value=DelayStart}], name=@DW_COURSE_EXPRESS_W, id=8}, 9={imgIndex=1, courseType=Course, _comment=Machine Clean, function=[{default=0, value=DelayStart}], name=@DW_COURSE_MACHINE_CLEAN_W, id=9}}, SmartCourse={1={imgIndex=14, courseType=SmartCourse, _comment=Pots & Pans (Default), function=[{default=1, value=HighTemp}, {default=1, value=ExtraDry}, {default=1, value=NightDry}], name=@DW_SMARTCOURSE_POTS_PANS_W, id=1, Course=2, script=@DW_SMARTCOURSE_SCRIPT_POTS_PANS_S}, 2={imgIndex=12, courseType=SmartCourse, _comment=Casseroles, function=[{default=1, value=HighTemp}, {default=1, value=NightDry}], name=@DW_SMARTCOURSE_GREASY_DISHES_W, id=2, Course=2, script=@DW_SMARTCOURSE_SCRIPT_GREASY_DISHES_S}, 3={imgIndex=15, courseType=SmartCourse, _comment=Glasswares, function=[{default=1, value=NightDry}], name=@DW_SMARTCOURSE_GLASSWARES_W, id=3, Course=3, script=@DW_SMARTCOURSE_SCRIPT_GLASSWARES_S}, 4={imgIndex=11, courseType=SmartCourse, _comment=Night Care(US), function=[{default=1, value=ExtraDry}, {default=1, value=NightDry}], name=@DW_SMARTCOURSE_OVERNIGHT_W, id=4, Course=3, script=@DW_SMARTCOURSE_SCRIPT_OVERNIGHT_S}}, Settings=[{default=2, selectable=[0, 1, 2, 3, 4], value=RinseLevel}, {default=0, selectable=[0, 1], value=MCReminderSetting}, {default=0, selectable=[0, 1], value=SignalLevel}, {default=0, selectable=[0, 1], value=CleanLReminder}], Monitoring={protocol=[{_comment=State, startByte=0, length=1, value=State}, {_comment=Process, startByte=1, length=1, value=Process}, {_comment=Error, startByte=2, length=1, value=Error}, {_comment=Initial Time H, startByte=3, length=1, value=Initial_Time_H}, {_comment=Initial Time M, startByte=4, length=1, value=Initial_Time_M}, {_comment=Course Idx, startByte=5, length=1, value=Course}, {_comment=Course Type, startByte=6, length=1, value=CourseType}, {_comment=Remain H, startByte=7, length=1, value=Remain_Time_H}, {_comment=Remain M, startByte=8, length=1, value=Remain_Time_M}, {_comment=Reserve H, startByte=9, length=1, value=Reserve_Time_H}, {_comment=Reserve M, startByte=10, length=1, value=Reserve_Time_M}, {_comment=Option 1, startByte=11, length=1, value=Option1}, {_comment=Option 2, startByte=12, length=1, value=Option2}, {_comment=Rinse-Aid Dispensing Level, startByte=13, length=1, value=RinseLevel}, {_comment=Softening Level, startByte=14, length=1, value=SofteningLevel}, {_comment=Option 3, startByte=15, length=1, value=Option3}, {_comment=Reserved, startByte=16, length=4, value=16~19}, {_comment=Smart Course, startByte=20, length=1, value=SmartCourse}, {_comment=Reserved, startByte=21, length=2, value=21~22}, {_comment=Cur Download Idx, startByte=23, length=1, value=CurDownload}], type=BINARY(BYTE)}}, name=DISHWASHER, id=REDACTED, type=204, version=thinq1}, {modelJson={}, name=OVEN, id=REDACTED, type=301, version=thinq2}]