ETA PU15 (ETAtouch RESTful) → Home Assistant, without a custom integration

I recently integrated an ETA PU15 pellet boiler into Home Assistant using the
native rest: platform (no custom integration, no HACS needed), and hit a
gotcha that isn’t documented anywhere I could find — so I wrote it up in case
it saves someone else a few hours.

The short version: if your ETA boiler responds with XML (content-type
application/xml), Home Assistant silently converts it to a JSON-like
structure before your value_template ever sees it. Attributes get prefixed
with @ and text content lands under #text. Any value_template written
with regex against the raw XML syntax (uri="...") will just silently fail —
no error, the entity sits at unknown forever, while a curl on the same
endpoint shows perfectly normal XML.

The fix is to use value_json instead of regex on value:

value_template: >-
  {% set item = value_json.eta.vars.variable | selectattr('@uri', 'equalto', '40/10021/0/0/12011') | first %}
  {{ ((item['#text'] | float) / (item['@scaleFactor'] | float)) | round(1) }}

Full writeup + working example configuration.yaml + a log of every dead-end I
hit along the way (IndexError crashes, availability bugs on multi-sensor
REST resources, etc.):

:backhand_index_pointing_right: GitHub - paysanpgm/HA-ETA-PU15: Intégration REST API dans Home Assistant pour chaudiere ETA modele PU15 · GitHub

Also covers the “variable set” pattern to batch multiple readings into one
HTTP request, useful since this boiler doesn’t handle concurrent connections
well.

Happy to help if anyone’s stuck on a similar ETA integration.