Giter VIP home page Giter VIP logo

ha_gehome's People

Contributors

ajmarks avatar alexanv1 avatar bendavis avatar brysons avatar chevyssinsd avatar elwing00 avatar joelmoses avatar simbaja avatar warrenrees avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ha_gehome's Issues

Error setting up entry GE Home

Good afternoon. I've tried to setup this using HACS various times today. Unfortunately, I receive the following error:

This error originated from a custom integration.

Logger: homeassistant.config_entries
Source: custom_components/ge_home/update_coordinator.py:174
Integration: GE Home (documentation)
First occurred: 3:51:19 PM (1 occurrences)
Last logged: 3:51:19 PM

Error setting up entry GE Home (XXXXXXXXXXXXXXXX) for ge_home
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 172, in async_setup
await self.initialization_future
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 172, in async_setup
await self.initialization_future
File "/usr/local/lib/python3.9/site-packages/async_timeout/init.py", line 45, in exit
self._do_exit(exc_type)
File "/usr/local/lib/python3.9/site-packages/async_timeout/init.py", line 92, in _do_exit
raise asyncio.TimeoutError
asyncio.exceptions.TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/config_entries.py", line 293, in async_setup
result = await component.async_setup_entry(hass, self) # type: ignore
File "/config/custom_components/ge_home/init.py", line 26, in async_setup_entry
if not await coordinator.async_setup():
File "/config/custom_components/ge_home/update_coordinator.py", line 174, in async_setup
raise HaCannotConnect("Initialization timed out")
custom_components.ge_home.exceptions.HaCannotConnect: Initialization timed out

Other items from HACS repos are working fine.

The VM is running Home Assistant OS 6.2, core-2021.8.6, and supervisor-2021.06.8.

HACS is 1.13.2, 20210620205902

Device attribute name is incorrect (time_remaining) in devices/fridge.py

On line 94:
GeErdPropertySensor(self, ErdCode.HOT_WATER_STATUS, "time_remaining", icon_override="mdi:timer-outline"),

Should actually be:
GeErdPropertySensor(self, ErdCode.HOT_WATER_STATUS, "time_until_ready", icon_override="mdi:timer-outline"),

This matches the attribute in the SDK. The Hot Water timer fails to create an entity without this in place.

I've added the fix to my PR, which also adds support for HACS to the component -- which eases testing considerably.

#1

Error adding entities for domain water_heater with platform ge_home

Logger: homeassistant.components.water_heater
Source: custom_components/ge_home/entities/oven/ge_oven.py:174
Integration: Water Heater (documentation, issues)
First occurred: 9:27:15 PM (2 occurrences)
Last logged: 9:27:15 PM

Error adding entities for domain water_heater with platform ge_home
Error while setting up ge_home platform for water_heater
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 382, in async_add_entities
await asyncio.gather(*tasks)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 587, in _async_add_entity
await entity.add_to_platform_finish()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 711, in add_to_platform_finish
self.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 464, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 500, in _async_write_ha_state
attr.update(self.state_attributes or {})
File "/usr/src/homeassistant/homeassistant/components/water_heater/init.py", line 203, in state_attributes
self.current_temperature,
File "/config/custom_components/ge_home/entities/oven/ge_oven.py", line 83, in current_temperature
return self.get_erd_value("RAW_TEMPERATURE")
File "/config/custom_components/ge_home/entities/oven/ge_oven.py", line 174, in get_erd_value
return self.appliance.get_erd_value(erd_code)
File "/usr/local/lib/python3.9/site-packages/gehomesdk/ge_appliance.py", line 136, in get_erd_value
return self._property_cache[erd_code]
KeyError: <ErdCode.UPPER_OVEN_RAW_TEMPERATURE: '0x510d'>

GE wall mount split AC unit conversion on Lovelace entity card

hi, first of it all the integration is amazing!
i managed to integrate by GE ac unit.
when i select the entities card in lovelace however it shows me Farenheit with the C unit
image
or when i select the entity
image
when i pick the Lovelace thermostat card, the units are shown in Celsius which is correct.
image
image
i checked if anywhere i had settings to select/convert the units, but not success.

Integration missing

After a successful install in HACS the integration doesn't show when I search for it

HomeKit Integration?

I've got my oven added to HASS.io, but it's not generating a QR code to add it in HomeKit. I haven't been able to locate instructions on doing this and haven't had luck getting it done on my own. Is this expected, or does anyone have a way to add this to HomeKit?

GE Advantium Cook Action Error

Hi @simbaja,

I'm getting the following error when attempting to execute an Operation against my Advantium microwave oven. This occurs when attempting any operation type:

File "/config/custom_components/ge_home/entities/advantium/ge_advantium.py", line 185, in async_set_operation_mode
    elif self.current_cook_setting.cook_action == CookAction.PAUSE:
AttributeError: 'bytes' object has no attribute 'cook_action'
����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

A bit more of the stack trace if helpful:

2021-08-20 16:57:28 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [140500039487744] 'bytes' object has no attribute 'cook_action'
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 185, in handle_call_service
    await hass.services.async_call(
  File "/usr/src/homeassistant/homeassistant/core.py", line 1491, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1526, in _execute_service
    await handler.job.target(service_call)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 213, in handle_service
    await self.hass.helpers.service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 658, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 811, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 695, in _handle_entity_call
    await result
  File "/config/custom_components/ge_home/entities/advantium/ge_advantium.py", line 185, in async_set_operation_mode
    elif self.current_cook_setting.cook_action == CookAction.PAUSE:
AttributeError: 'bytes' object has no attribute 'cook_action'

Dryer not appearing

My GE Dryer is not getting created as an entity / device in HA.

Ran gehome/websocket_client.py and it definitely picks it up:

2021-08-03 14:13:22,778 DEBUG    Using selector: SelectSelector
2021-08-03 14:13:22,783 DEBUG    Getting OAuth2 token
2021-08-03 14:13:22,797 DEBUG    Client changed state: GeClientState.INITIALIZING to GeClientState.AUTHORIZING_OAUTH
2021-08-03 14:13:24,081 DEBUG    Getting WS credentials
2021-08-03 14:13:24,082 DEBUG    Client changed state: GeClientState.AUTHORIZING_OAUTH to GeClientState.AUTHORIZING_CLIENT
2021-08-03 14:13:24,188 INFO     Starting GE Appliances client
2021-08-03 14:13:24,240 DEBUG    Client changed state: GeClientState.AUTHORIZING_CLIENT to GeClientState.CONNECTING
2021-08-03 14:13:24,281 DEBUG    client - state = CONNECTING
2021-08-03 14:13:24,343 DEBUG    client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x00000226CCAB6880>)
2021-08-03 14:13:24,344 DEBUG    client > GET /?access_token=REDACTED HTTP/1.1
2021-08-03 14:13:24,344 DEBUG    client > Headers([('Host', 'ws-us-east-1.brillion.geappliances.com'), ('Upgrade', 'websocket'), ('Connection', 'Upgrade'), ('Sec-WebSocket-Key', 'Ef07jWSu18sJEpaaYHiwyg=='), ('Sec-WebSocket-Version', '13'), ('Sec-WebSocket-Extensions', 'permessage-deflate; client_max_window_bits'), ('User-Agent', 'Python/3.9 websockets/9.1')])
2021-08-03 14:13:24,585 DEBUG    client - event = data_received(<212 bytes>)
2021-08-03 14:13:24,586 DEBUG    client < HTTP/1.1 101 Switching Protocols
2021-08-03 14:13:24,587 DEBUG    client < Headers([('Date', 'Tue, 03 Aug 2021 19:13:24 GMT'), ('Connection', 'upgrade'), ('upgrade', 'websocket'), ('sec-websocket-accept', 'eg/YVwJaulb2SzT+oFNJhAH+8WU='), ('sec-websocket-extensions', 'permessage-deflate')])
2021-08-03 14:13:24,587 DEBUG    client - state = OPEN
2021-08-03 14:13:24,588 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#subscribe", "action": "subscribe", "resources": ["/appliance/*/erd/*"]}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,589 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance", "id": "List-appliances"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,589 DEBUG    Client changed state: GeClientState.CONNECTING to GeClientState.CONNECTED
2021-08-03 14:13:24,692 DEBUG    client - event = data_received(<49 bytes>)
2021-08-03 14:13:24,692 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#subscribe","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,825 DEBUG    client - event = data_received(<298 bytes>)
2021-08-03 14:13:24,825 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"List-appliances","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance"},"success":true,"code":200,"body":{"kind":"appliance#applianceList","userId":"a7o71pz52pf8cxi","items":[{"applianceId":"D828C95D21C9","type":"Clothes Dryer","brand":"Unknown","jid":"d828c95d21c9_a7o71pz52pf8cxi","nickname":"Dryer","online":"ONLINE","onlineTime":"2021-08-02T04:40:08.000Z"},{"applianceId":"D828C954A9AE","type":"Clothes Washer","brand":"Unknown","jid":"d828c954a9ae_a7o71pz52pf8cxi","nickname":"Washer","online":"ONLINE","onlineTime":"2021-08-02T02:46:12.000Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,827 DEBUG    D828C95D21C9 marked available
2021-08-03 14:13:24,827 DEBUG    Adding appliance D828C95D21C9
2021-08-03 14:13:24,828 DEBUG    Requesting update for client D828C95D21C9
2021-08-03 14:13:24,828 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C95D21C9/erd", "id": "D828C95D21C9-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,829 DEBUG    Requesting features for client D828C95D21C9
2021-08-03 14:13:24,829 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C95D21C9/feature", "id": "Request-features"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,830 DEBUG    D828C954A9AE marked available
2021-08-03 14:13:24,831 DEBUG    Adding appliance D828C954A9AE
2021-08-03 14:13:24,831 DEBUG    Requesting update for client D828C954A9AE
2021-08-03 14:13:24,831 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C954A9AE/erd", "id": "D828C954A9AE-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,832 DEBUG    Requesting features for client D828C954A9AE
2021-08-03 14:13:24,832 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C954A9AE/feature", "id": "Request-features"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,832 DEBUG    Registering update callback for GeAppliance(D828C95D21C9) (Unknown Type)
2021-08-03 14:13:24,833 DEBUG    Registering update callback for GeAppliance(D828C954A9AE) (Unknown Type)
2021-08-03 14:13:24,973 DEBUG    client - event = data_received(<79 bytes>)
2021-08-03 14:13:24,973 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"Request-features","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C95D21C9/feature"},"success":true,"code":200,"body":{"kind":"appliance#applianceFeature","userId":"a7o71pz52pf8cxi","applianceId":"D828C95D21C9","features":["CLOTHES_DRYER_V1_EXTENDED_TUMBLE"]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,974 DEBUG    Received features ['CLOTHES_DRYER_V1_EXTENDED_TUMBLE'] for D828C95D21C9
2021-08-03 14:13:24,980 DEBUG    client - event = data_received(<32 bytes>)
2021-08-03 14:13:24,980 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"Request-features","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C954A9AE/feature"},"success":true,"code":200,"body":{"kind":"appliance#applianceFeature","userId":"a7o71pz52pf8cxi","applianceId":"D828C954A9AE","features":["CLOTHES_WASHER_V1_WASHER_LINK"]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:24,981 DEBUG    Received features ['CLOTHES_WASHER_V1_WASHER_LINK'] for D828C954A9AE
2021-08-03 14:13:25,033 DEBUG    client - event = data_received(<341 bytes>)
2021-08-03 14:13:25,033 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C954A9AE-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C954A9AE/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"a7o71pz52pf8cxi","applianceId":"D828C954A9AE","items":[{"erd":"0x0001","value":"0C47465735353053534E30575700000000000000000000000000000000000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0002","value":"0953523337313831304E00000000000000000000000000000000000000000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0008","value":"02","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0035","value":"00000002","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0099","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0102","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0103","value":"0100026A","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0105","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2000","value":"00","time":"2021-08-02T21:18:47.456Z"},{"erd":"0x2001","value":"00","time":"2021-08-02T21:18:27.971Z"},{"erd":"0x2002","value":"00","time":"2021-08-02T21:18:47.456Z"},{"erd":"0x2007","value":"0CCF","time":"2021-08-02T21:18:30.083Z"},{"erd":"0x200A","value":"1C","time":"2021-08-02T20:18:34.278Z"},{"erd":"0x2010","value":"0000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2012","value":"01","time":"2021-08-03T12:30:20.323Z"},{"erd":"0x2013","value":"00","time":"2021-08-02T21:18:41.406Z"},{"erd":"0x2015","value":"02","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2016","value":"14","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2017","value":"02","time":"2021-08-02T20:18:35.397Z"},{"erd":"0x2018","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x201D","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2038","value":"FFFF","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2039","value":"00","time":"2021-08-02T21:18:47.456Z"},{"erd":"0x2040","value":"FF","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2054","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2055","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x205B","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2060","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2061","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2069","value":"000000E103000300","time":"2021-08-02T21:18:27.971Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:25,035 DEBUG    Setting ErdCode.MODEL_NUMBER to GFW550SSN0WW
2021-08-03 14:13:25,035 DEBUG    Setting ErdCode.SERIAL_NUMBER to SR371810N
2021-08-03 14:13:25,035 DEBUG    Setting ErdCode.APPLIANCE_TYPE to ErdApplianceType.WASHER
2021-08-03 14:13:25,036 DEBUG    Setting ErdCode.UNIT_TYPE to ErdUnitType.TYPE_120V_MONOGRAM
2021-08-03 14:13:25,036 DEBUG    Setting ErdCode.UNKNOWN_0099 to b'\x00'
2021-08-03 14:13:25,036 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION to 0.0.11.39
2021-08-03 14:13:25,036 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-03 14:13:25,037 DEBUG    Setting ErdCode.ACM_UPDATING to False
2021-08-03 14:13:25,037 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION to 1.0.2.106
2021-08-03 14:13:25,037 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-03 14:13:25,037 DEBUG    Setting ErdCode.APPLIANCE_UPDATING to False
2021-08-03 14:13:25,038 DEBUG    Setting ErdCode.LAUNDRY_MACHINE_STATE to Off
2021-08-03 14:13:25,038 DEBUG    Setting ErdCode.LAUNDRY_SUB_CYCLE to ErdLaundrySubCycle.CYCLE_NONE
2021-08-03 14:13:25,038 DEBUG    Setting ErdCode.LAUNDRY_END_OF_CYCLE to False
2021-08-03 14:13:25,038 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:54:39
2021-08-03 14:13:25,039 DEBUG    Setting ErdCode.LAUNDRY_CYCLE to ErdLaundryCycle.NORMAL2
2021-08-03 14:13:25,039 DEBUG    Setting ErdCode.LAUNDRY_DELAY_TIME_REMAINING to 0:00:00
2021-08-03 14:13:25,039 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.CLOSED
2021-08-03 14:13:25,039 DEBUG    Setting ErdCode.LAUNDRY_WASHER_DOOR_LOCK to False
2021-08-03 14:13:25,040 DEBUG    Setting ErdCode.LAUNDRY_WASHER_SOIL_LEVEL to ErdSoilLevel.NORMAL
2021-08-03 14:13:25,040 DEBUG    Setting ErdCode.LAUNDRY_WASHER_WASHTEMP_LEVEL to Warm
2021-08-03 14:13:25,040 DEBUG    Setting ErdCode.LAUNDRY_WASHER_SPINTIME_LEVEL to ErdSpinTimeLevel.MEDIUM
2021-08-03 14:13:25,041 DEBUG    Setting ErdCode.LAUNDRY_WASHER_RINSE_OPTION to ErdRinseOption.INVALID
2021-08-03 14:13:25,041 DEBUG    Setting ErdCode.LAUNDRY_UNKNOWN201D to b'\x00'
2021-08-03 14:13:25,041 DEBUG    Got timespan value of 65535. Treating as None.
2021-08-03 14:13:25,041 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_STATUS to False
2021-08-03 14:13:25,042 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_POWER_CONTROL to 255
2021-08-03 14:13:25,042 DEBUG    Setting ErdCode.LAUNDRY_WASHER_UNKNOWN2054 to b'\x00'
2021-08-03 14:13:25,042 DEBUG    Setting ErdCode.LAUNDRY_WASHER_TIMESAVER to False
2021-08-03 14:13:25,042 DEBUG    Setting ErdCode.LAUNDRY_WASHER_PREWASH to False
2021-08-03 14:13:25,043 DEBUG    Setting ErdCode.LAUNDRY_WASHER_UNKNOWN2060 to b'\x00'
2021-08-03 14:13:25,043 DEBUG    Setting ErdCode.LAUNDRY_WASHER_TUMBLECARE to False
2021-08-03 14:13:25,043 DEBUG    Setting ErdCode.LAUNDRY_WASHER_UNKNOWN2069 to b'\x00\x00\x00\xe1\x03\x00\x03\x00'
2021-08-03 14:13:25,044 DEBUG    Got initial appliance type for GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER)
2021-08-03 14:13:25,044 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER). Updated keys: ErdCode.MODEL_NUMBER, ErdCode.SERIAL_NUMBER, ErdCode.APPLIANCE_TYPE, ErdCode.UNIT_TYPE, ErdCode.UNKNOWN_0099, ErdCode.WIFI_MODULE_SW_VERSION, ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE, ErdCode.ACM_UPDATING, ErdCode.APPLIANCE_SW_VERSION, ErdCode.APPLIANCE_SW_VERSION_AVAILABLE, ErdCode.APPLIANCE_UPDATING, ErdCode.LAUNDRY_MACHINE_STATE, ErdCode.LAUNDRY_SUB_CYCLE, ErdCode.LAUNDRY_END_OF_CYCLE, ErdCode.LAUNDRY_TIME_REMAINING, ErdCode.LAUNDRY_CYCLE, ErdCode.LAUNDRY_DELAY_TIME_REMAINING, ErdCode.LAUNDRY_DOOR, ErdCode.LAUNDRY_WASHER_DOOR_LOCK, ErdCode.LAUNDRY_WASHER_SOIL_LEVEL, ErdCode.LAUNDRY_WASHER_WASHTEMP_LEVEL, ErdCode.LAUNDRY_WASHER_SPINTIME_LEVEL, ErdCode.LAUNDRY_WASHER_RINSE_OPTION, ErdCode.LAUNDRY_UNKNOWN201D, ErdCode.LAUNDRY_REMOTE_STATUS, ErdCode.LAUNDRY_REMOTE_POWER_CONTROL, ErdCode.LAUNDRY_WASHER_UNKNOWN2054, ErdCode.LAUNDRY_WASHER_TIMESAVER, ErdCode.LAUNDRY_WASHER_PREWASH, ErdCode.LAUNDRY_WASHER_UNKNOWN2060, ErdCode.LAUNDRY_WASHER_TUMBLECARE, ErdCode.LAUNDRY_WASHER_UNKNOWN2069
2021-08-03 14:13:25,044 DEBUG    client - event = data_received(<276 bytes>)
2021-08-03 14:13:25,047 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER)
2021-08-03 14:13:25,048 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C95D21C9-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C95D21C9/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"a7o71pz52pf8cxi","applianceId":"D828C95D21C9","items":[{"erd":"0x0001","value":"0C47464435354553534E30575700000000000000000000000000000000000000","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0002","value":"0944533130303838304700000000000000000000000000000000000000000000","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0008","value":"01","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0035","value":"00000001","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x0099","value":"00","time":"2021-08-02T04:42:15.118Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-02T04:42:12.968Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-02T04:42:12.968Z"},{"erd":"0x0102","value":"00","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0103","value":"01000352","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0105","value":"00","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x2000","value":"00","time":"2021-08-02T22:42:16.157Z"},{"erd":"0x2001","value":"00","time":"2021-08-02T22:35:41.908Z"},{"erd":"0x2002","value":"00","time":"2021-08-02T22:37:45.724Z"},{"erd":"0x2007","value":"0DE5","time":"2021-08-02T22:35:42.858Z"},{"erd":"0x200A","value":"80","time":"2021-08-02T21:20:16.609Z"},{"erd":"0x2010","value":"0000","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2012","value":"01","time":"2021-08-02T21:20:25.890Z"},{"erd":"0x201C","value":"00","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x201D","value":"00","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2022","value":"0000000000","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2023","value":"0000","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2038","value":"FFFF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2039","value":"00","time":"2021-08-02T22:37:45.724Z"},{"erd":"0x2040","value":"FF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2041","value":"FF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x204D","value":"04","time":"2021-08-02T21:20:21.611Z"},{"erd":"0x2050","value":"03","time":"2021-08-02T21:20:16.609Z"},{"erd":"0x2051","value":"FF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2052","value":"0000","time":"2021-08-02T21:20:16.609Z"},{"erd":"0x2053","value":"00","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x206F","value":"00","time":"2021-08-02T04:42:10.579Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:25,048 DEBUG    client - event = data_received(<19 bytes>)
2021-08-03 14:13:25,048 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#connect","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:25,049 DEBUG    Setting ErdCode.MODEL_NUMBER to GFD55ESSN0WW
2021-08-03 14:13:25,049 DEBUG    Setting ErdCode.SERIAL_NUMBER to DS100880G
2021-08-03 14:13:25,049 DEBUG    Setting ErdCode.APPLIANCE_TYPE to ErdApplianceType.DRYER
2021-08-03 14:13:25,049 DEBUG    Setting ErdCode.UNIT_TYPE to ErdUnitType.TYPE_120V_CAFE
2021-08-03 14:13:25,050 DEBUG    Setting ErdCode.UNKNOWN_0099 to b'\x00'
2021-08-03 14:13:25,050 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION to 0.0.11.39
2021-08-03 14:13:25,050 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-03 14:13:25,051 DEBUG    Setting ErdCode.ACM_UPDATING to False
2021-08-03 14:13:25,051 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION to 1.0.3.82
2021-08-03 14:13:25,051 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-03 14:13:25,051 DEBUG    Setting ErdCode.APPLIANCE_UPDATING to False
2021-08-03 14:13:25,052 DEBUG    Setting ErdCode.LAUNDRY_MACHINE_STATE to Off
2021-08-03 14:13:25,052 DEBUG    Setting ErdCode.LAUNDRY_SUB_CYCLE to ErdLaundrySubCycle.CYCLE_NONE
2021-08-03 14:13:25,052 DEBUG    Setting ErdCode.LAUNDRY_END_OF_CYCLE to False
2021-08-03 14:13:25,053 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:59:17
2021-08-03 14:13:25,053 DEBUG    Setting ErdCode.LAUNDRY_CYCLE to ErdLaundryCycle.COTTONS
2021-08-03 14:13:25,053 DEBUG    Setting ErdCode.LAUNDRY_DELAY_TIME_REMAINING to 0:00:00
2021-08-03 14:13:25,053 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.CLOSED
2021-08-03 14:13:25,054 DEBUG    Setting ErdCode.LAUNDRY_DRYER_LEVEL_SENSOR_DISABLED to False
2021-08-03 14:13:25,054 DEBUG    Setting ErdCode.LAUNDRY_UNKNOWN201D to b'\x00'
2021-08-03 14:13:25,054 DEBUG    Setting ErdCode.LAUNDRY_DRYER_SHEET_USAGE_CONFIGURATION to ErdSheetUsageConfiguration(extra_large_load_size=0, large_load_size=0, medium_load_size=0, small_load_size=0, timed_dryer_sheets_load_size=0, raw_value='0000000000')
2021-08-03 14:13:25,054 DEBUG    Setting ErdCode.LAUNDRY_DRYER_SHEET_INVENTORY to 0
2021-08-03 14:13:25,055 DEBUG    Got timespan value of 65535. Treating as None.
2021-08-03 14:13:25,055 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_STATUS to False
2021-08-03 14:13:25,055 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_POWER_CONTROL to 255
2021-08-03 14:13:25,055 DEBUG    Setting ErdCode.LAUNDRY_UNKNOWN2041 to b'\xff'
2021-08-03 14:13:25,056 DEBUG    Setting ErdCode.LAUNDRY_DRYER_DRYNESSNEW_LEVEL to More Dry
2021-08-03 14:13:25,056 DEBUG    Setting ErdCode.LAUNDRY_DRYER_TEMPERATURENEW_OPTION to Low
2021-08-03 14:13:25,056 DEBUG    Setting ErdCode.LAUNDRY_DRYER_UNKNOWN2051 to b'\xff'
2021-08-03 14:13:25,057 DEBUG    Setting ErdCode.LAUNDRY_DRYER_ECODRY_STATUS to Enabled
2021-08-03 14:13:25,057 DEBUG    Setting ErdCode.LAUNDRY_DRYER_TUMBLENEW_STATUS to ErdTumbleStatus.DISABLE
2021-08-03 14:13:25,057 DEBUG    Setting ErdCode.LAUNDRY_DRYER_UNKNOWN206F to b'\x00'
2021-08-03 14:13:25,058 DEBUG    Got initial appliance type for GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER)
2021-08-03 14:13:25,058 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER). Updated keys: ErdCode.MODEL_NUMBER, ErdCode.SERIAL_NUMBER, ErdCode.APPLIANCE_TYPE, ErdCode.UNIT_TYPE, ErdCode.UNKNOWN_0099, ErdCode.WIFI_MODULE_SW_VERSION, ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE, ErdCode.ACM_UPDATING, ErdCode.APPLIANCE_SW_VERSION, ErdCode.APPLIANCE_SW_VERSION_AVAILABLE, ErdCode.APPLIANCE_UPDATING, ErdCode.LAUNDRY_MACHINE_STATE, ErdCode.LAUNDRY_SUB_CYCLE, ErdCode.LAUNDRY_END_OF_CYCLE, ErdCode.LAUNDRY_TIME_REMAINING, ErdCode.LAUNDRY_CYCLE, ErdCode.LAUNDRY_DELAY_TIME_REMAINING, ErdCode.LAUNDRY_DOOR, ErdCode.LAUNDRY_DRYER_LEVEL_SENSOR_DISABLED, ErdCode.LAUNDRY_UNKNOWN201D, ErdCode.LAUNDRY_DRYER_SHEET_USAGE_CONFIGURATION, ErdCode.LAUNDRY_DRYER_SHEET_INVENTORY, ErdCode.LAUNDRY_REMOTE_STATUS, ErdCode.LAUNDRY_REMOTE_POWER_CONTROL, ErdCode.LAUNDRY_UNKNOWN2041, ErdCode.LAUNDRY_DRYER_DRYNESSNEW_LEVEL, ErdCode.LAUNDRY_DRYER_TEMPERATURENEW_OPTION, ErdCode.LAUNDRY_DRYER_UNKNOWN2051, ErdCode.LAUNDRY_DRYER_ECODRY_STATUS, ErdCode.LAUNDRY_DRYER_TUMBLENEW_STATUS, ErdCode.LAUNDRY_DRYER_UNKNOWN206F
2021-08-03 14:13:25,058 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER)
2021-08-03 14:13:25,247 DEBUG    client - event = data_received(<52 bytes>)
2021-08-03 14:13:25,247 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"resource":"/appliance/*/erd/*","kind":"websocket#subscription","success":true,"change":"ADDED"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:44,601 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\x86\xeb\xdb\x07', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:44,627 DEBUG    client - event = data_received(<6 bytes>)
2021-08-03 14:13:44,627 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\x86\xeb\xdb\x07', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:44,627 DEBUG    client - received solicited pong: 86ebdb07
2021-08-03 14:13:54,603 DEBUG    Sending keepalive ping
2021-08-03 14:13:54,604 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:13:54,646 DEBUG    client - event = data_received(<28 bytes>)
2021-08-03 14:13:54,646 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:04,646 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'?\xa1F\x19', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:04,671 DEBUG    client - event = data_received(<6 bytes>)
2021-08-03 14:14:04,671 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'?\xa1F\x19', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:04,671 DEBUG    client - received solicited pong: 3fa14619
2021-08-03 14:14:24,615 DEBUG    Sending keepalive ping
2021-08-03 14:14:24,615 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:24,662 DEBUG    client - event = data_received(<6 bytes>)
2021-08-03 14:14:24,662 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:24,663 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'!\x7fX\xd4', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:24,688 DEBUG    client - event = data_received(<6 bytes>)
2021-08-03 14:14:24,688 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'!\x7fX\xd4', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:24,688 DEBUG    client - received solicited pong: 217f58d4
2021-08-03 14:14:24,844 DEBUG    Requesting update for GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER)
2021-08-03 14:14:24,844 DEBUG    Requesting update for client D828C95D21C9
2021-08-03 14:14:24,845 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C95D21C9/erd", "id": "D828C95D21C9-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:24,846 DEBUG    Requesting update for GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER)
2021-08-03 14:14:24,846 DEBUG    Requesting update for client D828C954A9AE
2021-08-03 14:14:24,846 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C954A9AE/erd", "id": "D828C954A9AE-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:25,065 DEBUG    client - event = data_received(<33 bytes>)
2021-08-03 14:14:25,065 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C95D21C9-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C95D21C9/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"a7o71pz52pf8cxi","applianceId":"D828C95D21C9","items":[{"erd":"0x0001","value":"0C47464435354553534E30575700000000000000000000000000000000000000","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0002","value":"0944533130303838304700000000000000000000000000000000000000000000","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0008","value":"01","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0035","value":"00000001","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x0099","value":"00","time":"2021-08-02T04:42:15.118Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-02T04:42:12.968Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-02T04:42:12.968Z"},{"erd":"0x0102","value":"00","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0103","value":"01000352","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x0105","value":"00","time":"2021-08-02T04:42:14.053Z"},{"erd":"0x2000","value":"00","time":"2021-08-02T22:42:16.157Z"},{"erd":"0x2001","value":"00","time":"2021-08-02T22:35:41.908Z"},{"erd":"0x2002","value":"00","time":"2021-08-02T22:37:45.724Z"},{"erd":"0x2007","value":"0DE5","time":"2021-08-02T22:35:42.858Z"},{"erd":"0x200A","value":"80","time":"2021-08-02T21:20:16.609Z"},{"erd":"0x2010","value":"0000","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2012","value":"01","time":"2021-08-02T21:20:25.890Z"},{"erd":"0x201C","value":"00","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x201D","value":"00","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2022","value":"0000000000","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2023","value":"0000","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2038","value":"FFFF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2039","value":"00","time":"2021-08-02T22:37:45.724Z"},{"erd":"0x2040","value":"FF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2041","value":"FF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x204D","value":"04","time":"2021-08-02T21:20:21.611Z"},{"erd":"0x2050","value":"03","time":"2021-08-02T21:20:16.609Z"},{"erd":"0x2051","value":"FF","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x2052","value":"0000","time":"2021-08-02T21:20:16.609Z"},{"erd":"0x2053","value":"00","time":"2021-08-02T04:42:10.579Z"},{"erd":"0x206F","value":"00","time":"2021-08-02T04:42:10.579Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-03 14:14:25,067 DEBUG    Got timespan value of 65535. Treating as None.
2021-08-03 14:14:25,131 DEBUG    client - event = data_received(<37 bytes>)
2021-08-03 14:14:25,131 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C954A9AE-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C954A9AE/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"a7o71pz52pf8cxi","applianceId":"D828C954A9AE","items":[{"erd":"0x0001","value":"0C47465735353053534E30575700000000000000000000000000000000000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0002","value":"0953523337313831304E00000000000000000000000000000000000000000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0008","value":"02","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0035","value":"00000002","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0099","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0102","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0103","value":"0100026A","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x0105","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2000","value":"00","time":"2021-08-02T21:18:47.456Z"},{"erd":"0x2001","value":"00","time":"2021-08-02T21:18:27.971Z"},{"erd":"0x2002","value":"00","time":"2021-08-02T21:18:47.456Z"},{"erd":"0x2007","value":"0CCF","time":"2021-08-02T21:18:30.083Z"},{"erd":"0x200A","value":"1C","time":"2021-08-02T20:18:34.278Z"},{"erd":"0x2010","value":"0000","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2012","value":"01","time":"2021-08-03T12:30:20.323Z"},{"erd":"0x2013","value":"00","time":"2021-08-02T21:18:41.406Z"},{"erd":"0x2015","value":"02","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2016","value":"14","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2017","value":"02","time":"2021-08-02T20:18:35.397Z"},{"erd":"0x2018","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x201D","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2038","value":"FFFF","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2039","value":"00","time":"2021-08-02T21:18:47.456Z"},{"erd":"0x2040","value":"FF","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2054","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2055","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x205B","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2060","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2061","value":"00","time":"2021-08-02T02:48:13.071Z"},{"erd":"0x2069","value":"000000E103000300","time":"2021-08-02T21:18:27.971Z"}]}}', rsv1=False, rsv2=False, rsv3=False)

