Live system · 3 Virginia short-term rentals · Running since 2025

From booking message
to warm pool, untouched by human hands.

A thirty-second look at what happens between the moment a guest mentions the pool and the moment they step outside on Friday afternoon.

Airbnb · Inbox

Hi — can you heat the pool for our stay? Arriving Friday.

webhook.log
POST /webhook/hostaway
event: message.received
reservation: 71829
guest: "Meredith R."
→ scanMessagesForPoolHeat()
✓ intent: agreed   confidence 0.94
Nelson County, VA · 72-hour forecast
THU
°F air
FRI
°F air
SAT
°F air
WIND
mph avg
source: open-meteo · lat 37.80 lon −78.88
Pool controller · water temperature
current °F
target °F
Δ to close
Thermodynamic model · heat-up time
// heater 400k BTU · 20k gal pool
dT       = 18 °F
volume   = 20,000 gal
loss     = f(airTemp, wind, cover)
runtime  ≈ 21 h   ± 1.4 h
ONThu · 11:00 PM
OFFSat · 8:00 PM
Writing schedule → pool controller
PUT /schedule/heater-1 200 OK
PUT /setpoint/pool 200 OK
SYNC controller acknowledged
Friday, 1:00 PM · heater firing
64live °F
82target °F
heater ON
Friday · 4:12 PM
Pool is 82°F. Guest is in the driveway.
Zero manual work. Every booking.
1 / 8

What this actually is.

A production system running today at three short-term rentals in central Virginia. It ingests guest messages from Hostaway, classifies whether the guest is asking for pool heat, models the pool's thermodynamics against a real 72-hour weather forecast, and writes a heating schedule directly to the property's pool automation controller.

It's boring by design. It saves the owner from remembering to flip a breaker on Thursday night, and — more importantly — it saves her from forgetting to flip it off on Sunday. The second half is where the real margin lives: every forgotten-off day costs roughly forty dollars in propane.

How it works.

Six real integrations. No mocks. The whole loop completes in under ninety seconds from message to committed schedule.

01
Hostaway
guest message webhook
02
Intent classifier
regex + LLM fallback
03
Weather + pool state
open-meteo · controller read
04
Thermo model
heat-loss + heater BTU
05
Controller write
schedule + setpoint
06
Confirmation
SMS to owner · log to digest

Why this matters for Hayward.

OmniLogic and AquaConnect already expose the primitives needed to run a system like this at scale: scheduling, setpoint control, remote diagnostics. What they don't ship — and what most property managers end up building badly in spreadsheets — is the booking-intent layer: the bridge between a guest's words and a controller's schedule.

Pool-heat-manager is a working reference implementation of that bridge. The hard parts are built: intent classification tuned on real guest language, a thermodynamic model that handles wind and cover state, and an idempotent schedule writer that survives controller reboots. For Hayward, this is a plug-in for the STR and property-management segment — a category no incumbent has seriously productized.

Per-booking automation
Heat only when a guest has confirmed intent. Never idle-run.
Weather-aware
Shortens or extends runtime based on the live 72h forecast.
Controller-native
Writes through existing APIs. No new hardware, no parallel stack.

Open source.

The repo is public. A single node service, TypeScript, roughly two thousand lines. github.com/kylehawke-stack/pool-heat-manager

TypeScriptMITpublic
src/weather.ts · heatUpRuntimeHours()
export function heatUpRuntimeHours(p: {
  currentF: number,
  targetF:  number,
  gallons:  number,
  heaterBTU: number,
  forecast: HourlyForecast[],
  hasCover: boolean,
}): number {
  const dT   = p.targetF - p.currentF;
  const mass = p.gallons * 8.34;           // lb of water
  const gross = (mass * dT) / p.heaterBTU;      // hours, no loss

  // loss term: convection+evap, simplified per ASHRAE
  const lossPerHr = p.forecast
    .map(h => hourlyLossBTU(h, p.targetF, p.hasCover))
    .reduce((a,b) => a+b, 0) / p.forecast.length;

  return gross / (1 - lossPerHr / p.heaterBTU);
}

Let's talk.

Kyle Hawke — independent advisor. Former McKinsey Partner, channel strategy at STIHL.

kylehawke@gmail.com

Consulting engagements on IoT + booking platforms — STR/PMS adjacent work welcome. Happy to walk the Hayward team through the repo on a call.