ESPHome-gea — GE Appliances on the local bus (dishwasher, washer, dryer, oven)

Connect your GE appliances to Home Assistant — no cloud, fully local

Hi everyone! I’ve been working on an ESPHome external component that lets you
monitor and control GE appliances (dishwasher, washer, dryer, oven) via the
GEA3 serial bus — the built-in service port found on most modern GE/GE Profile
appliances. No SmartHQ account, no cloud dependency, 100% local.

How it works

Wire a cheap ESP32 into your appliance’s service port. The component reads and
writes every data point on the bus — door state, cycle name, water temperature,
time remaining, error codes, and more — and exposes them to Home Assistant as
standard entities.

Each piece of data is identified by a 16-bit ERD (Entity Reference
Designator). The component automatically logs every ERD it sees on boot, so
reverse-engineering a new appliance is straightforward.

Features

  • Read & write — sensors, switches, selects, numbers, buttons, text sensors, binary sensors
  • Auto-discovery — every ERD on the bus is logged on boot
  • Resilient — periodic re-subscription recovers state after appliance power cycles
  • Flexible decoding — 13 numeric types, raw hex, ASCII, enum option maps
  • Edge-triggered automationson_erd_change fires on rising/falling/any transitions
  • Bus health diagnostics — CRC errors, TX retries, dropped requests, connection status

Hardware

You need an ESP32 and an adapter to tap into the appliance’s GEA3 jack:

  • mulcmu/esphome-ge-laundry-uart — open hardware (KiCad + gerbers), big thanks to @mulcmu whose reverse-engineering work made this possible
  • FirstBuild GEA adapter — commercial option, no soldering required

Tested on the Seeed XIAO ESP32-C3 (compact, 3.3 V, native USB).

Quick start

external_components:
  - source: github://mguaylam/esphome-gea
    components: [gea]

uart:
  id: uart_gea
  tx_pin: GPIO21
  rx_pin: GPIO20
  baud_rate: 230400

gea:
  id: gea_hub
  uart_id: uart_gea

binary_sensor:
  - platform: gea
    gea_id: gea_hub
    name: "Door"
    erd: 0x2012
    bitmask: 0x01
    device_class: door

Tested appliances

Config Appliance
PDP715SYV0FS.yaml GE PDP715SYV0FS dishwasher
PFQ97HSPVDS.yaml GE PFQ97HSPVDS Ultrafast Combo washer

Got a working config for another appliance? PRs welcome!

Links

3 Likes

Nice work!

I’ve got a FirstBuild GEA adapter on my dishwasher, and using their HACS integration, but will definitely check out your component. Could help me avoid getting buried with ALL the entities – there are a BUNCH showing up in HA on dishwasher.

I will certainly consider plugging your ESP into one or more of my three GE appliances that are already factory-built “smart” --but cloud-based. Will be interesting to see what info they’re putting on the GEA3 bus but not surfacing in the mobile app, and/or what appears in current HACS “SmartHQ” integration. Certainly would be nice to keep all local.

One question: any chance you can do something similar for GEA2 ? My fridge is the only GE appliance I’ve got for which I can’t get data. I’d certainly be willing to test.

Nice work! I don’t have any GE appliances, but knowing there’s something like this available would seriously tip the scales when I do go to buy.

3 Likes

My PCB has the hardware needed to support GEA2. I’ve been using it for a GEA2 dryer with esphome (external component for GEA2 in same repo as the PCB).

1 Like

I’ve implemented GEA2, let me know if it work or not. I can’t test this.

I’ve procured 5 of the mulcmu adapters and I also have 1 of the firstbuild adapters. I have 5 appliances that are all GEA2. The 1 firstbuild adapter I have working, but haven’t yet been successful getting any of the mulcmu adapters to work. So far I have only tried the geappliances fork that works for GEA2, and haven’t tried your ESPHome code. Hopefully will get a chance to mess with it more next weekend.

1 Like

Im curious what are those GEA2 devices and how old they are?

Washer & dryer which are about 8 years old, and then fridge, dishwasher, and oven which were left by the previous homeowner but looked relatively new at the time so probably 10 years old. There is a GE microwave too which I haven’t checked to see if it can be connected, but I don’t really have much interest in any data from it either.

Nice. Can’t wait to see if my stuff works.
I wanted a microwave from GE so bad since I’m annoyed to set the time when the power cut off. Lucky you.

Just looking through your docs, noticed that you don’t specify the pins for GEA2. Under wiring and also in the hub doc, the GEA2 wiring should be 10 & 9 (Rx&Tx) for the firstbuild adapter.

uart:
  id: uart_gea
  tx_pin: GPIO9
  rx_pin: GPIO10
  baud_rate: 19200

Since I haven’t got the mulcmu adapter working yet I can’t confirm but per the schematic it is set up for 10 & 5 (Rx&Tx) with a solder bridge jumper that can connect 9 to the Tx.

Another suggestion is for GEA2 you could do what the GEA2 fork of the home assistant adapter software will do on first connect: It will find out what appliance type it is connected to, and then poll every ERD that appliance could potentially use. After about 30-45 minutes, it will have run through every potential ERD and it stores the the ones that responded in flash memory. From that point forward, it just continually polls the ones in memory.

I agree with the proposed enhancements.

I’ll add pin documentation.

I’m also adding scanning of the legacy ERDs, Should be around 2000 of them.

2 Likes

Hello, I got a firstbuild adapter last week and I am trying to integrate with a US-specific GE 50 gallon water heater. My model is PF50S10FPY but from my understanding, all the latest generation models are identical and speak GEA3 natively. This model is listed as compatible

I wanted to try the esphome method first since the official integration looks very heavy. I uploaded this config to try out:

esp32:
  board: seeed_xiao_esp32c3
  framework:
    type: esp-idf

external_components:
  - source: github://mguaylam/esphome-gea
    components: [gea]

logger:
  level: DEBUG

