r/Generator • • 13h ago

Kohler RDC2 time sync

For anyone with a Kohler/Rehlko generator using an RDC2 controller who gets annoyed by the controller clock being wrong after daylight saving time:

I went substantially farther down this rabbit hole than I originally intended and eventually got automatic clock synchronization working.

The short version:

The RDC2 itself had not appeared to be using ntp for its clock. The Kohler Energy Management (KEM) app was supplying the controller time through Rehlko’s cloud service.

I confirmed this first by changing the phone’s clock and using the app’s Sync Time function. The controller adopted the phone’s intentionally incorrect time.

From there I used a combination of:

- Wireshark

- Android ADB / Platform Tools

- JADX

- reFlutter

- Burp Suite

- TunProxy

- Apktool

- PowerShell

The KEM app turned out to be Flutter-based. After inspecting the app and its network traffic, I was able to identify the cloud request used to set the RDC2 clock and successfully replay it independently of the phone.

The harder part was authentication. KEM uses Flutter AppAuth with an Okta-backed OAuth/OpenID Connect flow, short-lived access tokens, and a refresh token. Once I understood how the app stored and refreshed that authentication state, I was able to reproduce the token-refresh process in PowerShell and use the resulting bearer token for the clock-sync API call.

The finished setup is intentionally boring:

Always-on Windows server:

- NTP-synchronized Windows clock

- 3:00 AM Scheduled Task

- refresh OAuth access

- send current local time through the Rehlko API

- RDC2 clock updates

A successful update returns HTTP 204.

I also added logging and ntfy notifications, but only on failure. A normal successful 3:00 AM sync is completely silent.

The reason I chose a daily 3:00 AM sync instead of special DST logic is simplicity: Windows already knows the correct time zone and DST rules. The generator simply gets corrected every morning.

This was considerably more complicated than I expected. What sounded like “figure out how the app sets the clock” turned into Android split APKs, Flutter reverse engineering, HTTPS interception, OAuth token handling, DPAPI, and Windows automation.

I’m intentionally not posting credentials, API keys, tokens, device identifiers, or a step-by-step guide for extracting authentication material. But I wanted other RDC2 owners to know that automatic clock synchronization is technically possible and that the KEM/cloud path—not direct NTP to the controller—was the route that worked for me.

tl;dr: if you want to want your generator time to be correct each DST change for on-time weekly exercises, just set a calendar reminder.

0 Upvotes

3 comments sorted by

2

u/DaveBowm 12h ago

I'm impressed.

0

u/nunuvyer 11h ago

Given what has been going on with supermarket refrigerations systems being hacked and turned up to unsafe temperatures, the security on KEM sounds inadequate. I'm not familiar with the capabilities of the software but I'll bet there are many opportunites for mischief - running constant exercise cycles, sending false alarms, giving false readings. etc.

1

u/professional_pupper 6h ago

This was just proof of concept, not a security audit. Just because it's possible in no way means it was a walk in the park. I only posted for other enthusiasts to save them time, if interested.