Of Note:

2021-08-03 14:13:25,058 DEBUG    Got initial appliance type for GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER)

But I don't see anything specific in the hass core logs - just (seemingly) unrelated errors related to my Washing Machine (which does get discovered and shows up):

2021-08-03 14:22:30 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/config/custom_components/ge_home/update_coordinator.py", line 299, in on_device_initial_update
    self.maybe_add_appliance_api(appliance)
  File "/config/custom_components/ge_home/update_coordinator.py", line 128, in maybe_add_appliance_api
    api.build_entities_list()
  File "/config/custom_components/ge_home/devices/base.py", line 116, in build_entities_list
    e for e in self.get_all_entities()
  File "/config/custom_components/ge_home/devices/dryer.py", line 23, in get_all_entities
    GeErdBinarySensor(self, ErdCode.LAUNDRY_END_OF_CYCLE, icon_override="mdi:tumble-dryer"),
TypeError: __init__() got an unexpected keyword argument 'icon_override'
2021-08-03 14:22:30 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/config/custom_components/ge_home/update_coordinator.py", line 266, in on_device_update
    entity.async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 412, in async_write_ha_state
    raise RuntimeError(f"Attribute hass is None for {self}")
RuntimeError: Attribute hass is None for <Entity SR371810N Laundry Machine State: Off>
2021-08-03 14:22:31 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/config/custom_components/ge_home/update_coordinator.py", line 266, in on_device_update
    entity.async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 412, in async_write_ha_state
    raise RuntimeError(f"Attribute hass is None for {self}")
RuntimeError: Attribute hass is None for <Entity SR371810N Laundry Machine State: Off>

Any idea where to start?

Stuck on Loading Data Screen in Home Assistant After Enabling GE Home Integration

Hello,

Full disclaimer, I'm very new to HA. I attempted to install this integration on an older version of HA and was prompted to update if I wanted to use it. After updating, I started to get a never ending Loading Data screen on load of the Home Assistant UI.

I ended up pulling an older version of HA (2021.7.1) to resolve which didn't work. I then started disabling integrations. Once I disabled this one the UI loaded without issue.

Today, I tried re-enabling after pulling down and installing v0.4.3-dev3. After restarting and reloading the webpage, I get the same Loading Data issue. This is the error I'm getting in the logs:

2021-08-19 01:42:03 ERROR (MainThread) [homeassistant.components.http.view] Unable to serialize to JSON: Object of type CookMode is not JSON serializable. I've got an Advantium oven.

Any idea what's going on?

HA Version: homeassistant/home-assistant:2021.7.1
ha_gehome version: v0.4.3-dev3

Failed to setup "Check the logs" after adding custom component

I see this in the log and it never populates with any devices. Sets up when entering credentials each time.

Logger: gehomesdk.clients.async_login_flows
Source: /usr/local/lib/python3.9/site-packages/gehomesdk/clients/async_login_flows.py:66
First occurred: 7:21:27 AM (1 occurrences)
Last logged: 7:21:27 AM