api:
  encryption:
    key: !secret api_key

ota:
  - platform: esphome
    password: !secret ota_pw

web_server:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  domain: .sarath.co
  ap:
    ssid: "ge-dishwasher fallback"
    password: !secret fallback_pw
  on_connect:
    - output.turn_on: led_wifi
  on_disconnect:
    - output.turn_off: led_wifi

# ---------------------------------------------------------------------------
# Status LEDs
# ---------------------------------------------------------------------------
status_led:
  pin: GPIO2

output:
  - platform: gpio
    pin: GPIO3
    id: led_wifi
  - platform: gpio
    pin: GPIO4
    id: led_gea

interval:
  - interval: 1s
    then:
      - if:
          condition:
            lambda: return id(gea_hub).is_bus_connected();
          then:
            - output.turn_on: led_gea
          else:
            - output.turn_off: led_gea

# ---------------------------------------------------------------------------
# UART — GEA3 full-duplex, 230400 baud
# ---------------------------------------------------------------------------
uart:
  id: uart_gea
  tx_pin: GPIO21
  rx_pin: GPIO20
  baud_rate: 230400
  data_bits: 8
  stop_bits: 1
  parity: NONE
  rx_buffer_size: 512

# ---------------------------------------------------------------------------
# GEA3 hub
# ---------------------------------------------------------------------------
gea:
  id: gea_hub
  uart_id: uart_gea
  src_address: 0xE4
  erd_lookup: true

The device connects to my water heater, but I am getting back ERDs that are very off. From the startup logs:

[07:41:12.550][C][logger:219]: Logger:
[07:41:12.550][C][logger:219]:   Max Level: DEBUG
[07:41:12.550][C][logger:219]:   Initial Level: DEBUG
[07:41:12.557][C][logger:226]:   Log Baud Rate: 115200
[07:41:12.557][C][logger:226]:   Hardware UART: USB_SERIAL_JTAG
[07:41:12.557][C][logger:235]:   Task Log Buffer Size: 768 bytes
[07:41:12.591][C][uart.idf:254]: UART Bus 0:
[07:41:12.591][C][uart.idf:152]:   TX Pin: GPIO21
[07:41:12.591][C][uart.idf:152]:   RX Pin: GPIO20
[07:41:12.591][C][uart.idf:259]:   RX Buffer Size: 512
[07:41:12.591][C][uart.idf:259]:   RX Full Threshold: 120
[07:41:12.591][C][uart.idf:259]:   RX Timeout: 2
[07:41:12.592][C][uart.idf:268]:   Baud Rate: 230400 baud
[07:41:12.592][C][uart.idf:268]:   Data Bits: 8
[07:41:12.592][C][uart.idf:268]:   Parity: NONE
[07:41:12.592][C][uart.idf:268]:   Stop bits: 1
[07:41:12.592][C][uart.idf:268]:   Wake on data RX: ENABLED
[07:41:12.592][C][gea:316]: GEA Component:
[07:41:12.592][C][gea:317]:   Protocol: GEA3
[07:41:12.593][C][gea:321]:   Dest address: 0x6F
[07:41:12.593][C][gea:323]:   Src address:  0xE4
[07:41:12.798][C][gea:344]:   Discovered ERDs (73):
[07:41:12.798][C][gea:361]:     0x0001  Model Number                              [string]  raw=0000000000000000000000000000000000000000000000000000000000000000  val=""
[07:41:12.798][C][gea:361]:     0x0030  Ready to Enter Boot Loader                [enum]  raw=03  val=3
[07:41:12.798][C][gea:355]:     0x0031  (unknown)  raw=00000000
[07:41:12.799][C][gea:361]:     0x0032  Reset Board                               [u8]  raw=00  val=0
[07:41:12.799][C][gea:361]:     0x0038  Supported Image Types                     [enum/enum/enum/enum/u8]  raw=03  val=3////
[07:41:12.799][C][gea:361]:     0x0039  Boot Loader Version                       [u8/u8/u8/u8]  raw=0100010A  val=1/0/1/10
[07:41:12.799][C][gea:361]:     0x003A  Application Version                       [u8/u8/u8/u8]  raw=0100011E  val=1/0/1/30
[07:41:12.799][C][gea:361]:     0x003B  Parametric Version                        [u8/u8/u8/u8]  raw=00000000  val=0/0/0/0
[07:41:12.799][C][gea:361]:     0x003C  Auxiliary Version                         [u8/u8/u8/u8]  raw=00000000  val=0/0/0/0
[07:41:12.800][C][gea:355]:     0x007F  (unknown)  raw=957A6D83F72CAABC68F5170C37371C5D67C22037
[07:41:12.800][C][gea:355]:     0x0092  (unknown)  raw=0000000100000004
[07:41:12.800][C][gea:355]:     0xF000  (unknown)  raw=00
[07:41:12.800][C][gea:355]:     0xF001  (unknown)  raw=00
[07:41:12.800][C][gea:355]:     0xF002  (unknown)  raw=00
[07:41:12.800][C][gea:355]:     0xF003  (unknown)  raw=00
[07:41:12.801][C][gea:355]:     0xF004  (unknown)  raw=01
[07:41:12.801][C][gea:355]:     0xF010  (unknown)  raw=00
[07:41:12.801][C][gea:355]:     0xF011  (unknown)  raw=0F
[07:41:12.801][C][gea:355]:     0xF020  (unknown)  raw=01
[07:41:12.801][C][gea:355]:     0xF021  (unknown)  raw=0F
[07:41:12.802][C][gea:355]:     0xF022  (unknown)  raw=4E
[07:41:12.802][C][gea:355]:     0xF030  (unknown)  raw=41000000
[07:41:12.802][C][gea:355]:     0xF031  (unknown)  raw=00000262
[07:41:12.802][C][gea:355]:     0xF032  (unknown)  raw=00000097
[07:41:12.802][C][gea:355]:     0xF033  (unknown)  raw=000004C4
[07:41:12.803][C][gea:355]:     0xF034  (unknown)  raw=000002F9
[07:41:12.803][C][gea:355]:     0xF040  (unknown)  raw=00000000
[07:41:12.803][C][gea:355]:     0xF100  (unknown)  raw=0000
[07:41:12.803][C][gea:355]:     0xF101  (unknown)  raw=32
[07:41:12.803][C][gea:355]:     0xF102  (unknown)  raw=04E2
[07:41:12.803][C][gea:355]:     0xF103  (unknown)  raw=04E2
[07:41:12.804][C][gea:355]:     0xF104  (unknown)  raw=04C0
[07:41:12.804][C][gea:355]:     0xF105  (unknown)  raw=007A
[07:41:12.804][C][gea:355]:     0xF106  (unknown)  raw=0000
[07:41:12.804][C][gea:355]:     0xF107  (unknown)  raw=000000010039CE37
[07:41:12.804][C][gea:355]:     0xF108  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000
[07:41:12.805][C][gea:355]:     0xF109  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000
[07:41:12.805][C][gea:355]:     0xF10A  (unknown)  raw=0001E410
[07:41:12.805][C][gea:355]:     0xF10B  (unknown)  raw=08010126
[07:41:12.805][C][gea:355]:     0xF10C  (unknown)  raw=04B4
[07:41:12.805][C][gea:355]:     0xF10D  (unknown)  raw=00
[07:41:12.805][C][gea:355]:     0xF10E  (unknown)  raw=04E2
[07:41:12.806][C][gea:355]:     0xF10F  (unknown)  raw=69FB386BFE5C0314
[07:41:12.806][C][gea:355]:     0xF110  (unknown)  raw=00000000
[07:41:12.806][C][gea:355]:     0xF111  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[07:41:12.806][C][gea:355]:     0xF113  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[07:41:12.806][C][gea:355]:     0xF115  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[07:41:12.842][C][gea:355]:     0xF117  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