There was a problem getting the authorization code, response details: {'method': 'POST', 'cookies': <SimpleCookie: >, '_real_url': URL('https://accounts.brillion.geappliances.com/oauth2/g_authenticate'), '_url': URL('https://accounts.brillion.geappliances.com/oauth2/g_authenticate'), '_body': b'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<title> OAuth Login</title>\n\n\n\n\n\t\n\t\n\n\n\n\n\n<link\n\thref="/resources/scripts/css/bootstrap.min.css"\n\trel="stylesheet" />\n<link\n\thref="/resources/scripts/css/desktop.css"\n\trel="stylesheet" />\n\n\t<link href="https://fonts.googleapis.com/css?family=Poppins:400,500,600,700,900&display=swap"\n \trel="stylesheet">\n<script\n\tsrc="/resources/scripts/jquery-3.5.1.min.js"></script>\n\n\n\n\n\n\n\n\n \n

\n
\n \n \t\t \n\t\t
\n\t\t\t
\n\t\t\t\n\n\n\t\t\t
\n\t\t
\n\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\n\t\t\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\n\t\n\n\n\n\n\n\n\n\n\t
\n\t
\n\t \n\t
\n\t
\n\t
\n
\n \n

Sign In

\n \n One account across our brands.
\n \n
\n\n\n
\n
\n\tInvalid credentials\n\n
\n\n\n\n
\n\t\n\t\t\n\t\t\t\t<input type="hidden" id="client_id" value="564c31616c4f7474434b307435412b4d2f6e7672"\n\t\t\t\t\tname="client_id" />\n\t\t\t\t<input type="hidden" id="response_type" value="code"\n\t\t\t\t\tname="response_type" />\n\t\t\t\t<input type="hidden" id="access_type" value="offline"\n\t\t\t\t\tid="access_type" />\n\t\t\n\t\t\n\t\t\t
\n\t\t\t\t<input type="hidden" id="signature" name="signature"\n\t\t\t\t\tvalue="vVLoPdzS242Elr8Q7VEjLwtnFvSSY62MrSVnFTi69BfzV92DD8TQbdXqL8kKA5+JwdqYrppWFC6Np7APE6ubH1/4wMJSYMrKNLkaYAbUFecpkBTXLPB3zdk1RmcAptOSEDMEs9kkHBimwFdQAfkdfRxwIUvVmyUpiy09qr/2Z4Arp8aWdGsMYy030Xs3EvnCERX2sP4byYqXYZCb5DPjBUwnFREnouETJBeTIOYf1SJlZbjd1vbDl3poynR7l/tsSyX70yz7E2SK/IeI3mEIjtcrlKSn8beo8Tvs+UY1/dnnGE0DCWYvm94E9J4JXTr3l7Zm7FVgD42iwJryItzrzeSzApLflrZFL+gqWljSn2b2CUgBbbSIlcJOwz1o1EFuyMJbCLr/twagV5TrwbVfiHNGL97RllxgoDQfQ87rFtic/AOXkKX4+7Ob0qrNfDG7eaS2+fuzOH7x6zF0Zp2IG6gNo68NVZWuhmkdLOFPo0AB7VWoL9x+M8ORorQFzOvBvCJdhh0cB+pdqDN6ZNeltJW22lr8WO1LZbZvjlb0g3btJPICwsNZrm4rZQc20uHpvANiVKqWZ8OekTIR5kL/FAEKuFTmtQDT+Zh7bpU5obZ6gWOJRciDmLWsGTjh228orIQ0eOUbzN9bIfps22XXZJLUHWG8Nh/cUYCVHQUSE65m8Eg2J+XNl5qcEmPeHSK6QMEFeOHR38J8lAqumhy/q3JiSJXuE8GmkpvbGre0P1EPtUO3C8oz4t8Vsep54GeKJf5H9OWXmUskpGFVKStbg+EMPKNvm2Iy9J9+LydZm7qhPlZQnh6gwFp8n0ApHUfGrVzuKpLNeV/mRmEtXWKo9xIvG9HC92Pmd3HD5jcx9T9nYDTF8mjn6uaNzivmJKpyyJ3/FrVRzPeNbthwJ33syrSn+wjcVsdR0bWuKaGo8sFgqX4HAE0XKOYkoGVkhXoApXsBm2HBsoiv8PD6TGXamAgwlYinS7sfrW+5Yoq51FagdimNHrPkI+X1v4Utjxudk/WTzX9CCQ34WXwsZZ5hCopXxSzWmC/Hs9VMy1qv9Lq/D/7KKWyvGuKcSaeswvb98lcHMa/2G6JhLFspqYOvG8sHYlM5Nw8/OyJZf7dsohBZBHCHhq+QvMsQHX28Zx6PP+8YMGhtfpGUBOyI2F2xuEfb91JhxI2caV3ymavlOzTJRbSGjKKaIKt1ML3vVLqyAq0O430C27u+LJp+5GfeCN8+mZcf6Qh1ZClZnaUh/UKWuZc1kMFjoOm77YO8XBcyT1Nq641+2qj44a28SGAU5xe/DCF67KjWcA7tM9oyfhneZLcGypiW66eqGsOpSZp7xbQ/dVNuoUgNEl1pM+g+o041uf9ueVoeLpF5eIIOTEDEPK3/uOePyLrbu6SPtx0BzTlmmnwDiRleqGyRNvluju6WcwkCO4hyh5z+SEojKB2fHlwpw+PVpKLr6FebiPqavGyTfjU72Lr38fuQkmByw/A+YIgS73VN5qb+HHEhiG8NvEKE52Xw1NaLQjAKKkaGc90Oe5bEe0M9oIZPT67JWyxDMewxcVX+Qcno56F+I+SRNNinQRDtZJac4nLwS3/jP0P3tYOQfpVlQX6Ftb6pBBAxJyGwGMM5zT3ujtk4ewiAAqbLOIWIjOjz+aorzhvltBvcaXcUMPvV9tgnYb9YLFKj1oQSq5HNEdUo+ksXXf9n17nb439eNaBMYP7DCUTkccKwJhryLy3X5ZcHv5bDBA==" />\n\t\t\t
\n\t\t\t
\n\t\t\t\t<input type="email" class="form-control" id="username"\n\t\t\t\t\tname="username" placeholder="Username" autocapitalize="off"\n\t\t\t\t\tvalue="[email protected]" tabindex="1" />\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t<input type="password" class="form-control" id="password"\n\t\t\t\t\tname="password" placeholder="Password" tabindex="2" maxlength="20" />\n\t\t\t\t Show Password
\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t\t\n\t\t\t
\n\t\t\t<button type="button" id="signin_btn" name="signin_btn" class="btn_signIn btn btn-default btn-primary"\n\t\t\t\tonClick="javascript:oauthLogin()" tabindex="4">\n\t\t\t\t\tSIGN IN\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n
\n
\n
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\t
Don't have an account? Sign up here
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\t\n\t\t\n
\n\n\n<script type="text/javascript">\nvar initialTime = new Date();\nvar refreshIntervalId;\nvar checkSessionTimeout = function () {\n var milliseconds = Math.abs((initialTime - new Date()));\n if (milliseconds > 870000) {\n \tif (refreshIntervalId) {\n \t\tclearInterval(refreshIntervalId);\n \t}\n \t$("#frmtimeout").attr("action",\n\t\t"/oauth2/timeout");\n\t\t$("#frmtimeout").submit();\n } \n};\n\n$(document).ready(function() {\n\t$("#showHide").click(function () {\n\t\tif ($("#showHide").is(":checked")) {\n\t\t$("#password").attr("type", "text");\n\t\t}\n\t\telse{\n\t\t$("#password").attr("type", "password");\n\t\t}\n\t\t});\n\t\trefreshIntervalId = setInterval(checkSessionTimeout, 10000);\n });\n \n</script>\n\n\n\n\n<script type="text/javascript">\n var submitted = false;\n\tvar RX = {\n\t\t\tEMAIL: /^\s*(\w+(?:(?:-\w+)|(?:\.\w+)|(?:\+\w+))\@[A-Za-z0-9]+(?:(?:\.|-)[A-Za-z0-9]+)\.[A-Za-z0-9][A-Za-z0-9]+)\s*$/\n\t};\n\tvar RX_NORMALIZE = {\n\t\t\tEMAIL: "$1"\n\t};\n\tfunction validateEmail (email, test, normalize) {\n\t\tif (!test.test(email)) {\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tfunction autoSubmit(e) {\n\t\tvar key;\n\n\t\tif (window.event)\n\t\t\tkey = window.event.keyCode; //IE\n\t\telse\n\t\t\tkey = e.which; //firefox\n\n\t\tif (key == 13) {\n\t\t\toauthLogin();\n\t\t\treturn false;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\tfunction oauthLogin() {\n\t\tif (submitted) {\n\t\t\treturn;\n\t\t}\n\t\tsubmitted = true;\n\t\tvar elmFocus = null;\n\t\tif ($("#username").val() == '') {\n\t\t\t//$("#error_username").html("Enter username");\n\t\t\t$("#error_username").html("Enter username");\n\t\t\t$("#grp_username").addClass("has-error");\n\t\t\telmFocus = $("#username");\n\t\t} else {\n\t\t\t$("#error_username").html("");\n\t\t\t$("#grp_username").removeClass("has-error");\n\t\t}\n\t\t\n\t\tif (!validateEmail ($("#username").val(), RX.EMAIL, RX_NORMALIZE.EMAIL)) {\n\t\t\t//$("#error_username").html("Invalid email address");\n\t\t\t$("#error_username").html("Invalid email address");\n\t\t\t$("#grp_username").addClass("has-error");\n\t\t\telmFocus = $("#username");\n\t\t} else {\n\t\t\t$("#error_username").html("");\n\t\t\t$("#grp_username").removeClass("has-error");\n\t\t}\n\t\t\n\t\t$("#username").val( $("#username").val().replace(RX.EMAIL, RX_NORMALIZE.EMAIL));\n\n\t\tif ($("#password").val() == '') {\n\t\t\t//$("#error_password").html("Enter password");\n\t\t\t$("#error_password").html("Enter password");\n\t\t\t$("#grp_password").addClass("has-error");\n\t\t\tif (elmFocus == null) {\n\t\t\t\telmFocus = $("#password");\n\t\t\t}\n\t\t} else {\n\t\t\t$("#error_password").html("");\n\t\t\t$("#grp_password").removeClass("has-error");\n\t\t}\n\t\t\n\n\t\tif (elmFocus != null) {\n\t\t\telmFocus.focus();\n\t\t\tsubmitted = false;\n\t\t\treturn;\n\t\t}\n\t\t$("#frmsignin").attr("action",\n\t\t\t\t"/oauth2/g_authenticate");\n\t\t$("#frmsignin").submit();\n\t\t$("#overlay").css({"display":"block"});\n\t}\n\t\n\tfunction resend() {\n\t\t$("#frmresend").attr("action",\n\t\t"/resend");\n\t\t$("#frmresend").submit();\n\t}\n\n\tfunction register() {\n\n\t\t\tdocument.location.href = '/account/register';\t\n\n\t}\n\t\n\tfunction forgotPassword() {\n\t\tdocument.location.href = '/consumer/forgotpwd/display';\n\t}\n\t\n\tfunction showRecaptcha() {\n\t\tRecaptcha.create("",\n\t\t\t\t'captchadiv', {\n\t\t\t\t\tcallback : Recaptcha.focus_response_field\n\t\t\t\t});\n\t}\n\n\tfunction getCaptchaText() {\n\t\treturn $('#captchadiv').find('[name="recaptcha_response_field"]').val();\n\t}\n\n\tfunction showCaptchaData() {\n\t\tvar capData = "

recaptcha_challenge_field

";\n\t\tcapData += "

"\n\t\t\t\t+ $('#captchadiv').find('[name="recaptcha_challenge_field"]')\n\t\t\t\t\t\t.val() + "

";\n\t\tcapData += "

recaptcha_response_field

";\n\t\tcapData += "

"\n\t\t\t\t+ $('#captchadiv').find('[name="recaptcha_response_field"]')\n\t\t\t\t\t\t.val() + "

";\n\n\t\t$('#captchadiv2').html(capData);\n\t}\n\n\n</script>\n\n\n\t\n\n\n
\n\t\t
\n\t
\n\n\t\n \t
\n \t
\n
\n
\n
\n

\n Copyright 2020 GE Appliances, a Haier company GE is trademark of General Electric Company.Manufactured under trademark license.\n

\n
\n
\n
\n
\n \t \n\t
\n\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t
\r\n\t\t

\r\n\t\t\t\tTerms  | \r\n\t\t\t\t Privacy \t|\r\n\t\t\t\t California Privacy Notice  |\r\n\t\t\t\t Do Not Sell My Info \t\t\t\r\n\t\t\t\r\n\t\t

\r\n\t
\r\n\r\n\r\n\r\n\r\n<script\r\n\tsrc="/resources/scripts/js/bootstrap.min.js"></script>\r\n<script\r\n\tsrc="/resources/scripts/js/bootstrap-show-password.min.js"></script>\r\n<script\r\n\tsrc="/resources/scripts/common.js"></script>\r\n\r\n\r\n\r\n\r\n\n\n', '_writer': None, '_continue': None, '_closed': True, '_history': (), '_request_info': RequestInfo(url=URL('https://accounts.brillion.geappliances.com/oauth2/g_authenticate'), method='POST', headers=<CIMultiDictProxy('Host': 'accounts.brillion.geappliances.com', 'User-Agent': 'HomeAssistant/2021.8.3 aiohttp/3.7.4.post0 Python/3.9', 'Accept': '/', 'Accept-Encoding': 'gzip, deflate', 'Cookie': 'JSESSIONID=70C4F7C40BE2D69ADA526461F962DEEB', 'Content-Length': '1982', 'Content-Type': 'application/x-www-form-urlencoded')>, real_url=URL('https://accounts.brillion.geappliances.com/oauth2/g_authenticate')), '_timer': <aiohttp.helpers.TimerContext object at 0x7fb00295ea90>, '_cache': {'headers': <CIMultiDictProxy('Content-Type': 'text/html;charset=ISO-8859-1', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Sat, 07 Aug 2021 14:21:27 GMT', 'X-Amzn-Trace-Id': 'Root=1-610e96e6-4f8930cd12a6cb347a7b4b96;', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'X-Cache': 'Miss from cloudfront', 'Via': '1.1 bc026bbeb6351b9fc6315a678d5987e7.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop': 'LAX3-C4', 'X-Amz-Cf-Id': 'yB0Cg-z7c0Z_YvcJWaBVnWG3OkJ_63ieOZoCNd_vB0FECi-4W8TxTg==')>, 'url': URL('https://accounts.brillion.geappliances.com/oauth2/g_authenticate')}, '_traces': [], '_loop': <_UnixSelectorEventLoop running=True closed=False debug=False>, '_session': None, '_protocol': <aiohttp.client_proto.ResponseHandler object at 0x7fb002b3ee20>, '_connection': None, 'version': HttpVersion(major=1, minor=1), 'status': 200, 'reason': '', '_headers': <CIMultiDictProxy('Content-Type': 'text/html;charset=ISO-8859-1', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Date': 'Sat, 07 Aug 2021 14:21:27 GMT', 'X-Amzn-Trace-Id': 'Root=1-610e96e6-4f8930cd12a6cb347a7b4b96;', 'X-Frame-Options': 'SAMEORIGIN', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'X-Cache': 'Miss from cloudfront', 'Via': '1.1 bc026bbeb6351b9fc6315a678d5987e7.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop': 'LAX3-C4', 'X-Amz-Cf-Id': 'yB0Cg-z7c0Z_YvcJWaBVnWG3OkJ_63ieOZoCNd_vB0FECi-4W8TxTg==')>, '_raw_headers': ((b'Content-Type', b'text/html;charset=ISO-8859-1'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'Date', b'Sat, 07 Aug 2021 14:21:27 GMT'), (b'X-Amzn-Trace-Id', b'Root=1-610e96e6-4f8930cd12a6cb347a7b4b96;'), (b'X-Frame-Options', b'SAMEORIGIN'), (b'X-Content-Type-Options', b'nosniff'), (b'X-XSS-Protection', b'1; mode=block'), (b'X-Cache', b'Miss from cloudfront'), (b'Via', b'1.1 bc026bbeb6351b9fc6315a678d5987e7.cloudfront.net (CloudFront)'), (b'X-Amz-Cf-Pop', b'LAX3-C4'), (b'X-Amz-Cf-Id', b'yB0Cg-z7c0Z_YvcJWaBVnWG3OkJ_63ieOZoCNd_vB0FECi-4W8TxTg==')), 'content': }
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/gehomesdk/clients/async_login_flows.py", line 60, in async_get_authorization_code
code = await async_handle_ok_response(session, await resp.text())
File "/usr/local/lib/python3.9/site-packages/gehomesdk/clients/async_login_flows.py", line 95, in async_handle_ok_response
raise GeAuthFailedError(f"Authentication failed, reason: {reason}")
gehomesdk.exception.ge_auth_failed_error.GeAuthFailedError: Authentication failed, reason: Invalid credentials

Error Setting up entry

Also getting this

Logger: homeassistant.config_entries
Source: custom_components/ge_home/update_coordinator.py:174
Integration: GE Home (documentation)
First occurred: 7:22:18 AM (1 occurrences)
Last logged: 7:22:18 AM

Error setting up entry GE Home ([email protected]) for ge_home
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 172, in async_setup
await self.initialization_future
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 172, in async_setup
await self.initialization_future
File "/usr/local/lib/python3.9/site-packages/async_timeout/init.py", line 45, in exit
self._do_exit(exc_type)
File "/usr/local/lib/python3.9/site-packages/async_timeout/init.py", line 92, in _do_exit
raise asyncio.TimeoutError
asyncio.exceptions.TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/config_entries.py", line 293, in async_setup
result = await component.async_setup_entry(hass, self) # type: ignore
File "/config/custom_components/ge_home/init.py", line 26, in async_setup_entry
if not await coordinator.async_setup():
File "/config/custom_components/ge_home/update_coordinator.py", line 174, in async_setup
raise HaCannotConnect("Initialization timed out")
custom_components.ge_home.exceptions.HaCannotConnect: Initialization timed out

Originally posted by @joshewing02 in #29 (comment)

Invalid authentication non EU region account

Recently started getting 'Invalid authentication' when attempting to login for the integration to be created in HA.

Looking at the latest SmartHQ android application (v1.0.0.101.17) there is a link for Non-European accounts to sign in which resolves this problem of getting the authorization code.

Any chance we can get the alternative region added to login and have a user selection for each method?

Logger: gehomesdk.clients.async_login_flows
Source: /usr/local/lib/python3.9/site-packages/gehomesdk/clients/async_login_flows.py:66

There was a problem getting the authorization code, response details: {'method': 'POST', 'cookies': <SimpleCookie: abgea_region='eu-west-1'>, '_real_url': URL('https://accounts.brillion.geappliances.com/oauth2/g_authenticate'), '_url': URL('https://accounts.brillion.geappliances.com/oauth2/g_authenticate'), '_body':..........etc.

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/gehomesdk/clients/async_login_flows.py", line 60, in async_get_authorization_code
    code = await async_handle_ok_response(session, await resp.text())
  File "/usr/local/lib/python3.9/site-packages/gehomesdk/clients/async_login_flows.py", line 95, in async_handle_ok_response
    raise GeAuthFailedError(f"Authentication failed, reason: {reason}")
gehomesdk.exception.ge_auth_failed_error.GeAuthFailedError: Authentication failed, reason: Invalid credentials

Have been using it with Fisher Paykel Washing Machine WH1160F2.

Component has worked flawlessly until this recent update.

Two Refrigerator binary_sensors appear to do nothing: ice_maker_control_status & door_status_any_open

I'm tracking this one down, but it looks like they should just be "On" if the ice maker is enabled and "On" if any one of the doors to the refrigerator or freezer are open. Instead, the Door binary_sensor defaults to "Closed" continuously regardless of actions, and the Ice Maker control status always reports "Off".

I can see in the SDK where they're instrumented - both as a property. But they seem to not see events in the HA component.

Hot water dispenser entity creation failure: device_state_attributes issue

The water_heater entity for the hot water dispenser on a GE refrigerator isn't created properly. It appears to be something incorrect in the device_state_attributes, resulting in:

  • Inability to add entities to domain water_heater
  • Resultant error in setting up ge_kitchen mapping for water_heater

Hopefully the error messages below are helpful.

2021-02-07 16:40:47 ERROR (MainThread) [homeassistant.components.water_heater] Error adding entities for domain water_heater with platform ge_kitchen
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 315, in async_add_entities
await asyncio.gather(*tasks)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 506, in _async_add_entity
await entity.add_to_platform_finish()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 531, in add_to_platform_finish
self.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 296, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 323, in _async_write_ha_state
attr.update(self.device_state_attributes or {})
File "/config/custom_components/ge_kitchen/entities/common/ge_water_heater.py", line 54, in device_state_attributes
return {**other_attrs}
TypeError: 'NoneType' object is not a mapping
2021-02-07 16:40:47 ERROR (MainThread) [homeassistant.components.water_heater] Error while setting up ge_kitchen platform for water_heater
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 206, in _async_setup_platform
await asyncio.gather(*pending)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 315, in async_add_entities
await asyncio.gather(*tasks)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 506, in _async_add_entity
await entity.add_to_platform_finish()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 531, in add_to_platform_finish
self.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 296, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 323, in _async_write_ha_state
attr.update(self.device_state_attributes or {})
File "/config/custom_components/ge_kitchen/entities/common/ge_water_heater.py", line 54, in device_state_attributes
return {**other_attrs}
TypeError: 'NoneType' object is not a mapping
2021-02-07 16:41:17 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_kitchen/update_coordinator.py", line 251, in on_device_update
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 296, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 323, in _async_write_ha_state
attr.update(self.device_state_attributes or {})
File "/config/custom_components/ge_kitchen/entities/common/ge_water_heater.py", line 54, in device_state_attributes
return {**other_attrs}
TypeError: 'NoneType' object is not a mapping
2021-02-07 16:41:47 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_kitchen/update_coordinator.py", line 251, in on_device_update
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 296, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 323, in _async_write_ha_state
attr.update(self.device_state_attributes or {})
File "/config/custom_components/ge_kitchen/entities/common/ge_water_heater.py", line 54, in device_state_attributes
return {**other_attrs}
TypeError: 'NoneType' object is not a mapping

I'll continue to play with this (it looks like an object mismatch), but I need to learn the SDK first. :)

Several Oven modes missing

I have a brand new GE Monogram wall oven. The integration installs and works (mostly). It has several modes that aren't available in the integration. Specifically:

Warm
Proof
Broil

these are available in the oven menus but not in the integration.... any thoughts here? I use the warm mode most often but there's no way to access it via home assistant...

jeff

Opal Ice Maker Support

I'd like to see support for my Opal ice maker added to this integration. I am certainly willing to assist in any way possible!

Model #: XPIOX3
Type: Opal Nugget Ice Maker

Sabbath mode icon being deprecated

Just a heads up here, I am getting this error as of 2021.10, relating to the Sabbath mode icon.

Icon mdi:judaism was renamed to mdi:star-david, please change your config, it will be removed in version 2021.12.

Automatic Unit Selection

Currently integration may show incorrect temperature for a fridge like this:

Controls
ZG033204 Freezer
-4 °C
Currently: -3 °C
ZG033204 Fridge
38 °C
Currently: 37 °C

Fridge itself is set to use Celsius degrees. HA is set to use Metric system as well. It's obvious that temperature is in Fahrenheit degrees but it is attributed as it is in Celsius. It should either be converted into Celsius or attributed correctly.

fridge.py should be units aware as it contains this: "units = self.hass.config.units".
By changing units at the Configuration/General/Unit System to the Imperial, integration reports temperature this way:

ZG033204 Freezer
25 °F
Currently: 28 °F
ZG033204 Fridge
100 °F
Currently: 99 °F

As we see in both cases temperature is wrong. This makes me think that GE always reports temperature in Fahrenheit degrees and reports measurement units separately via API. In this case "ConvertableDrawerModeOptionsConverter(units)" should be used with care in a code as it may do things wrong.

I may provide a help to debug issue if needed.

Error loading configuration flow

I am running HA core on TrueNAS. When I try to load the integration, I keep getting the following error:

Logger: homeassistant.config_entries
Source: config_entries.py:711
First occurred: 9:43:29 PM (1 occurrences)
Last logged: 9:43:29 PM

Error occurred loading configuration flow for integration ge_home: No module named 'lxml'

Any advice on manually adding the lxml module?

One oven not showing up

I'm having an issue connecting my second oven.

I first installed the integration and both ovens shower up but one was unavailable. So I deleted the integration and tried again and now it only shows one oven and it says integration not loaded check logs.

This is the error code I get
2021-06-21 23:42:51 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 285, in on_device_initial_update
self.maybe_add_appliance_api(appliance)
File "/config/custom_components/ge_home/update_coordinator.py", line 121, in maybe_add_appliance_api
api.build_entities_list()
File "/config/custom_components/ge_home/devices/base.py", line 112, in build_entities_list
e for e in self.get_all_entities()
File "/config/custom_components/ge_home/devices/oven.py", line 34, in get_all_entities
cooktop_config: ErdCooktopConfig = self.appliance.get_erd_value(ErdCode.COOKTOP_CONFIG)
File "/usr/local/lib/python3.8/site-packages/gehomesdk/ge_appliance.py", line 119, in get_erd_value
return self._property_cache[erd_code]
KeyError: <ErdCode.COOKTOP_CONFIG: '0x551c'>

Oven Integration Works Properly Except for Oven "Water Heater" Entity

I have a GE Induction Range that has a built in Oven that is compatible with SmartIQ. It definitely looks like one of the earlier devices that were put out with Smart capabilities.

Model: PHB920SJ3SS
Type: Oven
Firmware: 0.0.0.0

The following entities are populated properly (I have renamed the device/entities away from the serial number and to just "oven"):

sensor.oven_cook_mode
sensor.oven_cook_time_remaining
sensor.oven_kitchen_timer
binary_sensor.oven_remote_enabled
switch.oven_sabbath_mode
sensor.oven_user_temp_offset

The item that does not work properly is the following:
water_heater.oven

This is what shows up in the logs:

2021-09-01 00:22:30 ERROR (MainThread) [homeassistant.components.water_heater] Error adding entities for domain water_heater with platform ge_home
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 382, in async_add_entities
await asyncio.gather(*tasks)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 587, in _async_add_entity
await entity.add_to_platform_finish()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 711, in add_to_platform_finish
self.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 464, in async_write_ha_state
self._async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 500, in _async_write_ha_state
attr.update(self.state_attributes or {})
File "/usr/src/homeassistant/homeassistant/components/water_heater/init.py", line 203, in state_attributes
self.current_temperature,
File "/config/custom_components/ge_home/entities/oven/ge_oven.py", line 83, in current_temperature
return self.get_erd_value("RAW_TEMPERATURE")
File "/config/custom_components/ge_home/entities/oven/ge_oven.py", line 174, in get_erd_value
return self.appliance.get_erd_value(erd_code)
File "/usr/local/lib/python3.9/site-packages/gehomesdk/ge_appliance.py", line 136, in get_erd_value
return self._property_cache[erd_code]
KeyError: <ErdCode.UPPER_OVEN_RAW_TEMPERATURE: '0x510d'>

Shabbos mode not working

Shabbos mode is not working and I have this error in my logs

Logger: homeassistant
Source: helpers/entity.py:361
First occurred: 7:56:02 AM (3 occurrences)
Last logged: 8:01:32 AM

Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 251, in on_device_update
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 361, in async_write_ha_state
raise RuntimeError(f"Attribute hass is None for {self}")
RuntimeError: Attribute hass is None for

Support for GE Split A/C Units

This issue is for working through the support for GE Split A/C Units. If you have one of these units, please let me know if the latest dev release enables support for these within HA. @RobertusIT, we can continue the discussion from the gehome repository here.

Laundry Door is not being recognized

HAss History always shows Closed for my appliances' (Washing Machine & Dryer) door.

image

However, your gehomesdk shows the state change. Any way to enable that sensor (and any other ERDs not enabled/receiving state [ex, door locked] - full audit of what ERDs are enabled in hass?)?

2021-08-06 09:31:55,899 DEBUG    Using selector: SelectSelector
C:\Users\steve.redden.REDNET\Documents\Development\gehome-master\gehome-master\examples\websocket_example.py:75: DeprecationWarning: The object should be created within an async function
  session = aiohttp.ClientSession()
2021-08-06 09:31:55,899 DEBUG    Getting OAuth2 token
2021-08-06 09:31:55,919 DEBUG    Client changed state: GeClientState.INITIALIZING to GeClientState.AUTHORIZING_OAUTH
2021-08-06 09:31:56,680 DEBUG    Getting WS credentials
2021-08-06 09:31:56,680 DEBUG    Client changed state: GeClientState.AUTHORIZING_OAUTH to GeClientState.AUTHORIZING_CLIENT
2021-08-06 09:31:56,779 INFO     Starting GE Appliances client
2021-08-06 09:31:56,794 DEBUG    Client changed state: GeClientState.AUTHORIZING_CLIENT to GeClientState.CONNECTING
2021-08-06 09:31:56,825 DEBUG    client - state = CONNECTING
2021-08-06 09:31:56,888 DEBUG    client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x00000212BAB95820>)
2021-08-06 09:31:56,888 DEBUG    client > GET /?access_token=REDACTED HTTP/1.1
2021-08-06 09:31:56,888 DEBUG    client > Headers([('Host', 'ws-us-east-1.brillion.geappliances.com'), ('Upgrade', 'websocket'), ('Connection', 'Upgrade'), ('Sec-WebSocket-Key', '6E8BjqMBUzR8XURh6BlxDg=='), ('Sec-WebSocket-Version', '13'), ('Sec-WebSocket-Extensions', 'permessage-deflate; client_max_window_bits'), ('User-Agent', 'Python/3.9 websockets/9.1')])
2021-08-06 09:31:57,294 DEBUG    client - event = data_received(<212 bytes>)
2021-08-06 09:31:57,309 DEBUG    client < HTTP/1.1 101 Switching Protocols
2021-08-06 09:31:57,309 DEBUG    client < Headers([('Date', 'Fri, 06 Aug 2021 14:31:57 GMT'), ('Connection', 'upgrade'), ('upgrade', 'websocket'), ('sec-websocket-accept', 'WB87fuuBHuDMxJaowEDTIc8D74o='), ('sec-websocket-extensions', 'permessage-deflate')])
2021-08-06 09:31:57,309 DEBUG    client - state = OPEN
2021-08-06 09:31:57,309 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#subscribe", "action": "subscribe", "resources": ["/appliance/*/erd/*"]}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,309 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance", "id": "List-appliances"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,309 DEBUG    Client changed state: GeClientState.CONNECTING to GeClientState.CONNECTED
2021-08-06 09:31:57,388 DEBUG    client - event = data_received(<49 bytes>)
2021-08-06 09:31:57,388 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#subscribe","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,497 DEBUG    client - event = data_received(<300 bytes>)
2021-08-06 09:31:57,497 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"List-appliances","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance"},"success":true,"code":200,"body":{"kind":"appliance#applianceList","userId":"a7o71pz52pf8cxi","items":[{"applianceId":"D828C95D21C9","type":"Clothes Dryer","brand":"Unknown","jid":"d828c95d21c9_a7o71pz52pf8cxi","nickname":"Dryer","online":"ONLINE","onlineTime":"2021-08-05T04:09:44.000Z"},{"applianceId":"D828C954A9AE","type":"Clothes Washer","brand":"Unknown","jid":"d828c954a9ae_a7o71pz52pf8cxi","nickname":"Washer","online":"ONLINE","onlineTime":"2021-08-06T08:00:50.000Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,497 DEBUG    D828C95D21C9 marked available
2021-08-06 09:31:57,497 DEBUG    Adding appliance D828C95D21C9
2021-08-06 09:31:57,497 DEBUG    Requesting update for client D828C95D21C9
2021-08-06 09:31:57,497 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C95D21C9/erd", "id": "D828C95D21C9-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,497 DEBUG    Requesting features for client D828C95D21C9
2021-08-06 09:31:57,497 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C95D21C9/feature", "id": "Request-features"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,497 DEBUG    D828C954A9AE marked available
2021-08-06 09:31:57,497 DEBUG    Adding appliance D828C954A9AE
2021-08-06 09:31:57,497 DEBUG    Requesting update for client D828C954A9AE
2021-08-06 09:31:57,497 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C954A9AE/erd", "id": "D828C954A9AE-allErd"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,497 DEBUG    Requesting features for client D828C954A9AE
2021-08-06 09:31:57,497 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#api", "action": "api", "host": "api.brillion.geappliances.com", "method": "GET", "path": "/v1/appliance/D828C954A9AE/feature", "id": "Request-features"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,497 DEBUG    Registering update callback for GeAppliance(D828C95D21C9) (Unknown Type)
2021-08-06 09:31:57,497 DEBUG    Registering update callback for GeAppliance(D828C954A9AE) (Unknown Type)
2021-08-06 09:31:57,650 DEBUG    client - event = data_received(<330 bytes>)
2021-08-06 09:31:57,651 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C95D21C9-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C95D21C9/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"a7o71pz52pf8cxi","applianceId":"D828C95D21C9","items":[{"erd":"0x0001","value":"0C47464435354553534E30575700000000000000000000000000000000000000","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0002","value":"0944533130303838304700000000000000000000000000000000000000000000","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0008","value":"01","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0035","value":"00000001","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0099","value":"00","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0102","value":"00","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0103","value":"01000352","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x0105","value":"00","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2000","value":"02","time":"2021-08-06T14:23:52.922Z"},{"erd":"0x2001","value":"80","time":"2021-08-06T14:23:52.922Z"},{"erd":"0x2002","value":"00","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2007","value":"0831","time":"2021-08-06T14:31:50.496Z"},{"erd":"0x200A","value":"89","time":"2021-08-06T14:23:42.266Z"},{"erd":"0x2010","value":"0000","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2012","value":"01","time":"2021-08-06T14:23:41.400Z"},{"erd":"0x201C","value":"00","time":"2021-08-06T14:23:51.846Z"},{"erd":"0x201D","value":"00","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2022","value":"0000000000","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2023","value":"0000","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2038","value":"FFFF","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2039","value":"01","time":"2021-08-06T14:23:52.922Z"},{"erd":"0x2040","value":"FF","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2041","value":"FF","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x204D","value":"04","time":"2021-08-06T14:23:44.459Z"},{"erd":"0x2050","value":"04","time":"2021-08-06T14:23:46.650Z"},{"erd":"0x2051","value":"FF","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2052","value":"0003","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x2053","value":"00","time":"2021-08-05T04:11:45.976Z"},{"erd":"0x206F","value":"00","time":"2021-08-05T04:11:45.976Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,654 DEBUG    Setting ErdCode.MODEL_NUMBER to GFD55ESSN0WW
2021-08-06 09:31:57,656 DEBUG    Setting ErdCode.SERIAL_NUMBER to DS100880G
2021-08-06 09:31:57,657 DEBUG    Setting ErdCode.APPLIANCE_TYPE to ErdApplianceType.DRYER
2021-08-06 09:31:57,657 DEBUG    Setting ErdCode.UNIT_TYPE to ErdUnitType.TYPE_120V_CAFE
2021-08-06 09:31:57,658 DEBUG    Setting ErdCode.UNKNOWN_0099 to b'\x00'
2021-08-06 09:31:57,658 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION to 0.0.11.39
2021-08-06 09:31:57,659 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-06 09:31:57,659 DEBUG    Setting ErdCode.ACM_UPDATING to False
2021-08-06 09:31:57,660 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION to 1.0.3.82
2021-08-06 09:31:57,661 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-06 09:31:57,661 DEBUG    Setting ErdCode.APPLIANCE_UPDATING to False
2021-08-06 09:31:57,661 DEBUG    Setting ErdCode.LAUNDRY_MACHINE_STATE to Run
2021-08-06 09:31:57,662 DEBUG    Setting ErdCode.LAUNDRY_SUB_CYCLE to ErdLaundrySubCycle.DRYING
2021-08-06 09:31:57,662 DEBUG    Setting ErdCode.LAUNDRY_END_OF_CYCLE to False
2021-08-06 09:31:57,663 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:34:57
2021-08-06 09:31:57,663 DEBUG    Setting ErdCode.LAUNDRY_CYCLE to ErdLaundryCycle.MIXED
2021-08-06 09:31:57,663 DEBUG    Setting ErdCode.LAUNDRY_DELAY_TIME_REMAINING to 0:00:00
2021-08-06 09:31:57,664 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.CLOSED
2021-08-06 09:31:57,664 DEBUG    Setting ErdCode.LAUNDRY_DRYER_LEVEL_SENSOR_DISABLED to False
2021-08-06 09:31:57,665 DEBUG    Setting ErdCode.LAUNDRY_UNKNOWN201D to b'\x00'
2021-08-06 09:31:57,665 DEBUG    Setting ErdCode.LAUNDRY_DRYER_SHEET_USAGE_CONFIGURATION to ErdSheetUsageConfiguration(extra_large_load_size=0, large_load_size=0, medium_load_size=0, small_load_size=0, timed_dryer_sheets_load_size=0, raw_value='0000000000')
2021-08-06 09:31:57,665 DEBUG    Setting ErdCode.LAUNDRY_DRYER_SHEET_INVENTORY to 0
2021-08-06 09:31:57,666 DEBUG    Got timespan value of 65535. Treating as None.
2021-08-06 09:31:57,666 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_STATUS to True
2021-08-06 09:31:57,667 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_POWER_CONTROL to 255
2021-08-06 09:31:57,667 DEBUG    Setting ErdCode.LAUNDRY_UNKNOWN2041 to b'\xff'
2021-08-06 09:31:57,668 DEBUG    Setting ErdCode.LAUNDRY_DRYER_DRYNESSNEW_LEVEL to More Dry
2021-08-06 09:31:57,668 DEBUG    Setting ErdCode.LAUNDRY_DRYER_TEMPERATURENEW_OPTION to Medium
2021-08-06 09:31:57,669 DEBUG    Setting ErdCode.LAUNDRY_DRYER_UNKNOWN2051 to b'\xff'
2021-08-06 09:31:57,669 DEBUG    Setting ErdCode.LAUNDRY_DRYER_ECODRY_STATUS to Disabled
2021-08-06 09:31:57,669 DEBUG    Setting ErdCode.LAUNDRY_DRYER_TUMBLENEW_STATUS to ErdTumbleStatus.DISABLE
2021-08-06 09:31:57,670 DEBUG    Setting ErdCode.LAUNDRY_DRYER_UNKNOWN206F to b'\x00'
2021-08-06 09:31:57,674 DEBUG    Got initial appliance type for GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER)
2021-08-06 09:31:57,675 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER). Updated keys: ErdCode.MODEL_NUMBER, ErdCode.SERIAL_NUMBER, ErdCode.APPLIANCE_TYPE, ErdCode.UNIT_TYPE, ErdCode.UNKNOWN_0099, ErdCode.WIFI_MODULE_SW_VERSION, ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE, ErdCode.ACM_UPDATING, ErdCode.APPLIANCE_SW_VERSION, ErdCode.APPLIANCE_SW_VERSION_AVAILABLE, ErdCode.APPLIANCE_UPDATING, ErdCode.LAUNDRY_MACHINE_STATE, ErdCode.LAUNDRY_SUB_CYCLE, ErdCode.LAUNDRY_END_OF_CYCLE, ErdCode.LAUNDRY_TIME_REMAINING, ErdCode.LAUNDRY_CYCLE, ErdCode.LAUNDRY_DELAY_TIME_REMAINING, ErdCode.LAUNDRY_DOOR, ErdCode.LAUNDRY_DRYER_LEVEL_SENSOR_DISABLED, ErdCode.LAUNDRY_UNKNOWN201D, ErdCode.LAUNDRY_DRYER_SHEET_USAGE_CONFIGURATION, ErdCode.LAUNDRY_DRYER_SHEET_INVENTORY, ErdCode.LAUNDRY_REMOTE_STATUS, ErdCode.LAUNDRY_REMOTE_POWER_CONTROL, ErdCode.LAUNDRY_UNKNOWN2041, ErdCode.LAUNDRY_DRYER_DRYNESSNEW_LEVEL, ErdCode.LAUNDRY_DRYER_TEMPERATURENEW_OPTION, ErdCode.LAUNDRY_DRYER_UNKNOWN2051, ErdCode.LAUNDRY_DRYER_ECODRY_STATUS, ErdCode.LAUNDRY_DRYER_TUMBLENEW_STATUS, ErdCode.LAUNDRY_DRYER_UNKNOWN206F
2021-08-06 09:31:57,676 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER)
2021-08-06 09:31:57,681 DEBUG    client - event = data_received(<17 bytes>)
2021-08-06 09:31:57,682 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#connect","success":true}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,731 DEBUG    client - event = data_received(<71 bytes>)
2021-08-06 09:31:57,731 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"Request-features","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C954A9AE/feature"},"success":true,"code":200,"body":{"kind":"appliance#applianceFeature","userId":"a7o71pz52pf8cxi","applianceId":"D828C954A9AE","features":["CLOTHES_WASHER_V1_WASHER_LINK"]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,731 DEBUG    Received features ['CLOTHES_WASHER_V1_WASHER_LINK'] for D828C954A9AE
2021-08-06 09:31:57,731 DEBUG    client - event = data_received(<41 bytes>)
2021-08-06 09:31:57,731 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"Request-features","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C95D21C9/feature"},"success":true,"code":200,"body":{"kind":"appliance#applianceFeature","userId":"a7o71pz52pf8cxi","applianceId":"D828C95D21C9","features":["CLOTHES_DRYER_V1_EXTENDED_TUMBLE"]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,731 DEBUG    Received features ['CLOTHES_DRYER_V1_EXTENDED_TUMBLE'] for D828C95D21C9
2021-08-06 09:31:57,763 DEBUG    client - event = data_received(<275 bytes>)
2021-08-06 09:31:57,763 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#api","id":"D828C954A9AE-allErd","request":{"host":"api.brillion.geappliances.com","method":"GET","path":"/v1/appliance/D828C954A9AE/erd"},"success":true,"code":200,"body":{"kind":"appliance#erdList","userId":"a7o71pz52pf8cxi","applianceId":"D828C954A9AE","items":[{"erd":"0x0001","value":"0C47465735353053534E30575700000000000000000000000000000000000000","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0002","value":"0953523337313831304E00000000000000000000000000000000000000000000","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0008","value":"02","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0035","value":"00000002","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0099","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0100","value":"00000B27","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0101","value":"00000000","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0102","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0103","value":"0100026A","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0104","value":"00000000","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x0105","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2000","value":"00","time":"2021-08-06T14:27:55.255Z"},{"erd":"0x2001","value":"00","time":"2021-08-06T13:52:55.667Z"},{"erd":"0x2002","value":"00","time":"2021-08-06T13:57:25.035Z"},{"erd":"0x2007","value":"0CCF","time":"2021-08-06T13:53:02.709Z"},{"erd":"0x200A","value":"1C","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2010","value":"0000","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2012","value":"01","time":"2021-08-06T14:23:27.984Z"},{"erd":"0x2013","value":"00","time":"2021-08-06T13:53:02.709Z"},{"erd":"0x2015","value":"02","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2016","value":"14","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2017","value":"02","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2018","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x201D","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2038","value":"FFFF","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2039","value":"00","time":"2021-08-06T14:22:49.888Z"},{"erd":"0x2040","value":"FF","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2054","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2055","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x205B","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2060","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2061","value":"00","time":"2021-08-06T08:02:51.037Z"},{"erd":"0x2069","value":"000000E203000300","time":"2021-08-06T13:52:55.667Z"}]}}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.MODEL_NUMBER to GFW550SSN0WW
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.SERIAL_NUMBER to SR371810N
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.APPLIANCE_TYPE to ErdApplianceType.WASHER
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.UNIT_TYPE to ErdUnitType.TYPE_120V_MONOGRAM
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.UNKNOWN_0099 to b'\x00'
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION to 0.0.11.39
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.ACM_UPDATING to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION to 1.0.2.106
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.APPLIANCE_SW_VERSION_AVAILABLE to 0.0.0.0
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.APPLIANCE_UPDATING to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_MACHINE_STATE to Off
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_SUB_CYCLE to ErdLaundrySubCycle.CYCLE_NONE
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_END_OF_CYCLE to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:54:39
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_CYCLE to ErdLaundryCycle.NORMAL2
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_DELAY_TIME_REMAINING to 0:00:00
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.CLOSED
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_DOOR_LOCK to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_SOIL_LEVEL to ErdSoilLevel.NORMAL
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_WASHTEMP_LEVEL to Warm
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_SPINTIME_LEVEL to ErdSpinTimeLevel.MEDIUM
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_RINSE_OPTION to ErdRinseOption.INVALID
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_UNKNOWN201D to b'\x00'
2021-08-06 09:31:57,763 DEBUG    Got timespan value of 65535. Treating as None.
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_STATUS to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_REMOTE_POWER_CONTROL to 255
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_UNKNOWN2054 to b'\x00'
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_TIMESAVER to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_PREWASH to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_UNKNOWN2060 to b'\x00'
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_TUMBLECARE to False
2021-08-06 09:31:57,763 DEBUG    Setting ErdCode.LAUNDRY_WASHER_UNKNOWN2069 to b'\x00\x00\x00\xe2\x03\x00\x03\x00'
2021-08-06 09:31:57,763 DEBUG    Got initial appliance type for GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER)
2021-08-06 09:31:57,763 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER). Updated keys: ErdCode.MODEL_NUMBER, ErdCode.SERIAL_NUMBER, ErdCode.APPLIANCE_TYPE, ErdCode.UNIT_TYPE, ErdCode.UNKNOWN_0099, ErdCode.WIFI_MODULE_SW_VERSION, ErdCode.WIFI_MODULE_SW_VERSION_AVAILABLE, ErdCode.ACM_UPDATING, ErdCode.APPLIANCE_SW_VERSION, ErdCode.APPLIANCE_SW_VERSION_AVAILABLE, ErdCode.APPLIANCE_UPDATING, ErdCode.LAUNDRY_MACHINE_STATE, ErdCode.LAUNDRY_SUB_CYCLE, ErdCode.LAUNDRY_END_OF_CYCLE, ErdCode.LAUNDRY_TIME_REMAINING, ErdCode.LAUNDRY_CYCLE, ErdCode.LAUNDRY_DELAY_TIME_REMAINING, ErdCode.LAUNDRY_DOOR, ErdCode.LAUNDRY_WASHER_DOOR_LOCK, ErdCode.LAUNDRY_WASHER_SOIL_LEVEL, ErdCode.LAUNDRY_WASHER_WASHTEMP_LEVEL, ErdCode.LAUNDRY_WASHER_SPINTIME_LEVEL, ErdCode.LAUNDRY_WASHER_RINSE_OPTION, ErdCode.LAUNDRY_UNKNOWN201D, ErdCode.LAUNDRY_REMOTE_STATUS, ErdCode.LAUNDRY_REMOTE_POWER_CONTROL, ErdCode.LAUNDRY_WASHER_UNKNOWN2054, ErdCode.LAUNDRY_WASHER_TIMESAVER, ErdCode.LAUNDRY_WASHER_PREWASH, ErdCode.LAUNDRY_WASHER_UNKNOWN2060, ErdCode.LAUNDRY_WASHER_TUMBLECARE, ErdCode.LAUNDRY_WASHER_UNKNOWN2069
2021-08-06 09:31:57,778 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER)
2021-08-06 09:31:57,919 DEBUG    client - event = data_received(<52 bytes>)
2021-08-06 09:31:57,919 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"resource":"/appliance/*/erd/*","kind":"websocket#subscription","success":true,"change":"ADDED"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:02,759 DEBUG    client - event = data_received(<60 bytes>)
2021-08-06 09:32:02,759 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C95D21C9","erd":"0x2007","time":"2021-08-06T14:32:00.953Z","value":"0827"},"resource":"/appliance/D828C95D21C9/erd/0x2007","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:02,759 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:34:47
2021-08-06 09:32:02,759 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER). Updated keys: ErdCode.LAUNDRY_TIME_REMAINING
2021-08-06 09:32:12,619 DEBUG    client - event = data_received(<21 bytes>)
2021-08-06 09:32:12,619 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C95D21C9","erd":"0x2007","time":"2021-08-06T14:32:11.194Z","value":"081D"},"resource":"/appliance/D828C95D21C9/erd/0x2007","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:12,619 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:34:37
2021-08-06 09:32:12,619 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER). Updated keys: ErdCode.LAUNDRY_TIME_REMAINING
2021-08-06 09:32:17,318 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\x0b\x0b\xc1\x93', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:17,341 DEBUG    client - event = data_received(<6 bytes>)
2021-08-06 09:32:17,341 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\x0b\x0b\xc1\x93', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:17,341 DEBUG    client - received solicited pong: 0b0bc193
2021-08-06 09:32:19,133 DEBUG    client - event = data_received(<34 bytes>)
2021-08-06 09:32:19,133 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C954A9AE","erd":"0x2012","time":"2021-08-06T14:32:17.442Z","value":"00"},"resource":"/appliance/D828C954A9AE/erd/0x2012","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:19,133 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.OPEN
2021-08-06 09:32:19,133 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER). Updated keys: ErdCode.LAUNDRY_DOOR
2021-08-06 09:32:22,806 DEBUG    client - event = data_received(<18 bytes>)
2021-08-06 09:32:22,806 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C95D21C9","erd":"0x2007","time":"2021-08-06T14:32:21.409Z","value":"0813"},"resource":"/appliance/D828C95D21C9/erd/0x2007","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:22,806 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:34:27
2021-08-06 09:32:22,806 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER). Updated keys: ErdCode.LAUNDRY_TIME_REMAINING
2021-08-06 09:32:25,008 DEBUG    client - event = data_received(<27 bytes>)
2021-08-06 09:32:25,008 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C954A9AE","erd":"0x2000","time":"2021-08-06T14:32:23.673Z","value":"01"},"resource":"/appliance/D828C954A9AE/erd/0x2000","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:25,008 DEBUG    Setting ErdCode.LAUNDRY_MACHINE_STATE to Standby
2021-08-06 09:32:25,008 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER). Updated keys: ErdCode.LAUNDRY_MACHINE_STATE
2021-08-06 09:32:27,312 DEBUG    Sending keepalive ping
2021-08-06 09:32:27,313 DEBUG    client > Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind": "websocket#ping", "id": "keepalive-ping", "action": "ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:27,341 DEBUG    client - event = data_received(<29 bytes>)
2021-08-06 09:32:27,341 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"kind":"websocket#pong","id":"keepalive-ping"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:31,813 DEBUG    client - event = data_received(<19 bytes>)
2021-08-06 09:32:31,819 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C95D21C9","erd":"0x2007","time":"2021-08-06T14:32:30.839Z","value":"0809"},"resource":"/appliance/D828C95D21C9/erd/0x2007","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:31,819 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:34:17
2021-08-06 09:32:31,819 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER). Updated keys: ErdCode.LAUNDRY_TIME_REMAINING
2021-08-06 09:32:33,028 DEBUG    client - event = data_received(<17 bytes>)
2021-08-06 09:32:33,028 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C954A9AE","erd":"0x2000","time":"2021-08-06T14:32:31.882Z","value":"00"},"resource":"/appliance/D828C954A9AE/erd/0x2000","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:33,028 DEBUG    Setting ErdCode.LAUNDRY_MACHINE_STATE to Off
2021-08-06 09:32:33,028 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER). Updated keys: ErdCode.LAUNDRY_MACHINE_STATE
2021-08-06 09:32:33,727 DEBUG    client - event = data_received(<19 bytes>)
2021-08-06 09:32:33,727 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C954A9AE","erd":"0x2012","time":"2021-08-06T14:32:32.868Z","value":"01"},"resource":"/appliance/D828C954A9AE/erd/0x2012","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:33,727 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.CLOSED
2021-08-06 09:32:33,727 DEBUG    Appliance state change detected in GeAppliance(D828C954A9AE) (ErdApplianceType.WASHER). Updated keys: ErdCode.LAUNDRY_DOOR
2021-08-06 09:32:37,347 DEBUG    client > Frame(fin=True, opcode=<Opcode.PING: 9>, data=b'\xeb\x9c\x984', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:37,357 DEBUG    client - event = data_received(<6 bytes>)
2021-08-06 09:32:37,372 DEBUG    client < Frame(fin=True, opcode=<Opcode.PONG: 10>, data=b'\xeb\x9c\x984', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:37,372 DEBUG    client - received solicited pong: eb9c9834
2021-08-06 09:32:41,903 DEBUG    client - event = data_received(<23 bytes>)
2021-08-06 09:32:41,911 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C95D21C9","erd":"0x2007","time":"2021-08-06T14:32:40.996Z","value":"07FF"},"resource":"/appliance/D828C95D21C9/erd/0x2007","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:41,911 DEBUG    Setting ErdCode.LAUNDRY_TIME_REMAINING to 0:34:07
2021-08-06 09:32:41,911 DEBUG    Appliance state change detected in GeAppliance(D828C95D21C9) (ErdApplianceType.DRYER). Updated keys: ErdCode.LAUNDRY_TIME_REMAINING

in particular lines 137:138 and 161:162:

...
2021-08-06 09:32:19,133 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C954A9AE","erd":"0x2012","time":"2021-08-06T14:32:17.442Z","value":"00"},"resource":"/appliance/D828C954A9AE/erd/0x2012","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:19,133 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.OPEN
...
2021-08-06 09:32:33,727 DEBUG    client < Frame(fin=True, opcode=<Opcode.TEXT: 1>, data=b'{"item":{"applianceId":"D828C954A9AE","erd":"0x2012","time":"2021-08-06T14:32:32.868Z","value":"01"},"resource":"/appliance/D828C954A9AE/erd/0x2012","kind":"publish#erd","userId":"a7o71pz52pf8cxi"}', rsv1=False, rsv2=False, rsv3=False)
2021-08-06 09:32:33,727 DEBUG    Setting ErdCode.LAUNDRY_DOOR to ErdLaundryDoorStatus.CLOSED
...

FR: Oven Set Temperature

Is it possible to have a sensor created with the temperature the oven is set to? This information is visible within the app, so I hope it's exposed to the api.

IE: When the oven is turned on, it defaults to being set to 350F. Can a sensor be generated to read that data?

I've tried making a template sensor that calculates the raw_temperature and user_temp_offset, but the user_temp_offset doesn't seem to update very quickly so the template sensor usually just ends up displaying the raw_temperature value.

Coffee Maker

@alexanv1, I've started integrating the coffee maker support into the "dev" branch, please give it a shot and let me know what you think.

Issue with Dishwasher

I'm getting this following error with my dishwasher. I have Cafe appliances and the Dishwasher had to be put on a different router because it will not connect to an Orbi router for some reason. Maybe thats it?? Either way, its happening 1000s of times.

Logger: gehomesdk.erd.converters.dishwasher.erd_user_setting_converter
Source: /usr/local/lib/python3.9/site-packages/gehomesdk/erd/converters/dishwasher/erd_user_setting_converter.py:40
First occurred: 10:30:21 AM (58 occurrences)
Last logged: 10:58:21 AM

Could not construct user setting, using default.
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/gehomesdk/erd/converters/dishwasher/erd_user_setting_converter.py", line 33, in erd_decode
wash_temp = UserWashTempSetting((i & 12288) >> 12),
File "/usr/local/lib/python3.9/enum.py", line 384, in call
return cls.new(cls, value)
File "/usr/local/lib/python3.9/enum.py", line 702, in new
raise ve_exc
ValueError: 3 is not a valid UserWashTempSetting

Oven does not show up

I have a GE Profile convection oven that does not show up under this integration. I have tried reinstalling the custom component, rebooting HA, and verifying the oven shows up in the SmartHQ app for GE. There is an error that keeps popping up in my HA log.

2021-07-28 05:19:46 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
  File "/config/custom_components/ge_home/update_coordinator.py", line 287, in on_device_initial_update
    self.maybe_add_appliance_api(appliance)
  File "/config/custom_components/ge_home/update_coordinator.py", line 121, in maybe_add_appliance_api
    api.build_entities_list()
  File "/config/custom_components/ge_home/devices/base.py", line 112, in build_entities_list
    e for e in self.get_all_entities()
  File "/config/custom_components/ge_home/devices/oven.py", line 34, in get_all_entities
    cooktop_config: ErdCooktopConfig = self.appliance.get_erd_value(ErdCode.COOKTOP_CONFIG)
  File "/usr/local/lib/python3.9/site-packages/gehomesdk/ge_appliance.py", line 119, in get_erd_value
    return self._property_cache[erd_code]
KeyError: <ErdCode.COOKTOP_CONFIG: '0x551c'>

Unknown Connection Failure

Login Screen

"Failed to connect"

Confirmed I can log into https://accounts.brillion.geappliances.com/consumer/active/home using same credentials.

Getting this error when trying use your HA addon

Logger: custom_components.ge_home.config_flow
Source: custom_components/ge_home/config_flow.py:33
Integration: ge_home (documentation)
First occurred: 5:44:43 PM (1 occurrences)
Last logged: 5:44:43 PM

Unknown connection failure
Traceback (most recent call last):
File "/config/custom_components/ge_home/config_flow.py", line 33, in validate_input
_ = await async_get_oauth2_token(session, data[CONF_USERNAME], data[CONF_PASSWORD])
File "/usr/local/lib/python3.9/site-packages/gehomesdk/clients/async_login_flows.py", line 55, in async_get_oauth2_token
code = parse_qs(urlparse(resp.headers['Location']).query)['code'][0]
KeyError: 'Location'

Write HA State Issues

Did a full deletion of the integration + entities. Re-did the integration.

Serials seem different:

image

Things seem to be working now!

Only remaining errors are:

2021-08-08 13:43:29 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 266, in on_device_update
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 457, in async_write_ha_state
raise RuntimeError(f"Attribute hass is None for {self}")
RuntimeError: Attribute hass is None for <Entity DS100880G Laundry Delay Time Remaining: >

2021-08-08 13:43:29 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 266, in on_device_update
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 457, in async_write_ha_state
raise RuntimeError(f"Attribute hass is None for {self}")
RuntimeError: Attribute hass is None for <Entity DS100880G Laundry Machine State: Off>

2021-08-08 13:43:32 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 266, in on_device_update
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 457, in async_write_ha_state
raise RuntimeError(f"Attribute hass is None for {self}")
RuntimeError: Attribute hass is None for <Entity SR371810N Laundry Delay Time Remaining: >

2021-08-08 13:43:32 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved
Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 266, in on_device_update
entity.async_write_ha_state()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 457, in async_write_ha_state
raise RuntimeError(f"Attribute hass is None for {self}")
RuntimeError: Attribute hass is None for <Entity SR371810N Laundry Delay Time Remaining: >

So:
Dryer.Delay Time
Dryer.State
Washer.State

Unsure if they're worth investigating in a different issue, because this one seems to be ready to close!

Originally posted by @steveredden in #28 (comment)

SW Version error when setting up GE Home Integration

I am getting the following error for SW Version for multiple entities when trying to install GE Home integration:

Logger: homeassistant.components.binary_sensor
Source: custom_components/ge_home/devices/base.py:84
Integration: Binary sensor (documentation, issues)

Error adding entities for domain binary_sensor with platform ge_home
Error while setting up ge_home platform for binary_sensor
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 383, in async_add_entities
await asyncio.gather(*tasks)
File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 458, in _async_add_entity
device_info = entity.device_info
File "/config/custom_components/ge_home/entities/common/ge_entity.py", line 25, in device_info
return self.api.device_info
File "/config/custom_components/ge_home/devices/base.py", line 84, in device_info
"sw_version": self.appliance.get_erd_value(ErdCode.APPLIANCE_SW_VERSION),
File "/usr/local/lib/python3.8/site-packages/gehomesdk/ge_appliance.py", line 119, in get_erd_value
return self._property_cache[erd_code]
KeyError: <ErdCode.APPLIANCE_SW_VERSION: '0x0103'>

Set-Up Failure (Auth Failure)

When performing component initialization I get the error pasted below. I have also tried the ge_kitchen component from ajmarks repository which does not have the authentication error. Same login info of course.
I've tried manual installation and HACS with no success. Anything ideas?

This error originated from a custom integration.

Logger: homeassistant.config_entries
Source: custom_components/ge_home/update_coordinator.py:155
Integration: GE Home (documentation)
First occurred: 4:12:48 PM (1 occurrences)
Last logged: 4:12:48 PM

Error setting up entry GE Home (******@gmail.com) for ge_home

Traceback (most recent call last):
File "/config/custom_components/ge_home/update_coordinator.py", line 153, in async_setup
await self.async_start_client()
File "/config/custom_components/ge_home/update_coordinator.py", line 172, in async_start_client
await self.async_begin_session()
File "/config/custom_components/ge_home/update_coordinator.py", line 182, in async_begin_session
await self.client.async_get_credentials(session)
File "/usr/local/lib/python3.8/site-packages/gehomesdk/clients/base_client.py", line 179, in async_get_credentials
await self.async_do_full_login_flow()
File "/usr/local/lib/python3.8/site-packages/gehomesdk/clients/base_client.py", line 183, in async_do_full_login_flow
self.credentials = await self._async_do_full_login_flow()
File "/usr/local/lib/python3.8/site-packages/gehomesdk/clients/websocket_client.py", line 61, in _async_do_full_login_flow
await self._async_get_oauth2_token()
File "/usr/local/lib/python3.8/site-packages/gehomesdk/clients/base_client.py", line 206, in _async_get_oauth2_token
oauth_token = await async_get_oauth2_token(self._session, self.account_username, self.account_password)
File "/usr/local/lib/python3.8/site-packages/gehomesdk/clients/async_login_flows.py", line 67, in async_get_oauth2_token
raise GeAuthFailedError(await resp.text())
gehomesdk.exception.ge_auth_failed_error.GeAuthFailedError: {
"error": "invalid_grant",
"error_description": "Invalid Authorization Code"
}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/config_entries.py", line 293, in async_setup
result = await component.async_setup_entry(hass, self) # type: ignore
File "/config/custom_components/ge_home/init.py", line 26, in async_setup_entry
if not await coordinator.async_setup():
File "/config/custom_components/ge_home/update_coordinator.py", line 155, in async_setup
raise HaAuthError('Authentication failure')
custom_components.ge_home.exceptions.HaAuthError: Authentication failure

Plan for supporting climate entities

I'm just wondering if you plan on supporting climate entities to allow setting mode and temps for an A/C? I installed the integration and configured it no problem. My A/C shows all the values, but I can't set them because they are all just sensors. I'm just wondering if you have any plans to implement support for climate too? Turning the power on and off as a switch works :)

Screen Shot 2021-09-01 at 4 49 42 PM

Light switches for ovens

The SmartHQ app allows for turning on and off of lights for the double oven but they don't seem to be found as entities.

Water Softener Support

What do I need to do to get the water softener setup?
Model GXSHC40N it shows in the phone app but not HA yet. :)

Where is this SDK repository that will offer debug? Nevermind I see and will post what I find

Switches for dishwasher Lock Controls and Sounds

Is it possible to create switch entities for "Lock Controls" and "Sounds" for dishwasher user settings? Below are logs from toggling within the GE Home app.

Dishwasher = GDF530PGM0CC

Lock Controls Enabled

Setting ErdCode.DISHWASHER_USER_SETTING to ErdUserSetting(sound=<UserSetting.DISABLE: 0>, lock_control=<UserSetting.ENABLE: 1>, sabbath=<UserSetting.DISABLE: 0>, cycle_mode=<UserCycleSetting.THIRTY_MIN: 4>, presoak=<UserSetting.ENABLE: 1>, bottle_jet=<UserSetting.DISABLE: 0>, wash_temp=<UserWashTempSetting.BOOST_AND_SANITIZE: 3>, dry_option=<UserDryOptionSetting.MAX_DRY: 2>, wash_zone=<UserWashZoneSetting.BOTH: 0>, delay_hours=4, raw_value='043B24')

Lock Controls Disabled

Setting ErdCode.DISHWASHER_USER_SETTING to ErdUserSetting(sound=<UserSetting.DISABLE: 0>, lock_control=<UserSetting.DISABLE: 0>, sabbath=<UserSetting.DISABLE: 0>, cycle_mode=<UserCycleSetting.THIRTY_MIN: 4>, presoak=<UserSetting.ENABLE: 1>, bottle_jet=<UserSetting.DISABLE: 0>, wash_temp=<UserWashTempSetting.BOOST_AND_SANITIZE: 3>, dry_option=<UserDryOptionSetting.MAX_DRY: 2>, wash_zone=<UserWashZoneSetting.BOTH: 0>, delay_hours=4, raw_value='043924')

Sounds Enabled

Setting ErdCode.DISHWASHER_USER_SETTING to ErdUserSetting(sound=<UserSetting.ENABLE: 1>, lock_control=<UserSetting.DISABLE: 0>, sabbath=<UserSetting.DISABLE: 0>, cycle_mode=<UserCycleSetting.THIRTY_MIN: 4>, presoak=<UserSetting.ENABLE: 1>, bottle_jet=<UserSetting.DISABLE: 0>, wash_temp=<UserWashTempSetting.BOOST_AND_SANITIZE: 3>, dry_option=<UserDryOptionSetting.MAX_DRY: 2>, wash_zone=<UserWashZoneSetting.BOTH: 0>, delay_hours=4, raw_value='843924')

Sounds Disabled

Setting ErdCode.DISHWASHER_USER_SETTING to ErdUserSetting(sound=<UserSetting.DISABLE: 0>, lock_control=<UserSetting.DISABLE: 0>, sabbath=<UserSetting.DISABLE: 0>, cycle_mode=<UserCycleSetting.THIRTY_MIN: 4>, presoak=<UserSetting.ENABLE: 1>, bottle_jet=<UserSetting.DISABLE: 0>, wash_temp=<UserWashTempSetting.BOOST_AND_SANITIZE: 3>, dry_option=<UserDryOptionSetting.MAX_DRY: 2>, wash_zone=<UserWashZoneSetting.BOTH: 0>, delay_hours=4, raw_value='043924')

AC Temperature sensor in Fahrenheit and not Celsius

Hi,

i open this support, because i make a fresh HA installation, and i see with last ha_gehome-0.5.0-dev3, ( i didn't remember if is already present in previous version ), that there are 2 temperature sensor, in Fahrenheit and not Celsius.

On app, ( Geappliances in europe, SmartHQ in US ) is already setup Celsius.

I remember that was a know issue, when we tested first time the integration.

image
sensor.d_ac_ambient_temperature
sensor.d_ac_target_temperature
note. you can see C, but it isn't, because if in my house there was 84 Celsius, i was dead ;)

Should be great if get from app celsius and not Fahrenheit , or when you import any devices, to choose from f to c or viceversa.

Thanks for the amazing support and integration!

Nothing being discovered

I just installed manually and everything went fine and I connected my account, however it didn't discover anything. I have the whole home water softener in my Smart HQ app but it's not showing as a device in the GE Home integration in Home Assistant
image

Washer and Dryer showing as Unavailable after several hours of working

Woke up this morning to seeing the entity statuses for both my washer and dryer show as unavailable. The only errors logged in HA are below:

Logger: aiohttp.server
Source: /usr/local/lib/python3.8/site-packages/aiohttp/web_protocol.py:393
First occurred: 8:16:54 AM (52 occurrences)
Last logged: 8:21:39 AM

Error handling request
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 314, in data_received
messages, upgraded, tail = self._request_parser.feed_data(data)
File "aiohttp/_http_parser.pyx", line 546, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.BadStatusLine: 400, message="Bad status line 'invalid HTTP method'"

Code change help for oven?

Hey, the integration looks good overall but I have something Id like to change if you can point me in the right direction. The home assistant integration into HomeKit lets me see and change the temp of the oven but wont turn it off. The low limit is 170 and high limit is in the 500s. So im wondering If I can change the lower limit to 0? Or if theres simply a way to add an off button.

Thanks

Error with GE Home with Cafe Oven

I'm getting the following error when setting up my oven.

`This error originated from a custom integration.

Logger: custom_components.ge_home.config_flow
Source: custom_components/ge_home/config_flow.py:33
Integration: GE Home (documentation)
First occurred: 7:32:13 AM (2 occurrences)
Last logged: 8:03:10 AM

Unknown connection failure
Traceback (most recent call last):
File "/config/custom_components/ge_home/config_flow.py", line 33, in validate_input
_ = await async_get_oauth2_token(session, data[CONF_USERNAME], data[CONF_PASSWORD])
File "/usr/local/lib/python3.8/site-packages/gehomesdk/clients/async_login_flows.py", line 55, in async_get_oauth2_token
code = parse_qs(urlparse(resp.headers['Location']).query)['code'][0]
KeyError: 'Location'
`

I'm getting some warning about sabbath switch also, but I think it may be related to this.

`Logger: homeassistant.helpers.service
Source: helpers/service.py:128
First occurred: 7:39:08 AM (2 occurrences)
Last logged: 7:39:11 AM

Unable to find referenced entities switch.shvh173907p_sabbath_mode`

I also have the following warning.

`Logger: slixmpp.stringprep
Source: /usr/local/lib/python3.8/site-packages/slixmpp/stringprep.py:120
First occurred: 7:15:43 AM (1 occurrences)
Last logged: 7:15:43 AM

Using slower stringprep, consider compiling the faster cython/libidn one.`

FYI, I'm running this in docker and installed HACS through the docker container. The oven controls are also coming up as water heater controls.

Enhancements for GE PVD28BYNFS Refrigerator

Hi

Through the GE SmartHQ app I have a few other items that this integration doesn't have. Would it be possible to add any of these?

My fridge (GE Model PVD28BYNFS) has the following options in the app that are not already covered by the integration:

-Convertible drawer (the middle drawer can change to 4 different temp settings for Meat (29 F), Beverages (33 F), Snacks (37 F), or Wine (42 F). This one is the most important because the current door status indicator on this component doesn't even recognize that the middle drawer on this fridge exists.

-Lighting preference - 0%-100% slider for the LED backlighting brightness inside the refrigerator.

-Lighting preference - turn off or on proximity light that enables the light under water dispenser

Thanks!!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.