I am unable to read the model number which I think should have been populated, and almost none of the ERDs from the official firmware's yaml

I am probably doing something wrong here. Is there anything in my setup that looks odd?

Try 0xBE for source address.

Thanks @mulcmu . The logs look roughly the same:

[11:37:26.888][W][component:522]: api took a long time for an operation (56 ms), max is 30 ms
[11:37:26.890][I][app:154]: ESPHome version 2026.4.4 compiled on 2026-05-08 11:36:48 -0700
[11:37:26.891][I][app:156]: Project GE.PF50S10FPY01 version 1.0.0
[11:37:26.891][I][app:161]: ESP32 Chip: ESP32-C3 rev0.4, 1 core(s)
[11:37:26.891][C][logger:219]: Logger:
[11:37:26.891][C][logger:219]:   Max Level: DEBUG
[11:37:26.891][C][logger:219]:   Initial Level: DEBUG
[11:37:26.892][C][logger:226]:   Log Baud Rate: 115200
[11:37:26.892][C][logger:226]:   Hardware UART: USB_SERIAL_JTAG
[11:37:26.892][C][logger:235]:   Task Log Buffer Size: 768 bytes
[11:37:26.892][D][api.connection:2409]: Home Assistant 2026.5.0 (192.168.1.14): connected
[11:37:26.902][C][uart.idf:254]: UART Bus 0:
[11:37:26.911][C][uart.idf:152]:   TX Pin: GPIO21
[11:37:26.912][C][uart.idf:152]:   RX Pin: GPIO20
[11:37:26.912][C][uart.idf:259]:   RX Buffer Size: 512
[11:37:26.912][C][uart.idf:259]:   RX Full Threshold: 120
[11:37:26.912][C][uart.idf:259]:   RX Timeout: 2
[11:37:26.922][C][uart.idf:268]:   Baud Rate: 230400 baud
[11:37:26.922][C][uart.idf:268]:   Data Bits: 8
[11:37:26.922][C][uart.idf:268]:   Parity: NONE
[11:37:26.922][C][uart.idf:268]:   Stop bits: 1
[11:37:26.922][C][uart.idf:268]:   Wake on data RX: ENABLED
[11:37:26.926][D][gea:713]: RX: STX — frame started
[11:37:26.927][D][gea:762]: Ignoring packet for 0xE4 (we are 0xBE)
[11:37:26.927][D][gea:713]: RX: STX — frame started
[11:37:26.932][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14
[11:37:26.933][C][gea:316]: GEA Component:
[11:37:26.933][C][gea:317]:   Protocol: GEA3
[11:37:26.934][C][gea:321]:   Dest address: 0x6F
[11:37:26.940][C][gea:323]:   Src address:  0xBE
[11:37:27.026][C][gea:344]:   Discovered ERDs (73):
[11:37:27.027][C][gea:361]:     0x0001  Model Number                              [string]  raw=0000000000000000000000000000000000000000000000000000000000000000  val=""
[11:37:27.028][C][gea:361]:     0x0030  Ready to Enter Boot Loader                [enum]  raw=03  val=3
[11:37:27.034][C][gea:355]:     0x0031  (unknown)  raw=00000000
[11:37:27.035][C][gea:361]:     0x0032  Reset Board                               [u8]  raw=00  val=0
[11:37:27.035][C][gea:361]:     0x0038  Supported Image Types                     [enum/enum/enum/enum/u8]  raw=03  val=3////
[11:37:27.035][C][gea:361]:     0x0039  Boot Loader Version                       [u8/u8/u8/u8]  raw=0100010A  val=1/0/1/10
[11:37:27.041][C][gea:361]:     0x003A  Application Version                       [u8/u8/u8/u8]  raw=0100011E  val=1/0/1/30
[11:37:27.042][C][gea:361]:     0x003B  Parametric Version                        [u8/u8/u8/u8]  raw=00000000  val=0/0/0/0
[11:37:27.042][C][gea:361]:     0x003C  Auxiliary Version                         [u8/u8/u8/u8]  raw=00000000  val=0/0/0/0
[11:37:27.042][C][gea:355]:     0x007F  (unknown)  raw=957A6D83F72CAABC68F5170C37371C5D67C22037
[11:37:27.047][C][gea:355]:     0x0092  (unknown)  raw=0000000100000004
[11:37:27.048][C][gea:355]:     0xF000  (unknown)  raw=00
[11:37:27.048][C][gea:355]:     0xF001  (unknown)  raw=00
[11:37:27.050][C][gea:355]:     0xF002  (unknown)  raw=00
[11:37:27.056][C][gea:355]:     0xF003  (unknown)  raw=00
[11:37:27.056][C][gea:355]:     0xF004  (unknown)  raw=01
[11:37:27.057][C][gea:355]:     0xF010  (unknown)  raw=00
[11:37:27.059][C][gea:355]:     0xF011  (unknown)  raw=0F
[11:37:27.065][C][gea:355]:     0xF020  (unknown)  raw=01
[11:37:27.065][C][gea:355]:     0xF021  (unknown)  raw=0F
[11:37:27.070][C][gea:355]:     0xF022  (unknown)  raw=3C
[11:37:27.071][C][gea:355]:     0xF030  (unknown)  raw=41000000
[11:37:27.096][C][gea:355]:     0xF031  (unknown)  raw=00000262
[11:37:27.097][C][gea:355]:     0xF032  (unknown)  raw=00000076
[11:37:27.097][C][gea:355]:     0xF033  (unknown)  raw=000004C4
[11:37:27.097][C][gea:355]:     0xF034  (unknown)  raw=000002D8
[11:37:27.097][C][gea:355]:     0xF040  (unknown)  raw=00000000
[11:37:27.097][C][gea:355]:     0xF100  (unknown)  raw=0000
[11:37:27.097][C][gea:355]:     0xF101  (unknown)  raw=32
[11:37:27.097][C][gea:355]:     0xF102  (unknown)  raw=04E2
[11:37:27.098][C][gea:355]:     0xF103  (unknown)  raw=04E2
[11:37:27.098][C][gea:355]:     0xF104  (unknown)  raw=04D0
[11:37:27.098][C][gea:355]:     0xF105  (unknown)  raw=007D
[11:37:27.100][C][gea:355]:     0xF106  (unknown)  raw=0000
[11:37:27.100][C][gea:355]:     0xF107  (unknown)  raw=000000010039CE37
[11:37:27.100][C][gea:355]:     0xF108  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000
[11:37:27.100][C][gea:355]:     0xF109  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000
[11:37:27.100][C][gea:355]:     0xF10A  (unknown)  raw=0001F13B
[11:37:27.103][C][gea:355]:     0xF10B  (unknown)  raw=08010126
[11:37:27.104][C][gea:355]:     0xF10C  (unknown)  raw=04B6
[11:37:27.104][C][gea:355]:     0xF10D  (unknown)  raw=00
[11:37:27.104][C][gea:355]:     0xF10E  (unknown)  raw=04E2
[11:37:27.117][C][gea:355]:     0xF10F  (unknown)  raw=69FE066AFE5C0525
[11:37:27.118][C][gea:355]:     0xF110  (unknown)  raw=00000000
[11:37:27.118][C][gea:355]:     0xF111  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.118][C][gea:355]:     0xF113  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.123][C][gea:355]:     0xF115  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.124][C][gea:355]:     0xF117  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.124][C][gea:355]:     0xF119  (unknown)  raw=00
[11:37:27.124][C][gea:355]:     0xF11A  (unknown)  raw=00
[11:37:27.132][C][gea:355]:     0xF11B  (unknown)  raw=00
[11:37:27.133][C][gea:355]:     0xF11C  (unknown)  raw=00
[11:37:27.133][C][gea:355]:     0xF11D  (unknown)  raw=00000000
[11:37:27.133][C][gea:355]:     0xF200  (unknown)  raw=B403
[11:37:27.140][C][gea:355]:     0xF400  (unknown)  raw=203718060805264120FE5C
[11:37:27.141][C][gea:355]:     0xF401  (unknown)  raw=01
[11:37:27.141][C][gea:355]:     0xF402  (unknown)  raw=69FCED42FE5C00FF
[11:37:27.141][C][gea:355]:     0xF403  (unknown)  raw=FF
[11:37:27.146][C][gea:355]:     0xF500  (unknown)  raw=0CAB
[11:37:27.147][C][gea:355]:     0xF501  (unknown)  raw=01
[11:37:27.147][C][gea:355]:     0xF600  (unknown)  raw=00
[11:37:27.147][C][gea:355]:     0xF700  (unknown)  raw=00
[11:37:27.155][C][gea:355]:     0xF701  (unknown)  raw=00
[11:37:27.156][C][gea:355]:     0xF702  (unknown)  raw=00
[11:37:27.156][C][gea:355]:     0xF703  (unknown)  raw=00
[11:37:27.156][C][gea:355]:     0xF704  (unknown)  raw=00
[11:37:27.166][C][gea:355]:     0xF705  (unknown)  raw=00
[11:37:27.167][C][gea:355]:     0xF706  (unknown)  raw=00
[11:37:27.167][C][gea:355]:     0xF800  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.167][C][gea:355]:     0xF801  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.174][C][gea:355]:     0xF802  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.175][C][gea:355]:     0xF803  (unknown)  raw=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[11:37:27.175][C][gea:355]:     0xF804  (unknown)  raw=00000000
[11:37:27.199][D][gea:713]: RX: STX — frame started
[11:37:27.200][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14

I also see this in the messages now, so I think perhaps the previous src address was right?

[11:41:27.849][D][gea:713]: RX: STX — frame started
[11:41:27.849][D][gea:762]: Ignoring packet for 0xE4 (we are 0xBE)
[11:41:27.849][D][gea:713]: RX: STX — frame started
[11:41:27.849][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14
[11:41:28.066][D][gea:713]: RX: STX — frame started
[11:41:28.093][D][gea:779]: Valid packet: src=0xC0 cmd=0xA6 len=44
[11:41:28.093][D][gea:713]: RX: STX — frame started
[11:41:28.093][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14

Ha, I don't think I can win this one :slight_smile: I looked at the logs carefully, and this is what I see if I switch back to src_address: 0xE4

[11:43:57.234][S][sensor]: 'Model Number' >> 0 
[11:43:57.340][D][gea:713]: RX: STX — frame started
[11:43:57.365][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14
[11:43:57.576][D][gea:713]: RX: STX — frame started
[11:43:57.577][D][gea:779]: Valid packet: src=0xC0 cmd=0xA6 len=44
[11:43:57.592][D][gea:713]: RX: STX — frame started
[11:43:57.596][D][gea:762]: Ignoring packet for 0xBE (we are 0xE4)
[11:43:57.596][D][gea:713]: RX: STX — frame started
[11:43:57.596][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14
[11:43:57.677][S][sensor]: 'Model Number' >> 0 
[11:43:57.839][D][gea:713]: RX: STX — frame started
[11:43:57.845][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14
[11:43:58.082][D][gea:713]: RX: STX — frame started
[11:43:58.082][D][gea:779]: Valid packet: src=0xC0 cmd=0xA6 len=44
[11:43:58.094][D][gea:713]: RX: STX — frame started
[11:43:58.101][D][gea:762]: Ignoring packet for 0xBE (we are 0xE4)
[11:43:58.101][D][gea:713]: RX: STX — frame started
[11:43:58.102][D][gea:779]: Valid packet: src=0x6F cmd=0xA6 len=14

Looks like both 6F and C0 are sending status updates to two addresses you tried for the adapter E4 and BE. The E4 address was used in the example docs but it is close to the E0 to E3 control bytes used for the protocol. The wifi adapters seem to use addresses that start with 0xB_

Did you get anything in the logs for ERDS from 0xC0? Did the 0x6F get auto identified by the esphome code, I didn't see it in the yaml. Try adding dest_address: 0xC0 to the GEA hub.

Thank you. This was the missing link.
I am getting back ERDs that definitely belong to a water heater. The model and serial are blank, but I see several non-empty values that I can play with. Thanks! Let me see if I can get a good enough template and I'll submit the changes back to the repo.

[13:03:55.486][D][gea:713]: RX: STX — frame started
[13:03:55.490][D][gea:779]: Valid packet: src=0xC0 cmd=0xA6 len=14
[13:03:55.491][I][app:154]: ESPHome version 2026.4.4 compiled on 2026-05-08 12:56:30 -0700
[13:03:55.491][I][app:156]: Project GE.PF50S10FPY01 version 1.0.0
[13:03:55.502][I][app:161]: ESP32 Chip: ESP32-C3 rev0.4, 1 core(s)
[13:03:55.503][C][logger:219]: Logger:
[13:03:55.503][C][logger:219]:   Max Level: DEBUG
[13:03:55.503][C][logger:219]:   Initial Level: DEBUG
[13:03:55.503][C][logger:226]:   Log Baud Rate: 115200
[13:03:55.503][C][logger:226]:   Hardware UART: USB_SERIAL_JTAG
[13:03:55.503][C][logger:235]:   Task Log Buffer Size: 768 bytes
[13:03:55.531][C][uart.idf:254]: UART Bus 0:
[13:03:55.533][C][uart.idf:152]:   TX Pin: GPIO21
[13:03:55.534][C][uart.idf:152]:   RX Pin: GPIO20
[13:03:55.534][C][uart.idf:259]:   RX Buffer Size: 512
[13:03:55.534][C][uart.idf:259]:   RX Full Threshold: 120
[13:03:55.534][C][uart.idf:259]:   RX Timeout: 2
[13:03:55.534][C][uart.idf:268]:   Baud Rate: 230400 baud
[13:03:55.534][C][uart.idf:268]:   Data Bits: 8
[13:03:55.534][C][uart.idf:268]:   Parity: NONE
[13:03:55.534][C][uart.idf:268]:   Stop bits: 1
[13:03:55.534][C][uart.idf:268]:   Wake on data RX: ENABLED
[13:03:55.534][C][gea:316]: GEA Component:
[13:03:55.534][C][gea:317]:   Protocol: GEA3
[13:03:55.534][C][gea:321]:   Dest address: 0xC0
[13:03:55.534][C][gea:323]:   Src address:  0xE4
[13:03:55.534][C][gea:327]:   Registered entities: 1
[13:03:55.535][C][gea:329]:     ERD 0x0001
[13:03:55.535][C][gea:344]:   Discovered ERDs (142):
[13:03:55.535][C][gea:361]:     0x0001  Model Number                              [string]  raw=0000000000000000000000000000000000000000000000000000000000000000  val=""
[13:03:55.535][C][gea:361]:     0x0002  Serial Number                             [string]  raw=0000000000000000000000000000000000000000000000000000000000000000  val=""
[13:03:55.536][C][gea:361]:     0x0005  Clock Time                                [u8/u8/u8]  raw=0D033A  val=13/3/58
[13:03:55.536][C][gea:361]:     0x0007  Temperature Display Units                 [enum]  raw=00  val=0
[13:03:55.544][C][gea:361]:     0x0008  Appliance Type                            [enum]  raw=00  val=0
[13:03:55.545][C][gea:361]:     0x000A  Sound Level                               [enum]  raw=03  val=3
[13:03:55.545][C][gea:361]:     0x0032  Reset Board                               [u8]  raw=00  val=0
[13:03:55.547][C][gea:355]:     0x0033  (unknown)  raw=00000000000000000000000000000000000000000000
[13:03:55.553][C][gea:361]:     0x0035  Personality (32-bit)                      [u32]  raw=00000011  val=17
[13:03:55.554][C][gea:361]:     0x0036  Service Mode State Request                [enum]  raw=00  val=0
[13:03:55.554][C][gea:361]:     0x0037  Service Mode State                        [enum]  raw=00  val=0
[13:03:55.558][C][gea:361]:     0x0038  Supported Image Types                     [enum/enum/enum/enum/u8]  raw=07  val=7////
[13:03:55.570][C][gea:361]:     0x0039  Boot Loader Version                       [u8/u8/u8/u8]  raw=0100010A  val=1/0/1/10
[13:03:55.571][C][gea:361]:     0x003A  Application Version                       [u8/u8/u8/u8]  raw=08010126  val=8/1/1/38
[13:03:55.571][C][gea:361]:     0x003B  Parametric Version                        [u8/u8/u8/u8]  raw=FFFFFFFF  val=255/255/255/255
[13:03:55.571][C][gea:361]:     0x003C  Auxiliary Version                         [u8/u8/u8/u8]  raw=00000000  val=0/0/0/0
[13:03:55.575][C][gea:355]:     0x003D  (unknown)  raw=0000270F
[13:03:55.576][C][gea:355]:     0x003E  (unknown)  raw=270F
[13:03:55.576][C][gea:355]:     0x003F  (unknown)  raw=000F423F
[13:03:55.576][C][gea:355]:     0x0041  (unknown)  raw=00
[13:03:55.581][C][gea:355]:     0x004E  (unknown)  raw=01
[13:03:55.582][C][gea:361]:     0x004F  Enhanced Sabbath Mode Status              [enum]  raw=00  val=0
[13:03:55.582][C][gea:355]:     0x0052  (unknown)  raw=00
[13:03:55.591][C][gea:355]:     0x0053  (unknown)  raw=00
[13:03:55.595][C][gea:355]:     0x007F  (unknown)  raw=28814B333932F21D1724F966181C3C74A6F771F0
[13:03:55.596][C][gea:355]:     0x008F  (unknown)  raw=0300
[13:03:55.596][C][gea:355]:     0x0090  (unknown)  raw=E0000100
[13:03:55.596][C][gea:355]:     0x0092  (unknown)  raw=0000000100000357
[13:03:55.600][C][gea:355]:     0x0093  (unknown)  raw=000000010039CE37
[13:03:55.601][C][gea:355]:     0x0094  (unknown)  raw=0302000100001FC0
[13:03:55.601][C][gea:355]:     0x4000  (unknown)  raw=0000
[13:03:55.601][C][gea:355]:     0x4001  (unknown)  raw=00000000
[13:03:55.606][C][gea:355]:     0x4007  (unknown)  raw=02
[13:03:55.607][C][gea:361]:     0x4008  Mixing valve home state request           [enum]  raw=00  val=0
[13:03:55.609][C][gea:361]:     0x4009  Mixing valve home state                   [enum]  raw=00  val=0
[13:03:55.610][C][gea:361]:     0x400A  Mixing valve step offset                  [i16]  raw=0000  val=0
[13:03:55.631][C][gea:361]:     0x400B  Mixing valve absolute position            [i16]  raw=0E10  val=3600
[13:03:55.631][C][gea:361]:     0x400C  Mixing valve park position                [i16]  raw=07D0  val=2000
[13:03:55.631][C][gea:361]:     0x4020  Water Heater User Mode                    [enum]  raw=02  val=2
[13:03:55.631][C][gea:355]:     0x4021  (unknown)  raw=02
[13:03:55.632][C][gea:355]:     0x4022  (unknown)  raw=00
[13:03:55.632][C][gea:361]:     0x4023  Vacation Fallback Mode                    [enum]  raw=02  val=2
[13:03:55.632][C][gea:361]:     0x4024  User Setpoint Temperature                 [i16]  raw=04E2  val=1250
[13:03:55.632][C][gea:361]:     0x4025  Vacation Setpoint Temperature             [i16]  raw=01F4  val=500
[13:03:55.636][C][gea:361]:     0x4026  Actual Setpoint Temperature               [i16]  raw=04E2  val=1250
[13:03:55.637][C][gea:361]:     0x4028  Timed Mode Hours Remaining                [u16]  raw=0000  val=0
[13:03:55.637][C][gea:361]:     0x402A  Water Heater Mixing Valve Tank Capacity   [enum]  raw=00  val=0
[13:03:55.637][C][gea:361]:     0x402B  Water Heater Mixing Valve Available Tank Capacities  [bool/bool/bool/bool]  raw=07  val=true///
[13:03:55.643][C][gea:355]:     0x402F  (unknown)  raw=04E2
[13:03:55.644][C][gea:361]:     0x4040  Available Modes                           [bool/bool/bool/bool/bool/u8]  raw=1F  val=true/////
[13:03:55.644][C][gea:361]:     0x4041  Tank size                                 [u8]  raw=32  val=50
[13:03:55.644][C][gea:361]:     0x4047  Min/max allowed setpoint                  [u16/u16]  raw=03B605DC  val=950/1500
[13:03:55.650][C][gea:361]:     0x4048  Min/max allowed vacation setpoint         [u16/u16]  raw=01F40578  val=500/1400
[13:03:55.651][C][gea:361]:     0x4049  Max allowed vacation hours                [u16]  raw=12A8  val=4776
[13:03:55.651][C][gea:361]:     0x404A  Max allowed standard electric hours       [u16]  raw=0870  val=2160
[13:03:55.651][C][gea:355]:     0x404B  (unknown)  raw=00000000
[13:03:55.660][C][gea:361]:     0x404C  Anode depleted mass                       [u32/u32]  raw=000000000E5E01E5  val=0/241041893
[13:03:55.661][C][gea:361]:     0x404D  Anode hours of service                    [u32]  raw=000008B5  val=2229
[13:03:55.661][C][gea:355]:     0x404E  (unknown)  raw=01
[13:03:55.661][C][gea:361]:     0x4056  Diagnostic Failure counts                 [u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8]  raw=0000000000000000000000000000000000000000000000000000000000000000  val=0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0
[13:03:55.666][C][gea:361]:     0x4058  Heating Issues                            [bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool/bool]  raw=0000000000000000  val=false/false/false/false/false/false/false/false////////////////////////////////////////////
[13:03:55.667][C][gea:361]:     0x405F  T1 Temperature                            [i16]  raw=046C  val=1132
[13:03:55.667][C][gea:361]:     0x4060  T2 Temperature                            [i16]  raw=04C6  val=1222
[13:03:55.670][C][gea:361]:     0x4061  T3a Temperature                           [i16]  raw=02B8  val=696
[13:03:55.676][C][gea:361]:     0x4062  T3b Temperature                           [i16]  raw=02DA  val=730
[13:03:55.677][C][gea:361]:     0x4063  T4 Temperature                            [i16]  raw=030A  val=778
[13:03:55.677][C][gea:361]:     0x4064  T5 Temperature                            [i16]  raw=02C3  val=707
[13:03:55.682][C][gea:361]:     0x4065  Measured current                          [u16]  raw=0000  val=0
[13:03:55.695][C][gea:361]:     0x4066  Measured voltage                          [u16]  raw=007E  val=126
[13:03:55.696][C][gea:355]:     0x4067  (unknown)  raw=01C2
[13:03:55.696][C][gea:361]:     0x4068  Relay status                              [u8/bool/bool/bool/bool/bool/u8]  raw=0000  val=0/false/////
[13:03:55.696][C][gea:361]:     0x4069  Flow state                                [enum]  raw=00  val=0
[13:03:55.697][C][gea:361]:     0x406E  T6 Temperature                            [u16]  raw=0458  val=1112
[13:03:55.698][C][gea:355]:     0x406F  (unknown)  raw=006D
[13:03:55.698][C][gea:355]:     0x4072  (unknown)  raw=00000003
[13:03:55.698][C][gea:355]:     0x4074  (unknown)  raw=00018AC0
[13:03:55.707][C][gea:355]:     0x4080  (unknown)  raw=00
[13:03:55.708][C][gea:361]:     0x4081  Anode alarm active                        [enum]  raw=00  val=0
[13:03:55.708][C][gea:361]:     0x4082  Accessory low battery alarm active        [enum]  raw=00  val=0
[13:03:55.708][C][gea:361]:     0x4083  Accessory leak detected alarm active      [enum]  raw=00  val=0
[13:03:55.733][C][gea:355]:     0x4085  (unknown)  raw=03FE
[13:03:55.734][C][gea:355]:     0x40B6  (unknown)  raw=0000
[13:03:55.734][C][gea:355]:     0x40B7  (unknown)  raw=0000
[13:03:55.734][C][gea:361]:     0x40B8  Groundwater Temperature                   [i16]  raw=0250  val=592
[13:03:55.734][C][gea:361]:     0x40B9  T7 Temperature                            [i16]  raw=0332  val=818
[13:03:55.735][C][gea:361]:     0x40BA  MC CPU Temperature                        [i16]  raw=033C  val=828
[13:03:55.735][C][gea:361]:     0x40BB  MC Circuit Board Temperature              [i16]  raw=03A9  val=937
[13:03:55.735][C][gea:361]:     0x40BC  MC Power Connector Temperature            [i16]  raw=FA3A  val=-1478
[13:03:55.735][C][gea:355]:     0x40BD  (unknown)  raw=005F
[13:03:55.736][C][gea:361]:     0x40C0  Number of resets                          [u16]  raw=021E  val=542
[13:03:55.736][C][gea:361]:     0x40C2  Percentage of anode remaining             [u8]  raw=5F  val=95
[13:03:55.736][C][gea:361]:     0x40C3  Missed flow off state                     [enum]  raw=00  val=0
[13:03:55.736][C][gea:361]:     0x40C6  Service requested                         [enum]  raw=00  val=0
[13:03:55.736][C][gea:361]:     0x40CB  Depletion state                           [enum]  raw=00  val=0
[13:03:55.736][C][gea:355]:     0x40CD  (unknown)  raw=000000
[13:03:55.737][C][gea:361]:     0x40CE  Minutes until recharged                   [u16]  raw=0076  val=118
[13:03:55.749][C][gea:355]:     0x40CF  (unknown)  raw=01AD
[13:03:55.749][C][gea:361]:     0x40D0  Usable hot water in gallons               [u8]  raw=16  val=22
[13:03:55.749][C][gea:355]:     0x4100  (unknown)  raw=7171717171717171717171717171717171717171717171717171717171717A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A4545454545454545454545454545454545454545454545454545454545454949494949494949494949494949494949494949494949494949494949494D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F0000000000000000000000000000007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E00000000463B
[13:03:55.749][C][gea:361]:     0x4101  Missed flow off counter                   [u16]  raw=0000  val=0
[13:03:55.755][C][gea:361]:     0x4102  Heating cycle satisfied                   [u8]  raw=0C  val=12
[13:03:55.756][C][gea:361]:     0x4103  Heating cycle started                     [u8]  raw=0C  val=12
[13:03:55.756][C][gea:355]:     0x4104  (unknown)  raw=63
[13:03:55.756][C][gea:361]:     0x4105  Missed flow off fault counter             [u16]  raw=0000  val=0
[13:03:55.764][C][gea:355]:     0x4106  (unknown)  raw=A4000000FFA670A0
[13:03:55.765][C][gea:361]:     0x4107  Water Heater Reset Information            [raw]  raw=12121212  val=raw
[13:03:55.765][C][gea:355]:     0x411C  (unknown)  raw=64
[13:03:55.765][C][gea:361]:     0x411D  Water Heater Dad Mode Delay In Minutes    [u8]  raw=00  val=0
[13:03:55.770][C][gea:355]:     0x411E  (unknown)  raw=1E
[13:03:55.771][C][gea:355]:     0x411F  (unknown)  raw=00000384
[13:03:55.771][C][gea:355]:     0x4120  (unknown)  raw=00000384
[13:03:55.771][C][gea:355]:     0x4121  (unknown)  raw=00
[13:03:55.776][C][gea:355]:     0x4124  (unknown)  raw=00
[13:03:55.777][C][gea:361]:     0x4125  Water Heater Current Cost Of Power        [enum]  raw=02  val=2
[13:03:55.777][C][gea:355]:     0x4126  (unknown)  raw=000000000000
[13:03:55.777][C][gea:355]:     0x4127  (unknown)  raw=00000000
[13:03:55.786][C][gea:361]:     0x4220  Water Heater Boost Mode State - Status/Actual  [bool]  raw=00  val=false
[13:03:55.787][C][gea:361]:     0x4221  Water Heater Boost Mode State - Requested/Desired  [bool]  raw=00  val=false
[13:03:55.797][C][gea:361]:     0x4222  Shutoff Water Valve Position/State        [enum]  raw=01  val=1
[13:03:55.798][C][gea:361]:     0x4223  Requested Water Valve Position            [enum]  raw=00  val=0
[13:03:55.798][C][gea:361]:     0xD001  DSM Override Status                       [u8]  raw=00  val=0
[13:03:55.798][C][gea:361]:     0xD002  DSM Override Allowed                      [u8]  raw=01  val=1
[13:03:55.798][C][gea:355]:     0xD009  (unknown)  raw=00000000
[13:03:55.798][C][gea:361]:     0xD00E  Cost of power cost/comfort slider request  [u8]  raw=80  val=128
[13:03:55.803][C][gea:361]:     0xD00F  Cost of power cost/comfort slider status  [u8]  raw=80  val=128
[13:03:55.804][C][gea:355]:     0xD012  (unknown)  raw=00000000
[13:03:55.804][C][gea:355]:     0xD013  (unknown)  raw=00000000
[13:03:55.805][C][gea:361]:     0xD014  Appliance Energy Usage Update Period in Minutes  [u8]  raw=0F  val=15
[13:03:55.813][C][gea:361]:     0xD015  Appliance Energy Usage Estimated or Measured Flag  [enum]  raw=01  val=1
[13:03:55.814][C][gea:361]:     0xD022  Electrical Pricing Structure Selection Status  [enum/bool/bool/bool/bool/bool/u8/u8/u16]  raw=000003000000  val=0/false/true/false/false/false///
[13:03:55.838][C][gea:361]:     0xD023  Electrical Pricing Structure Selection Request  [enum/u16]  raw=00000000  val=0/0
[13:03:55.838][C][gea:361]:     0xD024  Electrical Time of Use Pricing Schedule Request - Season 1  [u8/u8/u8/bool/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16]  raw=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[13:03:55.838][C][gea:361]:     0xD025  Electrical Pricing Time of Use Schedule Hash Status - Season 1  [u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8]  raw=5279515BC1C4E9CB343FBC4724D8F934096DE7095A9058EA54FBE7EF9A2D9115  val=82/121/81/91/193/196/233/203/52/63/188/71/36/216/249/52/9/109/231/9/90/144/88/234/84/251/231/239/154/45/145/21
[13:03:55.838][C][gea:361]:     0xD026  Electrical Time of Use Pricing Schedule Request - Season 2  [u8/u8/u8/bool/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16]  raw=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[13:03:55.838][C][gea:361]:     0xD027  Electrical Pricing Time of Use Schedule Hash Status - Season 2  [u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8]  raw=5279515BC1C4E9CB343FBC4724D8F934096DE7095A9058EA54FBE7EF9A2D9115  val=82/121/81/91/193/196/233/203/52/63/188/71/36/216/249/52/9/109/231/9/90/144/88/234/84/251/231/239/154/45/145/21
[13:03:55.838][C][gea:361]:     0xD028  Electrical Time of Use Pricing Schedule Request - Season 3  [u8/u8/u8/bool/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16]  raw=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[13:03:55.843][C][gea:361]:     0xD029  Electrical Pricing Time of Use Schedule Hash Status - Season 3  [u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8]  raw=5279515BC1C4E9CB343FBC4724D8F934096DE7095A9058EA54FBE7EF9A2D9115  val=82/121/81/91/193/196/233/203/52/63/188/71/36/216/249/52/9/109/231/9/90/144/88/234/84/251/231/239/154/45/145/21
[13:03:55.844][C][gea:361]:     0xD02A  Electrical Time of Use Pricing Schedule Request - Season 4  [u8/u8/u8/bool/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16/u8/u8/u8/u8/u8/u8/u16/u16/u16/u16/u16]  raw=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[13:03:55.844][C][gea:361]:     0xD02B  Electrical Pricing Time of Use Schedule Hash Status - Season 4  [u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8/u8]  raw=5279515BC1C4E9CB343FBC4724D8F934096DE7095A9058EA54FBE7EF9A2D9115  val=82/121/81/91/193/196/233/203/52/63/188/71/36/216/249/52/9/109/231/9/90/144/88/234/84/251/231/239/154/45/145/21
[13:03:55.844][C][gea:361]:     0xD02C  Requested Appliance Energy Usage Update Period in Minutes  [u8]  raw=0F  val=15
[13:03:55.849][C][gea:361]:     0xD030  Appliance Cumulative Energy               [u32]  raw=0001F13B  val=127291
[13:03:55.850][C][gea:355]:     0xF200  (unknown)  raw=B403
2 Likes

0x6F might be the Wi-Fi module or another module and replied first so the code took that when it auto-detected.

I am to blame for that. I got that value from the repo's sample configs and I copy pasted 0x6F without knowing what I am doing. Thank you and mulcmu for troubleshooting my config.